Use Delete button instead of Remove (tooltips and other places already
[claws.git] / src / prefs_actions.c
index e942d08d4d1dd3c192ad38b982450493a6990e5a..6b232d99a615b31a1034478bfe723cd641a5bd20 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2011 Hiroyuki Yamamoto & The Claws Mail Team
+ * Copyright (C) 1999-2013 Hiroyuki Yamamoto & The Claws Mail Team
  *
  * 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
@@ -19,6 +19,7 @@
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
+#include "claws-features.h"
 #endif
 
 #include "defs.h"
@@ -49,6 +50,7 @@
 #include "filtering.h"
 #include "prefs_filtering_action.h"
 #include "matcher_parser.h"
+#include "prefs_toolbar.h"
 
 enum {
        PREFS_ACTIONS_STRING,   /*!< string pointer managed by list store, 
@@ -324,7 +326,7 @@ static void prefs_actions_create(MainWindow *mainwin)
        CLAWS_SET_TIP(reg_btn,
                        _("Append the new action above to the list"));
 
-       subst_btn = gtkut_get_replace_btn(_("Replace"));
+       subst_btn = gtkut_get_replace_btn(_("_Replace"));
        gtk_widget_show(subst_btn);
        gtk_box_pack_start(GTK_BOX(btn_hbox), subst_btn, FALSE, TRUE, 0);
        g_signal_connect(G_OBJECT(subst_btn), "clicked",
@@ -332,7 +334,9 @@ static void prefs_actions_create(MainWindow *mainwin)
        CLAWS_SET_TIP(subst_btn,
                        _("Replace the selected action in list with the action above"));
 
-       del_btn = gtk_button_new_from_stock(GTK_STOCK_DELETE);
+       del_btn = gtk_button_new_with_mnemonic (_("D_elete"));
+       gtk_button_set_image(GTK_BUTTON(del_btn),
+                       gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_BUTTON));
        gtk_widget_show(del_btn);
        gtk_box_pack_start(GTK_BOX(btn_hbox), del_btn, FALSE, TRUE, 0);
        g_signal_connect(G_OBJECT(del_btn), "clicked",
@@ -340,7 +344,9 @@ static void prefs_actions_create(MainWindow *mainwin)
        CLAWS_SET_TIP(del_btn,
                        _("Delete the selected action from the list"));
 
-       clear_btn = gtk_button_new_from_stock (GTK_STOCK_CLEAR);
+       clear_btn = gtk_button_new_with_mnemonic (_("C_lear"));
+       gtk_button_set_image(GTK_BUTTON(clear_btn),
+                       gtk_image_new_from_stock(GTK_STOCK_CLEAR,GTK_ICON_SIZE_BUTTON));
        gtk_widget_show (clear_btn);
        gtk_box_pack_start (GTK_BOX (btn_hbox), clear_btn, FALSE, TRUE, 0);
        g_signal_connect(G_OBJECT (clear_btn), "clicked",
@@ -458,7 +464,7 @@ void prefs_actions_read_config(void)
 
                tmp = conv_codeset_strdup(buf, src_codeset, dest_codeset);
                if (!tmp) {
-                       g_warning("Failed to convert character set of action configuration\n");
+                       g_warning("Failed to convert character set of action configuration");
                        tmp = g_strdup(buf);
                }
 
@@ -485,7 +491,7 @@ void prefs_actions_write_config(void)
 
        rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACTIONS_RC, NULL);
        if ((pfile= prefs_write_open(rcpath)) == NULL) {
-               g_warning("Failed to write configuration to file\n");
+               g_warning("failed to write configuration to file");
                g_free(rcpath);
                return;
        }
@@ -498,7 +504,7 @@ void prefs_actions_write_config(void)
 
                act = conv_codeset_strdup(tmp, src_codeset, dest_codeset);
                if (!act) {
-                       g_warning("Failed to convert character set of action configuration\n");
+                       g_warning("Failed to convert character set of action configuration");
                        act = g_strdup(act);
                }
 
@@ -516,7 +522,7 @@ void prefs_actions_write_config(void)
        g_free(rcpath);
 
        if (prefs_file_close(pfile) < 0) {
-               g_warning("failed to write configuration to file\n");
+               g_warning("failed to write configuration to file");
                return;
        }
 }
@@ -585,13 +591,9 @@ static void prefs_actions_set_list(void)
 static gint prefs_actions_clist_set_row(gint row)
 {
        const gchar *entry_text;
-       gint len;
+       gint len, action_nb;
        gchar action[PREFSBUFSIZE];
        gchar *new_action;
-       GtkListStore *store;
-
-       store = GTK_LIST_STORE(gtk_tree_view_get_model
-                               (GTK_TREE_VIEW(actions.actions_list_view)));
 
        GET_ENTRY(actions.name_entry);
        if (entry_text[0] == '\0') {
@@ -609,6 +611,12 @@ static gint prefs_actions_clist_set_row(gint row)
                return -1;
        }
 
+       action_nb = prefs_actions_find_by_name(entry_text);
+       if ((action_nb != -1) && ((row == -1) || (row != action_nb + 1))) {
+               alertpanel_error(_("There is an action with this name already."));
+               return -1;
+       }
+       
        strncpy(action, entry_text, PREFSBUFSIZE - 1);
 
        while (strstr(action, "//")) {
@@ -889,12 +897,12 @@ static void prefs_actions_cancel(GtkWidget *w, gpointer data)
 
        if (modified && alertpanel(_("Entry not saved"),
                                 _("The entry was not saved. Close anyway?"),
-                                GTK_STOCK_CLOSE, _("+_Continue editing"),
+                                GTK_STOCK_CLOSE, g_strconcat("+", _("_Continue editing"), NULL),
                                 NULL) != G_ALERTDEFAULT) {
                return;
        } else if (modified_list && alertpanel(_("Actions list not saved"),
                                 _("The actions list has been modified. Close anyway?"),
-                                GTK_STOCK_CLOSE, _("+_Continue editing"), 
+                                GTK_STOCK_CLOSE, g_strconcat("+", _("_Continue editing"), NULL),
                                 NULL) != G_ALERTDEFAULT) {
                return;
        }
@@ -912,15 +920,15 @@ static void prefs_actions_cancel(GtkWidget *w, gpointer data)
 static void prefs_actions_ok(GtkWidget *widget, gpointer data)
 {
        MainWindow *mainwin = (MainWindow *) data;
-       GList *list;
-       GList *iter;
+       const GList *list;
+       const GList *iter;
        MessageView *msgview;
        Compose *compose;
        GtkListStore *store;
 
        if (modified && alertpanel(_("Entry not saved"),
                                 _("The entry was not saved. Close anyway?"),
-                                GTK_STOCK_CLOSE, _("+_Continue editing"),
+                                GTK_STOCK_CLOSE, g_strconcat("+", _("_Continue editing"), NULL),
                                 NULL) != G_ALERTDEFAULT) {
                return;
        } 
@@ -949,6 +957,9 @@ static void prefs_actions_ok(GtkWidget *widget, gpointer data)
                compose_update_actions_menu(compose);
        }
 
+       /* Update toolbars */
+       prefs_toolbar_update_action_btns();
+       
        gtk_widget_hide(actions.window);
        gtk_window_set_modal(GTK_WINDOW(actions.window), FALSE);
        inc_unlock();
@@ -988,6 +999,7 @@ static gchar *actions_desc_strings[] = {
 static DescriptionWindow actions_desc_win = { 
        NULL,
        NULL,
+       TRUE,
        2,
        N_("Actions"),
        N_("The Actions feature is a way for the user to launch "
@@ -1171,15 +1183,8 @@ static GtkWidget *prefs_actions_list_view_create(void)
        list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model));
        g_object_unref(model);  
        
-#ifndef MAEMO
        g_signal_connect(G_OBJECT(list_view), "popup-menu",
                         G_CALLBACK(prefs_actions_list_popup_menu), list_view);
-#else
-       gtk_widget_tap_and_hold_setup(GTK_WIDGET(list_view), NULL, NULL,
-                       GTK_TAP_AND_HOLD_NONE | GTK_TAP_AND_HOLD_NO_INTERNALS);
-       g_signal_connect(G_OBJECT(list_view), "tap-and-hold",
-                        G_CALLBACK(prefs_actions_list_popup_menu), list_view);
-#endif
        g_signal_connect(G_OBJECT(list_view), "button-press-event",
                        G_CALLBACK(prefs_actions_list_btn_pressed), list_view);
 
@@ -1324,6 +1329,7 @@ static void prefs_action_define_filter_done(GSList * action_list)
        if (action_list == NULL)
                return;
 
+       action_list = filtering_action_list_sort(action_list);
        str = filteringaction_list_to_string(action_list);
 
        if (str != NULL) {
@@ -1335,3 +1341,54 @@ static void prefs_action_define_filter_done(GSList * action_list)
                modified = TRUE;
        }
 }
+
+void prefs_actions_rename_path(const gchar *old_path, const gchar *new_path)
+{
+       gchar **tokens, *action_str;
+       GSList *action, *action_list;
+       
+       for (action = prefs_common.actions_list; action != NULL;
+                       action = action->next) {
+               action_str = (gchar *)action->data;
+               tokens = g_strsplit_set(action_str, "{}", 5);
+               
+               if (tokens[0] && tokens[1] && *tokens[1] != '\0')
+                       action_list = matcher_parser_get_action_list(tokens[1]);
+               else
+                       action_list = NULL;
+
+               if (action_list &&
+                   filtering_action_list_rename_path(action_list,
+                                               old_path, new_path)) {
+                       g_free(action->data);
+                       action->data = g_strconcat(tokens[0], "{",
+                               filteringaction_list_to_string(action_list),
+                               "}", NULL);
+               }
+
+               g_strfreev(tokens);
+       }
+}
+
+gint prefs_actions_find_by_name(const gchar *name)
+{
+       GSList *act = prefs_common.actions_list;
+       gchar *action_name, *action_p;
+       gint action_nb = 0;
+       
+       for (; act != NULL; act = act->next) {
+               action_name = g_strdup((gchar *)act->data);
+               action_p = strstr(action_name, ": ");
+               action_p[0] = 0x00;
+
+               if (g_utf8_collate(name, action_name) == 0) {
+                       g_free(action_name);
+                       return action_nb;
+               }
+
+               g_free(action_name);
+               action_nb++;
+       }
+
+       return -1;
+}