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); }
/** * gdaui_dsn_editor_set_dsn * @editor: a #GdauiDsnEditor widget * @dsn_info: (allow-none): a #GdaDsnInfo pointer or %NULL * * * Requests that @editor update its contents with @dsn_info's contents */ void gdaui_dsn_editor_set_dsn (GdauiDsnEditor *editor, const GdaDsnInfo *dsn_info) { g_return_if_fail (GDAUI_IS_DSN_EDITOR (editor)); editor->priv->no_change_signal = TRUE; if (dsn_info) { GdaProviderInfo *pinfo; pinfo = gda_config_get_provider_info (dsn_info->provider); GdkPixbuf *pix; pix = support_create_pixbuf_for_provider (pinfo); if (pix) { gtk_image_set_from_pixbuf (GTK_IMAGE (editor->priv->icon), pix); g_object_unref (pix); } else gtk_image_clear (GTK_IMAGE (editor->priv->icon)); if (pinfo) gtk_widget_hide (editor->priv->warning); else gtk_widget_show (editor->priv->warning); gchar *tmp; tmp = g_markup_printf_escaped ("<big><b>%s</b></big>", dsn_info->name); gtk_label_set_markup (GTK_LABEL (editor->priv->wname), tmp); g_free (tmp); g_free (editor->priv->name); editor->priv->name = g_strdup (dsn_info->name); gdaui_provider_selector_set_provider (GDAUI_PROVIDER_SELECTOR (editor->priv->wprovider), dsn_info->provider); _gdaui_provider_spec_editor_set_provider (GDAUI_PROVIDER_SPEC_EDITOR (editor->priv->dsn_spec), dsn_info->provider); _gdaui_provider_spec_editor_set_specs (GDAUI_PROVIDER_SPEC_EDITOR (editor->priv->dsn_spec), dsn_info->cnc_string); gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (editor->priv->wdesc)), dsn_info->description ? dsn_info->description : "", -1); _gdaui_provider_auth_editor_set_provider (GDAUI_PROVIDER_AUTH_EDITOR (editor->priv->dsn_auth), dsn_info->provider); _gdaui_provider_auth_editor_set_auth (GDAUI_PROVIDER_AUTH_EDITOR (editor->priv->dsn_auth), dsn_info->auth_string); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->is_system), dsn_info->is_system); if (dsn_info->is_system && !gda_config_can_modify_system_config ()) { gtk_widget_set_sensitive (editor->priv->wprovider, FALSE); gtk_text_view_set_editable (GTK_TEXT_VIEW (editor->priv->wdesc), pinfo ? TRUE : FALSE); gtk_widget_set_sensitive (editor->priv->dsn_spec, FALSE); gtk_widget_set_sensitive (editor->priv->dsn_auth, FALSE); gtk_widget_set_sensitive (editor->priv->is_system, FALSE); } else { gtk_widget_set_sensitive (editor->priv->wprovider, pinfo ? TRUE : FALSE); gtk_text_view_set_editable (GTK_TEXT_VIEW (editor->priv->wdesc), pinfo ? TRUE : FALSE); gtk_widget_set_sensitive (editor->priv->dsn_spec, TRUE); gtk_widget_set_sensitive (editor->priv->dsn_auth, TRUE); gtk_widget_set_sensitive (editor->priv->is_system, pinfo && gda_config_can_modify_system_config () ? TRUE : FALSE); } } else { gtk_image_clear (GTK_IMAGE (editor->priv->icon)); gtk_label_set_text (GTK_LABEL (editor->priv->wname), ""); gdaui_provider_selector_set_provider (GDAUI_PROVIDER_SELECTOR (editor->priv->wprovider), NULL); _gdaui_provider_spec_editor_set_provider (GDAUI_PROVIDER_SPEC_EDITOR (editor->priv->dsn_spec), NULL); gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (editor->priv->wdesc)), "", -1); _gdaui_provider_auth_editor_set_provider (GDAUI_PROVIDER_AUTH_EDITOR (editor->priv->dsn_auth), NULL); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (editor->priv->is_system), FALSE); gtk_widget_set_sensitive (editor->priv->wprovider, FALSE); gtk_text_view_set_editable (GTK_TEXT_VIEW (editor->priv->wdesc), FALSE); gtk_widget_set_sensitive (editor->priv->dsn_spec, FALSE); gtk_widget_set_sensitive (editor->priv->dsn_auth, FALSE); gtk_widget_set_sensitive (editor->priv->is_system, FALSE); } editor->priv->no_change_signal = FALSE; g_signal_emit (editor, gdaui_dsn_editor_signals[CHANGED], 0, NULL); }
static void assistant_applied_cb (GtkAssistant *assist, G_GNUC_UNUSED gpointer data) { gboolean allok = TRUE; GString *cnc_string = NULL; GdauiDsnAssistant *assistant = (GdauiDsnAssistant *) assist; g_return_if_fail (GDAUI_IS_DSN_ASSISTANT (assistant)); /* clear the internal dsn_info */ if (assistant->priv->dsn_info) { data_source_info_free (assistant->priv->dsn_info); assistant->priv->dsn_info = NULL; } /* New database creation first */ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (assistant->priv->choose_toggle))) { if (!gda_server_operation_is_valid (assistant->priv->create_db_op, NULL, NULL)) { _gdaui_utility_show_error (NULL, _("Missing mandatory information, to create database")); gtk_assistant_set_current_page (assist, PAGE_CREATE_DB_INFO); return; } else { GdaProviderInfo *prov_info; GSList *dsn_params; GError *error = NULL; allok = gda_server_operation_perform_create_database (assistant->priv->create_db_op, NULL, &error); if (!allok) { gchar *str; str = g_strdup_printf (_("Error creating database: %s"), error && error->message ? error->message : _("Unknown error")); _gdaui_utility_show_error (NULL, str); g_free (str); gtk_assistant_set_current_page (assist, PAGE_CREATE_DB_INFO); return; } /* make the connection string for the data source */ prov_info = gda_config_get_provider_info (gdaui_provider_selector_get_provider (GDAUI_PROVIDER_SELECTOR (assistant->priv->general_provider))); g_return_if_fail (prov_info); for (dsn_params = prov_info->dsn_params->holders; dsn_params; dsn_params = dsn_params->next) { GdaHolder *param = GDA_HOLDER (dsn_params->data); const GValue *value; value = gda_server_operation_get_value_at (assistant->priv->create_db_op, "/DB_DEF_P/%s", gda_holder_get_id (param)); if (!value) value = gda_server_operation_get_value_at (assistant->priv->create_db_op, "/SERVER_CNX_P/%s", gda_holder_get_id (param)); if (value && !gda_value_is_null ((GValue *) value)) { gchar *str; if (dsn_params == prov_info->dsn_params->holders) cnc_string = g_string_new (""); else g_string_append (cnc_string, ";"); str = gda_value_stringify ((GValue *) value); g_string_append_printf (cnc_string, "%s=%s", gda_holder_get_id (param), str); g_free (str); } } } } /* Data source declaration */ if (allok) { assistant->priv->dsn_info = g_new0 (GdaDsnInfo, 1); assistant->priv->dsn_info->name = g_strdup (gtk_entry_get_text (GTK_ENTRY (assistant->priv->general_name))); assistant->priv->dsn_info->provider = g_strdup ( gdaui_provider_selector_get_provider ( GDAUI_PROVIDER_SELECTOR (assistant->priv->general_provider))); if (cnc_string) { assistant->priv->dsn_info->cnc_string = cnc_string->str; g_string_free (cnc_string, FALSE); } else assistant->priv->dsn_info->cnc_string = _gdaui_provider_spec_editor_get_specs (GDAUI_PROVIDER_SPEC_EDITOR (assistant->priv->provider_detail)); assistant->priv->dsn_info->description = g_strdup (gtk_entry_get_text (GTK_ENTRY (assistant->priv->general_description))); assistant->priv->dsn_info->auth_string = NULL; if (assistant->priv->auth_detail) assistant->priv->dsn_info->auth_string = _gdaui_provider_auth_editor_get_auth (GDAUI_PROVIDER_AUTH_EDITOR (assistant->priv->auth_detail)); if (gda_config_can_modify_system_config ()) assistant->priv->dsn_info->is_system = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (assistant->priv->general_is_system)); else assistant->priv->dsn_info->is_system = FALSE; } /* notify listeners */ g_signal_emit (G_OBJECT (assistant), config_assistant_signals[FINISHED], 0, !allok); }