diff options
-rw-r--r-- | filter/ChangeLog | 14 | ||||
-rw-r--r-- | filter/filter-editor.c | 5 | ||||
-rw-r--r-- | filter/filter-rule.c | 39 | ||||
-rw-r--r-- | filter/filter.glade | 267 | ||||
-rw-r--r-- | filter/vfolder-rule.c | 43 |
5 files changed, 160 insertions, 208 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog index 382b815c4c..3cecbeb156 100644 --- a/filter/ChangeLog +++ b/filter/ChangeLog @@ -1,3 +1,17 @@ +2001-03-03 Not Zed <NotZed@Ximian.com> + + * filter.glade: Added option menu to vfolder editor. + +2001-03-02 Not Zed <NotZed@Ximian.com> + + * vfolder-rule.c (get_widget): Setup the data on the base source + opiton menu, and make hte option menu reflect the source. + (select_source_with): Set the source type for this + rule. e.g. these folders, "with ..." + + * filter-editor.c: Removed the N_() stuff from the source_names + array, they must not be internationalised!!! + 2001-02-28 Not Zed <NotZed@Ximian.com> * filter-rule.c (filter_rule_clone): New function to clone rules. diff --git a/filter/filter-editor.c b/filter/filter-editor.c index 5e06870fe4..5fa1796e3f 100644 --- a/filter/filter-editor.c +++ b/filter/filter-editor.c @@ -429,10 +429,11 @@ select_source (GtkMenuItem *mi, struct _editor_data *data) set_sensitive (data); } +/* these strings must not be internationalised!!!! */ static char *source_names[] = { - N_("incoming"), + "incoming", /*"demand",*/ - N_("outgoing") + "outgoing" }; GtkWidget * diff --git a/filter/filter-rule.c b/filter/filter-rule.c index c5d36d3496..f99c79e89b 100644 --- a/filter/filter-rule.c +++ b/filter/filter-rule.c @@ -144,6 +144,9 @@ filter_rule_clone(FilterRule *base, RuleContext *f) xmlNodePtr xml; FilterRule *rule; + g_assert(IS_FILTER_RULE(base)); + g_assert(IS_RULE_CONTEXT(f)); + /* TODO: do this more directly/efficiently */ xml = filter_rule_xml_encode(base); rule = gtk_type_new(((GtkObject *)base)->klass->type); @@ -156,6 +159,8 @@ filter_rule_clone(FilterRule *base, RuleContext *f) void filter_rule_set_name (FilterRule *fr, const char *name) { + g_assert(IS_FILTER_RULE(fr)); + g_free (fr->name); fr->name = g_strdup (name); } @@ -163,6 +168,8 @@ filter_rule_set_name (FilterRule *fr, const char *name) void filter_rule_set_source (FilterRule *fr, const char *source) { + g_assert(IS_FILTER_RULE(fr)); + g_free (fr->source); fr->source = g_strdup (source); } @@ -170,6 +177,8 @@ filter_rule_set_source (FilterRule *fr, const char *source) xmlNodePtr filter_rule_xml_encode (FilterRule *fr) { + g_assert(IS_FILTER_RULE(fr)); + return ((FilterRuleClass *) ((GtkObject *) fr)->klass)->xml_encode(fr); } @@ -188,7 +197,7 @@ xml_encode (FilterRule *fr) xmlSetProp (node, "grouping", "any"); break; } - + if (fr->source) { xmlSetProp (node, "source", fr->source); } else { @@ -197,12 +206,13 @@ xml_encode (FilterRule *fr) } if (fr->name) { - gchar *encstr; + char *encstr; + work = xmlNewNode (NULL, "title"); - encstr = e_utf8_xml1_encode (fr->name); - xmlNodeSetContent (work, encstr); - g_free (encstr); - xmlAddChild (node, work); + encstr = e_utf8_xml1_encode(fr->name); + xmlNodeSetContent(work, encstr); + g_free(encstr); + xmlAddChild(node, work); } set = xmlNewNode (NULL, "partset"); @@ -247,6 +257,10 @@ load_set (xmlNodePtr node, FilterRule *fr, RuleContext *f) int filter_rule_xml_decode (FilterRule *fr, xmlNodePtr node, RuleContext *f) { + g_assert(IS_FILTER_RULE(fr)); + g_assert(IS_RULE_CONTEXT(f)); + g_assert(node != NULL); + return ((FilterRuleClass *) ((GtkObject *) fr)->klass)->xml_decode(fr, node, f); } @@ -299,12 +313,18 @@ xml_decode (FilterRule *fr, xmlNodePtr node, RuleContext *f) void filter_rule_add_part (FilterRule *fr, FilterPart *fp) { + g_assert(IS_FILTER_RULE(fr)); + g_assert(IS_FILTER_PART(fp)); + fr->parts = g_list_append (fr->parts, fp); } void filter_rule_remove_part (FilterRule *fr, FilterPart *fp) { + g_assert(IS_FILTER_RULE(fr)); + g_assert(IS_FILTER_PART(fp)); + fr->parts = g_list_remove (fr->parts, fp); } @@ -312,6 +332,10 @@ void filter_rule_replace_part (FilterRule *fr, FilterPart *fp, FilterPart *new) { GList *l; + + g_assert(IS_FILTER_RULE(fr)); + g_assert(IS_FILTER_PART(fp)); + g_assert(IS_FILTER_PART(new)); l = g_list_find (fr->parts, fp); if (l) { @@ -324,6 +348,9 @@ filter_rule_replace_part (FilterRule *fr, FilterPart *fp, FilterPart *new) void filter_rule_build_code (FilterRule *fr, GString *out) { + g_assert(IS_FILTER_RULE(fr)); + g_assert(out != NULL); + return ((FilterRuleClass *) ((GtkObject *) fr)->klass)->build_code(fr, out); } diff --git a/filter/filter.glade b/filter/filter.glade index 96eeb3dc63..259234acbe 100644 --- a/filter/filter.glade +++ b/filter/filter.glade @@ -459,219 +459,72 @@ Outgoing </child> <widget> - <class>GtkHBox</class> - <name>hbox3</name> + <class>GtkVBox</class> + <name>vbox3</name> <homogeneous>False</homogeneous> <spacing>0</spacing> <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow3</name> - <width>256</width> - <height>125</height> - <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> + <class>GtkOptionMenu</class> + <name>source_option</name> + <can_focus>True</can_focus> + <items>specific folders only +with all local folders +with all active remote folders +with all local and active remote folders +</items> + <initial_choice>0</initial_choice> <child> <padding>0</padding> - <expand>True</expand> - <fill>True</fill> + <expand>False</expand> + <fill>False</fill> </child> - - <widget> - <class>GtkViewport</class> - <name>viewport3</name> - <shadow_type>GTK_SHADOW_IN</shadow_type> - - <widget> - <class>GtkList</class> - <name>source_list</name> - <selection_mode>GTK_SELECTION_SINGLE</selection_mode> - </widget> - </widget> </widget> <widget> - <class>GtkVBox</class> - <name>vbox3</name> + <class>GtkHBox</class> + <name>hbox3</name> <homogeneous>False</homogeneous> <spacing>0</spacing> <child> <padding>0</padding> - <expand>False</expand> - <fill>False</fill> + <expand>True</expand> + <fill>True</fill> </child> <widget> - <class>GtkVButtonBox</class> - <name>vbuttonbox3</name> - <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style> - <spacing>0</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>6</child_ipad_x> - <child_ipad_y>0</child_ipad_y> + <class>GtkScrolledWindow</class> + <name>scrolledwindow3</name> + <width>256</width> + <height>125</height> + <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy> + <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> + <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> + <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> <child> <padding>0</padding> - <expand>False</expand> - <fill>False</fill> + <expand>True</expand> + <fill>True</fill> </child> <widget> - <class>GtkButton</class> - <name>source_add</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <label>Add</label> - </widget> - - <widget> - <class>GtkButton</class> - <name>source_remove</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <label>Remove</label> - </widget> - </widget> - </widget> - </widget> - </widget> - </widget> -</widget> - -<widget> - <class>GnomeDialog</class> - <name>vfolder_source</name> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>False</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>dialog-vbox3</name> - <homogeneous>False</homogeneous> - <spacing>8</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>dialog-action_area3</name> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>button16</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button17</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button18</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> - </widget> - </widget> - - <widget> - <class>GtkFrame</class> - <name>vfolder_source_frame</name> - <label>vFolder Sources</label> - <label_xalign>0</label_xalign> - <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkHBox</class> - <name>hbox3</name> - <homogeneous>False</homogeneous> - <spacing>0</spacing> - - <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow3</name> - <width>256</width> - <height>125</height> - <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkViewport</class> - <name>viewport3</name> - <shadow_type>GTK_SHADOW_IN</shadow_type> - - <widget> - <class>GtkList</class> - <name>source_list</name> - <selection_mode>GTK_SELECTION_SINGLE</selection_mode> + <class>GtkViewport</class> + <name>viewport3</name> + <shadow_type>GTK_SHADOW_IN</shadow_type> + + <widget> + <class>GtkList</class> + <name>source_list</name> + <selection_mode>GTK_SELECTION_SINGLE</selection_mode> + </widget> </widget> </widget> - </widget> - - <widget> - <class>GtkVBox</class> - <name>vbox3</name> - <homogeneous>False</homogeneous> - <spacing>0</spacing> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> <widget> - <class>GtkVButtonBox</class> - <name>vbuttonbox3</name> - <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style> + <class>GtkVBox</class> + <name>vbox3</name> + <homogeneous>False</homogeneous> <spacing>0</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>6</child_ipad_x> - <child_ipad_y>0</child_ipad_y> <child> <padding>0</padding> <expand>False</expand> @@ -679,19 +532,35 @@ Outgoing </child> <widget> - <class>GtkButton</class> - <name>source_add</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <label>Add</label> - </widget> - - <widget> - <class>GtkButton</class> - <name>source_remove</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <label>Remove</label> + <class>GtkVButtonBox</class> + <name>vbuttonbox3</name> + <layout_style>GTK_BUTTONBOX_DEFAULT_STYLE</layout_style> + <spacing>0</spacing> + <child_min_width>85</child_min_width> + <child_min_height>27</child_min_height> + <child_ipad_x>6</child_ipad_x> + <child_ipad_y>0</child_ipad_y> + <child> + <padding>0</padding> + <expand>False</expand> + <fill>False</fill> + </child> + + <widget> + <class>GtkButton</class> + <name>source_add</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <label>Add</label> + </widget> + + <widget> + <class>GtkButton</class> + <name>source_remove</name> + <can_default>True</can_default> + <can_focus>True</can_focus> + <label>Remove</label> + </widget> </widget> </widget> </widget> diff --git a/filter/vfolder-rule.c b/filter/vfolder-rule.c index 322e3eabb7..8c58d0ba5e 100644 --- a/filter/vfolder-rule.c +++ b/filter/vfolder-rule.c @@ -258,6 +258,14 @@ select_source(GtkWidget *w, GtkWidget *child, struct _source_data *data) set_sensitive(data); } +static void +select_source_with(GtkWidget *w, struct _source_data *data) +{ + 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) { const char *allowed_types[] = { "mail", NULL }; @@ -313,6 +321,14 @@ static void source_remove(GtkWidget *widget, struct _source_data *data) set_sensitive(data); } +/* DO NOT internationalise these strings */ +const char *source_names[] = { + "specific", + "local", + "remote_active", + "local_remote_active" +}; + static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f) { GtkWidget *widget, *frame, *w; @@ -320,7 +336,7 @@ static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f) const char *source; VfolderRule *vr = (VfolderRule *)fr; struct _source_data *data; - int i; + int i, row; GList *l; widget = ((FilterRuleClass *)(parent_class))->get_widget(fr, f); @@ -354,6 +370,31 @@ static GtkWidget *get_widget(FilterRule *fr, struct _RuleContext *f) } gtk_list_append_items(data->list, l); gtk_signal_connect((GtkObject *)w, "select_child", select_source, data); + + 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 *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])) { + 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"); + } + gtk_signal_connect (GTK_OBJECT (b), "activate", select_source_with, data); + + i++; + l = l->next; + } + + gtk_option_menu_set_history(GTK_OPTION_MENU(w), row); + set_sensitive(data); gtk_box_pack_start(GTK_BOX(widget), frame, TRUE, TRUE, 3); |