diff --git a/src/gmdb2/gladefiles/Makefile.am b/src/gmdb2/gladefiles/Makefile.am index de4dc27..ed9e977 100644 --- a/src/gmdb2/gladefiles/Makefile.am +++ b/src/gmdb2/gladefiles/Makefile.am @@ -7,7 +7,8 @@ glade_DATA = \ gmdb-export.glade \ gmdb-schema.glade \ gmdb-prefs.glade \ - gmdb-props.glade + gmdb-props.glade \ + gmdb-tabledef.glade EXTRA_DIST = $(glade_DATA) diff --git a/src/gmdb2/gladefiles/gmdb-tabledef.glade b/src/gmdb2/gladefiles/gmdb-tabledef.glade new file mode 100644 index 0000000..0c86165 --- /dev/null +++ b/src/gmdb2/gladefiles/gmdb-tabledef.glade @@ -0,0 +1,86 @@ + + + + + + + + True + vertical + + + True + True + automatic + automatic + + + True + True + both + + + + + 0 + + + + + True + 2 + 2 + + + True + <b>Size</b> + True + + + + + True + True + False + + + + 1 + 2 + + + + + True + True + False + + + + 1 + 2 + 1 + 2 + + + + + True + <b>Allow nulls</b> + True + + + 1 + 2 + + + + + False + 1 + + + + + + diff --git a/src/gmdb2/gmdb.h b/src/gmdb2/gmdb.h index fd2d0af..cf3c316 100644 --- a/src/gmdb2/gmdb.h +++ b/src/gmdb2/gmdb.h @@ -25,12 +25,13 @@ void gmdb_about_cb(GtkWidget *w, gpointer data); void gmdb_load_recent_files(void); GtkWidget *gmdb_table_data_new(MdbCatalogEntry *entry); -GtkWidget *gmdb_table_def_new(MdbCatalogEntry *entry); GtkWidget *gmdb_table_export_new(MdbCatalogEntry *entry); void gmdb_table_export(MdbCatalogEntry *entry) ; - void gmdb_table_export_populate_dialog(GladeXML *xml); +/* table_def.c */ +void gmdb_table_def_new(MdbCatalogEntry *entry); + /* file.c */ void gmdb_file_select_cb(GtkWidget *w, gpointer data); void gmdb_file_close_cb(GtkWidget *w, gpointer data); diff --git a/src/gmdb2/table_def.c b/src/gmdb2/table_def.c index b0c320a..6b4619a 100644 --- a/src/gmdb2/table_def.c +++ b/src/gmdb2/table_def.c @@ -1,5 +1,5 @@ /* MDB Tools - A library for reading MS Access database file - * Copyright (C) 2000 Brian Bruns + * Copyright (C) 2000-2012 Brian Bruns and others * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,8 +17,14 @@ */ #include "gmdb.h" -extern GtkWidget *app; -extern MdbHandle *mdb; +#define COL_PK 0 +#define COL_NAME 1 +#define COL_TYPE 2 +#define COL_DESCRIPTION 3 +#define COL_LEN 4 +#define COL_NULL 5 + +static void update_bottom_properties(GtkTreeView *treeview, GladeXML *xml); typedef struct GMdbDefWindow { gchar table_name[MDB_MAX_OBJ_NAME]; @@ -36,110 +42,175 @@ gmdb_table_def_close(GtkList *list, GtkWidget *w, GMdbDefWindow *defw) return FALSE; } -GtkWidget * +static gint +gmdb_table_def_cursorchanged(GtkTreeView *treeview, GladeXML *xml) +{ + update_bottom_properties(treeview, xml); + return FALSE; +} + +void gmdb_table_def_new(MdbCatalogEntry *entry) { -MdbTableDef *table; -MdbIndex *idx; -MdbColumn *col; -GtkWidget *clist; -GtkWidget *scroll; -GdkPixmap *pixmap; -GdkBitmap *mask; -int i,j; -gchar *titles[] = { "", "Column", "Name", "Type", "Size", "Allow Nulls", "Description" }; -gchar *row[sizeof(titles)/sizeof(titles[0])]; +/* FIXME: many reference should be freed */ +GladeXML *xml; +GtkWindow *win; +GtkTreeView *treeview; +GtkListStore *store; +GtkTreeModel *model; +GtkTreeIter iter; +GtkTreeSelection *selection; +int i, j; GMdbDefWindow *defw; -GtkStyle *style; +MdbTableDef *table; +MdbColumn *col; +const char *propval; +MdbIndex *idx; +GdkPixbuf *pixbuf; /* do we have an active window for this object? if so raise it */ for (i=0;itable_name, entry->object_name) && entry->object_type == MDB_TABLE) { gdk_window_raise (defw->window->window); - return defw->window; + return; } } - defw = g_malloc(sizeof(GMdbDefWindow)); - strcpy(defw->table_name, entry->object_name); + /* load the interface */ + xml = glade_xml_new(GMDB_GLADEDIR "gmdb-tabledef.glade", NULL, NULL); + glade_xml_signal_autoconnect(xml); + win = GTK_WINDOW(glade_xml_get_widget(xml, "window1")); - defw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(GTK_WINDOW(defw->window), entry->object_name); - gtk_widget_set_usize(defw->window, 300,200); - gtk_widget_show(defw->window); + gtk_window_set_title(win, entry->object_name); + gtk_window_set_default_size(win, 600, 400); + + /* icon to be used as primary key member indicator */ + pixbuf = gdk_pixbuf_new_from_file(GMDB_ICONDIR "pk.xpm", NULL); - gtk_signal_connect (GTK_OBJECT (defw->window), "delete_event", - GTK_SIGNAL_FUNC (gmdb_table_def_close), defw); - - scroll = gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_widget_show (scroll); - gtk_container_add(GTK_CONTAINER(defw->window), scroll); + store = gtk_list_store_new(6, + GDK_TYPE_PIXBUF, /* part of primary key */ + G_TYPE_STRING, /* column name */ + G_TYPE_STRING, /* type */ + G_TYPE_STRING, /* description */ + G_TYPE_INT, /* length */ + G_TYPE_BOOLEAN /* allow null */ + ); /* read table */ table = mdb_read_table(entry); mdb_read_columns(table); mdb_rewind_table(table); - clist = gtk_clist_new_with_titles(sizeof(titles)/sizeof(titles[0]), titles); - gtk_clist_set_column_width (GTK_CLIST(clist), 0, 20); - gtk_clist_set_column_width (GTK_CLIST(clist), 1, 35); - gtk_clist_set_column_width (GTK_CLIST(clist), 2, 80); - gtk_clist_set_column_width (GTK_CLIST(clist), 3, 60); - gtk_clist_set_column_width (GTK_CLIST(clist), 4, 30); - gtk_clist_set_column_width (GTK_CLIST(clist), 5, 30); - gtk_clist_set_column_width (GTK_CLIST(clist), 6, 60); - gtk_widget_show(clist); - gtk_container_add(GTK_CONTAINER(scroll),clist); - for (i=0;inum_cols;i++) { - /* display column titles */ - const char *propval; + gtk_list_store_append (store, &iter); col=g_ptr_array_index(table->columns,i); - row[0] = (char *) g_malloc0(MDB_BIND_SIZE); - row[1] = (char *) g_malloc0(MDB_BIND_SIZE); - row[2] = (char *) g_malloc0(MDB_BIND_SIZE); - row[3] = (char *) g_malloc0(MDB_BIND_SIZE); - row[4] = (char *) g_malloc0(MDB_BIND_SIZE); - row[5] = (char *) g_malloc0(MDB_BIND_SIZE); - row[6] = (char *) g_malloc0(MDB_BIND_SIZE); - strcpy(row[0],""); - sprintf(row[1],"%d", col->col_num+1); - strcpy(row[2],col->name); - strcpy(row[3], mdb_get_colbacktype_string(col)); - sprintf(row[4],"%d",col->col_size); - strcpy(row[5], col->is_fixed ? "No" : "Yes"); propval = mdb_col_get_prop(col, "Description"); - strcpy(row[6], propval ? propval : ""); - gtk_clist_append(GTK_CLIST(clist), row); + gtk_list_store_set (store, &iter, + //0, pixbuf, + COL_NAME, col->name, + COL_TYPE, mdb_get_colbacktype_string(col), + COL_DESCRIPTION, propval ? propval : "", + COL_LEN, col->col_size, + COL_NULL, col->is_fixed ? 0 : 1, + -1); } - style = gtk_widget_get_style(clist); - pixmap = gdk_pixmap_create_from_xpm(clist->window, - &mask, - &style->bg[GTK_STATE_NORMAL], - GMDB_ICONDIR "pk.xpm"); + model = GTK_TREE_MODEL(store); mdb_read_indices(table); for (i=0;inum_idxs;i++) { idx = g_ptr_array_index (table->indices, i); - if (idx->index_type==1) { + if (idx->index_type==1) for (j=0;jnum_keys;j++) { - if (pixmap) gtk_clist_set_pixmap(GTK_CLIST(clist), idx->key_col_num[j]-1,0, pixmap, mask); - } - // } else { - //for (j=0;jnum_keys;j++) { - //sprintf(tmpstr,"%s:%d",idx->name,j); - //gtk_clist_set_text(GTK_CLIST(clist), idx->key_col_num[j]-1,0, tmpstr); - //} - } - } /* for */ + gtk_tree_model_iter_nth_child(model, &iter, NULL, idx->key_col_num[j]-1); + gtk_list_store_set (store, &iter, + COL_PK, pixbuf, + -1); + } + } - gtk_clist_columns_autosize(GTK_CLIST(clist)); - /* add this one to the window list */ + treeview = GTK_TREE_VIEW(glade_xml_get_widget(xml, "columns_treeview")); + gtk_tree_view_insert_column_with_attributes (treeview, + -1, + "PK", gtk_cell_renderer_pixbuf_new(), + "pixbuf", COL_PK, + NULL); + gtk_tree_view_insert_column_with_attributes (treeview, + -1, + "Name", gtk_cell_renderer_text_new(), + "text", COL_NAME, + NULL); + gtk_tree_view_insert_column_with_attributes (treeview, + -1, + "Type", gtk_cell_renderer_text_new(), + "text", COL_TYPE, + NULL); + gtk_tree_view_insert_column_with_attributes (treeview, + -1, + "Description", gtk_cell_renderer_text_new(), + "text", COL_DESCRIPTION, + NULL); + + gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), model); + + /* The tree view has acquired its own reference to the + * model, so we can drop ours. That way the model will + * be freed automatically when the tree view is destroyed */ + g_object_unref (model); + + /* select first item */ + gtk_tree_model_iter_nth_child(model, &iter, NULL, 0); + selection = gtk_tree_view_get_selection(treeview); + gtk_tree_selection_select_iter(selection, &iter); + update_bottom_properties(treeview, xml); + + gtk_widget_show(GTK_WIDGET(win)); + + defw = g_malloc(sizeof(GMdbDefWindow)); + strcpy(defw->table_name, entry->object_name); + defw->window = GTK_WIDGET(win); window_list = g_list_append(window_list, defw); - return defw->window; + gtk_signal_connect (GTK_OBJECT (treeview), "cursor-changed", + GTK_SIGNAL_FUNC (gmdb_table_def_cursorchanged), xml); + gtk_signal_connect (GTK_OBJECT (defw->window), "delete_event", + GTK_SIGNAL_FUNC (gmdb_table_def_close), defw); +} + +/* That function is called when selection is changed + * It updates the window bottom information + */ +static void +update_bottom_properties_selected(GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + GladeXML *xml) +{ +gint size; +gboolean allownulls; +GtkEntry *entry; +char tmp[20]; + + gtk_tree_model_get(model, iter, + COL_LEN, &size, + COL_NULL, &allownulls, + -1); + + entry = GTK_ENTRY(glade_xml_get_widget(xml, "size_entry")); + sprintf(tmp, "%d", size); + gtk_entry_set_text(entry, tmp); + + entry = GTK_ENTRY(glade_xml_get_widget(xml, "allownulls_entry")); + gtk_entry_set_text(entry, allownulls ? "Yes" : "No"); +} + +static void +update_bottom_properties(GtkTreeView *treeview, GladeXML *xml) { +GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection(treeview); + gtk_tree_selection_selected_foreach(selection, + (GtkTreeSelectionForeachFunc)update_bottom_properties_selected, + xml); }