in backend/wbpublic/grtui/grtdb_connect_panel.cpp [930:1235]
void DbConnectPanel::create_control(::DbDriverParam *driver_param, const ::ControlType ctrl_type,
const ControlBounds &bounds, const std::string &caption) {
bool is_new_line = false;
Table *table = NULL;
Box *box = NULL;
std::vector<mforms::Box *> *rows = NULL;
switch (driver_param->object()->layoutAdvanced()) {
case 0:
rows = &_param_rows;
table = _params_table;
break;
case 1:
rows = &_advanced_rows;
table = _advanced_table;
break;
case 2:
rows = &_ssl_rows;
table = _ssl_table;
break;
case 3:
rows = &_options_rows;
table = _options_table;
break;
default:
return;
}
if (bounds.top >= (int)rows->size()) {
is_new_line = true;
table->set_row_count((int)rows->size() + 1);
if (ctrl_type == ::ctCheckBox && table != _params_table) {
rows->push_back(box = mforms::manage(new Box(false)));
box->set_spacing(0);
} else {
rows->push_back(box = mforms::manage(new Box(true)));
box->set_spacing(4);
}
_views.push_back(box);
mforms::TableItemFlags flags;
flags = mforms::HExpandFlag | mforms::HFillFlag | mforms::VFillFlag;
if (driver_param->get_type() == DbDriverParam::ptText)
flags = flags | mforms::VExpandFlag | mforms::VFillFlag;
table->add(mforms::manage(box), 1, 2, bounds.top, bounds.top + 1, flags);
} else
box = (*rows)[bounds.top];
switch (ctrl_type) {
case ::ctLabel: {
Label *label = new Label();
label->set_text(caption);
label->set_name(driver_param->get_accessibility_name());
label->set_text_align(mforms::TopRight);
if (is_new_line)
table->add(mforms::manage(label), 0, 1, bounds.top, bounds.top + 1, mforms::HFillFlag | mforms::VFillFlag);
else
box->add(mforms::manage(label), false, true);
_views.push_back(label);
break;
}
case ::ctDescriptionLabel: {
Label *label = new Label();
label->set_text(caption);
label->set_name(driver_param->get_accessibility_name());
label->set_text_align(mforms::TopLeft);
label->set_style(mforms::SmallHelpTextStyle);
label->set_wrap_text(true);
label->set_size(250, -1);
table->add(mforms::manage(label), 2, 3, bounds.top, bounds.top + 1, mforms::HFillFlag | mforms::VFillFlag);
_views.push_back(label);
break;
}
case ::ctButton: {
Button *btn = new Button();
btn->set_text(caption);
btn->set_size(bounds.width, 30);
box->add(mforms::manage(btn), false, true);
_views.push_back(btn);
if (driver_param->object()->name() == "sslWizard") {
scoped_connect(btn->signal_clicked(), std::bind(&DbConnectPanel::launch_ssl_wizard, this));
} else if (driver_param->object()->name() == "openSSLWizardDirectory") {
scoped_connect(btn->signal_clicked(), std::bind(&DbConnectPanel::open_ssl_wizard_directory, this));
}
break;
}
case ::ctCheckBox: {
CheckBox *ctrl = new CheckBox();
ctrl->set_name(driver_param->get_accessibility_name());
ctrl->setInternalName(driver_param->get_control_name());
ctrl->set_text(caption);
// value
{
grt::StringRef value = driver_param->get_value_repr();
if (value.is_valid())
ctrl->set_active(*value != "" && *value != "0" && *value != "NULL");
}
scoped_connect(ctrl->signal_clicked(), std::bind(&DbConnectPanel::param_value_changed, this, ctrl, false));
box->add(mforms::manage(ctrl), false, true);
_views.push_back(ctrl);
break;
}
case ::ctKeychainPassword: {
Button *btn = new Button();
#ifdef _MSC_VER
btn->set_text("Store in Vault ...");
btn->set_tooltip(_("Store the password for this connection in a secured vault"));
#else
btn->set_text("Store in Keychain ...");
btn->set_tooltip(_("Store the password for this connection in the system's keychain"));
#endif
box->add(mforms::manage(btn), false, true);
_views.push_back(btn);
scoped_connect(btn->signal_clicked(),
std::bind(&DbConnectPanel::set_keychain_password, this, driver_param, false));
btn = new Button();
btn->set_text("Clear");
btn->set_size(100, -1);
#ifdef _MSC_VER
btn->set_tooltip(_("Remove the previously stored password from the secured vault"));
#else
btn->set_tooltip(_("Remove the previously stored password from the system's keychain"));
#endif
box->add(mforms::manage(btn), false, true);
_views.push_back(btn);
scoped_connect(btn->signal_clicked(),
std::bind(&DbConnectPanel::set_keychain_password, this, driver_param, true));
break;
}
case ::ctTextBox: {
bool is_password = ::DbDriverParam::ptPassword == driver_param->get_type();
TextEntry *ctrl = new TextEntry(is_password ? PasswordEntry : NormalEntry);
ctrl->set_name(driver_param->get_accessibility_name());
ctrl->setInternalName(driver_param->get_control_name());
// value
{
grt::StringRef value = driver_param->getValue();
if (value.is_valid())
ctrl->set_value(*value);
}
ctrl->set_size(bounds.width, -1);
scoped_connect(ctrl->signal_changed(), std::bind(&DbConnectPanel::param_value_changed, this, ctrl, true));
box->add(mforms::manage(ctrl), true, true);
_views.push_back(ctrl);
break;
}
case ::ctText: {
TextBox *ctrl = new TextBox(mforms::VerticalScrollBar);
ctrl->set_name(driver_param->get_accessibility_name());
ctrl->setInternalName(driver_param->get_control_name());
// value
{
grt::StringRef value = driver_param->get_value_repr();
if (value.is_valid())
ctrl->set_value(*value);
}
ctrl->set_size(bounds.width, -1);
scoped_connect(ctrl->signal_changed(), std::bind(&DbConnectPanel::param_value_changed, this, ctrl, false));
box->add(mforms::manage(ctrl), true, true);
_views.push_back(ctrl);
break;
}
case ::ctFileSelector: {
FsObjectSelector *ctrl = new FsObjectSelector();
ctrl->set_name(driver_param->get_accessibility_name());
ctrl->setInternalName(driver_param->get_control_name());
// value
grt::StringRef value = driver_param->get_value_repr();
std::string initial_value = "";
if (value.is_valid())
initial_value = *value;
ctrl->set_size(bounds.width, -1);
ctrl->initialize(initial_value, mforms::OpenFile, "", true,
std::bind(&DbConnectPanel::param_value_changed, this, ctrl, true));
box->add(mforms::manage(ctrl), true, true);
_views.push_back(ctrl);
break;
}
case ::ctDirSelector: {
FsObjectSelector *ctrl = new FsObjectSelector();
ctrl->set_name(driver_param->get_accessibility_name());
ctrl->setInternalName(driver_param->get_control_name());
// value
grt::StringRef value = driver_param->get_value_repr();
std::string initial_value = "";
if (value.is_valid())
initial_value = *value;
ctrl->set_size(bounds.width, -1);
ctrl->initialize(initial_value, mforms::OpenDirectory, "", true,
std::bind(&DbConnectPanel::param_value_changed, this, ctrl, true));
box->add(mforms::manage(ctrl), true, true);
_views.push_back(ctrl);
break;
}
case ::ctEnumSelector: {
mforms::Selector *ctrl = new Selector();
ctrl->set_name(driver_param->get_accessibility_name());
ctrl->setInternalName(driver_param->get_control_name());
std::vector<std::pair<std::string, std::string> > options;
std::vector<std::string> option_ids;
std::string value = driver_param->get_value_repr();
int idx = -1;
try {
options = driver_param->get_enum_options();
} catch (std::exception &e) {
logError("Error calling get_enum_options() for param %s: %s", driver_param->get_control_name().c_str(),
e.what());
mforms::Utilities::show_error(
"Connection Setup",
base::strfmt("An error occurred while retrieving values for option '%s' from '%s'.\n\n%s",
driver_param->object()->name().c_str(), selected_driver()->name().c_str(), e.what()),
"OK", "", "");
}
for (size_t i = 0; i < options.size(); i++) {
ctrl->add_item(options[i].second);
option_ids.push_back(options[i].first);
if (value == options[i].first)
idx = (int)i;
}
if (idx >= 0)
ctrl->set_selected(idx);
enum_param_value_changed(ctrl, option_ids);
scoped_connect(ctrl->signal_changed(),
std::bind(&DbConnectPanel::enum_param_value_changed, this, ctrl, option_ids));
box->add(mforms::manage(ctrl), true, true);
_views.push_back(ctrl);
break;
}
case ::ctEnumOption: {
std::vector<std::pair<std::string, std::string> > options;
std::string value;
try {
options = driver_param->get_enum_options();
value = _connection->get_connection()->parameterValues().get("kerberosMode").toString();
} catch (std::exception &e) {
logError("Error calling get_enum_options() for param %s: %s", driver_param->get_control_name().c_str(),
e.what());
mforms::Utilities::show_error(
"Connection Setup",
base::strfmt("An error occurred while retrieving values for option '%s' from '%s'.\n\n%s",
driver_param->object()->name().c_str(), selected_driver()->name().c_str(), e.what()),
"OK", "", "");
}
Box *inner_box = new Box(false);
unsigned int group_id = mforms::RadioButton::new_id();
for (auto &option: options) {
mforms::RadioButton *rb = new mforms::RadioButton(group_id);
rb->set_text(option.second);
rb->set_name(driver_param->get_accessibility_name().toString() + "_" + option.first);
rb->setInternalName(driver_param->get_control_name().toString() + "_" + option.first);
rb->set_active(option.first == value);
#ifndef _MSC_VER
if (option.first == "1")
rb->set_enabled(false);
#endif
scoped_connect(rb->signal_clicked(), [=](){
_connection->get_connection()->parameterValues().gset("kerberosMode", option.first);
});
inner_box->add(mforms::manage(rb), false, true);
}
box->add(mforms::manage(inner_box), true, true);
break;
}
default:
logWarning("Unknown param type for %s\n", driver_param->get_control_name().c_str());
break;
}
}