3
* Copyright (C) 2004 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
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"
33
* Modules for the fields of a given MgDbTable
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);
41
static GSList *module_onetable_get_objects_list (Module *module);
42
static gchar *module_onetable_get_extended_name (GObject *obj);
44
Module *sel_module_onetable_new (MgSelector *mgsel, gboolean insert_header,
45
GtkTreeIter *iter, gpointer data)
49
GdkPixbuf *pixbuf_field = NULL;
51
g_assert (data && IS_MG_DB_TABLE (data));
52
pixbuf_field = gnome_db_stock_get_icon_pixbuf_file ("gnome-db-field_16x16.png");
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;
65
module->parent_module = NULL;
66
module->sub_modules = NULL;
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;
78
GdkPixbuf *pixbuf = NULL;
79
GtkTreeModel *model = mgsel->priv->model;
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);
91
module->iter = gtk_tree_iter_copy (iter);
97
static void module_onetable_constraint_any_cb (MgDatabase *db, MgDbConstraint *cstr, Module *module);
99
module_onetable_fill_model (Module *module)
101
GObject *manager, *db;
104
manager = GROUP_DATA (module)->manager;
106
/* Initial model filling */
107
model = module->selector->priv->model;
108
name_group_init_model_fill (module, model);
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
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);
132
module_onetable_constraint_any_cb (MgDatabase *db, MgDbConstraint *cstr, Module *module)
134
if (mg_db_constraint_get_table (cstr) == (MgDbTable *) (GROUP_DATA (module)->manager)) {
135
GSList *fields, *list;
137
fields = mg_entity_get_all_fields (MG_ENTITY (GROUP_DATA (module)->manager));
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),
143
list = g_slist_next (list);
145
g_slist_free (fields);
150
module_onetable_get_objects_list (Module *module)
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);
155
return mg_entity_get_all_fields (MG_ENTITY (GROUP_DATA (module)->manager));
159
module_onetable_get_extended_name (GObject *obj)
161
g_return_val_if_fail (obj && IS_MG_DB_FIELD (obj), NULL);
163
return g_strdup (mg_base_get_name (MG_BASE (obj)));
167
module_onetable_free (Module *module)
169
GObject *manager = GROUP_DATA (module)->manager;
172
/* free this module */
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);
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);
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;
199
module_onetable_col_name (Module *module, guint colno)
212
return _("Not NULL?");
215
return _("Default value");
224
module_onetable_model_store_data (Module *module, GtkTreeIter *iter)
229
model = module->selector->priv->model;
230
gtk_tree_model_get (model, iter, OBJ_COLUMN, &obj, -1);
232
if (obj && IS_MG_DB_FIELD (obj)) {
237
MgServerDataType *type;
238
const GdaValue *value;
241
field = MG_DB_FIELD (obj);
244
type = mg_field_get_data_type (MG_FIELD (obj));
246
str1 = mg_server_data_type_get_sqlname (type);
251
length = mg_db_field_get_length (field);
252
scale = mg_db_field_get_scale (field);
255
str2 = g_strdup_printf ("(%d, %d)", length, scale);
257
str2 = g_strdup_printf ("%d", length);
263
bool = mg_db_field_is_null_allowed (field) ? FALSE : TRUE;
266
value = mg_db_field_get_default_value (field);
268
str3 = gda_value_stringify (value);
270
str3 = g_strdup ("");
272
gtk_tree_store_set (GTK_TREE_STORE (model), iter,
279
if (str2) g_free (str2);