/*
 * _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);
}
Exemple #10
0
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);
}
Exemple #11
0
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);
}
Exemple #12
0
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;
	}
}
Exemple #15
0
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;
}
Exemple #16
0
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);
}
Exemple #17
0
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);
}