2012-02-08 [pawel] 3.8.0cvs27
[claws.git] / src / prefs_actions.c
index 55638adbcb83c7f2127caa892898bb077278014f..42d4d9dfa325043ff441e860c8d9333d403fa2ed 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2009 Hiroyuki Yamamoto & The Claws Mail Team
+ * Copyright (C) 1999-2011 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
@@ -49,6 +49,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, 
@@ -197,7 +198,6 @@ static void prefs_actions_create(MainWindow *mainwin)
        GtkWidget *up_btn;
        GtkWidget *down_btn;
        static GdkGeometry geometry;
-       CLAWS_TIP_DECL();
 
        debug_print("Creating actions configuration window...\n");
 
@@ -425,6 +425,7 @@ static void prefs_actions_reset_dialog(void)
 {
        gtk_entry_set_text(GTK_ENTRY(actions.name_entry), "");
        gtk_entry_set_text(GTK_ENTRY(actions.cmd_entry), "");
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(actions.shell_radiobtn), TRUE);
 }
 
 void prefs_actions_read_config(void)
@@ -538,6 +539,7 @@ static void prefs_actions_set_dialog(void)
                                (GTK_TREE_VIEW(actions.actions_list_view)));
 
        prefs_actions_clear_list(store);        
+       prefs_actions_reset_dialog();
 
        for (cur = prefs_common.actions_list; cur != NULL; cur = cur->next) {
                gchar *action = (gchar *) cur->data;
@@ -584,7 +586,7 @@ 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;
@@ -608,6 +610,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 action with this name already."));
+               return -1;
+       }
+       
        strncpy(action, entry_text, PREFSBUFSIZE - 1);
 
        while (strstr(action, "//")) {
@@ -848,7 +856,7 @@ static gint prefs_actions_deleted(GtkWidget *widget, GdkEventAny *event,
 static gboolean prefs_actions_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                          gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                prefs_actions_cancel(widget, data);
        else {
                GtkWidget *focused = gtkut_get_focused_child(
@@ -948,6 +956,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();
@@ -1079,6 +1090,20 @@ static GtkActionEntry prefs_actions_popup_entries[] =
        {"PrefsActionsPopup/Duplicate", NULL, N_("D_uplicate"), NULL, NULL, G_CALLBACK(prefs_actions_duplicate_cb) },
 };
 
+static void prefs_actions_row_selected(GtkTreeSelection *selection, GtkTreeView *list_view)
+{
+       GtkTreePath *path;
+       GtkTreeIter iter;
+       GtkTreeModel *model;
+       
+       if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+               return;
+       
+       path = gtk_tree_model_get_path(model, &iter);
+       prefs_actions_select_row(list_view, path);
+       gtk_tree_path_free(path);
+}
+
 static gint prefs_actions_list_btn_pressed(GtkWidget *widget, GdkEventButton *event,
                                   GtkTreeView *list_view)
 {
@@ -1173,6 +1198,8 @@ static GtkWidget *prefs_actions_list_view_create(void)
 
        selector = gtk_tree_view_get_selection(list_view);
        gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
+       g_signal_connect(G_OBJECT(selector), "changed",
+                        G_CALLBACK(prefs_actions_row_selected), list_view);
 
        /* create the columns */
        prefs_actions_create_list_view_columns(GTK_WIDGET(list_view));
@@ -1307,6 +1334,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) {
@@ -1318,3 +1346,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;
+}