static void dsn_copy_cb (G_GNUC_UNUSED GSimpleAction *action, GVariant *state, gpointer data) { GdauiDsnEditor *editor; editor = GDAUI_DSN_EDITOR (data); GtkWindow *parent = NULL; parent = (GtkWindow*) gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW); GtkWidget *dialog = NULL; dialog = gtk_dialog_new_with_buttons (_("Data source copy"), parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("Create data source"), GTK_RESPONSE_ACCEPT, _("_Cancel"), GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_REJECT); GtkWidget *grid, *dlg_box, *label, *entry; dlg_box = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); grid = gtk_grid_new (); gtk_box_pack_start (GTK_BOX (dlg_box), grid, TRUE, TRUE, 6); gtk_container_set_border_width (GTK_CONTAINER (grid), 0); gtk_grid_set_row_spacing (GTK_GRID (grid), 6); gtk_grid_set_column_spacing (GTK_GRID (grid), 5); gchar *str; str = g_strdup_printf (_("Define the named of the new data source which will be created as a copy " "of '%s':"), editor->priv->name); label = gtk_label_new (str); g_free (str); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 2, 1); str = _gdaui_utility_markup_title (_("Data source name"), FALSE); label = gtk_label_new (""); gtk_label_set_markup (GTK_LABEL (label), str); g_free (str); gtk_widget_set_halign (label, GTK_ALIGN_START); gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1); entry = gtk_entry_new (); guint i; for (i = 1; ; i++) { str = g_strdup_printf ("%s_%u", editor->priv->name, i); if (! gda_config_get_dsn_info (str)) { gtk_entry_set_text (GTK_ENTRY (entry), str); g_free (str); break; } g_free (str); } gtk_editable_set_editable (GTK_EDITABLE (entry), TRUE); g_signal_connect (entry, "changed", G_CALLBACK (copy_dlg_entry_changed_cb), dialog); gtk_widget_set_hexpand (entry, TRUE); gtk_grid_attach (GTK_GRID (grid), entry, 1, 1, 1, 1); gtk_widget_show_all (grid); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { const gchar *name; name = gtk_entry_get_text (GTK_ENTRY (entry)); GdaDsnInfo *dsn_info = NULL; GError *error = NULL; dsn_info = gda_config_get_dsn_info (editor->priv->name); if (dsn_info) { dsn_info = gda_dsn_info_copy (dsn_info); g_free (dsn_info->name); dsn_info->name = g_strdup (name); gda_config_define_dsn (dsn_info, &error); gda_dsn_info_free (dsn_info); } else g_set_error (&error, GDA_CONFIG_ERROR, GDA_CONFIG_DSN_NOT_FOUND_ERROR, ("DSN '%s' does not exist anymore"), editor->priv->name); if (error) { _gdaui_utility_show_error (GTK_WINDOW (dialog), _("Could not create data source: %s"), error->message); g_clear_error (&error); } } gtk_widget_destroy (dialog); }
static void gdaui_dsn_assistant_init (GdauiDsnAssistant *assistant, G_GNUC_UNUSED GdauiDsnAssistantClass *klass) { GtkWidget *label, *vbox, *grid; GtkAssistant *assist; gchar *str; g_return_if_fail (GDAUI_IS_DSN_ASSISTANT (assistant)); /* global assistant settings */ assist = GTK_ASSISTANT (assistant); gtk_window_set_title (GTK_WINDOW (assist), _("New data source definition")); gtk_container_set_border_width (GTK_CONTAINER (assist), 0); g_signal_connect (assist, "cancel", G_CALLBACK (assistant_cancelled_cb), NULL); g_signal_connect (assist, "apply", G_CALLBACK (assistant_applied_cb), NULL); gtk_assistant_set_forward_page_func (assist, (GtkAssistantPageFunc) forward_page_function, assistant, NULL); /* create private structure */ assistant->priv = g_new0 (GdauiDsnAssistantPrivate, 1); assistant->priv->dsn_info = g_new0 (GdaDsnInfo, 1); assistant->priv->provider_detail = NULL; assistant->priv->create_db_op = NULL; /* * start page */ label = gtk_label_new (""); gtk_label_set_markup (GTK_LABEL (label), _("This assistant will guide you through the process of " "creating a new data source, and optionally will allow you to " "create a new database.\n\nJust follow the steps!")); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_widget_show (label); gtk_assistant_append_page (assist, label); gtk_assistant_set_page_title (assist, label, _("Add a new data source...")); /* TODO: This is deprecated. Add it to the main content instead: */ gtk_assistant_set_page_type (assist, label, GTK_ASSISTANT_PAGE_INTRO); gtk_assistant_set_page_complete (assist, label, TRUE); /* * general info page */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); grid = gtk_grid_new (); gtk_box_pack_start (GTK_BOX (vbox), grid, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (grid), 0); gtk_grid_set_row_spacing (GTK_GRID (grid), 3); gtk_grid_set_column_spacing (GTK_GRID (grid), 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("The following fields represent the basic information " "items for your new data source. Mandatory fields are marked " "with a star. " "To create a local database in a file, select the 'SQLite' type " "of database.")); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 2, 1); str = _gdaui_utility_markup_title (_("Data source name"), FALSE); label = gtk_label_new (""); gtk_label_set_markup (GTK_LABEL (label), str); g_free (str); gtk_misc_set_alignment (GTK_MISC (label), 0., 0.); gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1); assistant->priv->general_name = gtk_entry_new (); gtk_editable_set_editable (GTK_EDITABLE (assistant->priv->general_name), TRUE); gtk_widget_show (assistant->priv->general_name); gtk_grid_attach (GTK_GRID (grid), assistant->priv->general_name, 1, 1, 1, 1); g_signal_connect (assistant->priv->general_name, "changed", G_CALLBACK (dsn_name_changed_cb), assistant); if (gda_config_can_modify_system_config ()) { label = gtk_label_new (_("System wide data source:")); gtk_misc_set_alignment (GTK_MISC (label), 0., 0.); gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1); assistant->priv->general_is_system = gtk_check_button_new (); gtk_grid_attach (GTK_GRID (grid), assistant->priv->general_is_system, 1, 2, 1, 1); } else assistant->priv->general_is_system = NULL; str = _gdaui_utility_markup_title (_("Database type"), FALSE); label = gtk_label_new (""); gtk_label_set_markup (GTK_LABEL (label), str); g_free (str); gtk_misc_set_alignment (GTK_MISC (label), 0., 0.); gtk_grid_attach (GTK_GRID (grid), label, 0, 3, 1, 1); assistant->priv->general_provider = gdaui_provider_selector_new (); gtk_grid_attach (GTK_GRID (grid), assistant->priv->general_provider, 1, 3, 1, 1); label = gtk_label_new (_("Description:")); gtk_misc_set_alignment (GTK_MISC (label), 0., 0.); gtk_grid_attach (GTK_GRID (grid), label, 0, 4, 1, 1); assistant->priv->general_description = gtk_entry_new (); gtk_editable_set_editable (GTK_EDITABLE (assistant->priv->general_description), TRUE); gtk_widget_show (assistant->priv->general_description); gtk_grid_attach (GTK_GRID (grid), assistant->priv->general_description, 1, 4, 1, 1); gtk_widget_show_all (vbox); gtk_assistant_append_page (assist, vbox); gtk_assistant_set_page_title (assist, vbox, _("General Information")); gtk_assistant_set_page_type (assist, vbox, GTK_ASSISTANT_PAGE_CONTENT); assistant->priv->general_page = vbox; /* * Choose between existing database or create a new one */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); grid = gtk_grid_new (); gtk_box_pack_start (GTK_BOX (vbox), grid, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (grid), 0); gtk_grid_set_row_spacing (GTK_GRID (grid), 3); gtk_grid_set_column_spacing (GTK_GRID (grid), 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("This page lets you choose between using an existing database " "or to create a new database to use with this new data source")); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 2, 1); label = gtk_label_new (_("Create a new database:")); gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1); assistant->priv->choose_toggle = gtk_check_button_new (); gtk_grid_attach (GTK_GRID (grid), assistant->priv->choose_toggle, 1, 1, 1, 1); gtk_widget_show_all (vbox); gtk_assistant_append_page (assist, vbox); gtk_assistant_set_page_title (assist, vbox, _("Create a new database?")); gtk_assistant_set_page_type (assist, vbox, GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_complete (assist, vbox, TRUE); /* * New database information page */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("The following fields represent the information needed " "to create a new database " "(mandatory fields are marked with a star)." "This information is database-specific, so check " "the manual for more information.")); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); GtkWidget *sw, *vp; sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_NONE); vp = gtk_viewport_new (NULL, NULL); gtk_widget_set_name (vp, "gdaui-transparent-background"); gtk_viewport_set_shadow_type (GTK_VIEWPORT (vp), GTK_SHADOW_NONE); gtk_container_add (GTK_CONTAINER (sw), vp); assistant->priv->newdb_box = vp; gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0); assistant->priv->newdb_params = NULL; gtk_widget_show_all (vbox); gtk_assistant_append_page (assist, vbox); gtk_assistant_set_page_title (assist, vbox, _("New database definition")); gtk_assistant_set_page_type (assist, vbox, GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_complete (assist, vbox, TRUE); /* * provider parameters to open connection page */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("The following fields represent the information needed " "to open a connection (mandatory fields are marked with a star). " "This information is database-specific, so check " "the manual for more information.")); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); assistant->priv->provider_container = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start (GTK_BOX (vbox), assistant->priv->provider_container, TRUE, TRUE, 0); gtk_widget_show_all (vbox); gtk_assistant_append_page (assist, vbox); gtk_assistant_set_page_title (assist, vbox, _("Connection's parameters")); gtk_assistant_set_page_type (assist, vbox, GTK_ASSISTANT_PAGE_CONTENT); assistant->priv->cnc_params_page = vbox; /* * authentication page */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("The following fields represent the authentication information needed " "to open a connection.")); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); assistant->priv->auth_container = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start (GTK_BOX (vbox), assistant->priv->auth_container, TRUE, TRUE, 0); gtk_widget_show_all (vbox); gtk_assistant_append_page (assist, vbox); gtk_assistant_set_page_title (assist, vbox, _("Authentication parameters")); gtk_assistant_set_page_type (assist, vbox, GTK_ASSISTANT_PAGE_CONTENT); assistant->priv->cnc_auth_page = vbox; /* * end page */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 0); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), _("All information needed to create a new data source " "has been retrieved. Now, press 'Apply' to close " "this dialog.")); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0); gtk_widget_show_all (vbox); gtk_assistant_append_page (assist, vbox); gtk_assistant_set_page_title (assist, vbox, _("Ready to add a new data source")); gtk_assistant_set_page_type (assist, vbox, GTK_ASSISTANT_PAGE_CONFIRM); gtk_assistant_set_page_complete (assist, vbox, TRUE); /* force correct init */ provider_changed_cb (assistant->priv->general_provider, assistant); g_signal_connect (G_OBJECT (assistant->priv->general_provider), "changed", G_CALLBACK (provider_changed_cb), assistant); }