/* * _gdaui_provider_auth_editor_set_auths * @auth: a #GdauiProviderAuthEditor widget * @auth_string: * * Sets the connection string to be displayed in the widget */ void _gdaui_provider_auth_editor_set_auth (GdauiProviderAuthEditor *auth, const gchar *auth_string) { g_return_if_fail (GDAUI_IS_PROVIDER_AUTH_EDITOR (auth)); g_return_if_fail (auth->priv); if (!auth->priv->pinfo) return; if (!auth->priv->auth_needed) { if (auth_string && *auth_string) g_warning (_("Can't set authentification string: no authentication is needed")); return; } gdaui_basic_form_reset (GDAUI_BASIC_FORM (auth->priv->auth_widget)); if (auth_string) { /* split array in a list of named parameters, and for each parameter value, set the correcponding parameter in @dset */ GdaSet *dset; GSList *params_set = NULL; g_assert (auth->priv->auth_widget); dset = gdaui_basic_form_get_data_set (GDAUI_BASIC_FORM (auth->priv->auth_widget)); gchar **array = NULL; array = g_strsplit (auth_string, ";", 0); if (array) { gint index = 0; gchar *tok; gchar *value; gchar *name; for (index = 0; array[index]; index++) { name = strtok_r (array [index], "=", &tok); if (name) value = strtok_r (NULL, "=", &tok); else value = NULL; if (name && value) { GdaHolder *param; gda_rfc1738_decode (name); gda_rfc1738_decode (value); param = gda_set_get_holder (dset, name); if (param) if (gda_holder_set_value_str (param, NULL, value, NULL)) params_set = g_slist_prepend (params_set, param); } } g_strfreev (array); } } g_signal_emit_by_name (auth, "changed"); }
/* * _gdaui_provider_auth_editor_set_provider * @auth: a #GdauiProviderAuthEditor widget * @provider: the provider to be used * * Updates the displayed fields in @auth to represent the required * and possible arguments that a connection to a database through * @provider would require */ void _gdaui_provider_auth_editor_set_provider (GdauiProviderAuthEditor *auth, const gchar *provider) { g_return_if_fail (GDAUI_IS_PROVIDER_AUTH_EDITOR (auth)); g_return_if_fail (auth->priv); auth->priv->pinfo = NULL; if (auth->priv->provider) g_free (auth->priv->provider); auth->priv->provider = NULL; auth->priv->auth_needed = FALSE; if (auth->priv->auth_widget) { gtk_widget_destroy (auth->priv->auth_widget); auth->priv->auth_widget = NULL; } if (provider) { auth->priv->pinfo = gda_config_get_provider_info (provider); if (auth->priv->pinfo) { auth->priv->provider = g_strdup (auth->priv->pinfo->id); if (auth->priv->pinfo->auth_params && auth->priv->pinfo->auth_params->holders) auth->priv->auth_needed = TRUE; } } if (auth->priv->auth_needed) { g_assert (auth->priv->pinfo); GdaSet *set; set = gda_set_copy (auth->priv->pinfo->auth_params); auth->priv->auth_widget = gdaui_basic_form_new (set); g_signal_connect (G_OBJECT (auth->priv->auth_widget), "holder-changed", G_CALLBACK (auth_form_changed), auth); g_object_unref (set); } if (auth->priv->auth_widget) { gtk_container_add (GTK_CONTAINER (auth), auth->priv->auth_widget); gtk_widget_show (auth->priv->auth_widget); if (auth->priv->labels_size_group) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (auth->priv->auth_widget), auth->priv->labels_size_group, GDAUI_BASIC_FORM_LABELS); if (auth->priv->entries_size_group) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (auth->priv->auth_widget), auth->priv->entries_size_group, GDAUI_BASIC_FORM_ENTRIES); } g_signal_emit_by_name (auth, "changed"); }
static void adapt_form_widget (GdauiProviderSpecEditor *spec) { /* destroy any previous widget */ if (spec->priv->form) { gtk_container_foreach (GTK_CONTAINER (spec), (GtkCallback) gtk_widget_destroy, NULL); spec->priv->form = NULL; } spec->priv->type = NO_PROVIDER; if (!spec->priv->provider) return; /* fetch DSN parameters */ GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (spec->priv->provider); if (!pinfo) { g_warning (_("Unknown provider '%s'"), spec->priv->provider); return; } if (!pinfo->dsn_params) { g_warning (_("Provider '%s' does not report the required parameters for DSN"), spec->priv->provider); return; } /* create new widget */ GdaSet *dset; dset = gda_set_copy (pinfo->dsn_params); if (dset) { GtkWidget *wid; spec->priv->type = PROVIDER_FORM; wid = gdaui_basic_form_new (dset); g_object_set ((GObject*) wid, "show-actions", FALSE, NULL); g_object_unref (dset); spec->priv->form = wid; if (spec->priv->labels_size_group) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (spec->priv->form), spec->priv->labels_size_group, GDAUI_BASIC_FORM_LABELS); if (spec->priv->entries_size_group) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (spec->priv->form), spec->priv->entries_size_group, GDAUI_BASIC_FORM_ENTRIES); update_form_contents (spec); g_signal_connect (G_OBJECT (wid), "holder-changed", G_CALLBACK (dsn_form_changed), spec); gtk_widget_show (wid); gtk_container_add (GTK_CONTAINER (spec), wid); } }
static void gdaui_provider_auth_editor_grab_focus (GtkWidget *widget) { GdauiProviderAuthEditor *aed = GDAUI_PROVIDER_AUTH_EDITOR (widget); if (aed->priv->auth_widget) gdaui_basic_form_entry_grab_focus (GDAUI_BASIC_FORM (aed->priv->auth_widget), NULL); }
static gchar * params_to_string (GdauiProviderAuthEditor *auth) { GString *string = NULL; gchar *str; GdaSet *dset; GSList *list; g_assert (auth->priv->auth_widget); if (! GDAUI_IS_BASIC_FORM (auth->priv->auth_widget)) return NULL; dset = gdaui_basic_form_get_data_set (GDAUI_BASIC_FORM (auth->priv->auth_widget)); for (list = dset->holders; list; list = list->next) { GdaHolder *param = GDA_HOLDER (list->data); if (gda_holder_is_valid (param)) { const GValue *value; value = gda_holder_get_value (param); str = NULL; if (value && !gda_value_is_null ((GValue *) value)) { GdaDataHandler *dh; GType dtype; dtype = gda_holder_get_g_type (param); dh = gda_data_handler_get_default (dtype); str = gda_data_handler_get_str_from_value (dh, value); } if (str && *str) { gchar *name; gchar *ename, *evalue; if (!string) string = g_string_new (""); else g_string_append_c (string, ';'); g_object_get (G_OBJECT (list->data), "id", &name, NULL); ename = gda_rfc1738_encode (name); evalue = gda_rfc1738_encode (str); g_string_append_printf (string, "%s=%s", ename, evalue); g_free (ename); g_free (evalue); } g_free (str); } } str = string ? string->str : NULL; if (string) g_string_free (string, FALSE); return str; }
/* * _gdaui_provider_spec_editor_is_valid * @spec: a #GdauiProviderSpecEditor widget * * Tells if the current information displayed in @spec respects the * provider's specifications (about non NULL values for example) * * Returns: */ gboolean _gdaui_provider_spec_editor_is_valid (GdauiProviderSpecEditor *spec) { g_return_val_if_fail (GDAUI_IS_PROVIDER_SPEC_EDITOR (spec), FALSE); g_return_val_if_fail (spec->priv, FALSE); switch (spec->priv->type) { case PROVIDER_FORM: g_assert (spec->priv->form); return gdaui_basic_form_is_valid (GDAUI_BASIC_FORM (spec->priv->form)); default: return FALSE; } }
/* * _gdaui_provider_auth_editor_is_valid * @auth: a #GdauiProviderAuthEditor widget * * Tells if the current information displayed in @auth reauthts the * provider's authifications (about non NULL values for example) * * Returns: */ gboolean _gdaui_provider_auth_editor_is_valid (GdauiProviderAuthEditor *auth) { g_return_val_if_fail (GDAUI_IS_PROVIDER_AUTH_EDITOR (auth), FALSE); g_return_val_if_fail (auth->priv, FALSE); if (!auth->priv->pinfo) return FALSE; if (auth->priv->auth_needed) { g_assert (auth->priv->auth_widget); return gdaui_basic_form_is_valid (GDAUI_BASIC_FORM (auth->priv->auth_widget)); } else return TRUE; }
/* * _gdaui_provider_spec_editor_add_to_size_group * @spec: a #GdauiProviderSpecEditor widget */ void _gdaui_provider_spec_editor_add_to_size_group (GdauiProviderSpecEditor *spec, GtkSizeGroup *size_group, GdauiBasicFormPart part) { g_return_if_fail (GDAUI_IS_PROVIDER_SPEC_EDITOR (spec)); g_return_if_fail (GTK_IS_SIZE_GROUP (size_group)); g_return_if_fail (! ((spec->priv->labels_size_group && (part == GDAUI_BASIC_FORM_LABELS)) || (spec->priv->entries_size_group && (part == GDAUI_BASIC_FORM_ENTRIES)))); if (part == GDAUI_BASIC_FORM_LABELS) spec->priv->labels_size_group = g_object_ref (size_group); else spec->priv->entries_size_group = g_object_ref (size_group); gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (spec->priv->form), size_group, part); }
/* * _gdaui_provider_auth_editor_add_to_size_group * @auth: a #GdauiProviderAuthEditor widget */ void _gdaui_provider_auth_editor_add_to_size_group (GdauiProviderAuthEditor *auth, GtkSizeGroup *size_group, GdauiBasicFormPart part) { g_return_if_fail (GDAUI_IS_PROVIDER_AUTH_EDITOR (auth)); g_return_if_fail (GTK_IS_SIZE_GROUP (size_group)); g_return_if_fail (! ((auth->priv->labels_size_group && (part == GDAUI_BASIC_FORM_LABELS)) || (auth->priv->entries_size_group && (part == GDAUI_BASIC_FORM_ENTRIES)))); if (part == GDAUI_BASIC_FORM_LABELS) auth->priv->labels_size_group = g_object_ref (size_group); else auth->priv->entries_size_group = g_object_ref (size_group); if (auth->priv->auth_widget) gdaui_basic_form_add_to_size_group (GDAUI_BASIC_FORM (auth->priv->auth_widget), size_group, part); }
static void set_preview_widget (TablePreferences *tpref) { GtkWidget *preview = NULL; GtkTreeIter iter; if (!tpref->priv->current_column) return; if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (tpref->priv->plugins_combo), &iter)) { GdauiPlugin *plugin; GtkTreeModel *model; GType gtype; gtype = tpref->priv->current_column->gtype; model = tpref->priv->plugins_model; gtk_tree_model_get (model, &iter, PL_COLUMN_PLUGIN, &plugin, -1); if (plugin) { GString *string = NULL; if (tpref->priv->options_wid) { GdaSet *plist; GSList *list; plist = gdaui_basic_form_get_data_set (GDAUI_BASIC_FORM (tpref->priv->options_wid)); for (list = plist->holders; list; list = list->next) { GdaHolder *holder; holder = GDA_HOLDER (list->data); if (gda_holder_is_valid (holder)) { const GValue *cvalue; cvalue = gda_holder_get_value (holder); if (cvalue && (G_VALUE_TYPE (cvalue) != GDA_TYPE_NULL)) { gchar *str = gda_value_stringify (cvalue); gchar *r1, *r2; if (!string) string = g_string_new (""); else g_string_append_c (string, ';'); r1 = gda_rfc1738_encode (gda_holder_get_id (holder)); r2 = gda_rfc1738_encode (str); g_free (str); g_string_append_printf (string, "%s=%s", r1, r2); g_free (r1); g_free (r2); } } } } if (string) { g_string_prepend_c (string, ':'); g_string_prepend (string, plugin->plugin_name); preview = GTK_WIDGET (gdaui_new_data_entry (gtype, string->str)); g_string_free (string, TRUE); } else preview = GTK_WIDGET (gdaui_new_data_entry (gtype, plugin->plugin_name)); } else preview = GTK_WIDGET (gdaui_new_data_entry (gtype, NULL)); } GValue *prev_value = NULL; if (tpref->priv->preview_wid) { prev_value = gdaui_data_entry_get_value (GDAUI_DATA_ENTRY (tpref->priv->preview_wid)); gtk_widget_destroy (tpref->priv->preview_wid); gtk_widget_show (tpref->priv->preview_none); tpref->priv->preview_wid = NULL; } if (preview) { if (prev_value && (G_VALUE_TYPE (prev_value) == gdaui_data_entry_get_value_type (GDAUI_DATA_ENTRY (preview)))) gdaui_data_entry_set_value (GDAUI_DATA_ENTRY (preview), prev_value); gdaui_data_entry_set_attributes (GDAUI_DATA_ENTRY (preview), 0, GDA_VALUE_ATTR_ACTIONS_SHOWN); tpref->priv->preview_wid = preview; gtk_box_pack_start (GTK_BOX (tpref->priv->preview_vbox), preview, TRUE, TRUE, 0); gtk_widget_hide (tpref->priv->preview_none); gtk_widget_show (tpref->priv->preview_wid); } if (prev_value) gda_value_free (prev_value); }
static void options_form_param_changed_cb (G_GNUC_UNUSED GdauiBasicForm *form, G_GNUC_UNUSED GdaHolder *param, G_GNUC_UNUSED gboolean is_user_modif, TablePreferences *tpref) { GtkTreeIter iter; if (tpref->priv->save_plugin_changes && gtk_combo_box_get_active_iter (GTK_COMBO_BOX (tpref->priv->plugins_combo), &iter)) { GdauiPlugin *plugin; GError *error = NULL; GString *plugin_all = NULL; gtk_tree_model_get (tpref->priv->plugins_model, &iter, PL_COLUMN_PLUGIN, &plugin, -1); if (plugin) { plugin_all = g_string_new (plugin->plugin_name); if (tpref->priv->options_wid) { GdaSet *plist; GSList *list; gboolean first = TRUE; plist = gdaui_basic_form_get_data_set (GDAUI_BASIC_FORM (tpref->priv->options_wid)); for (list = plist->holders; list; list = list->next) { GdaHolder *holder; const GValue *cvalue; gchar *str, *r1, *r2; holder = GDA_HOLDER (list->data); if (! gda_holder_is_valid (holder)) continue; cvalue = gda_holder_get_value (holder); if (G_VALUE_TYPE (cvalue) == GDA_TYPE_NULL) continue; if (first) { g_string_append_c (plugin_all, ':'); first = FALSE; } else g_string_append_c (plugin_all, ';'); str = gda_value_stringify (cvalue); r1 = gda_rfc1738_encode (str); g_free (str); r2 = gda_rfc1738_encode (gda_holder_get_id (holder)); g_string_append_printf (plugin_all, "%s=%s", r2, r1); g_free (r1); g_free (r2); } } } g_signal_handlers_block_by_func (tpref->priv->columns_store, G_CALLBACK (columns_model_row_changed_cb), tpref); if (tpref->priv->current_table && tpref->priv->current_column && ! browser_connection_set_table_column_attribute (tpref->priv->bcnc, tpref->priv->current_table, tpref->priv->current_column, BROWSER_CONNECTION_COLUMN_PLUGIN, plugin_all ? plugin_all->str : NULL, &error)) { TO_IMPLEMENT; /* FIXME: add a notice somewhere in the UI */ g_warning ("Error: %s\n", error && error->message ? error->message : _("No detail")); g_clear_error (&error); } g_signal_handlers_unblock_by_func (tpref->priv->columns_store, G_CALLBACK (columns_model_row_changed_cb), tpref); if (plugin_all) g_string_free (plugin_all, TRUE); } set_preview_widget (tpref); }
GtkWidget * do_basic_form (GtkWidget *do_widget) { if (!window) { GtkWidget *vbox; GtkWidget *label; GtkWidget *form; window = gtk_dialog_new_with_buttons ("GdauiBasicForm", GTK_WINDOW (do_widget), 0, "Close", GTK_RESPONSE_NONE, NULL); g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL); g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window))), vbox, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); label = gtk_label_new ("This example shows 2 GdauiBasicForm widgets operating on the\n" "same GdaSet. When a value is modified in one form, then it is\n" "automatically updated in the other form.\n\n" "Also the top form uses the default layout, while the bottom one\n" "uses a custom (2 columns) layout.\n" "The 'an int' entry is hidden in the top form."); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); /* Create the demo widget */ GdaSet *set; gchar *filename; set = gda_set_new_inline (3, "a string", G_TYPE_STRING, "A string Value", "an int", G_TYPE_INT, 12, "a picture", GDA_TYPE_BINARY, NULL); form = gdaui_basic_form_new (set); gtk_box_pack_start (GTK_BOX (vbox), form, TRUE, TRUE, 0); gdaui_basic_form_entry_set_visible (GDAUI_BASIC_FORM (form), gda_set_get_holder (set, "an int"), FALSE); label = gtk_label_new ("2nd form is below:"); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); form = gdaui_basic_form_new (set); gtk_box_pack_start (GTK_BOX (vbox), form, TRUE, TRUE, 0); filename = demo_find_file ("custom_layout.xml", NULL); gdaui_basic_form_set_layout_from_file (GDAUI_BASIC_FORM (form), filename, "simple"); g_free (filename); g_object_unref (set); } gboolean visible; g_object_get (G_OBJECT (window), "visible", &visible, NULL); if (!visible) gtk_widget_show_all (window); else { gtk_widget_destroy (window); window = NULL; } return window; }
static void selection_changed_cb (GtkTreeSelection *select, BrowserConnectionsList *clist) { GtkTreeModel *model; GtkTreeIter iter; BrowserConnection *bcnc = NULL; const GdaDsnInfo *cncinfo = NULL; if (gtk_tree_selection_get_selected (select, &model, &iter)) { gtk_tree_model_get (model, &iter, COLUMN_BCNC, &bcnc, -1); cncinfo = browser_connection_get_information (bcnc); g_object_unref (bcnc); gtk_widget_set_sensitive (_clist->priv->close_cnc_button, TRUE); } else gtk_widget_set_sensitive (_clist->priv->close_cnc_button, FALSE); if (clist->priv->cnc_params_editor) { gtk_widget_destroy (clist->priv->cnc_params_editor); clist->priv->cnc_params_editor = NULL; } if (cncinfo && cncinfo->provider) { /* create GdaSet for parameters to display */ GdaSet *dset; GdaHolder *holder; dset = gda_set_new_inline (1, "PROVIDER_NAME", G_TYPE_STRING, cncinfo->provider); holder = GDA_HOLDER (dset->holders->data); g_object_set (G_OBJECT (holder), "name", _("Database provider"), NULL); GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (cncinfo->provider); if (pinfo && pinfo->dsn_params) gda_set_merge_with_set (dset, pinfo->dsn_params); holder = gda_holder_new_inline (G_TYPE_STRING, "GDA_BROWSER_DICT_FILE", _("In memory")); g_object_set (G_OBJECT (holder), "name", _("Dictionary file"), "description", _("File used to store any information associated\n" "to this connection (favorites, descriptions, ...)"), NULL); gda_set_add_holder (dset, holder); g_object_unref (holder); if (bcnc) { const gchar *dict_file_name; dict_file_name = browser_connection_get_dictionary_file (bcnc); if (dict_file_name) gda_set_set_holder_value (dset, NULL, "GDA_BROWSER_DICT_FILE", dict_file_name); } /* create form */ GtkWidget *wid; wid = gdaui_basic_form_new (dset); g_object_set ((GObject*) wid, "show-actions", FALSE, NULL); gdaui_basic_form_entry_set_editable (GDAUI_BASIC_FORM (wid), NULL, FALSE); gtk_grid_attach (clist->priv->layout_grid, wid, 1, 2, 1, 1); gtk_widget_show (wid); clist->priv->cnc_params_editor = wid; /* fill GdaSet's parameters with values */ if (cncinfo->cnc_string) { gchar **array = NULL; array = g_strsplit (cncinfo->cnc_string, ";", 0); if (array) { gint index = 0; gchar *tok; gchar *value; gchar *name; for (index = 0; array[index]; index++) { name = strtok_r (array [index], "=", &tok); if (name) value = strtok_r (NULL, "=", &tok); else value = NULL; if (name && value) { GdaHolder *param; gda_rfc1738_decode (name); gda_rfc1738_decode (value); param = gda_set_get_holder (dset, name); if (param) g_assert (gda_holder_set_value_str (param, NULL, value, NULL)); } } g_strfreev (array); } } g_object_unref (dset); } }
static void update_form_contents (GdauiProviderSpecEditor *spec) { /*g_print ("DSN: %s\n", spec->priv->cnc_string);*/ switch (spec->priv->type) { case PROVIDER_FORM: { /* update data set in form */ GdaSet *dset; GSList *params_set = NULL; GSList *list; g_assert (spec->priv->form); dset = gdaui_basic_form_get_data_set (GDAUI_BASIC_FORM (spec->priv->form)); /* split array in a list of named parameters, and for each parameter value, set the correcponding parameter in @dset */ if (spec->priv->cnc_string) { gchar **array = NULL; array = g_strsplit (spec->priv->cnc_string, ";", 0); if (array) { gint index = 0; gchar *tok; gchar *value; gchar *name; for (index = 0; array[index]; index++) { name = strtok_r (array [index], "=", &tok); if (name) value = strtok_r (NULL, "=", &tok); else value = NULL; if (name && value) { GdaHolder *param; gda_rfc1738_decode (name); gda_rfc1738_decode (value); param = gda_set_get_holder (dset, name); if (param) if (gda_holder_set_value_str (param, NULL, value, NULL)) params_set = g_slist_prepend (params_set, param); } } g_strfreev (array); } } list = dset->holders; while (0 && list) { if (!params_set || !g_slist_find (params_set, list->data)) { /* empty parameter */ gda_holder_set_value (GDA_HOLDER (list->data), NULL, NULL); } list = g_slist_next (list); } g_slist_free (params_set); break; } default: /* no change here */ break; } }
GtkWidget * do_form_data_layout (GtkWidget *do_widget) { if (!window) { GdaStatement *stmt; GtkWidget *vbox; GtkWidget *label; GdaDataModel *model; GtkWidget *form; GdauiRawForm *raw_form; window = gtk_dialog_new_with_buttons ("Form with custom data layout", GTK_WINDOW (do_widget), 0, "Close", GTK_RESPONSE_NONE, NULL); g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL); g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window))), vbox, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); label = gtk_label_new ("The following GdauiForm widget displays information about customers,\n" "using a paned container where the right part is used to display\n" "a picture of the customer.\n"); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); /* Create the demo widget: select all the customers and computes the total * amount of orders they have spent */ stmt = gda_sql_parser_parse_string (demo_parser, "select c.id, c.name, c.country, c.city, c.photo, c.comments, sum (od.quantity * (1 - od.discount/100) * p.price) as total_orders from customers c left join orders o on (c.id=o.customer) left join order_contents od on (od.order_id=o.id) left join products p on (p.ref = od.product_ref) group by c.id order by total_orders desc", NULL, NULL); model = gda_connection_statement_execute_select (demo_cnc, stmt, NULL, NULL); g_object_unref (stmt); form = gdaui_form_new (model); g_object_unref (model); /* hide the ID data entry */ g_object_get (G_OBJECT (form), "raw-form", &raw_form, NULL); gdaui_basic_form_entry_set_visible (GDAUI_BASIC_FORM (raw_form), gda_set_get_holder (gdaui_basic_form_get_data_set (GDAUI_BASIC_FORM (raw_form)), "id"), FALSE); /* request custom layout: <gdaui_form name="customers" container="hpaned"> <gdaui_section title="Summary"> <gdaui_column> <gdaui_entry name="id"/> <gdaui_entry name="name" label="Customer name"/> <gdaui_entry name="comments" label="Comments" plugin="text"/> <gdaui_entry name="total_orders" label="Total ordered" plugin="number:NB_DECIMALS=2;CURRENCY=€"/> </gdaui_column> </gdaui_section> <gdaui_section title="Photo"> <gdaui_column> <gdaui_entry name="photo" plugin="picture"/> </gdaui_column> </gdaui_section> </gdaui_form> */ gchar *filename; filename = demo_find_file ("custom_layout.xml", NULL); gdaui_basic_form_set_layout_from_file (GDAUI_BASIC_FORM (raw_form), filename, "customers"); g_free (filename); /* we don't need the raw_form's reference anymore */ g_object_unref (G_OBJECT (raw_form)); gtk_box_pack_start (GTK_BOX (vbox), form, TRUE, TRUE, 0); } gboolean visible; g_object_get (G_OBJECT (window), "visible", &visible, NULL); if (!visible) gtk_widget_show_all (window); else { gtk_widget_destroy (window); window = NULL; } return window; }
static void plugins_combo_changed_cb (GtkComboBox *combo, TablePreferences *tpref) { GtkTreeIter iter; GtkWidget *old_options = NULL; if (tpref->priv->options_wid) { old_options = tpref->priv->options_wid; tpref->priv->options_wid = NULL; } if (gtk_combo_box_get_active_iter (combo, &iter)) { GdauiPlugin *plugin; GtkTreeModel *model; GError *error = NULL; model = gtk_combo_box_get_model (combo); gtk_tree_model_get (model, &iter, PL_COLUMN_PLUGIN, &plugin, -1); if (plugin && plugin->options_xml_spec) { GdaSet *plist; plist = gda_set_new_from_spec_string (plugin->options_xml_spec, &error); if (!plist) { g_warning ("Cannot parse XML spec for plugin options: %s", error && error->message ? error->message : "No detail"); g_clear_error (&error); } else { if (!old_options || (g_object_get_data (G_OBJECT (old_options), "plugin") != plugin)) { tpref->priv->options_wid = gdaui_basic_form_new (plist); g_object_set_data (G_OBJECT (tpref->priv->options_wid), "plugin", plugin); g_signal_connect (G_OBJECT (tpref->priv->options_wid), "holder-changed", G_CALLBACK (options_form_param_changed_cb), tpref); gtk_box_pack_start (GTK_BOX (tpref->priv->options_vbox), tpref->priv->options_wid, TRUE, TRUE, 0); } else { tpref->priv->options_wid = old_options; old_options = NULL; } g_object_unref (plist); } if (tpref->priv->options_wid) { plist = gdaui_basic_form_get_data_set (GDAUI_BASIC_FORM (tpref->priv->options_wid)); gtk_widget_hide (tpref->priv->options_none); gtk_widget_show (tpref->priv->options_wid); if (plist && !tpref->priv->save_plugin_changes) { /* load plugin options */ GtkTreeSelection *select; GtkTreeIter citer; select = gtk_tree_view_get_selection (tpref->priv->columns_treeview); if (gtk_tree_selection_get_selected (select, NULL, &citer)) { gchar *plugin_str; gtk_tree_model_get (GTK_TREE_MODEL (tpref->priv->columns_store), &citer, COLUMN_PLUGIN, &plugin_str, -1); /*g_print ("%p PLUGIN_STR:[%s]\n", tpref, plugin_str);*/ if (plugin_str) { GdaQuarkList *ql; GSList *list; gchar *tmp; for (tmp = plugin_str; *tmp && (*tmp != ':'); tmp++); if (*tmp == ':') { ql = gda_quark_list_new_from_string (tmp+1); for (list = plist->holders; list; list = list->next) { GdaHolder *holder = GDA_HOLDER (list->data); const gchar *cstr; cstr = gda_quark_list_find (ql, gda_holder_get_id (holder)); if (cstr) gda_holder_set_value_str (holder, NULL, cstr, NULL); else gda_holder_set_value (holder, NULL, NULL); } gda_quark_list_free (ql); } g_free (plugin_str); } } } } } if (tpref->priv->save_plugin_changes && tpref->priv->current_table && tpref->priv->current_column && ! browser_connection_set_table_column_attribute (tpref->priv->bcnc, tpref->priv->current_table, tpref->priv->current_column, BROWSER_CONNECTION_COLUMN_PLUGIN, plugin ? plugin->plugin_name : NULL, &error)) { TO_IMPLEMENT; /* FIXME: add a notice somewhere in the UI */ g_warning ("Error: %s\n", error && error->message ? error->message : _("No detail")); g_clear_error (&error); } set_preview_widget (tpref); } if (old_options) gtk_widget_destroy (old_options); if (! tpref->priv->options_wid) gtk_widget_show (tpref->priv->options_none); }
static void sql_execute_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tconsole) { gchar *sql; if (tconsole->priv->params_popup) gtk_widget_hide (tconsole->priv->params_popup); /* compute parameters if necessary */ if (tconsole->priv->params_compute_id > 0) { g_source_remove (tconsole->priv->params_compute_id); tconsole->priv->params_compute_id = 0; compute_params (tconsole); } if (tconsole->priv->params) { if (! gdaui_basic_form_is_valid (GDAUI_BASIC_FORM (tconsole->priv->params_form))) { GtkWidget *form, *cont; if (! tconsole->priv->params_popup) { tconsole->priv->params_popup = popup_container_new_with_func (popup_container_position_func); g_object_set_data (G_OBJECT (tconsole->priv->params_popup), "console", tconsole); GtkWidget *vbox, *label, *bbox, *button; gchar *str; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (tconsole->priv->params_popup), vbox); gtk_container_set_border_width (GTK_CONTAINER (tconsole->priv->params_popup), 10); label = gtk_label_new (""); str = g_strdup_printf ("<b>%s</b>:\n<small>%s</small>", _("Invalid variable's contents"), _("assign values to the following variables")); gtk_label_set_markup (GTK_LABEL (label), str); g_free (str); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); cont = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start (GTK_BOX (vbox), cont, FALSE, FALSE, 10); g_object_set_data (G_OBJECT (tconsole->priv->params_popup), "cont", cont); bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 10); gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END); button = gtk_button_new_from_icon_name ("system-run-symbolic", GTK_ICON_SIZE_BUTTON); gtk_box_pack_start (GTK_BOX (bbox), button, TRUE, TRUE, 0); g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_hide), tconsole->priv->params_popup); g_signal_connect (button, "clicked", G_CALLBACK (sql_execute_clicked_cb), tconsole); gtk_widget_set_sensitive (button, FALSE); g_object_set_data (G_OBJECT (tconsole->priv->params_popup), "exec", button); button = gtk_button_new_with_mnemonic (_("_Cancel")); gtk_box_pack_start (GTK_BOX (bbox), button, TRUE, TRUE, 0); g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_hide), tconsole->priv->params_popup); } else { form = g_object_get_data (G_OBJECT (tconsole->priv->params_popup), "form"); if (form) gtk_widget_destroy (form); } cont = g_object_get_data (G_OBJECT (tconsole->priv->params_popup), "cont"); form = gdaui_basic_form_new (tconsole->priv->params); g_object_set ((GObject*) form, "show-actions", TRUE, NULL); g_signal_connect (form, "holder-changed", G_CALLBACK (params_form_changed_cb), tconsole); g_signal_connect (form, "activated", G_CALLBACK (sql_execute_clicked_cb), tconsole); gtk_box_pack_start (GTK_BOX (cont), form, TRUE, TRUE, 0); g_object_set_data (G_OBJECT (tconsole->priv->params_popup), "form", form); gtk_widget_show_all (tconsole->priv->params_popup); return; } } sql = query_editor_get_all_text (tconsole->priv->editor); actually_execute (tconsole, sql, tconsole->priv->params, TRUE); g_free (sql); }