2007-07-30 [paul] 2.10.0cvs80
[claws.git] / src / prefs_matcher.c
index c27d3f38d9d822d688d2192749156d64f7445aa6..f7bc3d5814c19c932e324a4c27d903ed053882dd 100644 (file)
@@ -4,7 +4,7 @@
  *
  * 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
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
@@ -13,8 +13,8 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * 
  */
 
 #ifdef HAVE_CONFIG_H
@@ -136,47 +136,77 @@ enum {
        CRITERIA_SPAM = 22,
        CRITERIA_COLORLABEL = 23,
        CRITERIA_IGNORE_THREAD = 24,
+       CRITERIA_WATCH_THREAD = 25,
 
-       CRITERIA_SCORE_GREATER = 25,
-       CRITERIA_SCORE_LOWER = 26,
-       CRITERIA_SCORE_EQUAL = 27,
+       CRITERIA_SCORE_GREATER = 26,
+       CRITERIA_SCORE_LOWER = 27,
+       CRITERIA_SCORE_EQUAL = 28,
 
-       CRITERIA_TEST = 28,
+       CRITERIA_TEST = 29,
 
-       CRITERIA_SIZE_GREATER = 29,
-       CRITERIA_SIZE_SMALLER = 30,
-       CRITERIA_SIZE_EQUAL   = 31,
+       CRITERIA_SIZE_GREATER = 30,
+       CRITERIA_SIZE_SMALLER = 31,
+       CRITERIA_SIZE_EQUAL   = 32,
        
-       CRITERIA_PARTIAL = 32,
+       CRITERIA_PARTIAL = 33,
 
-       CRITERIA_FOUND_IN_ADDRESSBOOK = 33,
+       CRITERIA_FOUND_IN_ADDRESSBOOK = 34,
+       
+       CRITERIA_TAG = 35,
+       CRITERIA_TAGGED = 36
 };
 
 /*!
  *\brief       Descriptive text for conditions
  */
-static const gchar *criteria_text [] = {
-       N_("All messages"), N_("Subject"),
-       N_("From"), N_("To"), N_("Cc"), N_("To or Cc"),
-       N_("Newsgroups"), N_("In reply to"), N_("References"),
-       N_("Age greater than"), N_("Age lower than"),
-       N_("Header"), N_("Headers part"),
-       N_("Body part"), N_("Whole message"),
-       N_("Unread flag"), N_("New flag"),
-       N_("Marked flag"), N_("Deleted flag"),
-       N_("Replied flag"), N_("Forwarded flag"),
-       N_("Locked flag"),
-       N_("Spam flag"),
-       N_("Color label"),
-       N_("Ignored thread"),
-       N_("Score greater than"), N_("Score lower than"),
-       N_("Score equal to"),
-       N_("Test"),
-       N_("Size greater than"), 
-       N_("Size smaller than"),
-       N_("Size exactly"),
-       N_("Partially downloaded"),
-       N_("Found in addressbook")
+typedef struct _struct_criteria_text struct_criteria_text;
+struct _struct_criteria_text {
+       const gchar     *text;
+       gboolean         contains_header_name;
+       /* if contains_header_name is TRUE, prefs_common_translated_headername(text)
+          will be used
+       */
+};
+
+static struct_criteria_text criteria_text [] = {
+       { N_("All messages"), FALSE },
+       { N_("Subject"), TRUE },
+       { N_("From"), TRUE },
+       { N_("To"), TRUE },
+       { N_("Cc"), TRUE },
+       { N_("To or Cc"), TRUE },
+       { N_("Newsgroups"), TRUE },
+       { N_("In reply to"), TRUE },
+       { N_("References"), TRUE },
+       { N_("Age greater than (days)"), FALSE },
+       { N_("Age less than (days)"), FALSE },
+       { N_("Header"), FALSE },
+       { N_("Headers part"), FALSE },
+       { N_("Body part"), FALSE },
+       { N_("Whole message"), FALSE },
+       { N_("Unread flag"), FALSE },
+       { N_("New flag"), FALSE },
+       { N_("Marked flag"), FALSE },
+       { N_("Deleted flag"), FALSE },
+       { N_("Replied flag"), FALSE },
+       { N_("Forwarded flag"), FALSE },
+       { N_("Locked flag"), FALSE },
+       { N_("Spam flag"), FALSE },
+       { N_("Color label"), FALSE },
+       { N_("Ignored thread"), FALSE },
+       { N_("Watched thread"), FALSE },
+       { N_("Score greater than"), FALSE },
+       { N_("Score lower than"), FALSE },
+       { N_("Score equal to"), FALSE },
+       { N_("Test"), FALSE },
+       { N_("Size greater than (bytes)"), FALSE }, 
+       { N_("Size smaller than (bytes)"), FALSE },
+       { N_("Size exactly (bytes)"), FALSE },
+       { N_("Partially downloaded"), FALSE },
+       { N_("Found in addressbook"), FALSE },
+       { N_("Tags"), FALSE },
+       { N_("Tagged"), FALSE },
+       { NULL, FALSE }
 };
 
 /*!
@@ -321,6 +351,10 @@ void prefs_matcher_open(MatcherList *matchers, PrefsMatcherSignal *cb)
 
        if (!matcher.window) {
                prefs_matcher_create();
+       } else {
+               /* update color label menu */
+               gtk_option_menu_set_menu(GTK_OPTION_MENU(matcher.color_optmenu),
+                               colorlabel_create_color_menu());
        }
 
        manage_window_set_transient(GTK_WINDOW(matcher.window));
@@ -469,15 +503,19 @@ static void prefs_matcher_create(void)
 
        combo_items = NULL;
 
-       for (i = 0; i < (gint) (sizeof(criteria_text) / sizeof(gchar *)); i++) {
-               combo_items = g_list_append(combo_items,
-                                           (gpointer) _(criteria_text[i]));
+       for (i = 0; criteria_text[i].text != NULL; i++) {
+               if (criteria_text[i].contains_header_name)
+                       combo_items = g_list_append(combo_items,
+                                           (gpointer) prefs_common_translated_header_name(criteria_text[i].text));
+               else
+                       combo_items = g_list_append(combo_items,
+                                           (gpointer) gettext(criteria_text[i].text));
        }
        gtk_combo_set_popdown_strings(GTK_COMBO(criteria_combo), combo_items);
 
        g_list_free(combo_items);
 
-       gtk_widget_set_size_request(criteria_combo, 170, -1);
+       gtk_widget_set_size_request(criteria_combo, 190, -1);
        gtk_table_attach(GTK_TABLE(criteria_table), criteria_combo, 0, 1, 1, 2,
                          0, 0, 0, 0);
        criteria_list = GTK_COMBO(criteria_combo)->list;
@@ -965,6 +1003,9 @@ static gint prefs_matcher_get_criteria_from_matching(gint matching_id)
        case MATCHCRITERIA_IGNORE_THREAD:
        case MATCHCRITERIA_NOT_IGNORE_THREAD:
                return CRITERIA_IGNORE_THREAD;
+       case MATCHCRITERIA_WATCH_THREAD:
+       case MATCHCRITERIA_NOT_WATCH_THREAD:
+               return CRITERIA_WATCH_THREAD;
        case MATCHCRITERIA_NOT_SUBJECT:
        case MATCHCRITERIA_SUBJECT:
                return CRITERIA_SUBJECT;
@@ -989,6 +1030,12 @@ static gint prefs_matcher_get_criteria_from_matching(gint matching_id)
        case MATCHCRITERIA_NOT_TO_AND_NOT_CC:
        case MATCHCRITERIA_TO_OR_CC:
                return CRITERIA_TO_OR_CC;
+       case MATCHCRITERIA_NOT_TAG:
+       case MATCHCRITERIA_TAG:
+               return CRITERIA_TAG;
+       case MATCHCRITERIA_NOT_TAGGED:
+       case MATCHCRITERIA_TAGGED:
+               return CRITERIA_TAGGED;
        case MATCHCRITERIA_NOT_BODY_PART:
        case MATCHCRITERIA_BODY_PART:
                return CRITERIA_BODY_PART;
@@ -1063,6 +1110,8 @@ static gint prefs_matcher_get_matching_from_criteria(gint criteria_id)
                return MATCHCRITERIA_COLORLABEL;
        case CRITERIA_IGNORE_THREAD:
                return MATCHCRITERIA_IGNORE_THREAD;
+       case CRITERIA_WATCH_THREAD:
+               return MATCHCRITERIA_WATCH_THREAD;
        case CRITERIA_SUBJECT:
                return MATCHCRITERIA_SUBJECT;
        case CRITERIA_FROM:
@@ -1073,6 +1122,10 @@ static gint prefs_matcher_get_matching_from_criteria(gint criteria_id)
                return MATCHCRITERIA_CC;
        case CRITERIA_TO_OR_CC:
                return MATCHCRITERIA_TO_OR_CC;
+       case CRITERIA_TAG:
+               return MATCHCRITERIA_TAG;
+       case CRITERIA_TAGGED:
+               return MATCHCRITERIA_TAGGED;
        case CRITERIA_NEWSGROUPS:
                return MATCHCRITERIA_NEWSGROUPS;
        case CRITERIA_INREPLYTO:
@@ -1145,6 +1198,8 @@ static gint prefs_matcher_not_criteria(gint matcher_criteria)
                return MATCHCRITERIA_NOT_COLORLABEL;
        case MATCHCRITERIA_IGNORE_THREAD:
                return MATCHCRITERIA_NOT_IGNORE_THREAD;
+       case MATCHCRITERIA_WATCH_THREAD:
+               return MATCHCRITERIA_NOT_WATCH_THREAD;
        case MATCHCRITERIA_SUBJECT:
                return MATCHCRITERIA_NOT_SUBJECT;
        case MATCHCRITERIA_FROM:
@@ -1155,6 +1210,10 @@ static gint prefs_matcher_not_criteria(gint matcher_criteria)
                return MATCHCRITERIA_NOT_CC;
        case MATCHCRITERIA_TO_OR_CC:
                return MATCHCRITERIA_NOT_TO_AND_NOT_CC;
+       case MATCHCRITERIA_TAG:
+               return MATCHCRITERIA_NOT_TAG;
+       case MATCHCRITERIA_TAGGED:
+               return MATCHCRITERIA_NOT_TAGGED;
        case MATCHCRITERIA_NEWSGROUPS:
                return MATCHCRITERIA_NOT_NEWSGROUPS;
        case MATCHCRITERIA_INREPLYTO:
@@ -1222,7 +1281,9 @@ static MatcherProp *prefs_matcher_dialog_to_matcher(void)
        case CRITERIA_TEST:
        case CRITERIA_COLORLABEL:
        case CRITERIA_IGNORE_THREAD:
+       case CRITERIA_WATCH_THREAD:
        case CRITERIA_FOUND_IN_ADDRESSBOOK:
+       case CRITERIA_TAGGED:
                if (value_pred_flag == PREDICATE_FLAG_DISABLED)
                        criteria = prefs_matcher_not_criteria(criteria);
                break;
@@ -1231,6 +1292,7 @@ static MatcherProp *prefs_matcher_dialog_to_matcher(void)
        case CRITERIA_TO:
        case CRITERIA_CC:
        case CRITERIA_TO_OR_CC:
+       case CRITERIA_TAG:
        case CRITERIA_NEWSGROUPS:
        case CRITERIA_INREPLYTO:
        case CRITERIA_REFERENCES:
@@ -1274,6 +1336,8 @@ static MatcherProp *prefs_matcher_dialog_to_matcher(void)
        case CRITERIA_SPAM:
        case CRITERIA_PARTIAL:
        case CRITERIA_IGNORE_THREAD:
+       case CRITERIA_WATCH_THREAD:
+       case CRITERIA_TAGGED:
                break;
 
        case CRITERIA_SUBJECT:
@@ -1281,6 +1345,7 @@ static MatcherProp *prefs_matcher_dialog_to_matcher(void)
        case CRITERIA_TO:
        case CRITERIA_CC:
        case CRITERIA_TO_OR_CC:
+       case CRITERIA_TAG:
        case CRITERIA_NEWSGROUPS:
        case CRITERIA_INREPLYTO:
        case CRITERIA_REFERENCES:
@@ -1624,6 +1689,8 @@ static void prefs_matcher_criteria_select(GtkList *list,
        case CRITERIA_SPAM:
        case CRITERIA_PARTIAL:
        case CRITERIA_IGNORE_THREAD:
+       case CRITERIA_WATCH_THREAD:
+       case CRITERIA_TAGGED:
                prefs_matcher_disable_widget(matcher.header_combo);
                prefs_matcher_disable_widget(matcher.header_label);
                prefs_matcher_disable_widget(matcher.header_addr_combo);
@@ -1664,6 +1731,7 @@ static void prefs_matcher_criteria_select(GtkList *list,
        case CRITERIA_TO:
        case CRITERIA_CC:
        case CRITERIA_TO_OR_CC:
+       case CRITERIA_TAG:
        case CRITERIA_NEWSGROUPS:
        case CRITERIA_INREPLYTO:
        case CRITERIA_REFERENCES:
@@ -2051,11 +2119,14 @@ static gboolean prefs_matcher_selected(GtkTreeSelection *selector,
        case MATCHCRITERIA_NOT_PARTIAL:
        case MATCHCRITERIA_NOT_COLORLABEL:
        case MATCHCRITERIA_NOT_IGNORE_THREAD:
+       case MATCHCRITERIA_NOT_WATCH_THREAD:
        case MATCHCRITERIA_NOT_SUBJECT:
        case MATCHCRITERIA_NOT_FROM:
        case MATCHCRITERIA_NOT_TO:
        case MATCHCRITERIA_NOT_CC:
        case MATCHCRITERIA_NOT_TO_AND_NOT_CC:
+       case MATCHCRITERIA_NOT_TAG:
+       case MATCHCRITERIA_NOT_TAGGED:
        case MATCHCRITERIA_NOT_NEWSGROUPS:
        case MATCHCRITERIA_NOT_INREPLYTO:
        case MATCHCRITERIA_NOT_REFERENCES:
@@ -2078,6 +2149,7 @@ static gboolean prefs_matcher_selected(GtkTreeSelection *selector,
        case MATCHCRITERIA_NOT_TO:
        case MATCHCRITERIA_NOT_CC:
        case MATCHCRITERIA_NOT_TO_AND_NOT_CC:
+       case MATCHCRITERIA_NOT_TAG:
        case MATCHCRITERIA_NOT_NEWSGROUPS:
        case MATCHCRITERIA_NOT_INREPLYTO:
        case MATCHCRITERIA_NOT_REFERENCES:
@@ -2090,6 +2162,7 @@ static gboolean prefs_matcher_selected(GtkTreeSelection *selector,
        case MATCHCRITERIA_TO:
        case MATCHCRITERIA_CC:
        case MATCHCRITERIA_TO_OR_CC:
+       case MATCHCRITERIA_TAG:
        case MATCHCRITERIA_NEWSGROUPS:
        case MATCHCRITERIA_INREPLYTO:
        case MATCHCRITERIA_REFERENCES: