revise label colouring, add filter action for label colouring, fix filtering issues
[claws.git] / src / prefs_filtering.c
index cf111e9c9bcdca463f760cd6dd4f63ba0cf0b71e..c087934515e6be57f8e023dde5713b0186781bb7 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <glib.h>
 #include <gtk/gtk.h>
+#include <gtk/gtkoptionmenu.h>
 #include <gdk/gdkkeysyms.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -46,6 +47,8 @@
 #include "alertpanel.h"
 #include "folder.h"
 #include "filtering.h"
+#include "addr_compl.h"
+#include "labelcolors.h"
 
 static struct Filtering {
        GtkWidget *window;
@@ -62,7 +65,13 @@ static struct Filtering {
        GtkWidget *exec_label;
        GtkWidget *exec_btn;
 
+       GtkWidget *color_label;
+       GtkWidget *color_optmenu;
+
        GtkWidget *cond_clist;
+
+       /* need this to make address completion entry work */
+       gint current_action;
 } filtering;
 
 #define VSPACING               12
@@ -101,8 +110,11 @@ static void prefs_filtering_condition_define       (void);
 static gint prefs_filtering_clist_set_row(gint row, FilteringProp * prop);
 static void prefs_filtering_select_dest(void);
 static void prefs_filtering_action_select(GtkList *list,
-                                         GtkWidget *widget,
+                                         GtkWidget *widget, 
                                          gpointer user_data);
+static void prefs_filtering_action_selection_changed(GtkList *list,
+                                                    gpointer user_data);
+                                         
 static void prefs_filtering_reset_dialog(void);
 
 enum {
@@ -115,7 +127,8 @@ enum {
        ACTION_MARK_AS_UNREAD = 6,
        ACTION_FORWARD = 7,
        ACTION_FORWARD_AS_ATTACHMENT = 8,
-       ACTION_EXECUTE = 9
+       ACTION_EXECUTE = 9,
+       ACTION_COLOR = 10
 };
 
 static gint get_sel_from_list(GtkList * list)
@@ -124,6 +137,9 @@ static gint get_sel_from_list(GtkList * list)
        void * sel;
        GList * child;
 
+       if (list->selection == NULL)
+               return -1;
+
        sel = list->selection->data;
        for(child = list->children ; child != NULL ;
            child = g_list_next(child)) {
@@ -189,6 +205,8 @@ static gint prefs_filtering_get_matching_from_action(gint action_id)
                return MATCHING_ACTION_FORWARD_AS_ATTACHMENT;
        case ACTION_EXECUTE:
                return MATCHING_EXECUTE;
+       case ACTION_COLOR:
+               return MATCHING_ACTION_COLOR;
        default:
                return -1;
        }
@@ -197,7 +215,8 @@ static gint prefs_filtering_get_matching_from_action(gint action_id)
 gchar * action_text [] = {
        "Move", "Copy", "Delete",
        "Mark", "Unmark", "Mark as read", "Mark as unread",
-       "Forward", "Forward as attachment", "Execute"
+       "Forward", "Forward as attachment", "Execute",
+       "Color"
 };
 
 void prefs_filtering_open(void)
@@ -217,6 +236,16 @@ void prefs_filtering_open(void)
        prefs_filtering_set_dialog();
 
        gtk_widget_show(filtering.window);
+
+       start_address_completion();
+}
+
+/* prefs_filtering_close() - just to have one common exit point */
+static void prefs_filtering_close(void)
+{
+       end_address_completion();
+       
+       gtk_widget_hide(filtering.window);
 }
 
 static void prefs_filtering_create(void)
@@ -247,6 +276,8 @@ static void prefs_filtering_create(void)
        GtkWidget *dest_entry;
        GtkWidget *dest_btn;
        GtkWidget *exec_btn;
+       GtkWidget *color_label;
+       GtkWidget *color_optmenu;
 
        GtkWidget *reg_btn;
        GtkWidget *subst_btn;
@@ -260,6 +291,8 @@ static void prefs_filtering_create(void)
        GtkWidget *up_btn;
        GtkWidget *down_btn;
 
+       GtkWidget *dummy;
+
        GList *combo_items;
        gint i;
 
@@ -318,7 +351,7 @@ static void prefs_filtering_create(void)
 
        cond_entry = gtk_entry_new ();
        gtk_widget_show (cond_entry);
-       gtk_widget_set_usize (cond_entry, 300, -1);
+//     gtk_widget_set_usize (cond_entry, 200, -1);
        gtk_box_pack_start (GTK_BOX (hbox1), cond_entry, TRUE, TRUE, 0);
 
        cond_btn = gtk_button_new_with_label (_("Define ..."));
@@ -340,7 +373,7 @@ static void prefs_filtering_create(void)
 
        action_combo = gtk_combo_new ();
        gtk_widget_show (action_combo);
-       gtk_widget_set_usize (action_combo, 200, -1);
+//     gtk_widget_set_usize (action_combo, 200, -1);
        gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(action_combo)->entry),
                               FALSE);
 
@@ -362,6 +395,10 @@ static void prefs_filtering_create(void)
                            GTK_SIGNAL_FUNC (prefs_filtering_action_select),
                            NULL);
 
+       gtk_signal_connect(GTK_OBJECT(action_list), "selection-changed",
+                          GTK_SIGNAL_FUNC(prefs_filtering_action_selection_changed),
+                          NULL);
+
        /* accounts */
 
        hbox1 = gtk_hbox_new (FALSE, VSPACING);
@@ -418,11 +455,22 @@ static void prefs_filtering_create(void)
        gtk_widget_show (exec_label);
        gtk_misc_set_alignment (GTK_MISC (exec_label), 0, 0.5);
        gtk_box_pack_start (GTK_BOX (hbox1), exec_label, FALSE, FALSE, 0);
+       
+       color_label = gtk_label_new (_("Color"));
+       gtk_widget_show(color_label);
+       gtk_misc_set_alignment(GTK_MISC(color_label), 0, 0.5);
+       gtk_box_pack_start(GTK_BOX(hbox1), color_label, FALSE, FALSE, 0);
 
        dest_entry = gtk_entry_new ();
        gtk_widget_show (dest_entry);
-       gtk_widget_set_usize (dest_entry, 300, -1);
+//     gtk_widget_set_usize (dest_entry, 200, -1);
        gtk_box_pack_start (GTK_BOX (hbox1), dest_entry, TRUE, TRUE, 0);
+       
+       color_optmenu = gtk_option_menu_new();
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(color_optmenu), 
+                                labelcolors_create_color_menu());
+//     gtk_widget_set_usize(color_optmenu, -1, -1);
+       gtk_box_pack_start(GTK_BOX(hbox1), color_optmenu, TRUE, TRUE, 0);
 
        dest_btn = gtk_button_new_with_label (_("Select ..."));
        gtk_widget_show (dest_btn);
@@ -438,6 +486,11 @@ static void prefs_filtering_create(void)
                            GTK_SIGNAL_FUNC (prefs_matcher_exec_info),
                            NULL);
 
+//     dummy = gtk_label_new("");
+//     gtk_widget_show (dummy);
+//     gtk_box_pack_start(GTK_BOX (hbox1), dummy, FALSE, FALSE, 0);
+       
+
        /* register / substitute / delete */
 
        reg_hbox = gtk_hbox_new (FALSE, 4);
@@ -512,6 +565,8 @@ static void prefs_filtering_create(void)
        gtk_signal_connect (GTK_OBJECT (down_btn), "clicked",
                            GTK_SIGNAL_FUNC (prefs_filtering_down), NULL);
 
+       gtk_widget_set_usize(window, 500, -1);
+
        gtk_widget_show_all(window);
 
        filtering.window    = window;
@@ -529,6 +584,9 @@ static void prefs_filtering_create(void)
        filtering.exec_btn = exec_btn;
 
        filtering.cond_clist   = cond_clist;
+
+       filtering.color_label   = color_label;
+       filtering.color_optmenu = color_optmenu;
 }
 
 static void prefs_filtering_update_hscrollbar(void)
@@ -671,6 +729,7 @@ static FilteringProp * prefs_filtering_dialog_to_filtering(void)
        gint action_type;
        gint account_id;
        gchar * destination;
+       gint labelcolor;
        
        cond_str = gtk_entry_get_text(GTK_ENTRY(filtering.cond_entry));
        if (*cond_str == '\0') {
@@ -695,12 +754,17 @@ static FilteringProp * prefs_filtering_dialog_to_filtering(void)
                        return NULL;
                }
                break;
+       case ACTION_COLOR:
+               labelcolor = labelcolors_get_color_menu_active_item(
+                       gtk_option_menu_get_menu(GTK_OPTION_MENU(filtering.color_optmenu)));
+               destination = NULL;     
+               break;
        default:
                destination = NULL;
                break;
        }
        
-       action = filteringaction_new(action_type, account_id, destination);
+       action = filteringaction_new(action_type, account_id, destination, labelcolor);
 
        tmp = cond_str;
        cond = matcherlist_parse(&tmp);
@@ -813,10 +877,9 @@ static void prefs_filtering_select_set(FilteringProp * prop)
        }
 
        gtk_entry_set_text(GTK_ENTRY(filtering.cond_entry), matcher_str);
-
+       
        if (action->destination)
-               gtk_entry_set_text(GTK_ENTRY(filtering.dest_entry),
-                                  action->destination);
+               gtk_entry_set_text(GTK_ENTRY(filtering.dest_entry), action->destination);
        else
                gtk_entry_set_text(GTK_ENTRY(filtering.dest_entry), "");
 
@@ -867,6 +930,11 @@ static void prefs_filtering_select_set(FilteringProp * prop)
                gtk_list_select_item(GTK_LIST(filtering.action_list),
                                     ACTION_EXECUTE);
                break;
+       case MATCHING_ACTION_COLOR:
+               gtk_list_select_item(GTK_LIST(filtering.action_list),
+                                    ACTION_COLOR);
+               gtk_option_menu_set_history(GTK_OPTION_MENU(filtering.color_optmenu), action->labelcolor);     
+               break;
        }
 
        g_free(matcher_str);
@@ -903,7 +971,7 @@ static void prefs_filtering_select_dest(void)
        FolderItem *dest;
        gchar * path;
 
-       dest = foldersel_folder_sel(NULL);
+       dest = foldersel_folder_sel(NULL, NULL);
        if (!dest) return;
 
        path = folder_item_get_identifier(dest);
@@ -912,6 +980,27 @@ static void prefs_filtering_select_dest(void)
        g_free(path);
 }
 
+static void prefs_filtering_action_selection_changed(GtkList *list,
+                                                    gpointer user_data)
+{
+       gint value;
+
+       value = get_sel_from_list(GTK_LIST(filtering.action_list));
+
+       if (filtering.current_action != value) {
+               if (filtering.current_action == ACTION_FORWARD 
+               ||  filtering.current_action == ACTION_FORWARD_AS_ATTACHMENT) {
+                       debug_print("unregistering address completion entry\n");
+                       address_completion_unregister_entry(GTK_ENTRY(filtering.dest_entry));
+               }
+               if (value == ACTION_FORWARD || value == ACTION_FORWARD_AS_ATTACHMENT) {
+                       debug_print("registering address completion entry\n");
+                       address_completion_register_entry(GTK_ENTRY(filtering.dest_entry));
+               }
+               filtering.current_action = value;
+       }
+}
+
 static void prefs_filtering_action_select(GtkList *list,
                                          GtkWidget *widget,
                                          gpointer user_data)
@@ -923,83 +1012,125 @@ static void prefs_filtering_action_select(GtkList *list,
        switch (value) {
        case ACTION_MOVE:
                gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, TRUE);
                gtk_widget_show(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_COPY:
                gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, TRUE);
                gtk_widget_show(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_DELETE:
                gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, FALSE);
                gtk_widget_hide(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_MARK:
                gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, FALSE);
                gtk_widget_hide(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_UNMARK:
                gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, FALSE);
                gtk_widget_hide(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_MARK_AS_READ:
                gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, FALSE);
                gtk_widget_hide(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_MARK_AS_UNREAD:
                gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, FALSE);
                gtk_widget_hide(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_FORWARD:
                gtk_widget_set_sensitive(filtering.account_combo, TRUE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, TRUE);
                gtk_widget_hide(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_FORWARD_AS_ATTACHMENT:
                gtk_widget_set_sensitive(filtering.account_combo, TRUE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, TRUE);
                gtk_widget_hide(filtering.dest_btn);
                gtk_widget_show(filtering.dest_label);
                gtk_widget_hide(filtering.exec_label);
                gtk_widget_hide(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
                break;
        case ACTION_EXECUTE:
                gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_show(filtering.dest_entry);
                gtk_widget_set_sensitive(filtering.dest_entry, TRUE);
                gtk_widget_hide(filtering.dest_btn);
                gtk_widget_hide(filtering.dest_label);
                gtk_widget_show(filtering.exec_label);
+               gtk_widget_set_sensitive(filtering.exec_btn, FALSE);
+               gtk_widget_show(filtering.exec_btn);
+               gtk_widget_hide(filtering.color_optmenu);
+               gtk_widget_hide(filtering.color_label);
+               break;
+       case ACTION_COLOR:
+               gtk_widget_set_sensitive(filtering.account_combo, FALSE);
+               gtk_widget_hide(filtering.dest_entry);
+               gtk_widget_hide(filtering.dest_btn);
+               gtk_widget_hide(filtering.dest_label);
+               gtk_widget_hide(filtering.exec_label);
                gtk_widget_show(filtering.exec_btn);
+               gtk_widget_set_sensitive(filtering.exec_btn, FALSE);
+               gtk_widget_show(filtering.color_optmenu);
+               gtk_widget_show(filtering.color_label);
                break;
        }
 }
@@ -1022,11 +1153,11 @@ static void prefs_filtering_ok(void)
 {
        prefs_filtering_set_list();
        prefs_filtering_write_config();
-       gtk_widget_hide(filtering.window);
+       prefs_filtering_close();
 }
 
 static void prefs_filtering_cancel(void)
 {
        prefs_filtering_read_config();
-       gtk_widget_hide(filtering.window);
+       prefs_filtering_close();
 }