~ubuntu-branches/ubuntu/karmic/mergeant/karmic

« back to all changes in this revision

Viewing changes to src/utils.c

  • Committer: Bazaar Package Importer
  • Author(s): Gustavo R. Montesino
  • Date: 2007-11-29 08:44:48 UTC
  • mfrom: (2.1.4 hardy)
  • Revision ID: james.westby@ubuntu.com-20071129084448-6aon73d22bv6hzfw
Tags: 0.67-3
* Re-enable installation of the mime files in mergeant.install
* mergeant.dirs: create usr/share/mime/packages to make dh_installmime add
  the update-mime-database code snippets

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Mergeant
 
2
 *
 
3
 * Copyright (C) 2006 Vivien Malerba
 
4
 *
 
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.
 
9
 *
 
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.
 
14
 *
 
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
 
18
 * USA
 
19
 */
 
20
 
 
21
#include "utils.h"
 
22
#include <glib/gi18n-lib.h>
 
23
#include <string.h>
 
24
 
 
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);
 
27
 
 
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)
 
32
{
 
33
        GtkWidget *dlg, *hbox, *label, *wid;
 
34
        GtkWidget *vbox;
 
35
        gchar *str;
 
36
 
 
37
        g_return_val_if_fail (title, NULL);
 
38
 
 
39
        dlg = gtk_dialog_new_with_buttons (title, parent, 0,
 
40
                                           GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
 
41
                                           GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
 
42
                                           NULL);
 
43
        g_object_set_data (G_OBJECT (dlg), "optype", GINT_TO_POINTER (type));
 
44
        if (options) {
 
45
                g_object_set_data_full (G_OBJECT (dlg), "options", options, g_object_unref);
 
46
                g_object_ref (options);
 
47
        }
 
48
        if (cnc) {
 
49
                g_object_set_data_full (G_OBJECT (dlg), "cnc", cnc, g_object_unref);
 
50
                g_object_ref (cnc);
 
51
        }
 
52
 
 
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);
 
57
        
 
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);
 
63
        
 
64
        /* foreword */
 
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);
 
69
        g_free (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);
 
73
 
 
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);
 
79
                g_free (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);
 
83
                
 
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);
 
90
                
 
91
                label = gtk_label_new (_("Provider:"));
 
92
                gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 5);
 
93
                gtk_widget_show (label);
 
94
                
 
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);
 
104
        }
 
105
        else {
 
106
                GtkWidget *box;
 
107
                GdaServerProvider *prov;
 
108
                GdaServerOperationType optype;
 
109
 
 
110
                if (!cnc)
 
111
                        g_error ("No GdaConnection object available");
 
112
                prov = gda_connection_get_provider_obj (cnc);
 
113
                if (!prov)
 
114
                        g_error ("GdaConnection has no associated GdaServerProvider object available");
 
115
 
 
116
                box = g_object_get_data (G_OBJECT (dlg), "box");
 
117
 
 
118
                g_object_ref (prov);
 
119
                g_object_set_data_full (G_OBJECT (dlg), "prov", prov, g_object_unref);
 
120
 
 
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"));
 
124
                else {
 
125
                        GdaServerOperation *op;
 
126
                        GError *error = NULL;
 
127
 
 
128
                        op = gda_server_provider_create_operation (prov, cnc, optype, options, &error);
 
129
                        if (!op) {
 
130
                                gchar *str;
 
131
                                
 
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);
 
135
                                g_free (str);
 
136
                                if (error)
 
137
                                        g_error_free (error);
 
138
                        }
 
139
                        else {
 
140
                                wid = gnome_db_server_operation_new (op);
 
141
                                g_object_set_data_full (G_OBJECT (dlg), "op", op, g_object_unref);
 
142
                        }
 
143
                }
 
144
        
 
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);
 
148
        }
 
149
        if (type == GDA_SERVER_OPERATION_CREATE_TABLE) 
 
150
                gtk_window_set_default_size (GTK_WINDOW (dlg), 600, 600);
 
151
        else
 
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);
 
157
 
 
158
        return dlg;
 
159
}
 
160
 
 
161
static void
 
162
server_op_dlg_response_cb (GtkDialog *dlg, gint resp_id, gpointer data)
 
163
{
 
164
        if (resp_id == GTK_RESPONSE_ACCEPT) {
 
165
                GdaServerOperation *op;
 
166
                GdaServerProvider *prov;
 
167
                GError *error = NULL;
 
168
                GtkWidget *mess = NULL;
 
169
                GdaConnection *cnc;
 
170
 
 
171
                MergeantServerOpCallback done_cb;
 
172
                gpointer user_data;
 
173
 
 
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");
 
177
 
 
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");
 
180
 
 
181
                if (!gda_server_provider_perform_operation (prov, cnc, op, &error)) {
 
182
                        if (done_cb)
 
183
                                done_cb ((GtkWidget *) dlg, FALSE, user_data);
 
184
                        mess = gtk_message_dialog_new_with_markup (NULL, GTK_DIALOG_MODAL,
 
185
                                                                  GTK_MESSAGE_ERROR,
 
186
                                                                  GTK_BUTTONS_CLOSE, 
 
187
                                                                  "<b>%s:</b>\n\n%s",
 
188
                                                                  _("Could not perform operation"),
 
189
                                                                  error && error->message ? error->message : _("No detail"));
 
190
                        if (error)
 
191
                                g_error_free (error);
 
192
                }
 
193
                else {
 
194
                        if (done_cb)
 
195
                                done_cb ((GtkWidget *) dlg, TRUE, user_data);
 
196
 
 
197
                        /* mess = gtk_message_dialog_new_with_markup (NULL, GTK_DIALOG_MODAL, */
 
198
/*                                                                GTK_MESSAGE_INFO, */
 
199
/*                                                                GTK_BUTTONS_CLOSE,  */
 
200
/*                                                                "<b>%s</b>", */
 
201
/*                                                                _("Operation successfully performed")); */
 
202
                }
 
203
 
 
204
                gtk_widget_destroy (GTK_WIDGET (dlg));
 
205
                if (mess) {
 
206
                        gtk_dialog_run (GTK_DIALOG (mess));
 
207
                        gtk_widget_destroy (mess);
 
208
                }
 
209
        }
 
210
        else
 
211
                gtk_widget_destroy (GTK_WIDGET (dlg));
 
212
}
 
213
 
 
214
static void
 
215
server_op_provider_changed_cb (GnomeDbProviderSelector *prov_sel, GtkWidget *dlg)
 
216
{
 
217
        GdaServerOperationType optype;
 
218
        GtkWidget *box, *wid;
 
219
        GdaServerProvider *prov;
 
220
        GError *error = NULL;
 
221
        GdaServerOperation *op;
 
222
 
 
223
        /* unreference any previous setting */
 
224
        wid = g_object_get_data (G_OBJECT (dlg), "opform");
 
225
        if (wid) {
 
226
                gtk_widget_destroy (wid);
 
227
                g_object_set_data (G_OBJECT (dlg), "opform", NULL);
 
228
        }
 
229
        op = g_object_get_data (G_OBJECT (dlg), "op");
 
230
        if (op) 
 
231
                g_object_set_data (G_OBJECT (dlg), "op", NULL);
 
232
 
 
233
        prov = g_object_get_data (G_OBJECT (dlg), "prov");
 
234
        if (prov) 
 
235
                g_object_set_data (G_OBJECT (dlg), "prov", NULL);
 
236
 
 
237
        /* new settings */
 
238
        box = g_object_get_data (G_OBJECT (dlg), "box");
 
239
        prov = gnome_db_provider_selector_get_selected_provider_obj (prov_sel);
 
240
        if (!prov) 
 
241
                wid = gtk_label_new (_("Internal error: can't instantiate a provider object"));
 
242
        else {
 
243
                GdaParameterList *options;
 
244
                GdaConnection *cnc;
 
245
 
 
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");
 
249
 
 
250
                /* @cnc and @prov adjustements */
 
251
                if (cnc) {
 
252
                        GdaServerProvider *cncprov;
 
253
 
 
254
                        cncprov = gda_connection_get_provider_obj (cnc);
 
255
                        if (cncprov != prov) {
 
256
                                GdaServerProviderInfo* info, *cncinfo;
 
257
 
 
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))
 
262
                                        prov = cncprov;
 
263
                                else
 
264
                                        cnc = NULL;
 
265
                        }
 
266
                }
 
267
 
 
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"));
 
271
                else {
 
272
                        op = gda_server_provider_create_operation (prov, cnc, optype, options, &error);
 
273
                        if (!op) {
 
274
                                gchar *str;
 
275
 
 
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);
 
279
                                g_free (str);
 
280
                                if (error)
 
281
                                        g_error_free (error);
 
282
                        }
 
283
                        else {
 
284
                                wid = gnome_db_server_operation_new (op);
 
285
                                g_object_set_data_full (G_OBJECT (dlg), "op", op, g_object_unref);
 
286
                        }
 
287
                }
 
288
        }
 
289
        
 
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);
 
293
}