diff options
Diffstat (limited to 'filter/vfolder-rule.c')
-rw-r--r-- | filter/vfolder-rule.c | 484 |
1 files changed, 207 insertions, 277 deletions
diff --git a/filter/vfolder-rule.c b/filter/vfolder-rule.c index efd58b68a9..a521bbb1c0 100644 --- a/filter/vfolder-rule.c +++ b/filter/vfolder-rule.c @@ -1,9 +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. * * Author: 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 @@ -20,16 +19,18 @@ * Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H #include <config.h> -#endif - -#include <string.h> -#include <gtk/gtk.h> -#include <glade/glade.h> +#include <glib.h> +#include <gtk/gtkbox.h> +#include <gtk/gtklist.h> +#include <gtk/gtkoptionmenu.h> +#include <libgnome/gnome-defs.h> #include <libgnome/gnome-i18n.h> +#include <libgnomeui/gnome-dialog.h> +#include <libgnomeui/gnome-dialog-util.h> +#include <glade/glade.h> +#include <gal/widgets/e-unicode.h> #include "vfolder-context.h" #include "vfolder-rule.h" @@ -37,83 +38,85 @@ #define d(x) x -static int validate(FilterRule *); +static gint validate(FilterRule *); static int vfolder_eq(FilterRule *fr, FilterRule *cm); static xmlNodePtr xml_encode(FilterRule *); -static int xml_decode(FilterRule *, xmlNodePtr, RuleContext *f); +static int xml_decode(FilterRule *, xmlNodePtr, struct _RuleContext *f); static void rule_copy (FilterRule *dest, FilterRule *src); /*static void build_code(FilterRule *, GString *out);*/ -static GtkWidget *get_widget(FilterRule *fr, RuleContext *f); +static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f); extern EvolutionShellClient *global_shell_client; -static void vfolder_rule_class_init (VfolderRuleClass *klass); -static void vfolder_rule_init (VfolderRule *vr); -static void vfolder_rule_finalise (GObject *obj); +static void vfolder_rule_class_init (VfolderRuleClass *class); +static void vfolder_rule_init (VfolderRule *gspaper); +static void vfolder_rule_finalise (GtkObject *obj); +#define _PRIVATE(x) (((VfolderRule *)(x))->priv) -static FilterRuleClass *parent_class = NULL; +struct _VfolderRulePrivate { +}; +static FilterRuleClass *parent_class; -GType +guint vfolder_rule_get_type (void) { - static GType type = 0; + static guint type = 0; if (!type) { - static const GTypeInfo info = { - sizeof (VfolderRuleClass), - NULL, /* base_class_init */ - NULL, /* base_class_finalize */ - (GClassInitFunc) vfolder_rule_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (VfolderRule), - 0, /* n_preallocs */ - (GInstanceInitFunc) vfolder_rule_init, + GtkTypeInfo type_info = { + "VfolderRule", + sizeof(VfolderRule), + sizeof(VfolderRuleClass), + (GtkClassInitFunc)vfolder_rule_class_init, + (GtkObjectInitFunc)vfolder_rule_init, + (GtkArgSetFunc)NULL, + (GtkArgGetFunc)NULL }; - type = g_type_register_static (FILTER_TYPE_RULE, "VfolderRule", &info, 0); + type = gtk_type_unique(filter_rule_get_type (), &type_info); } return type; } static void -vfolder_rule_class_init (VfolderRuleClass *klass) +vfolder_rule_class_init (VfolderRuleClass *class) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - FilterRuleClass *fr_class = (FilterRuleClass *) klass; - - parent_class = g_type_class_ref (FILTER_TYPE_RULE); + GtkObjectClass *object_class; + FilterRuleClass *filter_rule = (FilterRuleClass *)class; + object_class = (GtkObjectClass *)class; + parent_class = gtk_type_class(filter_rule_get_type ()); + object_class->finalize = vfolder_rule_finalise; - + /* override methods */ - fr_class->validate = validate; - fr_class->eq = vfolder_eq; - fr_class->xml_encode = xml_encode; - fr_class->xml_decode = xml_decode; - fr_class->copy = rule_copy; - /*fr_class->build_code = build_code;*/ - fr_class->get_widget = get_widget; + filter_rule->validate = validate; + filter_rule->eq = vfolder_eq; + filter_rule->xml_encode = xml_encode; + filter_rule->xml_decode = xml_decode; + filter_rule->copy = rule_copy; + /*filter_rule->build_code = build_code;*/ + filter_rule->get_widget = get_widget; } static void -vfolder_rule_init (VfolderRule *vr) +vfolder_rule_init (VfolderRule *o) { - ; + o->priv = g_malloc0(sizeof(*o->priv)); } static void -vfolder_rule_finalise (GObject *obj) +vfolder_rule_finalise(GtkObject *obj) { - VfolderRule *vr = (VfolderRule *) obj; + VfolderRule *o = (VfolderRule *)obj; - g_list_foreach (vr->sources, (GFunc) g_free, NULL); - g_list_free (vr->sources); + g_list_foreach (o->sources, (GFunc) g_free, NULL); + g_list_free (o->sources); - G_OBJECT_CLASS (parent_class)->finalize (obj); + ((GtkObjectClass *)(parent_class))->finalize(obj); } /** @@ -126,35 +129,35 @@ vfolder_rule_finalise (GObject *obj) VfolderRule * vfolder_rule_new (void) { - return (VfolderRule *) g_object_new (VFOLDER_TYPE_RULE, NULL, NULL); + VfolderRule *o = (VfolderRule *)gtk_type_new(vfolder_rule_get_type ()); + return o; } void vfolder_rule_add_source (VfolderRule *vr, const char *uri) { - g_assert (IS_VFOLDER_RULE (vr)); - - vr->sources = g_list_append (vr->sources, g_strdup (uri)); - - filter_rule_emit_changed ((FilterRule *) vr); + g_assert(IS_VFOLDER_RULE(vr)); + + vr->sources = g_list_append(vr->sources, g_strdup(uri)); + + filter_rule_emit_changed((FilterRule *)vr); } const char * vfolder_rule_find_source (VfolderRule *vr, const char *uri) { GList *l; - - g_assert (IS_VFOLDER_RULE (vr)); - + + g_assert(IS_VFOLDER_RULE(vr)); + /* only does a simple string or address comparison, should probably do a decoded url comparison */ l = vr->sources; while (l) { - if (l->data == uri || !strcmp (l->data, uri)) + if (l->data == uri || !strcmp(l->data, uri)) return l->data; - l = l->next; + l = g_list_next(l); } - return NULL; } @@ -162,14 +165,14 @@ void vfolder_rule_remove_source (VfolderRule *vr, const char *uri) { char *found; - - g_assert (IS_VFOLDER_RULE (vr)); - - found = (char *) vfolder_rule_find_source (vr, uri); + + g_assert(IS_VFOLDER_RULE(vr)); + + found = (char *)vfolder_rule_find_source(vr, uri); if (found) { - vr->sources = g_list_remove (vr->sources, found); - g_free (found); - filter_rule_emit_changed ((FilterRule *) vr); + vr->sources = g_list_remove(vr->sources, found); + g_free(found); + filter_rule_emit_changed((FilterRule *)vr); } } @@ -177,24 +180,22 @@ const char * vfolder_rule_next_source (VfolderRule *vr, const char *last) { GList *node; - + if (last == NULL) { node = vr->sources; } else { - node = g_list_find (vr->sources, (char *) last); + node = g_list_find(vr->sources, (char *)last); if (node == NULL) node = vr->sources; else - node = g_list_next (node); + node = g_list_next(node); } - if (node) - return (const char *) node->data; - + return (const char *)node->data; return NULL; } -static int +static gint validate (FilterRule *fr) { GtkWidget *dialog; @@ -202,13 +203,8 @@ validate (FilterRule *fr) g_return_val_if_fail (fr != NULL, FALSE); if (!fr->name || !*fr->name) { - /* FIXME: set a aprent window? */ - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - "%s", _("You must name this vfolder.")); - - gtk_dialog_run ((GtkDialog *) dialog); - gtk_widget_destroy (dialog); + dialog = gnome_ok_dialog (_("You must name this vfolder.")); + gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); return 0; } @@ -216,62 +212,59 @@ validate (FilterRule *fr) /* We have to have at least one source set in the "specific" case. Do not translate this string! */ if (fr->source && !strcmp (fr->source, "specific") && VFOLDER_RULE (fr)->sources == NULL) { - /* FIXME: set a parent window? */ - dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, - "%s", _("You need to to specify at least one folder as a source.")); - - gtk_dialog_run ((GtkDialog *) dialog); - gtk_widget_destroy (dialog); - + dialog = gnome_ok_dialog (_("You need to specify at least one folder as a source.")); + gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); + return 0; } - return FILTER_RULE_CLASS (parent_class)->validate (fr); + if (FILTER_RULE_CLASS (parent_class)->validate) + return FILTER_RULE_CLASS (parent_class)->validate (fr); + + return 1; } static int -list_eq (GList *al, GList *bl) +list_eq(GList *al, GList *bl) { int truth = TRUE; - + while (truth && al && bl) { char *a = al->data, *b = bl->data; - - truth = strcmp (a, b) == 0; + + truth = strcmp(a, b) == 0; al = al->next; bl = bl->next; } - + return truth && al == NULL && bl == NULL; } static int -vfolder_eq (FilterRule *fr, FilterRule *cm) +vfolder_eq(FilterRule *fr, FilterRule *cm) { - return FILTER_RULE_CLASS (parent_class)->eq (fr, cm) - && list_eq (((VfolderRule *) fr)->sources, ((VfolderRule *) cm)->sources); + return ((FilterRuleClass *)(parent_class))->eq(fr, cm) + && list_eq(((VfolderRule *)fr)->sources, ((VfolderRule *)cm)->sources); } static xmlNodePtr xml_encode (FilterRule *fr) { - VfolderRule *vr = (VfolderRule *) fr; xmlNodePtr node, set, work; GList *l; - - node = FILTER_RULE_CLASS (parent_class)->xml_encode (fr); + VfolderRule *vr = (VfolderRule *)fr; + + node = ((FilterRuleClass *)(parent_class))->xml_encode(fr); g_assert(node != NULL); - set = xmlNewNode (NULL, "sources"); - xmlAddChild (node, set); + set = xmlNewNode(NULL, "sources"); + xmlAddChild(node, set); l = vr->sources; while (l) { - work = xmlNewNode (NULL, "folder"); - xmlSetProp (work, "uri", l->data); - xmlAddChild (set, work); - l = l->next; + work = xmlNewNode(NULL, "folder"); + xmlSetProp(work, "uri", l->data); + xmlAddChild(set, work); + l = g_list_next(l); } - return node; } @@ -283,20 +276,20 @@ xml_decode (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f) VfolderRule *vr = (VfolderRule *)fr; char *uri; - result = FILTER_RULE_CLASS (parent_class)->xml_decode (fr, node, f); + result = ((FilterRuleClass *)(parent_class))->xml_decode(fr, node, f); if (result != 0) return result; - - set = node->children; + + set = node->childs; while (set) { - if (!strcmp (set->name, "sources")) { - work = set->children; + if (!strcmp(set->name, "sources")) { + work = set->childs; while (work) { - if (!strcmp (work->name, "folder")) { - uri = xmlGetProp (work, "uri"); + if (!strcmp(work->name, "folder")) { + uri = xmlGetProp(work, "uri"); if (uri) { - vr->sources = g_list_append (vr->sources, g_strdup (uri)); - xmlFree (uri); + vr->sources = g_list_append(vr->sources, g_strdup(uri)); + xmlFree(uri); } } work = work->next; @@ -330,7 +323,7 @@ rule_copy (FilterRule *dest, FilterRule *src) node = node->next; } - FILTER_RULE_CLASS (parent_class)->copy (dest, src); + ((FilterRuleClass *)(parent_class))->copy (dest, src); } @@ -341,11 +334,10 @@ enum { }; struct _source_data { - RuleContext *rc; + RuleContext *f; VfolderRule *vr; const char *current; - GtkListStore *model; - GtkTreeView *list; + GtkList *list; GtkButton *buttons[BUTTON_LAST]; }; @@ -356,164 +348,100 @@ static struct { char *name; GtkSignalFunc func; } edit_buttons[] = { - { "source_add", G_CALLBACK (source_add) }, - { "source_remove", G_CALLBACK (source_remove) }, + { "source_add", source_add }, + { "source_remove", source_remove }, }; static void -set_sensitive (struct _source_data *data) +set_sensitive(struct _source_data *data) { - gtk_widget_set_sensitive ((GtkWidget *) data->buttons[BUTTON_ADD], TRUE); - gtk_widget_set_sensitive ((GtkWidget *) data->buttons[BUTTON_REMOVE], data->current != NULL); + gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_ADD], TRUE); + gtk_widget_set_sensitive((GtkWidget *)data->buttons[BUTTON_REMOVE], data->current != NULL); } static void -select_source (GtkWidget *list, struct _source_data *data) +select_source(GtkWidget *w, GtkWidget *child, struct _source_data *data) { - GtkTreeViewColumn *column; - GtkTreePath *path; - GtkTreeIter iter; - - gtk_tree_view_get_cursor (data->list, &path, &column); - gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path); - gtk_tree_path_free (path); - - gtk_tree_model_get (GTK_TREE_MODEL (data->model), &iter, 0, &data->current, -1); - - set_sensitive (data); + data->current = gtk_object_get_data((GtkObject *)child, "source"); + set_sensitive(data); } static void -select_source_with (GtkWidget *widget, struct _source_data *data) +select_source_with(GtkWidget *w, struct _source_data *data) { - char *source = g_object_get_data ((GObject *) widget, "source"); - - filter_rule_set_source ((FilterRule *) data->vr, source); + char *source = gtk_object_get_data((GtkObject *)w, "source"); + + filter_rule_set_source((FilterRule *)data->vr, source); } static void -source_add (GtkWidget *widget, struct _source_data *data) +source_add(GtkWidget *widget, struct _source_data *data) { static const char *allowed_types[] = { "mail/*", NULL }; GNOME_Evolution_Folder *folder; - GtkTreeSelection *selection; - GtkWidget *window; - GtkTreeIter iter; - char *uri; - - window = gtk_widget_get_toplevel (widget); - gtk_widget_set_sensitive (window, FALSE); - - evolution_shell_client_user_select_folder (global_shell_client, GTK_WINDOW (window), - _("Select Folder"), "", allowed_types, &folder); - - gtk_widget_set_sensitive (window, TRUE); - + char *def, *uri; + GtkListItem *item; + GList *l; + gchar *s; + + gtk_widget_set_sensitive(widget, FALSE); + def = ""; + evolution_shell_client_user_select_folder (global_shell_client, + GTK_WINDOW (gtk_widget_get_toplevel (widget)), + _("Select Folder"), + def, allowed_types, &folder); + + if (GTK_OBJECT_DESTROYED(widget)) { + if (folder) + CORBA_free (folder); + return; + } + + gtk_widget_set_sensitive(widget, TRUE); + if (folder) { uri = g_strdup (folder->physicalUri); - data->vr->sources = g_list_append (data->vr->sources, uri); - - gtk_list_store_append (data->model, &iter); - gtk_list_store_set (data->model, &iter, 0, uri, -1); - selection = gtk_tree_view_get_selection (data->list); - gtk_tree_selection_select_iter (selection, &iter); + data->vr->sources = g_list_append(data->vr->sources, uri); + + l = NULL; + s = e_utf8_to_gtk_string ((GtkWidget *) data->list, uri); + item = (GtkListItem *)gtk_list_item_new_with_label (s); + g_free (s); + gtk_object_set_data((GtkObject *)item, "source", uri); + gtk_widget_show((GtkWidget *)item); + l = g_list_append(NULL, item); + gtk_list_append_items(data->list, l); + gtk_list_select_child(data->list, (GtkWidget *)item); data->current = uri; } - CORBA_free (folder); - set_sensitive (data); + set_sensitive(data); } static void -source_remove (GtkWidget *widget, struct _source_data *data) +source_remove(GtkWidget *widget, struct _source_data *data) { - GtkTreeSelection *selection; const char *source; - GtkTreePath *path; - GtkTreeIter iter; int index = 0; - int n; - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data->list)); - + GList *l; + GtkListItem *item; + source = NULL; - while ((source = vfolder_rule_next_source (data->vr, source))) { - path = gtk_tree_path_new (); - gtk_tree_path_append_index (path, index); - - if (gtk_tree_selection_path_is_selected (selection, path)) { - gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path); - - vfolder_rule_remove_source (data->vr, source); - gtk_list_store_remove (data->model, &iter); - gtk_tree_path_free (path); - - /* now select the next rule */ - n = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (data->model), NULL); - index = index >= n ? n - 1 : index; - - if (index >= 0) { - path = gtk_tree_path_new (); - gtk_tree_path_append_index (path, index); - gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path); - gtk_tree_path_free (path); - - gtk_tree_selection_select_iter (selection, &iter); - gtk_tree_model_get (GTK_TREE_MODEL (data->model), &iter, 0, &data->current, -1); - } else { - data->current = NULL; - } - + while ((source = vfolder_rule_next_source(data->vr, source))) { + if (data->current == source) { + vfolder_rule_remove_source(data->vr, source); + item = g_list_nth_data(data->list->children, index); + l = g_list_append(NULL, item); + gtk_list_remove_items(data->list, l); + g_list_free(l); + data->current = NULL; break; } - index++; - gtk_tree_path_free (path); } - - set_sensitive (data); + set_sensitive(data); } - -GtkWidget *vfolder_editor_sourcelist_new (char *widget_name, char *string1, char *string2, - int int1, int int2); - -GtkWidget * -vfolder_editor_sourcelist_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 (1, G_TYPE_STRING); - 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, - _("VFolder source"), 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; -} - - /* DO NOT internationalise these strings */ const char *source_names[] = { "specific", @@ -523,78 +451,80 @@ const char *source_names[] = { }; static GtkWidget * -get_widget (FilterRule *fr, RuleContext *rc) +get_widget(FilterRule *fr, struct _RuleContext *f) { - VfolderRule *vr = (VfolderRule *) fr; - GtkWidget *widget, *frame, *list; - struct _source_data *data; - GtkOptionMenu *omenu; - const char *source; - GtkTreeIter iter; + GtkWidget *widget, *frame, *w; GladeXML *gui; + const char *source; + VfolderRule *vr = (VfolderRule *)fr; + struct _source_data *data; int i, row; GList *l; - widget = FILTER_RULE_CLASS (parent_class)->get_widget (fr, rc); + widget = ((FilterRuleClass *)(parent_class))->get_widget (fr, f); data = g_malloc0 (sizeof (*data)); - data->rc = rc; + data->f = f; data->vr = vr; - gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "vfolder_source_frame", NULL); + gui = glade_xml_new (FILTER_GLADEDIR "/filter.glade", "vfolder_source_frame"); frame = glade_xml_get_widget (gui, "vfolder_source_frame"); - - g_object_set_data_full ((GObject *) frame, "data", data, g_free); + + gtk_object_set_data_full (GTK_OBJECT (frame), "data", data, g_free); for (i = 0; i < BUTTON_LAST; i++) { - data->buttons[i] = (GtkButton *) glade_xml_get_widget (gui, edit_buttons[i].name); - g_signal_connect (data->buttons[i], "clicked", edit_buttons[i].func, data); + data->buttons[i] = (GtkButton *)w = glade_xml_get_widget (gui, edit_buttons[i].name); + gtk_signal_connect (GTK_OBJECT (w), "clicked", edit_buttons[i].func, data); } - list = glade_xml_get_widget (gui, "source_list"); - data->list = (GtkTreeView *) g_object_get_data ((GObject *) list, "table"); - data->model = (GtkListStore *) g_object_get_data ((GObject *) list, "model"); - + w = glade_xml_get_widget (gui, "source_list"); + data->list = (GtkList *)w; + l = NULL; source = NULL; while ((source = vfolder_rule_next_source (vr, source))) { - gtk_list_store_append (data->model, &iter); - gtk_list_store_set (data->model, &iter, 0, source, -1); + GtkListItem *item; + + gchar *s = e_utf8_to_gtk_string (GTK_WIDGET (data->list), source); + item = (GtkListItem *)gtk_list_item_new_with_label (s); + g_free (s); + gtk_object_set_data (GTK_OBJECT (item), "source", (void *)source); + gtk_widget_show (GTK_WIDGET (item)); + l = g_list_append (l, item); } + gtk_list_append_items (data->list, l); + gtk_signal_connect (GTK_OBJECT (w), "select_child", select_source, data); - g_signal_connect (data->list, "cursor-changed", G_CALLBACK (select_source), data); - - omenu = (GtkOptionMenu *) glade_xml_get_widget (gui, "source_option"); - l = GTK_MENU_SHELL (omenu->menu)->children; + w = glade_xml_get_widget (gui, "source_option"); + l = GTK_MENU_SHELL (GTK_OPTION_MENU (w)->menu)->children; i = 0; row = 0; while (l) { - GtkWidget *item = GTK_WIDGET (l->data); + GtkWidget *b = GTK_WIDGET (l->data); /* make sure that the glade is in sync with the source list! */ if (i < sizeof (source_names) / sizeof (source_names[0])) { - g_object_set_data ((GObject *) item, "source", (char *) source_names[i]); + gtk_object_set_data (GTK_OBJECT (b), "source", (char *)source_names[i]); if (fr->source && strcmp (source_names[i], fr->source) == 0) { row = i; } } else { g_warning ("Glade file " FILTER_GLADEDIR "/filter.glade out of sync with editor code"); } - - g_signal_connect (item, "activate", G_CALLBACK (select_source_with), data); + gtk_signal_connect (GTK_OBJECT (b), "activate", select_source_with, data); i++; l = l->next; } - gtk_option_menu_set_history (omenu, row); + gtk_option_menu_set_history (GTK_OPTION_MENU (w), row); if (fr->source == NULL) - filter_rule_set_source (fr, (char *) source_names[row]); + filter_rule_set_source (fr, (char *)source_names[row]); set_sensitive (data); - - g_object_unref (gui); - + gtk_box_pack_start (GTK_BOX (widget), frame, TRUE, TRUE, 3); + gtk_object_unref (GTK_OBJECT (gui)); + return widget; } |