Fixed bug which stopped autochecking
[claws.git] / src / prefs_filter.c
index 24438db5f1796ed2ca22d2c2efacb9bcf109ce9a..0311eef7a23b5c71f25d2b6b718d4d8bc9c519de 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2001 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2002 Hiroyuki Yamamoto
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -81,11 +81,6 @@ static struct Filter {
    pointer to the function for widget setting
  */
 
-#define VSPACING               12
-#define VSPACING_NARROW                4
-#define DEFAULT_ENTRY_WIDTH    80
-#define PREFSBUFSIZE           1024
-
 /* widget creating functions */
 static void prefs_filter_create                (void);
 
@@ -104,9 +99,13 @@ static void prefs_filter_select             (GtkCList       *clist,
                                         gint            row,
                                         gint            column,
                                         GdkEvent       *event);
+static void prefs_filter_row_move      (GtkCList       *clist,
+                                        gint            source_row,
+                                        gint            dest_row);
 
 static void prefs_filter_dest_radio_button_toggled     (void);
 static void prefs_filter_notrecv_radio_button_toggled  (void);
+static void prefs_filter_regex_check_button_toggled    (void);
 
 static gint prefs_filter_deleted       (GtkWidget      *widget,
                                         GdkEventAny    *event,
@@ -122,7 +121,7 @@ void prefs_filter_open(void)
        if (prefs_rc_is_readonly(FILTER_RC))
                return;
 
-       inc_autocheck_timer_remove();
+       inc_lock();
 
        if (!filter.window) {
                prefs_filter_create();
@@ -269,8 +268,8 @@ static void prefs_filter_create(void)
        gtk_widget_set_usize (hdr_combo1, 96, -1);
        gtkut_combo_set_items (GTK_COMBO (hdr_combo1),
                               "Subject", "From", "To", "Cc", "Reply-To",
-                              "Sender", "X-ML-Name", "X-List", "X-Sequence",
-                              "X-Mailer",
+                              "Sender", "List-Id",
+                              "X-ML-Name", "X-List", "X-Sequence", "X-Mailer",
                               NULL);
 
        hdr_combo2 = gtk_combo_new ();
@@ -280,8 +279,8 @@ static void prefs_filter_create(void)
        gtk_widget_set_usize (hdr_combo2, 96, -1);
        gtkut_combo_set_items (GTK_COMBO (hdr_combo2), _("(none)"),
                               "Subject", "From", "To", "Cc", "Reply-To",
-                              "Sender", "X-ML-Name", "X-List", "X-Sequence",
-                              "X-Mailer",
+                              "Sender", "List-Id",
+                              "X-ML-Name", "X-List", "X-Sequence", "X-Mailer",
                               NULL);
 
        key_label = gtk_label_new (_("Keyword"));
@@ -369,7 +368,10 @@ static void prefs_filter_create(void)
                            NULL);
 
        PACK_CHECK_BUTTON (dest_hbox, regex_chkbtn, _("Use regex"));
-       gtk_widget_set_sensitive(regex_chkbtn, FALSE);
+       gtk_signal_connect
+               (GTK_OBJECT (regex_chkbtn), "toggled",
+                GTK_SIGNAL_FUNC (prefs_filter_regex_check_button_toggled),
+                NULL);
 
        notrecv_radiobtn = gtk_radio_button_new_with_label
                (recv_group, _("Don't receive"));
@@ -439,6 +441,8 @@ static void prefs_filter_create(void)
                                GTK_CAN_FOCUS);
        gtk_signal_connect (GTK_OBJECT (cond_clist), "select_row",
                            GTK_SIGNAL_FUNC (prefs_filter_select), NULL);
+       gtk_signal_connect (GTK_OBJECT (cond_clist), "row_move",
+                           GTK_SIGNAL_FUNC (prefs_filter_row_move), NULL);
 
        btn_vbox = gtk_vbox_new (FALSE, 8);
        gtk_widget_show (btn_vbox);
@@ -646,12 +650,16 @@ static gint prefs_filter_clist_set_row(gint row)
                        flt->body2 = g_strdup(entry_text);
        }
 
+       if (gtk_toggle_button_get_active
+               (GTK_TOGGLE_BUTTON(filter.regex_chkbtn)))
+               flt->flag1 = flt->flag2 = FLT_REGEX;
+
        GET_ENTRY(filter.pred_entry1);
        if (!strcmp(entry_text, _("contains")))
-               flt->flag1 = FLT_CONTAIN;
+               flt->flag1 |= FLT_CONTAIN;
        GET_ENTRY(filter.pred_entry2);
        if (!strcmp(entry_text, _("contains")))
-               flt->flag2 = FLT_CONTAIN;
+               flt->flag2 |= FLT_CONTAIN;
 
        GET_ENTRY(filter.op_entry);
        if (!strcmp(entry_text, "and"))
@@ -693,7 +701,7 @@ static void prefs_filter_select_dest_cb(void)
 {
        FolderItem *dest;
 
-       dest = foldersel_folder_sel(NULL);
+       dest = foldersel_folder_sel(NULL, NULL);
        if (!dest) return;
 
        gtk_entry_set_text(GTK_ENTRY(filter.dest_entry), dest->path);
@@ -750,10 +758,8 @@ static void prefs_filter_up(void)
        if (!clist->selection) return;
 
        row = GPOINTER_TO_INT(clist->selection->data);
-       if (row > 1) {
+       if (row > 1)
                gtk_clist_row_move(clist, row, row - 1);
-               prefs_filter_set_list();
-       }
 }
 
 static void prefs_filter_down(void)
@@ -764,10 +770,8 @@ static void prefs_filter_down(void)
        if (!clist->selection) return;
 
        row = GPOINTER_TO_INT(clist->selection->data);
-       if (row > 0 && row < clist->rows - 1) {
+       if (row > 0 && row < clist->rows - 1)
                gtk_clist_row_move(clist, row, row + 1);
-               prefs_filter_set_list();
-       }
 }
 
 #define ENTRY_SET_TEXT(entry, str) \
@@ -780,6 +784,7 @@ static void prefs_filter_select(GtkCList *clist, gint row, gint column,
        Filter default_flt = {"Subject", NULL, _("(none)"), NULL,
                              FLT_CONTAIN, FLT_CONTAIN, FLT_AND,
                              NULL, FLT_MOVE};
+       gboolean is_regex;
 
        flt = gtk_clist_get_row_data(clist, row);
        if (!flt)
@@ -799,6 +804,12 @@ static void prefs_filter_select(GtkCList *clist, gint row, gint column,
                       FLT_IS_CONTAIN(flt->flag2)
                       ? _("contains") : _("not contain"));
 
+       is_regex = FLT_IS_REGEX(flt->flag1);
+       gtk_widget_set_sensitive(filter.pred_combo1, !is_regex);
+       gtk_widget_set_sensitive(filter.pred_combo2, !is_regex);
+       gtk_toggle_button_set_active
+               (GTK_TOGGLE_BUTTON(filter.regex_chkbtn), is_regex);
+
        gtk_entry_set_text(GTK_ENTRY(filter.op_entry),
                           flt->cond == FLT_OR ? "or" : "and");
        if (flt->action == FLT_NOTRECV)
@@ -809,6 +820,16 @@ static void prefs_filter_select(GtkCList *clist, gint row, gint column,
                        (GTK_TOGGLE_BUTTON(filter.dest_radiobtn), TRUE);
 }
 
+static void prefs_filter_row_move(GtkCList *clist, gint source_row,
+                                 gint dest_row)
+{
+       prefs_filter_set_list();
+       if (gtk_clist_row_is_visible(clist, dest_row) != GTK_VISIBILITY_FULL) {
+               gtk_clist_moveto(clist, dest_row, -1,
+                                source_row < dest_row ? 1.0 : 0.0, 0.0);
+       }
+}
+
 static void prefs_filter_dest_radio_button_toggled(void)
 {
        gtk_widget_set_sensitive(filter.dest_entry, TRUE);
@@ -821,6 +842,16 @@ static void prefs_filter_notrecv_radio_button_toggled(void)
        gtk_widget_set_sensitive(filter.destsel_btn, FALSE);
 }
 
+static void prefs_filter_regex_check_button_toggled(void)
+{
+       gboolean is_regex;
+
+       is_regex = gtk_toggle_button_get_active
+               (GTK_TOGGLE_BUTTON(filter.regex_chkbtn));
+       gtk_widget_set_sensitive(filter.pred_combo1, !is_regex);
+       gtk_widget_set_sensitive(filter.pred_combo2, !is_regex);
+}
+
 static gint prefs_filter_deleted(GtkWidget *widget, GdkEventAny *event,
                                 gpointer data)
 {
@@ -839,12 +870,12 @@ static void prefs_filter_ok(void)
 {
        prefs_filter_write_config();
        gtk_widget_hide(filter.window);
-       inc_autocheck_timer_set();      
+       inc_unlock();
 }
 
 static void prefs_filter_cancel(void)
 {
        prefs_filter_read_config();
        gtk_widget_hide(filter.window);
-       inc_autocheck_timer_set();      
+       inc_unlock();
 }