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

« back to all changes in this revision

Viewing changes to libmergeant/sel-onetable.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
 
/* sel-onetable.c
2
 
 *
3
 
 * Copyright (C) 2004 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 "sel-onetable.h"
22
 
#include <libgnomedb/libgnomedb.h>
23
 
#include "mg-server-data-type.h"
24
 
#include "mg-database.h"
25
 
#include "mg-db-table.h"
26
 
#include "mg-db-field.h"
27
 
#include "mg-db-constraint.h"
28
 
#include "mg-entity.h"
29
 
#include "mg-field.h"
30
 
 
31
 
/*
32
 
 *
33
 
 * Modules for the fields of a given MgDbTable
34
 
 *
35
 
 */
36
 
static void         module_onetable_fill_model (Module *module);
37
 
static void         module_onetable_free (Module *module);
38
 
static const gchar *module_onetable_col_name (Module *module, guint colno);
39
 
static void         module_onetable_model_store_data (Module *module, GtkTreeIter *iter);
40
 
 
41
 
static GSList      *module_onetable_get_objects_list (Module *module);
42
 
static gchar       *module_onetable_get_extended_name (GObject *obj);
43
 
 
44
 
Module *sel_module_onetable_new (MgSelector *mgsel, gboolean insert_header, 
45
 
                                 GtkTreeIter *iter, gpointer data)
46
 
{
47
 
        Module *module;
48
 
        MgDbTable *table;
49
 
        GdkPixbuf *pixbuf_field = NULL;
50
 
 
51
 
        g_assert (data && IS_MG_DB_TABLE (data));
52
 
        pixbuf_field = gnome_db_stock_get_icon_pixbuf_file ("gnome-db-field_16x16.png");
53
 
 
54
 
        /* module structure */
55
 
        table = MG_DB_TABLE (data);
56
 
        module = g_new0 (Module, 1);
57
 
        module->selector = mgsel;
58
 
        module->fill_model = module_onetable_fill_model;
59
 
        module->free = module_onetable_free;
60
 
        module->col_name = module_onetable_col_name;
61
 
        module->obj_manager = NULL;
62
 
        module->model_store_data = module_onetable_model_store_data;
63
 
        module->mod_data = NULL;
64
 
        module->iter = NULL;
65
 
        module->parent_module = NULL;
66
 
        module->sub_modules = NULL;
67
 
 
68
 
        /* Module's private data */
69
 
        module->mod_data = g_new0 (ModNameGroupData, 1);
70
 
        GROUP_DATA (module)->manager = G_OBJECT (table);
71
 
        GROUP_DATA (module)->manager_weak_refed = FALSE;
72
 
        GROUP_DATA (module)->obj_pixbuf = pixbuf_field;
73
 
        GROUP_DATA (module)->get_objects_list = module_onetable_get_objects_list;
74
 
        GROUP_DATA (module)->get_extended_name = module_onetable_get_extended_name;
75
 
        
76
 
        /* model settings */
77
 
        if (insert_header) {
78
 
                GdkPixbuf *pixbuf = NULL;
79
 
                GtkTreeModel *model = mgsel->priv->model;
80
 
 
81
 
                module->iter = g_new0 (GtkTreeIter, 1);
82
 
                gtk_tree_store_append (GTK_TREE_STORE (model), module->iter, iter);
83
 
                gtk_tree_store_set (GTK_TREE_STORE (model), module->iter, 
84
 
                                    NAME_COLUMN, mg_base_get_name (MG_BASE (table)), 
85
 
                                    PIXBUF_COLUMN, pixbuf, 
86
 
                                    CONTENTS_COLUMN, CONTENTS_TOP_CATEGORY, 
87
 
                                    SUB_MODULE_COLUMN, NULL, -1);
88
 
        }
89
 
        else {
90
 
                if (iter)
91
 
                        module->iter = gtk_tree_iter_copy (iter);
92
 
        }
93
 
 
94
 
        return module;  
95
 
}
96
 
 
97
 
static void module_onetable_constraint_any_cb (MgDatabase *db, MgDbConstraint *cstr, Module *module);
98
 
static void
99
 
module_onetable_fill_model (Module *module)
100
 
{
101
 
        GObject *manager, *db;
102
 
        GtkTreeModel *model;
103
 
 
104
 
        manager = GROUP_DATA (module)->manager;
105
 
 
106
 
        /* Initial model filling */
107
 
        model = module->selector->priv->model;
108
 
        name_group_init_model_fill (module, model);
109
 
 
110
 
        /* Signals handlers */
111
 
        g_signal_connect (manager, "field_added",
112
 
                          G_CALLBACK (name_group_obj_added_cb), module);
113
 
        g_signal_connect (manager, "field_removed",
114
 
                          G_CALLBACK (name_group_obj_removed_cb), module);
115
 
        g_signal_connect (manager, "field_updated",
116
 
                          G_CALLBACK (name_group_obj_updated_cb), module);
117
 
        /* REM: we don't need to take care of the "fields_order_changed" signal since the MgDbTable DOES NOT
118
 
         emit it. */
119
 
 
120
 
        /* signals from the Database object */
121
 
        db = (GObject *) mg_db_table_get_database (MG_DB_TABLE (manager));
122
 
        g_assert (db && IS_MG_DATABASE (db));
123
 
        g_signal_connect (db, "constraint_added",
124
 
                          G_CALLBACK (module_onetable_constraint_any_cb), module);
125
 
        g_signal_connect (db, "constraint_removed",
126
 
                          G_CALLBACK (module_onetable_constraint_any_cb), module);
127
 
        g_signal_connect (db, "constraint_updated",
128
 
                          G_CALLBACK (module_onetable_constraint_any_cb), module);
129
 
}
130
 
 
131
 
static void
132
 
module_onetable_constraint_any_cb (MgDatabase *db, MgDbConstraint *cstr, Module *module)
133
 
{
134
 
        if (mg_db_constraint_get_table (cstr) == (MgDbTable *) (GROUP_DATA (module)->manager)) {
135
 
                GSList *fields, *list;
136
 
 
137
 
                fields = mg_entity_get_all_fields (MG_ENTITY (GROUP_DATA (module)->manager));
138
 
                list = fields;
139
 
                while (list) {
140
 
                        if (mg_db_constraint_uses_field (cstr, MG_DB_FIELD (list->data)))
141
 
                                name_group_obj_updated_cb (GROUP_DATA (module)->manager, G_OBJECT (list->data),
142
 
                                                           module);
143
 
                        list = g_slist_next (list);
144
 
                }
145
 
                g_slist_free (fields);
146
 
        }
147
 
}
148
 
 
149
 
static GSList *
150
 
module_onetable_get_objects_list (Module *module)
151
 
{
152
 
        g_return_val_if_fail (GROUP_DATA (module)->manager, NULL);
153
 
        g_return_val_if_fail (IS_MG_DB_TABLE (GROUP_DATA (module)->manager), NULL);
154
 
 
155
 
        return mg_entity_get_all_fields (MG_ENTITY (GROUP_DATA (module)->manager));
156
 
}
157
 
 
158
 
static gchar *
159
 
module_onetable_get_extended_name (GObject *obj)
160
 
{
161
 
        g_return_val_if_fail (obj && IS_MG_DB_FIELD (obj), NULL);
162
 
 
163
 
        return g_strdup (mg_base_get_name (MG_BASE (obj)));
164
 
}
165
 
 
166
 
static void
167
 
module_onetable_free (Module *module)
168
 
{
169
 
        GObject *manager = GROUP_DATA (module)->manager;
170
 
        GObject *db;
171
 
 
172
 
        /* free this module */
173
 
        g_assert (manager);
174
 
        g_signal_handlers_disconnect_by_func (manager,
175
 
                                              G_CALLBACK (name_group_obj_added_cb), module);
176
 
        g_signal_handlers_disconnect_by_func (manager,
177
 
                                              G_CALLBACK (name_group_obj_removed_cb), module);
178
 
        g_signal_handlers_disconnect_by_func (manager,
179
 
                                              G_CALLBACK (name_group_obj_updated_cb), module);
180
 
        
181
 
        db = (GObject *) mg_db_table_get_database (MG_DB_TABLE (manager));
182
 
        g_assert (db && IS_MG_DATABASE (db));
183
 
        g_signal_handlers_disconnect_by_func (db, 
184
 
                                              G_CALLBACK (module_onetable_constraint_any_cb), module);
185
 
        g_signal_handlers_disconnect_by_func (db, 
186
 
                                              G_CALLBACK (module_onetable_constraint_any_cb), module);
187
 
        g_signal_handlers_disconnect_by_func (db,
188
 
                                              G_CALLBACK (module_onetable_constraint_any_cb), module);
189
 
 
190
 
        if (module->iter)
191
 
                gtk_tree_iter_free (module->iter);
192
 
        name_group_free_mod_data (module);
193
 
        g_free (module->mod_data);
194
 
        module->mod_data = NULL;
195
 
}
196
 
 
197
 
 
198
 
static const gchar *
199
 
module_onetable_col_name (Module *module, guint colno)
200
 
{
201
 
        switch (colno) {
202
 
        case 0:
203
 
                return _("Field");
204
 
                break;
205
 
        case EXTRA1_COLUMN:
206
 
                return _("Type");
207
 
                break;
208
 
        case EXTRA2_COLUMN:
209
 
                return _("Length");
210
 
                break;
211
 
        case EXTRA3_COLUMN:
212
 
                return _("Not NULL?");
213
 
                break;
214
 
        case EXTRA5_COLUMN:
215
 
                return _("Default value");
216
 
                break;
217
 
        default:
218
 
                return NULL;
219
 
                break;
220
 
        }
221
 
}
222
 
 
223
 
static void
224
 
module_onetable_model_store_data (Module *module, GtkTreeIter *iter)
225
 
{
226
 
        GObject *obj;
227
 
        GtkTreeModel *model;
228
 
 
229
 
        model = module->selector->priv->model;
230
 
        gtk_tree_model_get (model, iter, OBJ_COLUMN, &obj, -1);
231
 
 
232
 
        if (obj && IS_MG_DB_FIELD (obj)) {
233
 
                MgDbField *field;
234
 
                const gchar *str1;
235
 
                gchar *str2, *str3;
236
 
                gboolean bool;
237
 
                MgServerDataType *type;
238
 
                const GdaValue *value;
239
 
                gint length, scale;
240
 
                
241
 
                field = MG_DB_FIELD (obj);
242
 
 
243
 
                /* data type */
244
 
                type = mg_field_get_data_type (MG_FIELD (obj));
245
 
                if (type)
246
 
                        str1 = mg_server_data_type_get_sqlname (type);
247
 
                else
248
 
                        str1 = _("Unknown");
249
 
                        
250
 
                /* length */
251
 
                length = mg_db_field_get_length (field);
252
 
                scale = mg_db_field_get_scale (field);
253
 
                if (length != -1) {
254
 
                        if (scale != 0)
255
 
                                str2 = g_strdup_printf ("(%d, %d)", length, scale);
256
 
                        else
257
 
                                str2 = g_strdup_printf ("%d", length);
258
 
                }
259
 
                else
260
 
                        str2 = NULL;
261
 
                
262
 
                /* NOT NULL */
263
 
                bool = mg_db_field_is_null_allowed (field) ? FALSE : TRUE;
264
 
                
265
 
                /* Default value */
266
 
                value = mg_db_field_get_default_value (field);
267
 
                if (value)
268
 
                        str3 = gda_value_stringify (value);
269
 
                else
270
 
                        str3 = g_strdup ("");
271
 
 
272
 
                gtk_tree_store_set (GTK_TREE_STORE (model), iter, 
273
 
                                    EXTRA1_COLUMN, str1,
274
 
                                    EXTRA2_COLUMN, str2,
275
 
                                    EXTRA3_COLUMN, bool, 
276
 
                                    EXTRA4_COLUMN, TRUE, 
277
 
                                    EXTRA5_COLUMN, str3,
278
 
                                    -1);
279
 
                if (str2) g_free (str2);
280
 
                g_free (str3);
281
 
        }
282
 
}
283
 
 
284
 
 
285