remove gtk_window_set_wmclass()
[claws.git] / src / prefs_filtering_action.c
index fc7b2f0cfff40a49bf795c05c5768bff00af2b9a..54e2c64aef7ef56e96caf6dbf9def78dc0d4abe1 100644 (file)
@@ -46,6 +46,7 @@
 #include "alertpanel.h"
 #include "folder.h"
 #include "description_window.h"
+#include "addr_compl.h"
 
 #include "matcher_parser.h"
 #include "colorlabel.h"
@@ -97,6 +98,7 @@ static struct FilteringAction {
        GtkWidget *exec_btn;
        GtkWidget *color_label;
        GtkWidget *color_optmenu;
+       GtkWidget *score_label;
 
        gint current_action;
 } filtering_action;
@@ -117,6 +119,10 @@ typedef enum Action_ {
        ACTION_REDIRECT,
        ACTION_EXECUTE,
        ACTION_COLOR,
+       ACTION_CHANGE_SCORE,
+       ACTION_SET_SCORE,
+       ACTION_HIDE,
+       ACTION_STOP,
        /* add other action constants */
 } Action;
 
@@ -137,7 +143,11 @@ static struct {
        { N_("Forward as attachment"),  ACTION_FORWARD_AS_ATTACHMENT },
        { N_("Redirect"),               ACTION_REDIRECT },
        { N_("Execute"),                ACTION_EXECUTE  },
-       { N_("Color"),                  ACTION_COLOR    }
+       { N_("Color"),                  ACTION_COLOR    },
+       { N_("Change score"),           ACTION_CHANGE_SCORE},
+       { N_("Set score"),              ACTION_SET_SCORE},
+       { N_("Hide"),                   ACTION_HIDE     },
+       { N_("Stop filter"),            ACTION_STOP     },
 };
 
 
@@ -159,7 +169,7 @@ static gint get_sel_from_list(GtkList *list)
        void * sel;
        GList * child;
 
-       if (list->selection == NULL)
+       if (list->selection == NULL) 
                return -1;
 
        sel = list->selection->data;
@@ -220,6 +230,7 @@ static void prefs_filtering_action_create(void)
        GtkWidget *account_list;
        GtkWidget *dest_label;
        GtkWidget *exec_label;
+       GtkWidget *score_label;
        GtkWidget *color_label;
        GtkWidget *account_label;
        GtkWidget *account_combo;
@@ -256,9 +267,9 @@ static void prefs_filtering_action_create(void)
 
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_container_set_border_width(GTK_CONTAINER(window), 8);
-       gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+       gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_window_set_modal(GTK_WINDOW(window), TRUE);
-       gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE);
+       gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
 
        vbox = gtk_vbox_new(FALSE, 6);
        gtk_widget_show(vbox);
@@ -272,15 +283,15 @@ static void prefs_filtering_action_create(void)
 
        gtk_window_set_title(GTK_WINDOW(window),
                             _("Filtering action configuration"));
-       gtk_signal_connect(GTK_OBJECT(window), "delete_event",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_deleted), NULL);
-       gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_key_pressed), NULL);
+       g_signal_connect(G_OBJECT(window), "delete_event",
+                        G_CALLBACK(prefs_filtering_action_deleted), NULL);
+       g_signal_connect(G_OBJECT(window), "key_press_event",
+                        G_CALLBACK(prefs_filtering_action_key_pressed), NULL);
        MANAGE_WINDOW_SIGNALS_CONNECT(window);
-       gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_ok), NULL);
-       gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_cancel), NULL);
+       g_signal_connect(G_OBJECT(ok_btn), "clicked",
+                        G_CALLBACK(prefs_filtering_action_ok), NULL);
+       g_signal_connect(G_OBJECT(cancel_btn), "clicked",
+                        G_CALLBACK(prefs_filtering_action_cancel), NULL);
 
        vbox1 = gtk_vbox_new(FALSE, VSPACING);
        gtk_widget_show(vbox1);
@@ -315,13 +326,13 @@ static void prefs_filtering_action_create(void)
        gtk_box_pack_start (GTK_BOX (hbox1), action_combo,
                            TRUE, TRUE, 0);
        action_type_list = GTK_COMBO(action_combo)->list;
-       gtk_signal_connect (GTK_OBJECT (action_type_list), "select-child",
-                           GTK_SIGNAL_FUNC (prefs_filtering_action_type_select),
-                           NULL);
+       g_signal_connect (G_OBJECT(action_type_list), "select-child",
+                         G_CALLBACK(prefs_filtering_action_type_select),
+                         NULL);
 
-       gtk_signal_connect(GTK_OBJECT(action_type_list), "selection-changed",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_type_selection_changed),
-                          NULL);
+       g_signal_connect(G_OBJECT(action_type_list), "selection-changed",
+                        G_CALLBACK(prefs_filtering_action_type_selection_changed),
+                        NULL);
 
        /* accounts */
 
@@ -391,6 +402,11 @@ static void prefs_filtering_action_create(void)
        gtk_misc_set_alignment(GTK_MISC(color_label), 0, 0.5);
        gtk_box_pack_start(GTK_BOX(hbox1), color_label, FALSE, FALSE, 0);
 
+       score_label = gtk_label_new (_("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);
+
        dest_entry = gtk_entry_new ();
        gtk_widget_set_usize (dest_entry, 150, -1);
        gtk_widget_show (dest_entry);
@@ -404,16 +420,16 @@ static void prefs_filtering_action_create(void)
        dest_btn = gtk_button_new_with_label (_("Select ..."));
        gtk_widget_show (dest_btn);
        gtk_box_pack_start (GTK_BOX (hbox1), dest_btn, FALSE, FALSE, 0);
-       gtk_signal_connect (GTK_OBJECT (dest_btn), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_filtering_action_select_dest),
-                           NULL);
+       g_signal_connect (G_OBJECT (dest_btn), "clicked",
+                         G_CALLBACK(prefs_filtering_action_select_dest),
+                         NULL);
 
        exec_btn = gtk_button_new_with_label (_("Info ..."));
        gtk_widget_show (exec_btn);
        gtk_box_pack_start (GTK_BOX (hbox1), exec_btn, FALSE, FALSE, 0);
-       gtk_signal_connect (GTK_OBJECT (exec_btn), "clicked",
-                           GTK_SIGNAL_FUNC (prefs_filtering_action_exec_info),
-                           NULL);
+       g_signal_connect (G_OBJECT (exec_btn), "clicked",
+                         G_CALLBACK(prefs_filtering_action_exec_info),
+                         NULL);
 
        /* register / substitute / delete */
 
@@ -433,21 +449,21 @@ static void prefs_filtering_action_create(void)
        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_filtering_action_register_cb), NULL);
+       g_signal_connect(G_OBJECT(reg_btn), "clicked",
+                        G_CALLBACK(prefs_filtering_action_register_cb), NULL);
 
        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",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_substitute_cb),
-                          NULL);
+       g_signal_connect(G_OBJECT(subst_btn), "clicked",
+                        G_CALLBACK(prefs_filtering_action_substitute_cb),
+                        NULL);
 
        del_btn = gtk_button_new_with_label(_("Delete"));
        gtk_widget_show(del_btn);
        gtk_box_pack_start(GTK_BOX(btn_hbox), del_btn, FALSE, TRUE, 0);
-       gtk_signal_connect(GTK_OBJECT(del_btn), "clicked",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_delete_cb), NULL);
+       g_signal_connect(G_OBJECT(del_btn), "clicked",
+                        G_CALLBACK(prefs_filtering_action_delete_cb), NULL);
 
        action_hbox = gtk_hbox_new(FALSE, 8);
        gtk_widget_show(action_hbox);
@@ -471,8 +487,8 @@ static void prefs_filtering_action_create(void)
                                     GTK_SELECTION_BROWSE);
        GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(action_clist)->column[0].button,
                               GTK_CAN_FOCUS);
-       gtk_signal_connect(GTK_OBJECT(action_clist), "select_row",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_select), NULL);
+       g_signal_connect(G_OBJECT(action_clist), "select_row",
+                        G_CALLBACK(prefs_filtering_action_select), NULL);
 
        btn_vbox = gtk_vbox_new(FALSE, 8);
        gtk_widget_show(btn_vbox);
@@ -481,14 +497,14 @@ static void prefs_filtering_action_create(void)
        up_btn = gtk_button_new_with_label(_("Up"));
        gtk_widget_show(up_btn);
        gtk_box_pack_start(GTK_BOX(btn_vbox), up_btn, FALSE, FALSE, 0);
-       gtk_signal_connect(GTK_OBJECT(up_btn), "clicked",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_up), NULL);
+       g_signal_connect(G_OBJECT(up_btn), "clicked",
+                        G_CALLBACK(prefs_filtering_action_up), NULL);
 
        down_btn = gtk_button_new_with_label(_("Down"));
        gtk_widget_show(down_btn);
        gtk_box_pack_start(GTK_BOX(btn_vbox), down_btn, FALSE, FALSE, 0);
-       gtk_signal_connect(GTK_OBJECT(down_btn), "clicked",
-                          GTK_SIGNAL_FUNC(prefs_filtering_action_down), NULL);
+       g_signal_connect(G_OBJECT(down_btn), "clicked",
+                        G_CALLBACK(prefs_filtering_action_down), NULL);
 
        gtk_widget_show_all(window);
 
@@ -506,6 +522,7 @@ static void prefs_filtering_action_create(void)
        filtering_action.exec_btn = exec_btn;
        filtering_action.color_label   = color_label;
        filtering_action.color_optmenu = color_optmenu;
+       filtering_action.score_label = score_label;
        filtering_action.ok_btn = ok_btn;
        filtering_action.action_clist = action_clist;
 }
@@ -591,7 +608,6 @@ static void prefs_filtering_action_set_dialog(GSList *action_list)
 static GSList *prefs_filtering_action_get_list(void)
 {
        gchar *action_str;
-       FilteringAction *action;
        gint row = 1;
        GSList *action_list;
 
@@ -694,6 +710,14 @@ static gint prefs_filtering_action_get_matching_from_action(Action action_id)
                return MATCHACTION_EXECUTE;
        case ACTION_COLOR:
                return MATCHACTION_COLOR;
+       case ACTION_HIDE:
+               return MATCHACTION_HIDE;
+       case ACTION_STOP:
+               return MATCHACTION_STOP;
+       case ACTION_CHANGE_SCORE:
+               return MATCHACTION_CHANGE_SCORE;
+       case ACTION_SET_SCORE:
+               return MATCHACTION_SET_SCORE;
        default:
                return -1;
        }
@@ -716,12 +740,16 @@ static FilteringAction * prefs_filtering_action_dialog_to_action(gboolean alert)
        const gchar * destination;
        gint labelcolor = 0;
         FilteringAction * action;
-
+        gchar * score_str;
+        gint score;
+        
        action_id = get_sel_from_list(GTK_LIST(filtering_action.action_type_list));
        action_type = prefs_filtering_action_get_matching_from_action(action_id);
        list_id = get_sel_from_list(GTK_LIST(filtering_action.account_list));
        account_id = get_account_id_from_list_id(list_id);
-
+        score = 0;
+        destination = NULL;
+        
        switch (action_id) {
        case ACTION_MOVE:
        case ACTION_COPY:
@@ -729,7 +757,9 @@ static FilteringAction * prefs_filtering_action_dialog_to_action(gboolean alert)
                destination = gtk_entry_get_text(GTK_ENTRY(filtering_action.dest_entry));
                if (*destination == '\0') {
                        if (alert)
-                                alertpanel_error(_("Destination is not set."));
+                                alertpanel_error(action_id == ACTION_EXECUTE 
+                                                ? _("Command line not set")
+                                                : _("Destination is not set."));
                        return NULL;
                }
                break;
@@ -748,12 +778,31 @@ static FilteringAction * prefs_filtering_action_dialog_to_action(gboolean alert)
                        gtk_option_menu_get_menu(GTK_OPTION_MENU(filtering_action.color_optmenu)));
                destination = NULL;     
                break;
+        case ACTION_CHANGE_SCORE:
+        case ACTION_SET_SCORE:
+               score_str = gtk_entry_get_text(GTK_ENTRY(filtering_action.dest_entry));
+               if (*score_str == '\0') {
+                       if (alert)
+                                alertpanel_error(_("Score is not set"));
+                       return NULL;
+               }
+                score = strtol(score_str, NULL, 10);
+                break;
+       case ACTION_STOP:
+       case ACTION_HIDE:
+        case ACTION_DELETE:
+        case ACTION_MARK:
+        case ACTION_UNMARK:
+        case ACTION_LOCK:
+        case ACTION_UNLOCK:
+        case ACTION_MARK_AS_READ:
+        case ACTION_MARK_AS_UNREAD:
        default:
-               destination = NULL;
                break;
        }
        
-       action = filteringaction_new(action_type, account_id, destination, labelcolor);
+       action = filteringaction_new(action_type, account_id,
+            destination, labelcolor, score);
 
         return action;
 }
@@ -772,8 +821,13 @@ static void prefs_filtering_action_register_cb(void)
        prefs_filtering_action_clist_set_row(-1, action);
 
        filteringaction_free(action);
-
-       prefs_filtering_action_reset_dialog();
+       /* presumably gtk_list_select_item(), called by 
+        * prefs_filtering_action_reset_dialog() activates 
+        * what seems to be a bug. this causes any other 
+        * list items to be unselectable */
+       /* prefs_filtering_action_reset_dialog(); */
+       gtk_list_select_item(GTK_LIST(filtering_action.account_list), 0);
+       gtk_entry_set_text(GTK_ENTRY(filtering_action.dest_entry), "");
        prefs_filtering_action_update_hscrollbar();
 }
 
@@ -964,6 +1018,22 @@ static void prefs_filtering_action_select(GtkCList *clist,
                                     ACTION_COLOR);
                gtk_option_menu_set_history(GTK_OPTION_MENU(filtering_action.color_optmenu), action->labelcolor);     
                break;
+       case MATCHACTION_CHANGE_SCORE:
+               gtk_list_select_item(GTK_LIST(filtering_action.action_type_list),
+                                    ACTION_CHANGE_SCORE);
+               break;
+       case MATCHACTION_SET_SCORE:
+               gtk_list_select_item(GTK_LIST(filtering_action.action_type_list),
+                                    ACTION_SET_SCORE);
+               break;
+       case MATCHACTION_STOP:
+               gtk_list_select_item(GTK_LIST(filtering_action.action_type_list),
+                                    ACTION_STOP);
+               break;
+       case MATCHACTION_HIDE:
+               gtk_list_select_item(GTK_LIST(filtering_action.action_type_list),
+                                    ACTION_HIDE);
+               break;
        }
 }
 
@@ -977,8 +1047,11 @@ static void prefs_filtering_action_select(GtkCList *clist,
 static gboolean prefs_filtering_action_key_pressed(GtkWidget *widget,
     GdkEventKey *event, gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_Escape) {
                prefs_filtering_action_cancel();
+               return TRUE;            
+       }
+       return FALSE;
 }
 
 /*!
@@ -1131,6 +1204,7 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_hide(filtering_action.exec_btn);
                gtk_widget_hide(filtering_action.color_optmenu);
                gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
                break;
        case ACTION_COPY:
                gtk_widget_show(filtering_action.account_label);
@@ -1147,6 +1221,7 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_hide(filtering_action.exec_btn);
                gtk_widget_hide(filtering_action.color_optmenu);
                gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
                break;
        case ACTION_DELETE:
                gtk_widget_show(filtering_action.account_label);
@@ -1163,6 +1238,7 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_hide(filtering_action.exec_btn);
                gtk_widget_hide(filtering_action.color_optmenu);
                gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
                break;
        case ACTION_MARK:
        case ACTION_UNMARK:
@@ -1170,6 +1246,8 @@ static void prefs_filtering_action_type_select(GtkList *list,
        case ACTION_UNLOCK:
        case ACTION_MARK_AS_READ:
        case ACTION_MARK_AS_UNREAD:
+        case ACTION_STOP:
+        case ACTION_HIDE:
                gtk_widget_show(filtering_action.account_label);
                gtk_widget_set_sensitive(filtering_action.account_label, FALSE);
                gtk_widget_set_sensitive(filtering_action.account_combo, FALSE);
@@ -1184,6 +1262,7 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_hide(filtering_action.exec_btn);
                gtk_widget_hide(filtering_action.color_optmenu);
                gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
                break;
        case ACTION_FORWARD:
                gtk_widget_show(filtering_action.account_label);
@@ -1200,6 +1279,7 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_hide(filtering_action.exec_btn);
                gtk_widget_hide(filtering_action.color_optmenu);
                gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
                break;
        case ACTION_FORWARD_AS_ATTACHMENT:
                gtk_widget_show(filtering_action.account_label);
@@ -1216,6 +1296,7 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_hide(filtering_action.exec_btn);
                gtk_widget_hide(filtering_action.color_optmenu);
                gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
                break;
        case ACTION_REDIRECT:
                gtk_widget_show(filtering_action.account_label);
@@ -1232,6 +1313,7 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_hide(filtering_action.exec_btn);
                gtk_widget_hide(filtering_action.color_optmenu);
                gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
                break;
        case ACTION_EXECUTE:
                gtk_widget_show(filtering_action.account_label);
@@ -1247,6 +1329,7 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_show(filtering_action.exec_btn);
                gtk_widget_hide(filtering_action.color_optmenu);
                gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
                break;
        case ACTION_COLOR:
                gtk_widget_show(filtering_action.account_label);
@@ -1261,6 +1344,24 @@ static void prefs_filtering_action_type_select(GtkList *list,
                gtk_widget_set_sensitive(filtering_action.exec_btn, FALSE);
                gtk_widget_show(filtering_action.color_optmenu);
                gtk_widget_show(filtering_action.color_label);
+               gtk_widget_hide(filtering_action.score_label);
+               break;
+       case ACTION_CHANGE_SCORE:
+       case ACTION_SET_SCORE:
+               gtk_widget_show(filtering_action.account_label);
+               gtk_widget_set_sensitive(filtering_action.account_label, FALSE);
+               gtk_widget_set_sensitive(filtering_action.account_combo, FALSE);
+               gtk_widget_show(filtering_action.dest_entry);
+               gtk_widget_set_sensitive(filtering_action.dest_entry, TRUE);
+               gtk_widget_hide(filtering_action.dest_btn);
+               gtk_widget_hide(filtering_action.dest_label);
+               gtk_widget_hide(filtering_action.recip_label);
+               gtk_widget_hide(filtering_action.exec_label);
+               gtk_widget_show(filtering_action.exec_btn);
+               gtk_widget_set_sensitive(filtering_action.exec_btn, FALSE);
+               gtk_widget_hide(filtering_action.color_optmenu);
+               gtk_widget_hide(filtering_action.color_label);
+               gtk_widget_show(filtering_action.score_label);
                break;
        }
 }