GtkList to GtkTreeView conversion.

svn path=/trunk/; revision=6217
This commit is contained in:
Olivier Abad 2002-09-07 10:48:07 +00:00
parent d3202fcc7d
commit 1cfc7d562c
2 changed files with 807 additions and 776 deletions

View File

@ -6,7 +6,7 @@ GtkList and GtkCList ==> GtkTreeView conversion :
- column_prefs.c - column_prefs.c
- decode_as_dlg.c : done - decode_as_dlg.c : done
- dfilter_expr_dialog.c - dfilter_expr_dialog.c
- filter_prefs.c - filter_prefs.c : done
- main.c - main.c
- plugins_dlg.c : done - plugins_dlg.c : done

View File

@ -3,7 +3,7 @@
* (This used to be a notebook page under "Preferences", hence the * (This used to be a notebook page under "Preferences", hence the
* "prefs" in the file name.) * "prefs" in the file name.)
* *
* $Id: filter_prefs.c,v 1.1 2002/08/31 09:55:21 oabad Exp $ * $Id: filter_prefs.c,v 1.2 2002/09/07 10:48:07 oabad Exp $
* *
* Ethereal - Network traffic analyzer * Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com> * By Gerald Combs <gerald@ethereal.com>
@ -62,7 +62,8 @@ typedef struct _filter_cb_data {
} filter_cb_data; } filter_cb_data;
static GtkWidget *filter_dialog_new(GtkWidget *caller, GtkWidget *filter_te, static GtkWidget *filter_dialog_new(GtkWidget *caller, GtkWidget *filter_te,
filter_list_type_t list, construct_args_t *construct_args); filter_list_type_t list,
construct_args_t *construct_args);
static void filter_dlg_dclick(GtkWidget *dummy, gpointer main_w_arg, static void filter_dlg_dclick(GtkWidget *dummy, gpointer main_w_arg,
gpointer activate); gpointer activate);
static void filter_dlg_ok_cb(GtkWidget *ok_bt, gpointer dummy); static void filter_dlg_ok_cb(GtkWidget *ok_bt, gpointer dummy);
@ -74,7 +75,7 @@ static void filter_dlg_destroy(GtkWidget *win, gpointer data);
static gint filter_sel_list_button_cb(GtkWidget *, GdkEventButton *, static gint filter_sel_list_button_cb(GtkWidget *, GdkEventButton *,
gpointer); gpointer);
static void filter_sel_list_cb(GtkWidget *, gpointer); static void filter_sel_list_cb(GtkTreeSelection *, gpointer);
static void filter_list_destroy_cb(GtkWidget *, gpointer); static void filter_list_destroy_cb(GtkWidget *, gpointer);
static void filter_new_bt_clicked_cb(GtkWidget *, gpointer); static void filter_new_bt_clicked_cb(GtkWidget *, gpointer);
static void filter_chg_bt_clicked_cb(GtkWidget *, gpointer); static void filter_chg_bt_clicked_cb(GtkWidget *, gpointer);
@ -327,8 +328,6 @@ filter_dialog_new(GtkWidget *caller _U_, GtkWidget *parent_filter_te,
*del_bt, *del_bt,
*filter_sc, *filter_sc,
*filter_l, *filter_l,
*nl_item,
*nl_lb,
*middle_hb, *middle_hb,
*name_lb, *name_lb,
*name_te, *name_te,
@ -336,7 +335,7 @@ filter_dialog_new(GtkWidget *caller _U_, GtkWidget *parent_filter_te,
*filter_lb, *filter_lb,
*filter_te, *filter_te,
*add_expression_bt; *add_expression_bt;
GtkWidget *l_select = NULL; gboolean l_select = FALSE;
GList *fl_entry; GList *fl_entry;
filter_def *filt; filter_def *filt;
const gchar *filter_te_str = NULL; const gchar *filter_te_str = NULL;
@ -344,6 +343,11 @@ filter_dialog_new(GtkWidget *caller _U_, GtkWidget *parent_filter_te,
static filter_list_type_t cfilter_list = CFILTER_LIST; static filter_list_type_t cfilter_list = CFILTER_LIST;
static filter_list_type_t dfilter_list = DFILTER_LIST; static filter_list_type_t dfilter_list = DFILTER_LIST;
filter_list_type_t *filter_list_p; filter_list_type_t *filter_list_p;
GtkListStore *store;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
GtkTreeSelection *sel;
GtkTreeIter iter;
/* Get a pointer to a static variable holding the type of filter on /* Get a pointer to a static variable holding the type of filter on
which we're working, so we can pass that pointer to callback which we're working, so we can pass that pointer to callback
@ -453,18 +457,30 @@ filter_dialog_new(GtkWidget *caller _U_, GtkWidget *parent_filter_te,
gtk_container_add(GTK_CONTAINER(top_hb), filter_sc); gtk_container_add(GTK_CONTAINER(top_hb), filter_sc);
gtk_widget_show(filter_sc); gtk_widget_show(filter_sc);
filter_l = gtk_list_new(); store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
gtk_list_set_selection_mode(GTK_LIST(filter_l), GTK_SELECTION_SINGLE); filter_l = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
g_signal_connect(G_OBJECT(filter_l), "selection_changed", gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(filter_l), TRUE);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(filter_l), FALSE);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("", renderer, "text",
0, NULL);
gtk_tree_view_column_set_sort_column_id(column, 0);
gtk_tree_view_append_column(GTK_TREE_VIEW(filter_l), column);
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
g_signal_connect(G_OBJECT(sel), "changed",
G_CALLBACK(filter_sel_list_cb), filter_pg); G_CALLBACK(filter_sel_list_cb), filter_pg);
gtk_object_set_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY, filter_l); gtk_object_set_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY, filter_l);
g_signal_connect(G_OBJECT(filter_l), "destroy", g_signal_connect(G_OBJECT(filter_l), "destroy",
G_CALLBACK(filter_list_destroy_cb), NULL); G_CALLBACK(filter_list_destroy_cb), NULL);
g_signal_connect(G_OBJECT(filter_l), "button_press_event",
G_CALLBACK(filter_sel_list_button_cb), NULL);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(filter_sc), gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(filter_sc),
filter_l); filter_l);
gtk_widget_show(filter_l); gtk_widget_show(filter_l);
gtk_object_set_data(GTK_OBJECT(filter_l), E_FILT_DBLFUNC_KEY, filter_dlg_dclick); gtk_object_set_data(GTK_OBJECT(filter_l), E_FILT_DBLFUNC_KEY,
filter_dlg_dclick);
gtk_object_set_data(GTK_OBJECT(filter_l), E_FILT_DBLARG_KEY, main_w); gtk_object_set_data(GTK_OBJECT(filter_l), E_FILT_DBLARG_KEY, main_w);
/* This is a Boolean, but we make it a non-null pointer for TRUE /* This is a Boolean, but we make it a non-null pointer for TRUE
and a null pointer for FALSE, as object data is a pointer. */ and a null pointer for FALSE, as object data is a pointer. */
@ -474,29 +490,20 @@ filter_dialog_new(GtkWidget *caller _U_, GtkWidget *parent_filter_te,
fl_entry = get_filter_list_first(list); fl_entry = get_filter_list_first(list);
while (fl_entry != NULL) { while (fl_entry != NULL) {
filt = (filter_def *) fl_entry->data; filt = (filter_def *) fl_entry->data;
nl_lb = gtk_label_new(filt->name); gtk_list_store_append(store, &iter);
nl_item = gtk_list_item_new(); gtk_list_store_set(store, &iter, 0, filt->name,
1, fl_entry, -1);
g_signal_connect(G_OBJECT(nl_item), "button_press_event",
G_CALLBACK(filter_sel_list_button_cb),
filter_l);
gtk_misc_set_alignment (GTK_MISC (nl_lb), 0.0, 0.5);
gtk_container_add(GTK_CONTAINER(nl_item), nl_lb);
gtk_widget_show(nl_lb);
gtk_container_add(GTK_CONTAINER(filter_l), nl_item);
gtk_widget_show(nl_item);
gtk_object_set_data(GTK_OBJECT(nl_item), E_FILT_LBL_KEY, nl_lb);
gtk_object_set_data(GTK_OBJECT(nl_item), E_FILT_LIST_ITEM_MODEL_KEY,
fl_entry);
if (filter_te_str && filt->strval) { if (filter_te_str && filt->strval) {
if (strcmp(filter_te_str, filt->strval) == 0) if (strcmp(filter_te_str, filt->strval) == 0)
l_select = nl_item; {
gtk_tree_selection_select_iter(sel, &iter);
l_select = TRUE;
}
} }
fl_entry = fl_entry->next; fl_entry = fl_entry->next;
} }
g_object_unref(G_OBJECT(store));
/* Middle row: Filter name entry */ /* Middle row: Filter name entry */
middle_hb = gtk_hbox_new(FALSE, 5); middle_hb = gtk_hbox_new(FALSE, 5);
@ -531,9 +538,7 @@ filter_dialog_new(GtkWidget *caller _U_, GtkWidget *parent_filter_te,
G_CALLBACK(filter_filter_te_destroy_cb), NULL); G_CALLBACK(filter_filter_te_destroy_cb), NULL);
gtk_widget_show(filter_te); gtk_widget_show(filter_te);
if (l_select) { if (!l_select && filter_te_str && filter_te_str[0]) {
gtk_list_select_child(GTK_LIST(filter_l), l_select);
} else if (filter_te_str && filter_te_str[0]) {
gtk_entry_set_text(GTK_ENTRY(name_te), "New filter"); gtk_entry_set_text(GTK_ENTRY(name_te), "New filter");
gtk_entry_set_text(GTK_ENTRY(filter_te), filter_te_str); gtk_entry_set_text(GTK_ENTRY(filter_te), filter_te_str);
} }
@ -613,22 +618,26 @@ filter_dlg_dclick(GtkWidget *filter_l, gpointer main_w_arg, gpointer activate)
GtkWidget *main_w = GTK_WIDGET(main_w_arg); GtkWidget *main_w = GTK_WIDGET(main_w_arg);
GtkWidget *parent_filter_te = GtkWidget *parent_filter_te =
gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_PARENT_FILTER_TE_KEY); gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_PARENT_FILTER_TE_KEY);
GList *flp, *sl; GList *flp;
GtkObject *l_item;
filter_def *filt; filter_def *filt;
GtkTreeSelection *sel;
GtkTreeModel *model;
GtkTreeIter iter;
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
if (parent_filter_te != NULL) { if (parent_filter_te != NULL) {
/* /*
* We have a text entry widget associated with this dialog * We have a text entry widget associated with this dialog
* box; is one of the filters in the list selected? * box; is one of the filters in the list selected?
*/ */
sl = GTK_LIST(filter_l)->selection;
if (sl != NULL) { /* if something was selected */
if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
/* /*
* Yes. Is there a filter definition for that filter? * Yes. Is there a filter definition for that filter?
*/ */
l_item = GTK_OBJECT(sl->data); gtk_tree_model_get(model, &iter, 1, &flp, -1);
flp = (GList *) gtk_object_get_data(l_item, E_FILT_LIST_ITEM_MODEL_KEY);
if (flp) { if (flp) {
/* /*
* Yes - put it in the text entry widget. * Yes - put it in the text entry widget.
@ -827,49 +836,51 @@ filter_dlg_destroy(GtkWidget *win, gpointer data)
} }
static gint static gint
filter_sel_list_button_cb (GtkWidget *widget, GdkEventButton *event, filter_sel_list_button_cb(GtkWidget *list, GdkEventButton *event,
gpointer func_data) gpointer data _U_)
{ {
GtkWidget *parent = func_data;
void (* func)(GtkWidget *, gpointer, gpointer); void (* func)(GtkWidget *, gpointer, gpointer);
gpointer func_arg; gpointer func_arg;
gpointer func_activate; gpointer func_activate;
if (GTK_IS_LIST_ITEM(widget) && event->type == GDK_2BUTTON_PRESS) { if (event->type == GDK_2BUTTON_PRESS) {
func = gtk_object_get_data(GTK_OBJECT(parent), E_FILT_DBLFUNC_KEY); func = gtk_object_get_data(GTK_OBJECT(list), E_FILT_DBLFUNC_KEY);
func_arg = gtk_object_get_data(GTK_OBJECT(parent), E_FILT_DBLARG_KEY); func_arg = gtk_object_get_data(GTK_OBJECT(list), E_FILT_DBLARG_KEY);
func_activate = gtk_object_get_data(GTK_OBJECT(parent), E_FILT_DBLACTIVATE_KEY); func_activate = gtk_object_get_data(GTK_OBJECT(list),
E_FILT_DBLACTIVATE_KEY);
if (func) if (func)
(*func)(func_data, func_arg, func_activate); (*func)(list, func_arg, func_activate);
} }
return FALSE; return FALSE;
} }
static void static void
filter_sel_list_cb(GtkWidget *l, gpointer data _U_) filter_sel_list_cb(GtkTreeSelection *sel, gpointer data _U_)
{ {
GtkWidget *main_w = gtk_widget_get_toplevel(l); GtkWidget *filter_l = GTK_WIDGET(gtk_tree_selection_get_tree_view(sel));
GtkWidget *name_te = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_NAME_TE_KEY); GtkWidget *main_w = gtk_widget_get_toplevel(filter_l);
GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_TE_KEY); GtkWidget *name_te = gtk_object_get_data(GTK_OBJECT(main_w),
GtkWidget *chg_bt = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_CHG_BT_KEY); E_FILT_NAME_TE_KEY);
GtkWidget *copy_bt = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_COPY_BT_KEY); GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(main_w),
GtkWidget *del_bt = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_DEL_BT_KEY); E_FILT_FILTER_TE_KEY);
GtkWidget *chg_bt = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_CHG_BT_KEY);
GtkWidget *copy_bt = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_COPY_BT_KEY);
GtkWidget *del_bt = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_DEL_BT_KEY);
filter_def *filt; filter_def *filt;
gchar *name = "", *strval = ""; gchar *name = "", *strval = "";
GList *sl, *flp; GList *flp;
GtkObject *l_item;
gint sensitivity = FALSE; gint sensitivity = FALSE;
GtkTreeModel *model;
GtkTreeIter iter;
if (l) /* if something was selected */
sl = GTK_LIST(l)->selection; if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
else gtk_tree_model_get(model, &iter, 1, &flp, -1);
sl = NULL;
if (sl) { /* Something was selected */
l_item = GTK_OBJECT(sl->data);
flp = (GList *) gtk_object_get_data(l_item, E_FILT_LIST_ITEM_MODEL_KEY);
if (flp) { if (flp) {
filt = (filter_def *) flp->data; filt = (filter_def *) flp->data;
name = filt->name; name = filt->name;
@ -935,24 +946,21 @@ static void
new_filter_cb(gpointer data, gpointer user_data) new_filter_cb(gpointer data, gpointer user_data)
{ {
GtkWidget *main_w = data; GtkWidget *main_w = data;
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY); GtkTreeView *filter_l;
new_filter_cb_args_t *args = user_data; new_filter_cb_args_t *args = user_data;
filter_def *nfilt = args->nflp->data; filter_def *nfilt = args->nflp->data;
GtkWidget *nl_lb, *nl_item; GtkListStore *store;
GtkTreeIter iter;
nl_lb = gtk_label_new(nfilt->name); filter_l = GTK_TREE_VIEW(gtk_object_get_data(GTK_OBJECT(main_w),
nl_item = gtk_list_item_new(); E_FILT_FILTER_L_KEY));
gtk_misc_set_alignment(GTK_MISC(nl_lb), 0.0, 0.5); store = GTK_LIST_STORE(gtk_tree_view_get_model(filter_l));
gtk_container_add(GTK_CONTAINER(nl_item), nl_lb); gtk_list_store_append(store, &iter);
gtk_widget_show(nl_lb); gtk_list_store_set(store, &iter, 0, nfilt->name, 1, args->nflp, -1);
gtk_container_add(GTK_CONTAINER(filter_l), nl_item); if (GTK_WIDGET(filter_l) == args->active_filter_l) {
gtk_widget_show(nl_item);
gtk_object_set_data(GTK_OBJECT(nl_item), E_FILT_LBL_KEY, nl_lb);
gtk_object_set_data(GTK_OBJECT(nl_item), E_FILT_LIST_ITEM_MODEL_KEY,
args->nflp);
if (filter_l == args->active_filter_l) {
/* Select the item. */ /* Select the item. */
gtk_list_select_child(GTK_LIST(filter_l), nl_item); gtk_tree_selection_select_iter(gtk_tree_view_get_selection(filter_l),
&iter);
} }
} }
@ -960,9 +968,12 @@ static void
filter_new_bt_clicked_cb(GtkWidget *w, gpointer data) filter_new_bt_clicked_cb(GtkWidget *w, gpointer data)
{ {
GtkWidget *main_w = gtk_widget_get_toplevel(w); GtkWidget *main_w = gtk_widget_get_toplevel(w);
GtkWidget *name_te = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_NAME_TE_KEY); GtkWidget *name_te = gtk_object_get_data(GTK_OBJECT(main_w),
GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_TE_KEY); E_FILT_NAME_TE_KEY);
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY); GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_FILTER_TE_KEY);
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_FILTER_L_KEY);
filter_list_type_t list = *(filter_list_type_t *)data; filter_list_type_t list = *(filter_list_type_t *)data;
GList *fl_entry; GList *fl_entry;
const gchar *name, *strval; const gchar *name, *strval;
@ -973,7 +984,7 @@ filter_new_bt_clicked_cb(GtkWidget *w, gpointer data)
if (strlen(name) > 0 && strlen(strval) > 0) { if (strlen(name) > 0 && strlen(strval) > 0) {
/* Add a new entry to the filter list. */ /* Add a new entry to the filter list. */
fl_entry = add_to_filter_list(list, name, strval); fl_entry = add_to_filter_list(list, (char *)name, (char *)strval);
/* Update all the filter list widgets, not just the one in /* Update all the filter list widgets, not just the one in
the dialog box in which we clicked on "Copy". */ the dialog box in which we clicked on "Copy". */
@ -990,56 +1001,63 @@ filter_new_bt_clicked_cb(GtkWidget *w, gpointer data)
} }
} }
static void static gboolean
chg_list_item_cb(GtkWidget *nl_item, gpointer data) chg_list_item_cb(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter,
gpointer data)
{ {
GList *flp = data; GList *flp = data;
filter_def *filt = flp->data; filter_def *filt = flp->data;
GtkLabel *nl_lb = GList *nl_model;
GTK_LABEL(gtk_object_get_data(GTK_OBJECT(nl_item), E_FILT_LBL_KEY));
GList *nl_model =
gtk_object_get_data(GTK_OBJECT(nl_item), E_FILT_LIST_ITEM_MODEL_KEY);
/* Is this the GtkList item corresponding to the filter list item in gtk_tree_model_get(model, iter, 1, &nl_model, -1);
question? */ /* Is this the item corresponding to the filter list item in question? */
if (flp == nl_model) { if (flp == nl_model) {
/* Yes - change the label to correspond to the new name for the filter. */ /* Yes - change the label to correspond to the new name for the
gtk_label_set(nl_lb, filt->name); * filter. */
gtk_list_store_set(GTK_LIST_STORE(model), iter, 0, filt->name, -1);
return TRUE;
} }
return FALSE;
} }
static void static void
chg_filter_cb(gpointer data, gpointer user_data) chg_filter_cb(gpointer data, gpointer user_data)
{ {
GtkWidget *main_w = data; GtkWidget *main_w = data;
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY); GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_FILTER_L_KEY);
gtk_container_foreach(GTK_CONTAINER(filter_l), chg_list_item_cb, user_data); gtk_tree_model_foreach(gtk_tree_view_get_model(GTK_TREE_VIEW(filter_l)),
chg_list_item_cb, user_data);
} }
static void static void
filter_chg_bt_clicked_cb(GtkWidget *w, gpointer data) filter_chg_bt_clicked_cb(GtkWidget *w, gpointer data)
{ {
GtkWidget *main_w = gtk_widget_get_toplevel(w); GtkWidget *main_w = gtk_widget_get_toplevel(w);
GtkWidget *name_te = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_NAME_TE_KEY); GtkWidget *name_te = gtk_object_get_data(GTK_OBJECT(main_w),
GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_TE_KEY); E_FILT_NAME_TE_KEY);
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY); GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_FILTER_TE_KEY);
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_FILTER_L_KEY);
filter_def *filt; filter_def *filt;
const gchar *name, *strval; const gchar *name, *strval;
GList *sl, *fl_entry; GList *fl_entry;
GtkObject *l_item;
GtkLabel *nl_lb;
filter_list_type_t list = *(filter_list_type_t *)data; filter_list_type_t list = *(filter_list_type_t *)data;
GtkTreeSelection *sel;
GtkTreeModel *model;
GtkTreeIter iter;
sl = GTK_LIST(filter_l)->selection;
name = gtk_entry_get_text(GTK_ENTRY(name_te)); name = gtk_entry_get_text(GTK_ENTRY(name_te));
strval = gtk_entry_get_text(GTK_ENTRY(filter_te)); strval = gtk_entry_get_text(GTK_ENTRY(filter_te));
if (sl) { /* Something was selected */ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
l_item = GTK_OBJECT(sl->data);
fl_entry = (GList *) gtk_object_get_data(l_item, E_FILT_LIST_ITEM_MODEL_KEY); /* if something was selected */
nl_lb = (GtkLabel *) gtk_object_get_data(l_item, E_FILT_LBL_KEY); if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
if (fl_entry != NULL && nl_lb != NULL) { gtk_tree_model_get(model, &iter, 1, &fl_entry, -1);
if (fl_entry != NULL) {
filt = (filter_def *) fl_entry->data; filt = (filter_def *) fl_entry->data;
if (strlen(name) > 0 && strlen(strval) > 0 && filt) { if (strlen(name) > 0 && strlen(strval) > 0 && filt) {
@ -1050,7 +1068,8 @@ filter_chg_bt_clicked_cb(GtkWidget *w, gpointer data)
/* Update all the filter list widgets, not just the one in /* Update all the filter list widgets, not just the one in
the dialog box in which we clicked on "Copy". */ the dialog box in which we clicked on "Copy". */
g_list_foreach(get_filter_dialog_list(list), chg_filter_cb, fl_entry); g_list_foreach(get_filter_dialog_list(list), chg_filter_cb,
fl_entry);
} }
} }
} }
@ -1068,20 +1087,25 @@ static void
filter_copy_bt_clicked_cb(GtkWidget *w, gpointer data) filter_copy_bt_clicked_cb(GtkWidget *w, gpointer data)
{ {
GtkWidget *main_w = gtk_widget_get_toplevel(w); GtkWidget *main_w = gtk_widget_get_toplevel(w);
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY); GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w),
GList *sl, *fl_entry, *nfl_entry; E_FILT_FILTER_L_KEY);
GList *fl_entry, *nfl_entry;
gchar *prefix = "Copy of ", *name; gchar *prefix = "Copy of ", *name;
GtkObject *l_item;
filter_def *filt; filter_def *filt;
filter_list_type_t list = *(filter_list_type_t *)data; filter_list_type_t list = *(filter_list_type_t *)data;
new_filter_cb_args_t args; new_filter_cb_args_t args;
GtkTreeSelection *sel;
GtkTreeModel *model;
GtkTreeIter iter;
sl = GTK_LIST(filter_l)->selection; sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
if (sl) { /* Something was selected */
l_item = GTK_OBJECT(sl->data); /* if something was selected */
fl_entry = (GList *) gtk_object_get_data(l_item, E_FILT_LIST_ITEM_MODEL_KEY); if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
gtk_tree_model_get(model, &iter, 1, &fl_entry, -1);
if (fl_entry != NULL) { if (fl_entry != NULL) {
/* Add a new entry, copying the existing entry, to the filter list. */ /* Add a new entry, copying the existing entry, to the
* filter list. */
filt = (filter_def *) fl_entry->data; filt = (filter_def *) fl_entry->data;
name = g_malloc(strlen(prefix) + strlen(filt->name) + 1); name = g_malloc(strlen(prefix) + strlen(filt->name) + 1);
sprintf(name, "%s%s", prefix, filt->name); sprintf(name, "%s%s", prefix, filt->name);
@ -1109,36 +1133,43 @@ static void
delete_filter_cb(gpointer data, gpointer user_data) delete_filter_cb(gpointer data, gpointer user_data)
{ {
GtkWidget *main_w = data; GtkWidget *main_w = data;
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY); GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w),
gint pos = *(gint *)user_data; E_FILT_FILTER_L_KEY);
gchar *pos = (gchar *)user_data;
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(filter_l));
GtkTreeIter iter;
gtk_list_clear_items(GTK_LIST(filter_l), pos, pos + 1); gtk_tree_model_get_iter_from_string(model, &iter, pos);
gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
} }
static void static void
filter_del_bt_clicked_cb(GtkWidget *w, gpointer data) filter_del_bt_clicked_cb(GtkWidget *w, gpointer data)
{ {
GtkWidget *main_w = gtk_widget_get_toplevel(w); GtkWidget *main_w = gtk_widget_get_toplevel(w);
GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w), E_FILT_FILTER_L_KEY); GtkWidget *filter_l = gtk_object_get_data(GTK_OBJECT(main_w),
E_FILT_FILTER_L_KEY);
filter_list_type_t list = *(filter_list_type_t *)data; filter_list_type_t list = *(filter_list_type_t *)data;
GList *sl, *fl_entry; GList *fl_entry;
GtkObject *l_item; gchar *pos;
gint pos; GtkTreeSelection *sel;
GtkTreeModel *model;
GtkTreeIter iter;
sl = GTK_LIST(filter_l)->selection; sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_l));
if (sl) { /* Something was selected */ /* If something was selected */
l_item = GTK_OBJECT(sl->data); if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
pos = gtk_list_child_position(GTK_LIST(filter_l), gtk_tree_model_get(model, &iter, 1, &fl_entry, -1);
GTK_WIDGET(l_item)); pos = gtk_tree_path_to_string(gtk_tree_model_get_path(model, &iter));
fl_entry = (GList *) gtk_object_get_data(l_item, E_FILT_LIST_ITEM_MODEL_KEY);
if (fl_entry != NULL) { if (fl_entry != NULL) {
/* Remove the entry from the filter list. */ /* Remove the entry from the filter list. */
remove_from_filter_list(list, fl_entry); remove_from_filter_list(list, fl_entry);
/* Update all the filter list widgets, not just the one in /* Update all the filter list widgets, not just the one in
the dialog box in which we clicked on "Delete". */ the dialog box in which we clicked on "Delete". */
g_list_foreach(get_filter_dialog_list(list), delete_filter_cb, &pos); g_list_foreach(get_filter_dialog_list(list), delete_filter_cb, pos);
} }
g_free(pos);
} }
} }