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 <gtk/gtkoptionmenu.h>
29 #include <gdk/gdkkeysyms.h>
38 #include "prefs_matcher.h"
39 #include "prefs_filtering.h"
40 #include "prefs_common.h"
41 #include "mainwindow.h"
42 #include "foldersel.h"
43 #include "manage_window.h"
47 #include "alertpanel.h"
49 #include "filtering.h"
50 #include "addr_compl.h"
51 #include "labelcolors.h"
53 static struct Filtering
{
57 GtkWidget
*cond_entry
;
58 GtkWidget
*action_list
;
59 GtkWidget
*action_combo
;
60 GtkWidget
*account_list
;
61 GtkWidget
*account_combo
;
62 GtkWidget
*dest_entry
;
64 GtkWidget
*dest_label
;
65 GtkWidget
*exec_label
;
68 GtkWidget
*color_label
;
69 GtkWidget
*color_optmenu
;
71 GtkWidget
*cond_clist
;
73 /* need this to make address completion entry work */
78 #define VSPACING_NARROW 4
79 #define DEFAULT_ENTRY_WIDTH 80
80 #define PREFSBUFSIZE 1024
82 /* widget creating functions */
83 static void prefs_filtering_create (void);
85 static void prefs_filtering_set_dialog (void);
86 static void prefs_filtering_set_list (void);
88 /* callback functions */
89 /* static void prefs_filtering_select_dest_cb (void); */
90 static void prefs_filtering_register_cb (void);
91 static void prefs_filtering_substitute_cb (void);
92 static void prefs_filtering_delete_cb (void);
93 static void prefs_filtering_up (void);
94 static void prefs_filtering_down (void);
95 static void prefs_filtering_select (GtkCList
*clist
,
100 static gint
prefs_filtering_deleted (GtkWidget
*widget
,
103 static void prefs_filtering_key_pressed (GtkWidget
*widget
,
106 static void prefs_filtering_cancel (void);
107 static void prefs_filtering_ok (void);
109 static void prefs_filtering_condition_define (void);
110 static gint
prefs_filtering_clist_set_row(gint row
, FilteringProp
* prop
);
111 static void prefs_filtering_select_dest(void);
112 static void prefs_filtering_action_select(GtkList
*list
,
115 static void prefs_filtering_action_selection_changed(GtkList
*list
,
118 static void prefs_filtering_reset_dialog(void);
126 ACTION_MARK_AS_READ
= 5,
127 ACTION_MARK_AS_UNREAD
= 6,
129 ACTION_FORWARD_AS_ATTACHMENT
= 8,
134 static gint
get_sel_from_list(GtkList
* list
)
140 if (list
->selection
== NULL
)
143 sel
= list
->selection
->data
;
144 for(child
= list
->children
; child
!= NULL
;
145 child
= g_list_next(child
)) {
146 if (child
->data
== sel
)
154 static gint
get_account_id_from_list_id(gint list_id
)
158 for (accounts
= account_get_list() ; accounts
!= NULL
;
159 accounts
= accounts
->next
) {
160 PrefsAccount
*ac
= (PrefsAccount
*)accounts
->data
;
163 return ac
->account_id
;
169 static gint
get_list_id_from_account_id(gint account_id
)
174 for (accounts
= account_get_list() ; accounts
!= NULL
;
175 accounts
= accounts
->next
) {
176 PrefsAccount
*ac
= (PrefsAccount
*)accounts
->data
;
178 if (account_id
== ac
->account_id
)
185 static gint
prefs_filtering_get_matching_from_action(gint action_id
)
189 return MATCHING_ACTION_MOVE
;
191 return MATCHING_ACTION_COPY
;
193 return MATCHING_ACTION_DELETE
;
195 return MATCHING_ACTION_MARK
;
197 return MATCHING_ACTION_UNMARK
;
198 case ACTION_MARK_AS_READ
:
199 return MATCHING_ACTION_MARK_AS_READ
;
200 case ACTION_MARK_AS_UNREAD
:
201 return MATCHING_ACTION_MARK_AS_UNREAD
;
203 return MATCHING_ACTION_FORWARD
;
204 case ACTION_FORWARD_AS_ATTACHMENT
:
205 return MATCHING_ACTION_FORWARD_AS_ATTACHMENT
;
207 return MATCHING_EXECUTE
;
209 return MATCHING_ACTION_COLOR
;
215 static gchar
* action_text
[] = {
222 N_("Mark as unread"),
224 N_("Forward as attachment"),
229 void prefs_filtering_open(void)
231 if (prefs_rc_is_readonly(FILTERING_RC
))
234 inc_autocheck_timer_remove();
236 if (!filtering
.window
) {
237 prefs_filtering_create();
240 manage_window_set_transient(GTK_WINDOW(filtering
.window
));
241 gtk_widget_grab_focus(filtering
.ok_btn
);
243 prefs_filtering_set_dialog();
245 gtk_widget_show(filtering
.window
);
247 start_address_completion();
250 /* prefs_filtering_close() - just to have one common exit point */
251 static void prefs_filtering_close(void)
253 end_address_completion();
255 gtk_widget_hide(filtering
.window
);
258 static void prefs_filtering_create(void)
263 GtkWidget
*cancel_btn
;
264 GtkWidget
*confirm_area
;
272 GtkWidget
*cond_label
;
273 GtkWidget
*cond_entry
;
275 GtkWidget
*action_label
;
276 GtkWidget
*action_list
;
277 GtkWidget
*action_combo
;
278 GtkWidget
*account_label
;
279 GtkWidget
*account_list
;
280 GtkWidget
*account_combo
;
281 GtkWidget
*dest_label
;
282 GtkWidget
*exec_label
;
283 GtkWidget
*dest_entry
;
286 GtkWidget
*color_label
;
287 GtkWidget
*color_optmenu
;
290 GtkWidget
*subst_btn
;
293 GtkWidget
*cond_hbox
;
294 GtkWidget
*cond_scrolledwin
;
295 GtkWidget
*cond_clist
;
309 gchar
*title
[] = {_("Registered rules")};
311 debug_print(_("Creating filtering setting window...\n"));
313 window
= gtk_window_new (GTK_WINDOW_DIALOG
);
314 gtk_container_set_border_width (GTK_CONTAINER (window
), 8);
315 gtk_window_position (GTK_WINDOW (window
), GTK_WIN_POS_CENTER
);
316 gtk_window_set_modal (GTK_WINDOW (window
), TRUE
);
317 gtk_window_set_policy (GTK_WINDOW (window
), FALSE
, TRUE
, FALSE
);
319 vbox
= gtk_vbox_new (FALSE
, 6);
320 gtk_widget_show (vbox
);
321 gtk_container_add (GTK_CONTAINER (window
), vbox
);
323 gtkut_button_set_create(&confirm_area
, &ok_btn
, _("OK"),
324 &cancel_btn
, _("Cancel"), NULL
, NULL
);
325 gtk_widget_show (confirm_area
);
326 gtk_box_pack_end (GTK_BOX(vbox
), confirm_area
, FALSE
, FALSE
, 0);
327 gtk_widget_grab_default (ok_btn
);
329 gtk_window_set_title (GTK_WINDOW(window
),
330 _("Filtering setting"));
331 gtk_signal_connect (GTK_OBJECT(window
), "delete_event",
332 GTK_SIGNAL_FUNC(prefs_filtering_deleted
), NULL
);
333 gtk_signal_connect (GTK_OBJECT(window
), "key_press_event",
334 GTK_SIGNAL_FUNC(prefs_filtering_key_pressed
), NULL
);
335 gtk_signal_connect (GTK_OBJECT(window
), "focus_in_event",
336 GTK_SIGNAL_FUNC(manage_window_focus_in
), NULL
);
337 gtk_signal_connect (GTK_OBJECT(window
), "focus_out_event",
338 GTK_SIGNAL_FUNC(manage_window_focus_out
), NULL
);
339 gtk_signal_connect (GTK_OBJECT(ok_btn
), "clicked",
340 GTK_SIGNAL_FUNC(prefs_filtering_ok
), NULL
);
341 gtk_signal_connect (GTK_OBJECT(cancel_btn
), "clicked",
342 GTK_SIGNAL_FUNC(prefs_filtering_cancel
), NULL
);
344 vbox1
= gtk_vbox_new (FALSE
, VSPACING
);
345 gtk_widget_show (vbox1
);
346 gtk_box_pack_start (GTK_BOX (vbox
), vbox1
, TRUE
, TRUE
, 0);
347 gtk_container_set_border_width (GTK_CONTAINER (vbox1
), 2);
349 cond_label
= gtk_label_new (_("Condition"));
350 gtk_widget_show (cond_label
);
351 gtk_misc_set_alignment (GTK_MISC (cond_label
), 0, 0.5);
352 gtk_box_pack_start (GTK_BOX (vbox1
), cond_label
, FALSE
, FALSE
, 0);
354 hbox1
= gtk_hbox_new (FALSE
, VSPACING
);
355 gtk_widget_show (vbox1
);
356 gtk_box_pack_start (GTK_BOX (vbox1
), hbox1
, FALSE
, FALSE
, 0);
357 gtk_container_set_border_width (GTK_CONTAINER (vbox1
), 2);
359 cond_entry
= gtk_entry_new ();
360 gtk_widget_show (cond_entry
);
361 // gtk_widget_set_usize (cond_entry, 200, -1);
362 gtk_box_pack_start (GTK_BOX (hbox1
), cond_entry
, TRUE
, TRUE
, 0);
364 cond_btn
= gtk_button_new_with_label (_("Define ..."));
365 gtk_widget_show (cond_btn
);
366 gtk_box_pack_start (GTK_BOX (hbox1
), cond_btn
, FALSE
, FALSE
, 0);
367 gtk_signal_connect (GTK_OBJECT (cond_btn
), "clicked",
368 GTK_SIGNAL_FUNC (prefs_filtering_condition_define
),
371 hbox1
= gtk_hbox_new (FALSE
, VSPACING
);
372 gtk_widget_show (vbox1
);
373 gtk_box_pack_start (GTK_BOX (vbox1
), hbox1
, FALSE
, FALSE
, 0);
374 gtk_container_set_border_width (GTK_CONTAINER (vbox1
), 2);
376 action_label
= gtk_label_new (_("Action"));
377 gtk_widget_show (action_label
);
378 gtk_misc_set_alignment (GTK_MISC (action_label
), 0, 0.5);
379 gtk_box_pack_start (GTK_BOX (hbox1
), action_label
, FALSE
, FALSE
, 0);
381 action_combo
= gtk_combo_new ();
382 gtk_widget_show (action_combo
);
383 // gtk_widget_set_usize (action_combo, 200, -1);
384 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(action_combo
)->entry
),
389 for(i
= 0 ; i
< (gint
) (sizeof(action_text
) / sizeof(gchar
*)) ;
391 combo_items
= g_list_append(combo_items
,
392 (gpointer
) _(action_text
[i
]));
394 gtk_combo_set_popdown_strings(GTK_COMBO(action_combo
), combo_items
);
396 g_list_free(combo_items
);
398 gtk_box_pack_start (GTK_BOX (hbox1
), action_combo
,
400 action_list
= GTK_COMBO(action_combo
)->list
;
401 gtk_signal_connect (GTK_OBJECT (action_list
), "select-child",
402 GTK_SIGNAL_FUNC (prefs_filtering_action_select
),
405 gtk_signal_connect(GTK_OBJECT(action_list
), "selection-changed",
406 GTK_SIGNAL_FUNC(prefs_filtering_action_selection_changed
),
411 hbox1
= gtk_hbox_new (FALSE
, VSPACING
);
412 gtk_widget_show (vbox1
);
413 gtk_box_pack_start (GTK_BOX (vbox1
), hbox1
, FALSE
, FALSE
, 0);
414 gtk_container_set_border_width (GTK_CONTAINER (vbox1
), 2);
416 account_label
= gtk_label_new (_("Account"));
417 gtk_widget_show (account_label
);
418 gtk_misc_set_alignment (GTK_MISC (account_label
), 0, 0.5);
419 gtk_box_pack_start (GTK_BOX (hbox1
), account_label
, FALSE
, FALSE
, 0);
421 account_combo
= gtk_combo_new ();
422 gtk_widget_show (account_combo
);
425 for (accounts
= account_get_list() ; accounts
!= NULL
;
426 accounts
= accounts
->next
) {
427 PrefsAccount
*ac
= (PrefsAccount
*)accounts
->data
;
430 name
= g_strdup_printf("%s <%s> (%s)",
431 ac
->name
, ac
->address
,
433 combo_items
= g_list_append(combo_items
, (gpointer
) name
);
436 gtk_combo_set_popdown_strings(GTK_COMBO(account_combo
), combo_items
);
438 for(cur
= g_list_first(combo_items
) ; cur
!= NULL
;
439 cur
= g_list_next(cur
))
441 g_list_free(combo_items
);
443 gtk_box_pack_start (GTK_BOX (hbox1
), account_combo
,
445 account_list
= GTK_COMBO(account_combo
)->list
;
446 gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(account_combo
)->entry
),
451 hbox1
= gtk_hbox_new (FALSE
, VSPACING
);
452 gtk_widget_show (vbox1
);
453 gtk_box_pack_start (GTK_BOX (vbox1
), hbox1
, FALSE
, FALSE
, 0);
454 gtk_container_set_border_width (GTK_CONTAINER (vbox1
), 2);
456 dest_label
= gtk_label_new (_("Destination"));
457 gtk_widget_show (dest_label
);
458 gtk_misc_set_alignment (GTK_MISC (dest_label
), 0, 0.5);
459 gtk_box_pack_start (GTK_BOX (hbox1
), dest_label
, FALSE
, FALSE
, 0);
461 exec_label
= gtk_label_new (_("Execute"));
462 gtk_widget_show (exec_label
);
463 gtk_misc_set_alignment (GTK_MISC (exec_label
), 0, 0.5);
464 gtk_box_pack_start (GTK_BOX (hbox1
), exec_label
, FALSE
, FALSE
, 0);
466 color_label
= gtk_label_new (_("Color"));
467 gtk_widget_show(color_label
);
468 gtk_misc_set_alignment(GTK_MISC(color_label
), 0, 0.5);
469 gtk_box_pack_start(GTK_BOX(hbox1
), color_label
, FALSE
, FALSE
, 0);
471 dest_entry
= gtk_entry_new ();
472 gtk_widget_show (dest_entry
);
473 // gtk_widget_set_usize (dest_entry, 200, -1);
474 gtk_box_pack_start (GTK_BOX (hbox1
), dest_entry
, TRUE
, TRUE
, 0);
476 color_optmenu
= gtk_option_menu_new();
477 gtk_option_menu_set_menu(GTK_OPTION_MENU(color_optmenu
),
478 labelcolors_create_color_menu());
479 // gtk_widget_set_usize(color_optmenu, -1, -1);
480 gtk_box_pack_start(GTK_BOX(hbox1
), color_optmenu
, TRUE
, TRUE
, 0);
482 dest_btn
= gtk_button_new_with_label (_("Select ..."));
483 gtk_widget_show (dest_btn
);
484 gtk_box_pack_start (GTK_BOX (hbox1
), dest_btn
, FALSE
, FALSE
, 0);
485 gtk_signal_connect (GTK_OBJECT (dest_btn
), "clicked",
486 GTK_SIGNAL_FUNC (prefs_filtering_select_dest
),
489 exec_btn
= gtk_button_new_with_label (_("Info ..."));
490 gtk_widget_show (exec_btn
);
491 gtk_box_pack_start (GTK_BOX (hbox1
), exec_btn
, FALSE
, FALSE
, 0);
492 gtk_signal_connect (GTK_OBJECT (exec_btn
), "clicked",
493 GTK_SIGNAL_FUNC (prefs_matcher_exec_info
),
496 // dummy = gtk_label_new("");
497 // gtk_widget_show (dummy);
498 // gtk_box_pack_start(GTK_BOX (hbox1), dummy, FALSE, FALSE, 0);
501 /* register / substitute / delete */
503 reg_hbox
= gtk_hbox_new (FALSE
, 4);
504 gtk_widget_show (reg_hbox
);
505 gtk_box_pack_start (GTK_BOX (vbox1
), reg_hbox
, FALSE
, FALSE
, 0);
507 arrow
= gtk_arrow_new (GTK_ARROW_DOWN
, GTK_SHADOW_OUT
);
508 gtk_widget_show (arrow
);
509 gtk_box_pack_start (GTK_BOX (reg_hbox
), arrow
, FALSE
, FALSE
, 0);
510 gtk_widget_set_usize (arrow
, -1, 16);
512 btn_hbox
= gtk_hbox_new (TRUE
, 4);
513 gtk_widget_show (btn_hbox
);
514 gtk_box_pack_start (GTK_BOX (reg_hbox
), btn_hbox
, FALSE
, FALSE
, 0);
516 reg_btn
= gtk_button_new_with_label (_("Register"));
517 gtk_widget_show (reg_btn
);
518 gtk_box_pack_start (GTK_BOX (btn_hbox
), reg_btn
, FALSE
, TRUE
, 0);
519 gtk_signal_connect (GTK_OBJECT (reg_btn
), "clicked",
520 GTK_SIGNAL_FUNC (prefs_filtering_register_cb
), NULL
);
522 subst_btn
= gtk_button_new_with_label (_(" Substitute "));
523 gtk_widget_show (subst_btn
);
524 gtk_box_pack_start (GTK_BOX (btn_hbox
), subst_btn
, FALSE
, TRUE
, 0);
525 gtk_signal_connect (GTK_OBJECT (subst_btn
), "clicked",
526 GTK_SIGNAL_FUNC (prefs_filtering_substitute_cb
),
529 del_btn
= gtk_button_new_with_label (_("Delete"));
530 gtk_widget_show (del_btn
);
531 gtk_box_pack_start (GTK_BOX (btn_hbox
), del_btn
, FALSE
, TRUE
, 0);
532 gtk_signal_connect (GTK_OBJECT (del_btn
), "clicked",
533 GTK_SIGNAL_FUNC (prefs_filtering_delete_cb
), NULL
);
535 cond_hbox
= gtk_hbox_new (FALSE
, 8);
536 gtk_widget_show (cond_hbox
);
537 gtk_box_pack_start (GTK_BOX (vbox1
), cond_hbox
, TRUE
, TRUE
, 0);
539 cond_scrolledwin
= gtk_scrolled_window_new (NULL
, NULL
);
540 gtk_widget_show (cond_scrolledwin
);
541 gtk_widget_set_usize (cond_scrolledwin
, -1, 150);
542 gtk_box_pack_start (GTK_BOX (cond_hbox
), cond_scrolledwin
,
544 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (cond_scrolledwin
),
545 GTK_POLICY_AUTOMATIC
,
546 GTK_POLICY_AUTOMATIC
);
548 cond_clist
= gtk_clist_new_with_titles(1, title
);
549 gtk_widget_show (cond_clist
);
550 gtk_container_add (GTK_CONTAINER (cond_scrolledwin
), cond_clist
);
551 gtk_clist_set_column_width (GTK_CLIST (cond_clist
), 0, 80);
552 gtk_clist_set_selection_mode (GTK_CLIST (cond_clist
),
553 GTK_SELECTION_BROWSE
);
554 GTK_WIDGET_UNSET_FLAGS (GTK_CLIST (cond_clist
)->column
[0].button
,
556 gtk_signal_connect (GTK_OBJECT (cond_clist
), "select_row",
557 GTK_SIGNAL_FUNC (prefs_filtering_select
), NULL
);
559 btn_vbox
= gtk_vbox_new (FALSE
, 8);
560 gtk_widget_show (btn_vbox
);
561 gtk_box_pack_start (GTK_BOX (cond_hbox
), btn_vbox
, FALSE
, FALSE
, 0);
563 up_btn
= gtk_button_new_with_label (_("Up"));
564 gtk_widget_show (up_btn
);
565 gtk_box_pack_start (GTK_BOX (btn_vbox
), up_btn
, FALSE
, FALSE
, 0);
566 gtk_signal_connect (GTK_OBJECT (up_btn
), "clicked",
567 GTK_SIGNAL_FUNC (prefs_filtering_up
), NULL
);
569 down_btn
= gtk_button_new_with_label (_("Down"));
570 gtk_widget_show (down_btn
);
571 gtk_box_pack_start (GTK_BOX (btn_vbox
), down_btn
, FALSE
, FALSE
, 0);
572 gtk_signal_connect (GTK_OBJECT (down_btn
), "clicked",
573 GTK_SIGNAL_FUNC (prefs_filtering_down
), NULL
);
575 gtk_widget_set_usize(window
, 500, -1);
577 gtk_widget_show_all(window
);
579 filtering
.window
= window
;
580 filtering
.ok_btn
= ok_btn
;
582 filtering
.cond_entry
= cond_entry
;
583 filtering
.action_list
= action_list
;
584 filtering
.action_combo
= action_combo
;
585 filtering
.account_list
= account_list
;
586 filtering
.account_combo
= account_combo
;
587 filtering
.dest_entry
= dest_entry
;
588 filtering
.dest_btn
= dest_btn
;
589 filtering
.dest_label
= dest_label
;
590 filtering
.exec_label
= exec_label
;
591 filtering
.exec_btn
= exec_btn
;
593 filtering
.cond_clist
= cond_clist
;
595 filtering
.color_label
= color_label
;
596 filtering
.color_optmenu
= color_optmenu
;
599 static void prefs_filtering_update_hscrollbar(void)
601 gint optwidth
= gtk_clist_optimal_column_width(GTK_CLIST(filtering
.cond_clist
), 0);
602 gtk_clist_set_column_width(GTK_CLIST(filtering
.cond_clist
), 0, optwidth
);
605 static void prefs_filtering_set_dialog(void)
607 GtkCList
*clist
= GTK_CLIST(filtering
.cond_clist
);
610 gtk_clist_freeze(clist
);
611 gtk_clist_clear(clist
);
613 prefs_filtering_clist_set_row(-1, NULL
);
614 for(cur
= prefs_filtering
; cur
!= NULL
; cur
= g_slist_next(cur
)) {
615 FilteringProp
* prop
= (FilteringProp
*) cur
->data
;
617 prefs_filtering_clist_set_row(-1, prop
);
620 prefs_filtering_update_hscrollbar();
621 gtk_clist_thaw(clist
);
623 prefs_filtering_reset_dialog();
626 static void prefs_filtering_reset_dialog(void)
628 gtk_list_select_item(GTK_LIST(filtering
.action_list
), 0);
629 gtk_list_select_item(GTK_LIST(filtering
.account_list
), 0);
630 gtk_entry_set_text(GTK_ENTRY(filtering
.dest_entry
), "");
631 gtk_entry_set_text(GTK_ENTRY(filtering
.cond_entry
), "");
634 static void prefs_filtering_set_list(void)
639 gchar
* filtering_str
;
642 for(cur
= prefs_filtering
; cur
!= NULL
; cur
= g_slist_next(cur
))
643 filteringprop_free((FilteringProp
*) cur
->data
);
644 g_slist_free(prefs_filtering
);
645 prefs_filtering
= NULL
;
647 while (gtk_clist_get_text(GTK_CLIST(filtering
.cond_clist
),
648 row
, 0, &filtering_str
)) {
649 if (strcmp(filtering_str
, _("(New)")) != 0) {
651 prop
= filteringprop_parse(&tmp
);
653 prefs_filtering
= g_slist_append(prefs_filtering
,
660 static gint
prefs_filtering_clist_set_row(gint row
, FilteringProp
* prop
)
662 GtkCList
*clist
= GTK_CLIST(filtering
.cond_clist
);
667 cond_str
[0] = _("(New)");
668 return gtk_clist_append(clist
, cond_str
);
671 str
= filteringprop_to_string(prop
);
678 row
= gtk_clist_append(clist
, cond_str
);
680 gtk_clist_set_text(clist
, row
, 0, cond_str
[0]);
686 static void prefs_filtering_condition_define_done(MatcherList
* matchers
)
690 if (matchers
== NULL
)
693 str
= matcherlist_to_string(matchers
);
696 gtk_entry_set_text(GTK_ENTRY(filtering
.cond_entry
), str
);
701 static void prefs_filtering_condition_define(void)
704 MatcherList
* matchers
= NULL
;
706 cond_str
= gtk_entry_get_text(GTK_ENTRY(filtering
.cond_entry
));
708 if (*cond_str
!= '\0') {
712 matchers
= matcherlist_parse(&tmp
);
714 alertpanel_error(_("Match string is not valid."));
717 prefs_matcher_open(matchers
, prefs_filtering_condition_define_done
);
719 if (matchers
!= NULL
)
720 matcherlist_free(matchers
);
724 /* register / substitute delete buttons */
727 static FilteringProp
* prefs_filtering_dialog_to_filtering(void)
731 FilteringProp
* prop
;
732 FilteringAction
* action
;
741 cond_str
= gtk_entry_get_text(GTK_ENTRY(filtering
.cond_entry
));
742 if (*cond_str
== '\0') {
743 alertpanel_error(_("Score is not set."));
747 action_id
= get_sel_from_list(GTK_LIST(filtering
.action_list
));
748 action_type
= prefs_filtering_get_matching_from_action(action_id
);
749 list_id
= get_sel_from_list(GTK_LIST(filtering
.account_list
));
750 account_id
= get_account_id_from_list_id(list_id
);
756 case ACTION_FORWARD_AS_ATTACHMENT
:
758 destination
= gtk_entry_get_text(GTK_ENTRY(filtering
.dest_entry
));
759 if (*destination
== '\0') {
760 alertpanel_error(_("Destination is not set."));
765 labelcolor
= labelcolors_get_color_menu_active_item(
766 gtk_option_menu_get_menu(GTK_OPTION_MENU(filtering
.color_optmenu
)));
774 action
= filteringaction_new(action_type
, account_id
, destination
, labelcolor
);
777 cond
= matcherlist_parse(&tmp
);
780 alertpanel_error(_("Match string is not valid."));
781 filteringaction_free(action
);
785 prop
= filteringprop_new(cond
, action
);
790 static void prefs_filtering_register_cb(void)
792 FilteringProp
* prop
;
794 prop
= prefs_filtering_dialog_to_filtering();
797 prefs_filtering_clist_set_row(-1, prop
);
799 filteringprop_free(prop
);
801 prefs_filtering_update_hscrollbar();
804 static void prefs_filtering_substitute_cb(void)
806 GtkCList
*clist
= GTK_CLIST(filtering
.cond_clist
);
808 FilteringProp
* prop
;
810 if (!clist
->selection
) return;
812 row
= GPOINTER_TO_INT(clist
->selection
->data
);
813 if (row
== 0) return;
815 prop
= prefs_filtering_dialog_to_filtering();
818 prefs_filtering_clist_set_row(row
, prop
);
820 filteringprop_free(prop
);
822 prefs_filtering_update_hscrollbar();
825 static void prefs_filtering_delete_cb(void)
827 GtkCList
*clist
= GTK_CLIST(filtering
.cond_clist
);
830 if (!clist
->selection
) return;
831 row
= GPOINTER_TO_INT(clist
->selection
->data
);
832 if (row
== 0) return;
834 if (alertpanel(_("Delete rule"),
835 _("Do you really want to delete this rule?"),
836 _("Yes"), _("No"), NULL
) == G_ALERTALTERNATE
)
839 gtk_clist_remove(clist
, row
);
841 prefs_filtering_update_hscrollbar();
844 static void prefs_filtering_up(void)
846 GtkCList
*clist
= GTK_CLIST(filtering
.cond_clist
);
849 if (!clist
->selection
) return;
851 row
= GPOINTER_TO_INT(clist
->selection
->data
);
853 gtk_clist_row_move(clist
, row
, row
- 1);
854 if(gtk_clist_row_is_visible(clist
, row
- 1) != GTK_VISIBILITY_FULL
) {
855 gtk_clist_moveto(clist
, row
- 1, 0, 0, 0);
860 static void prefs_filtering_down(void)
862 GtkCList
*clist
= GTK_CLIST(filtering
.cond_clist
);
865 if (!clist
->selection
) return;
867 row
= GPOINTER_TO_INT(clist
->selection
->data
);
868 if (row
> 0 && row
< clist
->rows
- 1) {
869 gtk_clist_row_move(clist
, row
, row
+ 1);
870 if(gtk_clist_row_is_visible(clist
, row
+ 1) != GTK_VISIBILITY_FULL
) {
871 gtk_clist_moveto(clist
, row
+ 1, 0, 1, 0);
876 static void prefs_filtering_select_set(FilteringProp
* prop
)
878 FilteringAction
* action
;
882 prefs_filtering_reset_dialog();
884 action
= prop
->action
;
886 matcher_str
= matcherlist_to_string(prop
->matchers
);
887 if (matcher_str
== NULL
) {
888 filteringprop_free(prop
);
892 gtk_entry_set_text(GTK_ENTRY(filtering
.cond_entry
), matcher_str
);
894 if (action
->destination
)
895 gtk_entry_set_text(GTK_ENTRY(filtering
.dest_entry
), action
->destination
);
897 gtk_entry_set_text(GTK_ENTRY(filtering
.dest_entry
), "");
899 switch(action
->type
) {
900 case MATCHING_ACTION_MOVE
:
901 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
904 case MATCHING_ACTION_COPY
:
905 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
908 case MATCHING_ACTION_DELETE
:
909 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
912 case MATCHING_ACTION_MARK
:
913 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
916 case MATCHING_ACTION_UNMARK
:
917 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
920 case MATCHING_ACTION_MARK_AS_READ
:
921 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
922 ACTION_MARK_AS_READ
);
924 case MATCHING_ACTION_MARK_AS_UNREAD
:
925 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
926 ACTION_MARK_AS_UNREAD
);
928 case MATCHING_ACTION_FORWARD
:
929 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
931 list_id
= get_list_id_from_account_id(action
->account_id
);
932 gtk_list_select_item(GTK_LIST(filtering
.account_list
),
935 case MATCHING_ACTION_FORWARD_AS_ATTACHMENT
:
936 list_id
= get_list_id_from_account_id(action
->account_id
);
937 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
938 ACTION_FORWARD_AS_ATTACHMENT
);
939 gtk_list_select_item(GTK_LIST(filtering
.account_list
),
942 case MATCHING_EXECUTE
:
943 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
946 case MATCHING_ACTION_COLOR
:
947 gtk_list_select_item(GTK_LIST(filtering
.action_list
),
949 gtk_option_menu_set_history(GTK_OPTION_MENU(filtering
.color_optmenu
), action
->labelcolor
);
956 static void prefs_filtering_select(GtkCList
*clist
, gint row
, gint column
,
959 FilteringProp
* prop
;
961 gchar
* filtering_str
;
964 prefs_filtering_reset_dialog();
968 if (!gtk_clist_get_text(GTK_CLIST(filtering
.cond_clist
),
969 row
, 0, &filtering_str
))
973 prop
= filteringprop_parse(&tmp
);
977 prefs_filtering_select_set(prop
);
979 filteringprop_free(prop
);
982 static void prefs_filtering_select_dest(void)
987 dest
= foldersel_folder_sel(NULL
, NULL
);
990 path
= folder_item_get_identifier(dest
);
992 gtk_entry_set_text(GTK_ENTRY(filtering
.dest_entry
), path
);
996 static void prefs_filtering_action_selection_changed(GtkList
*list
,
1001 value
= get_sel_from_list(GTK_LIST(filtering
.action_list
));
1003 if (filtering
.current_action
!= value
) {
1004 if (filtering
.current_action
== ACTION_FORWARD
1005 || filtering
.current_action
== ACTION_FORWARD_AS_ATTACHMENT
) {
1006 debug_print("unregistering address completion entry\n");
1007 address_completion_unregister_entry(GTK_ENTRY(filtering
.dest_entry
));
1009 if (value
== ACTION_FORWARD
|| value
== ACTION_FORWARD_AS_ATTACHMENT
) {
1010 debug_print("registering address completion entry\n");
1011 address_completion_register_entry(GTK_ENTRY(filtering
.dest_entry
));
1013 filtering
.current_action
= value
;
1017 static void prefs_filtering_action_select(GtkList
*list
,
1023 value
= get_sel_from_list(GTK_LIST(filtering
.action_list
));
1027 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1028 gtk_widget_show(filtering
.dest_entry
);
1029 gtk_widget_set_sensitive(filtering
.dest_entry
, TRUE
);
1030 gtk_widget_show(filtering
.dest_btn
);
1031 gtk_widget_show(filtering
.dest_label
);
1032 gtk_widget_hide(filtering
.exec_label
);
1033 gtk_widget_hide(filtering
.exec_btn
);
1034 gtk_widget_hide(filtering
.color_optmenu
);
1035 gtk_widget_hide(filtering
.color_label
);
1038 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1039 gtk_widget_show(filtering
.dest_entry
);
1040 gtk_widget_set_sensitive(filtering
.dest_entry
, TRUE
);
1041 gtk_widget_show(filtering
.dest_btn
);
1042 gtk_widget_show(filtering
.dest_label
);
1043 gtk_widget_hide(filtering
.exec_label
);
1044 gtk_widget_hide(filtering
.exec_btn
);
1045 gtk_widget_hide(filtering
.color_optmenu
);
1046 gtk_widget_hide(filtering
.color_label
);
1049 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1050 gtk_widget_show(filtering
.dest_entry
);
1051 gtk_widget_set_sensitive(filtering
.dest_entry
, FALSE
);
1052 gtk_widget_hide(filtering
.dest_btn
);
1053 gtk_widget_show(filtering
.dest_label
);
1054 gtk_widget_hide(filtering
.exec_label
);
1055 gtk_widget_hide(filtering
.exec_btn
);
1056 gtk_widget_hide(filtering
.color_optmenu
);
1057 gtk_widget_hide(filtering
.color_label
);
1060 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1061 gtk_widget_show(filtering
.dest_entry
);
1062 gtk_widget_set_sensitive(filtering
.dest_entry
, FALSE
);
1063 gtk_widget_hide(filtering
.dest_btn
);
1064 gtk_widget_show(filtering
.dest_label
);
1065 gtk_widget_hide(filtering
.exec_label
);
1066 gtk_widget_hide(filtering
.exec_btn
);
1067 gtk_widget_hide(filtering
.color_optmenu
);
1068 gtk_widget_hide(filtering
.color_label
);
1071 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1072 gtk_widget_show(filtering
.dest_entry
);
1073 gtk_widget_set_sensitive(filtering
.dest_entry
, FALSE
);
1074 gtk_widget_hide(filtering
.dest_btn
);
1075 gtk_widget_show(filtering
.dest_label
);
1076 gtk_widget_hide(filtering
.exec_label
);
1077 gtk_widget_hide(filtering
.exec_btn
);
1078 gtk_widget_hide(filtering
.color_optmenu
);
1079 gtk_widget_hide(filtering
.color_label
);
1081 case ACTION_MARK_AS_READ
:
1082 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1083 gtk_widget_show(filtering
.dest_entry
);
1084 gtk_widget_set_sensitive(filtering
.dest_entry
, FALSE
);
1085 gtk_widget_hide(filtering
.dest_btn
);
1086 gtk_widget_show(filtering
.dest_label
);
1087 gtk_widget_hide(filtering
.exec_label
);
1088 gtk_widget_hide(filtering
.exec_btn
);
1089 gtk_widget_hide(filtering
.color_optmenu
);
1090 gtk_widget_hide(filtering
.color_label
);
1092 case ACTION_MARK_AS_UNREAD
:
1093 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1094 gtk_widget_show(filtering
.dest_entry
);
1095 gtk_widget_set_sensitive(filtering
.dest_entry
, FALSE
);
1096 gtk_widget_hide(filtering
.dest_btn
);
1097 gtk_widget_show(filtering
.dest_label
);
1098 gtk_widget_hide(filtering
.exec_label
);
1099 gtk_widget_hide(filtering
.exec_btn
);
1100 gtk_widget_hide(filtering
.color_optmenu
);
1101 gtk_widget_hide(filtering
.color_label
);
1103 case ACTION_FORWARD
:
1104 gtk_widget_set_sensitive(filtering
.account_combo
, TRUE
);
1105 gtk_widget_show(filtering
.dest_entry
);
1106 gtk_widget_set_sensitive(filtering
.dest_entry
, TRUE
);
1107 gtk_widget_hide(filtering
.dest_btn
);
1108 gtk_widget_show(filtering
.dest_label
);
1109 gtk_widget_hide(filtering
.exec_label
);
1110 gtk_widget_hide(filtering
.exec_btn
);
1111 gtk_widget_hide(filtering
.color_optmenu
);
1112 gtk_widget_hide(filtering
.color_label
);
1114 case ACTION_FORWARD_AS_ATTACHMENT
:
1115 gtk_widget_set_sensitive(filtering
.account_combo
, TRUE
);
1116 gtk_widget_show(filtering
.dest_entry
);
1117 gtk_widget_set_sensitive(filtering
.dest_entry
, TRUE
);
1118 gtk_widget_hide(filtering
.dest_btn
);
1119 gtk_widget_show(filtering
.dest_label
);
1120 gtk_widget_hide(filtering
.exec_label
);
1121 gtk_widget_hide(filtering
.exec_btn
);
1122 gtk_widget_hide(filtering
.color_optmenu
);
1123 gtk_widget_hide(filtering
.color_label
);
1125 case ACTION_EXECUTE
:
1126 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1127 gtk_widget_show(filtering
.dest_entry
);
1128 gtk_widget_set_sensitive(filtering
.dest_entry
, TRUE
);
1129 gtk_widget_hide(filtering
.dest_btn
);
1130 gtk_widget_hide(filtering
.dest_label
);
1131 gtk_widget_show(filtering
.exec_label
);
1132 gtk_widget_set_sensitive(filtering
.exec_btn
, FALSE
);
1133 gtk_widget_show(filtering
.exec_btn
);
1134 gtk_widget_hide(filtering
.color_optmenu
);
1135 gtk_widget_hide(filtering
.color_label
);
1138 gtk_widget_set_sensitive(filtering
.account_combo
, FALSE
);
1139 gtk_widget_hide(filtering
.dest_entry
);
1140 gtk_widget_hide(filtering
.dest_btn
);
1141 gtk_widget_hide(filtering
.dest_label
);
1142 gtk_widget_hide(filtering
.exec_label
);
1143 gtk_widget_show(filtering
.exec_btn
);
1144 gtk_widget_set_sensitive(filtering
.exec_btn
, FALSE
);
1145 gtk_widget_show(filtering
.color_optmenu
);
1146 gtk_widget_show(filtering
.color_label
);
1151 static gint
prefs_filtering_deleted(GtkWidget
*widget
, GdkEventAny
*event
,
1154 prefs_filtering_cancel();
1158 static void prefs_filtering_key_pressed(GtkWidget
*widget
, GdkEventKey
*event
,
1161 if (event
&& event
->keyval
== GDK_Escape
)
1162 prefs_filtering_cancel();
1165 static void prefs_filtering_ok(void)
1167 prefs_filtering_set_list();
1168 prefs_filtering_write_config();
1169 prefs_filtering_close();
1172 static void prefs_filtering_cancel(void)
1174 prefs_filtering_read_config();
1175 prefs_filtering_close();