2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2001 Hiroyuki Yamamoto
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #include <gdk/gdkkeysyms.h>
37 #include "prefs_matcher.h"
38 #include "prefs_common.h"
39 #include "mainwindow.h"
40 #include "foldersel.h"
41 #include "manage_window.h"
46 #include "alertpanel.h"
49 static struct Matcher {
54 GtkWidget *predicate_combo;
55 GtkWidget *predicate_flag_combo;
56 GtkWidget *header_combo;
58 GtkWidget *criteria_list;
60 GtkWidget *predicate_list;
61 GtkWidget *predicate_label;
62 GtkWidget *predicate_flag_list;
64 GtkWidget *bool_op_list;
66 GtkWidget *header_entry;
67 GtkWidget *header_label;
68 GtkWidget *value_entry;
69 GtkWidget *value_label;
70 GtkWidget *case_chkbtn;
71 GtkWidget *regexp_chkbtn;
73 GtkWidget *cond_clist;
76 /* choice in the list */
85 CRITERIA_TO_OR_CC = 5,
86 CRITERIA_NEWSGROUPS = 6,
87 CRITERIA_INREPLYTO = 7,
88 CRITERIA_AGE_GREATER = 8,
89 CRITERIA_AGE_LOWER = 9,
91 CRITERIA_HEADERS_PART = 11,
92 CRITERIA_BODY_PART = 12,
93 CRITERIA_MESSAGE = 13,
98 CRITERIA_DELETED = 17,
99 CRITERIA_REPLIED = 18,
100 CRITERIA_FORWARDED = 19
108 gchar * bool_op_text [] = {
113 PREDICATE_CONTAINS = 0,
114 PREDICATE_DOES_NOT_CONTAIN = 1
117 gchar * predicate_text [] = {
118 "contains", "does not contain"
122 PREDICATE_FLAG_ENABLED = 0,
123 PREDICATE_FLAG_DISABLED = 1
126 gchar * predicate_flag_text [] = {
127 "flag enabled", "flag disabled"
130 gchar * criteria_text [] = {
131 "All messages", "Subject",
132 "From", "To", "Cc", "To or Cc",
133 "Newsgroups", "In reply to",
134 "Age greater than", "Age lower than",
135 "Header", "Headers part",
136 "Body part", "Whole message",
137 "Unread flag", "New flag",
138 "Marked flag", "Deleted flag",
139 "Replied flag", "Forwarded flag"
142 gint get_sel_from_list(GtkList * list)
148 sel = list->selection->data;
149 for(child = list->children ; child != NULL ;
150 child = g_list_next(child)) {
151 if (child->data == sel)
159 static PrefsMatcherSignal * matchers_callback;
162 #define VSPACING_NARROW 4
163 #define DEFAULT_ENTRY_WIDTH 80
164 #define PREFSBUFSIZE 1024
166 /* widget creating functions */
167 static void prefs_matcher_create (void);
169 static void prefs_matcher_set_dialog (MatcherList * matchers);
172 static void prefs_matcher_set_list (void);
173 static gint prefs_matcher_clist_set_row (gint row);
176 /* callback functions */
179 static void prefs_matcher_select_dest_cb (void);
181 static void prefs_matcher_register_cb (void);
182 static void prefs_matcher_substitute_cb (void);
183 static void prefs_matcher_delete_cb (void);
184 static void prefs_matcher_up (void);
185 static void prefs_matcher_down (void);
186 static void prefs_matcher_select (GtkCList *clist,
191 static void prefs_matcher_key_pressed (GtkWidget *widget,
194 static void prefs_matcher_ok (void);
195 static void prefs_matcher_cancel (void);
196 static gint prefs_matcher_deleted(GtkWidget *widget, GdkEventAny *event,
198 static void prefs_matcher_criteria_select(GtkList *list,
201 static MatcherList * prefs_matcher_get_list(void);
203 void prefs_matcher_open(MatcherList * matchers, PrefsMatcherSignal * cb)
205 inc_autocheck_timer_remove();
207 if (!matcher.window) {
208 prefs_matcher_create();
211 manage_window_set_transient(GTK_WINDOW(matcher.window));
212 gtk_widget_grab_focus(matcher.ok_btn);
214 matchers_callback = cb;
216 prefs_matcher_set_dialog(matchers);
218 gtk_widget_show(matcher.window);
221 static void prefs_matcher_create(void)
226 GtkWidget *cancel_btn;
227 GtkWidget *confirm_area;
236 GtkWidget *header_combo;
237 GtkWidget *header_entry;
238 GtkWidget *header_label;
239 GtkWidget *criteria_combo;
240 GtkWidget *criteria_list;
241 GtkWidget *criteria_label;
242 GtkWidget *value_label;
243 GtkWidget *value_entry;
244 GtkWidget *predicate_combo;
245 GtkWidget *predicate_list;
246 GtkWidget *predicate_flag_combo;
247 GtkWidget *predicate_flag_list;
248 GtkWidget *predicate_label;
249 GtkWidget *bool_op_combo;
250 GtkWidget *bool_op_list;
251 GtkWidget *bool_op_label;
253 GtkWidget *regexp_chkbtn;
254 GtkWidget *case_chkbtn;
260 GtkWidget *subst_btn;
263 GtkWidget *cond_hbox;
264 GtkWidget *cond_scrolledwin;
265 GtkWidget *cond_clist;
274 gchar *title[] = {_("Registered rules")};
276 debug_print(_("Creating matcher setting window...\n"));
278 window = gtk_window_new (GTK_WINDOW_DIALOG);
279 gtk_container_set_border_width (GTK_CONTAINER (window), 8);
280 gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
281 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
282 gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE);
284 vbox = gtk_vbox_new (FALSE, 6);
285 gtk_widget_show (vbox);
286 gtk_container_add (GTK_CONTAINER (window), vbox);
288 gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"),
289 &cancel_btn, _("Cancel"), NULL, NULL);
290 gtk_widget_show (confirm_area);
291 gtk_box_pack_end (GTK_BOX(vbox), confirm_area, FALSE, FALSE, 0);
292 gtk_widget_grab_default (ok_btn);
294 gtk_window_set_title (GTK_WINDOW(window),
295 _("Condition setting"));
296 gtk_signal_connect (GTK_OBJECT(window), "delete_event",
297 GTK_SIGNAL_FUNC(prefs_matcher_deleted), NULL);
298 gtk_signal_connect (GTK_OBJECT(window), "key_press_event",
299 GTK_SIGNAL_FUNC(prefs_matcher_key_pressed), NULL);
300 gtk_signal_connect (GTK_OBJECT(window), "focus_in_event",
301 GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
302 gtk_signal_connect (GTK_OBJECT(window), "focus_out_event",
303 GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
304 gtk_signal_connect (GTK_OBJECT(ok_btn), "clicked",
305 GTK_SIGNAL_FUNC(prefs_matcher_ok), NULL);
306 gtk_signal_connect (GTK_OBJECT(cancel_btn), "clicked",
307 GTK_SIGNAL_FUNC(prefs_matcher_cancel), NULL);
309 vbox1 = gtk_vbox_new (FALSE, VSPACING);
310 gtk_widget_show (vbox1);
311 gtk_box_pack_start (GTK_BOX (vbox), vbox1, TRUE, TRUE, 0);
312 gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
314 table1 = gtk_table_new (2, 3, FALSE);
315 gtk_widget_show (table1);
317 gtk_box_pack_start (GTK_BOX (vbox1), table1, FALSE, FALSE, 0);
318 gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
319 gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
321 /* criteria combo box */
323 criteria_label = gtk_label_new (_("Match type"));
324 gtk_widget_show (criteria_label);
325 gtk_misc_set_alignment (GTK_MISC (criteria_label), 0, 0.5);
326 gtk_table_attach (GTK_TABLE (table1), criteria_label, 0, 1, 0, 1,
329 criteria_combo = gtk_combo_new ();
330 gtk_widget_show (criteria_combo);
334 for(i = 0 ; i < (gint) (sizeof(criteria_text) / sizeof(gchar *)) ;
336 combo_items = g_list_append(combo_items,
337 (gpointer) _(criteria_text[i]));
339 gtk_combo_set_popdown_strings(GTK_COMBO(criteria_combo), combo_items);
341 g_list_free(combo_items);
343 gtk_widget_set_usize (criteria_combo, 120, -1);
344 gtk_table_attach (GTK_TABLE (table1), criteria_combo, 0, 1, 1, 2,
346 criteria_list = GTK_COMBO(criteria_combo)->list;
347 gtk_signal_connect (GTK_OBJECT (criteria_list), "select-child",
348 GTK_SIGNAL_FUNC (prefs_matcher_criteria_select),
351 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(criteria_combo)->entry),
356 header_label = gtk_label_new (_("Header name"));
357 gtk_widget_show (header_label);
358 gtk_misc_set_alignment (GTK_MISC (header_label), 0, 0.5);
359 gtk_table_attach (GTK_TABLE (table1), header_label, 1, 2, 0, 1,
362 header_combo = gtk_combo_new ();
363 gtk_widget_show (header_combo);
364 gtk_widget_set_usize (header_combo, 96, -1);
365 gtkut_combo_set_items (GTK_COMBO (header_combo),
366 "Subject", "From", "To", "Cc", "Reply-To",
367 "Sender", "X-ML-Name", "X-List", "X-Sequence",
370 gtk_table_attach (GTK_TABLE (table1), header_combo, 1, 2, 1, 2,
372 header_entry = GTK_COMBO (header_combo)->entry;
373 gtk_entry_set_editable (GTK_ENTRY (header_entry), TRUE);
377 value_label = gtk_label_new (_("Value"));
378 gtk_widget_show (value_label);
379 gtk_misc_set_alignment (GTK_MISC (value_label), 0, 0.5);
380 gtk_table_attach (GTK_TABLE (table1), value_label, 2, 3, 0, 1,
381 GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0, 0);
383 value_entry = gtk_entry_new ();
384 gtk_widget_show (value_entry);
385 gtk_widget_set_usize (value_entry, 200, -1);
386 gtk_table_attach (GTK_TABLE (table1), value_entry, 2, 3, 1, 2,
387 GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0, 0);
392 vbox2 = gtk_vbox_new (FALSE, VSPACING);
393 gtk_widget_show (vbox2);
394 gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
396 hbox1 = gtk_hbox_new (FALSE, 8);
397 gtk_widget_show (hbox1);
398 gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
400 predicate_label = gtk_label_new (_("Predicate"));
401 gtk_widget_show (predicate_label);
402 gtk_box_pack_start (GTK_BOX (hbox1), predicate_label,
405 predicate_combo = gtk_combo_new ();
406 gtk_widget_show (predicate_combo);
407 gtk_widget_set_usize (predicate_combo, 120, -1);
408 predicate_list = GTK_COMBO(predicate_combo)->list;
409 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(predicate_combo)->entry),
414 for(i = 0 ; i < (gint) (sizeof(predicate_text) / sizeof(gchar *)) ;
416 combo_items = g_list_append(combo_items,
417 (gpointer) _(predicate_text[i]));
419 gtk_combo_set_popdown_strings(GTK_COMBO(predicate_combo), combo_items);
421 g_list_free(combo_items);
423 gtk_box_pack_start (GTK_BOX (hbox1), predicate_combo,
428 predicate_flag_combo = gtk_combo_new ();
429 gtk_widget_hide (predicate_flag_combo);
430 gtk_widget_set_usize (predicate_flag_combo, 120, -1);
431 predicate_flag_list = GTK_COMBO(predicate_flag_combo)->list;
432 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(predicate_flag_combo)->entry), FALSE);
436 for(i = 0 ; i < (gint) (sizeof(predicate_text) / sizeof(gchar *)) ;
438 combo_items = g_list_append(combo_items, (gpointer) _(predicate_flag_text[i]));
440 gtk_combo_set_popdown_strings(GTK_COMBO(predicate_flag_combo),
443 g_list_free(combo_items);
445 gtk_box_pack_start (GTK_BOX (hbox1), predicate_flag_combo,
448 vbox3 = gtk_vbox_new (FALSE, 0);
449 gtk_widget_show (vbox3);
450 gtk_box_pack_start (GTK_BOX (hbox1), vbox3, FALSE, FALSE, 0);
452 PACK_CHECK_BUTTON (vbox3, case_chkbtn, _("Case sensitive"));
453 PACK_CHECK_BUTTON (vbox3, regexp_chkbtn, _("Use regexp"));
455 /* register / substitute / delete */
457 reg_hbox = gtk_hbox_new (FALSE, 4);
458 gtk_widget_show (reg_hbox);
459 gtk_box_pack_start (GTK_BOX (vbox1), reg_hbox, FALSE, FALSE, 0);
461 arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
462 gtk_widget_show (arrow);
463 gtk_box_pack_start (GTK_BOX (reg_hbox), arrow, FALSE, FALSE, 0);
464 gtk_widget_set_usize (arrow, -1, 16);
466 btn_hbox = gtk_hbox_new (TRUE, 4);
467 gtk_widget_show (btn_hbox);
468 gtk_box_pack_start (GTK_BOX (reg_hbox), btn_hbox, FALSE, FALSE, 0);
470 reg_btn = gtk_button_new_with_label (_("Register"));
471 gtk_widget_show (reg_btn);
472 gtk_box_pack_start (GTK_BOX (btn_hbox), reg_btn, FALSE, TRUE, 0);
473 gtk_signal_connect (GTK_OBJECT (reg_btn), "clicked",
474 GTK_SIGNAL_FUNC (prefs_matcher_register_cb), NULL);
476 subst_btn = gtk_button_new_with_label (_(" Substitute "));
477 gtk_widget_show (subst_btn);
478 gtk_box_pack_start (GTK_BOX (btn_hbox), subst_btn, FALSE, TRUE, 0);
479 gtk_signal_connect (GTK_OBJECT (subst_btn), "clicked",
480 GTK_SIGNAL_FUNC (prefs_matcher_substitute_cb),
483 del_btn = gtk_button_new_with_label (_("Delete"));
484 gtk_widget_show (del_btn);
485 gtk_box_pack_start (GTK_BOX (btn_hbox), del_btn, FALSE, TRUE, 0);
486 gtk_signal_connect (GTK_OBJECT (del_btn), "clicked",
487 GTK_SIGNAL_FUNC (prefs_matcher_delete_cb), NULL);
489 /* boolean operation */
491 bool_op_label = gtk_label_new (_("Boolean Op"));
492 gtk_misc_set_alignment (GTK_MISC (value_label), 0, 0.5);
493 gtk_widget_show (bool_op_label);
494 gtk_box_pack_start (GTK_BOX (btn_hbox), bool_op_label,
497 bool_op_combo = gtk_combo_new ();
498 gtk_widget_show (bool_op_combo);
499 gtk_widget_set_usize (bool_op_combo, 50, -1);
500 bool_op_list = GTK_COMBO(bool_op_combo)->list;
501 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(bool_op_combo)->entry),
506 for(i = 0 ; i < (gint) (sizeof(bool_op_text) / sizeof(gchar *)) ;
508 combo_items = g_list_append(combo_items,
509 (gpointer) _(bool_op_text[i]));
511 gtk_combo_set_popdown_strings(GTK_COMBO(bool_op_combo), combo_items);
513 g_list_free(combo_items);
515 gtk_box_pack_start (GTK_BOX (btn_hbox), bool_op_combo,
518 cond_hbox = gtk_hbox_new (FALSE, 8);
519 gtk_widget_show (cond_hbox);
520 gtk_box_pack_start (GTK_BOX (vbox1), cond_hbox, TRUE, TRUE, 0);
522 cond_scrolledwin = gtk_scrolled_window_new (NULL, NULL);
523 gtk_widget_show (cond_scrolledwin);
524 gtk_widget_set_usize (cond_scrolledwin, -1, 150);
525 gtk_box_pack_start (GTK_BOX (cond_hbox), cond_scrolledwin,
527 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (cond_scrolledwin),
528 GTK_POLICY_AUTOMATIC,
529 GTK_POLICY_AUTOMATIC);
531 cond_clist = gtk_clist_new_with_titles(1, title);
532 gtk_widget_show (cond_clist);
533 gtk_container_add (GTK_CONTAINER (cond_scrolledwin), cond_clist);
534 gtk_clist_set_column_width (GTK_CLIST (cond_clist), 0, 80);
535 gtk_clist_set_selection_mode (GTK_CLIST (cond_clist),
536 GTK_SELECTION_BROWSE);
537 GTK_WIDGET_UNSET_FLAGS (GTK_CLIST (cond_clist)->column[0].button,
539 gtk_signal_connect (GTK_OBJECT (cond_clist), "select_row",
540 GTK_SIGNAL_FUNC (prefs_matcher_select), NULL);
542 btn_vbox = gtk_vbox_new (FALSE, 8);
543 gtk_widget_show (btn_vbox);
544 gtk_box_pack_start (GTK_BOX (cond_hbox), btn_vbox, FALSE, FALSE, 0);
546 up_btn = gtk_button_new_with_label (_("Up"));
547 gtk_widget_show (up_btn);
548 gtk_box_pack_start (GTK_BOX (btn_vbox), up_btn, FALSE, FALSE, 0);
549 gtk_signal_connect (GTK_OBJECT (up_btn), "clicked",
550 GTK_SIGNAL_FUNC (prefs_matcher_up), NULL);
552 down_btn = gtk_button_new_with_label (_("Down"));
553 gtk_widget_show (down_btn);
554 gtk_box_pack_start (GTK_BOX (btn_vbox), down_btn, FALSE, FALSE, 0);
555 gtk_signal_connect (GTK_OBJECT (down_btn), "clicked",
556 GTK_SIGNAL_FUNC (prefs_matcher_down), NULL);
558 gtk_widget_show_all(window);
560 matcher.window = window;
562 matcher.ok_btn = ok_btn;
564 matcher.criteria_list = criteria_list;
565 matcher.header_combo = header_combo;
566 matcher.header_entry = header_entry;
567 matcher.header_label = header_label;
568 matcher.value_entry = value_entry;
569 matcher.value_label = value_label;
570 matcher.predicate_label = predicate_label;
571 matcher.predicate_list = predicate_list;
572 matcher.predicate_combo = predicate_combo;
573 matcher.predicate_flag_list = predicate_flag_list;
574 matcher.predicate_flag_combo = predicate_flag_combo;
575 matcher.case_chkbtn = case_chkbtn;
576 matcher.regexp_chkbtn = regexp_chkbtn;
577 matcher.bool_op_list = bool_op_list;
579 matcher.cond_clist = cond_clist;
582 static gint prefs_matcher_clist_set_row(gint row, MatcherProp * prop)
584 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
589 cond_str[0] = _("(New)");
590 return gtk_clist_append(clist, cond_str);
593 matcher_str = matcherprop_to_string(prop);
594 cond_str[0] = matcher_str;
596 row = gtk_clist_append(clist, cond_str);
598 gtk_clist_set_text(clist, row, 0, cond_str[0]);
604 static void prefs_matcher_reset_condition(void)
606 gtk_list_select_item(GTK_LIST(matcher.criteria_list), 0);
607 gtk_list_select_item(GTK_LIST(matcher.predicate_list), 0);
608 gtk_entry_set_text(GTK_ENTRY(matcher.header_entry), "");
609 gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), "");
612 static void prefs_matcher_set_dialog(MatcherList * matchers)
614 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
616 gboolean bool_op = 0;
618 gtk_clist_freeze(clist);
619 gtk_clist_clear(clist);
621 prefs_matcher_clist_set_row(-1, NULL);
622 if (matchers != NULL) {
623 for (cur = matchers->matchers ; cur != NULL ;
624 cur = g_slist_next(cur)) {
626 prop = (MatcherProp *) cur->data;
627 prefs_matcher_clist_set_row(-1, prop);
630 bool_op = matchers->bool_and;
633 gtk_clist_thaw(clist);
635 gtk_list_select_item(GTK_LIST(matcher.bool_op_list), bool_op);
637 prefs_matcher_reset_condition();
640 static MatcherList * prefs_matcher_get_list(void)
647 GSList * matcher_list;
648 MatcherList * matchers;
652 while (gtk_clist_get_text(GTK_CLIST(matcher.cond_clist),
653 row, 0, &matcher_str)) {
655 if (strcmp(matcher_str, _("(New)")) != 0) {
657 prop = matcherprop_parse(&tmp);
662 matcher_list = g_slist_append(matcher_list, prop);
667 bool_and = get_sel_from_list(GTK_LIST(matcher.bool_op_list));
669 matchers = matcherlist_new(matcher_list, bool_and);
674 static gint prefs_matcher_get_matching_from_criteria(gint criteria_id)
676 switch (criteria_id) {
679 case CRITERIA_UNREAD:
680 return MATCHING_UNREAD;
683 case CRITERIA_MARKED:
684 return MATCHING_MARKED;
685 case CRITERIA_DELETED:
686 return MATCHING_DELETED;
687 case CRITERIA_REPLIED:
688 return MATCHING_REPLIED;
689 case CRITERIA_FORWARDED:
690 return MATCHING_FORWARDED;
691 case CRITERIA_SUBJECT:
692 return MATCHING_SUBJECT;
694 return MATCHING_FROM;
699 case CRITERIA_TO_OR_CC:
700 return MATCHING_TO_OR_CC;
701 case CRITERIA_NEWSGROUPS:
702 return MATCHING_NEWSGROUPS;
703 case CRITERIA_INREPLYTO:
704 return MATCHING_INREPLYTO;
705 case CRITERIA_AGE_GREATER:
706 return MATCHING_AGE_GREATER;
707 case CRITERIA_AGE_LOWER:
708 return MATCHING_AGE_LOWER;
709 case CRITERIA_HEADER:
710 return MATCHING_HEADER;
711 case CRITERIA_HEADERS_PART:
712 return MATCHING_HEADERS_PART;
713 case CRITERIA_BODY_PART:
714 return MATCHING_BODY_PART;
715 case CRITERIA_MESSAGE:
716 return MATCHING_MESSAGE;
722 static gint prefs_matcher_not_criteria(gint matcher_criteria)
724 switch(matcher_criteria) {
725 case MATCHING_UNREAD:
726 return MATCHING_NOT_UNREAD;
728 return MATCHING_NOT_NEW;
729 case MATCHING_MARKED:
730 return MATCHING_NOT_MARKED;
731 case MATCHING_DELETED:
732 return MATCHING_NOT_DELETED;
733 case MATCHING_REPLIED:
734 return MATCHING_NOT_REPLIED;
735 case MATCHING_FORWARDED:
736 return MATCHING_NOT_FORWARDED;
737 case MATCHING_SUBJECT:
738 return MATCHING_NOT_SUBJECT;
740 return MATCHING_NOT_FROM;
742 return MATCHING_NOT_TO;
744 return MATCHING_NOT_CC;
745 case MATCHING_TO_OR_CC:
746 return MATCHING_NOT_TO_AND_NOT_CC;
747 case MATCHING_NEWSGROUPS:
748 return MATCHING_NOT_NEWSGROUPS;
749 case MATCHING_INREPLYTO:
750 return MATCHING_NOT_INREPLYTO;
751 case MATCHING_HEADER:
752 return MATCHING_NOT_HEADER;
753 case MATCHING_HEADERS_PART:
754 return MATCHING_NOT_HEADERS_PART;
755 case MATCHING_MESSAGE:
756 return MATCHING_NOT_MESSAGE;
757 case MATCHING_BODY_PART:
758 return MATCHING_NOT_BODY_PART;
760 return matcher_criteria;
764 static MatcherProp * prefs_matcher_dialog_to_matcher()
766 MatcherProp * matcherprop;
770 gint value_pred_flag;
773 gboolean case_sensitive;
779 value_criteria = get_sel_from_list(GTK_LIST(matcher.criteria_list));
781 criteria = prefs_matcher_get_matching_from_criteria(value_criteria);
783 value_pred = get_sel_from_list(GTK_LIST(matcher.predicate_list));
784 value_pred_flag = get_sel_from_list(GTK_LIST(matcher.predicate_flag_list));
786 use_regexp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn));
787 case_sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn));
789 switch (value_criteria) {
790 case CRITERIA_UNREAD:
792 case CRITERIA_MARKED:
793 case CRITERIA_DELETED:
794 case CRITERIA_REPLIED:
795 case CRITERIA_FORWARDED:
796 if (value_pred_flag == PREDICATE_FLAG_DISABLED)
797 criteria = prefs_matcher_not_criteria(criteria);
799 case CRITERIA_SUBJECT:
803 case CRITERIA_TO_OR_CC:
804 case CRITERIA_NEWSGROUPS:
805 case CRITERIA_INREPLYTO:
806 case CRITERIA_HEADERS_PART:
807 case CRITERIA_BODY_PART:
808 case CRITERIA_MESSAGE:
809 case CRITERIA_AGE_GREATER:
810 case CRITERIA_AGE_LOWER:
811 case CRITERIA_HEADER:
812 if (value_pred == PREDICATE_DOES_NOT_CONTAIN)
813 criteria = prefs_matcher_not_criteria(criteria);
819 matchtype = MATCHING_REGEXP;
821 matchtype = MATCHING_REGEXPCASE;
825 matchtype = MATCHING_MATCH;
827 matchtype = MATCHING_MATCHCASE;
834 switch (value_criteria) {
836 case CRITERIA_UNREAD:
838 case CRITERIA_MARKED:
839 case CRITERIA_DELETED:
840 case CRITERIA_REPLIED:
841 case CRITERIA_FORWARDED:
844 case CRITERIA_SUBJECT:
848 case CRITERIA_TO_OR_CC:
849 case CRITERIA_NEWSGROUPS:
850 case CRITERIA_INREPLYTO:
851 case CRITERIA_HEADERS_PART:
852 case CRITERIA_BODY_PART:
853 case CRITERIA_MESSAGE:
854 expr = gtk_entry_get_text(GTK_ENTRY(matcher.value_entry));
858 alertpanel_error(_("Match string is not set."));
864 case CRITERIA_AGE_GREATER:
865 case CRITERIA_AGE_LOWER:
866 age_str = gtk_entry_get_text(GTK_ENTRY(matcher.value_entry));
868 if (*age_str == '\0') {
869 alertpanel_error(_("Age is not set."));
877 case CRITERIA_HEADER:
879 header = gtk_entry_get_text(GTK_ENTRY(matcher.header_entry));
880 expr = gtk_entry_get_text(GTK_ENTRY(matcher.value_entry));
882 if (*header == '\0') {
883 alertpanel_error(_("Header name is not set."));
888 alertpanel_error(_("Match string is not set."));
895 matcherprop = matcherprop_new(criteria, header, matchtype, expr, age);
900 static void prefs_matcher_register_cb(void)
902 MatcherProp * matcherprop;
904 matcherprop = prefs_matcher_dialog_to_matcher();
905 if (matcherprop == NULL)
908 prefs_matcher_clist_set_row(-1, matcherprop);
910 matcherprop_free(matcherprop);
912 prefs_matcher_reset_condition();
915 static void prefs_matcher_substitute_cb(void)
917 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
919 MatcherProp * matcherprop;
921 row = GPOINTER_TO_INT(clist->selection->data);
925 matcherprop = prefs_matcher_dialog_to_matcher();
926 if (matcherprop == NULL)
929 prefs_matcher_clist_set_row(row, matcherprop);
931 matcherprop_free(matcherprop);
933 prefs_matcher_reset_condition();
936 static void prefs_matcher_delete_cb(void)
938 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
941 if (!clist->selection) return;
942 row = GPOINTER_TO_INT(clist->selection->data);
946 gtk_clist_remove(clist, row);
949 static void prefs_matcher_up(void)
951 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
954 if (!clist->selection) return;
956 row = GPOINTER_TO_INT(clist->selection->data);
958 gtk_clist_row_move(clist, row, row - 1);
961 static void prefs_matcher_down(void)
963 GtkCList *clist = GTK_CLIST(matcher.cond_clist);
966 if (!clist->selection) return;
968 row = GPOINTER_TO_INT(clist->selection->data);
969 if (row >= 1 && row < clist->rows - 1)
970 gtk_clist_row_move(clist, row, row + 1);
973 static void prefs_matcher_select(GtkCList *clist, gint row, gint column,
979 gboolean negative_cond;
981 if (!gtk_clist_get_text(GTK_CLIST(matcher.cond_clist),
982 row, 0, &matcher_str))
985 negative_cond = FALSE;
988 prefs_matcher_reset_condition();
993 prop = matcherprop_parse(&tmp);
997 switch(prop->criteria) {
999 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1003 case MATCHING_NOT_UNREAD:
1004 negative_cond = TRUE;
1005 case MATCHING_UNREAD:
1006 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1010 case MATCHING_NOT_NEW:
1011 negative_cond = TRUE;
1013 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1017 case MATCHING_NOT_MARKED:
1018 negative_cond = TRUE;
1019 case MATCHING_MARKED:
1020 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1024 case MATCHING_NOT_DELETED:
1025 negative_cond = TRUE;
1026 case MATCHING_DELETED:
1027 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1031 case MATCHING_NOT_REPLIED:
1032 negative_cond = TRUE;
1033 case MATCHING_REPLIED:
1034 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1038 case MATCHING_NOT_FORWARDED:
1039 negative_cond = TRUE;
1040 case MATCHING_FORWARDED:
1041 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1042 CRITERIA_FORWARDED);
1045 case MATCHING_NOT_SUBJECT:
1046 negative_cond = TRUE;
1047 case MATCHING_SUBJECT:
1048 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1052 case MATCHING_NOT_FROM:
1053 negative_cond = TRUE;
1055 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1059 case MATCHING_NOT_TO:
1060 negative_cond = TRUE;
1062 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1066 case MATCHING_NOT_CC:
1067 negative_cond = TRUE;
1069 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1073 case MATCHING_NOT_NEWSGROUPS:
1074 negative_cond = TRUE;
1075 case MATCHING_NEWSGROUPS:
1076 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1077 CRITERIA_NEWSGROUPS);
1080 case MATCHING_NOT_INREPLYTO:
1081 negative_cond = TRUE;
1082 case MATCHING_INREPLYTO:
1083 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1084 CRITERIA_INREPLYTO);
1087 case MATCHING_NOT_TO_AND_NOT_CC:
1088 negative_cond = TRUE;
1089 case MATCHING_TO_OR_CC:
1090 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1094 case MATCHING_NOT_BODY_PART:
1095 negative_cond = TRUE;
1096 case MATCHING_BODY_PART:
1097 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1098 CRITERIA_BODY_PART);
1101 case MATCHING_NOT_MESSAGE:
1102 negative_cond = TRUE;
1103 case MATCHING_MESSAGE:
1104 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1108 case MATCHING_NOT_HEADERS_PART:
1109 negative_cond = TRUE;
1110 case MATCHING_HEADERS_PART:
1111 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1112 CRITERIA_HEADERS_PART);
1115 case MATCHING_NOT_HEADER:
1116 negative_cond = TRUE;
1117 case MATCHING_HEADER:
1118 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1122 case MATCHING_AGE_GREATER:
1123 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1124 CRITERIA_AGE_GREATER);
1127 case MATCHING_AGE_LOWER:
1128 gtk_list_select_item(GTK_LIST(matcher.criteria_list),
1129 CRITERIA_AGE_LOWER);
1133 switch(prop->criteria) {
1137 case MATCHING_NOT_SUBJECT:
1138 case MATCHING_NOT_FROM:
1139 case MATCHING_NOT_TO:
1140 case MATCHING_NOT_CC:
1141 case MATCHING_NOT_TO_AND_NOT_CC:
1142 case MATCHING_NOT_NEWSGROUPS:
1143 case MATCHING_NOT_INREPLYTO:
1144 case MATCHING_NOT_HEADERS_PART:
1145 case MATCHING_NOT_BODY_PART:
1146 case MATCHING_NOT_MESSAGE:
1147 case MATCHING_SUBJECT:
1151 case MATCHING_TO_OR_CC:
1152 case MATCHING_NEWSGROUPS:
1153 case MATCHING_INREPLYTO:
1154 case MATCHING_HEADERS_PART:
1155 case MATCHING_BODY_PART:
1156 case MATCHING_MESSAGE:
1157 gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), prop->expr);
1160 case MATCHING_AGE_GREATER:
1161 case MATCHING_AGE_LOWER:
1162 gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), itos(prop->age));
1165 case MATCHING_NOT_HEADER:
1166 case MATCHING_HEADER:
1167 gtk_entry_set_text(GTK_ENTRY(matcher.header_entry), prop->header);
1168 gtk_entry_set_text(GTK_ENTRY(matcher.value_entry), prop->expr);
1173 gtk_list_select_item(GTK_LIST(matcher.predicate_list), 1);
1175 gtk_list_select_item(GTK_LIST(matcher.predicate_list), 0);
1177 switch(prop->matchtype) {
1178 case MATCHING_MATCH:
1179 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), FALSE);
1180 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), TRUE);
1183 case MATCHING_MATCHCASE:
1184 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), FALSE);
1185 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), FALSE);
1188 case MATCHING_REGEXP:
1189 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), TRUE);
1190 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), TRUE);
1193 case MATCHING_REGEXPCASE:
1194 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_chkbtn), TRUE);
1195 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_chkbtn), FALSE);
1200 static void prefs_matcher_criteria_select(GtkList *list,
1206 value = get_sel_from_list(GTK_LIST(matcher.criteria_list));
1210 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1211 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1212 gtk_widget_set_sensitive(matcher.value_label, FALSE);
1213 gtk_widget_set_sensitive(matcher.value_entry, FALSE);
1214 gtk_widget_set_sensitive(matcher.predicate_label, FALSE);
1215 gtk_widget_set_sensitive(matcher.predicate_combo, FALSE);
1216 gtk_widget_set_sensitive(matcher.predicate_flag_combo, FALSE);
1217 gtk_widget_hide(matcher.predicate_combo);
1218 gtk_widget_show(matcher.predicate_flag_combo);
1219 gtk_widget_set_sensitive(matcher.case_chkbtn, FALSE);
1220 gtk_widget_set_sensitive(matcher.regexp_chkbtn, FALSE);
1223 case CRITERIA_UNREAD:
1225 case CRITERIA_MARKED:
1226 case CRITERIA_DELETED:
1227 case CRITERIA_REPLIED:
1228 case CRITERIA_FORWARDED:
1229 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1230 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1231 gtk_widget_set_sensitive(matcher.value_label, FALSE);
1232 gtk_widget_set_sensitive(matcher.value_entry, FALSE);
1233 gtk_widget_set_sensitive(matcher.predicate_label, TRUE);
1234 gtk_widget_set_sensitive(matcher.predicate_combo, FALSE);
1235 gtk_widget_set_sensitive(matcher.predicate_flag_combo, TRUE);
1236 gtk_widget_hide(matcher.predicate_combo);
1237 gtk_widget_show(matcher.predicate_flag_combo);
1238 gtk_widget_set_sensitive(matcher.case_chkbtn, FALSE);
1239 gtk_widget_set_sensitive(matcher.regexp_chkbtn, FALSE);
1242 case CRITERIA_SUBJECT:
1246 case CRITERIA_TO_OR_CC:
1247 case CRITERIA_NEWSGROUPS:
1248 case CRITERIA_INREPLYTO:
1249 case CRITERIA_HEADERS_PART:
1250 case CRITERIA_BODY_PART:
1251 case CRITERIA_MESSAGE:
1252 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1253 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1254 gtk_widget_set_sensitive(matcher.value_label, TRUE);
1255 gtk_widget_set_sensitive(matcher.value_entry, TRUE);
1256 gtk_widget_set_sensitive(matcher.predicate_label, TRUE);
1257 gtk_widget_set_sensitive(matcher.predicate_combo, TRUE);
1258 gtk_widget_set_sensitive(matcher.predicate_flag_combo, FALSE);
1259 gtk_widget_show(matcher.predicate_combo);
1260 gtk_widget_hide(matcher.predicate_flag_combo);
1261 gtk_widget_set_sensitive(matcher.case_chkbtn, TRUE);
1262 gtk_widget_set_sensitive(matcher.regexp_chkbtn, TRUE);
1265 case CRITERIA_AGE_GREATER:
1266 case CRITERIA_AGE_LOWER:
1267 gtk_widget_set_sensitive(matcher.header_combo, FALSE);
1268 gtk_widget_set_sensitive(matcher.header_label, FALSE);
1269 gtk_widget_set_sensitive(matcher.value_label, TRUE);
1270 gtk_widget_set_sensitive(matcher.value_entry, TRUE);
1271 gtk_widget_set_sensitive(matcher.predicate_label, FALSE);
1272 gtk_widget_set_sensitive(matcher.predicate_combo, FALSE);
1273 gtk_widget_set_sensitive(matcher.predicate_flag_combo, FALSE);
1274 gtk_widget_show(matcher.predicate_combo);
1275 gtk_widget_hide(matcher.predicate_flag_combo);
1276 gtk_widget_set_sensitive(matcher.case_chkbtn, FALSE);
1277 gtk_widget_set_sensitive(matcher.regexp_chkbtn, FALSE);
1280 case CRITERIA_HEADER:
1281 gtk_widget_set_sensitive(matcher.header_combo, TRUE);
1282 gtk_widget_set_sensitive(matcher.header_label, TRUE);
1283 gtk_widget_set_sensitive(matcher.value_label, TRUE);
1284 gtk_widget_set_sensitive(matcher.value_entry, TRUE);
1285 gtk_widget_set_sensitive(matcher.predicate_label, TRUE);
1286 gtk_widget_set_sensitive(matcher.predicate_combo, TRUE);
1287 gtk_widget_set_sensitive(matcher.predicate_flag_combo, FALSE);
1288 gtk_widget_show(matcher.predicate_combo);
1289 gtk_widget_hide(matcher.predicate_flag_combo);
1290 gtk_widget_set_sensitive(matcher.case_chkbtn, TRUE);
1291 gtk_widget_set_sensitive(matcher.regexp_chkbtn, TRUE);
1296 static void prefs_matcher_key_pressed(GtkWidget *widget, GdkEventKey *event,
1299 if (event && event->keyval == GDK_Escape)
1300 prefs_matcher_cancel();
1303 static void prefs_matcher_cancel(void)
1305 gtk_widget_hide(matcher.window);
1308 static void prefs_matcher_ok(void)
1310 MatcherList * matchers;
1312 matchers = prefs_matcher_get_list();
1313 if (matchers != NULL) {
1314 gtk_widget_hide(matcher.window);
1315 if (matchers_callback != NULL)
1316 matchers_callback(matchers);
1317 matcherlist_free(matchers);
1320 gtk_widget_hide(matcher.window);
1324 static gint prefs_matcher_deleted(GtkWidget *widget, GdkEventAny *event,
1327 prefs_matcher_cancel();