/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2002 Hiroyuki Yamamoto & the Sylpheed-Claws team
+ * Copyright (C) 2002-2007 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
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
*/
/*
N_SET_COLUMNS
};
+enum
+{
+ ITEM_FUNCTION = 0,
+ ITEM_USER_ACTION = 1,
+ ITEM_SEPARATOR = 2
+};
+
+static const gint ToolbarIcons[] =
+{
+ STOCK_PIXMAP_ADDRESS_BOOK,
+ STOCK_PIXMAP_ADDRESS_SEARCH,
+ STOCK_PIXMAP_BOOK,
+ STOCK_PIXMAP_CATEGORY,
+ STOCK_PIXMAP_CHECK_SPELLING,
+ STOCK_PIXMAP_CLOSE,
+ STOCK_PIXMAP_DOWN_ARROW,
+ STOCK_PIXMAP_UP_ARROW,
+ STOCK_PIXMAP_EDIT_EXTERN,
+ STOCK_PIXMAP_ERROR,
+ STOCK_PIXMAP_EXEC,
+ STOCK_PIXMAP_GROUP,
+ STOCK_PIXMAP_INSERT_FILE,
+ STOCK_PIXMAP_INTERFACE,
+ STOCK_PIXMAP_JPILOT,
+ STOCK_PIXMAP_LDAP,
+ STOCK_PIXMAP_LINEWRAP_CURRENT,
+ STOCK_PIXMAP_LINEWRAP_ALL,
+ STOCK_PIXMAP_MAIL,
+ STOCK_PIXMAP_MAIL_ATTACH,
+ STOCK_PIXMAP_MAIL_COMPOSE,
+ STOCK_PIXMAP_MAIL_FORWARD,
+ STOCK_PIXMAP_MAIL_RECEIVE,
+ STOCK_PIXMAP_MAIL_RECEIVE_ALL,
+ STOCK_PIXMAP_MAIL_REPLY,
+ STOCK_PIXMAP_MAIL_REPLY_TO_ALL,
+ STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR,
+ STOCK_PIXMAP_MAIL_SEND,
+ STOCK_PIXMAP_MAIL_SEND_QUEUE,
+ STOCK_PIXMAP_MAIL_SIGN,
+ STOCK_PIXMAP_OPEN_MAIL,
+ STOCK_PIXMAP_NEWS_COMPOSE,
+ STOCK_PIXMAP_PASTE,
+ STOCK_PIXMAP_PREFERENCES,
+ STOCK_PIXMAP_PROPERTIES,
+ STOCK_PIXMAP_VCARD,
+ STOCK_PIXMAP_ONLINE,
+ STOCK_PIXMAP_OFFLINE,
+ STOCK_PIXMAP_NOTICE_WARN, /* small warning */
+ STOCK_PIXMAP_NOTICE_ERROR, /* small error */
+ STOCK_PIXMAP_NOTICE_NOTE, /* small message */
+ STOCK_PIXMAP_GO_FOLDERS,
+ STOCK_PIXMAP_MIME_TEXT_PLAIN,
+ STOCK_PIXMAP_MIME_TEXT_HTML,
+ STOCK_PIXMAP_MIME_APPLICATION,
+ STOCK_PIXMAP_MIME_IMAGE,
+ STOCK_PIXMAP_MIME_AUDIO,
+ STOCK_PIXMAP_MIME_TEXT_ENRICHED,
+ STOCK_PIXMAP_MIME_UNKNOWN,
+ STOCK_PIXMAP_MIME_PDF,
+ STOCK_PIXMAP_MIME_PS,
+ STOCK_PIXMAP_MIME_TEXT_CALENDAR,
+ STOCK_PIXMAP_MIME_PGP_SIG,
+ STOCK_PIXMAP_PRINTER,
+ STOCK_PIXMAP_PRIVACY_SIGNED,
+ STOCK_PIXMAP_PRIVACY_PASSED,
+ STOCK_PIXMAP_PRIVACY_FAILED,
+ STOCK_PIXMAP_PRIVACY_UNKNOWN,
+ STOCK_PIXMAP_PRIVACY_EXPIRED,
+ STOCK_PIXMAP_PRIVACY_WARN,
+ STOCK_PIXMAP_PRIVACY_EMBLEM_SIGNED,
+ STOCK_PIXMAP_PRIVACY_EMBLEM_PASSED,
+ STOCK_PIXMAP_PRIVACY_EMBLEM_FAILED,
+ STOCK_PIXMAP_PRIVACY_EMBLEM_WARN,
+ STOCK_PIXMAP_MIME_MESSAGE,
+ STOCK_PIXMAP_SPAM_BTN,
+ STOCK_PIXMAP_HAM_BTN,
+ STOCK_PIXMAP_EMPTY, /* last entry */
+};
+
typedef struct _ToolbarPage
{
PrefsPage page;
GtkWidget *window; /* do not modify */
- GtkWidget *list_view_icons;
- GtkWidget *list_view_set;
- GtkWidget *combo_action;
- GtkWidget *combo_entry;
- GtkWidget *combo_list;
- GtkWidget *label_icon_text;
- GtkWidget *label_action_sel;
- GtkWidget *entry_icon_text;
- GtkWidget *combo_syl_action;
- GtkWidget *combo_syl_list;
- GtkWidget *combo_syl_entry;
-
ToolbarType source;
- GList *combo_action_list;
+ GList *combo_action_list; /* list of internal functions */
+
+ GtkWidget *list_view_set; /* toolbar items treeview */
+ GtkWidget *item_text_entry; /* item name */
+ GtkWidget *item_type_combo; /* item type selection widget */
+ GtkWidget *item_func_combo; /* item internal function widget */
+ GtkWidget *item_action_combo; /* item user action widget */
+ GtkWidget *icon_button; /* item icon chooser widget */
+
+ GtkWidget *icon_chooser_win;
+ GtkWidget *icon_chooser_view;
+
+ gchar *item_icon_file; /* item icon file */
} ToolbarPage;
#define ERROR_MSG _("Selected Action already set.\nPlease choose another Action from List")
+#define ERROR_MSG_NO_ICON _("Item has no icon defined.")
+#define ERROR_MSG_NO_TEXT _("Item has no text defined.")
static void prefs_toolbar_populate (ToolbarPage *prefs_toolbar);
+
+static void get_action_name (const gchar *entry,
+ gchar **menu);
+
static gboolean is_duplicate (ToolbarPage *prefs_toolbar,
gchar *chosen_action);
static void prefs_toolbar_save (PrefsPage *_page);
static void prefs_toolbar_down (GtkButton *button,
ToolbarPage *prefs_toolbar);
-static void prefs_toolbar_create (ToolbarPage *prefs_toolbar);
+static void action_selection_changed (GtkComboBox *action_combo,
+ ToolbarPage *prefs_toolbar);
-static void prefs_toolbar_selection_changed (GtkList *list,
+static void func_selection_changed (GtkComboBox *action_combo,
ToolbarPage *prefs_toolbar);
-static GtkWidget *create_icon_list_view (ToolbarPage *prefs_toolbar);
+static void prefs_toolbar_create (ToolbarPage *prefs_toolbar);
static GtkWidget *create_set_list_view (ToolbarPage *prefs_toolbar);
-static gboolean icon_list_selected (GtkTreeSelection *selector,
+static gboolean set_list_selected (GtkTreeSelection *selector,
GtkTreeModel *model,
GtkTreePath *path,
gboolean currently_selected,
ToolbarPage *prefs_toolbar);
-static gboolean set_list_selected (GtkTreeSelection *selector,
- GtkTreeModel *model,
- GtkTreePath *path,
- gboolean currently_selected,
+static void icon_chooser_create (GtkButton *button,
ToolbarPage *prefs_toolbar);
-void prefs_toolbar_create_widget(PrefsPage *_page, GtkWindow *window, gpointer data)
+static void prefs_toolbar_create_widget(PrefsPage *_page, GtkWindow *window, gpointer data)
{
ToolbarPage *prefs_toolbar = (ToolbarPage *) _page;
gchar *win_titles[3];
prefs_toolbar_populate(prefs_toolbar);
}
-void prefs_toolbar_save(PrefsPage *_page)
+static void prefs_toolbar_save(PrefsPage *_page)
{
ToolbarPage *prefs_toolbar = (ToolbarPage *) _page;
GtkTreeView *list_view = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
static void prefs_toolbar_populate(ToolbarPage *prefs_toolbar)
{
- gint i;
- GSList *cur;
- GList *syl_actions = NULL;
- GtkTreeView *list_view_icons = GTK_TREE_VIEW
- (prefs_toolbar->list_view_icons);
- GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model
- (list_view_icons));
- gchar *act;
- GtkTreeIter iter;
+ GList *cur;
+ GSList *cur2;
+ gchar *act, *act_name;
+
+ gtk_combo_box_append_text(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
+ _("Internal Function"));
+ gtk_combo_box_append_text(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
+ _("User Action"));
+ gtk_combo_box_append_text(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
+ _("Separator"));
- gtk_list_store_clear(store);
-
- /* set available icons */
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- SET_ICON, NULL,
- SET_ICON_TEXT, SEPARATOR_PIXMAP,
- SET_ICON_IS_TEXT, TRUE,
- SET_FILENAME, toolbar_ret_descr_from_val(A_SEPARATOR),
- -1);
-
prefs_toolbar->combo_action_list = toolbar_get_action_items(prefs_toolbar->source);
- gtk_combo_set_popdown_strings(GTK_COMBO(prefs_toolbar->combo_action),
- prefs_toolbar->combo_action_list);
- gtk_combo_set_value_in_list(GTK_COMBO(prefs_toolbar->combo_action), 0, FALSE);
- gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->combo_entry), prefs_toolbar->combo_action_list->data);
+ for(cur = prefs_toolbar->combo_action_list; cur != NULL; cur = cur->next) {
+ act = (gchar *)cur->data;
+ gtk_combo_box_append_text(GTK_COMBO_BOX(prefs_toolbar->item_func_combo),
+ act);
+ }
/* get currently defined sylpheed actions */
if (prefs_common.actions_list != NULL) {
+ for (cur2 = prefs_common.actions_list; cur2 != NULL; cur2 = cur2->next) {
+ act = (gchar *)cur2->data;
+ get_action_name(act, &act_name);
+
+ gtk_combo_box_append_text(
+ GTK_COMBO_BOX(prefs_toolbar->item_action_combo),
+ act_name);
- for (cur = prefs_common.actions_list; cur != NULL; cur = cur->next) {
- act = (gchar *)cur->data;
- syl_actions = g_list_append(syl_actions, act);
+ g_free(act_name);
}
- gtk_combo_set_popdown_strings(GTK_COMBO(prefs_toolbar->combo_syl_action), syl_actions);
- gtk_combo_set_value_in_list(GTK_COMBO(prefs_toolbar->combo_syl_action), 0, FALSE);
- gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->combo_syl_entry), syl_actions->data);
- prefs_toolbar_selection_changed(GTK_LIST(prefs_toolbar->combo_syl_list), prefs_toolbar);
- g_list_free(syl_actions);
}
-
- for (i = 0; i < STOCK_PIXMAP_SYLPHEED_LOGO; i++) {
- GdkPixbuf *pixbuf;
-
- stock_pixbuf_gdk(prefs_toolbar->window, i, &pixbuf);
-
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- SET_ICON, pixbuf,
- SET_FILENAME, stock_pixmap_get_name((StockPixmap) i),
- SET_ICON_TEXT, NULL,
- SET_ICON_IS_TEXT, FALSE,
- -1);
- }
-
- gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection
- (list_view_icons),
- &iter);
-
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo), 0);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_func_combo), 0);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_action_combo), 0);
+
prefs_toolbar_set_displayed(prefs_toolbar);
toolbar_clear_list(prefs_toolbar->source);
(prefs_toolbar->list_view_set);
GtkTreeModel *model_set = gtk_tree_view_get_model(list_view_set);
gchar *entry;
- gchar *syl_act = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
GtkTreeIter iter;
gboolean result;
if (!gtk_tree_model_iter_n_children(model_set, NULL))
return FALSE;
- /* allow duplicate entries (A_SYL_ACTIONS) */
- if (g_utf8_collate(syl_act, chosen_action) == 0)
- return FALSE;
-
if (!gtk_tree_model_get_iter_first(model_set, &iter))
return FALSE;
static void get_action_name(const gchar *entry, gchar **menu)
{
gchar *act, *act_p;
+
+ *menu = NULL;
if (prefs_common.actions_list != NULL) {
static void prefs_toolbar_register(GtkButton *button, ToolbarPage *prefs_toolbar)
{
GtkTreeView *list_view_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
- GtkTreeView *list_view_icons = GTK_TREE_VIEW(prefs_toolbar->list_view_icons);
- GtkTreeModel *model_icons = gtk_tree_view_get_model(list_view_icons);
- gchar *syl_act = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
+ gint item_type = gtk_combo_box_get_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo));
GtkListStore *store_set;
GtkTreeIter iter;
- gchar *fname;
-
- /* move selection in icon list view to set list view */
-
- if (!gtk_tree_model_iter_n_children(model_icons, NULL))
- return;
-
- if (!gtk_tree_selection_get_selected
- (gtk_tree_view_get_selection(list_view_icons),
- NULL, &iter))
- return;
-
- gtk_tree_model_get(model_icons, &iter,
- SET_FILENAME, &fname,
- -1);
store_set = GTK_LIST_STORE(gtk_tree_view_get_model(list_view_set));
/* SEPARATOR or other ? */
- if (g_utf8_collate(fname, toolbar_ret_descr_from_val(A_SEPARATOR)) == 0) {
+ if (item_type == ITEM_SEPARATOR) {
gtk_list_store_append(store_set, &iter);
gtk_list_store_set(store_set, &iter,
SET_ICON, NULL,
- SET_FILENAME, NULL,
+ SET_FILENAME, prefs_toolbar->item_icon_file,
SET_TEXT, NULL,
SET_EVENT, toolbar_ret_descr_from_val(A_SEPARATOR),
SET_ICON_TEXT, (const gchar *) SEPARATOR_PIXMAP,
} else {
GdkPixbuf *pixbuf;
gchar *event, *text;
-
- event = g_strdup(gtk_entry_get_text
- (GTK_ENTRY(prefs_toolbar->combo_entry)));
- if (is_duplicate(prefs_toolbar, event)) {
- alertpanel_error(ERROR_MSG);
- g_free(event);
- g_free(fname);
+ if (prefs_toolbar->item_icon_file == NULL) {
+ alertpanel_error(ERROR_MSG_NO_ICON);
return;
}
-
stock_pixbuf_gdk(prefs_toolbar->window,
- stock_pixmap_get_icon(fname),
+ stock_pixmap_get_icon(prefs_toolbar->item_icon_file),
&pixbuf);
-
- if (g_utf8_collate(event, syl_act) == 0) {
- const gchar *entry = gtk_entry_get_text(GTK_ENTRY(prefs_toolbar->combo_syl_entry));
- get_action_name(entry, &text);
+ if(pixbuf == NULL) {
+ alertpanel_error(ERROR_MSG_NO_ICON);
+ return;
+ }
+
+ if (item_type == ITEM_FUNCTION) {
+ event = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
+ prefs_toolbar->item_func_combo));
+
+ if (is_duplicate(prefs_toolbar, event)) {
+ alertpanel_error(ERROR_MSG);
+ g_free(event);
+ return;
+ }
} else
- text = gtk_editable_get_chars
- (GTK_EDITABLE(prefs_toolbar->entry_icon_text), 0, -1);
-
- gtk_list_store_append(store_set, &iter);
- gtk_list_store_set(store_set, &iter,
- SET_ICON, pixbuf,
- SET_FILENAME, fname,
- SET_TEXT, text,
- SET_EVENT, event,
- SET_ICON_TEXT, NULL,
- SET_ICON_IS_TEXT, FALSE,
- -1);
+ event = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
+
+ text = gtk_editable_get_chars(
+ GTK_EDITABLE(prefs_toolbar->item_text_entry), 0 , -1);
+
+ if (text != NULL) {
+ gtk_list_store_append(store_set, &iter);
+ gtk_list_store_set(store_set, &iter,
+ SET_ICON, pixbuf,
+ SET_FILENAME, prefs_toolbar->item_icon_file,
+ SET_TEXT, text,
+ SET_EVENT, event,
+ SET_ICON_TEXT, NULL,
+ SET_ICON_IS_TEXT, FALSE,
+ -1);
+ } else {
+ alertpanel_error(ERROR_MSG_NO_TEXT);
+ return;
+ }
+
g_free(text);
- g_free(event);
+ if(item_type != ITEM_USER_ACTION)
+ g_free(event);
}
-
- g_free(fname);
gtk_tree_selection_select_iter(gtk_tree_view_get_selection
(list_view_set),
static void prefs_toolbar_substitute(GtkButton *button, ToolbarPage *prefs_toolbar)
{
GtkTreeView *list_view_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
- GtkTreeView *list_view_icons = GTK_TREE_VIEW(prefs_toolbar->list_view_icons);
- GtkTreeModel *model_icons = gtk_tree_view_get_model(list_view_icons);
GtkListStore *store_set = GTK_LIST_STORE(gtk_tree_view_get_model(list_view_set));
- gchar *syl_act = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
- GtkTreeSelection *sel_icons;
+ gint item_type = gtk_combo_box_get_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo));
GtkTreeSelection *sel_set;
- GtkTreeIter iter_icons;
GtkTreeIter iter_set;
- gchar *icon_fname;
-
- /* replace selection in set list with the one in icon list */
if (!gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_set), NULL))
return;
- sel_icons = gtk_tree_view_get_selection(list_view_icons);
- if (!gtk_tree_selection_get_selected(sel_icons, NULL, &iter_icons))
- return;
-
sel_set = gtk_tree_view_get_selection(list_view_set);
if (!gtk_tree_selection_get_selected(sel_set, NULL, &iter_set))
return;
- gtk_tree_model_get(model_icons, &iter_icons,
- SET_FILENAME, &icon_fname,
- -1);
-
- if (g_utf8_collate(icon_fname, toolbar_ret_descr_from_val(A_SEPARATOR)) == 0) {
+ if (item_type == ITEM_SEPARATOR) {
gtk_list_store_set(store_set, &iter_set,
SET_ICON, NULL,
SET_TEXT, NULL,
SET_EVENT, toolbar_ret_descr_from_val(A_SEPARATOR),
- SET_FILENAME, icon_fname,
+ SET_FILENAME, prefs_toolbar->item_icon_file,
SET_ICON_TEXT, (const gchar *) SEPARATOR_PIXMAP,
SET_ICON_IS_TEXT, TRUE,
-1);
GdkPixbuf *pixbuf;
gchar *icon_event, *set_event, *text;
- icon_event = gtk_editable_get_chars
- (GTK_EDITABLE(prefs_toolbar->combo_entry),
- 0, -1);
-
- gtk_tree_model_get(GTK_TREE_MODEL(store_set), &iter_set,
- SET_EVENT, &set_event,
- -1);
-
- if (is_duplicate(prefs_toolbar, icon_event)
- && g_utf8_collate(icon_event, set_event) != 0){
- alertpanel_error(ERROR_MSG);
- g_free(set_event);
- g_free(icon_event);
- g_free(icon_fname);
+ if (prefs_toolbar->item_icon_file == NULL) {
+ alertpanel_error(ERROR_MSG_NO_ICON);
return;
}
-
stock_pixbuf_gdk(prefs_toolbar->window,
- stock_pixmap_get_icon(icon_fname),
+ stock_pixmap_get_icon(prefs_toolbar->item_icon_file),
&pixbuf);
-
- if (g_utf8_collate(icon_event, syl_act) == 0) {
- const gchar *entry = gtk_entry_get_text(GTK_ENTRY(prefs_toolbar->combo_syl_entry));
- get_action_name(entry, &text);
- } else {
- text = gtk_editable_get_chars(GTK_EDITABLE(prefs_toolbar->entry_icon_text),
- 0, -1);
+ if(pixbuf == NULL) {
+ alertpanel_error(ERROR_MSG_NO_ICON);
+ return;
}
+ gtk_tree_model_get(GTK_TREE_MODEL(store_set), &iter_set,
+ SET_EVENT, &set_event,
+ -1);
+
+ if (item_type == ITEM_FUNCTION) {
+ icon_event = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
+ prefs_toolbar->item_func_combo));
+
+ if (is_duplicate(prefs_toolbar, icon_event)
+ && g_utf8_collate(icon_event, set_event) != 0){
+ alertpanel_error(ERROR_MSG);
+ g_free(icon_event);
+ g_free(set_event);
+ return;
+ }
+ } else
+ icon_event = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
+
+ text = gtk_editable_get_chars(
+ GTK_EDITABLE(prefs_toolbar->item_text_entry), 0 , -1);
+
/* change the row */
- gtk_list_store_set(store_set, &iter_set,
- SET_ICON, pixbuf,
- SET_FILENAME, icon_fname,
- SET_TEXT, text,
- SET_EVENT, icon_event,
- SET_ICON_TEXT, NULL,
- SET_ICON_IS_TEXT, FALSE,
- -1);
-
- g_free(icon_event);
- g_free(set_event);
+ if (text != NULL) {
+ gtk_list_store_set(store_set, &iter_set,
+ SET_ICON, pixbuf,
+ SET_FILENAME, prefs_toolbar->item_icon_file,
+ SET_TEXT, text,
+ SET_EVENT, icon_event,
+ SET_ICON_TEXT, NULL,
+ SET_ICON_IS_TEXT, FALSE,
+ -1);
+ } else
+ alertpanel_error(ERROR_MSG_NO_TEXT);
+
g_free(text);
+ g_free(set_event);
+ if(item_type != ITEM_USER_ACTION)
+ g_free(icon_event);
}
-
- g_free(icon_fname);
}
static void prefs_toolbar_delete(GtkButton *button, ToolbarPage *prefs_toolbar)
{
GtkTreeView *list_view_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
- GtkListStore *store_set = GTK_LIST_STORE(gtk_tree_view_get_model
- (list_view_set));
- GtkTreeIter iter_set;
+ GtkTreeModel *store_set = gtk_tree_view_get_model(list_view_set);
+ GtkTreeIter iter_set;
+ GtkTreePath *path;
if (!gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_set), NULL))
return;
NULL,
&iter_set))
return;
+
+ /* select prev list item, if deleted was first select next */
+ path = gtk_tree_model_get_path(store_set, &iter_set);
+ gtk_tree_path_prev(path);
- gtk_list_store_remove(store_set, &iter_set);
+ gtk_list_store_remove(GTK_LIST_STORE(store_set), &iter_set);
- /* XXX: may need to select a list item */
+ gtk_tree_selection_select_path(
+ gtk_tree_view_get_selection(list_view_set),
+ path);
+
+ gtk_tree_path_free(path);
}
static void prefs_toolbar_up(GtkButton *button, ToolbarPage *prefs_toolbar)
{
GtkTreePath *prev, *sel;
GtkTreeIter isel;
- GtkListStore *store;
+ GtkListStore *store = NULL;
+ GtkTreeModel *model = NULL;
GtkTreeIter iprev;
if (!gtk_tree_selection_get_selected
(gtk_tree_view_get_selection
(GTK_TREE_VIEW(prefs_toolbar->list_view_set)),
- (GtkTreeModel **) &store,
+ &model,
&isel))
return;
+ store = (GtkListStore *)model;
sel = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &isel);
if (!sel)
static void prefs_toolbar_down(GtkButton *button, ToolbarPage *prefs_toolbar)
{
- GtkListStore *store;
+ GtkListStore *store = NULL;
+ GtkTreeModel *model = NULL;
GtkTreeIter next, sel;
if (!gtk_tree_selection_get_selected
(gtk_tree_view_get_selection
(GTK_TREE_VIEW(prefs_toolbar->list_view_set)),
- (GtkTreeModel **) &store,
+ &model,
&sel))
return;
+ store = (GtkListStore *)model;
next = sel;
if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &next))
return;
gtk_list_store_swap(store, &next, &sel);
}
-static void prefs_toolbar_selection_changed(GtkList *list,
- ToolbarPage *prefs_toolbar)
+static void item_type_changed(GtkComboBox *item_type_combo,
+ ToolbarPage *prefs_toolbar)
{
- gchar *cur_entry = g_strdup(gtk_entry_get_text(GTK_ENTRY(prefs_toolbar->combo_entry)));
- gchar *actions_entry = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
-
- gtk_widget_set_sensitive(prefs_toolbar->combo_syl_action, TRUE);
+ gint active = gtk_combo_box_get_active(item_type_combo);
+
+ switch(active) {
+ case ITEM_FUNCTION:
+ gtk_widget_show(prefs_toolbar->item_func_combo);
+ gtk_widget_hide(prefs_toolbar->item_action_combo);
+ gtk_combo_box_set_active(
+ GTK_COMBO_BOX(prefs_toolbar->item_func_combo), 0);
+ gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), "");
+ gtk_widget_set_sensitive(prefs_toolbar->item_text_entry, TRUE);
+ gtk_widget_set_sensitive(prefs_toolbar->item_func_combo, TRUE);
+ gtk_widget_set_sensitive(prefs_toolbar->icon_button, TRUE);
+
+ func_selection_changed(GTK_COMBO_BOX(prefs_toolbar->item_func_combo),
+ prefs_toolbar);
+ break;
+ case ITEM_USER_ACTION:
+ gtk_widget_show(prefs_toolbar->item_action_combo);
+ gtk_widget_hide(prefs_toolbar->item_func_combo);
+ gtk_combo_box_set_active(
+ GTK_COMBO_BOX(prefs_toolbar->item_action_combo), 0);
+ gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), "");
+ gtk_widget_set_sensitive(prefs_toolbar->item_text_entry, FALSE);
+ gtk_widget_set_sensitive(prefs_toolbar->item_action_combo, TRUE);
+ gtk_widget_set_sensitive(prefs_toolbar->icon_button, TRUE);
+
+ action_selection_changed(GTK_COMBO_BOX(prefs_toolbar->item_action_combo),
+ prefs_toolbar);
+ break;
+ case ITEM_SEPARATOR:
+ gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), _("None"));
+ gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button), NULL);
+ g_free(prefs_toolbar->item_icon_file);
+ prefs_toolbar->item_icon_file = NULL;
+ gtk_combo_box_set_active(
+ GTK_COMBO_BOX(prefs_toolbar->item_func_combo), -1);
+ gtk_combo_box_set_active(
+ GTK_COMBO_BOX(prefs_toolbar->item_action_combo), -1);
+ gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry), "");
+ gtk_widget_set_sensitive(prefs_toolbar->item_action_combo, FALSE);
+ gtk_widget_set_sensitive(prefs_toolbar->item_text_entry, FALSE);
+ gtk_widget_set_sensitive(prefs_toolbar->item_func_combo, FALSE);
+ gtk_widget_set_sensitive(prefs_toolbar->icon_button, FALSE);
+ break;
+ }
- if (g_utf8_collate(cur_entry, actions_entry) == 0) {
- gtk_widget_hide(prefs_toolbar->entry_icon_text);
- gtk_widget_show(prefs_toolbar->combo_syl_action);
- gtk_label_set_text(GTK_LABEL(prefs_toolbar->label_icon_text), _("Sylpheed Action"));
+}
- if (prefs_common.actions_list == NULL) {
- gtk_widget_set_sensitive(prefs_toolbar->combo_syl_action, FALSE);
- }
+static void action_selection_changed(GtkComboBox *action_combo,
+ ToolbarPage *prefs_toolbar)
+{
+ gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
+ prefs_toolbar->item_action_combo));
- } else {
- gtk_widget_hide(prefs_toolbar->combo_syl_action);
- gtk_widget_show(prefs_toolbar->entry_icon_text);
- gtk_label_set_text(GTK_LABEL(prefs_toolbar->label_icon_text), _("Toolbar text"));
- }
+ if(text != NULL) { /* action */
+ gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry), text);
+ g_free(text);
+ }
+}
- gtk_misc_set_alignment(GTK_MISC(prefs_toolbar->label_icon_text), 1, 0.5);
- gtk_widget_show(prefs_toolbar->label_icon_text);
- g_free(cur_entry);
+static void func_selection_changed(GtkComboBox *action_combo,
+ ToolbarPage *prefs_toolbar)
+{
+ gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
+ prefs_toolbar->item_func_combo));
+
+ if(text != NULL) { /* action */
+ int action = -1;
+ action = toolbar_ret_val_from_descr(text);
+ if (action >= 0)
+ gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry),
+ toolbar_get_short_text(action));
+ g_free(text);
+ if (action >= 0) {
+ StockPixmap stockp = toolbar_get_icon(action);
+ if (stockp >= 0) {
+ g_free(prefs_toolbar->item_icon_file);
+ prefs_toolbar->item_icon_file = g_strdup(stock_pixmap_get_name(stockp));
+
+ gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button),
+ stock_pixmap_widget(prefs_toolbar->window, stockp));
+ }
+ }
+ }
}
static void prefs_toolbar_create(ToolbarPage *prefs_toolbar)
{
GtkWidget *main_vbox;
- GtkWidget *top_hbox;
- GtkWidget *compose_frame;
+ GtkWidget *toolbar_item_hbox;
+ GtkWidget *icon_vbox;
+ GtkWidget *icon_label;
+ GtkWidget *icon_button;
+ GtkWidget *icon_hbox;
+ GtkWidget *item_type_combo;
+ GtkWidget *item_action_combo;
+ GtkWidget *item_func_combo;
GtkWidget *reg_hbox;
GtkWidget *arrow;
GtkWidget *btn_hbox;
+#ifdef MAEMO
+ GtkWidget *hbox;
+#endif
GtkWidget *reg_btn;
GtkWidget *subst_btn;
GtkWidget *del_btn;
GtkWidget *default_btn;
GtkWidget *vbox_frame;
GtkWidget *table;
- GtkWidget *scrolledwindow_list_view_icons;
- GtkWidget *list_view_icons;
GtkWidget *label_icon_text;
- GtkWidget *entry_icon_text;
- GtkWidget *label_action_sel;
- GtkWidget *empty_label;
- GtkWidget *combo_action;
- GtkWidget *combo_entry;
- GtkWidget *combo_list;
- GtkWidget *combo_syl_action;
- GtkWidget *combo_syl_entry;
- GtkWidget *combo_syl_list;
- GtkWidget *frame_toolbar_items;
+ GtkWidget *item_text_entry;
+ GtkWidget *vbox_toolbar_items;
GtkWidget *hbox_bottom;
GtkWidget *scrolledwindow_list_view_set;
GtkWidget *list_view_set;
+ GtkWidget *label;
GtkWidget *btn_vbox;
GtkWidget *up_btn;
GtkWidget *down_btn;
-
+
debug_print("Creating custom toolbar window...\n");
main_vbox = gtk_vbox_new(FALSE, 0);
gtk_widget_show(main_vbox);
+
+ vbox_frame = gtk_frame_new(_("Toolbar item"));
+ gtk_widget_show(vbox_frame);
+ gtk_box_pack_start(GTK_BOX(main_vbox), vbox_frame, FALSE, TRUE, 0);
+
+ toolbar_item_hbox = gtk_hbox_new (FALSE, 4);
+ gtk_widget_show(toolbar_item_hbox);
+ gtk_container_add(GTK_CONTAINER (vbox_frame), toolbar_item_hbox);
- top_hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(main_vbox), top_hbox, TRUE, TRUE, 0);
-
- compose_frame = gtk_frame_new(_("Available toolbar icons"));
- gtk_box_pack_start(GTK_BOX(top_hbox), compose_frame, TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(compose_frame), 5);
-
- vbox_frame = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(compose_frame), vbox_frame);
-
- /* available icons */
- scrolledwindow_list_view_icons = gtk_scrolled_window_new(NULL, NULL);
- gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow_list_view_icons), 5);
- gtk_container_add(GTK_CONTAINER(vbox_frame), scrolledwindow_list_view_icons);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_icons),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-
- list_view_icons = create_icon_list_view(prefs_toolbar);
- gtk_widget_show(list_view_icons);
- gtk_container_add(GTK_CONTAINER(scrolledwindow_list_view_icons), list_view_icons);
- gtk_container_set_border_width(GTK_CONTAINER(list_view_icons), 1);
- gtk_widget_set_size_request(list_view_icons, 225, 108);
-
- table = gtk_table_new (2, 3, FALSE);
- gtk_container_add (GTK_CONTAINER (vbox_frame), table);
+ table = gtk_table_new (3, 3, FALSE);
+ gtk_box_pack_start(GTK_BOX(toolbar_item_hbox), table,
+ TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (table), 8);
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
gtk_table_set_col_spacings (GTK_TABLE (table), 8);
+
+ /* toolbar item type */
+ label = gtk_label_new(_("Item type"));
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+ gtk_widget_show(label);
+ gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
- /* icon description */
- label_icon_text = gtk_label_new("");
- gtk_misc_set_alignment(GTK_MISC(label_icon_text), 0, 0.5);
- gtk_widget_show (label_icon_text);
- gtk_table_attach (GTK_TABLE (table), label_icon_text, 0, 1, 0, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
+ item_type_combo = gtk_combo_box_new_text();
+ gtk_widget_set_size_request(item_type_combo, 200, -1);
+ gtk_table_attach(GTK_TABLE(table), item_type_combo, 1, 3, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
- entry_icon_text = gtk_entry_new();
- gtk_table_attach (GTK_TABLE (table), entry_icon_text, 1, 2, 0, 1,
- (GtkAttachOptions) (/*GTK_EXPAND | */GTK_FILL),
+ /* available actions */
+ label = gtk_label_new(_("Event executed on click"));
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (0), 0, 0);
- /* Sylpheed Action Combo Box */
- combo_syl_action = gtk_combo_new();
- combo_syl_list = GTK_COMBO(combo_syl_action)->list;
- combo_syl_entry = GTK_COMBO(combo_syl_action)->entry;
- gtk_entry_set_editable(GTK_ENTRY(combo_syl_entry), FALSE);
- gtk_table_attach (GTK_TABLE (table), combo_syl_action, 1, 2, 0, 1,
- (GtkAttachOptions) (/*GTK_EXPAND | */GTK_FILL),
+ item_action_combo = gtk_combo_box_new_text();
+ gtk_widget_set_size_request(item_action_combo, 200, -1);
+ gtk_table_attach (GTK_TABLE (table), item_action_combo, 1, 3, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (0), 0, 0);
-
- empty_label = gtk_label_new("");
- gtk_table_attach (GTK_TABLE (table), empty_label, 2, 3, 0, 1,
- (GtkAttachOptions) (GTK_EXPAND),
+
+ /* available internal functions */
+ item_func_combo = gtk_combo_box_new_text();
+ gtk_widget_set_size_request(item_func_combo, 200, -1);
+ gtk_table_attach (GTK_TABLE (table), item_func_combo, 1, 3, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
(GtkAttachOptions) (0), 0, 0);
- /* available actions */
- label_action_sel = gtk_label_new(_("Event executed on click"));
- gtk_misc_set_alignment(GTK_MISC(label_action_sel), 0, 0.5);
- gtk_table_attach (GTK_TABLE (table), label_action_sel, 0, 1, 1, 2,
+
+ /* toolbar item description */
+ label_icon_text = gtk_label_new(_("Toolbar text"));
+ gtk_misc_set_alignment(GTK_MISC(label_icon_text), 0, 0.5);
+ gtk_widget_show (label_icon_text);
+ gtk_table_attach (GTK_TABLE (table), label_icon_text, 0, 1, 2, 3,
(GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (0), 0, 0);
- combo_action = gtk_combo_new();
- gtk_table_attach (GTK_TABLE (table), combo_action, 1, 2, 1, 2,
- (GtkAttachOptions) (GTK_FILL),
+ item_text_entry = gtk_entry_new();
+ gtk_table_attach (GTK_TABLE (table), item_text_entry, 1, 3, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
(GtkAttachOptions) (0), 0, 0);
+
+ icon_vbox = gtk_vbox_new(FALSE, VBOX_BORDER);
+ gtk_widget_show(icon_vbox);
- combo_list = GTK_COMBO(combo_action)->list;
- combo_entry = GTK_COMBO(combo_action)->entry;
- gtk_entry_set_editable(GTK_ENTRY(combo_entry), FALSE);
+ icon_label = gtk_label_new(_("Icon"));
+ gtk_widget_set_size_request(icon_label, 100, -1);
+ gtk_box_pack_start(GTK_BOX(icon_vbox), icon_label, FALSE, FALSE, 0);
- empty_label = gtk_label_new("");
- gtk_table_attach (GTK_TABLE (table), empty_label, 2, 3, 1, 2,
- (GtkAttachOptions) (GTK_EXPAND),
- (GtkAttachOptions) (0), 0, 0);
-
+ icon_hbox = gtk_hbox_new(FALSE, 0);
+ gtk_widget_show(icon_hbox);
+
+ label = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(icon_hbox), label, TRUE, TRUE, 0);
+
+ icon_button = gtk_button_new();
+ gtk_widget_show(icon_button);
+ gtk_widget_set_size_request(icon_button, 50, 50);
+ g_signal_connect(G_OBJECT(icon_button), "clicked",
+ G_CALLBACK(icon_chooser_create), prefs_toolbar);
+ gtk_box_pack_start(GTK_BOX(icon_hbox), icon_button, FALSE, FALSE, 8);
+
+ label = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(icon_hbox), label, TRUE, TRUE, 0);
+
+ gtk_box_pack_start(GTK_BOX(icon_vbox), icon_hbox, FALSE, FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(toolbar_item_hbox), icon_vbox, FALSE, FALSE, 0);
+
/* register / substitute / delete */
reg_hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(main_vbox), reg_hbox, FALSE, FALSE, 0);
G_CALLBACK(prefs_toolbar_register),
prefs_toolbar);
- subst_btn = gtk_button_new_with_label(_(" Replace "));
+ subst_btn = gtkut_get_replace_btn(_("Replace"));
gtk_box_pack_start(GTK_BOX(btn_hbox), subst_btn, FALSE, TRUE, 0);
g_signal_connect(G_OBJECT(subst_btn), "clicked",
G_CALLBACK(prefs_toolbar_substitute),
prefs_toolbar);
- del_btn = gtk_button_new_from_stock(GTK_STOCK_REMOVE);
+ del_btn = gtk_button_new_from_stock(GTK_STOCK_DELETE);
gtk_box_pack_start(GTK_BOX(btn_hbox), del_btn, FALSE, TRUE, 0);
g_signal_connect(G_OBJECT(del_btn), "clicked",
G_CALLBACK(prefs_toolbar_delete),
prefs_toolbar);
- default_btn = gtk_button_new_with_label(_(" Default "));
+ default_btn = gtk_button_new_with_label(_(" Use default "));
+#ifndef MAEMO
gtk_box_pack_end(GTK_BOX(reg_hbox), default_btn, FALSE, TRUE, 0);
+#else
+ hbox = gtk_hbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), default_btn, FALSE, FALSE, 0);
+#endif
g_signal_connect(G_OBJECT(default_btn), "clicked",
G_CALLBACK(prefs_toolbar_default),
prefs_toolbar);
/* currently active toolbar items */
- frame_toolbar_items = gtk_frame_new(_("Displayed toolbar items"));
- gtk_box_pack_start(GTK_BOX(main_vbox), frame_toolbar_items, TRUE, TRUE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(frame_toolbar_items), 5);
+ vbox_toolbar_items = gtk_vbox_new(FALSE, VBOX_BORDER);
+ gtk_box_pack_start(GTK_BOX(main_vbox), vbox_toolbar_items, TRUE, TRUE, 0);
hbox_bottom = gtk_hbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(frame_toolbar_items), hbox_bottom);
+ gtk_container_add(GTK_CONTAINER(vbox_toolbar_items), hbox_bottom);
scrolledwindow_list_view_set = gtk_scrolled_window_new(NULL, NULL);
gtk_box_pack_start(GTK_BOX(hbox_bottom), scrolledwindow_list_view_set, TRUE, TRUE, 0);
gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow_list_view_set), 1);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_icons),
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_set),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_set),
+ GTK_SHADOW_IN);
list_view_set = create_set_list_view(prefs_toolbar);
gtk_widget_show(list_view_set);
gtk_widget_show(down_btn);
gtk_box_pack_start(GTK_BOX(btn_vbox), down_btn, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(combo_list), "selection-changed",
- G_CALLBACK(prefs_toolbar_selection_changed),
- prefs_toolbar);
+ g_signal_connect(G_OBJECT(item_type_combo), "changed",
+ G_CALLBACK(item_type_changed), prefs_toolbar);
+ g_signal_connect(G_OBJECT(item_action_combo), "changed",
+ G_CALLBACK(action_selection_changed), prefs_toolbar);
+ g_signal_connect(G_OBJECT(item_func_combo), "changed",
+ G_CALLBACK(func_selection_changed), prefs_toolbar);
g_signal_connect(G_OBJECT(up_btn), "clicked",
G_CALLBACK(prefs_toolbar_up), prefs_toolbar);
g_signal_connect(G_OBJECT(down_btn), "clicked",
gtk_widget_show_all(main_vbox);
- prefs_toolbar->list_view_icons = list_view_icons;
prefs_toolbar->list_view_set = list_view_set;
- prefs_toolbar->combo_action = combo_action;
- prefs_toolbar->combo_entry = combo_entry;
- prefs_toolbar->combo_list = combo_list;
- prefs_toolbar->entry_icon_text = entry_icon_text;
- prefs_toolbar->combo_syl_action = combo_syl_action;
- prefs_toolbar->combo_syl_list = combo_syl_list;
- prefs_toolbar->combo_syl_entry = combo_syl_entry;
-
- prefs_toolbar->label_icon_text = label_icon_text;
- prefs_toolbar->label_action_sel = label_action_sel;
-
+ prefs_toolbar->item_text_entry = item_text_entry;
+ prefs_toolbar->item_type_combo = item_type_combo;
+ prefs_toolbar->item_func_combo = item_func_combo;
+ prefs_toolbar->item_action_combo= item_action_combo;
+ prefs_toolbar->icon_button = icon_button;
+ prefs_toolbar->item_icon_file = NULL;
+
prefs_toolbar->page.widget = main_vbox;
}
page->page.destroy_widget = prefs_toolbar_destroy_widget;
page->page.save_page = prefs_toolbar_save;
page->source = TOOLBAR_MAIN;
+ page->page.weight = 50.0;
prefs_gtk_register_page((PrefsPage *) page);
prefs_toolbar_mainwindow = page;
page->page.destroy_widget = prefs_toolbar_destroy_widget;
page->page.save_page = prefs_toolbar_save;
page->source = TOOLBAR_MSGVIEW;
+ page->page.weight = 45.0;
prefs_gtk_register_page((PrefsPage *) page);
prefs_toolbar_messageview = page;
page->page.destroy_widget = prefs_toolbar_destroy_widget;
page->page.save_page = prefs_toolbar_save;
page->source = TOOLBAR_COMPOSE;
+ page->page.weight = 40.0;
prefs_gtk_register_page((PrefsPage *) page);
prefs_toolbar_composewindow = page;
}
void prefs_toolbar_done(void)
{
prefs_gtk_unregister_page((PrefsPage *) prefs_toolbar_mainwindow);
+ g_free(prefs_toolbar_mainwindow->item_icon_file);
g_free(prefs_toolbar_mainwindow);
prefs_gtk_unregister_page((PrefsPage *) prefs_toolbar_composewindow);
+ g_free(prefs_toolbar_composewindow->item_icon_file);
g_free(prefs_toolbar_composewindow);
prefs_gtk_unregister_page((PrefsPage *) prefs_toolbar_messageview);
+ g_free(prefs_toolbar_messageview->item_icon_file);
g_free(prefs_toolbar_messageview);
}
}
}
-static GtkWidget *create_icon_list_view(ToolbarPage *prefs_toolbar)
-{
- GtkTreeView *list_view;
- GtkListStore *store;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
- GtkTreeSelection *selector;
-
- /* XXX: for icon list we don't need SET_TEXT, and SET_EVENT */
- store = gtk_list_store_new(N_SET_COLUMNS,
- GDK_TYPE_PIXBUF,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_BOOLEAN,
- -1);
- list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
- g_object_unref(G_OBJECT(store));
-
- column = gtk_tree_view_column_new();
- renderer = gtk_cell_renderer_pixbuf_new();
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
-
- /* tell pixbuf renderer it is only visible if
- * the icon is not represented by text */
- gtk_tree_view_column_set_cell_data_func(column, renderer,
- set_visible_if_not_text,
- NULL, NULL);
-
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
-
- /* tell the text renderer it is only visible if the icon
- * is represented by an image */
- gtk_tree_view_column_set_attributes(column, renderer,
- "visible", SET_ICON_IS_TEXT,
- "text", SET_ICON_TEXT,
- NULL);
-
- gtk_tree_view_append_column(list_view, column);
-
- column = gtk_tree_view_column_new();
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, renderer, TRUE);
- gtk_tree_view_column_set_attributes(column, renderer,
- "text", SET_FILENAME,
- NULL);
-
- gtk_tree_view_append_column(list_view, column);
-
- /* various other tree view attributes */
- gtk_tree_view_set_rules_hint(list_view, prefs_common.enable_rules_hint);
- gtk_tree_view_set_headers_visible(list_view, FALSE);
-
- selector = gtk_tree_view_get_selection(list_view);
- gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
- gtk_tree_selection_set_select_function
- (selector, (GtkTreeSelectionFunc) icon_list_selected,
- prefs_toolbar, NULL);
-
- return GTK_WIDGET(list_view);
-}
-
static GtkWidget *create_set_list_view(ToolbarPage *prefs_toolbar)
{
GtkTreeView *list_view;
gtk_tree_view_append_column(list_view, column);
- column = gtk_tree_view_column_new();
- gtk_tree_view_column_set_title(column, _("File name"));
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(column, renderer, FALSE);
- gtk_tree_view_column_set_attributes(column, renderer,
- "text", SET_FILENAME,
- NULL);
-
- gtk_tree_view_append_column(list_view, column);
-
column = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(column, _("Icon text"));
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_append_column(list_view, column);
/* various other tree view attributes */
- gtk_tree_view_set_rules_hint(list_view, prefs_common.enable_rules_hint);
+ gtk_tree_view_set_rules_hint(list_view, prefs_common.use_stripes_everywhere);
selector = gtk_tree_view_get_selection(list_view);
gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
}
-static gboolean icon_list_selected(GtkTreeSelection *selector,
- GtkTreeModel *model,
- GtkTreePath *path,
- gboolean currently_selected,
- ToolbarPage *prefs_toolbar)
-{
- GtkTreeIter iter;
- GtkTreeView *list_ico = gtk_tree_selection_get_tree_view(selector);
- gchar *text;
-
- if (currently_selected ||!gtk_tree_model_get_iter(model, &iter, path))
- return TRUE;
-
- text = NULL;
- gtk_tree_model_get(model, &iter,
- SET_FILENAME, &text,
- -1);
- if (!text)
- return TRUE;
-
- if (g_utf8_collate(toolbar_ret_descr_from_val(A_SEPARATOR), text) == 0) {
- gtk_widget_set_sensitive(prefs_toolbar->combo_action, FALSE);
- gtk_widget_set_sensitive(prefs_toolbar->entry_icon_text, FALSE);
- gtk_widget_set_sensitive(prefs_toolbar->combo_syl_action, FALSE);
- } else {
- gtk_widget_set_sensitive(prefs_toolbar->combo_action, TRUE);
- gtk_widget_set_sensitive(prefs_toolbar->entry_icon_text, TRUE);
- gtk_widget_set_sensitive(prefs_toolbar->combo_syl_action, TRUE);
- }
-
- g_free(text);
-
- return TRUE;
-}
-
static gboolean set_list_selected(GtkTreeSelection *selector,
GtkTreeModel *model,
GtkTreePath *path,
gboolean currently_selected,
ToolbarPage *prefs_toolbar)
{
+
GtkTreeIter iter;
- GtkTreeView *list_ico = GTK_TREE_VIEW(prefs_toolbar->list_view_icons);
- GtkTreeView *list_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
- gchar *syl_act = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
- gchar *file, *icon_text, *descr;
+ gchar *icon_text, *icon_file, *descr;
GList *cur;
+ GSList *cur2;
gint item_num;
- GtkTreeModel *model_ico;
+ GdkPixbuf *pix;
- if (currently_selected ||!gtk_tree_model_get_iter(model, &iter, path))
+ if (currently_selected || !gtk_tree_model_get_iter(model, &iter, path))
return TRUE;
gtk_tree_model_get(model, &iter,
- SET_FILENAME, &file,
+ SET_ICON, &pix,
SET_TEXT, &icon_text,
SET_EVENT, &descr,
+ SET_FILENAME, &icon_file,
-1);
+
+ g_free(prefs_toolbar->item_icon_file);
+ prefs_toolbar->item_icon_file = icon_file;
+ gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button),
+ gtk_image_new_from_pixbuf(pix));
+
+ if (g_utf8_collate(toolbar_ret_descr_from_val(A_SEPARATOR), descr) == 0) {
+ gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button),
+ _("None"));
+ g_free(prefs_toolbar->item_icon_file);
+ prefs_toolbar->item_icon_file = NULL;
+ gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
+ ITEM_SEPARATOR);
+ g_free(icon_text);
+ g_free(descr);
- if (g_utf8_collate(descr, syl_act))
- gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->entry_icon_text),
- icon_text);
+ return TRUE;
+ }
+
+ gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), "");
+ gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry),
+ icon_text);
+
+ if (g_utf8_collate(toolbar_ret_descr_from_val(A_SYL_ACTIONS), descr) == 0) {
+ gtk_combo_box_set_active(GTK_COMBO_BOX(
+ prefs_toolbar->item_type_combo), ITEM_USER_ACTION);
+
+ for(cur2 = prefs_common.actions_list, item_num = 0; cur2 != NULL;
+ cur2 = cur2->next) {
+ gchar *item_string;
+ get_action_name((gchar *)cur2->data, &item_string);
+
+ if(g_utf8_collate(item_string, icon_text) == 0) {
+ gtk_combo_box_set_active(
+ GTK_COMBO_BOX(prefs_toolbar->item_action_combo),
+ item_num);
+ g_free(item_string);
+ break;
+ }
+ else {
+ item_num++;
+ g_free(item_string);
+ }
+ }
+
+ g_free(icon_text);
+ g_free(descr);
+
+ return TRUE;
+ }
/* scan combo list for selected description an set combo item accordingly */
for (cur = prefs_toolbar->combo_action_list, item_num = 0; cur != NULL;
cur = cur->next) {
gchar *item_str = (gchar*)cur->data;
if (g_utf8_collate(item_str, descr) == 0) {
- gtk_list_select_item(GTK_LIST(prefs_toolbar->combo_list), item_num);
+ gtk_combo_box_set_active(
+ GTK_COMBO_BOX(prefs_toolbar->item_func_combo),
+ item_num);
+
break;
}
else
item_num++;
}
- model_ico = gtk_tree_view_get_model(list_ico);
- if (gtk_tree_model_get_iter_first(model_ico, &iter)) {
- gchar *entry;
- gboolean found = FALSE;
-
- /* find in icon list, scroll to item */
- do {
- entry = NULL;
- gtk_tree_model_get(model_ico, &iter,
- SET_FILENAME, &entry,
- -1);
- found = entry && !g_utf8_collate(entry, file);
- g_free(entry);
- if (found)
- break;
- } while(gtk_tree_model_iter_next(model_ico, &iter));
+ gtk_combo_box_set_active(GTK_COMBO_BOX(
+ prefs_toolbar->item_type_combo),ITEM_FUNCTION);
- if (found) {
- GtkTreePath *path;
+ g_free(icon_text);
+ g_free(descr);
- gtk_tree_selection_select_iter
- (gtk_tree_view_get_selection(list_ico), &iter);
- path = gtk_tree_model_get_path(model_ico, &iter);
- gtk_tree_view_set_cursor(list_ico, path, NULL, FALSE);
- gtk_tree_path_free(path);
+ return TRUE;
+}
+
+static void icon_chooser_ok_clicked(GtkButton *button,
+ ToolbarPage *prefs_toolbar)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GList *list;
+ GdkPixbuf *pix;
+ gchar *icon_file;
+
+ g_return_if_fail(prefs_toolbar != NULL);
+
+ model = gtk_icon_view_get_model(GTK_ICON_VIEW(prefs_toolbar->icon_chooser_view));
+ list = gtk_icon_view_get_selected_items(GTK_ICON_VIEW(prefs_toolbar->icon_chooser_view));
+ if(list == NULL)
+ return;
+
+ if(!gtk_tree_model_get_iter(model, &iter, (GtkTreePath *)list->data)) {
+ gtk_tree_path_free(list->data);
+ g_list_free(list);
+ return;
+ }
+
+ gtk_tree_model_get(model, &iter,
+ SET_ICON, &pix,
+ SET_FILENAME, &icon_file,
+ -1);
+
+ g_free(prefs_toolbar->item_icon_file);
+ prefs_toolbar->item_icon_file = icon_file;
+ gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button),
+ gtk_image_new_from_pixbuf(pix));
+
+ gtk_widget_destroy(prefs_toolbar->icon_chooser_win);
+ prefs_toolbar->icon_chooser_win = NULL;
+ prefs_toolbar->icon_chooser_view = NULL;
+
+ gtk_tree_path_free(list->data);
+ g_list_free(list);
+}
+
+static void icon_chooser_cancel_clicked(GtkButton *button,
+ ToolbarPage *prefs_toolbar)
+{
+ g_return_if_fail(prefs_toolbar != NULL);
+
+ gtk_widget_destroy(prefs_toolbar->icon_chooser_win);
+ prefs_toolbar->icon_chooser_win = NULL;
+ prefs_toolbar->icon_chooser_view = NULL;
+}
+
+static gboolean icon_chooser_key_pressed(GtkWidget *widget, GdkEventKey *event,
+ ToolbarPage *prefs_toolbar)
+{
+ if (event && event->keyval == GDK_Escape) {
+ icon_chooser_cancel_clicked(NULL, prefs_toolbar);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean icon_list_key_pressed(GtkWidget *widget, GdkEventKey *event,
+ ToolbarPage *prefs_toolbar)
+{
+ if (event) {
+ if (event->keyval == GDK_KP_Enter ||
+ event->keyval == GDK_Return ||
+ event->keyval == GDK_space) {
+ icon_chooser_ok_clicked(NULL, prefs_toolbar);
+ return TRUE;
}
}
+ return FALSE;
+}
- g_free(file);
- g_free(icon_text);
- g_free(descr);
+static gboolean ok_cb(gpointer data)
+{
+ ToolbarPage *prefs_toolbar = (ToolbarPage *)data;
+ icon_chooser_ok_clicked(NULL, prefs_toolbar);
+ return FALSE;
+}
- return TRUE;
+static gboolean icon_list_button_release(GtkWidget *widget,
+ GdkEventButton *event,
+ ToolbarPage *prefs_toolbar )
+{
+ static guint id = -1;
+ if (id >= 0) {
+ g_source_remove(id);
+ id = -1;
+ }
+ id = g_timeout_add(100, ok_cb, prefs_toolbar);
+ return FALSE;
+}
+
+static gboolean icon_window_button_press(GtkWidget *widget,
+ GdkEventButton *event,
+ ToolbarPage *prefs_toolbar )
+{
+ GtkWidget *event_widget, *button;
+ gboolean restore = TRUE;
+
+ button = prefs_toolbar->icon_button;
+
+ /* Test where mouse was clicked */
+ event_widget = gtk_get_event_widget((GdkEvent *)event);
+ if (event_widget != widget) {
+ while (event_widget) {
+ if (event_widget == widget)
+ return FALSE;
+ else if (event_widget == prefs_toolbar->icon_chooser_win) {
+ restore = FALSE;
+ break;
+ }
+ event_widget = event_widget->parent;
+ }
+ }
+
+ if (restore) {
+ icon_chooser_cancel_clicked(NULL, prefs_toolbar);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void icon_chooser_activated(GtkTreeView *treeview, GtkTreePath *path,
+ ToolbarPage *prefs_toolbar)
+{
+ icon_chooser_ok_clicked(NULL, prefs_toolbar);
+}
+
+static void icon_chooser_create(GtkButton *button, ToolbarPage *prefs_toolbar)
+{
+ GtkWidget *icon_chooser_win;
+ GtkWidget *scrollwin;
+ GtkWidget *icon_view;
+ GtkListStore *store;
+ GtkTreeIter iter;
+ gint i, x, y;
+
+ store = gtk_list_store_new(2,
+ GDK_TYPE_PIXBUF,
+ G_TYPE_STRING,
+ -1);
+
+ gtk_list_store_clear(store);
+
+ for (i = 0; ToolbarIcons[i] != STOCK_PIXMAP_EMPTY; i++) {
+ GdkPixbuf *pixbuf;
+ stock_pixbuf_gdk(prefs_toolbar->window, ToolbarIcons[i], &pixbuf);
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ SET_ICON, pixbuf,
+ SET_FILENAME, stock_pixmap_get_name((StockPixmap) ToolbarIcons[i]),
+ -1);
+ }
+
+ icon_chooser_win = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "prefs_toolbar");
+ gtk_window_set_title(GTK_WINDOW(icon_chooser_win), _("Toolbar item icon"));
+ gtk_window_set_decorated(GTK_WINDOW(icon_chooser_win), FALSE);
+ gdk_window_get_origin(GTK_WIDGET(prefs_toolbar->icon_button)->window,
+ &x, &y);
+ x += GTK_WIDGET(prefs_toolbar->icon_button)->allocation.x;
+ y += GTK_WIDGET(prefs_toolbar->icon_button)->allocation.y;
+ y += 50;
+ x -= 300-50;
+ gtk_window_move(GTK_WINDOW(icon_chooser_win), x, y);
+ gtk_window_set_resizable(GTK_WINDOW(icon_chooser_win), FALSE);
+ gtk_widget_set_size_request(icon_chooser_win, 300, 320);
+
+ scrollwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_container_add(GTK_CONTAINER(icon_chooser_win), scrollwin);
+ gtk_widget_show(scrollwin);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwin),
+ GTK_SHADOW_OUT);
+
+ icon_view = gtk_icon_view_new_with_model(GTK_TREE_MODEL(store));
+ gtk_icon_view_set_selection_mode(GTK_ICON_VIEW(icon_view), GTK_SELECTION_SINGLE);
+ gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(icon_view), SET_ICON);
+ gtk_container_add(GTK_CONTAINER(scrollwin), GTK_WIDGET(icon_view));
+
+ g_signal_connect(G_OBJECT(icon_chooser_win), "key_press_event",
+ G_CALLBACK(icon_chooser_key_pressed), prefs_toolbar);
+ g_signal_connect(G_OBJECT(icon_view), "item-activated",
+ G_CALLBACK(icon_chooser_activated), prefs_toolbar);
+ g_signal_connect(G_OBJECT(icon_chooser_win),
+ "button-press-event",
+ G_CALLBACK(icon_window_button_press),
+ prefs_toolbar );
+ g_signal_connect(G_OBJECT(icon_view),
+ "button-release-event",
+ G_CALLBACK(icon_list_button_release),
+ prefs_toolbar );
+ g_signal_connect(G_OBJECT(icon_view), "key_press_event",
+ G_CALLBACK(icon_list_key_pressed), prefs_toolbar);
+
+ gtk_widget_show_all(icon_chooser_win);
+ gtk_widget_grab_focus(GTK_WIDGET(icon_view));
+ gtk_window_set_modal(GTK_WINDOW(icon_chooser_win), TRUE);
+
+ prefs_toolbar->icon_chooser_win = icon_chooser_win;
+ prefs_toolbar->icon_chooser_view = icon_view;
}