aboutsummaryrefslogtreecommitdiffstats
path: root/filter/rule-editor.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter/rule-editor.c')
-rw-r--r--filter/rule-editor.c636
1 files changed, 287 insertions, 349 deletions
diff --git a/filter/rule-editor.c b/filter/rule-editor.c
index 3e9290801f..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)
{
- return 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)
{
- return 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,37 +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_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);
}