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 2 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, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
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 */
63 typedef struct _ToolbarPage
67 GtkWidget
*window
; /* do not modify */
69 GtkWidget
*list_view_icons
;
70 GtkWidget
*list_view_set
;
71 GtkWidget
*combo_action
;
72 GtkWidget
*combo_entry
;
73 GtkWidget
*combo_list
;
74 GtkWidget
*label_icon_text
;
75 GtkWidget
*label_action_sel
;
76 GtkWidget
*entry_icon_text
;
77 GtkWidget
*combo_syl_action
;
78 GtkWidget
*combo_syl_list
;
79 GtkWidget
*combo_syl_entry
;
82 GList
*combo_action_list
;
86 #define ERROR_MSG _("Selected Action already set.\nPlease choose another Action from List")
88 static void prefs_toolbar_populate (ToolbarPage
*prefs_toolbar
);
89 static gboolean
is_duplicate (ToolbarPage
*prefs_toolbar
,
90 gchar
*chosen_action
);
91 static void prefs_toolbar_save (PrefsPage
*_page
);
93 static void prefs_toolbar_register (GtkButton
*button
,
94 ToolbarPage
*prefs_toolbar
);
95 static void prefs_toolbar_substitute (GtkButton
*button
,
96 ToolbarPage
*prefs_toolbar
);
97 static void prefs_toolbar_delete (GtkButton
*button
,
98 ToolbarPage
*prefs_toolbar
);
100 static void prefs_toolbar_up (GtkButton
*button
,
101 ToolbarPage
*prefs_toolbar
);
103 static void prefs_toolbar_down (GtkButton
*button
,
104 ToolbarPage
*prefs_toolbar
);
106 static void prefs_toolbar_create (ToolbarPage
*prefs_toolbar
);
108 static void prefs_toolbar_selection_changed (GtkList
*list
,
109 ToolbarPage
*prefs_toolbar
);
111 static GtkWidget
*create_icon_list_view (ToolbarPage
*prefs_toolbar
);
113 static GtkWidget
*create_set_list_view (ToolbarPage
*prefs_toolbar
);
115 static gboolean
icon_list_selected (GtkTreeSelection
*selector
,
118 gboolean currently_selected
,
119 ToolbarPage
*prefs_toolbar
);
121 static gboolean
set_list_selected (GtkTreeSelection
*selector
,
124 gboolean currently_selected
,
125 ToolbarPage
*prefs_toolbar
);
127 static void prefs_toolbar_create_widget(PrefsPage
*_page
, GtkWindow
*window
, gpointer data
)
129 ToolbarPage
*prefs_toolbar
= (ToolbarPage
*) _page
;
130 gchar
*win_titles
[3];
131 win_titles
[TOOLBAR_MAIN
] = _("Main toolbar configuration");
132 win_titles
[TOOLBAR_COMPOSE
] = _("Compose toolbar configuration");
133 win_titles
[TOOLBAR_MSGVIEW
] = _("Message view toolbar configuration");
135 prefs_toolbar
->window
= GTK_WIDGET(window
);
137 toolbar_read_config_file(prefs_toolbar
->source
);
139 prefs_toolbar_create(prefs_toolbar
);
140 prefs_toolbar_populate(prefs_toolbar
);
143 static void prefs_toolbar_save(PrefsPage
*_page
)
145 ToolbarPage
*prefs_toolbar
= (ToolbarPage
*) _page
;
146 GtkTreeView
*list_view
= GTK_TREE_VIEW(prefs_toolbar
->list_view_set
);
147 GtkTreeModel
*model
= gtk_tree_view_get_model(list_view
);
150 toolbar_clear_list(prefs_toolbar
->source
);
152 if (!gtk_tree_model_iter_n_children(model
, NULL
)
153 || !gtk_tree_model_get_iter_first(model
, &iter
))
154 toolbar_set_default(prefs_toolbar
->source
);
158 gchar
*fname
, *text
, *event
;
160 item
= g_new0(ToolbarItem
, 1);
162 gtk_tree_model_get(model
, &iter
,
163 SET_FILENAME
, &fname
,
168 /* XXX: remember that G_TYPE_STRING returned by model
169 * is owned by caller of gtk_tree_model_get() */
172 item
->index
= toolbar_ret_val_from_descr(event
);
175 /* TODO: save A_SYL_ACTIONS only if they are still active */
176 toolbar_set_list_item(item
, prefs_toolbar
->source
);
181 } while (gtk_tree_model_iter_next(model
, &iter
));
184 toolbar_save_config_file(prefs_toolbar
->source
);
186 if (prefs_toolbar
->source
== TOOLBAR_MAIN
)
187 main_window_reflect_prefs_all_real(TRUE
);
188 else if (prefs_toolbar
->source
== TOOLBAR_COMPOSE
)
189 compose_reflect_prefs_pixmap_theme();
190 else if (prefs_toolbar
->source
== TOOLBAR_MSGVIEW
)
191 messageview_reflect_prefs_pixmap_theme();
194 static void prefs_toolbar_destroy_widget(PrefsPage
*_page
)
196 ToolbarPage
*prefs_toolbar
= (ToolbarPage
*) _page
;
198 g_list_free(prefs_toolbar
->combo_action_list
);
199 prefs_toolbar
->combo_action_list
= NULL
;
202 static void prefs_toolbar_set_displayed(ToolbarPage
*prefs_toolbar
)
205 GtkTreeView
*list_view_set
= GTK_TREE_VIEW(prefs_toolbar
->list_view_set
);
206 GtkListStore
*store
= GTK_LIST_STORE(gtk_tree_view_get_model
208 GSList
*toolbar_list
= toolbar_get_list(prefs_toolbar
->source
);
211 gtk_list_store_clear(store
);
213 /* set currently active toolbar entries */
214 for (cur
= toolbar_list
; cur
!= NULL
; cur
= cur
->next
) {
215 ToolbarItem
*item
= (ToolbarItem
*) cur
->data
;
217 gtk_list_store_append(store
, &iter
);
219 if (item
->index
!= A_SEPARATOR
) {
221 StockPixmap icon
= stock_pixmap_get_icon(item
->file
);
223 stock_pixbuf_gdk(prefs_toolbar
->window
, icon
, &pix
);
225 gtk_list_store_set(store
, &iter
,
227 SET_FILENAME
, item
->file
,
228 SET_TEXT
, item
->text
,
229 SET_EVENT
, toolbar_ret_descr_from_val(item
->index
),
231 SET_ICON_IS_TEXT
, FALSE
,
234 gtk_list_store_set(store
, &iter
,
236 SET_FILENAME
, toolbar_ret_descr_from_val(A_SEPARATOR
),
237 SET_TEXT
, (const gchar
*) "",
238 SET_EVENT
, toolbar_ret_descr_from_val(A_SEPARATOR
),
239 SET_ICON_TEXT
, (const gchar
*) SEPARATOR_PIXMAP
,
240 SET_ICON_IS_TEXT
, TRUE
,
246 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store
), &iter
);
247 gtk_tree_selection_select_iter(gtk_tree_view_get_selection
252 static void prefs_toolbar_populate(ToolbarPage
*prefs_toolbar
)
256 GList
*syl_actions
= NULL
;
257 GtkTreeView
*list_view_icons
= GTK_TREE_VIEW
258 (prefs_toolbar
->list_view_icons
);
259 GtkListStore
*store
= GTK_LIST_STORE(gtk_tree_view_get_model
264 gtk_list_store_clear(store
);
266 /* set available icons */
267 gtk_list_store_append(store
, &iter
);
268 gtk_list_store_set(store
, &iter
,
270 SET_ICON_TEXT
, SEPARATOR_PIXMAP
,
271 SET_ICON_IS_TEXT
, TRUE
,
272 SET_FILENAME
, toolbar_ret_descr_from_val(A_SEPARATOR
),
275 prefs_toolbar
->combo_action_list
= toolbar_get_action_items(prefs_toolbar
->source
);
276 gtk_combo_set_popdown_strings(GTK_COMBO(prefs_toolbar
->combo_action
),
277 prefs_toolbar
->combo_action_list
);
278 gtk_combo_set_value_in_list(GTK_COMBO(prefs_toolbar
->combo_action
), 0, FALSE
);
279 gtk_entry_set_text(GTK_ENTRY(prefs_toolbar
->combo_entry
), prefs_toolbar
->combo_action_list
->data
);
281 /* get currently defined sylpheed actions */
282 if (prefs_common
.actions_list
!= NULL
) {
284 for (cur
= prefs_common
.actions_list
; cur
!= NULL
; cur
= cur
->next
) {
285 act
= (gchar
*)cur
->data
;
286 syl_actions
= g_list_append(syl_actions
, act
);
289 gtk_combo_set_popdown_strings(GTK_COMBO(prefs_toolbar
->combo_syl_action
), syl_actions
);
290 gtk_combo_set_value_in_list(GTK_COMBO(prefs_toolbar
->combo_syl_action
), 0, FALSE
);
291 gtk_entry_set_text(GTK_ENTRY(prefs_toolbar
->combo_syl_entry
), syl_actions
->data
);
292 prefs_toolbar_selection_changed(GTK_LIST(prefs_toolbar
->combo_syl_list
), prefs_toolbar
);
293 g_list_free(syl_actions
);
296 for (i
= 0; i
< STOCK_PIXMAP_EMPTY
; i
++) {
298 if (i
== STOCK_PIXMAP_CLAWS_MAIL_LOGO
)
299 continue;/* that's too big */
301 stock_pixbuf_gdk(prefs_toolbar
->window
, i
, &pixbuf
);
303 gtk_list_store_append(store
, &iter
);
304 gtk_list_store_set(store
, &iter
,
306 SET_FILENAME
, stock_pixmap_get_name((StockPixmap
) i
),
308 SET_ICON_IS_TEXT
, FALSE
,
312 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store
), &iter
);
313 gtk_tree_selection_select_iter(gtk_tree_view_get_selection
317 prefs_toolbar_set_displayed(prefs_toolbar
);
319 toolbar_clear_list(prefs_toolbar
->source
);
322 static gboolean
is_duplicate(ToolbarPage
*prefs_toolbar
, gchar
*chosen_action
)
324 GtkTreeView
*list_view_set
= GTK_TREE_VIEW
325 (prefs_toolbar
->list_view_set
);
326 GtkTreeModel
*model_set
= gtk_tree_view_get_model(list_view_set
);
328 gchar
*syl_act
= toolbar_ret_descr_from_val(A_SYL_ACTIONS
);
332 g_return_val_if_fail(chosen_action
!= NULL
, TRUE
);
334 if (!gtk_tree_model_iter_n_children(model_set
, NULL
))
337 /* allow duplicate entries (A_SYL_ACTIONS) */
338 if (g_utf8_collate(syl_act
, chosen_action
) == 0)
341 if (!gtk_tree_model_get_iter_first(model_set
, &iter
))
346 gtk_tree_model_get(model_set
, &iter
,
349 if (g_utf8_collate(chosen_action
, entry
) == 0)
352 } while (!result
&& gtk_tree_model_iter_next(model_set
, &iter
));
357 static void prefs_toolbar_default(GtkButton
*button
, ToolbarPage
*prefs_toolbar
)
359 toolbar_clear_list(prefs_toolbar
->source
);
360 toolbar_set_default(prefs_toolbar
->source
);
361 prefs_toolbar_set_displayed(prefs_toolbar
);
365 *\return String that should be freed by caller.
367 static void get_action_name(const gchar
*entry
, gchar
**menu
)
371 if (prefs_common
.actions_list
!= NULL
) {
373 act
= g_strdup(entry
);
374 act_p
= strstr(act
, ": ");
377 /* freed by calling func */
382 static void prefs_toolbar_register(GtkButton
*button
, ToolbarPage
*prefs_toolbar
)
384 GtkTreeView
*list_view_set
= GTK_TREE_VIEW(prefs_toolbar
->list_view_set
);
385 GtkTreeView
*list_view_icons
= GTK_TREE_VIEW(prefs_toolbar
->list_view_icons
);
386 GtkTreeModel
*model_icons
= gtk_tree_view_get_model(list_view_icons
);
387 gchar
*syl_act
= toolbar_ret_descr_from_val(A_SYL_ACTIONS
);
388 GtkListStore
*store_set
;
392 /* move selection in icon list view to set list view */
394 if (!gtk_tree_model_iter_n_children(model_icons
, NULL
))
397 if (!gtk_tree_selection_get_selected
398 (gtk_tree_view_get_selection(list_view_icons
),
402 gtk_tree_model_get(model_icons
, &iter
,
403 SET_FILENAME
, &fname
,
406 store_set
= GTK_LIST_STORE(gtk_tree_view_get_model(list_view_set
));
408 /* SEPARATOR or other ? */
409 if (g_utf8_collate(fname
, toolbar_ret_descr_from_val(A_SEPARATOR
)) == 0) {
410 gtk_list_store_append(store_set
, &iter
);
411 gtk_list_store_set(store_set
, &iter
,
413 SET_FILENAME
, toolbar_ret_descr_from_val(A_SEPARATOR
),
415 SET_EVENT
, toolbar_ret_descr_from_val(A_SEPARATOR
),
416 SET_ICON_TEXT
, (const gchar
*) SEPARATOR_PIXMAP
,
417 SET_ICON_IS_TEXT
, TRUE
,
423 event
= g_strdup(gtk_entry_get_text
424 (GTK_ENTRY(prefs_toolbar
->combo_entry
)));
426 if (is_duplicate(prefs_toolbar
, event
)) {
427 alertpanel_error(ERROR_MSG
);
433 stock_pixbuf_gdk(prefs_toolbar
->window
,
434 stock_pixmap_get_icon(fname
),
437 if (g_utf8_collate(event
, syl_act
) == 0) {
438 const gchar
*entry
= gtk_entry_get_text(GTK_ENTRY(prefs_toolbar
->combo_syl_entry
));
439 get_action_name(entry
, &text
);
441 text
= gtk_editable_get_chars
442 (GTK_EDITABLE(prefs_toolbar
->entry_icon_text
), 0, -1);
444 gtk_list_store_append(store_set
, &iter
);
445 gtk_list_store_set(store_set
, &iter
,
451 SET_ICON_IS_TEXT
, FALSE
,
459 gtk_tree_selection_select_iter(gtk_tree_view_get_selection
464 static void prefs_toolbar_substitute(GtkButton
*button
, ToolbarPage
*prefs_toolbar
)
466 GtkTreeView
*list_view_set
= GTK_TREE_VIEW(prefs_toolbar
->list_view_set
);
467 GtkTreeView
*list_view_icons
= GTK_TREE_VIEW(prefs_toolbar
->list_view_icons
);
468 GtkTreeModel
*model_icons
= gtk_tree_view_get_model(list_view_icons
);
469 GtkListStore
*store_set
= GTK_LIST_STORE(gtk_tree_view_get_model(list_view_set
));
470 gchar
*syl_act
= toolbar_ret_descr_from_val(A_SYL_ACTIONS
);
471 GtkTreeSelection
*sel_icons
;
472 GtkTreeSelection
*sel_set
;
473 GtkTreeIter iter_icons
;
474 GtkTreeIter iter_set
;
477 /* replace selection in set list with the one in icon list */
479 if (!gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_set
), NULL
))
482 sel_icons
= gtk_tree_view_get_selection(list_view_icons
);
483 if (!gtk_tree_selection_get_selected(sel_icons
, NULL
, &iter_icons
))
486 sel_set
= gtk_tree_view_get_selection(list_view_set
);
487 if (!gtk_tree_selection_get_selected(sel_set
, NULL
, &iter_set
))
490 gtk_tree_model_get(model_icons
, &iter_icons
,
491 SET_FILENAME
, &icon_fname
,
494 if (g_utf8_collate(icon_fname
, toolbar_ret_descr_from_val(A_SEPARATOR
)) == 0) {
495 gtk_list_store_set(store_set
, &iter_set
,
498 SET_EVENT
, toolbar_ret_descr_from_val(A_SEPARATOR
),
499 SET_FILENAME
, icon_fname
,
500 SET_ICON_TEXT
, (const gchar
*) SEPARATOR_PIXMAP
,
501 SET_ICON_IS_TEXT
, TRUE
,
505 gchar
*icon_event
, *set_event
, *text
;
507 icon_event
= gtk_editable_get_chars
508 (GTK_EDITABLE(prefs_toolbar
->combo_entry
),
511 gtk_tree_model_get(GTK_TREE_MODEL(store_set
), &iter_set
,
512 SET_EVENT
, &set_event
,
515 if (is_duplicate(prefs_toolbar
, icon_event
)
516 && g_utf8_collate(icon_event
, set_event
) != 0){
517 alertpanel_error(ERROR_MSG
);
524 stock_pixbuf_gdk(prefs_toolbar
->window
,
525 stock_pixmap_get_icon(icon_fname
),
528 if (g_utf8_collate(icon_event
, syl_act
) == 0) {
529 const gchar
*entry
= gtk_entry_get_text(GTK_ENTRY(prefs_toolbar
->combo_syl_entry
));
530 get_action_name(entry
, &text
);
532 text
= gtk_editable_get_chars(GTK_EDITABLE(prefs_toolbar
->entry_icon_text
),
537 gtk_list_store_set(store_set
, &iter_set
,
539 SET_FILENAME
, icon_fname
,
541 SET_EVENT
, icon_event
,
543 SET_ICON_IS_TEXT
, FALSE
,
554 static void prefs_toolbar_delete(GtkButton
*button
, ToolbarPage
*prefs_toolbar
)
556 GtkTreeView
*list_view_set
= GTK_TREE_VIEW(prefs_toolbar
->list_view_set
);
557 GtkListStore
*store_set
= GTK_LIST_STORE(gtk_tree_view_get_model
559 GtkTreeIter iter_set
;
561 if (!gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_set
), NULL
))
564 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection
570 gtk_list_store_remove(store_set
, &iter_set
);
572 /* XXX: may need to select a list item */
575 static void prefs_toolbar_up(GtkButton
*button
, ToolbarPage
*prefs_toolbar
)
577 GtkTreePath
*prev
, *sel
;
579 GtkListStore
*store
= NULL
;
580 GtkTreeModel
*model
= NULL
;
583 if (!gtk_tree_selection_get_selected
584 (gtk_tree_view_get_selection
585 (GTK_TREE_VIEW(prefs_toolbar
->list_view_set
)),
589 store
= (GtkListStore
*)model
;
591 sel
= gtk_tree_model_get_path(GTK_TREE_MODEL(store
), &isel
);
595 /* no move if we're at row 0... */
596 prev
= gtk_tree_path_copy(sel
);
597 if (!gtk_tree_path_prev(prev
)) {
598 gtk_tree_path_free(prev
);
599 gtk_tree_path_free(sel
);
603 gtk_tree_model_get_iter(GTK_TREE_MODEL(store
),
605 gtk_tree_path_free(sel
);
606 gtk_tree_path_free(prev
);
608 gtk_list_store_swap(store
, &iprev
, &isel
);
611 static void prefs_toolbar_down(GtkButton
*button
, ToolbarPage
*prefs_toolbar
)
613 GtkListStore
*store
= NULL
;
614 GtkTreeModel
*model
= NULL
;
615 GtkTreeIter next
, sel
;
617 if (!gtk_tree_selection_get_selected
618 (gtk_tree_view_get_selection
619 (GTK_TREE_VIEW(prefs_toolbar
->list_view_set
)),
624 store
= (GtkListStore
*)model
;
626 if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(store
), &next
))
629 gtk_list_store_swap(store
, &next
, &sel
);
632 static void prefs_toolbar_selection_changed(GtkList
*list
,
633 ToolbarPage
*prefs_toolbar
)
635 gchar
*cur_entry
= g_strdup(gtk_entry_get_text(GTK_ENTRY(prefs_toolbar
->combo_entry
)));
636 gchar
*actions_entry
= toolbar_ret_descr_from_val(A_SYL_ACTIONS
);
638 gtk_widget_set_sensitive(prefs_toolbar
->combo_syl_action
, TRUE
);
640 if (g_utf8_collate(cur_entry
, actions_entry
) == 0) {
641 gtk_widget_hide(prefs_toolbar
->entry_icon_text
);
642 gtk_widget_show(prefs_toolbar
->combo_syl_action
);
643 gtk_label_set_text(GTK_LABEL(prefs_toolbar
->label_icon_text
), _("Claws Mail Action"));
645 if (prefs_common
.actions_list
== NULL
) {
646 gtk_widget_set_sensitive(prefs_toolbar
->combo_syl_action
, FALSE
);
650 gtk_widget_hide(prefs_toolbar
->combo_syl_action
);
651 gtk_widget_show(prefs_toolbar
->entry_icon_text
);
652 gtk_label_set_text(GTK_LABEL(prefs_toolbar
->label_icon_text
), _("Toolbar text"));
655 gtk_misc_set_alignment(GTK_MISC(prefs_toolbar
->label_icon_text
), 1, 0.5);
656 gtk_widget_show(prefs_toolbar
->label_icon_text
);
660 static void prefs_toolbar_create(ToolbarPage
*prefs_toolbar
)
662 GtkWidget
*main_vbox
;
664 GtkWidget
*compose_frame
;
672 GtkWidget
*subst_btn
;
674 GtkWidget
*default_btn
;
675 GtkWidget
*vbox_frame
;
677 GtkWidget
*scrolledwindow_list_view_icons
;
678 GtkWidget
*list_view_icons
;
679 GtkWidget
*label_icon_text
;
680 GtkWidget
*entry_icon_text
;
681 GtkWidget
*label_action_sel
;
682 GtkWidget
*combo_action
;
683 GtkWidget
*combo_entry
;
684 GtkWidget
*combo_list
;
685 GtkWidget
*combo_syl_action
;
686 GtkWidget
*combo_syl_entry
;
687 GtkWidget
*combo_syl_list
;
688 GtkWidget
*frame_toolbar_items
;
689 GtkWidget
*hbox_bottom
;
690 GtkWidget
*scrolledwindow_list_view_set
;
691 GtkWidget
*list_view_set
;
697 debug_print("Creating custom toolbar window...\n");
699 main_vbox
= gtk_vbox_new(FALSE
, 0);
700 gtk_widget_show(main_vbox
);
702 top_hbox
= gtk_hbox_new(FALSE
, 0);
703 gtk_box_pack_start(GTK_BOX(main_vbox
), top_hbox
, TRUE
, TRUE
, 0);
705 compose_frame
= gtk_frame_new(_("Available toolbar icons"));
706 gtk_box_pack_start(GTK_BOX(top_hbox
), compose_frame
, TRUE
, TRUE
, 0);
707 gtk_container_set_border_width(GTK_CONTAINER(compose_frame
), 5);
709 vbox_frame
= gtk_vbox_new(FALSE
, 0);
710 gtk_container_add(GTK_CONTAINER(compose_frame
), vbox_frame
);
712 /* available icons */
713 scrolledwindow_list_view_icons
= gtk_scrolled_window_new(NULL
, NULL
);
714 gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow_list_view_icons
), 5);
715 gtk_box_pack_start(GTK_BOX(vbox_frame
), scrolledwindow_list_view_icons
,
717 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_icons
),
718 GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
719 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_icons
),
722 list_view_icons
= create_icon_list_view(prefs_toolbar
);
723 gtk_widget_show(list_view_icons
);
724 gtk_container_add(GTK_CONTAINER(scrolledwindow_list_view_icons
), list_view_icons
);
725 gtk_container_set_border_width(GTK_CONTAINER(list_view_icons
), 1);
726 gtk_widget_set_size_request(list_view_icons
, 225, 108);
728 table
= gtk_table_new (2, 3, FALSE
);
729 gtk_box_pack_start(GTK_BOX(vbox_frame
), table
,
731 gtk_container_set_border_width (GTK_CONTAINER (table
), 8);
732 gtk_table_set_row_spacings (GTK_TABLE (table
), 8);
733 gtk_table_set_col_spacings (GTK_TABLE (table
), 8);
735 /* icon description */
736 label_icon_text
= gtk_label_new("");
737 gtk_misc_set_alignment(GTK_MISC(label_icon_text
), 0, 0.5);
738 gtk_widget_show (label_icon_text
);
739 gtk_table_attach (GTK_TABLE (table
), label_icon_text
, 0, 1, 0, 1,
740 (GtkAttachOptions
) (GTK_FILL
),
741 (GtkAttachOptions
) (0), 0, 0);
743 entry_icon_text
= gtk_entry_new();
744 gtk_table_attach (GTK_TABLE (table
), entry_icon_text
, 1, 3, 0, 1,
745 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
746 (GtkAttachOptions
) (0), 0, 0);
748 /* Sylpheed Action Combo Box */
749 combo_syl_action
= gtk_combo_new();
750 combo_syl_list
= GTK_COMBO(combo_syl_action
)->list
;
751 combo_syl_entry
= GTK_COMBO(combo_syl_action
)->entry
;
752 gtk_entry_set_editable(GTK_ENTRY(combo_syl_entry
), FALSE
);
753 gtk_table_attach (GTK_TABLE (table
), combo_syl_action
, 1, 3, 0, 1,
754 (GtkAttachOptions
) (GTK_EXPAND
| GTK_FILL
),
755 (GtkAttachOptions
) (0), 0, 0);
757 /* available actions */
758 label_action_sel
= gtk_label_new(_("Event executed on click"));
759 gtk_misc_set_alignment(GTK_MISC(label_action_sel
), 0, 0.5);
760 gtk_table_attach (GTK_TABLE (table
), label_action_sel
, 0, 1, 1, 2,
761 (GtkAttachOptions
) (GTK_FILL
),
762 (GtkAttachOptions
) (0), 0, 0);
764 combo_action
= gtk_combo_new();
765 gtk_table_attach (GTK_TABLE (table
), combo_action
, 1, 3, 1, 2,
766 (GtkAttachOptions
) (GTK_FILL
),
767 (GtkAttachOptions
) (0), 0, 0);
769 combo_list
= GTK_COMBO(combo_action
)->list
;
770 combo_entry
= GTK_COMBO(combo_action
)->entry
;
771 gtk_entry_set_editable(GTK_ENTRY(combo_entry
), FALSE
);
773 /* register / substitute / delete */
774 reg_hbox
= gtk_hbox_new(FALSE
, 4);
775 gtk_box_pack_start(GTK_BOX(main_vbox
), reg_hbox
, FALSE
, FALSE
, 0);
776 gtk_container_set_border_width(GTK_CONTAINER(reg_hbox
), 10);
778 arrow
= gtk_arrow_new(GTK_ARROW_DOWN
, GTK_SHADOW_OUT
);
779 gtk_box_pack_start(GTK_BOX(reg_hbox
), arrow
, FALSE
, FALSE
, 0);
780 gtk_widget_set_size_request(arrow
, -1, 16);
782 btn_hbox
= gtk_hbox_new(TRUE
, 4);
783 gtk_box_pack_start(GTK_BOX(reg_hbox
), btn_hbox
, FALSE
, FALSE
, 0);
785 reg_btn
= gtk_button_new_from_stock(GTK_STOCK_ADD
);
786 gtk_box_pack_start(GTK_BOX(btn_hbox
), reg_btn
, FALSE
, TRUE
, 0);
787 g_signal_connect(G_OBJECT(reg_btn
), "clicked",
788 G_CALLBACK(prefs_toolbar_register
),
791 subst_btn
= gtkut_get_replace_btn(_("Replace"));
792 gtk_box_pack_start(GTK_BOX(btn_hbox
), subst_btn
, FALSE
, TRUE
, 0);
793 g_signal_connect(G_OBJECT(subst_btn
), "clicked",
794 G_CALLBACK(prefs_toolbar_substitute
),
797 del_btn
= gtk_button_new_from_stock(GTK_STOCK_DELETE
);
798 gtk_box_pack_start(GTK_BOX(btn_hbox
), del_btn
, FALSE
, TRUE
, 0);
799 g_signal_connect(G_OBJECT(del_btn
), "clicked",
800 G_CALLBACK(prefs_toolbar_delete
),
803 default_btn
= gtk_button_new_with_label(_(" Use default "));
805 gtk_box_pack_end(GTK_BOX(reg_hbox
), default_btn
, FALSE
, TRUE
, 0);
807 hbox
= gtk_hbox_new(FALSE
, 0);
808 gtk_box_pack_start(GTK_BOX(main_vbox
), hbox
, FALSE
, FALSE
, 0);
809 gtk_box_pack_start(GTK_BOX(hbox
), default_btn
, FALSE
, FALSE
, 0);
811 g_signal_connect(G_OBJECT(default_btn
), "clicked",
812 G_CALLBACK(prefs_toolbar_default
),
815 /* currently active toolbar items */
816 frame_toolbar_items
= gtk_frame_new(_("Displayed toolbar items"));
817 gtk_box_pack_start(GTK_BOX(main_vbox
), frame_toolbar_items
, TRUE
, TRUE
, 0);
818 gtk_container_set_border_width(GTK_CONTAINER(frame_toolbar_items
), 5);
820 hbox_bottom
= gtk_hbox_new(FALSE
, 0);
821 gtk_container_add(GTK_CONTAINER(frame_toolbar_items
), hbox_bottom
);
823 scrolledwindow_list_view_set
= gtk_scrolled_window_new(NULL
, NULL
);
824 gtk_box_pack_start(GTK_BOX(hbox_bottom
), scrolledwindow_list_view_set
, TRUE
, TRUE
, 0);
825 gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow_list_view_set
), 1);
826 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_set
),
827 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
828 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow_list_view_set
),
831 list_view_set
= create_set_list_view(prefs_toolbar
);
832 gtk_widget_show(list_view_set
);
833 gtk_container_add(GTK_CONTAINER(scrolledwindow_list_view_set
), list_view_set
);
834 gtk_widget_set_size_request(list_view_set
, 225, 120);
836 btn_vbox
= gtk_vbox_new(FALSE
, 8);
837 gtk_widget_show(btn_vbox
);
838 gtk_box_pack_start(GTK_BOX(hbox_bottom
), btn_vbox
, FALSE
, FALSE
, 5);
840 up_btn
= gtk_button_new_from_stock(GTK_STOCK_GO_UP
);
841 gtk_widget_show(up_btn
);
842 gtk_box_pack_start(GTK_BOX(btn_vbox
), up_btn
, FALSE
, FALSE
, 2);
844 down_btn
= gtk_button_new_from_stock(GTK_STOCK_GO_DOWN
);
845 gtk_widget_show(down_btn
);
846 gtk_box_pack_start(GTK_BOX(btn_vbox
), down_btn
, FALSE
, FALSE
, 0);
848 g_signal_connect(G_OBJECT(combo_list
), "selection-changed",
849 G_CALLBACK(prefs_toolbar_selection_changed
),
851 g_signal_connect(G_OBJECT(up_btn
), "clicked",
852 G_CALLBACK(prefs_toolbar_up
), prefs_toolbar
);
853 g_signal_connect(G_OBJECT(down_btn
), "clicked",
854 G_CALLBACK(prefs_toolbar_down
), prefs_toolbar
);
856 gtk_widget_show_all(main_vbox
);
858 prefs_toolbar
->list_view_icons
= list_view_icons
;
859 prefs_toolbar
->list_view_set
= list_view_set
;
860 prefs_toolbar
->combo_action
= combo_action
;
861 prefs_toolbar
->combo_entry
= combo_entry
;
862 prefs_toolbar
->combo_list
= combo_list
;
863 prefs_toolbar
->entry_icon_text
= entry_icon_text
;
864 prefs_toolbar
->combo_syl_action
= combo_syl_action
;
865 prefs_toolbar
->combo_syl_list
= combo_syl_list
;
866 prefs_toolbar
->combo_syl_entry
= combo_syl_entry
;
868 prefs_toolbar
->label_icon_text
= label_icon_text
;
869 prefs_toolbar
->label_action_sel
= label_action_sel
;
871 prefs_toolbar
->page
.widget
= main_vbox
;
874 ToolbarPage
*prefs_toolbar_mainwindow
;
875 ToolbarPage
*prefs_toolbar_composewindow
;
876 ToolbarPage
*prefs_toolbar_messageview
;
878 void prefs_toolbar_init(void)
881 static gchar
*mainpath
[3], *messagepath
[3], *composepath
[3];
883 mainpath
[0] = _("Customize Toolbars");
884 mainpath
[1] = _("Main Window");
887 page
= g_new0(ToolbarPage
, 1);
888 page
->page
.path
= mainpath
;
889 page
->page
.create_widget
= prefs_toolbar_create_widget
;
890 page
->page
.destroy_widget
= prefs_toolbar_destroy_widget
;
891 page
->page
.save_page
= prefs_toolbar_save
;
892 page
->source
= TOOLBAR_MAIN
;
893 page
->page
.weight
= 50.0;
894 prefs_gtk_register_page((PrefsPage
*) page
);
895 prefs_toolbar_mainwindow
= page
;
897 messagepath
[0] = _("Customize Toolbars");
898 messagepath
[1] = _("Message Window");
899 messagepath
[2] = NULL
;
901 page
= g_new0(ToolbarPage
, 1);
902 page
->page
.path
= messagepath
;
903 page
->page
.create_widget
= prefs_toolbar_create_widget
;
904 page
->page
.destroy_widget
= prefs_toolbar_destroy_widget
;
905 page
->page
.save_page
= prefs_toolbar_save
;
906 page
->source
= TOOLBAR_MSGVIEW
;
907 page
->page
.weight
= 45.0;
908 prefs_gtk_register_page((PrefsPage
*) page
);
909 prefs_toolbar_messageview
= page
;
911 composepath
[0] = _("Customize Toolbars");
912 composepath
[1] = _("Compose Window");
913 composepath
[2] = NULL
;
915 page
= g_new0(ToolbarPage
, 1);
916 page
->page
.path
= composepath
;
917 page
->page
.create_widget
= prefs_toolbar_create_widget
;
918 page
->page
.destroy_widget
= prefs_toolbar_destroy_widget
;
919 page
->page
.save_page
= prefs_toolbar_save
;
920 page
->source
= TOOLBAR_COMPOSE
;
921 page
->page
.weight
= 40.0;
922 prefs_gtk_register_page((PrefsPage
*) page
);
923 prefs_toolbar_composewindow
= page
;
926 void prefs_toolbar_done(void)
928 prefs_gtk_unregister_page((PrefsPage
*) prefs_toolbar_mainwindow
);
929 g_free(prefs_toolbar_mainwindow
);
930 prefs_gtk_unregister_page((PrefsPage
*) prefs_toolbar_composewindow
);
931 g_free(prefs_toolbar_composewindow
);
932 prefs_gtk_unregister_page((PrefsPage
*) prefs_toolbar_messageview
);
933 g_free(prefs_toolbar_messageview
);
936 static void set_visible_if_not_text(GtkTreeViewColumn
*col
,
937 GtkCellRenderer
*renderer
,
945 gtk_tree_model_get(model
, iter
, SET_ICON_IS_TEXT
, &is_text
, -1);
947 g_object_set(renderer
, "visible", FALSE
, NULL
);
950 gtk_tree_model_get(model
, iter
,
953 /* note getting a pixbuf from a tree model increases
954 * its refcount ... */
955 g_object_unref(pixbuf
);
957 g_object_set(renderer
, "visible", TRUE
, NULL
);
958 g_object_set(renderer
, "pixbuf", pixbuf
, NULL
);
962 static GtkWidget
*create_icon_list_view(ToolbarPage
*prefs_toolbar
)
964 GtkTreeView
*list_view
;
966 GtkCellRenderer
*renderer
;
967 GtkTreeViewColumn
*column
;
968 GtkTreeSelection
*selector
;
970 /* XXX: for icon list we don't need SET_TEXT, and SET_EVENT */
971 store
= gtk_list_store_new(N_SET_COLUMNS
,
979 list_view
= GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
)));
980 g_object_unref(G_OBJECT(store
));
982 column
= gtk_tree_view_column_new();
983 renderer
= gtk_cell_renderer_pixbuf_new();
984 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
986 /* tell pixbuf renderer it is only visible if
987 * the icon is not represented by text */
988 gtk_tree_view_column_set_cell_data_func(column
, renderer
,
989 set_visible_if_not_text
,
992 renderer
= gtk_cell_renderer_text_new();
993 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
995 /* tell the text renderer it is only visible if the icon
996 * is represented by an image */
997 gtk_tree_view_column_set_attributes(column
, renderer
,
998 "visible", SET_ICON_IS_TEXT
,
999 "text", SET_ICON_TEXT
,
1002 gtk_tree_view_append_column(list_view
, column
);
1004 column
= gtk_tree_view_column_new();
1005 renderer
= gtk_cell_renderer_text_new();
1006 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
1007 gtk_tree_view_column_set_attributes(column
, renderer
,
1008 "text", SET_FILENAME
,
1011 gtk_tree_view_append_column(list_view
, column
);
1013 /* various other tree view attributes */
1014 gtk_tree_view_set_rules_hint(list_view
, prefs_common
.use_stripes_everywhere
);
1015 gtk_tree_view_set_headers_visible(list_view
, FALSE
);
1017 selector
= gtk_tree_view_get_selection(list_view
);
1018 gtk_tree_selection_set_mode(selector
, GTK_SELECTION_BROWSE
);
1019 gtk_tree_selection_set_select_function
1020 (selector
, (GtkTreeSelectionFunc
) icon_list_selected
,
1021 prefs_toolbar
, NULL
);
1023 return GTK_WIDGET(list_view
);
1026 static GtkWidget
*create_set_list_view(ToolbarPage
*prefs_toolbar
)
1028 GtkTreeView
*list_view
;
1029 GtkListStore
*store
;
1030 GtkCellRenderer
*renderer
;
1031 GtkTreeViewColumn
*column
;
1032 GtkTreeSelection
*selector
;
1034 store
= gtk_list_store_new(N_SET_COLUMNS
,
1042 list_view
= GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
)));
1043 g_object_unref(G_OBJECT(store
));
1045 column
= gtk_tree_view_column_new();
1046 gtk_tree_view_column_set_title(column
, _("Icon"));
1047 renderer
= gtk_cell_renderer_pixbuf_new();
1048 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
1050 /* tell pixbuf renderer it is only visible if
1051 * the icon is not represented by text */
1052 gtk_tree_view_column_set_cell_data_func(column
, renderer
,
1053 set_visible_if_not_text
,
1056 renderer
= gtk_cell_renderer_text_new();
1057 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
1059 /* tell the text renderer it is only visible if the icon
1060 * is represented by an image */
1061 gtk_tree_view_column_set_attributes(column
, renderer
,
1062 "visible", SET_ICON_IS_TEXT
,
1063 "text", SET_ICON_TEXT
,
1066 gtk_tree_view_append_column(list_view
, column
);
1068 column
= gtk_tree_view_column_new();
1069 gtk_tree_view_column_set_title(column
, _("File name"));
1070 renderer
= gtk_cell_renderer_text_new();
1071 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
1072 gtk_tree_view_column_set_attributes(column
, renderer
,
1073 "text", SET_FILENAME
,
1076 gtk_tree_view_append_column(list_view
, column
);
1078 column
= gtk_tree_view_column_new();
1079 gtk_tree_view_column_set_title(column
, _("Icon text"));
1080 renderer
= gtk_cell_renderer_text_new();
1081 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
1082 gtk_tree_view_column_set_attributes(column
, renderer
,
1085 gtk_tree_view_append_column(list_view
, column
);
1087 column
= gtk_tree_view_column_new();
1088 gtk_tree_view_column_set_title(column
, _("Mapped event"));
1089 renderer
= gtk_cell_renderer_text_new();
1090 gtk_tree_view_column_pack_start(column
, renderer
, FALSE
);
1091 gtk_tree_view_column_set_attributes(column
, renderer
,
1094 gtk_tree_view_append_column(list_view
, column
);
1096 /* various other tree view attributes */
1097 gtk_tree_view_set_rules_hint(list_view
, prefs_common
.use_stripes_everywhere
);
1099 selector
= gtk_tree_view_get_selection(list_view
);
1100 gtk_tree_selection_set_mode(selector
, GTK_SELECTION_BROWSE
);
1101 gtk_tree_selection_set_select_function
1102 (selector
, (GtkTreeSelectionFunc
) set_list_selected
,
1103 prefs_toolbar
, NULL
);
1105 return GTK_WIDGET(list_view
);
1109 static gboolean
icon_list_selected(GtkTreeSelection
*selector
,
1110 GtkTreeModel
*model
,
1112 gboolean currently_selected
,
1113 ToolbarPage
*prefs_toolbar
)
1118 if (currently_selected
||!gtk_tree_model_get_iter(model
, &iter
, path
))
1122 gtk_tree_model_get(model
, &iter
,
1123 SET_FILENAME
, &text
,
1128 if (g_utf8_collate(toolbar_ret_descr_from_val(A_SEPARATOR
), text
) == 0) {
1129 gtk_widget_set_sensitive(prefs_toolbar
->combo_action
, FALSE
);
1130 gtk_widget_set_sensitive(prefs_toolbar
->entry_icon_text
, FALSE
);
1131 gtk_widget_set_sensitive(prefs_toolbar
->combo_syl_action
, FALSE
);
1133 gtk_widget_set_sensitive(prefs_toolbar
->combo_action
, TRUE
);
1134 gtk_widget_set_sensitive(prefs_toolbar
->entry_icon_text
, TRUE
);
1135 gtk_widget_set_sensitive(prefs_toolbar
->combo_syl_action
, TRUE
);
1143 static gboolean
set_list_selected(GtkTreeSelection
*selector
,
1144 GtkTreeModel
*model
,
1146 gboolean currently_selected
,
1147 ToolbarPage
*prefs_toolbar
)
1150 GtkTreeView
*list_ico
= GTK_TREE_VIEW(prefs_toolbar
->list_view_icons
);
1151 gchar
*syl_act
= toolbar_ret_descr_from_val(A_SYL_ACTIONS
);
1152 gchar
*file
, *icon_text
, *descr
;
1155 GtkTreeModel
*model_ico
;
1157 if (currently_selected
|| !gtk_tree_model_get_iter(model
, &iter
, path
))
1160 gtk_tree_model_get(model
, &iter
,
1161 SET_FILENAME
, &file
,
1162 SET_TEXT
, &icon_text
,
1167 if (icon_text
== NULL
) {
1171 if (g_utf8_collate(descr
, syl_act
))
1172 gtk_entry_set_text(GTK_ENTRY(prefs_toolbar
->entry_icon_text
),
1175 /* scan combo list for selected description an set combo item accordingly */
1176 for (cur
= prefs_toolbar
->combo_action_list
, item_num
= 0; cur
!= NULL
;
1178 gchar
*item_str
= (gchar
*)cur
->data
;
1179 if (g_utf8_collate(item_str
, descr
) == 0) {
1180 gtk_list_select_item(GTK_LIST(prefs_toolbar
->combo_list
), item_num
);
1187 model_ico
= gtk_tree_view_get_model(list_ico
);
1188 if (gtk_tree_model_get_iter_first(model_ico
, &iter
)) {
1190 gboolean found
= FALSE
;
1192 /* find in icon list, scroll to item */
1195 gtk_tree_model_get(model_ico
, &iter
,
1196 SET_FILENAME
, &entry
,
1198 found
= entry
&& !g_utf8_collate(entry
, file
);
1202 } while(gtk_tree_model_iter_next(model_ico
, &iter
));
1207 gtk_tree_selection_select_iter
1208 (gtk_tree_view_get_selection(list_ico
), &iter
);
1209 path
= gtk_tree_model_get_path(model_ico
, &iter
);
1210 gtk_tree_view_set_cursor(list_ico
, path
, NULL
, FALSE
);
1211 gtk_tree_path_free(path
);