aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2007-01-29 14:14:01 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2007-01-29 14:14:01 +0000
commit3e924d9defbdb1dbf8c9d52faa5b50331ee4b369 (patch)
treee01c16b3c5eba607ac9b15efd2a288791478bb70 /gtk
parentfdc2d404f2711f3ca6658bd14a4cb7cd41f4b98d (diff)
Finish (?) UAT's GUI
svn path=/trunk/; revision=20605
Diffstat (limited to 'gtk')
-rw-r--r--gtk/dlg_utils.c9
-rw-r--r--gtk/uat_gui.c316
-rw-r--r--gtk/uat_gui.h2
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