diff options
Diffstat (limited to 'filter/rule-editor.c')
-rw-r--r-- | filter/rule-editor.c | 637 |
1 files changed, 287 insertions, 350 deletions
diff --git a/filter/rule-editor.c b/filter/rule-editor.c index 3fe268ac61..fac6f47476 100644 --- a/filter/rule-editor.c +++ b/filter/rule-editor.c @@ -1,10 +1,8 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * Copyright (C) 2000-2002 Ximian Inc. + * Copyright (C) 2000 Ximian Inc. * * Authors: Not Zed <notzed@lostzed.mmc.com.au> * Jeffrey Stedfast <fejj@ximian.com> - * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. @@ -20,32 +18,39 @@ * Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H #include <config.h> -#endif - -/* for getenv only, remove when getenv need removed */ -#include <stdlib.h> +#include <glib.h> +#include <gtk/gtkframe.h> +#include <libgnome/gnome-defs.h> #include <libgnome/gnome-i18n.h> - +#include <libgnomeui/gnome-stock.h> +#include <libgnomeui/gnome-dialog.h> +#include <libgnomeui/gnome-dialog-util.h> +#include <glade/glade.h> +#include <gal/widgets/e-unicode.h> +#include <gal/util/e-unicode-i18n.h> #include "rule-editor.h" +#include "rule-context.h" +#include "filter-rule.h" + +/* for getenv only, remove when getenv need removed */ +#include <stdlib.h> -static int enable_undo = 0; +static int enable_undo; -void rule_editor_add_undo (RuleEditor *re, int type, FilterRule *rule, int rank, int newrank); -void rule_editor_play_undo (RuleEditor *re); +void rule_editor_add_undo(RuleEditor *re, int type, FilterRule *rule, int rank, int newrank); +void rule_editor_play_undo(RuleEditor *re); #define d(x) x -static void set_source (RuleEditor *re, const char *source); -static void set_sensitive (RuleEditor *re); -static FilterRule *create_rule (RuleEditor *re); +static void set_source(RuleEditor *re, const char *source); +static void set_sensitive(RuleEditor *re); +static FilterRule *create_rule(RuleEditor *re); -static void rule_editor_class_init (RuleEditorClass *klass); -static void rule_editor_init (RuleEditor *re); -static void rule_editor_finalise (GObject *obj); +static void rule_editor_class_init(RuleEditorClass *class); +static void rule_editor_init (RuleEditor *gspaper); +static void rule_editor_finalise (GtkObject *obj); static void rule_editor_destroy (GtkObject *obj); #define _PRIVATE(x)(((RuleEditor *)(x))->priv) @@ -63,77 +68,84 @@ struct _RuleEditorPrivate { GtkButton *buttons[BUTTON_LAST]; }; -static GtkDialogClass *parent_class = NULL; +static GnomeDialogClass *parent_class; + +enum { + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL] = { 0 }; -GtkType -rule_editor_get_type (void) +guint +rule_editor_get_type(void) { - static GtkType type = 0; + static guint type = 0; if (!type) { - static const GTypeInfo info = { - sizeof (RuleEditorClass), - NULL, /* base_class_init */ - NULL, /* base_class_finalize */ - (GClassInitFunc) rule_editor_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ + GtkTypeInfo type_info = { + "RuleEditor", sizeof (RuleEditor), - 0, /* n_preallocs */ - (GInstanceInitFunc) rule_editor_init, + sizeof (RuleEditorClass), + (GtkClassInitFunc) rule_editor_class_init, + (GtkObjectInitFunc) rule_editor_init, + (GtkArgSetFunc) NULL, + (GtkArgGetFunc) NULL }; - + /* TODO: Remove when it works (or never will) */ - enable_undo = getenv ("EVOLUTION_RULE_UNDO") != NULL; - - type = g_type_register_static (gtk_dialog_get_type (), "RuleEditor", &info, 0); + enable_undo = getenv("EVOLUTION_RULE_UNDO") != NULL; + + type = gtk_type_unique (gnome_dialog_get_type (), &type_info); } return type; } static void -rule_editor_class_init (RuleEditorClass *klass) +rule_editor_class_init (RuleEditorClass *class) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkObjectClass *object_class = (GtkObjectClass *) klass; + GtkObjectClass *object_class; - parent_class = g_type_class_ref(gtk_dialog_get_type ()); + object_class = (GtkObjectClass *)class; + parent_class = gtk_type_class(gnome_dialog_get_type()); - gobject_class->finalize = rule_editor_finalise; + object_class->finalize = rule_editor_finalise; object_class->destroy = rule_editor_destroy; /* override methods */ - klass->set_source = set_source; - klass->set_sensitive = set_sensitive; - klass->create_rule = create_rule; + class->set_source = set_source; + class->set_sensitive = set_sensitive; + class->create_rule = create_rule; + + /* signals */ + + gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); } static void -rule_editor_init (RuleEditor *re) +rule_editor_init (RuleEditor *o) { - re->priv = g_malloc0 (sizeof (*re->priv)); + o->priv = g_malloc0 (sizeof (*o->priv)); } static void -rule_editor_finalise (GObject *obj) +rule_editor_finalise (GtkObject *obj) { RuleEditor *re = (RuleEditor *)obj; RuleEditorUndo *undo, *next; - - g_object_unref (re->context); + + gtk_object_unref (GTK_OBJECT (re->context)); g_free (re->priv); - + undo = re->undo_log; while (undo) { next = undo->next; - g_object_unref (undo->rule); - g_free (undo); + gtk_object_unref((GtkObject *)undo->rule); + g_free(undo); undo = next; } - G_OBJECT_CLASS (parent_class)->finalize (obj); + ((GtkObjectClass *)(parent_class))->finalize (obj); } static void @@ -141,10 +153,8 @@ rule_editor_destroy (GtkObject *obj) { RuleEditor *re = (RuleEditor *) obj; - if (re->dialog) { + if (re->dialog) gtk_widget_destroy (GTK_WIDGET (re->dialog)); - re->dialog = NULL; - } ((GtkObjectClass *)(parent_class))->destroy (obj); } @@ -157,42 +167,42 @@ rule_editor_destroy (GtkObject *obj) * Return value: A new #RuleEditor object. **/ RuleEditor * -rule_editor_new (RuleContext *rc, const char *source) +rule_editor_new (RuleContext *f, const char *source) { - RuleEditor *re = (RuleEditor *) g_object_new (RULE_TYPE_EDITOR, NULL); GladeXML *gui; + RuleEditor *o = (RuleEditor *)gtk_type_new (rule_editor_get_type ()); GtkWidget *w; - gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "rule_editor", NULL); - rule_editor_construct (re, rc, gui, source); + gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "rule_editor"); + rule_editor_construct (o, f, gui, source); w = glade_xml_get_widget (gui, "rule_frame"); - gtk_frame_set_label ((GtkFrame *) w, _("Rules")); + gtk_frame_set_label ((GtkFrame *)w, _("Rules")); - g_object_unref (gui); + gtk_object_unref (GTK_OBJECT (gui)); - return re; + return o; } /* used internally by implementations if required */ void rule_editor_set_sensitive (RuleEditor *re) { - RULE_EDITOR_GET_CLASS (re)->set_sensitive (re); + return ((RuleEditorClass *)((GtkObject *)re)->klass)->set_sensitive(re); } /* used internally by implementations */ void rule_editor_set_source (RuleEditor *re, const char *source) { - RULE_EDITOR_GET_CLASS (re)->set_source (re, source); + return ((RuleEditorClass *)((GtkObject *)re)->klass)->set_source(re, source); } /* factory method for "add" button */ FilterRule * rule_editor_create_rule (RuleEditor *re) { - return RULE_EDITOR_GET_CLASS (re)->create_rule (re); + return ((RuleEditorClass *)((GtkObject *)re)->klass)->create_rule(re); } static FilterRule * @@ -209,65 +219,69 @@ create_rule (RuleEditor *re) } static void -editor_destroy (RuleEditor *re, GObject *deadbeef) +add_editor_clicked (GtkWidget *dialog, int button, RuleEditor *re) { - if (re->edit) { - g_object_unref (re->edit); - re->edit = NULL; - } - - re->dialog = NULL; - - gtk_widget_set_sensitive (GTK_WIDGET (re), TRUE); - rule_editor_set_sensitive (re); -} + GtkWidget *item; + GList *l = NULL; + char *string; -static void -add_editor_response (GtkWidget *dialog, int button, RuleEditor *re) -{ - GtkTreeSelection *selection; - GtkTreePath *path; - GtkTreeIter iter; - - if (button == GTK_RESPONSE_ACCEPT) { + switch (button) { + case 0: if (!filter_rule_validate (re->edit)) { /* no need to popup a dialog because the validate code does that. */ return; } - - if (rule_context_find_rule (re->context, re->edit->name, re->edit->source)) { - dialog = gtk_message_dialog_new ((GtkWindow *) dialog, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - _("Rule name '%s' is not unique, choose another."), - re->edit->name); - - gtk_dialog_run ((GtkDialog *) dialog); - gtk_widget_destroy (dialog); - + + if (rule_context_find_rule(re->context, re->edit->name, re->edit->source)) { + GtkWidget *dialog; + char *what; + + what = g_strdup_printf(_("Rule name '%s' is not unique, choose another"), re->edit->name); + dialog = gnome_ok_dialog (what); + g_free(what); + gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + return; } - g_object_ref (re->edit); + gtk_object_ref (GTK_OBJECT (re->edit)); + string = e_utf8_to_gtk_string (GTK_WIDGET (re->list), re->edit->name); + item = gtk_list_item_new_with_label (string); + g_free (string); + + gtk_object_set_data (GTK_OBJECT (item), "rule", re->edit); + gtk_widget_show (item); - gtk_list_store_append (re->model, &iter); - gtk_list_store_set (re->model, &iter, 0, re->edit->name, 1, re->edit, -1); - selection = gtk_tree_view_get_selection (re->list); - gtk_tree_selection_select_iter (selection, &iter); + l = g_list_append (l, GTK_LIST_ITEM (item)); - /* scroll to the newly added row */ - path = gtk_tree_model_get_path ((GtkTreeModel *) re->model, &iter); - gtk_tree_view_scroll_to_cell (re->list, path, NULL, TRUE, 1.0, 0.0); - gtk_tree_path_free (path); + gtk_list_append_items (re->list, l); + gtk_list_select_child (re->list, item); re->current = re->edit; rule_context_add_rule (re->context, re->current); + + gtk_object_ref((GtkObject *)re->current); + rule_editor_add_undo(re, RULE_EDITOR_LOG_ADD, re->current, rule_context_get_rank_rule (re->context, re->current, re->current->source), 0); + case 1: + default: + gnome_dialog_close (GNOME_DIALOG (dialog)); + case -1: + if (re->edit) { + gtk_object_unref (GTK_OBJECT (re->edit)); + re->edit = NULL; + } + + re->dialog = NULL; - g_object_ref (re->current); - rule_editor_add_undo (re, RULE_EDITOR_LOG_ADD, re->current, - rule_context_get_rank_rule (re->context, re->current, re->current->source), 0); + gtk_widget_set_sensitive (GTK_WIDGET (re), TRUE); + rule_editor_set_sensitive (re); } - - gtk_widget_destroy (dialog); +} + +static void +add_editor_destroyed(GtkWidget *w, RuleEditor *re) +{ + add_editor_clicked(w, -1, re); } static void @@ -282,73 +296,82 @@ rule_add (GtkWidget *widget, RuleEditor *re) filter_rule_set_source (re->edit, re->source); rules = filter_rule_get_widget (re->edit, re->context); - re->dialog = gtk_dialog_new (); - gtk_dialog_add_buttons ((GtkDialog *) re->dialog, - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - NULL); + re->dialog = gnome_dialog_new (_("Add Rule"), + GNOME_STOCK_BUTTON_OK, + GNOME_STOCK_BUTTON_CANCEL, + NULL); - gtk_window_set_title ((GtkWindow *) re->dialog, _("Add Rule")); gtk_window_set_default_size (GTK_WINDOW (re->dialog), 650, 400); - gtk_window_set_resizable (GTK_WINDOW (re->dialog), TRUE); - gtk_window_set_transient_for ((GtkWindow *) re->dialog, (GtkWindow *) re); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (re->dialog)->vbox), rules, TRUE, TRUE, 0); - - g_signal_connect (re->dialog, "response", G_CALLBACK (add_editor_response), re); - g_object_weak_ref ((GObject *) re->dialog, (GWeakNotify) editor_destroy, re); - + gtk_window_set_policy (GTK_WINDOW (re->dialog), FALSE, TRUE, FALSE); + gtk_widget_set_parent_window (GTK_WIDGET (re->dialog), GTK_WIDGET (re)->window); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (re->dialog)->vbox), rules, TRUE, TRUE, 0); + gtk_signal_connect (GTK_OBJECT (re->dialog), "clicked", add_editor_clicked, re); + gtk_signal_connect (GTK_OBJECT (re->dialog), "destroy", add_editor_destroyed, re); gtk_widget_set_sensitive (GTK_WIDGET (re), FALSE); gtk_widget_show (re->dialog); } static void -edit_editor_response (GtkWidget *dialog, int button, RuleEditor *re) +edit_editor_clicked (GtkWidget *dialog, int button, RuleEditor *re) { - FilterRule *rule; - GtkTreePath *path; - GtkTreeIter iter; + GtkWidget *item; + char *string; int pos; - - if (button == GTK_RESPONSE_ACCEPT) { + struct _FilterRule *rule; + + switch (button) { + case 0: if (!filter_rule_validate (re->edit)) { /* no need to popup a dialog because the validate code does that. */ return; } - - rule = rule_context_find_rule (re->context, re->edit->name, re->edit->source); + + rule = rule_context_find_rule(re->context, re->edit->name, re->edit->source); if (rule != NULL && rule != re->current) { - dialog = gtk_message_dialog_new ((GtkWindow *) dialog, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - _("Rule name '%s' is not unique, choose another."), - re->edit->name); - - gtk_dialog_run ((GtkDialog *) dialog); - gtk_widget_destroy (dialog); - + GtkWidget *dialog; + char *what; + + what = g_strdup_printf(_("Rule name '%s' is not unique, choose another"), re->edit->name); + dialog = gnome_ok_dialog (what); + g_free(what); + gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + return; } pos = rule_context_get_rank_rule (re->context, re->current, re->source); if (pos != -1) { - path = gtk_tree_path_new (); - gtk_tree_path_append_index (path, pos); - gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); - gtk_tree_path_free (path); - - gtk_list_store_set (re->model, &iter, 0, re->edit->name, -1); - - rule_editor_add_undo (re, RULE_EDITOR_LOG_EDIT, filter_rule_clone (re->current), - pos, 0); - + item = g_list_nth_data (GTK_LIST (re->list)->children, pos); + string = e_utf8_to_gtk_string (GTK_WIDGET (item), re->edit->name); + gtk_label_set_text (GTK_LABEL (GTK_BIN (item)->child), string); + g_free (string); + + rule_editor_add_undo(re, RULE_EDITOR_LOG_EDIT, filter_rule_clone(re->current), pos, 0); + /* replace the old rule with the new rule */ filter_rule_copy (re->current, re->edit); } + case 1: + default: + gnome_dialog_close (GNOME_DIALOG (dialog)); + case -1: + if (re->edit) { + gtk_object_unref (GTK_OBJECT (re->edit)); + re->edit = NULL; + } + + re->dialog = NULL; + + gtk_widget_set_sensitive (GTK_WIDGET (re), TRUE); + rule_editor_set_sensitive (re); } - - gtk_widget_destroy (dialog); +} + +static void +edit_editor_destroyed(GtkWidget *w, RuleEditor *re) +{ + edit_editor_clicked(w, -1, re); } static void @@ -362,22 +385,17 @@ rule_edit (GtkWidget *widget, RuleEditor *re) re->edit = filter_rule_clone (re->current); rules = filter_rule_get_widget (re->edit, re->context); - - re->dialog = gtk_dialog_new (); - gtk_dialog_add_buttons ((GtkDialog *) re->dialog, - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - NULL); - - gtk_window_set_title ((GtkWindow *) re->dialog, _("Edit Rule")); - gtk_window_set_default_size (GTK_WINDOW (re->dialog), 650, 400); - gtk_window_set_resizable (GTK_WINDOW (re->dialog), TRUE); - gtk_widget_set_parent_window (GTK_WIDGET (re->dialog), GTK_WIDGET (re)->window); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (re->dialog)->vbox), rules, TRUE, TRUE, 0); - - g_signal_connect (re->dialog, "response", G_CALLBACK (edit_editor_response), re); - g_object_weak_ref ((GObject *) re->dialog, (GWeakNotify) editor_destroy, re); + re->dialog = gnome_dialog_new (_("Edit Rule"), + GNOME_STOCK_BUTTON_OK, + GNOME_STOCK_BUTTON_CANCEL, + NULL); + + gnome_dialog_set_parent (GNOME_DIALOG (re->dialog), GTK_WINDOW (re)); + gtk_window_set_default_size (GTK_WINDOW (re->dialog), 600, 400); + gtk_window_set_policy (GTK_WINDOW (re->dialog), FALSE, TRUE, FALSE); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (re->dialog)->vbox), rules, TRUE, TRUE, 0); + gtk_signal_connect (GTK_OBJECT (re->dialog), "clicked", edit_editor_clicked, re); + gtk_signal_connect (GTK_OBJECT (re->dialog), "destroy", edit_editor_destroyed, re); gtk_widget_set_sensitive (GTK_WIDGET (re), FALSE); @@ -387,47 +405,32 @@ rule_edit (GtkWidget *widget, RuleEditor *re) static void rule_delete (GtkWidget *widget, RuleEditor *re) { - GtkTreeSelection *selection; - GtkTreePath *path; - GtkTreeIter iter; - int pos, len; + int pos; + GList *l; + GtkListItem *item; d(printf ("delete rule\n")); pos = rule_context_get_rank_rule (re->context, re->current, re->source); if (pos != -1) { + int len; + rule_context_remove_rule (re->context, re->current); - path = gtk_tree_path_new (); - gtk_tree_path_append_index (path, pos); - gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); - gtk_list_store_remove (re->model, &iter); - gtk_tree_path_free (path); + item = g_list_nth_data (GTK_LIST (re->list)->children, pos); + l = g_list_append (NULL, item); + gtk_list_remove_items (re->list, l); + g_list_free (l); - rule_editor_add_undo (re, RULE_EDITOR_LOG_REMOVE, re->current, - rule_context_get_rank_rule (re->context, re->current, re->current->source), 0); + rule_editor_add_undo(re, RULE_EDITOR_LOG_REMOVE, re->current, rule_context_get_rank_rule(re->context, re->current, re->current->source), 0); #if 0 - g_object_unref (re->current); + gtk_object_unref (GTK_OBJECT (re->current)); #endif re->current = NULL; /* now select the next rule */ - len = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (re->model), NULL); + len = g_list_length (GTK_LIST (re->list)->children); pos = pos >= len ? len - 1 : pos; - - if (pos >= 0) { - path = gtk_tree_path_new (); - gtk_tree_path_append_index (path, pos); - gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); - gtk_tree_path_free (path); - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (re->list)); - gtk_tree_selection_select_iter (selection, &iter); - - /* scroll to the selected row */ - path = gtk_tree_model_get_path ((GtkTreeModel *) re->model, &iter); - gtk_tree_view_scroll_to_cell (re->list, path, NULL, FALSE, 0.0, 0.0); - gtk_tree_path_free (path); - } + gtk_list_select_item (GTK_LIST (re->list), pos); } rule_editor_set_sensitive (re); @@ -436,41 +439,20 @@ rule_delete (GtkWidget *widget, RuleEditor *re) static void rule_move (RuleEditor *re, int from, int to) { - GtkTreeSelection *selection; - GtkTreePath *path; - GtkTreeIter iter; - FilterRule *rule; - - g_object_ref (re->current); - rule_editor_add_undo (re, RULE_EDITOR_LOG_RANK, re->current, - rule_context_get_rank_rule (re->context, re->current, re->current->source), to); + GList *l; + GtkListItem *item; + + gtk_object_ref((GtkObject *)re->current); + rule_editor_add_undo(re, RULE_EDITOR_LOG_RANK, re->current, rule_context_get_rank_rule(re->context, re->current, re->current->source), to); d(printf ("moving %d to %d\n", from, to)); rule_context_rank_rule (re->context, re->current, to); - path = gtk_tree_path_new (); - gtk_tree_path_append_index (path, from); - gtk_tree_model_get_iter (GTK_TREE_MODEL (re->model), &iter, path); - gtk_tree_path_free (path); - - gtk_tree_model_get (GTK_TREE_MODEL (re->model), &iter, 1, &rule, -1); - g_assert (rule != NULL); - - /* remove and then re-insert the row at the new location */ - gtk_list_store_remove (re->model, &iter); - gtk_list_store_insert (re->model, &iter, to); - - /* set the data on the row */ - gtk_list_store_set (re->model, &iter, 0, rule->name, 1, rule, -1); - - /* select the row */ - selection = gtk_tree_view_get_selection (re->list); - gtk_tree_selection_select_iter (selection, &iter); - - /* scroll to the selected row */ - path = gtk_tree_model_get_path ((GtkTreeModel *) re->model, &iter); - gtk_tree_view_scroll_to_cell (re->list, path, NULL, FALSE, 0.0, 0.0); - gtk_tree_path_free (path); + item = g_list_nth_data (re->list->children, from); + l = g_list_append (NULL, item); + gtk_list_remove_items_no_unref (re->list, l); + gtk_list_insert_items (re->list, l, to); + gtk_list_select_child (re->list, GTK_WIDGET (item)); rule_editor_set_sensitive (re); } @@ -501,11 +483,11 @@ static struct { char *name; GtkSignalFunc func; } edit_buttons[] = { - { "rule_add", G_CALLBACK (rule_add) }, - { "rule_edit", G_CALLBACK (rule_edit) }, - { "rule_delete", G_CALLBACK (rule_delete) }, - { "rule_up", G_CALLBACK (rule_up) }, - { "rule_down", G_CALLBACK (rule_down) }, + { "rule_add", rule_add }, + { "rule_edit", rule_edit }, + { "rule_delete", rule_delete }, + { "rule_up", rule_up }, + { "rule_down", rule_down }, }; static void @@ -514,7 +496,7 @@ set_sensitive (RuleEditor *re) FilterRule *rule = NULL; int index = -1, count = 0; - while ((rule = rule_context_next_rule (re->context, rule, re->source))) { + while ((rule = rule_context_next_rule(re->context, rule, re->source))) { if (rule == re->current) index = count; count++; @@ -532,44 +514,47 @@ set_sensitive (RuleEditor *re) static void -cursor_changed (GtkTreeView *treeview, RuleEditor *re) +select_rule (GtkWidget *w, GtkWidget *child, RuleEditor *re) { - GtkTreeSelection *selection; - GtkTreeModel *model; - GtkTreeIter iter; + re->current = gtk_object_get_data (GTK_OBJECT (child), "rule"); - selection = gtk_tree_view_get_selection (re->list); - if (gtk_tree_selection_get_selected (selection, &model, &iter)) { - gtk_tree_model_get (GTK_TREE_MODEL (re->model), &iter, 1, &re->current, -1); - - g_assert (re->current); - - rule_editor_set_sensitive (re); - } + g_assert (re->current); + + rule_editor_set_sensitive (re); } -static void -double_click (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, RuleEditor *re) +static gboolean +double_click (GtkWidget *widget, GdkEventButton *event, RuleEditor *re) { - if (re->current) - rule_edit ((GtkWidget *) treeview, re); + if (re->current && event->type == GDK_2BUTTON_PRESS) + rule_edit (widget, re); + + return TRUE; } static void set_source (RuleEditor *re, const char *source) { FilterRule *rule = NULL; - GtkTreeIter iter; + GList *newitems = NULL; - gtk_list_store_clear (re->model); + gtk_list_clear_items(GTK_LIST(re->list), 0, -1); - d(printf("Checking for rules that are of type %s\n", source ? source : "<nil>")); - while ((rule = rule_context_next_rule (re->context, rule, source)) != NULL) { - d(printf("Adding row '%s'\n", rule->name)); - gtk_list_store_append (re->model, &iter); - gtk_list_store_set (re->model, &iter, 0, rule->name, 1, rule, -1); + d(printf("Checking for rules that are of type %s\n", source?source:"<nil>")); + while ((rule = rule_context_next_rule(re->context, rule, source)) != NULL) { + GtkWidget *item; + char *s; + + d(printf(" hit %s(%s)\n", rule->name, source?source:"<nil>")); + s = e_utf8_to_gtk_string (GTK_WIDGET (re->list), rule->name); + item = gtk_list_item_new_with_label (s); + g_free (s); + gtk_object_set_data (GTK_OBJECT (item), "rule", rule); + gtk_widget_show (GTK_WIDGET (item)); + newitems = g_list_append (newitems, item); } + gtk_list_append_items (re->list, newitems); g_free (re->source); re->source = g_strdup (source); re->current = NULL; @@ -577,30 +562,30 @@ set_source (RuleEditor *re, const char *source) } void -rule_editor_add_undo (RuleEditor *re, int type, FilterRule *rule, int rank, int newrank) +rule_editor_add_undo(RuleEditor *re, int type, FilterRule *rule, int rank, int newrank) { RuleEditorUndo *undo; - + if (!re->undo_active && enable_undo) { - undo = g_malloc0 (sizeof (*undo)); + undo = g_malloc0(sizeof(*undo)); undo->rule = rule; undo->type = type; undo->rank = rank; undo->newrank = newrank; - + undo->next = re->undo_log; re->undo_log = undo; } else { - g_object_unref (rule); + gtk_object_unref((GtkObject *)rule); } } void -rule_editor_play_undo (RuleEditor *re) +rule_editor_play_undo(RuleEditor *re) { RuleEditorUndo *undo, *next; FilterRule *rule; - + re->undo_active = TRUE; undo = re->undo_log; re->undo_log = NULL; @@ -608,101 +593,62 @@ rule_editor_play_undo (RuleEditor *re) next = undo->next; switch (undo->type) { case RULE_EDITOR_LOG_EDIT: - d(printf ("Undoing edit on rule '%s'\n", undo->rule->name)); - rule = rule_context_find_rank_rule (re->context, undo->rank, undo->rule->source); + printf("Undoing edit on rule '%s'\n", undo->rule->name); + rule = rule_context_find_rank_rule(re->context, undo->rank, undo->rule->source); if (rule) { - d(printf (" name was '%s'\n", rule->name)); - filter_rule_copy (rule, undo->rule); - d(printf (" name is '%s'\n", rule->name)); + printf(" name was '%s'\n", rule->name); + filter_rule_copy(rule, undo->rule); + printf(" name is '%s'\n", rule->name); } else { - g_warning ("Could not find the right rule to undo against?"); + g_warning("Could not find the right rule to undo against?\n"); } break; case RULE_EDITOR_LOG_ADD: - d(printf ("Undoing add on rule '%s'\n", undo->rule->name)); - rule = rule_context_find_rank_rule (re->context, undo->rank, undo->rule->source); + printf("Undoing add on rule '%s'\n", undo->rule->name); + rule = rule_context_find_rank_rule(re->context, undo->rank, undo->rule->source); if (rule) - rule_context_remove_rule (re->context, rule); + rule_context_remove_rule(re->context, rule); break; case RULE_EDITOR_LOG_REMOVE: - d(printf ("Undoing remove on rule '%s'\n", undo->rule->name)); - g_object_ref (undo->rule); - rule_context_add_rule (re->context, undo->rule); - rule_context_rank_rule (re->context, undo->rule, undo->rank); + printf("Undoing remove on rule '%s'\n", undo->rule->name); + gtk_object_ref((GtkObject *)undo->rule); + rule_context_add_rule(re->context, undo->rule); + rule_context_rank_rule(re->context, undo->rule, undo->rank); break; case RULE_EDITOR_LOG_RANK: - rule = rule_context_find_rank_rule (re->context, undo->newrank, undo->rule->source); + rule = rule_context_find_rank_rule(re->context, undo->newrank, undo->rule->source); if (rule) - rule_context_rank_rule (re->context, rule, undo->rank); + rule_context_rank_rule(re->context, rule, undo->rank); break; } - - g_object_unref (undo->rule); - g_free (undo); + gtk_object_unref((GtkObject *)undo->rule); + g_free(undo); undo = next; } re->undo_active = FALSE; } static void -editor_response (GtkWidget *dialog, int button, RuleEditor *re) +editor_clicked (GtkWidget *dialog, int button, RuleEditor *re) { - if (button == GTK_RESPONSE_REJECT) { + if (button != 0) { if (enable_undo) - rule_editor_play_undo (re); + rule_editor_play_undo(re); else { RuleEditorUndo *undo, *next; - + undo = re->undo_log; re->undo_log = 0; while (undo) { next = undo->next; - g_object_unref (undo->rule); - g_free (undo); + gtk_object_unref((GtkObject *)undo->rule); + g_free(undo); undo = next; } } } } -GtkWidget *rule_editor_treeview_new (char *widget_name, char *string1, char *string2, - int int1, int int2); - -GtkWidget * -rule_editor_treeview_new (char *widget_name, char *string1, char *string2, int int1, int int2) -{ - GtkWidget *table, *scrolled; - GtkTreeSelection *selection; - GtkCellRenderer *renderer; - GtkListStore *model; - - scrolled = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); - table = gtk_tree_view_new_with_model ((GtkTreeModel *) model); - gtk_tree_view_set_headers_visible ((GtkTreeView *) table, FALSE); - - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_insert_column_with_attributes ((GtkTreeView *) table, -1, - _("Rule name"), renderer, - "text", 0, NULL); - - selection = gtk_tree_view_get_selection ((GtkTreeView *) table); - gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); - - gtk_container_add (GTK_CONTAINER (scrolled), table); - - g_object_set_data ((GObject *) scrolled, "table", table); - g_object_set_data ((GObject *) scrolled, "model", model); - - gtk_widget_show (scrolled); - gtk_widget_show (table); - - return scrolled; -} - void rule_editor_construct (RuleEditor *re, RuleContext *context, GladeXML *gui, const char *source) { @@ -710,38 +656,29 @@ rule_editor_construct (RuleEditor *re, RuleContext *context, GladeXML *gui, cons int i; re->context = context; - g_object_ref (context); + gtk_object_ref (GTK_OBJECT (context)); - gtk_window_set_resizable ((GtkWindow *) re, TRUE); - gtk_window_set_default_size ((GtkWindow *) re, 350, 400); + gtk_window_set_policy (GTK_WINDOW (re), FALSE, TRUE, FALSE); w = glade_xml_get_widget (gui, "rule_editor"); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (re)->vbox), w, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (re)->vbox), w, TRUE, TRUE, 0); for (i = 0; i < BUTTON_LAST; i++) { - re->priv->buttons[i] = (GtkButton *) w = glade_xml_get_widget (gui, edit_buttons[i].name); - g_signal_connect (w, "clicked", edit_buttons[i].func, re); + re->priv->buttons[i] = (GtkButton *)w = glade_xml_get_widget (gui, edit_buttons[i].name); + gtk_signal_connect (GTK_OBJECT (w), "clicked", edit_buttons[i].func, re); } - w = glade_xml_get_widget (gui, "rule_list"); - re->list = (GtkTreeView *) g_object_get_data ((GObject *) w, "table"); - re->model = (GtkListStore *) g_object_get_data ((GObject *) w, "model"); - - g_signal_connect (re->list, "cursor-changed", G_CALLBACK (cursor_changed), re); - g_signal_connect (re->list, "row-activated", G_CALLBACK (double_click), re); - - g_signal_connect (re, "response", G_CALLBACK (editor_response), re); + re->list = (GtkList *) w = glade_xml_get_widget(gui, "rule_list"); + gtk_signal_connect (GTK_OBJECT (w), "select_child", select_rule, re); + gtk_signal_connect (GTK_OBJECT (w), "button_press_event", + GTK_SIGNAL_FUNC (double_click), re); + + gtk_signal_connect (GTK_OBJECT (re), "clicked", editor_clicked, re); rule_editor_set_source (re, source); - + if (enable_undo) { - gtk_dialog_add_buttons ((GtkDialog *) re, - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - NULL); - } else { - gtk_dialog_add_buttons ((GtkDialog *) re, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - NULL); - } + gnome_dialog_append_buttons (GNOME_DIALOG (re), GNOME_STOCK_BUTTON_OK, + GNOME_STOCK_BUTTON_CANCEL, NULL); + } else + gnome_dialog_append_buttons (GNOME_DIALOG (re), GNOME_STOCK_BUTTON_OK, NULL); } |