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
;
75 GtkWidget
*cond_clist
;
78 /* choice in the list */
87 CRITERIA_TO_OR_CC
= 5,
88 CRITERIA_NEWSGROUPS
= 6,
89 CRITERIA_INREPLYTO
= 7,
90 CRITERIA_REFERENCES
= 8,
91 CRITERIA_AGE_GREATER
= 9,
92 CRITERIA_AGE_LOWER
= 10,
94 CRITERIA_HEADERS_PART
= 12,
95 CRITERIA_BODY_PART
= 13,
96 CRITERIA_MESSAGE
= 14,
100 CRITERIA_MARKED
= 17,
101 CRITERIA_DELETED
= 18,
102 CRITERIA_REPLIED
= 19,
103 CRITERIA_FORWARDED
= 20,
105 CRITERIA_SCORE_GREATER
= 21,
106 CRITERIA_SCORE_LOWER
= 22,
108 CRITERIA_EXECUTE
= 23
116 gchar
* bool_op_text
[] = {
121 PREDICATE_CONTAINS
= 0,
122 PREDICATE_DOES_NOT_CONTAIN
= 1
125 gchar
* predicate_text
[] = {
126 N_("contains"), N_("does not contain")
130 PREDICATE_FLAG_ENABLED
= 0,
131 PREDICATE_FLAG_DISABLED
= 1
134 gchar
* predicate_flag_text
[] = {
138 gchar
* criteria_text
[] = {
139 N_("All messages"), N_("Subject"),
140 N_("From"), N_("To"), N_("Cc"), N_("To or Cc"),
141 N_("Newsgroups"), N_("In reply to"), N_("References"),
142 N_("Age greater than"), N_("Age lower than"),
143 N_("Header"), N_("Headers part"),
144 N_("Body part"), N_("Whole message"),
145 N_("Unread flag"), N_("New flag"),
146 N_("Marked flag"), N_("Deleted flag"),
147 N_("Replied flag"), N_("Forwarded flag"),
148 N_("Score greater than"), N_("Score lower than"),
152 static gint
get_sel_from_list(GtkList
* list
)
158 sel
= list
->selection
->data
;
159 for(child
= list
->children
; child
!= NULL
;
160 child
= g_list_next(child
)) {
161 if (child
->data
== sel
)
169 static PrefsMatcherSignal
* matchers_callback
;
172 #define VSPACING_NARROW 4
173 #define DEFAULT_ENTRY_WIDTH 80
174 #define PREFSBUFSIZE 1024
176 /* widget creating functions */
177 static void prefs_matcher_create (void);
179 static void prefs_matcher_set_dialog (MatcherList
* matchers
);
182 static void prefs_matcher_set_list (void);
183 static gint prefs_matcher_clist_set_row (gint row);
186 /* callback functions */
189 static void prefs_matcher_select_dest_cb (void);
191 static void prefs_matcher_register_cb (void);
192 static void prefs_matcher_substitute_cb (void);
193 static void prefs_matcher_delete_cb (void);
194 static void prefs_matcher_up (void);
195 static void prefs_matcher_down (void);
196 static void prefs_matcher_select (GtkCList
*clist
,
201 static void prefs_matcher_key_pressed (GtkWidget
*widget
,
204 static void prefs_matcher_ok (void);
205 static void prefs_matcher_cancel (void);
206 static gint
prefs_matcher_deleted(GtkWidget
*widget
, GdkEventAny
*event
,
208 static void prefs_matcher_criteria_select(GtkList
*list
,
211 static MatcherList
* prefs_matcher_get_list(void);
212 static void prefs_matcher_exec_info_create(void);
214 void prefs_matcher_open(MatcherList
* matchers
, PrefsMatcherSignal
* cb
)
216 inc_autocheck_timer_remove();
218 if (!matcher
.window
) {
219 prefs_matcher_create();
222 manage_window_set_transient(GTK_WINDOW(matcher
.window
));
223 gtk_widget_grab_focus(matcher
.ok_btn
);
225 matchers_callback
= cb
;
227 prefs_matcher_set_dialog(matchers
);
229 gtk_widget_show(matcher
.window
);
232 static void prefs_matcher_create(void)
237 GtkWidget
*cancel_btn
;
238 GtkWidget
*confirm_area
;
247 GtkWidget
*header_combo
;
248 GtkWidget
*header_entry
;
249 GtkWidget
*header_label
;
250 GtkWidget
*criteria_combo
;
251 GtkWidget
*criteria_list
;
252 GtkWidget
*criteria_label
;
253 GtkWidget
*value_label
;
254 GtkWidget
*value_entry
;
255 GtkWidget
*predicate_combo
;
256 GtkWidget
*predicate_list
;
257 GtkWidget
*predicate_flag_combo
;
258 GtkWidget
*predicate_flag_list
;
259 GtkWidget
*predicate_label
;
260 GtkWidget
*bool_op_combo
;
261 GtkWidget
*bool_op_list
;
262 GtkWidget
*bool_op_label
;
264 GtkWidget
*regexp_chkbtn
;
265 GtkWidget
*case_chkbtn
;
271 GtkWidget
*subst_btn
;
274 GtkWidget
*cond_hbox
;
275 GtkWidget
*cond_scrolledwin
;
276 GtkWidget
*cond_clist
;
287 gchar
*title
[] = {_("Registered rules")};
289 debug_print(_("Creating matcher setting window...\n"));
291 window
= gtk_window_new (GTK_WINDOW_DIALOG
);
292 gtk_container_set_border_width (GTK_CONTAINER (window
), 8);
293 gtk_window_position (GTK_WINDOW (window
), GTK_WIN_POS_CENTER
);
294 gtk_window_set_modal (GTK_WINDOW (window
), TRUE
);
295 gtk_window_set_policy (GTK_WINDOW (window
), FALSE
, TRUE
, FALSE
);
297 vbox
= gtk_vbox_new (FALSE
, 6);
298 gtk_widget_show (vbox
);
299 gtk_container_add (GTK_CONTAINER (window
), vbox
);
301 gtkut_button_set_create(&confirm_area
, &ok_btn
, _("OK"),
302 &cancel_btn
, _("Cancel"), NULL
, NULL
);
303 gtk_widget_show (confirm_area
);
304 gtk_box_pack_end (GTK_BOX(vbox
), confirm_area
, FALSE
, FALSE
, 0);
305 gtk_widget_grab_default (ok_btn
);
307 gtk_window_set_title (GTK_WINDOW(window
),
308 _("Condition setting"));
309 gtk_signal_connect (GTK_OBJECT(window
), "delete_event",
310 GTK_SIGNAL_FUNC(prefs_matcher_deleted
), NULL
);
311 gtk_signal_connect (GTK_OBJECT(window
), "key_press_event",
312 GTK_SIGNAL_FUNC(prefs_matcher_key_pressed
), NULL
);
313 gtk_signal_connect (GTK_OBJECT(window
), "focus_in_event",
314 GTK_SIGNAL_FUNC(manage_window_focus_in
), NULL
);
315 gtk_signal_connect (GTK_OBJECT(window
), "focus_out_event",
316 GTK_SIGNAL_FUNC(manage_window_focus_out
), NULL
);
317 gtk_signal_connect (GTK_OBJECT(ok_btn
), "clicked",
318 GTK_SIGNAL_FUNC(prefs_matcher_ok
), NULL
);
319 gtk_signal_connect (GTK_OBJECT(cancel_btn
), "clicked",
320 GTK_SIGNAL_FUNC(prefs_matcher_cancel
), NULL
);
322 vbox1
= gtk_vbox_new (FALSE
, VSPACING
);
323 gtk_widget_show (vbox1
);
324 gtk_box_pack_start (GTK_BOX (vbox
), vbox1
, TRUE
, TRUE
, 0);
325 gtk_container_set_border_width (GTK_CONTAINER (vbox1
), 2);
327 table1
= gtk_table_new (2, 4, FALSE
);
328 gtk_widget_show (table1
);
330 gtk_box_pack_start (GTK_BOX (vbox1
), table1
, FALSE
, FALSE
, 0);
331 gtk_table_set_row_spacings (GTK_TABLE (table1
), 8);
332 gtk_table_set_col_spacings (GTK_TABLE (table1
), 8);
334 /* criteria combo box */
336 criteria_label
= gtk_label_new (_("Match type"));
337 gtk_widget_show (criteria_label
);
338 gtk_misc_set_alignment (GTK_MISC (criteria_label
), 0, 0.5);
339 gtk_table_attach (GTK_TABLE (table1
), criteria_label
, 0, 1, 0, 1,
342 criteria_combo
= gtk_combo_new ();
343 gtk_widget_show (criteria_combo
);
347 for(i
= 0 ; i
< (gint
) (sizeof(criteria_text
) / sizeof(gchar
*)) ;
349 combo_items
= g_list_append(combo_items
,
350 (gpointer
) _(criteria_text
[i
]));
352 gtk_combo_set_popdown_strings(GTK_COMBO(criteria_combo
), combo_items
);
354 g_list_free(combo_items
);
356 gtk_widget_set_usize (criteria_combo
, 120, -1);
357 gtk_table_attach (GTK_TABLE (table1
), criteria_combo
, 0, 1, 1, 2,
359 criteria_list
= GTK_COMBO(criteria_combo
)->list
;
360 gtk_signal_connect (GTK_OBJECT (criteria_list
), "select-child",
361 GTK_SIGNAL_FUNC (prefs_matcher_criteria_select
),
364 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(criteria_combo
)->entry
),
369 header_label
= gtk_label_new (_("Header name"));
370 gtk_widget_show (header_label
);
371 gtk_misc_set_alignment (GTK_MISC (header_label
), 0, 0.5);
372 gtk_table_attach (GTK_TABLE (table1
), header_label
, 1, 2, 0, 1,
375 header_combo
= gtk_combo_new ();
376 gtk_widget_show (header_combo
);
377 gtk_widget_set_usize (header_combo
, 96, -1);
378 gtkut_combo_set_items (GTK_COMBO (header_combo
),
379 "Subject", "From", "To", "Cc", "Reply-To",
380 "Sender", "X-ML-Name", "X-List", "X-Sequence",
383 gtk_table_attach (GTK_TABLE (table1
), header_combo
, 1, 2, 1, 2,
385 header_entry
= GTK_COMBO (header_combo
)->entry
;
386 gtk_entry_set_editable (GTK_ENTRY (header_entry
), TRUE
);
390 value_label
= gtk_label_new (_("Value"));
391 gtk_widget_show (value_label
);
392 gtk_misc_set_alignment (GTK_MISC (value_label
), 0, 0.5);
393 gtk_table_attach (GTK_TABLE (table1
), value_label
, 2, 3, 0, 1,
394 GTK_FILL
| GTK_SHRINK
| GTK_EXPAND
, 0, 0, 0);
396 value_entry
= gtk_entry_new ();
397 gtk_widget_show (value_entry
);
398 gtk_widget_set_usize (value_entry
, 200, -1);
399 gtk_table_attach (GTK_TABLE (table1
), value_entry
, 2, 3, 1, 2,
400 GTK_FILL
| GTK_SHRINK
| GTK_EXPAND
, 0, 0, 0);
402 exec_btn
= gtk_button_new_with_label (_("Info ..."));
403 gtk_widget_show (exec_btn
);
404 gtk_table_attach (GTK_TABLE (table1
), exec_btn
, 3, 4, 1, 2,
405 GTK_FILL
| GTK_SHRINK
| GTK_EXPAND
, 0, 0, 0);
406 gtk_signal_connect (GTK_OBJECT (exec_btn
), "clicked",
407 GTK_SIGNAL_FUNC (prefs_matcher_exec_info
),
412 vbox2
= gtk_vbox_new (FALSE
, VSPACING
);
413 gtk_widget_show (vbox2
);
414 gtk_box_pack_start (GTK_BOX (vbox1
), vbox2
, FALSE
, FALSE
, 0);
416 hbox1
= gtk_hbox_new (FALSE
, 8);
417 gtk_widget_show (hbox1
);
418 gtk_box_pack_start (GTK_BOX (vbox2
), hbox1
, FALSE
, FALSE
, 0);
420 predicate_label
= gtk_label_new (_("Predicate"));
421 gtk_widget_show (predicate_label
);
422 gtk_box_pack_start (GTK_BOX (hbox1
), predicate_label
,
425 predicate_combo
= gtk_combo_new ();
426 gtk_widget_show (predicate_combo
);
427 gtk_widget_set_usize (predicate_combo
, 120, -1);
428 predicate_list
= GTK_COMBO(predicate_combo
)->list
;
429 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(predicate_combo
)->entry
),
434 for(i
= 0 ; i
< (gint
) (sizeof(predicate_text
) / sizeof(gchar
*)) ;
436 combo_items
= g_list_append(combo_items
,
437 (gpointer
) _(predicate_text
[i
]));
439 gtk_combo_set_popdown_strings(GTK_COMBO(predicate_combo
), combo_items
);
441 g_list_free(combo_items
);
443 gtk_box_pack_start (GTK_BOX (hbox1
), predicate_combo
,
448 predicate_flag_combo
= gtk_combo_new ();
449 gtk_widget_hide (predicate_flag_combo
);
450 gtk_widget_set_usize (predicate_flag_combo
, 120, -1);
451 predicate_flag_list
= GTK_COMBO(predicate_flag_combo
)->list
;
452 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(predicate_flag_combo
)->entry
), FALSE
);
456 for(i
= 0 ; i
< (gint
) (sizeof(predicate_text
) / sizeof(gchar
*)) ;
458 combo_items
= g_list_append(combo_items
, (gpointer
) _(predicate_flag_text
[i
]));
460 gtk_combo_set_popdown_strings(GTK_COMBO(predicate_flag_combo
),
463 g_list_free(combo_items
);
465 gtk_box_pack_start (GTK_BOX (hbox1
), predicate_flag_combo
,
468 vbox3
= gtk_vbox_new (FALSE
, 0);
469 gtk_widget_show (vbox3
);
470 gtk_box_pack_start (GTK_BOX (hbox1
), vbox3
, FALSE
, FALSE
, 0);
472 PACK_CHECK_BUTTON (vbox3
, case_chkbtn
, _("Case sensitive"));
473 PACK_CHECK_BUTTON (vbox3
, regexp_chkbtn
, _("Use regexp"));
475 /* register / substitute / delete */
477 reg_hbox
= gtk_hbox_new (FALSE
, 4);
478 gtk_widget_show (reg_hbox
);
479 gtk_box_pack_start (GTK_BOX (vbox1
), reg_hbox
, FALSE
, FALSE
, 0);
481 arrow
= gtk_arrow_new (GTK_ARROW_DOWN
, GTK_SHADOW_OUT
);
482 gtk_widget_show (arrow
);
483 gtk_box_pack_start (GTK_BOX (reg_hbox
), arrow
, FALSE
, FALSE
, 0);
484 gtk_widget_set_usize (arrow
, -1, 16);
486 btn_hbox
= gtk_hbox_new (TRUE
, 4);
487 gtk_widget_show (btn_hbox
);
488 gtk_box_pack_start (GTK_BOX (reg_hbox
), btn_hbox
, FALSE
, FALSE
, 0);
490 reg_btn
= gtk_button_new_with_label (_("Register"));
491 gtk_widget_show (reg_btn
);
492 gtk_box_pack_start (GTK_BOX (btn_hbox
), reg_btn
, FALSE
, TRUE
, 0);
493 gtk_signal_connect (GTK_OBJECT (reg_btn
), "clicked",
494 GTK_SIGNAL_FUNC (prefs_matcher_register_cb
), NULL
);
496 subst_btn
= gtk_button_new_with_label (_(" Substitute "));
497 gtk_widget_show (subst_btn
);
498 gtk_box_pack_start (GTK_BOX (btn_hbox
), subst_btn
, FALSE
, TRUE
, 0);
499 gtk_signal_connect (GTK_OBJECT (subst_btn
), "clicked",
500 GTK_SIGNAL_FUNC (prefs_matcher_substitute_cb
),
503 del_btn
= gtk_button_new_with_label (_("Delete"));
504 gtk_widget_show (del_btn
);
505 gtk_box_pack_start (GTK_BOX (btn_hbox
), del_btn
, FALSE
, TRUE
, 0);
506 gtk_signal_connect (GTK_OBJECT (del_btn
), "clicked",
507 GTK_SIGNAL_FUNC (prefs_matcher_delete_cb
), NULL
);
509 /* boolean operation */
511 bool_op_label
= gtk_label_new (_("Boolean Op"));
512 gtk_misc_set_alignment (GTK_MISC (value_label
), 0, 0.5);
513 gtk_widget_show (bool_op_label
);
514 gtk_box_pack_start (GTK_BOX (btn_hbox
), bool_op_label
,
517 bool_op_combo
= gtk_combo_new ();
518 gtk_widget_show (bool_op_combo
);
519 gtk_widget_set_usize (bool_op_combo
, 50, -1);
520 bool_op_list
= GTK_COMBO(bool_op_combo
)->list
;
521 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(bool_op_combo
)->entry
),
526 for(i
= 0 ; i
< (gint
) (sizeof(bool_op_text
) / sizeof(gchar
*)) ;
528 combo_items
= g_list_append(combo_items
,
529 (gpointer
) _(bool_op_text
[i
]));
531 gtk_combo_set_popdown_strings(GTK_COMBO(bool_op_combo
), combo_items
);
533 g_list_free(combo_items
);
535 gtk_box_pack_start (GTK_BOX (btn_hbox
), bool_op_combo
,
538 cond_hbox
= gtk_hbox_new (FALSE
, 8);
539 gtk_widget_show (cond_hbox
);
540 gtk_box_pack_start (GTK_BOX (vbox1
), cond_hbox
, TRUE
, TRUE
, 0);
542 cond_scrolledwin
= gtk_scrolled_window_new (NULL
, NULL
);
543 gtk_widget_show (cond_scrolledwin
);
544 gtk_widget_set_usize (cond_scrolledwin
, -1, 150);
545 gtk_box_pack_start (GTK_BOX (cond_hbox
), cond_scrolledwin
,
547 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (cond_scrolledwin
),
548 GTK_POLICY_AUTOMATIC
,
549 GTK_POLICY_AUTOMATIC
);
551 cond_clist
= gtk_clist_new_with_titles(1, title
);
552 gtk_widget_show (cond_clist
);
553 gtk_container_add (GTK_CONTAINER (cond_scrolledwin
), cond_clist
);
554 gtk_clist_set_column_width (GTK_CLIST (cond_clist
), 0, 80);
555 gtk_clist_set_selection_mode (GTK_CLIST (cond_clist
),
556 GTK_SELECTION_BROWSE
);
557 GTK_WIDGET_UNSET_FLAGS (GTK_CLIST (cond_clist
)->column
[0].button
,
559 gtk_signal_connect (GTK_OBJECT (cond_clist
), "select_row",
560 GTK_SIGNAL_FUNC (prefs_matcher_select
), NULL
);
562 btn_vbox
= gtk_vbox_new (FALSE
, 8);
563 gtk_widget_show (btn_vbox
);
564 gtk_box_pack_start (GTK_BOX (cond_hbox
), btn_vbox
, FALSE
, FALSE
, 0);
566 up_btn
= gtk_button_new_with_label (_("Up"));
567 gtk_widget_show (up_btn
);
568 gtk_box_pack_start (GTK_BOX (btn_vbox
), up_btn
, FALSE
, FALSE
, 0);
569 gtk_signal_connect (GTK_OBJECT (up_btn
), "clicked",
570 GTK_SIGNAL_FUNC (prefs_matcher_up
), NULL
);
572 down_btn
= gtk_button_new_with_label (_("Down"));
573 gtk_widget_show (down_btn
);
574 gtk_box_pack_start (GTK_BOX (btn_vbox
), down_btn
, FALSE
, FALSE
, 0);
575 gtk_signal_connect (GTK_OBJECT (down_btn
), "clicked",
576 GTK_SIGNAL_FUNC (prefs_matcher_down
), NULL
);
578 gtk_widget_show_all(window
);
580 matcher
.window
= window
;
582 matcher
.ok_btn
= ok_btn
;
584 matcher
.criteria_list
= criteria_list
;
585 matcher
.header_combo
= header_combo
;
586 matcher
.header_entry
= header_entry
;
587 matcher
.header_label
= header_label
;
588 matcher
.value_entry
= value_entry
;
589 matcher
.value_label
= value_label
;
590 matcher
.predicate_label
= predicate_label
;
591 matcher
.predicate_list
= predicate_list
;
592 matcher
.predicate_combo
= predicate_combo
;
593 matcher
.predicate_flag_list
= predicate_flag_list
;
594 matcher
.predicate_flag_combo
= predicate_flag_combo
;
595 matcher
.case_chkbtn
= case_chkbtn
;
596 matcher
.regexp_chkbtn
= regexp_chkbtn
;
597 matcher
.bool_op_list
= bool_op_list
;
598 matcher
.exec_btn
= exec_btn
;
600 matcher
.cond_clist
= cond_clist
;
603 static gint
prefs_matcher_clist_set_row(gint row
, MatcherProp
* prop
)
605 GtkCList
*clist
= GTK_CLIST(matcher
.cond_clist
);
610 cond_str
[0] = _("(New)");
611 return gtk_clist_append(clist
, cond_str
);
614 matcher_str
= matcherprop_to_string(prop
);
615 cond_str
[0] = matcher_str
;
617 row
= gtk_clist_append(clist
, cond_str
);
619 gtk_clist_set_text(clist
, row
, 0, cond_str
[0]);
625 static void prefs_matcher_reset_condition(void)
627 gtk_list_select_item(GTK_LIST(matcher
.criteria_list
), 0);
628 gtk_list_select_item(GTK_LIST(matcher
.predicate_list
), 0);
629 gtk_entry_set_text(GTK_ENTRY(matcher
.header_entry
), "");
630 gtk_entry_set_text(GTK_ENTRY(matcher
.value_entry
), "");
633 static void prefs_matcher_update_hscrollbar(void)
635 gint optwidth
= gtk_clist_optimal_column_width(GTK_CLIST(matcher
.cond_clist
), 0);
636 gtk_clist_set_column_width(GTK_CLIST(matcher
.cond_clist
), 0, optwidth
);
639 static void prefs_matcher_set_dialog(MatcherList
* matchers
)
641 GtkCList
*clist
= GTK_CLIST(matcher
.cond_clist
);
643 gboolean bool_op
= 1;
645 gtk_clist_freeze(clist
);
646 gtk_clist_clear(clist
);
648 prefs_matcher_clist_set_row(-1, NULL
);
649 if (matchers
!= NULL
) {
650 for (cur
= matchers
->matchers
; cur
!= NULL
;
651 cur
= g_slist_next(cur
)) {
653 prop
= (MatcherProp
*) cur
->data
;
654 prefs_matcher_clist_set_row(-1, prop
);
657 bool_op
= matchers
->bool_and
;
660 prefs_matcher_update_hscrollbar();
662 gtk_clist_thaw(clist
);
664 gtk_list_select_item(GTK_LIST(matcher
.bool_op_list
), bool_op
);
666 prefs_matcher_reset_condition();
669 static MatcherList
* prefs_matcher_get_list(void)
676 GSList
* matcher_list
;
677 MatcherList
* matchers
;
681 while (gtk_clist_get_text(GTK_CLIST(matcher
.cond_clist
),
682 row
, 0, &matcher_str
)) {
684 if (strcmp(matcher_str
, _("(New)")) != 0) {
686 prop
= matcherprop_parse(&tmp
);
691 matcher_list
= g_slist_append(matcher_list
, prop
);
696 bool_and
= get_sel_from_list(GTK_LIST(matcher
.bool_op_list
));
698 matchers
= matcherlist_new(matcher_list
, bool_and
);
703 static gint
prefs_matcher_get_criteria_from_matching(gint matching_id
)
705 switch(matching_id
) {
708 case MATCHING_NOT_UNREAD
:
709 case MATCHING_UNREAD
:
710 return CRITERIA_UNREAD
;
711 case MATCHING_NOT_NEW
:
714 case MATCHING_NOT_MARKED
:
715 case MATCHING_MARKED
:
716 return CRITERIA_MARKED
;
717 case MATCHING_NOT_DELETED
:
718 case MATCHING_DELETED
:
719 return CRITERIA_DELETED
;
721 case MATCHING_NOT_REPLIED
:
722 case MATCHING_REPLIED
:
723 return CRITERIA_REPLIED
;
724 case MATCHING_NOT_FORWARDED
:
725 case MATCHING_FORWARDED
:
726 return CRITERIA_FORWARDED
;
727 case MATCHING_NOT_SUBJECT
:
728 case MATCHING_SUBJECT
:
729 return CRITERIA_SUBJECT
;
730 case MATCHING_NOT_FROM
:
732 return CRITERIA_FROM
;
733 case MATCHING_NOT_TO
:
736 case MATCHING_NOT_CC
:
739 case MATCHING_NOT_NEWSGROUPS
:
740 case MATCHING_NEWSGROUPS
:
741 return CRITERIA_NEWSGROUPS
;
742 case MATCHING_NOT_INREPLYTO
:
743 case MATCHING_INREPLYTO
:
744 return CRITERIA_INREPLYTO
;
745 case MATCHING_NOT_REFERENCES
:
746 case MATCHING_REFERENCES
:
747 return CRITERIA_REFERENCES
;
748 case MATCHING_NOT_TO_AND_NOT_CC
:
749 case MATCHING_TO_OR_CC
:
750 return CRITERIA_TO_OR_CC
;
751 case MATCHING_NOT_BODY_PART
:
752 case MATCHING_BODY_PART
:
753 return CRITERIA_BODY_PART
;
754 case MATCHING_NOT_MESSAGE
:
755 case MATCHING_MESSAGE
:
756 return CRITERIA_MESSAGE
;
758 case MATCHING_NOT_HEADERS_PART
:
759 case MATCHING_HEADERS_PART
:
760 return CRITERIA_HEADERS_PART
;
761 case MATCHING_NOT_HEADER
:
762 case MATCHING_HEADER
:
763 return CRITERIA_HEADER
;
764 case MATCHING_AGE_GREATER
:
765 return CRITERIA_AGE_GREATER
;
766 case MATCHING_AGE_LOWER
:
767 return CRITERIA_AGE_LOWER
;
768 case MATCHING_SCORE_GREATER
:
769 return CRITERIA_SCORE_GREATER
;
770 case MATCHING_SCORE_LOWER
:
771 return CRITERIA_SCORE_LOWER
;
772 case MATCHING_NOT_EXECUTE
:
773 case MATCHING_EXECUTE
:
774 return CRITERIA_EXECUTE
;
781 static gint
prefs_matcher_get_matching_from_criteria(gint criteria_id
)
783 switch (criteria_id
) {
786 case CRITERIA_UNREAD
:
787 return MATCHING_UNREAD
;
790 case CRITERIA_MARKED
:
791 return MATCHING_MARKED
;
792 case CRITERIA_DELETED
:
793 return MATCHING_DELETED
;
794 case CRITERIA_REPLIED
:
795 return MATCHING_REPLIED
;
796 case CRITERIA_FORWARDED
:
797 return MATCHING_FORWARDED
;
798 case CRITERIA_SUBJECT
:
799 return MATCHING_SUBJECT
;
801 return MATCHING_FROM
;
806 case CRITERIA_TO_OR_CC
:
807 return MATCHING_TO_OR_CC
;
808 case CRITERIA_NEWSGROUPS
:
809 return MATCHING_NEWSGROUPS
;
810 case CRITERIA_INREPLYTO
:
811 return MATCHING_INREPLYTO
;
812 case CRITERIA_REFERENCES
:
813 return MATCHING_REFERENCES
;
814 case CRITERIA_AGE_GREATER
:
815 return MATCHING_AGE_GREATER
;
816 case CRITERIA_AGE_LOWER
:
817 return MATCHING_AGE_LOWER
;
818 case CRITERIA_SCORE_GREATER
:
819 return MATCHING_SCORE_GREATER
;
820 case CRITERIA_SCORE_LOWER
:
821 return MATCHING_SCORE_LOWER
;
822 case CRITERIA_HEADER
:
823 return MATCHING_HEADER
;
824 case CRITERIA_HEADERS_PART
:
825 return MATCHING_HEADERS_PART
;
826 case CRITERIA_BODY_PART
:
827 return MATCHING_BODY_PART
;
828 case CRITERIA_MESSAGE
:
829 return MATCHING_MESSAGE
;
830 case CRITERIA_EXECUTE
:
831 return MATCHING_EXECUTE
;
837 static gint
prefs_matcher_not_criteria(gint matcher_criteria
)
839 switch(matcher_criteria
) {
840 case MATCHING_UNREAD
:
841 return MATCHING_NOT_UNREAD
;
843 return MATCHING_NOT_NEW
;
844 case MATCHING_MARKED
:
845 return MATCHING_NOT_MARKED
;
846 case MATCHING_DELETED
:
847 return MATCHING_NOT_DELETED
;
848 case MATCHING_REPLIED
:
849 return MATCHING_NOT_REPLIED
;
850 case MATCHING_FORWARDED
:
851 return MATCHING_NOT_FORWARDED
;
852 case MATCHING_SUBJECT
:
853 return MATCHING_NOT_SUBJECT
;
855 return MATCHING_NOT_FROM
;
857 return MATCHING_NOT_TO
;
859 return MATCHING_NOT_CC
;
860 case MATCHING_TO_OR_CC
:
861 return MATCHING_NOT_TO_AND_NOT_CC
;
862 case MATCHING_NEWSGROUPS
:
863 return MATCHING_NOT_NEWSGROUPS
;
864 case MATCHING_INREPLYTO
:
865 return MATCHING_NOT_INREPLYTO
;
866 case MATCHING_REFERENCES
:
867 return MATCHING_NOT_REFERENCES
;
868 case MATCHING_HEADER
:
869 return MATCHING_NOT_HEADER
;
870 case MATCHING_HEADERS_PART
:
871 return MATCHING_NOT_HEADERS_PART
;
872 case MATCHING_MESSAGE
:
873 return MATCHING_NOT_MESSAGE
;
874 case MATCHING_EXECUTE
:
875 return MATCHING_NOT_EXECUTE
;
876 case MATCHING_BODY_PART
:
877 return MATCHING_NOT_BODY_PART
;
879 return matcher_criteria
;
883 static MatcherProp
* prefs_matcher_dialog_to_matcher()
885 MatcherProp
* matcherprop
;
889 gint value_pred_flag
;
892 gboolean case_sensitive
;
898 value_criteria
= get_sel_from_list(GTK_LIST(matcher
.criteria_list
));
900 criteria
= prefs_matcher_get_matching_from_criteria(value_criteria
);
902 value_pred
= get_sel_from_list(GTK_LIST(matcher
.predicate_list
));
903 value_pred_flag
= get_sel_from_list(GTK_LIST(matcher
.predicate_flag_list
));
905 use_regexp
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher
.regexp_chkbtn
));
906 case_sensitive
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher
.case_chkbtn
));
908 switch (value_criteria
) {
909 case CRITERIA_UNREAD
:
911 case CRITERIA_MARKED
:
912 case CRITERIA_DELETED
:
913 case CRITERIA_REPLIED
:
914 case CRITERIA_FORWARDED
:
915 if (value_pred_flag
== PREDICATE_FLAG_DISABLED
)
916 criteria
= prefs_matcher_not_criteria(criteria
);
918 case CRITERIA_SUBJECT
:
922 case CRITERIA_TO_OR_CC
:
923 case CRITERIA_NEWSGROUPS
:
924 case CRITERIA_INREPLYTO
:
925 case CRITERIA_REFERENCES
:
926 case CRITERIA_HEADERS_PART
:
927 case CRITERIA_BODY_PART
:
928 case CRITERIA_MESSAGE
:
929 case CRITERIA_EXECUTE
:
930 case CRITERIA_AGE_GREATER
:
931 case CRITERIA_AGE_LOWER
:
932 case CRITERIA_HEADER
:
933 if (value_pred
== PREDICATE_DOES_NOT_CONTAIN
)
934 criteria
= prefs_matcher_not_criteria(criteria
);
940 matchtype
= MATCHING_REGEXP
;
942 matchtype
= MATCHING_REGEXPCASE
;
946 matchtype
= MATCHING_MATCH
;
948 matchtype
= MATCHING_MATCHCASE
;
955 switch (value_criteria
) {
957 case CRITERIA_UNREAD
:
959 case CRITERIA_MARKED
:
960 case CRITERIA_DELETED
:
961 case CRITERIA_REPLIED
:
962 case CRITERIA_FORWARDED
:
965 case CRITERIA_SUBJECT
:
969 case CRITERIA_TO_OR_CC
:
970 case CRITERIA_NEWSGROUPS
:
971 case CRITERIA_INREPLYTO
:
972 case CRITERIA_REFERENCES
:
973 case CRITERIA_HEADERS_PART
:
974 case CRITERIA_BODY_PART
:
975 case CRITERIA_MESSAGE
:
976 case CRITERIA_EXECUTE
:
977 expr
= gtk_entry_get_text(GTK_ENTRY(matcher
.value_entry
));
981 alertpanel_error(_("Match string is not set."));
987 case CRITERIA_AGE_GREATER
:
988 case CRITERIA_AGE_LOWER
:
989 case CRITERIA_SCORE_GREATER
:
990 case CRITERIA_SCORE_LOWER
:
991 value_str
= gtk_entry_get_text(GTK_ENTRY(matcher
.value_entry
));
993 if (*value_str
== '\0') {
994 alertpanel_error(_("Value is not set."));
998 value
= atoi(value_str
);
1002 case CRITERIA_HEADER
:
1004 header
= gtk_entry_get_text(GTK_ENTRY(matcher
.header_entry
));
1005 expr
= gtk_entry_get_text(GTK_ENTRY(matcher
.value_entry
));
1007 if (*header
== '\0') {
1008 alertpanel_error(_("Header name is not set."));
1012 if (*expr == '\0') {
1013 alertpanel_error(_("Match string is not set."));
1020 matcherprop
= matcherprop_new(criteria
, header
, matchtype
,
1026 static void prefs_matcher_register_cb(void)
1028 MatcherProp
* matcherprop
;
1030 matcherprop
= prefs_matcher_dialog_to_matcher();
1031 if (matcherprop
== NULL
)
1034 prefs_matcher_clist_set_row(-1, matcherprop
);
1036 matcherprop_free(matcherprop
);
1038 prefs_matcher_reset_condition();
1039 prefs_matcher_update_hscrollbar();
1042 static void prefs_matcher_substitute_cb(void)
1044 GtkCList
*clist
= GTK_CLIST(matcher
.cond_clist
);
1046 MatcherProp
* matcherprop
;
1048 row
= GPOINTER_TO_INT(clist
->selection
->data
);
1052 matcherprop
= prefs_matcher_dialog_to_matcher();
1053 if (matcherprop
== NULL
)
1056 prefs_matcher_clist_set_row(row
, matcherprop
);
1058 matcherprop_free(matcherprop
);
1060 prefs_matcher_reset_condition();
1062 prefs_matcher_update_hscrollbar();
1065 static void prefs_matcher_delete_cb(void)
1067 GtkCList
*clist
= GTK_CLIST(matcher
.cond_clist
);
1070 if (!clist
->selection
) return;
1071 row
= GPOINTER_TO_INT(clist
->selection
->data
);
1075 gtk_clist_remove(clist
, row
);
1077 prefs_matcher_update_hscrollbar();
1080 static void prefs_matcher_up(void)
1082 GtkCList
*clist
= GTK_CLIST(matcher
.cond_clist
);
1085 if (!clist
->selection
) return;
1087 row
= GPOINTER_TO_INT(clist
->selection
->data
);
1089 gtk_clist_row_move(clist
, row
, row
- 1);
1090 if(gtk_clist_row_is_visible(clist
, row
- 1) != GTK_VISIBILITY_FULL
) {
1091 gtk_clist_moveto(clist
, row
- 1, 0, 0, 0);
1096 static void prefs_matcher_down(void)
1098 GtkCList
*clist
= GTK_CLIST(matcher
.cond_clist
);
1101 if (!clist
->selection
) return;
1103 row
= GPOINTER_TO_INT(clist
->selection
->data
);
1104 if (row
>= 1 && row
< clist
->rows
- 1) {
1105 gtk_clist_row_move(clist
, row
, row
+ 1);
1106 if(gtk_clist_row_is_visible(clist
, row
+ 1) != GTK_VISIBILITY_FULL
) {
1107 gtk_clist_moveto(clist
, row
+ 1, 0, 1, 0);
1112 static void prefs_matcher_select(GtkCList
*clist
, gint row
, gint column
,
1115 gchar
* matcher_str
;
1118 gboolean negative_cond
;
1121 if (!gtk_clist_get_text(GTK_CLIST(matcher
.cond_clist
),
1122 row
, 0, &matcher_str
))
1125 negative_cond
= FALSE
;
1128 prefs_matcher_reset_condition();
1133 prop
= matcherprop_parse(&tmp
);
1137 criteria
= prefs_matcher_get_criteria_from_matching(prop
->criteria
);
1139 gtk_list_select_item(GTK_LIST(matcher
.criteria_list
),
1142 switch(prop
->criteria
) {
1143 case MATCHING_NOT_UNREAD
:
1144 case MATCHING_NOT_NEW
:
1145 case MATCHING_NOT_MARKED
:
1146 case MATCHING_NOT_DELETED
:
1147 case MATCHING_NOT_REPLIED
:
1148 case MATCHING_NOT_FORWARDED
:
1149 case MATCHING_NOT_SUBJECT
:
1150 case MATCHING_NOT_FROM
:
1151 case MATCHING_NOT_TO
:
1152 case MATCHING_NOT_CC
:
1153 case MATCHING_NOT_NEWSGROUPS
:
1154 case MATCHING_NOT_INREPLYTO
:
1155 case MATCHING_NOT_REFERENCES
:
1156 case MATCHING_NOT_TO_AND_NOT_CC
:
1157 case MATCHING_NOT_BODY_PART
:
1158 case MATCHING_NOT_MESSAGE
:
1159 case MATCHING_NOT_HEADERS_PART
:
1160 case MATCHING_NOT_HEADER
:
1161 negative_cond
= TRUE
;
1165 switch(prop
->criteria
) {
1169 case MATCHING_NOT_SUBJECT
:
1170 case MATCHING_NOT_FROM
:
1171 case MATCHING_NOT_TO
:
1172 case MATCHING_NOT_CC
:
1173 case MATCHING_NOT_TO_AND_NOT_CC
:
1174 case MATCHING_NOT_NEWSGROUPS
:
1175 case MATCHING_NOT_INREPLYTO
:
1176 case MATCHING_NOT_REFERENCES
:
1177 case MATCHING_NOT_HEADERS_PART
:
1178 case MATCHING_NOT_BODY_PART
:
1179 case MATCHING_NOT_MESSAGE
:
1180 case MATCHING_SUBJECT
:
1184 case MATCHING_TO_OR_CC
:
1185 case MATCHING_NEWSGROUPS
:
1186 case MATCHING_INREPLYTO
:
1187 case MATCHING_REFERENCES
:
1188 case MATCHING_HEADERS_PART
:
1189 case MATCHING_BODY_PART
:
1190 case MATCHING_MESSAGE
:
1191 gtk_entry_set_text(GTK_ENTRY(matcher
.value_entry
), prop
->expr
);
1194 case MATCHING_AGE_GREATER
:
1195 case MATCHING_AGE_LOWER
:
1196 case MATCHING_SCORE_GREATER
:
1197 case MATCHING_SCORE_LOWER
:
1198 gtk_entry_set_text(GTK_ENTRY(matcher
.value_entry
), itos(prop
->value
));
1201 case MATCHING_NOT_HEADER
:
1202 case MATCHING_HEADER
:
1203 gtk_entry_set_text(GTK_ENTRY(matcher
.header_entry
), prop
->header
);
1204 gtk_entry_set_text(GTK_ENTRY(matcher
.value_entry
), prop
->expr
);
1209 gtk_list_select_item(GTK_LIST(matcher
.predicate_list
), 1);
1211 gtk_list_select_item(GTK_LIST(matcher
.predicate_list
), 0);
1213 switch(prop
->matchtype
) {
1214 case MATCHING_MATCH
:
1215 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher
.regexp_chkbtn
), FALSE
);
1216 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher
.case_chkbtn
), TRUE
);
1219 case MATCHING_MATCHCASE
:
1220 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher
.regexp_chkbtn
), FALSE
);
1221 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher
.case_chkbtn
), FALSE
);
1224 case MATCHING_REGEXP
:
1225 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher
.regexp_chkbtn
), TRUE
);
1226 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher
.case_chkbtn
), TRUE
);
1229 case MATCHING_REGEXPCASE
:
1230 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher
.regexp_chkbtn
), TRUE
);
1231 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher
.case_chkbtn
), FALSE
);
1236 static void prefs_matcher_criteria_select(GtkList
*list
,
1242 value
= get_sel_from_list(GTK_LIST(matcher
.criteria_list
));
1246 gtk_widget_set_sensitive(matcher
.header_combo
, FALSE
);
1247 gtk_widget_set_sensitive(matcher
.header_label
, FALSE
);
1248 gtk_widget_set_sensitive(matcher
.value_label
, FALSE
);
1249 gtk_widget_set_sensitive(matcher
.value_entry
, FALSE
);
1250 gtk_widget_set_sensitive(matcher
.predicate_label
, FALSE
);
1251 gtk_widget_set_sensitive(matcher
.predicate_combo
, FALSE
);
1252 gtk_widget_set_sensitive(matcher
.predicate_flag_combo
, FALSE
);
1253 gtk_widget_hide(matcher
.predicate_combo
);
1254 gtk_widget_show(matcher
.predicate_flag_combo
);
1255 gtk_widget_set_sensitive(matcher
.case_chkbtn
, FALSE
);
1256 gtk_widget_set_sensitive(matcher
.regexp_chkbtn
, FALSE
);
1257 gtk_widget_set_sensitive(matcher
.exec_btn
, FALSE
);
1260 case CRITERIA_UNREAD
:
1262 case CRITERIA_MARKED
:
1263 case CRITERIA_DELETED
:
1264 case CRITERIA_REPLIED
:
1265 case CRITERIA_FORWARDED
:
1266 gtk_widget_set_sensitive(matcher
.header_combo
, FALSE
);
1267 gtk_widget_set_sensitive(matcher
.header_label
, FALSE
);
1268 gtk_widget_set_sensitive(matcher
.value_label
, FALSE
);
1269 gtk_widget_set_sensitive(matcher
.value_entry
, FALSE
);
1270 gtk_widget_set_sensitive(matcher
.predicate_label
, TRUE
);
1271 gtk_widget_set_sensitive(matcher
.predicate_combo
, FALSE
);
1272 gtk_widget_set_sensitive(matcher
.predicate_flag_combo
, TRUE
);
1273 gtk_widget_hide(matcher
.predicate_combo
);
1274 gtk_widget_show(matcher
.predicate_flag_combo
);
1275 gtk_widget_set_sensitive(matcher
.case_chkbtn
, FALSE
);
1276 gtk_widget_set_sensitive(matcher
.regexp_chkbtn
, FALSE
);
1277 gtk_widget_set_sensitive(matcher
.exec_btn
, FALSE
);
1280 case CRITERIA_SUBJECT
:
1284 case CRITERIA_TO_OR_CC
:
1285 case CRITERIA_NEWSGROUPS
:
1286 case CRITERIA_INREPLYTO
:
1287 case CRITERIA_REFERENCES
:
1288 case CRITERIA_HEADERS_PART
:
1289 case CRITERIA_BODY_PART
:
1290 case CRITERIA_MESSAGE
:
1291 gtk_widget_set_sensitive(matcher
.header_combo
, FALSE
);
1292 gtk_widget_set_sensitive(matcher
.header_label
, FALSE
);
1293 gtk_widget_set_sensitive(matcher
.value_label
, TRUE
);
1294 gtk_widget_set_sensitive(matcher
.value_entry
, TRUE
);
1295 gtk_widget_set_sensitive(matcher
.predicate_label
, TRUE
);
1296 gtk_widget_set_sensitive(matcher
.predicate_combo
, TRUE
);
1297 gtk_widget_set_sensitive(matcher
.predicate_flag_combo
, FALSE
);
1298 gtk_widget_show(matcher
.predicate_combo
);
1299 gtk_widget_hide(matcher
.predicate_flag_combo
);
1300 gtk_widget_set_sensitive(matcher
.case_chkbtn
, TRUE
);
1301 gtk_widget_set_sensitive(matcher
.regexp_chkbtn
, TRUE
);
1302 gtk_widget_set_sensitive(matcher
.exec_btn
, FALSE
);
1305 case CRITERIA_EXECUTE
:
1306 gtk_widget_set_sensitive(matcher
.header_combo
, FALSE
);
1307 gtk_widget_set_sensitive(matcher
.header_label
, FALSE
);
1308 gtk_widget_set_sensitive(matcher
.value_label
, TRUE
);
1309 gtk_widget_set_sensitive(matcher
.value_entry
, TRUE
);
1310 gtk_widget_set_sensitive(matcher
.predicate_label
, TRUE
);
1311 gtk_widget_set_sensitive(matcher
.predicate_combo
, FALSE
);
1312 gtk_widget_set_sensitive(matcher
.predicate_flag_combo
, TRUE
);
1313 gtk_widget_hide(matcher
.predicate_combo
);
1314 gtk_widget_show(matcher
.predicate_flag_combo
);
1315 gtk_widget_set_sensitive(matcher
.case_chkbtn
, FALSE
);
1316 gtk_widget_set_sensitive(matcher
.regexp_chkbtn
, FALSE
);
1317 gtk_widget_set_sensitive(matcher
.exec_btn
, TRUE
);
1320 case CRITERIA_AGE_GREATER
:
1321 case CRITERIA_AGE_LOWER
:
1322 case CRITERIA_SCORE_GREATER
:
1323 case CRITERIA_SCORE_LOWER
:
1324 gtk_widget_set_sensitive(matcher
.header_combo
, FALSE
);
1325 gtk_widget_set_sensitive(matcher
.header_label
, FALSE
);
1326 gtk_widget_set_sensitive(matcher
.value_label
, TRUE
);
1327 gtk_widget_set_sensitive(matcher
.value_entry
, TRUE
);
1328 gtk_widget_set_sensitive(matcher
.predicate_label
, FALSE
);
1329 gtk_widget_set_sensitive(matcher
.predicate_combo
, FALSE
);
1330 gtk_widget_set_sensitive(matcher
.predicate_flag_combo
, FALSE
);
1331 gtk_widget_show(matcher
.predicate_combo
);
1332 gtk_widget_hide(matcher
.predicate_flag_combo
);
1333 gtk_widget_set_sensitive(matcher
.case_chkbtn
, FALSE
);
1334 gtk_widget_set_sensitive(matcher
.regexp_chkbtn
, FALSE
);
1335 gtk_widget_set_sensitive(matcher
.exec_btn
, FALSE
);
1338 case CRITERIA_HEADER
:
1339 gtk_widget_set_sensitive(matcher
.header_combo
, TRUE
);
1340 gtk_widget_set_sensitive(matcher
.header_label
, TRUE
);
1341 gtk_widget_set_sensitive(matcher
.value_label
, TRUE
);
1342 gtk_widget_set_sensitive(matcher
.value_entry
, TRUE
);
1343 gtk_widget_set_sensitive(matcher
.predicate_label
, TRUE
);
1344 gtk_widget_set_sensitive(matcher
.predicate_combo
, TRUE
);
1345 gtk_widget_set_sensitive(matcher
.predicate_flag_combo
, FALSE
);
1346 gtk_widget_show(matcher
.predicate_combo
);
1347 gtk_widget_hide(matcher
.predicate_flag_combo
);
1348 gtk_widget_set_sensitive(matcher
.case_chkbtn
, TRUE
);
1349 gtk_widget_set_sensitive(matcher
.regexp_chkbtn
, TRUE
);
1350 gtk_widget_set_sensitive(matcher
.exec_btn
, FALSE
);
1355 static void prefs_matcher_key_pressed(GtkWidget
*widget
, GdkEventKey
*event
,
1358 if (event
&& event
->keyval
== GDK_Escape
)
1359 prefs_matcher_cancel();
1362 static void prefs_matcher_cancel(void)
1364 gtk_widget_hide(matcher
.window
);
1367 static void prefs_matcher_ok(void)
1369 MatcherList
* matchers
;
1371 matchers
= prefs_matcher_get_list();
1372 if (matchers
!= NULL
) {
1373 gtk_widget_hide(matcher
.window
);
1374 if (matchers_callback
!= NULL
)
1375 matchers_callback(matchers
);
1376 matcherlist_free(matchers
);
1379 gtk_widget_hide(matcher
.window
);
1383 static gint
prefs_matcher_deleted(GtkWidget
*widget
, GdkEventAny
*event
,
1386 prefs_matcher_cancel();
1390 static GtkWidget
* exec_info_win
;
1392 void prefs_matcher_exec_info(void)
1395 prefs_matcher_exec_info_create();
1397 gtk_widget_show(exec_info_win
);
1399 gtk_widget_hide(exec_info_win
);
1402 static void prefs_matcher_exec_info_create(void)
1410 exec_info_win
= gtk_window_new(GTK_WINDOW_DIALOG
);
1411 gtk_window_set_title(GTK_WINDOW(exec_info_win
),
1412 _("Description of symbols"));
1413 gtk_container_set_border_width(GTK_CONTAINER(exec_info_win
), 8);
1414 gtk_window_set_position(GTK_WINDOW(exec_info_win
), GTK_WIN_POS_CENTER
);
1415 gtk_window_set_modal(GTK_WINDOW(exec_info_win
), TRUE
);
1416 gtk_window_set_policy(GTK_WINDOW(exec_info_win
), FALSE
, TRUE
, FALSE
);
1418 vbox
= gtk_vbox_new(FALSE
, 8);
1419 gtk_container_add(GTK_CONTAINER(exec_info_win
), vbox
);
1421 hbox
= gtk_hbox_new(FALSE
, 4);
1422 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, TRUE
, TRUE
, 0);
1424 label
= gtk_label_new
1440 gtk_box_pack_start(GTK_BOX(hbox
), label
, TRUE
, TRUE
, 0);
1441 gtk_label_set_justify(GTK_LABEL(label
), GTK_JUSTIFY_LEFT
);
1443 label
= gtk_label_new
1453 "Filename - should not be modified\n"
1455 "escape character for quotes\n"
1459 gtk_box_pack_start(GTK_BOX(hbox
), label
, TRUE
, TRUE
, 0);
1460 gtk_label_set_justify(GTK_LABEL(label
), GTK_JUSTIFY_LEFT
);
1462 gtkut_button_set_create(&hbbox
, &ok_btn
, _("OK"),
1463 NULL
, NULL
, NULL
, NULL
);
1464 gtk_box_pack_end(GTK_BOX(vbox
), hbbox
, FALSE
, FALSE
, 0);
1466 gtk_widget_grab_default(ok_btn
);
1467 gtk_signal_connect(GTK_OBJECT(ok_btn
), "clicked",
1468 GTK_SIGNAL_FUNC(gtk_main_quit
), NULL
);
1470 gtk_signal_connect(GTK_OBJECT(exec_info_win
), "delete_event",
1471 GTK_SIGNAL_FUNC(gtk_main_quit
), NULL
);
1473 gtk_widget_show_all(vbox
);