fix english ;)
[claws.git] / src / prefs_scoring.c
index 79e10184498805e36c5ffa38ece07bb76e865d93..97e396c13bfc8245819f296328f3c6e0730b5f6f 100644 (file)
 #include "folder.h"
 #include "scoring.h"
 
+#include "matcher_parser.h"
+
 static struct Scoring {
        GtkWidget *window;
 
        GtkWidget *ok_btn;
        GtkWidget *cond_entry;
        GtkWidget *score_entry;
+       GtkWidget *kill_score_label;
+       GtkWidget *kill_score_entry;
+       GtkWidget *important_score_entry;
 
        GtkWidget *cond_clist;
 } scoring;
@@ -64,11 +69,6 @@ static struct Scoring {
    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_scoring_create               (void);
 
@@ -101,9 +101,17 @@ static gint prefs_scoring_clist_set_row(gint row, ScoringProp * prop);
 static void prefs_scoring_select_set_dialog(ScoringProp * prop);
 static void prefs_scoring_reset_dialog(void);
 
-void prefs_scoring_open(void)
+
+static FolderItem * cur_item = NULL;
+static gint cur_important_score;
+static gint cur_kill_score;
+
+void prefs_scoring_open(FolderItem * item)
 {
-       inc_autocheck_timer_remove();
+       if (prefs_rc_is_readonly(SCORING_RC))
+               return;
+
+       inc_lock();
 
        if (!scoring.window) {
                prefs_scoring_create();
@@ -112,6 +120,8 @@ void prefs_scoring_open(void)
        manage_window_set_transient(GTK_WINDOW(scoring.window));
        gtk_widget_grab_focus(scoring.ok_btn);
 
+       cur_item = item;
+
        prefs_scoring_set_dialog(NULL);
 
        gtk_widget_show(scoring.window);
@@ -119,7 +129,7 @@ void prefs_scoring_open(void)
 
 void prefs_scoring_open_with_scoring(ScoringProp * prop)
 {
-       inc_autocheck_timer_remove();
+       inc_lock();
 
        if (!scoring.window) {
                prefs_scoring_create();
@@ -165,9 +175,13 @@ static void prefs_scoring_create(void)
        GtkWidget *up_btn;
        GtkWidget *down_btn;
 
-       gchar *title[] = {_("Registered rules")};
+       GtkWidget *important_score_entry;
+       GtkWidget *kill_score_entry;
+       GtkWidget *kill_score_label;
 
-       debug_print(_("Creating scoring setting window...\n"));
+       gchar *title[1];
+
+       debug_print("Creating scoring configuration window...\n");
 
        window = gtk_window_new (GTK_WINDOW_DIALOG);
        gtk_container_set_border_width (GTK_CONTAINER (window), 8);
@@ -186,15 +200,12 @@ static void prefs_scoring_create(void)
        gtk_widget_grab_default (ok_btn);
 
        gtk_window_set_title (GTK_WINDOW(window),
-                             _("Scoring setting"));
+                             _("Scoring configuration"));
        gtk_signal_connect (GTK_OBJECT(window), "delete_event",
                            GTK_SIGNAL_FUNC(prefs_scoring_deleted), NULL);
        gtk_signal_connect (GTK_OBJECT(window), "key_press_event",
                            GTK_SIGNAL_FUNC(prefs_scoring_key_pressed), NULL);
-       gtk_signal_connect (GTK_OBJECT(window), "focus_in_event",
-                           GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
-       gtk_signal_connect (GTK_OBJECT(window), "focus_out_event",
-                           GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
+       MANAGE_WINDOW_SIGNALS_CONNECT (window);
        gtk_signal_connect (GTK_OBJECT(ok_btn), "clicked",
                            GTK_SIGNAL_FUNC(prefs_scoring_ok), NULL);
        gtk_signal_connect (GTK_OBJECT(cancel_btn), "clicked",
@@ -257,13 +268,13 @@ static void prefs_scoring_create(void)
        gtk_widget_show (btn_hbox);
        gtk_box_pack_start (GTK_BOX (reg_hbox), btn_hbox, FALSE, FALSE, 0);
 
-       reg_btn = gtk_button_new_with_label (_("Register"));
+       reg_btn = gtk_button_new_with_label (_("Add"));
        gtk_widget_show (reg_btn);
        gtk_box_pack_start (GTK_BOX (btn_hbox), reg_btn, FALSE, TRUE, 0);
        gtk_signal_connect (GTK_OBJECT (reg_btn), "clicked",
                            GTK_SIGNAL_FUNC (prefs_scoring_register_cb), NULL);
 
-       subst_btn = gtk_button_new_with_label (_(" Substitute "));
+       subst_btn = gtk_button_new_with_label (_("  Replace  "));
        gtk_widget_show (subst_btn);
        gtk_box_pack_start (GTK_BOX (btn_hbox), subst_btn, FALSE, TRUE, 0);
        gtk_signal_connect (GTK_OBJECT (subst_btn), "clicked",
@@ -289,6 +300,7 @@ static void prefs_scoring_create(void)
                                        GTK_POLICY_AUTOMATIC,
                                        GTK_POLICY_AUTOMATIC);
 
+       title[0] = _("Current scoring rules");
        cond_clist = gtk_clist_new_with_titles(1, title);
        gtk_widget_show (cond_clist);
        gtk_container_add (GTK_CONTAINER (cond_scrolledwin), cond_clist);
@@ -316,6 +328,33 @@ static void prefs_scoring_create(void)
        gtk_signal_connect (GTK_OBJECT (down_btn), "clicked",
                            GTK_SIGNAL_FUNC (prefs_scoring_down), NULL);
 
+       hbox1 = gtk_hbox_new (FALSE, 8);
+       gtk_widget_show (hbox1);
+       gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
+
+       kill_score_label = gtk_label_new (_("Hide score"));
+       gtk_widget_show (kill_score_label);
+       gtk_misc_set_alignment (GTK_MISC (kill_score_label), 0, 0.5);
+       gtk_box_pack_start (GTK_BOX (hbox1), kill_score_label,
+                           FALSE, FALSE, 0);
+
+       kill_score_entry = gtk_entry_new ();
+       gtk_widget_show (kill_score_entry);
+       gtk_widget_set_usize (kill_score_entry, 50, -1);
+       gtk_box_pack_start (GTK_BOX (hbox1), kill_score_entry,
+                           FALSE, FALSE, 0);
+
+       score_label = gtk_label_new (_("Important score"));
+       gtk_widget_show (score_label);
+       gtk_misc_set_alignment (GTK_MISC (score_label), 0, 0.5);
+       gtk_box_pack_start (GTK_BOX (hbox1), score_label, FALSE, FALSE, 0);
+
+       important_score_entry = gtk_entry_new ();
+       gtk_widget_show (important_score_entry);
+       gtk_widget_set_usize (important_score_entry, 50, -1);
+       gtk_box_pack_start (GTK_BOX (hbox1), important_score_entry,
+                           FALSE, FALSE, 0);
+
        gtk_widget_show_all(window);
 
        scoring.window    = window;
@@ -323,6 +362,9 @@ static void prefs_scoring_create(void)
 
        scoring.cond_entry = cond_entry;
        scoring.score_entry = score_entry;
+       scoring.kill_score_entry = kill_score_entry;
+       scoring.kill_score_label = kill_score_label;
+       scoring.important_score_entry = important_score_entry;
 
        scoring.cond_clist   = cond_clist;
 }
@@ -331,6 +373,8 @@ static void prefs_scoring_set_dialog(ScoringProp * cond)
 {
        GtkCList *clist = GTK_CLIST(scoring.cond_clist);
        GSList *cur;
+       GSList * prefs_scoring;
+       gchar * score_str;
 
        if (cond == NULL)
                prefs_scoring_reset_dialog();
@@ -341,12 +385,41 @@ static void prefs_scoring_set_dialog(ScoringProp * cond)
        gtk_clist_clear(clist);
 
        prefs_scoring_clist_set_row(-1, NULL);
-       for(cur = prefs_scoring ; cur != NULL ; cur = g_slist_next(cur)) {
-               ScoringProp * prop = (ScoringProp *) cur->data;
+       if (cur_item == NULL) {
+               prefs_scoring = global_scoring;
+               cur_kill_score = prefs_common.kill_score;
+               cur_important_score = prefs_common.important_score;
+               gtk_widget_show(scoring.kill_score_label);
+               gtk_widget_show(scoring.kill_score_entry);
+       }
+       else {
+               prefs_scoring = cur_item->prefs->scoring;
+               cur_kill_score = cur_item->prefs->kill_score;
+               cur_important_score = cur_item->prefs->important_score;
+               if (cur_item->folder->type != F_NEWS) {
+                       gtk_widget_hide(scoring.kill_score_label);
+                       gtk_widget_hide(scoring.kill_score_entry);
+               }
+               else {
+                       gtk_widget_show(scoring.kill_score_label);
+                       gtk_widget_show(scoring.kill_score_entry);
+               }
+       }
 
+       for(cur = prefs_scoring ; cur != NULL ;
+           cur = g_slist_next(cur)) {
+               ScoringProp * prop = (ScoringProp *) cur->data;
+               
                prefs_scoring_clist_set_row(-1, prop);
        }
 
+       score_str = itos(cur_kill_score);
+       gtk_entry_set_text(GTK_ENTRY(scoring.kill_score_entry),
+                          score_str);
+       score_str = itos(cur_important_score);
+       gtk_entry_set_text(GTK_ENTRY(scoring.important_score_entry),
+                          score_str);
+
        gtk_clist_thaw(clist);
 }
 
@@ -362,9 +435,15 @@ static void prefs_scoring_set_list(void)
        ScoringProp *prop;
        GSList * cur;
        gchar * scoring_str;
-       gchar * tmp;
+       GSList * prefs_scoring;
+
+       if (cur_item == NULL)
+               prefs_scoring = global_scoring;
+       else
+               prefs_scoring = cur_item->prefs->scoring;
 
-       for(cur = prefs_scoring ; cur != NULL ; cur = g_slist_next(cur))
+       for(cur = prefs_scoring ; cur != NULL ;
+           cur = g_slist_next(cur))
                scoringprop_free((ScoringProp *) cur->data);
        g_slist_free(prefs_scoring);
        prefs_scoring = NULL;
@@ -372,14 +451,27 @@ static void prefs_scoring_set_list(void)
        while (gtk_clist_get_text(GTK_CLIST(scoring.cond_clist),
                                  row, 0, &scoring_str)) {
                if (strcmp(scoring_str, _("(New)")) != 0) {
-                       tmp = scoring_str;
-                       prop = scoringprop_parse(&tmp);
+                       prop = matcher_parser_get_scoring(scoring_str);
                        if (prop != NULL)
                                prefs_scoring = g_slist_append(prefs_scoring,
                                                               prop);
                }
                row++;
        }
+
+       cur_kill_score = atoi(gtk_entry_get_text(GTK_ENTRY(scoring.kill_score_entry)));
+       cur_important_score = atoi(gtk_entry_get_text(GTK_ENTRY(scoring.important_score_entry)));
+
+       if (cur_item == NULL) {
+               global_scoring = prefs_scoring;
+               prefs_common.kill_score = cur_kill_score;
+               prefs_common.important_score = cur_important_score;
+       }
+       else {
+               cur_item->prefs->scoring = prefs_scoring;
+               cur_item->prefs->kill_score = cur_kill_score;
+               cur_item->prefs->important_score = cur_important_score;
+       }
 }
 
 static gint prefs_scoring_clist_set_row(gint row, ScoringProp * prop)
@@ -431,11 +523,8 @@ static void prefs_scoring_condition_define(void)
        cond_str = gtk_entry_get_text(GTK_ENTRY(scoring.cond_entry));
 
        if (*cond_str != '\0') {
-               gchar * tmp;
-               
-               tmp = cond_str;
-               matchers = matcherlist_parse(&tmp);
-               if (tmp == NULL)
+               matchers = matcher_parser_get_cond(cond_str);
+               if (matchers == NULL)
                        alertpanel_error(_("Match string is not valid."));
        }
 
@@ -455,26 +544,24 @@ static void prefs_scoring_register_cb(void)
        gchar * score_str;
        ScoringProp * prop;
        gint score;
-       gchar * tmp;
 
        cond_str = gtk_entry_get_text(GTK_ENTRY(scoring.cond_entry));
        if (*cond_str == '\0') {
-               alertpanel_error(_("Score is not set."));
+               alertpanel_error(_("Condition string is empty."));
                return;
        }
 
        score_str = gtk_entry_get_text(GTK_ENTRY(scoring.score_entry));
        if (*score_str == '\0') {
-               alertpanel_error(_("Match string is not set."));
+               alertpanel_error(_("Score is not set."));
                return;
        }
 
        score = atoi(score_str);
-       tmp = cond_str;
-       cond = matcherlist_parse(&tmp);
+       cond = matcher_parser_get_cond(cond_str);
 
-       if (tmp == NULL) {
-               alertpanel_error(_("Match string is not valid."));
+       if (cond == NULL) {
+               alertpanel_error(_("Condition string is not valid."));
                return;
        }
 
@@ -496,7 +583,6 @@ static void prefs_scoring_substitute_cb(void)
        gchar * score_str;
        ScoringProp * prop;
        gint score;
-       gchar * tmp;
 
        if (!clist->selection) return;
 
@@ -505,22 +591,21 @@ static void prefs_scoring_substitute_cb(void)
 
        cond_str = gtk_entry_get_text(GTK_ENTRY(scoring.cond_entry));
        if (*cond_str == '\0') {
-               alertpanel_error(_("Score is not set."));
+               alertpanel_error(_("Condition string is empty."));
                return;
        }
 
        score_str = gtk_entry_get_text(GTK_ENTRY(scoring.score_entry));
        if (*score_str == '\0') {
-               alertpanel_error(_("Match string is not set."));
+               alertpanel_error(_("Score is not set."));
                return;
        }
 
        score = atoi(score_str);
-       tmp = cond_str;
-       cond = matcherlist_parse(&tmp);
+       cond = matcher_parser_get_cond(cond_str);
 
-       if (tmp == NULL) {
-               alertpanel_error(_("Match string is not valid."));
+       if (cond == NULL) {
+               alertpanel_error(_("Condition string is not valid."));
                return;
        }
 
@@ -560,6 +645,9 @@ static void prefs_scoring_up(void)
        row = GPOINTER_TO_INT(clist->selection->data);
        if (row > 1) {
                gtk_clist_row_move(clist, row, row - 1);
+               if(gtk_clist_row_is_visible(clist, row - 1) != GTK_VISIBILITY_FULL) {
+                       gtk_clist_moveto(clist, row - 1, 0, 0, 0);
+               } 
        }
 }
 
@@ -573,6 +661,9 @@ static void prefs_scoring_down(void)
        row = GPOINTER_TO_INT(clist->selection->data);
        if (row > 0 && row < clist->rows - 1) {
                gtk_clist_row_move(clist, row, row + 1);
+               if(gtk_clist_row_is_visible(clist, row + 1) != GTK_VISIBILITY_FULL) {
+                       gtk_clist_moveto(clist, row + 1, 0, 1, 0);
+               } 
        }
 }
 
@@ -602,7 +693,6 @@ static void prefs_scoring_select(GtkCList *clist, gint row, gint column,
                                GdkEvent *event)
 {
        ScoringProp * prop;
-       gchar * tmp;
 
        gchar * scoring_str;
 
@@ -615,9 +705,8 @@ static void prefs_scoring_select(GtkCList *clist, gint row, gint column,
                                row, 0, &scoring_str))
                return;
 
-       tmp = scoring_str;
-       prop = scoringprop_parse(&tmp);
-       if (tmp == NULL)
+       prop = matcher_parser_get_scoring(scoring_str);
+       if (prop == NULL)
                return;
 
        prefs_scoring_select_set_dialog(prop);
@@ -641,13 +730,62 @@ static void prefs_scoring_key_pressed(GtkWidget *widget, GdkEventKey *event,
 
 static void prefs_scoring_ok(void)
 {
+       MatcherList * cond;
+       gchar * cond_str;
+       gchar * score_str;
+       gchar * scoring_str;
+       gchar * str;
+       ScoringProp * prop;
+       gint score;
+       gint row = 1;
+        AlertValue val;
+
+       cond_str = gtk_entry_get_text(GTK_ENTRY(scoring.cond_entry));
+       score_str = gtk_entry_get_text(GTK_ENTRY(scoring.score_entry));
+       if (*cond_str != '\0' && *score_str != '\0') {
+               score = atoi(score_str);
+               cond = matcher_parser_get_cond(cond_str);
+
+               if (cond == NULL) {
+                       prefs_common_save_config();
+                       prefs_scoring_set_list();
+                       prefs_matcher_write_config();
+                       if (cur_item != NULL)
+                               prefs_folder_item_save_config(cur_item);
+                       gtk_widget_hide(scoring.window);
+                       inc_unlock();
+                       return;
+               }
+               prop = scoringprop_new(cond, score);
+               str = scoringprop_to_string(prop);
+               while (gtk_clist_get_text(GTK_CLIST(scoring.cond_clist),
+                                 row, 0, &scoring_str)) {
+                       if (strcmp(scoring_str, str) == 0) break;
+                       row++;
+               }
+                if (strcmp(scoring_str, str) != 0) {
+                        val = alertpanel(_("Entry not registered"),
+                                 _("The entry was not registered\nAre you really finished?"),
+                                 _("Yes"), _("No"), NULL);
+                        if (G_ALERTDEFAULT != val) {
+                                g_free(str);
+                                return;
+                        }
+                }
+               g_free(str);
+       }
+       prefs_common_save_config();
        prefs_scoring_set_list();
-       prefs_scoring_write_config();
+       prefs_matcher_write_config();
+       if (cur_item != NULL)
+               prefs_folder_item_save_config(cur_item);
        gtk_widget_hide(scoring.window);
+       inc_unlock();
 }
 
 static void prefs_scoring_cancel(void)
 {
-       prefs_scoring_read_config();
+       prefs_matcher_read_config();
        gtk_widget_hide(scoring.window);
+       inc_unlock();
 }