diff options
author | Luis Ontanon <luis.ontanon@gmail.com> | 2007-01-29 14:14:01 +0000 |
---|---|---|
committer | Luis Ontanon <luis.ontanon@gmail.com> | 2007-01-29 14:14:01 +0000 |
commit | 3e924d9defbdb1dbf8c9d52faa5b50331ee4b369 (patch) | |
tree | e01c16b3c5eba607ac9b15efd2a288791478bb70 | |
parent | fdc2d404f2711f3ca6658bd14a4cb7cd41f4b98d (diff) |
Finish (?) UAT's GUI
svn path=/trunk/; revision=20605
-rw-r--r-- | gtk/dlg_utils.c | 9 | ||||
-rw-r--r-- | gtk/uat_gui.c | 316 | ||||
-rw-r--r-- | gtk/uat_gui.h | 2 |
3 files changed, 303 insertions, 24 deletions
diff --git a/gtk/dlg_utils.c b/gtk/dlg_utils.c index 2107ac8058..bb6d137fde 100644 --- a/gtk/dlg_utils.c +++ b/gtk/dlg_utils.c @@ -124,6 +124,7 @@ dlg_button_row_new(const gchar *stock_id_first, ...) const gchar *yes = NULL; const gchar *no = NULL; const gchar *filter_stream= NULL; + const gchar *delete = NULL; va_start(stock_id_list, stock_id_first); @@ -168,6 +169,8 @@ dlg_button_row_new(const gchar *stock_id_first, ...) no = stock_id; } else if (strcmp(stock_id, WIRESHARK_STOCK_FILTER_OUT_STREAM) == 0) { filter_stream = stock_id; + } else if (strcmp(stock_id, GTK_STOCK_DELETE) == 0) { + delete = stock_id; } else { /* we don't know that button! */ g_assert_not_reached(); @@ -271,6 +274,11 @@ dlg_button_row_new(const gchar *stock_id_first, ...) dlg_button_new(hbox, button_hbox, cap_stop); return hbox; } + if (delete && cancel) { + dlg_button_new(hbox, button_hbox, cancel); + dlg_button_new(hbox, button_hbox, delete); + return hbox; + } } if (buttons == 3) { if (ok && save && close) { @@ -324,6 +332,7 @@ dlg_button_row_new(const gchar *stock_id_first, ...) /* beware: sequence of buttons is important! */ if (ok != NULL) dlg_button_new(hbox, button_hbox, ok); + if (delete != NULL) dlg_button_new(hbox, button_hbox, delete); if (jump != NULL) dlg_button_new(hbox, button_hbox, jump); if (find != NULL) dlg_button_new(hbox, button_hbox, find); if (print != NULL) dlg_button_new(hbox, button_hbox, print); diff --git a/gtk/uat_gui.c b/gtk/uat_gui.c index 61b7c37b27..a273726132 100644 --- a/gtk/uat_gui.c +++ b/gtk/uat_gui.c @@ -26,7 +26,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -37,6 +36,8 @@ #include <math.h> #include <gtk/gtk.h> #include <epan/dfilter/dfilter-macro.h> +#include <epan/emem.h> +#include <epan/report_err.h> #include "dlg_utils.h" #include "gui_utils.h" #include "compat_macros.h" @@ -73,20 +74,308 @@ struct _uat_rep_t { }; +struct _str_pair { + const char* ptr; + unsigned len; +}; + +struct _uat_dlg_data { + GtkWidget* win; + GPtrArray* entries; + uat_t* uat; + void* rec; + gboolean is_new; + gint row; +}; + +static void append_row(uat_t* uat, guint idx) { + GPtrArray* a = g_ptr_array_new(); + void* rec = UAT_INDEX_PTR(uat,idx); + uat_fld_t* f; + guint rownum; + + gtk_clist_freeze(GTK_CLIST(uat->rep->clist)); + + for ( f = uat->fields; f ; f = f->next ) { + guint len; + char* ptr; + f->tostr_cb(rec,&ptr,&len); + g_ptr_array_add(a,ptr); + } + + rownum = gtk_clist_append(GTK_CLIST(uat->rep->clist), (gchar**)a->pdata); + gtk_clist_set_row_data(GTK_CLIST(uat->rep->clist), rownum, rec); + + gtk_clist_thaw(GTK_CLIST(uat->rep->clist)); + + g_ptr_array_free(a,TRUE); +} + +static void reset_row(uat_t* uat, guint idx) { + void* rec = UAT_INDEX_PTR(uat,idx); + uat_fld_t* f; + + gtk_clist_freeze(GTK_CLIST(uat->rep->clist)); + + for ( f = uat->fields; f ; f = f->next ) { + guint len; + char* ptr; + f->tostr_cb(rec,&ptr,&len); + gtk_clist_set_text(GTK_CLIST(uat->rep->clist), idx, f->colnum, ptr); + } + + gtk_clist_thaw(GTK_CLIST(uat->rep->clist)); + +} + + +static gboolean uat_dlg_cb(GtkWidget *win _U_, gpointer user_data) { + struct _uat_dlg_data* dd = user_data; + uat_fld_t* fld; + char* err = NULL; + guint i; + + for (fld = dd->uat->fields, i = 0; fld ; fld = fld->next, i++) { + GtkWidget* entry = g_ptr_array_index(dd->entries,i); + const gchar* text = gtk_entry_get_text(GTK_ENTRY(entry)); + unsigned len = strlen(text); + + if (fld->chk_cb) { + if (! fld->chk_cb(dd->rec,text,len,&err)) { + err = ep_strdup_printf("error in field '%s': %s",fld->name,err); + goto on_failure; + } + } + + fld->set_cb(dd->rec,text,len); + } + + if (dd->uat->update_cb) { + dd->uat->update_cb(dd->rec,&err); + + if (err) { + err = ep_strdup_printf("error updating record: %s",err); + goto on_failure; + } + + if (dd->is_new) { + uat_add_record(dd->uat, dd->rec); + + if (dd->uat->free_cb) { + dd->uat->free_cb(dd->rec); + } + } + } + + uat_save(dd->uat,&err); + + if (err) { + err = ep_strdup_printf("error saving '%s': %s",dd->uat->filename,err); + goto on_failure; + } + + if (dd->is_new) { + append_row(dd->uat, (*dd->uat->nrows_p) - 1 ); + } else { + reset_row(dd->uat,dd->row); + } + + if (dd->is_new) g_free(dd->rec); + g_ptr_array_free(dd->entries,TRUE); + window_destroy(GTK_WIDGET(dd->win)); + + gtk_window_present(GTK_WINDOW(dd->uat->rep->window)); + + return TRUE; +on_failure: + + report_failure("%s",err); + return FALSE; +} + +static gboolean uat_cancel_dlg_cb(GtkWidget *win _U_, gpointer user_data) { + struct _uat_dlg_data* dd = user_data; + + gtk_window_present(GTK_WINDOW(dd->uat->rep->window)); + + if (dd->is_new) g_free(dd->rec); + g_ptr_array_free(dd->entries,TRUE); + window_destroy(GTK_WIDGET(dd->win)); + + + return TRUE; +} + +static void uat_dialog(uat_t* uat, gint row) { + GtkWidget *win, *main_tb, *main_vb, *bbox, *bt_cancel, *bt_ok; + struct _uat_dlg_data* dd = g_malloc(sizeof(struct _uat_dlg_data)); + uat_fld_t* fld; + int i = 0; + + dd->entries = g_ptr_array_new(); + dd->win = dlg_window_new(uat->name); + dd->uat = uat; + dd->rec = row < 0 ? g_malloc0(uat->record_size) : UAT_INDEX_PTR(uat,row); + dd->is_new = row < 0 ? TRUE : FALSE; + dd->row = row; + + win = dd->win; + +#if GTK_MAJOR_VERSION >= 2 + gtk_window_resize(GTK_WINDOW(win),400,15*(uat->ncols+6)); +#else + gtk_window_set_default_size(GTK_WINDOW(win), 400, 15*(uat->ncols+6)); + gtk_widget_set_usize(win, 400, 15*(uat->ncols+6)); +#endif + + main_vb = gtk_vbox_new(TRUE,5); + gtk_container_add(GTK_CONTAINER(win), main_vb); + gtk_container_border_width(GTK_CONTAINER(main_vb), 6); + + main_tb = gtk_table_new(uat->ncols+1, 2, FALSE); + gtk_box_pack_start(GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0); + gtk_table_set_row_spacings(GTK_TABLE(main_tb), 10); + gtk_table_set_col_spacings(GTK_TABLE(main_tb), 15); + + for (fld = uat->fields; fld ; fld = fld->next) { + GtkWidget *entry, *label; + + label = gtk_label_new(fld->name); + gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(main_tb), label, 0, 1, i+1, i + 2); + gtk_widget_show(label); + + entry = gtk_entry_new(); + g_ptr_array_add(dd->entries,entry); + gtk_table_attach_defaults(GTK_TABLE(main_tb), entry, 1, 2, i+1, i + 2); + gtk_widget_show(entry); + + if (! dd->is_new) { + gchar* text; + unsigned len; + + fld->tostr_cb(dd->rec,&text,&len); + + gtk_entry_set_text(GTK_ENTRY(entry),text); + } + i++; + } + + bbox = dlg_button_row_new(GTK_STOCK_CANCEL,GTK_STOCK_OK, NULL); + gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0); + + bt_ok = OBJECT_GET_DATA(bbox, GTK_STOCK_OK); + SIGNAL_CONNECT(bt_ok, "clicked", uat_dlg_cb, dd); + gtk_widget_grab_default(bt_ok); + + bt_cancel = OBJECT_GET_DATA(bbox, GTK_STOCK_CANCEL); + SIGNAL_CONNECT(bt_cancel, "clicked", uat_cancel_dlg_cb, dd); + gtk_widget_grab_default(bt_cancel); + + gtk_widget_show(main_tb); + gtk_widget_show(main_vb); + gtk_widget_show(win); +} + +struct _uat_del { + GtkWidget *win; + uat_t* uat; + gint idx; +}; + +static void uat_del_cb(GtkButton *button _U_, gpointer u) { + struct _uat_del* ud = u; + uat_remove_record_idx(ud->uat, ud->idx); + gtk_clist_remove(GTK_CLIST(ud->uat->rep->clist),ud->idx); + window_destroy(GTK_WIDGET(ud->win)); + gtk_window_present(GTK_WINDOW(ud->uat->rep->window)); + g_free(ud); +} + +static void uat_cancel_del_cb(GtkButton *button _U_, gpointer u) { + struct _uat_del* ud = u; + window_destroy(GTK_WIDGET(ud->win)); + gtk_window_present(GTK_WINDOW(ud->uat->rep->window)); + g_free(ud); +} + +static void uat_del_dlg(uat_t* uat, int idx) { + GtkWidget *win, *main_tb, *main_vb, *bbox, *bt_cancel, *bt_ok; + uat_fld_t* fld; + int i = 0; + void* rec = UAT_INDEX_PTR(uat,idx); + struct _uat_del* ud = g_malloc(sizeof(struct _uat_del)); + + ud->uat = uat; + ud->idx = idx; + ud->win = win = dlg_window_new(ep_strdup_printf("Confirm Delete")); + +#if GTK_MAJOR_VERSION >= 2 + gtk_window_resize(GTK_WINDOW(win),400,15*(uat->ncols+6)); +#else + gtk_window_set_default_size(GTK_WINDOW(win), 400, 15*(uat->ncols+6)); + gtk_widget_set_usize(win, 400, 15*(uat->ncols+6)); +#endif + + main_vb = gtk_vbox_new(TRUE,5); + gtk_container_add(GTK_CONTAINER(win), main_vb); + gtk_container_border_width(GTK_CONTAINER(main_vb), 6); + + main_tb = gtk_table_new(uat->ncols+1, 2, FALSE); + gtk_box_pack_start(GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0); + gtk_table_set_row_spacings(GTK_TABLE(main_tb), 10); + gtk_table_set_col_spacings(GTK_TABLE(main_tb), 15); + + for (fld = uat->fields; fld ; fld = fld->next) { + GtkWidget *label; + gchar* text; + unsigned len; + + fld->tostr_cb(rec,&text,&len); + + + label = gtk_label_new(fld->name); + gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(main_tb), label, 0, 1, i+1, i + 2); + gtk_widget_show(label); + + label = gtk_label_new(text); + gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); + gtk_table_attach_defaults(GTK_TABLE(main_tb), label, 1, 2, i+1, i + 2); + gtk_widget_show(label); + + i++; + } + + bbox = dlg_button_row_new(GTK_STOCK_CANCEL,GTK_STOCK_DELETE, NULL); + gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0); + + bt_ok = OBJECT_GET_DATA(bbox,GTK_STOCK_DELETE); + SIGNAL_CONNECT(bt_ok, "clicked", uat_del_cb, ud); + gtk_widget_grab_default(bt_ok); + + bt_cancel = OBJECT_GET_DATA(bbox, GTK_STOCK_CANCEL); + SIGNAL_CONNECT(bt_cancel, "clicked", uat_cancel_del_cb, ud); + gtk_widget_grab_default(bt_cancel); + + gtk_widget_show(main_tb); + gtk_widget_show(main_vb); + gtk_widget_show(win); +} static void uat_new_cb(GtkButton *button _U_, gpointer u) { uat_t* uat = u; - printf("New...\n"); + uat_dialog(uat, -1); } static void uat_edit_cb(GtkButton *button _U_, gpointer u) { uat_t* uat = u; - printf("Edit %d...\n",uat->rep->selected); + uat_dialog(uat, uat->rep->selected); } static void uat_delete_cb(GtkButton *button _U_, gpointer u) { uat_t* uat = u; - printf("Delete %d...\n",uat->rep->selected); + uat_del_dlg(uat,uat->rep->selected); } static void remember_selected_row(GtkCList *clist _U_, gint row, gint column _U_, GdkEvent *event _U_, gpointer u) { @@ -111,28 +400,9 @@ static void unremember_selected_row(GtkCList *clist _U_, gint row _U_, gint colu static void free_rep(GtkWindow *win _U_, uat_t* uat) { uat_rep_t* rep = uat->rep; uat->rep = NULL; - printf("rep=%p",rep); if (rep) g_free(rep); } -static void append_row(uat_t* uat, guint idx) { - GPtrArray* a = g_ptr_array_new(); - void* rec = UAT_INDEX_PTR(uat,idx); - uat_fld_t* f; - guint rownum; - - for ( f = uat->fields; f ; f = f->next ) { - guint len; - char* ptr; - f->tostr_cb(rec,&ptr,&len); - g_ptr_array_add(a,ptr); - } - - rownum = gtk_clist_append(GTK_CLIST(uat->rep->clist), (gchar**)a->pdata); - gtk_clist_set_row_data(GTK_CLIST(uat->rep->clist), rownum, rec); - - g_ptr_array_free(a,TRUE); -} GtkWidget* uat_window(uat_t* uat) { uat_rep_t* rep; diff --git a/gtk/uat_gui.h b/gtk/uat_gui.h index b15058adac..13f934a579 100644 --- a/gtk/uat_gui.h +++ b/gtk/uat_gui.h @@ -33,4 +33,4 @@ GtkWidget* uat_window(uat_t*); -#endif
\ No newline at end of file +#endif |