3
* Copyright (C) 2006 Vivien Malerba
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License as
7
* published by the Free Software Foundation; either version 2 of the
8
* License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22
#include <glib/gi18n-lib.h>
25
static void server_op_provider_changed_cb (GnomeDbProviderSelector *prov_sel, GtkWidget *dlg);
26
static void server_op_dlg_response_cb (GtkDialog *dlg, gint resp_id, gpointer data);
28
GtkWidget *mergeant_server_op_create_dialog (GtkWindow *parent, GdaServerOperationType type,
29
GdaConnection *cnc, GdaParameterList *options,
30
const gchar *title, const gchar *foreword,
31
MergeantServerOpCallback done_cb, gpointer user_data)
33
GtkWidget *dlg, *hbox, *label, *wid;
37
g_return_val_if_fail (title, NULL);
39
dlg = gtk_dialog_new_with_buttons (title, parent, 0,
40
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
41
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
43
g_object_set_data (G_OBJECT (dlg), "optype", GINT_TO_POINTER (type));
45
g_object_set_data_full (G_OBJECT (dlg), "options", options, g_object_unref);
46
g_object_ref (options);
49
g_object_set_data_full (G_OBJECT (dlg), "cnc", cnc, g_object_unref);
53
hbox = gtk_hbox_new (FALSE, 0);
54
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), hbox, TRUE, TRUE, 0);
55
gtk_widget_show (hbox);
56
gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
58
vbox = gtk_vbox_new (FALSE, 0);
59
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
60
gtk_widget_show (vbox);
61
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
62
g_object_set_data (G_OBJECT (dlg), "box", vbox);
65
str = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s", title, foreword ?
66
foreword : _("Please fill in the following information."));
67
label = gtk_label_new ("");
68
gtk_label_set_markup (GTK_LABEL (label), str);
70
gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
71
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
72
gtk_widget_show (label);
74
/* with provider selection */
75
if ((type == GDA_SERVER_OPERATION_CREATE_DB) || (type == GDA_SERVER_OPERATION_DROP_DB)) {
76
label = gtk_label_new ("");
77
str = g_strdup_printf ("<b>%s:</b>", _("Provider selection"));
78
gtk_label_set_markup (GTK_LABEL (label), str);
80
gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
81
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 5);
82
gtk_widget_show (label);
84
hbox = gtk_hbox_new (FALSE, 0); /* HIG */
85
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
86
gtk_widget_show (hbox);
87
label = gtk_label_new (" ");
88
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
89
gtk_widget_show (label);
91
label = gtk_label_new (_("Provider:"));
92
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 5);
93
gtk_widget_show (label);
95
wid = gnome_db_provider_selector_new ();
96
gnome_db_provider_selector_set_selected_provider (GNOME_DB_PROVIDER_SELECTOR (wid),
97
cnc && gda_connection_get_provider (cnc) ?
98
gda_connection_get_provider (cnc) : "SQLite");
99
g_signal_connect (G_OBJECT (wid), "changed",
100
G_CALLBACK (server_op_provider_changed_cb), dlg);
101
gtk_box_pack_start (GTK_BOX (hbox), wid, TRUE, TRUE, 0);
102
gtk_widget_show (wid);
103
server_op_provider_changed_cb (GNOME_DB_PROVIDER_SELECTOR (wid), dlg);
107
GdaServerProvider *prov;
108
GdaServerOperationType optype;
111
g_error ("No GdaConnection object available");
112
prov = gda_connection_get_provider_obj (cnc);
114
g_error ("GdaConnection has no associated GdaServerProvider object available");
116
box = g_object_get_data (G_OBJECT (dlg), "box");
119
g_object_set_data_full (G_OBJECT (dlg), "prov", prov, g_object_unref);
121
optype = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "optype"));
122
if (!gda_server_provider_supports_operation (prov, cnc, optype, options))
123
wid = gtk_label_new (_("The provider associated to this connection\ndoes not support this operation"));
125
GdaServerOperation *op;
126
GError *error = NULL;
128
op = gda_server_provider_create_operation (prov, cnc, optype, options, &error);
132
str = g_strdup_printf (_("Could not get the information required to perform that operation:\n%s"),
133
error && error->message ? error->message : _("No detail"));
134
wid = gtk_label_new (str);
137
g_error_free (error);
140
wid = gnome_db_server_operation_new (op);
141
g_object_set_data_full (G_OBJECT (dlg), "op", op, g_object_unref);
145
gtk_box_pack_start (GTK_BOX (box), wid, TRUE, TRUE, 0);
146
g_object_set_data (G_OBJECT (dlg), "opform", wid);
147
gtk_widget_show (wid);
149
if (type == GDA_SERVER_OPERATION_CREATE_TABLE)
150
gtk_window_set_default_size (GTK_WINDOW (dlg), 600, 600);
152
gtk_window_set_default_size (GTK_WINDOW (dlg), 500, 400);
153
g_object_set_data (G_OBJECT (dlg), "done_cb", done_cb);
154
g_object_set_data (G_OBJECT (dlg), "done_cb_data", user_data);
155
g_signal_connect (G_OBJECT (dlg), "response",
156
G_CALLBACK (server_op_dlg_response_cb), NULL);
162
server_op_dlg_response_cb (GtkDialog *dlg, gint resp_id, gpointer data)
164
if (resp_id == GTK_RESPONSE_ACCEPT) {
165
GdaServerOperation *op;
166
GdaServerProvider *prov;
167
GError *error = NULL;
168
GtkWidget *mess = NULL;
171
MergeantServerOpCallback done_cb;
174
op = g_object_get_data (G_OBJECT (dlg), "op");
175
prov = g_object_get_data (G_OBJECT (dlg), "prov");
176
cnc = g_object_get_data (G_OBJECT (dlg), "cnc");
178
done_cb = g_object_get_data (G_OBJECT (dlg), "done_cb");
179
user_data = g_object_get_data (G_OBJECT (dlg), "done_cb_data");
181
if (!gda_server_provider_perform_operation (prov, cnc, op, &error)) {
183
done_cb ((GtkWidget *) dlg, FALSE, user_data);
184
mess = gtk_message_dialog_new_with_markup (NULL, GTK_DIALOG_MODAL,
188
_("Could not perform operation"),
189
error && error->message ? error->message : _("No detail"));
191
g_error_free (error);
195
done_cb ((GtkWidget *) dlg, TRUE, user_data);
197
/* mess = gtk_message_dialog_new_with_markup (NULL, GTK_DIALOG_MODAL, */
198
/* GTK_MESSAGE_INFO, */
199
/* GTK_BUTTONS_CLOSE, */
201
/* _("Operation successfully performed")); */
204
gtk_widget_destroy (GTK_WIDGET (dlg));
206
gtk_dialog_run (GTK_DIALOG (mess));
207
gtk_widget_destroy (mess);
211
gtk_widget_destroy (GTK_WIDGET (dlg));
215
server_op_provider_changed_cb (GnomeDbProviderSelector *prov_sel, GtkWidget *dlg)
217
GdaServerOperationType optype;
218
GtkWidget *box, *wid;
219
GdaServerProvider *prov;
220
GError *error = NULL;
221
GdaServerOperation *op;
223
/* unreference any previous setting */
224
wid = g_object_get_data (G_OBJECT (dlg), "opform");
226
gtk_widget_destroy (wid);
227
g_object_set_data (G_OBJECT (dlg), "opform", NULL);
229
op = g_object_get_data (G_OBJECT (dlg), "op");
231
g_object_set_data (G_OBJECT (dlg), "op", NULL);
233
prov = g_object_get_data (G_OBJECT (dlg), "prov");
235
g_object_set_data (G_OBJECT (dlg), "prov", NULL);
238
box = g_object_get_data (G_OBJECT (dlg), "box");
239
prov = gnome_db_provider_selector_get_selected_provider_obj (prov_sel);
241
wid = gtk_label_new (_("Internal error: can't instantiate a provider object"));
243
GdaParameterList *options;
246
g_object_set_data_full (G_OBJECT (dlg), "prov", prov, g_object_unref);
247
options = g_object_get_data (G_OBJECT (dlg), "options");
248
cnc = g_object_get_data (G_OBJECT (dlg), "cnc");
250
/* @cnc and @prov adjustements */
252
GdaServerProvider *cncprov;
254
cncprov = gda_connection_get_provider_obj (cnc);
255
if (cncprov != prov) {
256
GdaServerProviderInfo* info, *cncinfo;
258
info = gda_server_provider_get_info (prov, NULL);
259
cncinfo = gda_server_provider_get_info (cncprov, cnc);
260
if (info && cncinfo && info->provider_name &&
261
!strcmp (info->provider_name, cncinfo->provider_name))
268
optype = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dlg), "optype"));
269
if (!gda_server_provider_supports_operation (prov, cnc, optype, options))
270
wid = gtk_label_new (_("Selected provider does not support this operation"));
272
op = gda_server_provider_create_operation (prov, cnc, optype, options, &error);
276
str = g_strdup_printf (_("Could not get the information required to perform that operation:\n%s"),
277
error && error->message ? error->message : _("No detail"));
278
wid = gtk_label_new (str);
281
g_error_free (error);
284
wid = gnome_db_server_operation_new (op);
285
g_object_set_data_full (G_OBJECT (dlg), "op", op, g_object_unref);
290
gtk_box_pack_start (GTK_BOX (box), wid, TRUE, TRUE, 0);
291
g_object_set_data (G_OBJECT (dlg), "opform", wid);
292
gtk_widget_show (wid);