/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 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
#ifdef HAVE_CONFIG_H
# include "config.h"
+#include "claws-features.h"
#endif
#include "defs.h"
#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,
prefs_actions_set_dialog();
gtk_widget_show(actions.window);
+ gtk_window_set_modal(GTK_WINDOW(actions.window), TRUE);
}
/*!
static void prefs_actions_size_allocate_cb(GtkWidget *widget,
GtkAllocation *allocation)
{
- g_return_if_fail(allocation != NULL);
+ cm_return_if_fail(allocation != NULL);
prefs_common.actionswin_width = allocation->width;
prefs_common.actionswin_height = allocation->height;
GtkWidget *up_btn;
GtkWidget *down_btn;
static GdkGeometry geometry;
- CLAWS_TIP_DECL();
debug_print("Creating actions configuration window...\n");
gtk_container_set_border_width(GTK_CONTAINER (window), 8);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
- gtk_window_set_modal(GTK_WINDOW(window), TRUE);
gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
vbox = gtk_vbox_new(FALSE, 6);
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",
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 (_("Re_move"));
+ 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",
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",
CLAWS_SET_TIP(clear_btn,
_("Clear all the input fields in the dialog"));
-#if GTK_CHECK_VERSION(2, 8, 0)
info_btn = gtk_button_new_from_stock(GTK_STOCK_INFO);
-#else
- info_btn = gtk_button_new_with_label(_("Info..."));
-#endif
gtk_widget_show(info_btn);
gtk_box_pack_end(GTK_BOX(reg_hbox), info_btn, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(info_btn), "clicked",
{
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)
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);
}
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;
}
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);
}
fputc('\n', pfile->fp) == EOF) {
FILE_OP_ERROR(rcpath, "fputs || fputc");
prefs_file_close_revert(pfile);
+ g_free(act);
g_free(rcpath);
return;
}
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;
}
}
{
GtkListStore *store;
GSList *cur;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
store = GTK_LIST_STORE(gtk_tree_view_get_model
(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;
prefs_actions_list_view_insert_action(actions.actions_list_view,
-1, action, TRUE);
}
-
- /* select first entry */
- selection = gtk_tree_view_get_selection
- (GTK_TREE_VIEW(actions.actions_list_view));
- if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store),
- &iter))
- gtk_tree_selection_select_iter(selection, &iter);
}
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') {
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, "//")) {
GET_ENTRY(actions.cmd_entry);
if (entry_text[0] == '\0') {
- alertpanel_error(_("Command line not set."));
+ alertpanel_error(_("Command-line not set."));
return -1;
}
if (alertpanel(_("Delete all actions"),
_("Do you really want to delete all the actions?"),
- GTK_STOCK_CANCEL, "+"GTK_STOCK_DELETE, NULL) == G_ALERTDEFAULT)
+ GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL) != G_ALERTDEFAULT)
return;
list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(actions.actions_list_view)));
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(
- GTK_CONTAINER(widget));
- if (focused && GTK_IS_EDITABLE(focused)) {
+ GTK_CONTAINER(widget));
+ if (focused && GTK_IS_EDITABLE(focused))
modified = TRUE;
- }
}
return FALSE;
}
gtk_tree_model_get (model, iter, column, &store_string, -1);
- if (!store_string || !key) return FALSE;
+ if (!store_string || !key)
+ return FALSE;
retval = (strncmp (key, store_string, strlen(key)) != 0);
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;
}
gtk_list_store_clear(store);
prefs_actions_read_config();
gtk_widget_hide(actions.window);
+ gtk_window_set_modal(GTK_WINDOW(actions.window), FALSE);
inc_unlock();
}
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;
}
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();
}
N_("<span weight=\"bold\" underline=\"single\">Menu name:</span>"), NULL,
N_("Use / in menu name to make submenus."), NULL,
"", NULL,
- N_("<span weight=\"bold\" underline=\"single\">Command line:</span>"), NULL,
+ N_("<span weight=\"bold\" underline=\"single\">Command-line:</span>"), NULL,
N_("<span weight=\"bold\">Begin with:</span>"), NULL,
" |", N_("to send message body or selection to command's standard input"),
" >", N_("to send user provided text to command's standard input"),
static DescriptionWindow actions_desc_win = {
NULL,
NULL,
+ TRUE,
2,
N_("Actions"),
N_("The Actions feature is a way for the user to launch "
{"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)
{
- if (event) {
- /* left- or right-button click */
- if (event->button == 1 || event->button == 3) {
- GtkTreePath *path = NULL;
- if (gtk_tree_view_get_path_at_pos( list_view, event->x, event->y,
- &path, NULL, NULL, NULL)) {
- prefs_actions_select_row(list_view, path);
- }
- if (path)
- gtk_tree_path_free(path);
- }
-
- /* right-button click */
- if (event->button == 3) {
- GtkTreeModel *model = gtk_tree_view_get_model(list_view);
- GtkTreeIter iter;
- gboolean non_empty;
- gint row;
-
- if (!prefs_actions_popup_menu) {
- prefs_actions_popup_action = cm_menu_create_action_group("PrefsActionsPopup", prefs_actions_popup_entries,
- G_N_ELEMENTS(prefs_actions_popup_entries), (gpointer)list_view);
+ if (event) {
+ /* left- or right-button click */
+ if (event->button == 1 || event->button == 3) {
+ GtkTreePath *path = NULL;
+ if (gtk_tree_view_get_path_at_pos( list_view, event->x, event->y,
+ &path, NULL, NULL, NULL)) {
+ prefs_actions_select_row(list_view, path);
+ }
+ if (path)
+ gtk_tree_path_free(path);
+ }
+
+ /* right-button click */
+ if (event->button == 3) {
+ GtkTreeModel *model = gtk_tree_view_get_model(list_view);
+ GtkTreeIter iter;
+ gboolean non_empty;
+ gint row;
+
+ if (!prefs_actions_popup_menu) {
+ prefs_actions_popup_action = cm_menu_create_action_group("PrefsActionsPopup",
+ prefs_actions_popup_entries, G_N_ELEMENTS(prefs_actions_popup_entries),
+ (gpointer)list_view);
MENUITEM_ADDUI("/Menus", "PrefsActionsPopup", "PrefsActionsPopup", GTK_UI_MANAGER_MENU)
MENUITEM_ADDUI("/Menus/PrefsActionsPopup", "Delete", "PrefsActionsPopup/Delete", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI("/Menus/PrefsActionsPopup", "DeleteAll", "PrefsActionsPopup/DeleteAll", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI("/Menus/PrefsActionsPopup", "Duplicate", "PrefsActionsPopup/Duplicate", GTK_UI_MANAGER_MENUITEM)
prefs_actions_popup_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
- gtk_ui_manager_get_widget(gtkut_ui_manager(), "/Menus/PrefsActionsPopup")) );
- }
+ gtk_ui_manager_get_widget(gtkut_ui_manager(), "/Menus/PrefsActionsPopup")) );
+ }
- /* grey out some popup menu items if there is no selected row */
- row = gtkut_list_view_get_selected_row(GTK_WIDGET(list_view));
+ /* grey out some popup menu items if there is no selected row */
+ row = gtkut_list_view_get_selected_row(GTK_WIDGET(list_view));
cm_menu_set_sensitive("PrefsActionsPopup/Delete", (row > 0));
cm_menu_set_sensitive("PrefsActionsPopup/Duplicate", (row > 0));
- /* grey out seom popup menu items if there is no row
- (not counting the (New) one at row 0) */
- non_empty = gtk_tree_model_get_iter_first(model, &iter);
- if (non_empty)
- non_empty = gtk_tree_model_iter_next(model, &iter);
+ /* grey out seom popup menu items if there is no row
+ (not counting the (New) one at row 0) */
+ non_empty = gtk_tree_model_get_iter_first(model, &iter);
+ if (non_empty)
+ non_empty = gtk_tree_model_iter_next(model, &iter);
cm_menu_set_sensitive("PrefsActionsPopup/DeleteAll", non_empty);
- gtk_menu_popup(GTK_MENU(prefs_actions_popup_menu),
- NULL, NULL, NULL, NULL,
- event->button, event->time);
- }
+ gtk_menu_popup(GTK_MENU(prefs_actions_popup_menu),
+ NULL, NULL, NULL, NULL,
+ event->button, event->time);
+ }
}
return FALSE;
}
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);
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));
*cmd = '\0';
gtk_entry_set_text(GTK_ENTRY(actions.name_entry), buf);
- if(g_str_has_prefix(&cmd[2], "%as{") == TRUE)
+ if (g_str_has_prefix(&cmd[2], "%as{") == TRUE)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
actions.filter_radiobtn), TRUE);
else
static void prefs_action_filter_radiobtn_cb(GtkWidget *widget, gpointer data)
{
- if(actions.filter_btn)
+ if (actions.filter_btn)
gtk_widget_set_sensitive(actions.filter_btn, TRUE);
- if(actions.cmd_entry)
- gtk_widget_set_sensitive(actions.cmd_entry,FALSE);
- if(actions.info_btn)
- gtk_widget_set_sensitive(actions.info_btn,FALSE);
+ if (actions.cmd_entry)
+ gtk_widget_set_sensitive(actions.cmd_entry, FALSE);
+ if (actions.info_btn)
+ gtk_widget_set_sensitive(actions.info_btn, FALSE);
}
static void prefs_action_shell_radiobtn_cb(GtkWidget *widget, gpointer data)
{
- if(actions.filter_btn)
+ if (actions.filter_btn)
gtk_widget_set_sensitive(actions.filter_btn, FALSE);
- if(actions.cmd_entry)
- gtk_widget_set_sensitive(actions.cmd_entry,TRUE);
- if(actions.info_btn)
- gtk_widget_set_sensitive(actions.info_btn,TRUE);
+ if (actions.cmd_entry)
+ gtk_widget_set_sensitive(actions.cmd_entry, TRUE);
+ if (actions.info_btn)
+ gtk_widget_set_sensitive(actions.info_btn, TRUE);
}
static void prefs_action_filterbtn_cb(GtkWidget *widget, gpointer data)
if(modified && alertpanel(_("Entry was modified"),
_("Opening the filter action dialog will clear current modifications "
"of the command line."),
- GTK_STOCK_CANCEL, _("+_Continue editing"), NULL) == G_ALERTDEFAULT)
+ GTK_STOCK_CANCEL, _("+_Continue editing"), NULL) != G_ALERTDEFAULT)
return;
*/
action_str = gtk_editable_get_chars(GTK_EDITABLE(actions.cmd_entry), 0, -1);
filteringaction_free(cur->data);
}
- g_free(action_str);
+ g_slist_free(action_str);
g_strfreev(tokens);
}
{
gchar *str;
- if(action_list == NULL)
+ if (action_list == NULL)
return;
+ action_list = filtering_action_list_sort(action_list);
str = filteringaction_list_to_string(action_list);
if (str != NULL) {
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;
+}