2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2001-2007 Hiroyuki Yamamoto and 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>
40 #include "mainwindow.h"
41 #include "summaryview.h"
46 #include "prefs_gtk.h"
48 #include "stock_pixmap.h"
49 #include "manage_window.h"
55 #include "prefs_actions.h"
56 #include "prefs_common.h"
57 #include "prefs_toolbar.h"
58 #include "alertpanel.h"
62 #define TOOLBAR_TAG_INDEX "toolbar"
63 #define TOOLBAR_TAG_ITEM "item"
64 #define TOOLBAR_TAG_SEPARATOR "separator"
66 #define TOOLBAR_ICON_FILE "file"
67 #define TOOLBAR_ICON_TEXT "text"
68 #define TOOLBAR_ICON_ACTION "action"
70 static gboolean toolbar_is_duplicate (gint action,
72 static void toolbar_parse_item (XMLFile *file,
75 static gint toolbar_ret_val_from_text (const gchar *text);
76 static gchar *toolbar_ret_text_from_val (gint val);
78 static void toolbar_set_default_main (void);
79 static void toolbar_set_default_compose (void);
80 static void toolbar_set_default_msgview (void);
82 static void toolbar_style (ToolbarType type,
86 static MainWindow *get_mainwin (gpointer data);
87 static void activate_compose_button (Toolbar *toolbar,
89 ComposeButtonType type);
91 /* toolbar callbacks */
92 static void toolbar_reply (gpointer data,
94 static void toolbar_learn (gpointer data,
96 static void toolbar_delete_cb (GtkWidget *widget,
98 static void toolbar_trash_cb (GtkWidget *widget,
101 static void toolbar_compose_cb (GtkWidget *widget,
104 static void toolbar_learn_cb (GtkWidget *widget,
107 static void toolbar_reply_cb (GtkWidget *widget,
110 static void toolbar_reply_to_all_cb (GtkWidget *widget,
113 static void toolbar_reply_to_list_cb (GtkWidget *widget,
116 static void toolbar_reply_to_sender_cb (GtkWidget *widget,
119 static void toolbar_forward_cb (GtkWidget *widget,
122 static void toolbar_prev_unread_cb (GtkWidget *widget,
124 static void toolbar_next_unread_cb (GtkWidget *widget,
127 static void toolbar_ignore_thread_cb (GtkWidget *widget,
130 static void toolbar_print_cb (GtkWidget *widget,
133 static void toolbar_actions_execute_cb (GtkWidget *widget,
137 static void toolbar_send_cb (GtkWidget *widget,
139 static void toolbar_send_later_cb (GtkWidget *widget,
141 static void toolbar_draft_cb (GtkWidget *widget,
143 static void toolbar_close_cb (GtkWidget *widget,
145 static void toolbar_open_mail_cb (GtkWidget *widget,
147 static void toolbar_insert_cb (GtkWidget *widget,
149 static void toolbar_attach_cb (GtkWidget *widget,
151 static void toolbar_sig_cb (GtkWidget *widget,
153 static void toolbar_ext_editor_cb (GtkWidget *widget,
155 static void toolbar_linewrap_current_cb (GtkWidget *widget,
157 static void toolbar_linewrap_all_cb (GtkWidget *widget,
159 static void toolbar_addrbook_cb (GtkWidget *widget,
162 static void toolbar_check_spelling_cb (GtkWidget *widget,
165 static void toolbar_cancel_inc_cb (GtkWidget *widget,
171 } toolbar_text [] = {
172 { "A_RECEIVE_ALL", N_("Receive Mail on all Accounts") },
173 { "A_RECEIVE_CUR", N_("Receive Mail on current Account") },
174 { "A_SEND_QUEUED", N_("Send Queued Messages") },
175 { "A_COMPOSE_EMAIL", N_("Compose Email") },
176 { "A_COMPOSE_NEWS", N_("Compose News") },
177 { "A_REPLY_MESSAGE", N_("Reply to Message") },
178 { "A_REPLY_SENDER", N_("Reply to Sender") },
179 { "A_REPLY_ALL", N_("Reply to All") },
180 { "A_REPLY_ML", N_("Reply to Mailing-list") },
181 { "A_OPEN_MAIL", N_("Open email") },
182 { "A_FORWARD", N_("Forward Message") },
183 { "A_TRASH", N_("Trash Message") },
184 { "A_DELETE_REAL", N_("Delete Message") },
185 { "A_EXECUTE", N_("Execute") },
186 { "A_GOTO_PREV", N_("Go to Previous Unread Message") },
187 { "A_GOTO_NEXT", N_("Go to Next Unread Message") },
188 { "A_IGNORE_THREAD", N_("Ignore thread") },
189 { "A_PRINT", N_("Print") },
190 { "A_LEARN_SPAM", N_("Learn Spam or Ham") },
191 { "A_GO_FOLDERS", N_("Open folder/Go to folder list") },
193 { "A_SEND", N_("Send Message") },
194 { "A_SENDL", N_("Put into queue folder and send later") },
195 { "A_DRAFT", N_("Save to draft folder") },
196 { "A_INSERT", N_("Insert file") },
197 { "A_ATTACH", N_("Attach file") },
198 { "A_SIG", N_("Insert signature") },
199 { "A_EXTEDITOR", N_("Edit with external editor") },
200 { "A_LINEWRAP_CURRENT", N_("Wrap long lines of current paragraph") },
201 { "A_LINEWRAP_ALL", N_("Wrap all long lines") },
202 { "A_ADDRBOOK", N_("Address book") },
204 { "A_CHECK_SPELLING", N_("Check spelling") },
206 { "A_SYL_ACTIONS", N_("Claws Mail Actions Feature") },
207 { "A_CANCEL_INC", N_("Cancel receiving") },
208 { "A_CLOSE", N_("Close window") },
209 { "A_SEPARATOR", "Separator" }
212 /* struct holds configuration files and a list of
213 * currently active toolbar items
214 * TOOLBAR_MAIN, TOOLBAR_COMPOSE and TOOLBAR_MSGVIEW
218 const gchar *conf_file;
220 } toolbar_config[3] = {
221 { "toolbar_main.xml", NULL},
222 { "toolbar_compose.xml", NULL},
223 { "toolbar_msgview.xml", NULL}
226 static GtkItemFactoryEntry reply_entries[] =
228 {N_("/Reply with _quote"), NULL, toolbar_reply, COMPOSE_REPLY_WITH_QUOTE, NULL},
229 {N_("/_Reply without quote"), NULL, toolbar_reply, COMPOSE_REPLY_WITHOUT_QUOTE, NULL}
231 static GtkItemFactoryEntry replyall_entries[] =
233 {N_("/Reply to all with _quote"), "<shift>A", toolbar_reply, COMPOSE_REPLY_TO_ALL_WITH_QUOTE, NULL},
234 {N_("/_Reply to all without quote"), "a", toolbar_reply, COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE, NULL}
236 static GtkItemFactoryEntry replylist_entries[] =
238 {N_("/Reply to list with _quote"), NULL, toolbar_reply, COMPOSE_REPLY_TO_LIST_WITH_QUOTE, NULL},
239 {N_("/_Reply to list without quote"), NULL, toolbar_reply, COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE, NULL}
241 static GtkItemFactoryEntry replysender_entries[] =
243 {N_("/Reply to sender with _quote"), NULL, toolbar_reply, COMPOSE_REPLY_TO_SENDER_WITH_QUOTE, NULL},
244 {N_("/_Reply to sender without quote"), NULL, toolbar_reply, COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE, NULL}
246 static GtkItemFactoryEntry forward_entries[] =
248 {N_("/_Forward"), "f", toolbar_reply, COMPOSE_FORWARD_INLINE, NULL},
249 {N_("/For_ward as attachment"), "<shift>F", toolbar_reply, COMPOSE_FORWARD_AS_ATTACH, NULL},
250 {N_("/Redirec_t"), NULL, toolbar_reply, COMPOSE_REDIRECT, NULL}
252 static GtkItemFactoryEntry learn_entries[] =
254 {N_("/Learn as _Spam"), NULL, toolbar_learn, TRUE, NULL},
255 {N_("/Learn as _Ham"), NULL, toolbar_learn, FALSE, NULL}
259 gint toolbar_ret_val_from_descr(const gchar *descr)
263 for (i = 0; i < N_ACTION_VAL; i++) {
264 if (g_utf8_collate(gettext(toolbar_text[i].descr), descr) == 0)
271 gchar *toolbar_ret_descr_from_val(gint val)
273 g_return_val_if_fail(val >=0 && val < N_ACTION_VAL, NULL);
275 return gettext(toolbar_text[val].descr);
278 static gint toolbar_ret_val_from_text(const gchar *text)
282 for (i = 0; i < N_ACTION_VAL; i++) {
283 if (g_utf8_collate(toolbar_text[i].index_str, text) == 0)
290 static gchar *toolbar_ret_text_from_val(gint val)
292 g_return_val_if_fail(val >=0 && val < N_ACTION_VAL, NULL);
294 return toolbar_text[val].index_str;
297 static gboolean toolbar_is_duplicate(gint action, ToolbarType source)
301 if ((action == A_SEPARATOR) || (action == A_SYL_ACTIONS))
304 for (cur = toolbar_config[source].item_list; cur != NULL; cur = cur->next) {
305 ToolbarItem *item = (ToolbarItem*) cur->data;
307 if (item->index == action)
313 /* depending on toolbar type this function
314 returns a list of available toolbar events being
315 displayed by prefs_toolbar
317 GList *toolbar_get_action_items(ToolbarType source)
322 if (source == TOOLBAR_MAIN) {
323 gint main_items[] = { A_RECEIVE_ALL, A_RECEIVE_CUR, A_SEND_QUEUED,
324 A_COMPOSE_EMAIL, A_REPLY_MESSAGE, A_REPLY_SENDER,
325 A_REPLY_ALL, A_REPLY_ML, A_OPEN_MAIL, A_FORWARD,
326 A_TRASH , A_DELETE_REAL, A_EXECUTE, A_GOTO_PREV,
327 A_GOTO_NEXT, A_IGNORE_THREAD, A_PRINT,
328 A_ADDRBOOK, A_LEARN_SPAM, A_GO_FOLDERS,
329 A_SYL_ACTIONS, A_CANCEL_INC };
331 for (i = 0; i < sizeof main_items / sizeof main_items[0]; i++) {
332 items = g_list_append(items, gettext(toolbar_text[main_items[i]].descr));
335 else if (source == TOOLBAR_COMPOSE) {
336 gint comp_items[] = { A_SEND, A_SENDL, A_DRAFT,
337 A_INSERT, A_ATTACH, A_SIG,
338 A_EXTEDITOR, A_LINEWRAP_CURRENT,
339 A_LINEWRAP_ALL, A_ADDRBOOK,
343 A_SYL_ACTIONS, A_CLOSE };
345 for (i = 0; i < sizeof comp_items / sizeof comp_items[0]; i++)
346 items = g_list_append(items, gettext(toolbar_text[comp_items[i]].descr));
348 else if (source == TOOLBAR_MSGVIEW) {
349 gint msgv_items[] = { A_COMPOSE_EMAIL, A_REPLY_MESSAGE, A_REPLY_SENDER,
350 A_REPLY_ALL, A_REPLY_ML, A_FORWARD,
351 A_TRASH, A_DELETE_REAL, A_GOTO_PREV, A_GOTO_NEXT,
352 A_ADDRBOOK, A_LEARN_SPAM, A_SYL_ACTIONS, A_CLOSE };
354 for (i = 0; i < sizeof msgv_items / sizeof msgv_items[0]; i++)
355 items = g_list_append(items, gettext(toolbar_text[msgv_items[i]].descr));
361 static void toolbar_parse_item(XMLFile *file, ToolbarType source)
365 ToolbarItem *item = NULL;
366 gboolean rewrite = FALSE;
368 attr = xml_get_current_tag_attr(file);
369 item = g_new0(ToolbarItem, 1);
371 name = ((XMLAttr *)attr->data)->name;
372 value = ((XMLAttr *)attr->data)->value;
374 if (g_utf8_collate(name, TOOLBAR_ICON_FILE) == 0)
375 item->file = g_strdup (value);
376 else if (g_utf8_collate(name, TOOLBAR_ICON_TEXT) == 0)
377 item->text = g_strdup (gettext(value));
378 else if (g_utf8_collate(name, TOOLBAR_ICON_ACTION) == 0)
379 item->index = toolbar_ret_val_from_text(value);
380 if (item->index == -1 && !strcmp(value, "A_DELETE")) {
382 item->index = A_TRASH;
384 item->file = g_strdup("trash_btn");
386 item->text = g_strdup(_("Trash"));
389 attr = g_list_next(attr);
391 if (item->index != -1) {
393 if (!toolbar_is_duplicate(item->index, source))
394 toolbar_config[source].item_list = g_slist_append(toolbar_config[source].item_list,
398 toolbar_save_config_file(source);
402 static void toolbar_set_default_main(void)
408 } default_toolbar[] = {
410 { A_GO_FOLDERS, STOCK_PIXMAP_GO_FOLDERS, _("Folders") },
411 { A_SEPARATOR, 0, ("") },
413 { A_RECEIVE_ALL, STOCK_PIXMAP_MAIL_RECEIVE_ALL, _("Get Mail")},
414 { A_SEPARATOR, 0, ("") },
415 { A_SEND_QUEUED, STOCK_PIXMAP_MAIL_SEND_QUEUE, _("Send") },
416 { A_COMPOSE_EMAIL, STOCK_PIXMAP_MAIL_COMPOSE,
417 (gchar*)Q_("Toolbar|Compose") },
418 { A_SEPARATOR, 0, ("") },
420 { A_OPEN_MAIL, STOCK_PIXMAP_OPEN_MAIL, _("Open") },
422 { A_REPLY_MESSAGE, STOCK_PIXMAP_MAIL_REPLY, _("Reply") },
424 { A_REPLY_ALL, STOCK_PIXMAP_MAIL_REPLY_TO_ALL, _("All") },
425 { A_REPLY_SENDER, STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR, _("Sender") },
427 { A_FORWARD, STOCK_PIXMAP_MAIL_FORWARD, _("Forward") },
428 { A_SEPARATOR, 0, ("") },
429 { A_TRASH, STOCK_PIXMAP_TRASH, _("Trash") },
431 #if (defined(USE_SPAMASSASSIN_PLUGIN) || defined(USE_BOGOFILTER_PLUGIN))
432 { A_LEARN_SPAM, STOCK_PIXMAP_SPAM_BTN, _("Spam") },
435 { A_SEPARATOR, 0, ("") },
436 { A_GOTO_NEXT, STOCK_PIXMAP_DOWN_ARROW, _("Next") }
441 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
443 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
445 if (default_toolbar[i].action != A_SEPARATOR) {
447 gchar *file = stock_pixmap_get_name((StockPixmap)default_toolbar[i].icon);
449 toolbar_item->file = g_strdup(file);
450 toolbar_item->index = default_toolbar[i].action;
451 toolbar_item->text = g_strdup(default_toolbar[i].text);
454 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
455 toolbar_item->index = A_SEPARATOR;
458 if (toolbar_item->index != -1) {
459 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_MAIN))
460 toolbar_config[TOOLBAR_MAIN].item_list =
461 g_slist_append(toolbar_config[TOOLBAR_MAIN].item_list, toolbar_item);
466 static void toolbar_set_default_compose(void)
472 } default_toolbar[] = {
473 { A_SEND, STOCK_PIXMAP_MAIL_SEND, _("Send") },
474 { A_SENDL, STOCK_PIXMAP_MAIL_SEND_QUEUE, _("Send later") },
475 { A_DRAFT, STOCK_PIXMAP_MAIL, _("Draft") },
476 { A_SEPARATOR, 0, ("") },
478 { A_INSERT, STOCK_PIXMAP_INSERT_FILE, _("Insert") },
480 { A_ATTACH, STOCK_PIXMAP_MAIL_ATTACH, _("Attach") },
481 { A_SEPARATOR, 0, ("") },
482 { A_ADDRBOOK, STOCK_PIXMAP_ADDRESS_BOOK, _("Address") }
485 { A_SEPARATOR, 0, ("") },
486 { A_CLOSE, STOCK_PIXMAP_CLOSE, _("Close") }
492 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
494 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
496 if (default_toolbar[i].action != A_SEPARATOR) {
498 gchar *file = stock_pixmap_get_name((StockPixmap)default_toolbar[i].icon);
500 toolbar_item->file = g_strdup(file);
501 toolbar_item->index = default_toolbar[i].action;
502 toolbar_item->text = g_strdup(default_toolbar[i].text);
505 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
506 toolbar_item->index = A_SEPARATOR;
509 if (toolbar_item->index != -1) {
510 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_COMPOSE))
511 toolbar_config[TOOLBAR_COMPOSE].item_list =
512 g_slist_append(toolbar_config[TOOLBAR_COMPOSE].item_list, toolbar_item);
517 static void toolbar_set_default_msgview(void)
523 } default_toolbar[] = {
524 { A_REPLY_MESSAGE, STOCK_PIXMAP_MAIL_REPLY, _("Reply") },
525 { A_REPLY_ALL, STOCK_PIXMAP_MAIL_REPLY_TO_ALL, _("All") },
526 { A_REPLY_SENDER, STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR, _("Sender") },
527 { A_FORWARD, STOCK_PIXMAP_MAIL_FORWARD, _("Forward") },
528 { A_SEPARATOR, 0, ("") },
529 { A_TRASH, STOCK_PIXMAP_TRASH, _("Trash") },
531 #if (defined(USE_SPAMASSASSIN_PLUGIN) || defined(USE_BOGOFILTER_PLUGIN))
532 { A_LEARN_SPAM, STOCK_PIXMAP_SPAM_BTN, _("Spam") },
535 { A_GOTO_NEXT, STOCK_PIXMAP_DOWN_ARROW, _("Next") }
538 { A_SEPARATOR, 0, ("") },
539 { A_CLOSE, STOCK_PIXMAP_CLOSE, _("Close") }
545 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
547 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
549 if (default_toolbar[i].action != A_SEPARATOR) {
551 gchar *file = stock_pixmap_get_name((StockPixmap)default_toolbar[i].icon);
553 toolbar_item->file = g_strdup(file);
554 toolbar_item->index = default_toolbar[i].action;
555 toolbar_item->text = g_strdup(default_toolbar[i].text);
558 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
559 toolbar_item->index = A_SEPARATOR;
562 if (toolbar_item->index != -1) {
563 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_MSGVIEW))
564 toolbar_config[TOOLBAR_MSGVIEW].item_list =
565 g_slist_append(toolbar_config[TOOLBAR_MSGVIEW].item_list, toolbar_item);
570 void toolbar_set_default(ToolbarType source)
572 if (source == TOOLBAR_MAIN)
573 toolbar_set_default_main();
574 else if (source == TOOLBAR_COMPOSE)
575 toolbar_set_default_compose();
576 else if (source == TOOLBAR_MSGVIEW)
577 toolbar_set_default_msgview();
580 void toolbar_save_config_file(ToolbarType source)
585 gchar *fileSpec = NULL;
587 debug_print("save Toolbar Configuration to %s\n", toolbar_config[source].conf_file);
589 fileSpec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, toolbar_config[source].conf_file, NULL );
590 pfile = prefs_write_open(fileSpec);
594 fprintf(fp, "<?xml version=\"1.0\" encoding=\"%s\" ?>\n", CS_INTERNAL);
596 fprintf(fp, "<%s>\n", TOOLBAR_TAG_INDEX);
598 for (cur = toolbar_config[source].item_list; cur != NULL; cur = cur->next) {
599 ToolbarItem *toolbar_item = (ToolbarItem*) cur->data;
601 if (toolbar_item->index != A_SEPARATOR) {
602 fprintf(fp, "\t<%s %s=\"%s\" %s=\"",
604 TOOLBAR_ICON_FILE, toolbar_item->file,
606 xml_file_put_escape_str(fp, toolbar_item->text);
607 fprintf(fp, "\" %s=\"%s\"/>\n",
609 toolbar_ret_text_from_val(toolbar_item->index));
611 fprintf(fp, "\t<%s/>\n", TOOLBAR_TAG_SEPARATOR);
615 fprintf(fp, "</%s>\n", TOOLBAR_TAG_INDEX);
617 if (prefs_file_close (pfile) < 0 )
618 g_warning("failed to write toolbar configuration to file\n");
620 g_warning("failed to open toolbar configuration file for writing\n");
623 void toolbar_read_config_file(ToolbarType source)
625 XMLFile *file = NULL;
626 gchar *fileSpec = NULL;
631 debug_print("read Toolbar Configuration from %s\n", toolbar_config[source].conf_file);
633 fileSpec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, toolbar_config[source].conf_file, NULL );
634 file = xml_open_file(fileSpec);
637 toolbar_clear_list(source);
641 || (xml_get_dtd(file))
642 || (xml_parse_next_tag(file))
643 || (!xml_compare_tag(file, TOOLBAR_TAG_INDEX))) {
644 xml_close_file(file);
648 attr = xml_get_current_tag_attr(file);
655 if (xml_parse_next_tag(file))
658 /* Get next tag (icon, icon_text or icon_action) */
659 if (xml_compare_tag(file, TOOLBAR_TAG_ITEM)) {
660 toolbar_parse_item(file, source);
661 } else if (xml_compare_tag(file, TOOLBAR_TAG_SEPARATOR)) {
662 ToolbarItem *item = g_new0(ToolbarItem, 1);
664 item->file = g_strdup(toolbar_ret_descr_from_val(A_SEPARATOR));
665 item->index = A_SEPARATOR;
666 toolbar_config[source].item_list =
667 g_slist_append(toolbar_config[source].item_list, item);
671 xml_close_file(file);
674 if ((!file) || (g_slist_length(toolbar_config[source].item_list) == 0)) {
676 if (source == TOOLBAR_MAIN)
677 toolbar_set_default(TOOLBAR_MAIN);
678 else if (source == TOOLBAR_COMPOSE)
679 toolbar_set_default(TOOLBAR_COMPOSE);
680 else if (source == TOOLBAR_MSGVIEW)
681 toolbar_set_default(TOOLBAR_MSGVIEW);
683 g_warning("failed to write Toolbar Configuration to %s\n", toolbar_config[source].conf_file);
687 toolbar_save_config_file(source);
692 * clears list of toolbar items read from configuration files
694 void toolbar_clear_list(ToolbarType source)
696 while (toolbar_config[source].item_list != NULL) {
697 ToolbarItem *item = (ToolbarItem*) toolbar_config[source].item_list->data;
699 toolbar_config[source].item_list =
700 g_slist_remove(toolbar_config[source].item_list, item);
706 g_slist_free(toolbar_config[source].item_list);
711 * return list of Toolbar items
713 GSList *toolbar_get_list(ToolbarType source)
717 if ((source == TOOLBAR_MAIN) || (source == TOOLBAR_COMPOSE) || (source == TOOLBAR_MSGVIEW))
718 list = toolbar_config[source].item_list;
723 void toolbar_set_list_item(ToolbarItem *t_item, ToolbarType source)
725 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
727 toolbar_item->file = g_strdup(t_item->file);
728 toolbar_item->text = g_strdup(t_item->text);
729 toolbar_item->index = t_item->index;
731 toolbar_config[source].item_list =
732 g_slist_append(toolbar_config[source].item_list,
736 void toolbar_action_execute(GtkWidget *widget,
742 gchar *action, *action_p;
743 gboolean found = FALSE;
746 for (cur = action_list; cur != NULL; cur = cur->next) {
747 ToolbarSylpheedActions *act = (ToolbarSylpheedActions*)cur->data;
749 if (widget == act->widget) {
751 for (lop = prefs_common.actions_list; lop != NULL; lop = lop->next) {
752 action = g_strdup((gchar*)lop->data);
754 action_p = strstr(action, ": ");
756 if (g_utf8_collate(act->name, action) == 0) {
770 actions_execute(data, i, widget, source);
772 g_warning ("Error: did not find Claws Action to execute");
775 static void activate_compose_button (Toolbar *toolbar,
777 ComposeButtonType type)
779 if ((!toolbar->compose_mail_btn))
782 if (type == COMPOSEBUTTON_NEWS) {
783 gtk_tool_button_set_icon_widget(
784 GTK_TOOL_BUTTON(toolbar->compose_mail_btn),
785 toolbar->compose_news_icon);
786 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolbar->compose_mail_btn), GTK_TOOLTIPS(toolbar->tooltips),
787 _("Compose News message"), NULL);
788 gtk_widget_show(toolbar->compose_news_icon);
790 gtk_tool_button_set_icon_widget(
791 GTK_TOOL_BUTTON(toolbar->compose_mail_btn),
792 toolbar->compose_mail_icon);
793 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolbar->compose_mail_btn), GTK_TOOLTIPS(toolbar->tooltips),
794 _("Compose Email"), NULL);
795 gtk_widget_show(toolbar->compose_mail_icon);
797 toolbar->compose_btn_type = type;
800 void toolbar_set_compose_button(Toolbar *toolbar,
801 ComposeButtonType compose_btn_type)
803 if (toolbar->compose_btn_type != compose_btn_type)
804 activate_compose_button(toolbar,
805 prefs_common.toolbar_style,
809 static void activate_learn_button (Toolbar *toolbar,
811 LearnButtonType type)
813 if ((!toolbar->learn_spam_btn))
816 if (type == LEARN_SPAM) {
817 gtk_tool_button_set_icon_widget(
818 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
819 toolbar->learn_spam_icon);
820 gtk_tool_button_set_label(
821 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
823 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolbar->learn_spam_btn), GTK_TOOLTIPS(toolbar->tooltips),
824 _("Learn spam"), NULL);
825 gtk_widget_show(toolbar->learn_spam_icon);
827 gtk_tool_button_set_icon_widget(
828 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
829 toolbar->learn_ham_icon);
830 gtk_tool_button_set_label(
831 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
833 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolbar->learn_spam_btn), GTK_TOOLTIPS(toolbar->tooltips),
834 _("Learn ham"), NULL);
835 gtk_widget_show(toolbar->learn_ham_icon);
837 toolbar->learn_btn_type = type;
840 void toolbar_set_learn_button(Toolbar *toolbar,
841 LearnButtonType learn_btn_type)
843 if (toolbar->learn_btn_type != learn_btn_type)
844 activate_learn_button(toolbar,
845 prefs_common.toolbar_style,
849 void toolbar_toggle(guint action, gpointer data)
851 MainWindow *mainwin = (MainWindow*)data;
855 g_return_if_fail(mainwin != NULL);
857 toolbar_style(TOOLBAR_MAIN, action, mainwin);
859 list = compose_get_compose_list();
860 for (cur = list; cur != NULL; cur = cur->next) {
861 toolbar_style(TOOLBAR_COMPOSE, action, cur->data);
863 list = messageview_get_msgview_list();
864 for (cur = list; cur != NULL; cur = cur->next) {
865 toolbar_style(TOOLBAR_MSGVIEW, action, cur->data);
870 void toolbar_set_style(GtkWidget *toolbar_wid, GtkWidget *handlebox_wid, guint action)
872 switch ((ToolbarStyle)action) {
874 gtk_widget_hide(handlebox_wid);
877 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
881 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
885 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
888 case TOOLBAR_BOTH_HORIZ:
889 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
890 GTK_TOOLBAR_BOTH_HORIZ);
896 prefs_common.toolbar_style = (ToolbarStyle)action;
897 gtk_widget_set_size_request(handlebox_wid, 1, -1);
899 if (prefs_common.toolbar_style != TOOLBAR_NONE) {
900 gtk_widget_show(handlebox_wid);
901 gtk_widget_queue_resize(handlebox_wid);
905 * Change the style of toolbar
907 static void toolbar_style(ToolbarType type, guint action, gpointer data)
909 GtkWidget *handlebox_wid;
910 GtkWidget *toolbar_wid;
911 MainWindow *mainwin = (MainWindow*)data;
912 Compose *compose = (Compose*)data;
913 MessageView *msgview = (MessageView*)data;
915 g_return_if_fail(data != NULL);
919 handlebox_wid = mainwin->handlebox;
920 toolbar_wid = mainwin->toolbar->toolbar;
922 case TOOLBAR_COMPOSE:
923 handlebox_wid = compose->handlebox;
924 toolbar_wid = compose->toolbar->toolbar;
926 case TOOLBAR_MSGVIEW:
927 handlebox_wid = msgview->handlebox;
928 toolbar_wid = msgview->toolbar->toolbar;
934 toolbar_set_style(toolbar_wid, handlebox_wid, action);
937 /* Toolbar handling */
938 static void toolbar_inc_cb(GtkWidget *widget,
941 ToolbarItem *toolbar_item = (ToolbarItem*)data;
944 g_return_if_fail(toolbar_item != NULL);
946 switch (toolbar_item->type) {
948 mainwin = (MainWindow*)toolbar_item->parent;
949 inc_mail_cb(mainwin, 0, NULL);
956 static void toolbar_inc_all_cb(GtkWidget *widget,
959 ToolbarItem *toolbar_item = (ToolbarItem*)data;
962 g_return_if_fail(toolbar_item != NULL);
964 switch (toolbar_item->type) {
966 mainwin = (MainWindow*)toolbar_item->parent;
967 inc_all_account_mail_cb(mainwin, 0, NULL);
974 static void toolbar_send_queued_cb(GtkWidget *widget,gpointer data)
976 ToolbarItem *toolbar_item = (ToolbarItem*)data;
979 g_return_if_fail(toolbar_item != NULL);
981 switch (toolbar_item->type) {
983 mainwin = (MainWindow*)toolbar_item->parent;
984 send_queue_cb(mainwin, 0, NULL);
991 static void toolbar_exec_cb(GtkWidget *widget,
994 MainWindow *mainwin = get_mainwin(data);
996 g_return_if_fail(mainwin != NULL);
997 summary_execute(mainwin->summaryview);
1001 * Delete current/selected(s) message(s)
1003 static void toolbar_trash_cb(GtkWidget *widget, gpointer data)
1005 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1006 MainWindow *mainwin;
1008 g_return_if_fail(toolbar_item != NULL);
1009 g_return_if_fail(toolbar_item->parent);
1011 switch (toolbar_item->type) {
1012 case TOOLBAR_MSGVIEW:
1013 messageview_delete((MessageView *)toolbar_item->parent);
1016 mainwin = (MainWindow *)toolbar_item->parent;
1017 summary_delete_trash(mainwin->summaryview);
1020 debug_print("toolbar event not supported\n");
1026 * Delete current/selected(s) message(s)
1028 static void toolbar_delete_cb(GtkWidget *widget, gpointer data)
1030 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1031 MainWindow *mainwin;
1033 g_return_if_fail(toolbar_item != NULL);
1034 g_return_if_fail(toolbar_item->parent);
1036 switch (toolbar_item->type) {
1037 case TOOLBAR_MSGVIEW:
1038 messageview_delete((MessageView *)toolbar_item->parent);
1041 mainwin = (MainWindow *)toolbar_item->parent;
1042 summary_delete(mainwin->summaryview);
1045 debug_print("toolbar event not supported\n");
1052 * Compose new message
1054 static void toolbar_compose_cb(GtkWidget *widget, gpointer data)
1056 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1057 MainWindow *mainwin;
1058 MessageView *msgview;
1060 g_return_if_fail(toolbar_item != NULL);
1062 switch (toolbar_item->type) {
1064 mainwin = (MainWindow*)toolbar_item->parent;
1065 if (mainwin->toolbar->compose_btn_type == COMPOSEBUTTON_NEWS)
1066 compose_news_cb(mainwin, 0, NULL);
1068 compose_mail_cb(mainwin, 0, NULL);
1070 case TOOLBAR_MSGVIEW:
1071 msgview = (MessageView*)toolbar_item->parent;
1072 compose_new_with_folderitem(NULL,
1073 msgview->msginfo->folder, NULL);
1076 debug_print("toolbar event not supported\n");
1080 static void toolbar_learn(gpointer data, guint as_spam)
1082 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1083 MainWindow *mainwin;
1084 MessageView *msgview;
1086 g_return_if_fail(toolbar_item != NULL);
1088 switch (toolbar_item->type) {
1090 mainwin = (MainWindow*)toolbar_item->parent;
1092 mainwindow_learn(mainwin, TRUE);
1094 mainwindow_learn(mainwin, FALSE);
1096 case TOOLBAR_MSGVIEW:
1097 msgview = (MessageView*)toolbar_item->parent;
1099 messageview_learn(msgview, TRUE);
1101 messageview_learn(msgview, FALSE);
1104 debug_print("toolbar event not supported\n");
1108 static void toolbar_learn_cb(GtkWidget *widget, gpointer data)
1110 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1111 MainWindow *mainwin;
1112 MessageView *msgview;
1114 g_return_if_fail(toolbar_item != NULL);
1116 switch (toolbar_item->type) {
1118 mainwin = (MainWindow*)toolbar_item->parent;
1119 if (mainwin->toolbar->learn_btn_type == LEARN_SPAM)
1120 mainwindow_learn(mainwin, TRUE);
1122 mainwindow_learn(mainwin, FALSE);
1124 case TOOLBAR_MSGVIEW:
1125 msgview = (MessageView*)toolbar_item->parent;
1126 if (msgview->toolbar->learn_btn_type == LEARN_SPAM)
1127 messageview_learn(msgview, TRUE);
1129 messageview_learn(msgview, FALSE);
1132 debug_print("toolbar event not supported\n");
1140 static void toolbar_reply_cb(GtkWidget *widget, gpointer data)
1142 toolbar_reply(data, prefs_common.reply_with_quote ?
1143 COMPOSE_REPLY_WITH_QUOTE : COMPOSE_REPLY_WITHOUT_QUOTE);
1148 * Reply message to Sender and All recipients
1150 static void toolbar_reply_to_all_cb(GtkWidget *widget, gpointer data)
1153 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_ALL_WITH_QUOTE
1154 : COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE);
1159 * Reply to Mailing List
1161 static void toolbar_reply_to_list_cb(GtkWidget *widget, gpointer data)
1164 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_LIST_WITH_QUOTE
1165 : COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE);
1170 * Reply to sender of message
1172 static void toolbar_reply_to_sender_cb(GtkWidget *widget, gpointer data)
1175 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
1176 : COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE);
1182 static void toolbar_addrbook_cb(GtkWidget *widget, gpointer data)
1184 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1187 g_return_if_fail(toolbar_item != NULL);
1189 switch (toolbar_item->type) {
1191 case TOOLBAR_MSGVIEW:
1194 case TOOLBAR_COMPOSE:
1195 compose = (Compose *)toolbar_item->parent;
1200 addressbook_open(compose);
1205 * Forward current/selected(s) message(s)
1207 static void toolbar_forward_cb(GtkWidget *widget, gpointer data)
1209 toolbar_reply(data, COMPOSE_FORWARD);
1213 * Goto Prev Unread Message
1215 static void toolbar_prev_unread_cb(GtkWidget *widget, gpointer data)
1217 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1218 MainWindow *mainwin;
1219 MessageView *msgview;
1221 g_return_if_fail(toolbar_item != NULL);
1223 switch (toolbar_item->type) {
1225 mainwin = (MainWindow*)toolbar_item->parent;
1226 summary_select_prev_unread(mainwin->summaryview);
1229 case TOOLBAR_MSGVIEW:
1230 msgview = (MessageView*)toolbar_item->parent;
1231 msgview->updating = TRUE;
1232 summary_select_prev_unread(msgview->mainwin->summaryview);
1233 msgview->updating = FALSE;
1235 if (msgview->deferred_destroy) {
1236 debug_print("messageview got away!\n");
1237 messageview_destroy(msgview);
1241 /* Now we need to update the messageview window */
1242 if (msgview->mainwin->summaryview->selected) {
1244 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1247 messageview_show(msgview, msginfo,
1248 msgview->all_headers);
1251 gtk_widget_destroy(msgview->window);
1255 debug_print("toolbar event not supported\n");
1260 * Goto Next Unread Message
1262 static void toolbar_next_unread_cb(GtkWidget *widget, gpointer data)
1264 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1265 MainWindow *mainwin;
1266 MessageView *msgview;
1268 g_return_if_fail(toolbar_item != NULL);
1270 switch (toolbar_item->type) {
1272 mainwin = (MainWindow*)toolbar_item->parent;
1273 summary_select_next_unread(mainwin->summaryview);
1276 case TOOLBAR_MSGVIEW:
1277 msgview = (MessageView*)toolbar_item->parent;
1278 msgview->updating = TRUE;
1279 summary_select_next_unread(msgview->mainwin->summaryview);
1280 msgview->updating = FALSE;
1282 if (msgview->deferred_destroy) {
1283 debug_print("messageview got away!\n");
1284 messageview_destroy(msgview);
1288 /* Now we need to update the messageview window */
1289 if (msgview->mainwin->summaryview->selected) {
1291 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1294 messageview_show(msgview, msginfo,
1295 msgview->all_headers);
1298 gtk_widget_destroy(msgview->window);
1302 debug_print("toolbar event not supported\n");
1306 static void toolbar_ignore_thread_cb(GtkWidget *widget, gpointer data)
1308 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1309 MainWindow *mainwin;
1311 g_return_if_fail(toolbar_item != NULL);
1313 switch (toolbar_item->type) {
1315 mainwin = (MainWindow *) toolbar_item->parent;
1316 summary_toggle_ignore_thread(mainwin->summaryview);
1318 case TOOLBAR_MSGVIEW:
1319 /* TODO: see toolbar_next_unread_cb() if you need
1320 * this in the message view */
1323 debug_print("toolbar event not supported\n");
1328 static void toolbar_cancel_inc_cb(GtkWidget *widget, gpointer data)
1330 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1332 g_return_if_fail(toolbar_item != NULL);
1338 static void toolbar_print_cb(GtkWidget *widget, gpointer data)
1340 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1341 MainWindow *mainwin;
1343 g_return_if_fail(toolbar_item != NULL);
1345 switch (toolbar_item->type) {
1347 mainwin = (MainWindow *) toolbar_item->parent;
1348 summary_print(mainwin->summaryview);
1350 case TOOLBAR_MSGVIEW:
1351 /* TODO: see toolbar_next_unread_cb() if you need
1352 * this in the message view */
1355 debug_print("toolbar event not supported\n");
1360 static void toolbar_send_cb(GtkWidget *widget, gpointer data)
1362 compose_toolbar_cb(A_SEND, data);
1365 static void toolbar_send_later_cb(GtkWidget *widget, gpointer data)
1367 compose_toolbar_cb(A_SENDL, data);
1370 static void toolbar_draft_cb(GtkWidget *widget, gpointer data)
1372 compose_toolbar_cb(A_DRAFT, data);
1375 static void toolbar_close_cb(GtkWidget *widget, gpointer data)
1377 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1378 MainWindow *mainwin;
1379 MessageView *messageview;
1382 g_return_if_fail(toolbar_item != NULL);
1384 switch (toolbar_item->type) {
1386 mainwin = (MainWindow *) toolbar_item->parent;
1387 app_will_exit(NULL, mainwin);
1389 case TOOLBAR_MSGVIEW:
1390 messageview = (MessageView *)toolbar_item->parent;
1391 messageview_destroy(messageview);
1393 case TOOLBAR_COMPOSE:
1394 compose = (Compose *)toolbar_item->parent;
1395 compose_close_toolbar(compose);
1400 static void toolbar_open_mail_cb(GtkWidget *widget, gpointer data)
1402 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1403 MainWindow *mainwin;
1405 g_return_if_fail(toolbar_item != NULL);
1407 switch (toolbar_item->type) {
1409 mainwin = (MainWindow *) toolbar_item->parent;
1410 summary_open_row(NULL, mainwin->summaryview);
1412 case TOOLBAR_MSGVIEW:
1413 debug_print("toolbar event not supported\n");
1415 case TOOLBAR_COMPOSE:
1416 debug_print("toolbar event not supported\n");
1421 static void toolbar_insert_cb(GtkWidget *widget, gpointer data)
1423 compose_toolbar_cb(A_INSERT, data);
1426 static void toolbar_attach_cb(GtkWidget *widget, gpointer data)
1428 compose_toolbar_cb(A_ATTACH, data);
1431 static void toolbar_sig_cb(GtkWidget *widget, gpointer data)
1433 compose_toolbar_cb(A_SIG, data);
1436 static void toolbar_ext_editor_cb(GtkWidget *widget, gpointer data)
1438 compose_toolbar_cb(A_EXTEDITOR, data);
1441 static void toolbar_linewrap_current_cb(GtkWidget *widget, gpointer data)
1443 compose_toolbar_cb(A_LINEWRAP_CURRENT, data);
1446 static void toolbar_linewrap_all_cb(GtkWidget *widget, gpointer data)
1448 compose_toolbar_cb(A_LINEWRAP_ALL, data);
1452 static void toolbar_check_spelling_cb(GtkWidget *widget, gpointer data)
1454 compose_toolbar_cb(A_CHECK_SPELLING, data);
1458 * Execute actions from toolbar
1460 static void toolbar_actions_execute_cb(GtkWidget *widget, gpointer data)
1462 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1463 GSList *action_list;
1464 MainWindow *mainwin;
1466 MessageView *msgview;
1467 gpointer parent = toolbar_item->parent;
1469 g_return_if_fail(toolbar_item != NULL);
1471 switch (toolbar_item->type) {
1473 mainwin = (MainWindow*)parent;
1474 action_list = mainwin->toolbar->action_list;
1476 case TOOLBAR_COMPOSE:
1477 compose = (Compose*)parent;
1478 action_list = compose->toolbar->action_list;
1480 case TOOLBAR_MSGVIEW:
1481 msgview = (MessageView*)parent;
1482 action_list = msgview->toolbar->action_list;
1485 debug_print("toolbar event not supported\n");
1488 toolbar_action_execute(widget, action_list, parent, toolbar_item->type);
1491 static MainWindow *get_mainwin(gpointer data)
1493 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1494 MainWindow *mainwin = NULL;
1495 MessageView *msgview;
1497 g_return_val_if_fail(toolbar_item != NULL, NULL);
1499 switch(toolbar_item->type) {
1501 mainwin = (MainWindow*)toolbar_item->parent;
1503 case TOOLBAR_MSGVIEW:
1504 msgview = (MessageView*)toolbar_item->parent;
1505 mainwin = (MainWindow*)msgview->mainwin;
1514 static void toolbar_go_folders_cb(GtkWidget *widget, gpointer data)
1516 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1517 MainWindow *mainwin = NULL;
1518 switch(toolbar_item->type) {
1520 mainwin = (MainWindow*)toolbar_item->parent;
1523 g_warning("wrong toolbar type\n");
1527 if (!mainwin->in_folder) {
1528 FolderItem *item = folderview_get_selected_item(mainwin->folderview);
1530 folderview_select(mainwin->folderview, item);
1533 gtk_widget_grab_focus(mainwin->folderview->ctree);
1534 mainwindow_exit_folder(mainwin);
1538 static void toolbar_buttons_cb(GtkWidget *widget,
1545 void (*func)(GtkWidget *widget, gpointer data);
1547 { A_RECEIVE_ALL, toolbar_inc_all_cb },
1548 { A_RECEIVE_CUR, toolbar_inc_cb },
1549 { A_SEND_QUEUED, toolbar_send_queued_cb },
1550 { A_COMPOSE_EMAIL, toolbar_compose_cb },
1551 { A_COMPOSE_NEWS, toolbar_compose_cb },
1552 { A_REPLY_MESSAGE, toolbar_reply_cb },
1553 { A_REPLY_SENDER, toolbar_reply_to_sender_cb },
1554 { A_REPLY_ALL, toolbar_reply_to_all_cb },
1555 { A_REPLY_ML, toolbar_reply_to_list_cb },
1556 { A_FORWARD, toolbar_forward_cb },
1557 { A_TRASH, toolbar_trash_cb },
1558 { A_DELETE_REAL, toolbar_delete_cb },
1559 { A_EXECUTE, toolbar_exec_cb },
1560 { A_GOTO_PREV, toolbar_prev_unread_cb },
1561 { A_GOTO_NEXT, toolbar_next_unread_cb },
1562 { A_IGNORE_THREAD, toolbar_ignore_thread_cb },
1563 { A_PRINT, toolbar_print_cb },
1564 { A_LEARN_SPAM, toolbar_learn_cb },
1565 { A_GO_FOLDERS, toolbar_go_folders_cb },
1567 { A_SEND, toolbar_send_cb },
1568 { A_SENDL, toolbar_send_later_cb },
1569 { A_DRAFT, toolbar_draft_cb },
1570 { A_OPEN_MAIL, toolbar_open_mail_cb },
1571 { A_CLOSE, toolbar_close_cb },
1572 { A_INSERT, toolbar_insert_cb },
1573 { A_ATTACH, toolbar_attach_cb },
1574 { A_SIG, toolbar_sig_cb },
1575 { A_EXTEDITOR, toolbar_ext_editor_cb },
1576 { A_LINEWRAP_CURRENT, toolbar_linewrap_current_cb },
1577 { A_LINEWRAP_ALL, toolbar_linewrap_all_cb },
1578 { A_ADDRBOOK, toolbar_addrbook_cb },
1580 { A_CHECK_SPELLING, toolbar_check_spelling_cb },
1582 { A_SYL_ACTIONS, toolbar_actions_execute_cb },
1583 { A_CANCEL_INC, toolbar_cancel_inc_cb }
1586 num_items = sizeof(callbacks)/sizeof(callbacks[0]);
1588 for (i = 0; i < num_items; i++) {
1589 if (callbacks[i].index == item->index) {
1590 callbacks[i].func(widget, item);
1596 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
1597 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
1598 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1599 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1600 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1601 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1602 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLTIPS(toolbar_tips), \
1606 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
1607 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
1608 GList *gchild = NULL; \
1609 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
1610 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1611 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1612 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1613 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1614 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLTIPS(toolbar_tips), \
1616 gtk_menu_tool_button_set_arrow_tooltip(GTK_MENU_TOOL_BUTTON(item), \
1617 GTK_TOOLTIPS(toolbar_tips), menutip, NULL); \
1618 child = gtk_bin_get_child(GTK_BIN(item)); \
1619 gchild = gtk_container_get_children( \
1620 GTK_CONTAINER(child)); \
1621 btn = (GtkWidget *)gchild->data; \
1622 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
1623 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
1624 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
1627 #define MAKE_MENU(entries,path,btn) { \
1628 n_menu_entries = sizeof(entries) / \
1629 sizeof(entries[0]); \
1630 menu = menu_create_items(entries, n_menu_entries, path, &factory, toolbar_item); \
1631 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(btn), menu); \
1635 * Create a new toolbar with specified type
1636 * if a callback list is passed it will be used before the
1637 * common callback list
1639 Toolbar *toolbar_create(ToolbarType type,
1640 GtkWidget *container,
1643 ToolbarItem *toolbar_item;
1646 GtkWidget *icon_wid = NULL;
1647 GtkWidget *icon_news;
1648 GtkWidget *icon_ham;
1651 guint n_menu_entries;
1652 GtkItemFactory *factory;
1653 GtkTooltips *toolbar_tips;
1654 ToolbarSylpheedActions *action_item;
1656 GSList *toolbar_list;
1657 Toolbar *toolbar_data;
1660 toolbar_tips = gtk_tooltips_new();
1662 toolbar_read_config_file(type);
1663 toolbar_list = toolbar_get_list(type);
1665 toolbar_data = g_new0(Toolbar, 1);
1667 toolbar = gtk_toolbar_new();
1669 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1670 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
1671 gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar), TRUE);
1673 for (cur = toolbar_list; cur != NULL; cur = cur->next) {
1675 if (g_ascii_strcasecmp(((ToolbarItem*)cur->data)->file, TOOLBAR_TAG_SEPARATOR) == 0) {
1676 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new(), -1);
1680 toolbar_item = g_new0(ToolbarItem, 1);
1681 toolbar_item->index = ((ToolbarItem*)cur->data)->index;
1682 toolbar_item->file = g_strdup(((ToolbarItem*)cur->data)->file);
1683 toolbar_item->text = g_strdup(((ToolbarItem*)cur->data)->text);
1684 toolbar_item->parent = data;
1685 toolbar_item->type = type;
1687 /* collect toolbar items in list to keep track */
1688 toolbar_data->item_list =
1689 g_slist_append(toolbar_data->item_list,
1691 icon_wid = stock_pixmap_widget(container, stock_pixmap_get_icon(toolbar_item->file));
1693 switch (toolbar_item->index) {
1696 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to folder list"));
1697 toolbar_data->folders_btn = item;
1700 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1701 _("Receive Mail on all Accounts"),
1702 _("Receive Mail on selected Account"));
1703 toolbar_data->getall_btn = item;
1706 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text, _("Receive Mail on current Account"));
1707 toolbar_data->get_btn = item;
1710 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Queued Messages"));
1711 toolbar_data->send_btn = item;
1714 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Close window"));
1715 toolbar_data->close_window_btn = item;
1718 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Open email"));
1719 toolbar_data->open_mail_btn = item;
1721 case A_COMPOSE_EMAIL:
1723 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1725 _("Compose with selected Account"));
1726 toolbar_data->compose_mail_btn = item;
1727 toolbar_data->compose_mail_icon = icon_wid;
1728 g_object_ref(toolbar_data->compose_mail_icon);
1730 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1731 toolbar_data->compose_news_icon = icon_news;
1732 g_object_ref(toolbar_data->compose_news_icon);
1734 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1735 _("Compose Email"));
1736 toolbar_data->compose_mail_btn = item;
1737 toolbar_data->compose_mail_icon = icon_wid;
1739 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1740 toolbar_data->compose_news_icon = icon_news;
1744 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1747 toolbar_data->learn_spam_btn = item;
1748 toolbar_data->learn_spam_icon = icon_wid;
1749 g_object_ref(toolbar_data->learn_spam_icon);
1751 icon_ham = stock_pixmap_widget(container, STOCK_PIXMAP_HAM_BTN);
1752 toolbar_data->learn_ham_icon = icon_ham;
1753 g_object_ref(toolbar_data->learn_ham_icon);
1755 MAKE_MENU(learn_entries,"<LearnSpam>",toolbar_data->learn_spam_btn);
1757 case A_REPLY_MESSAGE:
1759 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1760 _("Reply to Message"),
1761 _("Reply to Message options"));
1762 toolbar_data->reply_btn = item;
1764 MAKE_MENU(reply_entries,"<Reply>",toolbar_data->reply_btn);
1766 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1767 _("Reply to Message"));
1768 toolbar_data->reply_btn = item;
1771 case A_REPLY_SENDER:
1773 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1774 _("Reply to Sender"),
1775 _("Reply to Sender options"));
1776 toolbar_data->replysender_btn = item;
1778 MAKE_MENU(replysender_entries,"<ReplySender>",toolbar_data->replysender_btn);
1780 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1781 _("Reply to Sender"));
1782 toolbar_data->replysender_btn = item;
1787 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1789 _("Reply to All options"));
1790 toolbar_data->replyall_btn = item;
1792 MAKE_MENU(replyall_entries,"<ReplyAll>",toolbar_data->replyall_btn);
1794 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1796 toolbar_data->replyall_btn = item;
1801 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1802 _("Reply to Mailing-list"),
1803 _("Reply to Mailing-list options"));
1804 toolbar_data->replylist_btn = item;
1806 MAKE_MENU(replylist_entries,"<ReplyList>",toolbar_data->replylist_btn);
1808 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1809 _("Reply to Mailing-list"));
1810 toolbar_data->replylist_btn = item;
1815 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1816 _("Forward Message"),
1817 _("Forward Message options"));
1818 toolbar_data->fwd_btn = item;
1820 MAKE_MENU(forward_entries,"<Forward>",toolbar_data->fwd_btn);
1822 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1823 _("Forward Message"));
1824 toolbar_data->fwd_btn = item;
1828 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Trash Message"));
1829 toolbar_data->trash_btn = item;
1832 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Delete Message"));
1833 toolbar_data->delete_btn = item;
1836 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Execute"));
1837 toolbar_data->exec_btn = item;
1840 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Previous Unread Message"));
1841 toolbar_data->prev_btn = item;
1844 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Next Unread Message"));
1845 toolbar_data->next_btn = item;
1848 /* Compose Toolbar */
1850 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Message"));
1851 toolbar_data->send_btn = item;
1854 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Put into queue folder and send later"));
1855 toolbar_data->sendl_btn = item;
1858 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Save to draft folder"));
1859 toolbar_data->draft_btn = item;
1862 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert file"));
1863 toolbar_data->insert_btn = item;
1866 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Attach file"));
1867 toolbar_data->attach_btn = item;
1870 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert signature"));
1871 toolbar_data->sig_btn = item;
1874 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Edit with external editor"));
1875 toolbar_data->exteditor_btn = item;
1877 case A_LINEWRAP_CURRENT:
1878 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap long lines of current paragraph"));
1879 toolbar_data->linewrap_current_btn = item;
1881 case A_LINEWRAP_ALL:
1882 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap all long lines"));
1883 toolbar_data->linewrap_all_btn = item;
1886 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Address book"));
1887 toolbar_data->addrbook_btn = item;
1890 case A_CHECK_SPELLING:
1891 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Check spelling"));
1892 toolbar_data->spellcheck_btn = item;
1897 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,toolbar_item->text);
1898 action_item = g_new0(ToolbarSylpheedActions, 1);
1899 action_item->widget = item;
1900 action_item->name = g_strdup(toolbar_item->text);
1902 toolbar_data->action_list =
1903 g_slist_append(toolbar_data->action_list,
1907 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Cancel receiving"));
1908 toolbar_data->cancel_inc_btn = item;
1911 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1912 toolbar_ret_descr_from_val(toolbar_item->index));
1913 /* find and set the tool tip text */
1918 toolbar_data->toolbar = toolbar;
1919 toolbar_data->tooltips = toolbar_tips;
1920 gtk_widget_show_all(toolbar);
1922 if (type == TOOLBAR_MAIN) {
1924 MainWindow *mainwin = mainwindow_get_mainwindow();
1925 GtkWidget *progressbar = gtk_progress_bar_new();
1926 item = gtk_tool_item_new();
1927 gtk_container_add (GTK_CONTAINER (item), progressbar);
1928 gtk_widget_show(item);
1929 gtk_widget_show(progressbar);
1930 gtk_widget_set_size_request(progressbar, 70, -1);
1931 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1932 mainwin->progressbar = progressbar;
1934 activate_compose_button(toolbar_data,
1935 prefs_common.toolbar_style,
1936 toolbar_data->compose_btn_type);
1938 if (type != TOOLBAR_COMPOSE)
1939 activate_learn_button(toolbar_data, prefs_common.toolbar_style,
1943 gtk_container_add(GTK_CONTAINER(container), toolbar);
1944 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
1946 if ( GTK_IS_WINDOW(container) ) {
1947 hildon_window_add_toolbar (HILDON_WINDOW(container), GTK_TOOLBAR(toolbar));
1948 gtk_widget_show_all (container);
1950 gtk_container_add(GTK_CONTAINER(container), toolbar);
1951 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
1954 return toolbar_data;
1958 * Free toolbar structures
1960 void toolbar_destroy(Toolbar * toolbar) {
1962 TOOLBAR_DESTROY_ITEMS(toolbar->item_list);
1963 TOOLBAR_DESTROY_ACTIONS(toolbar->action_list);
1966 void toolbar_update(ToolbarType type, gpointer data)
1968 Toolbar *toolbar_data;
1969 GtkWidget *handlebox;
1970 MainWindow *mainwin = (MainWindow*)data;
1971 Compose *compose = (Compose*)data;
1972 MessageView *msgview = (MessageView*)data;
1977 toolbar_data = mainwin->toolbar;
1978 handlebox = mainwin->handlebox;
1980 case TOOLBAR_COMPOSE:
1981 toolbar_data = compose->toolbar;
1982 handlebox = compose->handlebox;
1984 case TOOLBAR_MSGVIEW:
1985 toolbar_data = msgview->toolbar;
1986 handlebox = msgview->handlebox;
1992 gtk_container_remove(GTK_CONTAINER(handlebox),
1993 GTK_WIDGET(toolbar_data->toolbar));
1995 toolbar_init(toolbar_data);
1996 toolbar_data = toolbar_create(type, handlebox, data);
2000 toolbar_data = mainwin->toolbar;
2001 handlebox = mainwin->window;
2003 case TOOLBAR_COMPOSE:
2004 toolbar_data = compose->toolbar;
2005 handlebox = compose->window;
2007 case TOOLBAR_MSGVIEW:
2008 toolbar_data = msgview->toolbar;
2009 handlebox = msgview->window;
2015 hildon_window_remove_toolbar(HILDON_WINDOW(handlebox), GTK_WIDGET(toolbar_data->toolbar));
2017 toolbar_init(toolbar_data);
2018 toolbar_data = toolbar_create(type, handlebox, data);
2023 mainwin->toolbar = toolbar_data;
2025 case TOOLBAR_COMPOSE:
2026 compose->toolbar = toolbar_data;
2028 case TOOLBAR_MSGVIEW:
2029 msgview->toolbar = toolbar_data;
2033 toolbar_style(type, prefs_common.toolbar_style, data);
2035 if (type == TOOLBAR_MAIN) {
2036 toolbar_main_set_sensitive((MainWindow*)data);
2037 account_set_menu_only_toolbar();
2041 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
2042 gboolean in_btn1 = FALSE, in_btn2 = FALSE; \
2043 if (GTK_IS_BUTTON(widget)) \
2044 in_btn1 = GTK_BUTTON(widget)->in_button; \
2045 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2046 GtkWidget *child = gtk_bin_get_child( \
2048 GList *gchild = gtk_container_get_children( \
2049 GTK_CONTAINER(child)); \
2050 GtkWidget *btn = (GtkWidget *)gchild->data; \
2051 GtkWidget *arr = (GtkWidget *) \
2052 (gchild->next?gchild->next->data:NULL); \
2053 if (GTK_IS_BUTTON(btn)) \
2054 in_btn1 = GTK_BUTTON(btn)->in_button; \
2055 if (GTK_IS_BUTTON(arr)) \
2056 in_btn2 = GTK_BUTTON(arr)->in_button; \
2058 else if (GTK_IS_TOOL_ITEM(widget)) { \
2059 GtkWidget *child = gtk_bin_get_child( \
2061 if (GTK_IS_BUTTON(child)) \
2062 in_btn1 = GTK_BUTTON(child)->in_button; \
2064 gtk_widget_set_sensitive(widget, sensitive); \
2065 if (GTK_IS_BUTTON(widget)) \
2066 GTK_BUTTON(widget)->in_button = in_btn1; \
2067 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2068 GtkWidget *child = gtk_bin_get_child( \
2070 GList *gchild = gtk_container_get_children( \
2071 GTK_CONTAINER(child)); \
2072 GtkWidget *btn = (GtkWidget *)gchild->data; \
2073 GtkWidget *arr = (GtkWidget *) \
2074 (gchild->next?gchild->next->data:NULL); \
2075 if (GTK_IS_BUTTON(btn)) \
2076 GTK_BUTTON(btn)->in_button = in_btn1; \
2077 if (GTK_IS_BUTTON(arr)) \
2078 GTK_BUTTON(arr)->in_button = in_btn2; \
2080 else if (GTK_IS_TOOL_ITEM(widget)) { \
2081 GtkWidget *child = gtk_bin_get_child( \
2083 if (GTK_IS_BUTTON(child)) \
2084 GTK_BUTTON(child)->in_button = in_btn1; \
2088 void toolbar_main_set_sensitive(gpointer data)
2090 SensitiveCond state;
2092 MainWindow *mainwin = (MainWindow*)data;
2093 Toolbar *toolbar = mainwin->toolbar;
2095 GSList *entry_list = NULL;
2097 typedef struct _Entry Entry;
2104 #define SET_WIDGET_COND(w, c) \
2106 Entry *e = g_new0(Entry, 1); \
2109 entry_list = g_slist_append(entry_list, e); \
2113 if (toolbar->get_btn)
2114 SET_WIDGET_COND(toolbar->get_btn,
2115 M_HAVE_ACCOUNT|M_UNLOCKED);
2117 if (toolbar->getall_btn) {
2118 SET_WIDGET_COND(toolbar->getall_btn,
2119 M_HAVE_ACCOUNT|M_UNLOCKED);
2121 if (toolbar->send_btn) {
2122 SET_WIDGET_COND(toolbar->send_btn,
2123 M_HAVE_QUEUED_MAILS);
2125 if (toolbar->compose_mail_btn) {
2126 SET_WIDGET_COND(toolbar->compose_mail_btn,
2129 if (toolbar->close_window_btn) {
2130 SET_WIDGET_COND(toolbar->close_window_btn,
2133 if (toolbar->open_mail_btn) {
2134 SET_WIDGET_COND(toolbar->open_mail_btn,
2137 if (toolbar->reply_btn) {
2138 SET_WIDGET_COND(toolbar->reply_btn,
2139 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2141 if (toolbar->replyall_btn) {
2142 SET_WIDGET_COND(toolbar->replyall_btn,
2143 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2145 if (toolbar->replylist_btn) {
2146 SET_WIDGET_COND(toolbar->replylist_btn,
2147 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2149 if (toolbar->replysender_btn) {
2150 SET_WIDGET_COND(toolbar->replysender_btn,
2151 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2153 if (toolbar->fwd_btn) {
2154 SET_WIDGET_COND(toolbar->fwd_btn,
2155 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2158 if (prefs_common.next_unread_msg_dialog == NEXTUNREADMSGDIALOG_ASSUME_NO) {
2159 SET_WIDGET_COND(toolbar->next_btn, M_MSG_EXIST);
2161 SET_WIDGET_COND(toolbar->next_btn, 0);
2164 if (toolbar->trash_btn)
2165 SET_WIDGET_COND(toolbar->trash_btn,
2166 M_TARGET_EXIST|M_ALLOW_DELETE);
2168 if (toolbar->delete_btn)
2169 SET_WIDGET_COND(toolbar->delete_btn,
2170 M_TARGET_EXIST|M_ALLOW_DELETE);
2172 if (toolbar->exec_btn)
2173 SET_WIDGET_COND(toolbar->exec_btn,
2176 /* if (toolbar->learn_ham_btn)
2177 SET_WIDGET_COND(toolbar->learn_ham_btn,
2178 M_TARGET_EXIST|M_CAN_LEARN_SPAM);
2180 if (toolbar->learn_spam_btn)
2181 SET_WIDGET_COND(toolbar->learn_spam_btn,
2182 M_TARGET_EXIST|M_CAN_LEARN_SPAM);
2184 if (toolbar->cancel_inc_btn)
2185 SET_WIDGET_COND(toolbar->cancel_inc_btn,
2188 for (cur = toolbar->action_list; cur != NULL; cur = cur->next) {
2189 ToolbarSylpheedActions *act = (ToolbarSylpheedActions*)cur->data;
2191 SET_WIDGET_COND(act->widget, M_TARGET_EXIST|M_UNLOCKED);
2194 #undef SET_WIDGET_COND
2196 state = main_window_get_current_state(mainwin);
2198 for (cur = entry_list; cur != NULL; cur = cur->next) {
2199 Entry *e = (Entry*) cur->data;
2201 if (e->widget != NULL) {
2202 sensitive = ((e->cond & state) == e->cond);
2203 GTK_BUTTON_SET_SENSITIVE(e->widget, sensitive);
2207 while (entry_list != NULL) {
2208 Entry *e = (Entry*) entry_list->data;
2211 entry_list = g_slist_remove(entry_list, e);
2214 g_slist_free(entry_list);
2216 activate_compose_button(toolbar,
2217 prefs_common.toolbar_style,
2218 toolbar->compose_btn_type);
2222 void toolbar_comp_set_sensitive(gpointer data, gboolean sensitive)
2224 Compose *compose = (Compose*)data;
2225 GSList *items = compose->toolbar->action_list;
2227 if (compose->toolbar->send_btn)
2228 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->send_btn, sensitive);
2229 if (compose->toolbar->sendl_btn)
2230 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sendl_btn, sensitive);
2231 if (compose->toolbar->draft_btn )
2232 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->draft_btn , sensitive);
2233 if (compose->toolbar->insert_btn )
2234 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->insert_btn , sensitive);
2235 if (compose->toolbar->attach_btn)
2236 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->attach_btn, sensitive);
2237 if (compose->toolbar->sig_btn)
2238 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sig_btn, sensitive);
2239 if (compose->toolbar->exteditor_btn)
2240 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->exteditor_btn, sensitive);
2241 if (compose->toolbar->linewrap_current_btn)
2242 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_current_btn, sensitive);
2243 if (compose->toolbar->linewrap_all_btn)
2244 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_all_btn, sensitive);
2245 if (compose->toolbar->addrbook_btn)
2246 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->addrbook_btn, sensitive);
2248 if (compose->toolbar->spellcheck_btn)
2249 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->spellcheck_btn, sensitive);
2251 for (; items != NULL; items = g_slist_next(items)) {
2252 ToolbarSylpheedActions *item = (ToolbarSylpheedActions *)items->data;
2253 GTK_BUTTON_SET_SENSITIVE(item->widget, sensitive);
2258 * Initialize toolbar structure
2260 void toolbar_init(Toolbar * toolbar) {
2262 toolbar->toolbar = NULL;
2263 toolbar->folders_btn = NULL;
2264 toolbar->get_btn = NULL;
2265 toolbar->getall_btn = NULL;
2266 toolbar->send_btn = NULL;
2267 toolbar->compose_mail_btn = NULL;
2268 toolbar->compose_mail_icon = NULL;
2269 toolbar->compose_news_icon = NULL;
2270 toolbar->reply_btn = NULL;
2271 toolbar->replysender_btn = NULL;
2272 toolbar->replyall_btn = NULL;
2273 toolbar->replylist_btn = NULL;
2274 toolbar->fwd_btn = NULL;
2275 toolbar->trash_btn = NULL;
2276 toolbar->delete_btn = NULL;
2277 toolbar->prev_btn = NULL;
2278 toolbar->next_btn = NULL;
2279 toolbar->exec_btn = NULL;
2280 toolbar->open_mail_btn = NULL;
2281 toolbar->close_window_btn = NULL;
2282 /* compose buttons */
2283 toolbar->sendl_btn = NULL;
2284 toolbar->draft_btn = NULL;
2285 toolbar->insert_btn = NULL;
2286 toolbar->attach_btn = NULL;
2287 toolbar->sig_btn = NULL;
2288 toolbar->exteditor_btn = NULL;
2289 toolbar->linewrap_current_btn = NULL;
2290 toolbar->linewrap_all_btn = NULL;
2291 toolbar->addrbook_btn = NULL;
2293 toolbar->spellcheck_btn = NULL;
2296 toolbar_destroy(toolbar);
2301 static void toolbar_reply(gpointer data, guint action)
2303 ToolbarItem *toolbar_item = (ToolbarItem*)data;
2304 MainWindow *mainwin;
2305 MessageView *msgview;
2306 GSList *msginfo_list = NULL;
2308 g_return_if_fail(toolbar_item != NULL);
2310 switch (toolbar_item->type) {
2312 mainwin = (MainWindow*)toolbar_item->parent;
2313 msginfo_list = summary_get_selection(mainwin->summaryview);
2314 msgview = (MessageView*)mainwin->messageview;
2316 case TOOLBAR_MSGVIEW:
2317 msgview = (MessageView*)toolbar_item->parent;
2318 g_return_if_fail(msgview != NULL);
2319 msginfo_list = g_slist_append(msginfo_list, msgview->msginfo);
2325 g_return_if_fail(msgview != NULL);
2326 g_return_if_fail(msginfo_list != NULL);
2327 compose_reply_from_messageview(msgview, msginfo_list, action);
2328 g_slist_free(msginfo_list);
2330 /* TODO: update reply state ion summaryview */
2334 /* exported functions */
2336 void inc_mail_cb(gpointer data, guint action, GtkWidget *widget)
2338 MainWindow *mainwin = (MainWindow*)data;
2340 inc_mail(mainwin, prefs_common.newmail_notify_manu);
2343 void inc_all_account_mail_cb(gpointer data, guint action, GtkWidget *widget)
2345 MainWindow *mainwin = (MainWindow*)data;
2347 inc_all_account_mail(mainwin, FALSE, prefs_common.newmail_notify_manu);
2350 void send_queue_cb(gpointer data, guint action, GtkWidget *widget)
2354 gboolean got_error = FALSE;
2355 gchar *errstr = NULL;
2357 if (prefs_common.work_offline)
2358 if (alertpanel(_("Offline warning"),
2359 _("You're working offline. Override?"),
2360 GTK_STOCK_NO, GTK_STOCK_YES,
2361 NULL) != G_ALERTALTERNATE)
2364 /* ask for confirmation before sending queued messages only
2365 in online mode and if there is at least one message queued
2366 in any of the folder queue
2368 if (prefs_common.confirm_send_queued_messages) {
2370 /* check if there's a queued message */
2371 for (list = folder_get_list(); !found && list != NULL; list = list->next) {
2372 Folder *folder = list->data;
2374 found = !procmsg_queue_is_empty(folder->queue);
2376 /* if necessary, ask for confirmation before sending */
2377 if (found && !prefs_common.work_offline) {
2378 if (alertpanel(_("Send queued messages"),
2379 _("Send all queued messages?"),
2380 GTK_STOCK_CANCEL, _("_Send"),
2381 NULL) != G_ALERTALTERNATE)
2386 for (list = folder_get_list(); list != NULL; list = list->next) {
2387 Folder *folder = list->data;
2389 if (folder->queue) {
2390 if (procmsg_send_queue(folder->queue,
2391 prefs_common.savemsg,
2398 alertpanel_error_log(_("Some errors occurred while "
2399 "sending queued messages."));
2401 gchar *tmp = g_strdup_printf(_("Some errors occurred "
2402 "while sending queued messages:\n%s"), errstr);
2404 alertpanel_error_log(tmp);
2410 void compose_mail_cb(gpointer data, guint action, GtkWidget *widget)
2412 MainWindow *mainwin = (MainWindow*)data;
2413 PrefsAccount *ac = NULL;
2414 FolderItem *item = mainwin->summaryview->folder_item;
2419 ac = account_find_from_item(item);
2420 if (ac && ac->protocol != A_NNTP) {
2421 compose_new_with_folderitem(ac, item, NULL); /* CLAWS */
2427 * CLAWS - use current account
2429 if (cur_account && (cur_account->protocol != A_NNTP)) {
2430 compose_new_with_folderitem(cur_account, item, NULL);
2435 * CLAWS - just get the first one
2437 list = account_get_list();
2438 for (cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2439 ac = (PrefsAccount *) cur->data;
2440 if (ac->protocol != A_NNTP) {
2441 compose_new_with_folderitem(ac, item, NULL);
2447 void compose_news_cb(gpointer data, guint action, GtkWidget *widget)
2449 MainWindow *mainwin = (MainWindow*)data;
2450 PrefsAccount * ac = NULL;
2454 if (mainwin->summaryview->folder_item) {
2455 ac = mainwin->summaryview->folder_item->folder->account;
2456 if (ac && ac->protocol == A_NNTP) {
2457 compose_new_with_folderitem(ac,
2458 mainwin->summaryview->folder_item, NULL);
2463 list = account_get_list();
2464 for(cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2465 ac = (PrefsAccount *) cur->data;
2466 if (ac->protocol == A_NNTP) {
2467 compose_new_with_folderitem(ac,
2468 mainwin->summaryview->folder_item, NULL);