diff options
Diffstat (limited to 'filter/vfolder-editor.c')
-rw-r--r-- | filter/vfolder-editor.c | 302 |
1 files changed, 170 insertions, 132 deletions
diff --git a/filter/vfolder-editor.c b/filter/vfolder-editor.c index 32be9bce3b..33f292bd18 100644 --- a/filter/vfolder-editor.c +++ b/filter/vfolder-editor.c @@ -2,6 +2,7 @@ * Copyright (C) 2000 Helix Code Inc. * * Authors: Not Zed <notzed@lostzed.mmc.com.au> + * Jeffrey Stedfast <fejj@helixcode.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License @@ -30,9 +31,9 @@ #define d(x) #if 0 -static void vfolder_editor_class_init (VfolderEditorClass *class); +static void vfolder_editor_class_init (VfolderEditorClass *class); static void vfolder_editor_init (VfolderEditor *gspaper); -static void vfolder_editor_finalise (GtkObject *obj); +static void vfolder_editor_finalise (GtkObject *obj); #define _PRIVATE(x) (((VfolderEditor *)(x))->priv) @@ -63,7 +64,7 @@ vfolder_editor_get_type (void) (GtkArgGetFunc)NULL }; - type = gtk_type_unique(gnome_dialog_get_type (), &type_info); + type = gtk_type_unique (gnome_dialog_get_type (), &type_info); } return type; @@ -75,20 +76,20 @@ vfolder_editor_class_init (VfolderEditorClass *class) GtkObjectClass *object_class; object_class = (GtkObjectClass *)class; - parent_class = gtk_type_class(gnome_dialog_get_type ()); - + parent_class = gtk_type_class (gnome_dialog_get_type ()); + object_class->finalize = vfolder_editor_finalise; /* override methods */ - + /* signals */ - - gtk_object_class_add_signals(object_class, signals, LAST_SIGNAL); + + gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); } static void vfolder_editor_init (VfolderEditor *o) { - o->priv = g_malloc0(sizeof(*o->priv)); + o->priv = g_malloc0 (sizeof (*o->priv)); } static void @@ -109,7 +110,7 @@ vfolder_editor_finalise(GtkObject *obj) VfolderEditor * vfolder_editor_new(void) { - VfolderEditor *o = (VfolderEditor *)gtk_type_new(vfolder_editor_get_type ()); + VfolderEditor *o = (VfolderEditor *)gtk_type_new (vfolder_editor_get_type ()); return o; } #endif @@ -132,137 +133,157 @@ struct _editor_data { GtkButton *buttons[BUTTON_LAST]; }; -static void set_sensitive(struct _editor_data *data); +static void set_sensitive (struct _editor_data *data); -static void rule_add(GtkWidget *widget, struct _editor_data *data) +static void +rule_add (GtkWidget *widget, struct _editor_data *data) { FilterRule *rule; int result; - GnomeDialog *gd; + GtkWidget *gd; GtkWidget *w; FilterPart *part; - d(printf("add rule\n")); + d(printf ("add rule\n")); /* create a new rule with 1 match and 1 action */ - rule = (FilterRule *) vfolder_rule_new(); - - part = rule_context_next_part(data->f, NULL); - filter_rule_add_part(rule, filter_part_clone(part)); - - w = filter_rule_get_widget(rule, data->f); - gd = (GnomeDialog *)gnome_dialog_new(_("Add Rule"), - GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, - NULL); - gtk_window_set_policy(GTK_WINDOW(gd), FALSE, TRUE, FALSE); - gtk_box_pack_start((GtkBox *)gd->vbox, w, TRUE, TRUE, 0); - gtk_widget_show((GtkWidget *)gd); - result = gnome_dialog_run_and_close(gd); + rule = (FilterRule *) vfolder_rule_new (); + + part = rule_context_next_part (data->f, NULL); + filter_rule_add_part (rule, filter_part_clone (part)); + + w = filter_rule_get_widget (rule, data->f); + gd = gnome_dialog_new (_("Add VFolder Rule"), + GNOME_STOCK_BUTTON_OK, + GNOME_STOCK_BUTTON_CANCEL, + NULL); + gtk_window_set_policy (GTK_WINDOW (gd), FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (gd)->vbox), w, TRUE, TRUE, 0); + + gtk_widget_show (gd); + + result = gnome_dialog_run_and_close (GNOME_DIALOG (gd)); + if (result == 0) { - GtkListItem *item; + GtkWidget *item; GList *l = NULL; gchar *s; - - s = e_utf8_to_gtk_string ((GtkWidget *) data->list, rule->name); - item = (GtkListItem *)gtk_list_item_new_with_label(rule->name); + + s = e_utf8_to_gtk_string (GTK_WIDGET (data->list), rule->name); + item = gtk_list_item_new_with_label (rule->name); g_free (s); - - gtk_object_set_data((GtkObject *)item, "rule", rule); - gtk_widget_show((GtkWidget *)item); - l = g_list_append(l, item); - gtk_list_append_items(data->list, l); - gtk_list_select_child(data->list, (GtkWidget *)item); + + gtk_object_set_data (GTK_OBJECT (item), "rule", rule); + gtk_widget_show (item); + + l = g_list_append (l, GTK_LIST_ITEM (item)); + + gtk_list_append_items (data->list, l); + gtk_list_select_child (data->list, item); + data->current = rule; - rule_context_add_rule(data->f, rule); - set_sensitive(data); + rule_context_add_rule (data->f, rule); + + set_sensitive (data); } else { - gtk_object_unref((GtkObject *)rule); + gtk_object_unref (GTK_OBJECT (rule)); } } -static void rule_edit(GtkWidget *widget, struct _editor_data *data) +static void +rule_edit (GtkWidget *widget, struct _editor_data *data) { GtkWidget *w; int result; - GnomeDialog *gd; + GtkWidget *gd; FilterRule *rule; int pos; - - d(printf("edit rule\n")); + + d(printf ("edit rule\n")); rule = data->current; - w = filter_rule_get_widget(rule, data->f); - gd = (GnomeDialog *)gnome_dialog_new(_("Edit VFolder Rule"), GNOME_STOCK_BUTTON_OK, NULL); - gtk_window_set_policy(GTK_WINDOW(gd), FALSE, TRUE, FALSE); - gtk_box_pack_start((GtkBox *)gd->vbox, w, TRUE, TRUE, 0); - gtk_widget_show((GtkWidget *)gd); - result = gnome_dialog_run_and_close(gd); - + w = filter_rule_get_widget (rule, data->f); + gd = gnome_dialog_new (_("Edit VFolder Rule"), + GNOME_STOCK_BUTTON_OK, + GNOME_STOCK_BUTTON_CANCEL, + NULL); + gtk_window_set_policy (GTK_WINDOW (gd), FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (gd)->vbox), w, TRUE, TRUE, 0); + + gtk_widget_show (gd); + + result = gnome_dialog_run_and_close (GNOME_DIALOG (gd)); + if (result == 0) { - pos = rule_context_get_rank_rule(data->f, data->current, NULL); + pos = rule_context_get_rank_rule (data->f, data->current, NULL); if (pos != -1) { - GtkListItem *item = g_list_nth_data(data->list->children, pos); - gchar *s = e_utf8_to_gtk_string ((GtkWidget *) item, data->current->name); - gtk_label_set_text((GtkLabel *)(((GtkBin *)item)->child), s); + GtkListItem *item = g_list_nth_data (data->list->children, pos); + gchar *s = e_utf8_to_gtk_string (GTK_WIDGET (item), data->current->name); + gtk_label_set_text (GTK_LABEL (GTK_BIN (item)->child), s); g_free (s); } } } -static void rule_delete(GtkWidget *widget, struct _editor_data *data) +static void +rule_delete (GtkWidget *widget, struct _editor_data *data) { int pos; GList *l; GtkListItem *item; - - d(printf("ddelete rule\n")); - pos = rule_context_get_rank_rule(data->f, data->current, NULL); + + d(printf ("delete rule\n")); + pos = rule_context_get_rank_rule (data->f, data->current, NULL); if (pos != -1) { - rule_context_remove_rule(data->f, data->current); - - item = g_list_nth_data(data->list->children, pos); - l = g_list_append(NULL, item); - gtk_list_remove_items(data->list, l); - g_list_free(l); - - gtk_object_unref((GtkObject *)data->current); + rule_context_remove_rule (data->f, data->current); + + item = g_list_nth_data (data->list->children, pos); + l = g_list_append (NULL, item); + gtk_list_remove_items (data->list, l); + g_list_free (l); + + gtk_object_unref (GTK_OBJECT (data->current)); data->current = NULL; } - set_sensitive(data); + + set_sensitive (data); } -static void rule_move(struct _editor_data *data, int from, int to) +static void +rule_move (struct _editor_data *data, int from, int to) { GList *l; GtkListItem *item; - - d(printf("moving %d to %d\n", from, to)); - rule_context_rank_rule(data->f, data->current, to); - - item = g_list_nth_data(data->list->children, from); - l = g_list_append(NULL, item); - gtk_list_remove_items_no_unref(data->list, l); - gtk_list_insert_items(data->list, l, to); - gtk_list_select_child(data->list, (GtkWidget *)item); - set_sensitive(data); + + d(printf ("moving %d to %d\n", from, to)); + rule_context_rank_rule (data->f, data->current, to); + + item = g_list_nth_data (data->list->children, from); + l = g_list_append (NULL, item); + gtk_list_remove_items_no_unref (data->list, l); + gtk_list_insert_items (data->list, l, to); + gtk_list_select_child (data->list, GTK_WIDGET (item)); + set_sensitive (data); } -static void rule_up(GtkWidget *widget, struct _editor_data *data) +static void +rule_up (GtkWidget *widget, struct _editor_data *data) { int pos; - - d(printf("up rule\n")); - pos = rule_context_get_rank_rule(data->f, data->current, NULL); - if (pos>0) { - rule_move(data, pos, pos-1); + + d(printf ("up rule\n")); + pos = rule_context_get_rank_rule (data->f, data->current, NULL); + if (pos > 0) { + rule_move (data, pos, pos - 1); } } -static void rule_down(GtkWidget *widget, struct _editor_data *data) +static void +rule_down (GtkWidget *widget, struct _editor_data *data) { int pos; - - d(printf("down rule\n")); - pos = rule_context_get_rank_rule(data->f, data->current, NULL); - rule_move(data, pos, pos+1); + + d(printf ("down rule\n")); + pos = rule_context_get_rank_rule (data->f, data->current, NULL); + rule_move (data, pos, pos + 1); } static struct { @@ -277,36 +298,49 @@ static struct { }; static void -set_sensitive(struct _editor_data *data) +set_sensitive (struct _editor_data *data) { FilterRule *rule = NULL; - int index=-1, count=0; - - while ((rule = rule_context_next_rule(data->f, rule, NULL))) { + int index = -1, count = 0; + + while ((rule = rule_context_next_rule (data->f, rule, NULL))) { if (rule == data->current) - index=count; + index = count; count++; } - d(printf("index = %d count=%d\n", index, count)); + + d(printf ("index = %d count=%d\n", index, count)); + count--; - gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_EDIT], index != -1); - gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_DELETE], index != -1); - gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_UP], index > 0); - gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_DOWN], index >=0 && index<count); + + gtk_widget_set_sensitive (GTK_WIDGET (data->buttons[BUTTON_EDIT]), index != -1); + gtk_widget_set_sensitive (GTK_WIDGET (data->buttons[BUTTON_DELETE]), index != -1); + gtk_widget_set_sensitive (GTK_WIDGET (data->buttons[BUTTON_UP]), index > 0); + gtk_widget_set_sensitive (GTK_WIDGET (data->buttons[BUTTON_DOWN]), index >= 0 && index < count); } static void -select_rule(GtkWidget *w, GtkWidget *child, struct _editor_data *data) +select_rule (GtkWidget *w, GtkWidget *child, struct _editor_data *data) { - data->current = gtk_object_get_data((GtkObject *)child, "rule"); + data->current = gtk_object_get_data (GTK_OBJECT (child), "rule"); + if (data->current) - d(printf("seledct rule: %s\n", data->current->name)); + d(printf ("selected rule: %s\n", data->current->name)); else - d(printf("bad data?\n")); - set_sensitive(data); + d(printf ("bad data?\n")); + + set_sensitive (data); } -GtkWidget *vfolder_editor_construct (struct _VfolderContext *f) +static void +double_click (GtkWidget *widget, GdkEventButton *event, gpointer user_data) +{ + if (event->type == GDK_2BUTTON_PRESS) + rule_edit (widget, user_data); +} + +GtkWidget * +vfolder_editor_construct (struct _VfolderContext *f) { GladeXML *gui; GtkWidget *d, *w; @@ -314,39 +348,43 @@ GtkWidget *vfolder_editor_construct (struct _VfolderContext *f) FilterRule *rule = NULL; struct _editor_data *data; int i; - - g_assert(IS_VFOLDER_CONTEXT(f)); - - data = g_malloc0(sizeof(*data)); + + g_assert (IS_VFOLDER_CONTEXT (f)); + + data = g_malloc0 (sizeof (*data)); data->f = (RuleContext *)f; - - gui = glade_xml_new(FILTER_GLADEDIR "/filter.glade", "edit_vfolder"); + + gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "edit_vfolder"); d = glade_xml_get_widget (gui, "edit_vfolder"); - gtk_object_set_data_full((GtkObject *)d, "data", data, g_free); - - gtk_window_set_title((GtkWindow *)d, "Edit VFolders"); - for (i=0;i<BUTTON_LAST;i++) { + gtk_object_set_data_full (GTK_OBJECT (d), "data", data, g_free); + + gtk_window_set_title (GTK_WINDOW (d), "Edit VFolders"); + for (i = 0; i < BUTTON_LAST; i++) { data->buttons[i] = (GtkButton *)w = glade_xml_get_widget (gui, edit_buttons[i].name); - gtk_signal_connect((GtkObject *)w, "clicked", edit_buttons[i].func, data); + gtk_signal_connect (GTK_OBJECT (w), "clicked", edit_buttons[i].func, data); } - + w = glade_xml_get_widget (gui, "rule_list"); - data->list = (GtkList *)w; + data->list = GTK_LIST (w); l = NULL; - while ((rule = rule_context_next_rule((RuleContext *)f, rule, NULL))) { - GtkListItem *item; - gchar *s = e_utf8_to_gtk_string ((GtkWidget *) data->list, rule->name); - item = (GtkListItem *)gtk_list_item_new_with_label(s); + while ((rule = rule_context_next_rule ((RuleContext *)f, rule, NULL))) { + GtkWidget *item; + + gchar *s = e_utf8_to_gtk_string (GTK_WIDGET (data->list), rule->name); + item = gtk_list_item_new_with_label (s); g_free (s); - gtk_object_set_data((GtkObject *)item, "rule", rule); - gtk_widget_show((GtkWidget *)item); - l = g_list_append(l, item); + gtk_object_set_data (GTK_OBJECT (item), "rule", rule); + gtk_widget_show (GTK_WIDGET (item)); + l = g_list_append (l, GTK_LIST_ITEM (item)); } - gtk_list_append_items(data->list, l); - gtk_signal_connect((GtkObject *)w, "select_child", select_rule, data); - - set_sensitive(data); - gtk_object_unref((GtkObject *)gui); - + + gtk_list_append_items (data->list, l); + gtk_signal_connect (GTK_OBJECT (w), "select_child", select_rule, data); + gtk_signal_connect (GTK_OBJECT (w), "button_press_event", double_click, data); + + set_sensitive (data); + + gtk_object_unref (GTK_OBJECT (gui)); + return d; } |