2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2002-2007 Hiroyuki Yamamoto & the Claws Mail team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * General functions for accessing address book files.
31 #include <glib/gi18n.h>
33 #include <gtk/gtkoptionmenu.h>
34 #include <gdk/gdkkeysyms.h>
38 #include "stock_pixmap.h"
39 #include "manage_window.h"
41 #include "mainwindow.h"
42 #include "alertpanel.h"
43 #include "prefs_common.h"
48 #include "prefs_toolbar.h"
49 #include "prefswindow.h"
50 #include "prefs_gtk.h"
58 SET_ICON_TEXT = 4, /*!< "icon" text (separator) */
59 SET_ICON_IS_TEXT = 5, /*!< icon is text representation */
70 typedef struct _ToolbarPage
74 GtkWidget *window; /* do not modify */
77 GList *combo_action_list; /* list of internal functions */
79 GtkWidget *list_view_set; /* toolbar items treeview */
80 GtkWidget *item_text_entry; /* item name */
81 GtkWidget *item_type_combo; /* item type selection widget */
82 GtkWidget *item_func_combo; /* item internal function widget */
83 GtkWidget *item_action_combo; /* item user action widget */
84 GtkWidget *icon_button; /* item icon chooser widget */
86 GtkWidget *icon_chooser_win;
87 GtkWidget *icon_chooser_list;
89 gchar *item_icon_file; /* item icon file */
93 #define ERROR_MSG _("Selected Action already set.\nPlease choose another Action from List")
94 #define ERROR_MSG_NO_ICON _("Item has no icon defined.")
95 #define ERROR_MSG_NO_TEXT _("Item has no text defined.")
97 static void prefs_toolbar_populate (ToolbarPage *prefs_toolbar);
99 static void get_action_name (const gchar *entry,
102 static gboolean is_duplicate (ToolbarPage *prefs_toolbar,
103 gchar *chosen_action);
104 static void prefs_toolbar_save (PrefsPage *_page);
106 static void prefs_toolbar_register (GtkButton *button,
107 ToolbarPage *prefs_toolbar);
108 static void prefs_toolbar_substitute (GtkButton *button,
109 ToolbarPage *prefs_toolbar);
110 static void prefs_toolbar_delete (GtkButton *button,
111 ToolbarPage *prefs_toolbar);
113 static void prefs_toolbar_up (GtkButton *button,
114 ToolbarPage *prefs_toolbar);
116 static void prefs_toolbar_down (GtkButton *button,
117 ToolbarPage *prefs_toolbar);
119 static void action_selection_changed (GtkComboBox *action_combo,
120 ToolbarPage *prefs_toolbar);
122 static void func_selection_changed (GtkComboBox *action_combo,
123 ToolbarPage *prefs_toolbar);
125 static void prefs_toolbar_create (ToolbarPage *prefs_toolbar);
127 static GtkWidget *create_set_list_view (ToolbarPage *prefs_toolbar);
129 static gboolean set_list_selected (GtkTreeSelection *selector,
132 gboolean currently_selected,
133 ToolbarPage *prefs_toolbar);
135 static void icon_chooser_create (GtkButton *button,
136 ToolbarPage *prefs_toolbar);
138 static void prefs_toolbar_create_widget(PrefsPage *_page, GtkWindow *window, gpointer data)
140 ToolbarPage *prefs_toolbar = (ToolbarPage *) _page;
141 gchar *win_titles[3];
142 win_titles[TOOLBAR_MAIN] = _("Main toolbar configuration");
143 win_titles[TOOLBAR_COMPOSE] = _("Compose toolbar configuration");
144 win_titles[TOOLBAR_MSGVIEW] = _("Message view toolbar configuration");
146 prefs_toolbar->window = GTK_WIDGET(window);
148 toolbar_read_config_file(prefs_toolbar->source);
150 prefs_toolbar_create(prefs_toolbar);
151 prefs_toolbar_populate(prefs_toolbar);
154 static void prefs_toolbar_save(PrefsPage *_page)
156 ToolbarPage *prefs_toolbar = (ToolbarPage *) _page;
157 GtkTreeView *list_view = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
158 GtkTreeModel *model = gtk_tree_view_get_model(list_view);
161 toolbar_clear_list(prefs_toolbar->source);
163 if (!gtk_tree_model_iter_n_children(model, NULL)
164 || !gtk_tree_model_get_iter_first(model, &iter))
165 toolbar_set_default(prefs_toolbar->source);
169 gchar *fname, *text, *event;
171 item = g_new0(ToolbarItem, 1);
173 gtk_tree_model_get(model, &iter,
174 SET_FILENAME, &fname,
179 /* XXX: remember that G_TYPE_STRING returned by model
180 * is owned by caller of gtk_tree_model_get() */
183 item->index = toolbar_ret_val_from_descr(event);
186 /* TODO: save A_SYL_ACTIONS only if they are still active */
187 toolbar_set_list_item(item, prefs_toolbar->source);
192 } while (gtk_tree_model_iter_next(model, &iter));
195 toolbar_save_config_file(prefs_toolbar->source);
197 if (prefs_toolbar->source == TOOLBAR_MAIN)
198 main_window_reflect_prefs_all_real(TRUE);
199 else if (prefs_toolbar->source == TOOLBAR_COMPOSE)
200 compose_reflect_prefs_pixmap_theme();
201 else if (prefs_toolbar->source == TOOLBAR_MSGVIEW)
202 messageview_reflect_prefs_pixmap_theme();
205 static void prefs_toolbar_destroy_widget(PrefsPage *_page)
207 ToolbarPage *prefs_toolbar = (ToolbarPage *) _page;
209 g_list_free(prefs_toolbar->combo_action_list);
210 prefs_toolbar->combo_action_list = NULL;
213 static void prefs_toolbar_set_displayed(ToolbarPage *prefs_toolbar)
216 GtkTreeView *list_view_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
217 GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model
219 GSList *toolbar_list = toolbar_get_list(prefs_toolbar->source);
222 gtk_list_store_clear(store);
224 /* set currently active toolbar entries */
225 for (cur = toolbar_list; cur != NULL; cur = cur->next) {
226 ToolbarItem *item = (ToolbarItem*) cur->data;
228 gtk_list_store_append(store, &iter);
230 if (item->index != A_SEPARATOR) {
232 StockPixmap icon = stock_pixmap_get_icon(item->file);
234 stock_pixbuf_gdk(prefs_toolbar->window, icon, &pix);
236 gtk_list_store_set(store, &iter,
238 SET_FILENAME, item->file,
239 SET_TEXT, item->text,
240 SET_EVENT, toolbar_ret_descr_from_val(item->index),
242 SET_ICON_IS_TEXT, FALSE,
245 gtk_list_store_set(store, &iter,
247 SET_FILENAME, toolbar_ret_descr_from_val(A_SEPARATOR),
248 SET_TEXT, (const gchar *) "",
249 SET_EVENT, toolbar_ret_descr_from_val(A_SEPARATOR),
250 SET_ICON_TEXT, (const gchar *) SEPARATOR_PIXMAP,
251 SET_ICON_IS_TEXT, TRUE,
257 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
258 gtk_tree_selection_select_iter(gtk_tree_view_get_selection
263 static void prefs_toolbar_populate(ToolbarPage *prefs_toolbar)
267 gchar *act, *act_name;
269 gtk_combo_box_append_text(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
270 _("Internal Function"));
271 gtk_combo_box_append_text(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
273 gtk_combo_box_append_text(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
276 prefs_toolbar->combo_action_list = toolbar_get_action_items(prefs_toolbar->source);
277 for(cur = prefs_toolbar->combo_action_list; cur != NULL; cur = cur->next) {
278 act = (gchar *)cur->data;
279 gtk_combo_box_append_text(GTK_COMBO_BOX(prefs_toolbar->item_func_combo),
283 /* get currently defined sylpheed actions */
284 if (prefs_common.actions_list != NULL) {
285 for (cur2 = prefs_common.actions_list; cur2 != NULL; cur2 = cur2->next) {
286 act = (gchar *)cur2->data;
287 get_action_name(act, &act_name);
289 gtk_combo_box_append_text(
290 GTK_COMBO_BOX(prefs_toolbar->item_action_combo),
298 gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo), 0);
299 gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_func_combo), 0);
300 gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_action_combo), 0);
302 prefs_toolbar_set_displayed(prefs_toolbar);
304 toolbar_clear_list(prefs_toolbar->source);
307 static gboolean is_duplicate(ToolbarPage *prefs_toolbar, gchar *chosen_action)
309 GtkTreeView *list_view_set = GTK_TREE_VIEW
310 (prefs_toolbar->list_view_set);
311 GtkTreeModel *model_set = gtk_tree_view_get_model(list_view_set);
316 g_return_val_if_fail(chosen_action != NULL, TRUE);
318 if (!gtk_tree_model_iter_n_children(model_set, NULL))
321 if (!gtk_tree_model_get_iter_first(model_set, &iter))
326 gtk_tree_model_get(model_set, &iter,
329 if (g_utf8_collate(chosen_action, entry) == 0)
332 } while (!result && gtk_tree_model_iter_next(model_set, &iter));
337 static void prefs_toolbar_default(GtkButton *button, ToolbarPage *prefs_toolbar)
339 toolbar_clear_list(prefs_toolbar->source);
340 toolbar_set_default(prefs_toolbar->source);
341 prefs_toolbar_set_displayed(prefs_toolbar);
345 *\return String that should be freed by caller.
347 static void get_action_name(const gchar *entry, gchar **menu)
353 if (prefs_common.actions_list != NULL) {
355 act = g_strdup(entry);
356 act_p = strstr(act, ": ");
359 /* freed by calling func */
364 static void prefs_toolbar_register(GtkButton *button, ToolbarPage *prefs_toolbar)
366 GtkTreeView *list_view_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
367 gint item_type = gtk_combo_box_get_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo));
368 GtkListStore *store_set;
371 store_set = GTK_LIST_STORE(gtk_tree_view_get_model(list_view_set));
373 /* SEPARATOR or other ? */
374 if (item_type == ITEM_SEPARATOR) {
375 gtk_list_store_append(store_set, &iter);
376 gtk_list_store_set(store_set, &iter,
378 SET_FILENAME, prefs_toolbar->item_icon_file,
380 SET_EVENT, toolbar_ret_descr_from_val(A_SEPARATOR),
381 SET_ICON_TEXT, (const gchar *) SEPARATOR_PIXMAP,
382 SET_ICON_IS_TEXT, TRUE,
388 stock_pixbuf_gdk(prefs_toolbar->window,
389 stock_pixmap_get_icon(prefs_toolbar->item_icon_file),
392 alertpanel_error(ERROR_MSG_NO_ICON);
396 if (item_type == ITEM_FUNCTION) {
397 event = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
398 prefs_toolbar->item_func_combo));
400 if (is_duplicate(prefs_toolbar, event)) {
401 alertpanel_error(ERROR_MSG);
406 event = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
408 text = gtk_editable_get_chars(
409 GTK_EDITABLE(prefs_toolbar->item_text_entry), 0 , -1);
412 gtk_list_store_append(store_set, &iter);
413 gtk_list_store_set(store_set, &iter,
415 SET_FILENAME, prefs_toolbar->item_icon_file,
419 SET_ICON_IS_TEXT, FALSE,
422 alertpanel_error(ERROR_MSG_NO_TEXT);
427 if(item_type != ITEM_USER_ACTION)
431 gtk_tree_selection_select_iter(gtk_tree_view_get_selection
436 static void prefs_toolbar_substitute(GtkButton *button, ToolbarPage *prefs_toolbar)
438 GtkTreeView *list_view_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
439 GtkListStore *store_set = GTK_LIST_STORE(gtk_tree_view_get_model(list_view_set));
440 gint item_type = gtk_combo_box_get_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo));
441 GtkTreeSelection *sel_set;
442 GtkTreeIter iter_set;
444 if (!gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_set), NULL))
447 sel_set = gtk_tree_view_get_selection(list_view_set);
448 if (!gtk_tree_selection_get_selected(sel_set, NULL, &iter_set))
451 if (item_type == ITEM_SEPARATOR) {
452 gtk_list_store_set(store_set, &iter_set,
455 SET_EVENT, toolbar_ret_descr_from_val(A_SEPARATOR),
456 SET_FILENAME, prefs_toolbar->item_icon_file,
457 SET_ICON_TEXT, (const gchar *) SEPARATOR_PIXMAP,
458 SET_ICON_IS_TEXT, TRUE,
462 gchar *icon_event, *set_event, *text;
464 stock_pixbuf_gdk(prefs_toolbar->window,
465 stock_pixmap_get_icon(prefs_toolbar->item_icon_file),
468 alertpanel_error(ERROR_MSG_NO_ICON);
472 gtk_tree_model_get(GTK_TREE_MODEL(store_set), &iter_set,
473 SET_EVENT, &set_event,
476 if (item_type == ITEM_FUNCTION) {
477 icon_event = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
478 prefs_toolbar->item_func_combo));
480 if (is_duplicate(prefs_toolbar, icon_event)
481 && g_utf8_collate(icon_event, set_event) != 0){
482 alertpanel_error(ERROR_MSG);
488 icon_event = toolbar_ret_descr_from_val(A_SYL_ACTIONS);
490 text = gtk_editable_get_chars(
491 GTK_EDITABLE(prefs_toolbar->item_text_entry), 0 , -1);
495 gtk_list_store_set(store_set, &iter_set,
497 SET_FILENAME, prefs_toolbar->item_icon_file,
499 SET_EVENT, icon_event,
501 SET_ICON_IS_TEXT, FALSE,
504 alertpanel_error(ERROR_MSG_NO_TEXT);
508 if(item_type != ITEM_USER_ACTION)
513 static void prefs_toolbar_delete(GtkButton *button, ToolbarPage *prefs_toolbar)
515 GtkTreeView *list_view_set = GTK_TREE_VIEW(prefs_toolbar->list_view_set);
516 GtkTreeModel *store_set = gtk_tree_view_get_model(list_view_set);
517 GtkTreeIter iter_set;
520 if (!gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_set), NULL))
523 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection
529 /* select prev list item, if deleted was first select next */
530 path = gtk_tree_model_get_path(store_set, &iter_set);
531 gtk_tree_path_prev(path);
533 gtk_list_store_remove(GTK_LIST_STORE(store_set), &iter_set);
535 gtk_tree_selection_select_path(
536 gtk_tree_view_get_selection(list_view_set),
539 gtk_tree_path_free(path);
542 static void prefs_toolbar_up(GtkButton *button, ToolbarPage *prefs_toolbar)
544 GtkTreePath *prev, *sel;
546 GtkListStore *store = NULL;
547 GtkTreeModel *model = NULL;
550 if (!gtk_tree_selection_get_selected
551 (gtk_tree_view_get_selection
552 (GTK_TREE_VIEW(prefs_toolbar->list_view_set)),
556 store = (GtkListStore *)model;
558 sel = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &isel);
562 /* no move if we're at row 0... */
563 prev = gtk_tree_path_copy(sel);
564 if (!gtk_tree_path_prev(prev)) {
565 gtk_tree_path_free(prev);
566 gtk_tree_path_free(sel);
570 gtk_tree_model_get_iter(GTK_TREE_MODEL(store),
572 gtk_tree_path_free(sel);
573 gtk_tree_path_free(prev);
575 gtk_list_store_swap(store, &iprev, &isel);
578 static void prefs_toolbar_down(GtkButton *button, ToolbarPage *prefs_toolbar)
580 GtkListStore *store = NULL;
581 GtkTreeModel *model = NULL;
582 GtkTreeIter next, sel;
584 if (!gtk_tree_selection_get_selected
585 (gtk_tree_view_get_selection
586 (GTK_TREE_VIEW(prefs_toolbar->list_view_set)),
591 store = (GtkListStore *)model;
593 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &next))
596 gtk_list_store_swap(store, &next, &sel);
599 static void item_type_changed(GtkComboBox *item_type_combo,
600 ToolbarPage *prefs_toolbar)
602 gint active = gtk_combo_box_get_active(item_type_combo);
606 gtk_widget_show(prefs_toolbar->item_func_combo);
607 gtk_widget_hide(prefs_toolbar->item_action_combo);
608 gtk_combo_box_set_active(
609 GTK_COMBO_BOX(prefs_toolbar->item_func_combo), 0);
610 gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), "");
611 gtk_widget_set_sensitive(prefs_toolbar->item_text_entry, TRUE);
612 gtk_widget_set_sensitive(prefs_toolbar->item_func_combo, TRUE);
613 gtk_widget_set_sensitive(prefs_toolbar->icon_button, TRUE);
615 func_selection_changed(GTK_COMBO_BOX(prefs_toolbar->item_func_combo),
618 case ITEM_USER_ACTION:
619 gtk_widget_show(prefs_toolbar->item_action_combo);
620 gtk_widget_hide(prefs_toolbar->item_func_combo);
621 gtk_combo_box_set_active(
622 GTK_COMBO_BOX(prefs_toolbar->item_action_combo), 0);
623 gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), "");
624 gtk_widget_set_sensitive(prefs_toolbar->item_text_entry, FALSE);
625 gtk_widget_set_sensitive(prefs_toolbar->item_action_combo, TRUE);
626 gtk_widget_set_sensitive(prefs_toolbar->icon_button, TRUE);
628 action_selection_changed(GTK_COMBO_BOX(prefs_toolbar->item_action_combo),
632 gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), _("None"));
633 gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button), NULL);
634 gtk_combo_box_set_active(
635 GTK_COMBO_BOX(prefs_toolbar->item_func_combo), -1);
636 gtk_combo_box_set_active(
637 GTK_COMBO_BOX(prefs_toolbar->item_action_combo), -1);
638 gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry), "");
639 gtk_widget_set_sensitive(prefs_toolbar->item_action_combo, FALSE);
640 gtk_widget_set_sensitive(prefs_toolbar->item_text_entry, FALSE);
641 gtk_widget_set_sensitive(prefs_toolbar->item_func_combo, FALSE);
642 gtk_widget_set_sensitive(prefs_toolbar->icon_button, FALSE);
648 static void action_selection_changed(GtkComboBox *action_combo,
649 ToolbarPage *prefs_toolbar)
651 gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
652 prefs_toolbar->item_action_combo));
654 if(text != NULL) { /* action */
655 gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry), text);
660 static void func_selection_changed(GtkComboBox *action_combo,
661 ToolbarPage *prefs_toolbar)
663 gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(
664 prefs_toolbar->item_func_combo));
666 if(text != NULL) { /* action */
668 action = toolbar_ret_val_from_descr(text);
670 gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry),
671 toolbar_get_short_text(action));
676 static void prefs_toolbar_create(ToolbarPage *prefs_toolbar)
678 GtkWidget *main_vbox;
679 GtkWidget *toolbar_item_hbox;
680 GtkWidget *icon_vbox;
681 GtkWidget *icon_label;
682 GtkWidget *icon_button;
683 GtkWidget *icon_hbox;
684 GtkWidget *item_type_combo;
685 GtkWidget *item_action_combo;
686 GtkWidget *item_func_combo;
694 GtkWidget *subst_btn;
696 GtkWidget *default_btn;
697 GtkWidget *vbox_frame;
699 GtkWidget *label_icon_text;
700 GtkWidget *item_text_entry;
701 GtkWidget *vbox_toolbar_items;
702 GtkWidget *hbox_bottom;
703 GtkWidget *scrolledwindow_list_view_set;
704 GtkWidget *list_view_set;
711 debug_print("Creating custom toolbar window...\n");
713 main_vbox = gtk_vbox_new(FALSE, 0);
714 gtk_widget_show(main_vbox);
716 vbox_frame = gtk_frame_new(_("Toolbar item"));
717 gtk_widget_show(vbox_frame);
718 gtk_box_pack_start(GTK_BOX(main_vbox), vbox_frame, FALSE, TRUE, 0);
720 toolbar_item_hbox = gtk_hbox_new (FALSE, 4);
721 gtk_widget_show(toolbar_item_hbox);
722 gtk_container_add(GTK_CONTAINER (vbox_frame), toolbar_item_hbox);
724 table = gtk_table_new (3, 3, FALSE);
725 gtk_box_pack_start(GTK_BOX(toolbar_item_hbox), table,
727 gtk_container_set_border_width (GTK_CONTAINER (table), 8);
728 gtk_table_set_row_spacings (GTK_TABLE (table), 8);
729 gtk_table_set_col_spacings (GTK_TABLE (table), 8);
731 /* toolbar item type */
732 label = gtk_label_new(_("Item type"));
733 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
734 gtk_widget_show(label);
735 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
736 (GtkAttachOptions) (GTK_FILL),
737 (GtkAttachOptions) (0), 0, 0);
739 item_type_combo = gtk_combo_box_new_text();
740 gtk_widget_set_size_request(item_type_combo, 200, -1);
741 gtk_table_attach(GTK_TABLE(table), item_type_combo, 1, 3, 0, 1,
742 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
743 (GtkAttachOptions) (0), 0, 0);
745 /* available actions */
746 label = gtk_label_new(_("Event executed on click"));
747 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
748 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
749 (GtkAttachOptions) (GTK_FILL),
750 (GtkAttachOptions) (0), 0, 0);
752 item_action_combo = gtk_combo_box_new_text();
753 gtk_widget_set_size_request(item_action_combo, 200, -1);
754 gtk_table_attach (GTK_TABLE (table), item_action_combo, 1, 3, 1, 2,
755 (GtkAttachOptions) (GTK_FILL),
756 (GtkAttachOptions) (0), 0, 0);
758 /* available internal functions */
759 item_func_combo = gtk_combo_box_new_text();
760 gtk_widget_set_size_request(item_func_combo, 200, -1);
761 gtk_table_attach (GTK_TABLE (table), item_func_combo, 1, 3, 1, 2,
762 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
763 (GtkAttachOptions) (0), 0, 0);
765 /* toolbar item description */
766 label_icon_text = gtk_label_new(_("Toolbar text"));
767 gtk_misc_set_alignment(GTK_MISC(label_icon_text), 0, 0.5);
768 gtk_widget_show (label_icon_text);
769 gtk_table_attach (GTK_TABLE (table), label_icon_text, 0, 1, 2, 3,
770 (GtkAttachOptions) (GTK_FILL),
771 (GtkAttachOptions) (0), 0, 0);
773 item_text_entry = gtk_entry_new();
774 gtk_table_attach (GTK_TABLE (table), item_text_entry, 1, 3, 2, 3,
775 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
776 (GtkAttachOptions) (0), 0, 0);
778 icon_vbox = gtk_vbox_new(FALSE, VBOX_BORDER);
779 gtk_widget_show(icon_vbox);
781 icon_label = gtk_label_new(_("Icon"));
782 gtk_widget_set_size_request(icon_label, 100, -1);
783 gtk_box_pack_start(GTK_BOX(icon_vbox), icon_label, FALSE, FALSE, 0);
785 icon_hbox = gtk_hbox_new(FALSE, 0);
786 gtk_widget_show(icon_hbox);
788 label = gtk_label_new("");
789 gtk_box_pack_start(GTK_BOX(icon_hbox), label, TRUE, TRUE, 0);
791 icon_button = gtk_button_new();
792 gtk_widget_show(icon_button);
793 gtk_widget_set_size_request(icon_button, 50, 50);
794 g_signal_connect(G_OBJECT(icon_button), "clicked",
795 G_CALLBACK(icon_chooser_create), prefs_toolbar);
796 gtk_box_pack_start(GTK_BOX(icon_hbox), icon_button, FALSE, FALSE, 8);
798 label = gtk_label_new("");
799 gtk_box_pack_start(GTK_BOX(icon_hbox), label, TRUE, TRUE, 0);
801 gtk_box_pack_start(GTK_BOX(icon_vbox), icon_hbox, FALSE, FALSE, 0);
803 gtk_box_pack_start(GTK_BOX(toolbar_item_hbox), icon_vbox, FALSE, FALSE, 0);
805 /* register / substitute / delete */
806 reg_hbox = gtk_hbox_new(FALSE, 4);
807 gtk_box_pack_start(GTK_BOX(main_vbox), reg_hbox, FALSE, FALSE, 0);
808 gtk_container_set_border_width(GTK_CONTAINER(reg_hbox), 10);
810 arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT);
811 gtk_box_pack_start(GTK_BOX(reg_hbox), arrow, FALSE, FALSE, 0);
812 gtk_widget_set_size_request(arrow, -1, 16);
814 btn_hbox = gtk_hbox_new(TRUE, 4);
815 gtk_box_pack_start(GTK_BOX(reg_hbox), btn_hbox, FALSE, FALSE, 0);
817 reg_btn = gtk_button_new_from_stock(GTK_STOCK_ADD);
818 gtk_box_pack_start(GTK_BOX(btn_hbox), reg_btn, FALSE, TRUE, 0);
819 g_signal_connect(G_OBJECT(reg_btn), "clicked",
820 G_CALLBACK(prefs_toolbar_register),
823 subst_btn = gtkut_get_replace_btn(_("Replace"));
824 gtk_box_pack_start(GTK_BOX(btn_hbox), subst_btn, FALSE, TRUE, 0);
825 g_signal_connect(G_OBJECT(subst_btn), "clicked",
826 G_CALLBACK(prefs_toolbar_substitute),
829 del_btn = gtk_button_new_from_stock(GTK_STOCK_DELETE);
830 gtk_box_pack_start(GTK_BOX(btn_hbox), del_btn, FALSE, TRUE, 0);
831 g_signal_connect(G_OBJECT(del_btn), "clicked",
832 G_CALLBACK(prefs_toolbar_delete),
835 default_btn = gtk_button_new_with_label(_(" Use default "));
837 gtk_box_pack_end(GTK_BOX(reg_hbox), default_btn, FALSE, TRUE, 0);
839 hbox = gtk_hbox_new(FALSE, 0);
840 gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, FALSE, 0);
841 gtk_box_pack_start(GTK_BOX(hbox), default_btn, FALSE, FALSE, 0);
843 g_signal_connect(G_OBJECT(default_btn), "clicked",
844 G_CALLBACK(prefs_toolbar_default),
847 /* currently active toolbar items */
848 vbox_toolbar_items = gtk_vbox_new(FALSE, VBOX_BORDER);
849 gtk_box_pack_start(GTK_BOX(main_vbox), vbox_toolbar_items, TRUE, TRUE, 0);
851 hbox_bottom = gtk_hbox_new(FALSE, 0);
852 gtk_container_add(GTK_CONTAINER(vbox_toolbar_items), hbox_bottom);
854 scrolledwindow_list_view_set = gtk_scrolled_window_new(NULL, NULL);
855 gtk_box_pack_start(GTK_BOX(hbox_bottom), scrolledwindow_list_view_set, TRUE, TRUE, 0);
856 gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow_list_view_set), 1);
857 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_set),
858 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
859 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_set),
862 list_view_set = create_set_list_view(prefs_toolbar);
863 gtk_widget_show(list_view_set);
864 gtk_container_add(GTK_CONTAINER(scrolledwindow_list_view_set), list_view_set);
865 gtk_widget_set_size_request(list_view_set, 225, 120);
867 btn_vbox = gtk_vbox_new(FALSE, 8);
868 gtk_widget_show(btn_vbox);
869 gtk_box_pack_start(GTK_BOX(hbox_bottom), btn_vbox, FALSE, FALSE, 5);
871 up_btn = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
872 gtk_widget_show(up_btn);
873 gtk_box_pack_start(GTK_BOX(btn_vbox), up_btn, FALSE, FALSE, 2);
875 down_btn = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
876 gtk_widget_show(down_btn);
877 gtk_box_pack_start(GTK_BOX(btn_vbox), down_btn, FALSE, FALSE, 0);
879 g_signal_connect(G_OBJECT(item_type_combo), "changed",
880 G_CALLBACK(item_type_changed), prefs_toolbar);
881 g_signal_connect(G_OBJECT(item_action_combo), "changed",
882 G_CALLBACK(action_selection_changed), prefs_toolbar);
883 g_signal_connect(G_OBJECT(item_func_combo), "changed",
884 G_CALLBACK(func_selection_changed), prefs_toolbar);
885 g_signal_connect(G_OBJECT(up_btn), "clicked",
886 G_CALLBACK(prefs_toolbar_up), prefs_toolbar);
887 g_signal_connect(G_OBJECT(down_btn), "clicked",
888 G_CALLBACK(prefs_toolbar_down), prefs_toolbar);
890 gtk_widget_show_all(main_vbox);
892 prefs_toolbar->list_view_set = list_view_set;
893 prefs_toolbar->item_text_entry = item_text_entry;
894 prefs_toolbar->item_type_combo = item_type_combo;
895 prefs_toolbar->item_func_combo = item_func_combo;
896 prefs_toolbar->item_action_combo= item_action_combo;
897 prefs_toolbar->icon_button = icon_button;
898 prefs_toolbar->item_icon_file = NULL;
900 prefs_toolbar->page.widget = main_vbox;
903 ToolbarPage *prefs_toolbar_mainwindow;
904 ToolbarPage *prefs_toolbar_composewindow;
905 ToolbarPage *prefs_toolbar_messageview;
907 void prefs_toolbar_init(void)
910 static gchar *mainpath[3], *messagepath[3], *composepath[3];
912 mainpath[0] = _("Customize Toolbars");
913 mainpath[1] = _("Main Window");
916 page = g_new0(ToolbarPage, 1);
917 page->page.path = mainpath;
918 page->page.create_widget = prefs_toolbar_create_widget;
919 page->page.destroy_widget = prefs_toolbar_destroy_widget;
920 page->page.save_page = prefs_toolbar_save;
921 page->source = TOOLBAR_MAIN;
922 page->page.weight = 50.0;
923 prefs_gtk_register_page((PrefsPage *) page);
924 prefs_toolbar_mainwindow = page;
926 messagepath[0] = _("Customize Toolbars");
927 messagepath[1] = _("Message Window");
928 messagepath[2] = NULL;
930 page = g_new0(ToolbarPage, 1);
931 page->page.path = messagepath;
932 page->page.create_widget = prefs_toolbar_create_widget;
933 page->page.destroy_widget = prefs_toolbar_destroy_widget;
934 page->page.save_page = prefs_toolbar_save;
935 page->source = TOOLBAR_MSGVIEW;
936 page->page.weight = 45.0;
937 prefs_gtk_register_page((PrefsPage *) page);
938 prefs_toolbar_messageview = page;
940 composepath[0] = _("Customize Toolbars");
941 composepath[1] = _("Compose Window");
942 composepath[2] = NULL;
944 page = g_new0(ToolbarPage, 1);
945 page->page.path = composepath;
946 page->page.create_widget = prefs_toolbar_create_widget;
947 page->page.destroy_widget = prefs_toolbar_destroy_widget;
948 page->page.save_page = prefs_toolbar_save;
949 page->source = TOOLBAR_COMPOSE;
950 page->page.weight = 40.0;
951 prefs_gtk_register_page((PrefsPage *) page);
952 prefs_toolbar_composewindow = page;
955 void prefs_toolbar_done(void)
957 prefs_gtk_unregister_page((PrefsPage *) prefs_toolbar_mainwindow);
958 g_free(prefs_toolbar_mainwindow->item_icon_file);
959 g_free(prefs_toolbar_mainwindow);
960 prefs_gtk_unregister_page((PrefsPage *) prefs_toolbar_composewindow);
961 g_free(prefs_toolbar_composewindow->item_icon_file);
962 g_free(prefs_toolbar_composewindow);
963 prefs_gtk_unregister_page((PrefsPage *) prefs_toolbar_messageview);
964 g_free(prefs_toolbar_messageview->item_icon_file);
965 g_free(prefs_toolbar_messageview);
968 static void set_visible_if_not_text(GtkTreeViewColumn *col,
969 GtkCellRenderer *renderer,
977 gtk_tree_model_get(model, iter, SET_ICON_IS_TEXT, &is_text, -1);
979 g_object_set(renderer, "visible", FALSE, NULL);
982 gtk_tree_model_get(model, iter,
985 /* note getting a pixbuf from a tree model increases
986 * its refcount ... */
987 g_object_unref(pixbuf);
989 g_object_set(renderer, "visible", TRUE, NULL);
990 g_object_set(renderer, "pixbuf", pixbuf, NULL);
994 static GtkWidget *create_set_list_view(ToolbarPage *prefs_toolbar)
996 GtkTreeView *list_view;
998 GtkCellRenderer *renderer;
999 GtkTreeViewColumn *column;
1000 GtkTreeSelection *selector;
1002 store = gtk_list_store_new(N_SET_COLUMNS,
1010 list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
1011 g_object_unref(G_OBJECT(store));
1013 column = gtk_tree_view_column_new();
1014 gtk_tree_view_column_set_title(column, _("Icon"));
1015 renderer = gtk_cell_renderer_pixbuf_new();
1016 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1018 /* tell pixbuf renderer it is only visible if
1019 * the icon is not represented by text */
1020 gtk_tree_view_column_set_cell_data_func(column, renderer,
1021 set_visible_if_not_text,
1024 renderer = gtk_cell_renderer_text_new();
1025 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1027 /* tell the text renderer it is only visible if the icon
1028 * is represented by an image */
1029 gtk_tree_view_column_set_attributes(column, renderer,
1030 "visible", SET_ICON_IS_TEXT,
1031 "text", SET_ICON_TEXT,
1034 gtk_tree_view_append_column(list_view, column);
1036 column = gtk_tree_view_column_new();
1037 gtk_tree_view_column_set_title(column, _("Icon text"));
1038 renderer = gtk_cell_renderer_text_new();
1039 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1040 gtk_tree_view_column_set_attributes(column, renderer,
1043 gtk_tree_view_append_column(list_view, column);
1045 column = gtk_tree_view_column_new();
1046 gtk_tree_view_column_set_title(column, _("Mapped event"));
1047 renderer = gtk_cell_renderer_text_new();
1048 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1049 gtk_tree_view_column_set_attributes(column, renderer,
1052 gtk_tree_view_append_column(list_view, column);
1054 /* various other tree view attributes */
1055 gtk_tree_view_set_rules_hint(list_view, prefs_common.use_stripes_everywhere);
1057 selector = gtk_tree_view_get_selection(list_view);
1058 gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
1059 gtk_tree_selection_set_select_function
1060 (selector, (GtkTreeSelectionFunc) set_list_selected,
1061 prefs_toolbar, NULL);
1063 return GTK_WIDGET(list_view);
1067 static gboolean set_list_selected(GtkTreeSelection *selector,
1068 GtkTreeModel *model,
1070 gboolean currently_selected,
1071 ToolbarPage *prefs_toolbar)
1075 gchar *icon_text, *icon_file, *descr;
1081 if (currently_selected || !gtk_tree_model_get_iter(model, &iter, path))
1084 gtk_tree_model_get(model, &iter,
1086 SET_TEXT, &icon_text,
1088 SET_FILENAME, &icon_file,
1091 g_free(prefs_toolbar->item_icon_file);
1092 prefs_toolbar->item_icon_file = icon_file;
1093 gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button),
1094 gtk_image_new_from_pixbuf(pix));
1096 if (g_utf8_collate(toolbar_ret_descr_from_val(A_SEPARATOR), descr) == 0) {
1097 gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button),
1099 gtk_combo_box_set_active(GTK_COMBO_BOX(prefs_toolbar->item_type_combo),
1107 gtk_button_set_label(GTK_BUTTON(prefs_toolbar->icon_button), "");
1108 gtk_entry_set_text(GTK_ENTRY(prefs_toolbar->item_text_entry),
1111 if (g_utf8_collate(toolbar_ret_descr_from_val(A_SYL_ACTIONS), descr) == 0) {
1112 gtk_combo_box_set_active(GTK_COMBO_BOX(
1113 prefs_toolbar->item_type_combo), ITEM_USER_ACTION);
1115 for(cur2 = prefs_common.actions_list, item_num = 0; cur2 != NULL;
1116 cur2 = cur2->next) {
1118 get_action_name((gchar *)cur2->data, &item_string);
1120 if(g_utf8_collate(item_string, icon_text) == 0) {
1121 gtk_combo_box_set_active(
1122 GTK_COMBO_BOX(prefs_toolbar->item_action_combo),
1124 g_free(item_string);
1129 g_free(item_string);
1139 /* scan combo list for selected description an set combo item accordingly */
1140 for (cur = prefs_toolbar->combo_action_list, item_num = 0; cur != NULL;
1142 gchar *item_str = (gchar*)cur->data;
1143 if (g_utf8_collate(item_str, descr) == 0) {
1144 gtk_combo_box_set_active(
1145 GTK_COMBO_BOX(prefs_toolbar->item_func_combo),
1154 gtk_combo_box_set_active(GTK_COMBO_BOX(
1155 prefs_toolbar->item_type_combo),ITEM_FUNCTION);
1163 static void icon_chooser_ok_clicked(GtkButton *button,
1164 ToolbarPage *prefs_toolbar)
1166 GtkTreeModel *model;
1171 g_return_if_fail(prefs_toolbar != NULL);
1173 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection
1174 (GTK_TREE_VIEW(prefs_toolbar->icon_chooser_list)),
1178 gtk_tree_model_get(model, &iter,
1180 SET_FILENAME, &icon_file,
1183 g_free(prefs_toolbar->item_icon_file);
1184 prefs_toolbar->item_icon_file = icon_file;
1186 gtk_button_set_image(GTK_BUTTON(prefs_toolbar->icon_button),
1187 gtk_image_new_from_pixbuf(pix));
1189 gtk_widget_destroy(prefs_toolbar->icon_chooser_win);
1190 prefs_toolbar->icon_chooser_win = NULL;
1191 prefs_toolbar->icon_chooser_list = NULL;
1194 static void icon_chooser_cancel_clicked(GtkButton *button,
1195 ToolbarPage *prefs_toolbar)
1197 g_return_if_fail(prefs_toolbar != NULL);
1199 gtk_widget_destroy(prefs_toolbar->icon_chooser_win);
1200 prefs_toolbar->icon_chooser_win = NULL;
1201 prefs_toolbar->icon_chooser_list = NULL;
1204 static void icon_chooser_create(GtkButton *button, ToolbarPage *prefs_toolbar)
1206 static GtkWidget *icon_chooser_win;
1208 GtkWidget *scrollwin;
1210 GtkWidget *confirm_area;
1212 GtkWidget *cancel_btn;
1213 GtkTreeView *list_view;
1214 GtkListStore *store;
1215 GtkTreeSelection *selector;
1216 GtkTreeViewColumn *column;
1217 GtkCellRenderer *renderer;
1221 store = gtk_list_store_new(2,
1226 gtk_list_store_clear(store);
1228 for (i = 0; i < STOCK_PIXMAP_EMPTY; i++) {
1230 if (i == STOCK_PIXMAP_CLAWS_MAIL_LOGO) /* that's too big */
1233 stock_pixbuf_gdk(prefs_toolbar->window, i, &pixbuf);
1235 gtk_list_store_append(store, &iter);
1236 gtk_list_store_set(store, &iter,
1238 SET_FILENAME, stock_pixmap_get_name((StockPixmap) i),
1242 icon_chooser_win = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "prefs_toolbar");
1243 gtk_window_set_title(GTK_WINDOW(icon_chooser_win), _("Toolbar item icon"));
1244 gtk_window_set_position(GTK_WINDOW(icon_chooser_win), GTK_WIN_POS_CENTER);
1245 gtk_window_set_resizable(GTK_WINDOW(icon_chooser_win), FALSE);
1246 gtk_widget_set_size_request(icon_chooser_win, 300, 250);
1248 vbox = gtk_vbox_new(FALSE, 5);
1249 gtk_widget_show(vbox);
1250 gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
1251 gtk_container_add(GTK_CONTAINER(icon_chooser_win), vbox);
1253 label = gtk_label_new(_("Choose icon:"));
1254 gtk_widget_show(label);
1255 gtk_misc_set_alignment(GTK_MISC(label), 0, -1);
1256 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
1258 scrollwin = gtk_scrolled_window_new(NULL, NULL);
1259 gtk_widget_show(scrollwin);
1260 gtk_box_pack_start(GTK_BOX(vbox), scrollwin, TRUE, TRUE, 0);
1261 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
1262 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1264 list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
1265 gtk_widget_show(GTK_WIDGET(list_view));
1267 column = gtk_tree_view_column_new();
1269 renderer = gtk_cell_renderer_pixbuf_new();
1270 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1271 gtk_tree_view_column_set_attributes(column, renderer,
1275 gtk_tree_view_append_column(list_view, column);
1277 column = gtk_tree_view_column_new();
1278 renderer = gtk_cell_renderer_text_new();
1279 gtk_tree_view_column_pack_start(column, renderer, TRUE);
1280 gtk_tree_view_column_set_attributes(column, renderer,
1281 "text", SET_FILENAME,
1284 gtk_tree_view_append_column(list_view, column);
1286 gtk_tree_view_set_rules_hint(list_view, prefs_common.use_stripes_everywhere);
1287 gtk_tree_view_set_headers_visible(list_view, FALSE);
1289 selector = gtk_tree_view_get_selection(list_view);
1290 gtk_tree_selection_set_mode(selector, GTK_SELECTION_SINGLE);
1292 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
1293 gtk_tree_selection_select_iter(gtk_tree_view_get_selection
1294 (list_view), &iter);
1295 gtk_container_add(GTK_CONTAINER(scrollwin), GTK_WIDGET(list_view));
1297 gtkut_stock_button_set_create(&confirm_area, &cancel_btn, GTK_STOCK_CANCEL,
1298 &ok_btn, GTK_STOCK_OK, NULL, NULL);
1300 gtk_box_pack_start(GTK_BOX(vbox), confirm_area, FALSE, FALSE, 0);
1301 gtk_widget_show(confirm_area);
1302 gtk_widget_grab_default(ok_btn);
1304 g_signal_connect(G_OBJECT(ok_btn), "clicked",
1305 G_CALLBACK(icon_chooser_ok_clicked), prefs_toolbar);
1306 g_signal_connect(G_OBJECT(cancel_btn), "clicked",
1307 G_CALLBACK(icon_chooser_cancel_clicked), prefs_toolbar);
1309 gtk_widget_show_all(icon_chooser_win);
1310 gtk_window_set_modal(GTK_WINDOW(icon_chooser_win), TRUE);
1312 prefs_toolbar->icon_chooser_win = icon_chooser_win;
1313 prefs_toolbar->icon_chooser_list = GTK_WIDGET(list_view);