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) || (!toolbar->compose_news_btn))
781 gtk_widget_hide(type == COMPOSEBUTTON_NEWS ? toolbar->compose_mail_btn
782 : toolbar->compose_news_btn);
783 gtk_widget_show_now(type == COMPOSEBUTTON_NEWS ? toolbar->compose_news_btn
784 : toolbar->compose_mail_btn);
785 toolbar->compose_btn_type = type;
786 gtk_widget_queue_resize(toolbar->toolbar);
787 gtk_widget_show_now(toolbar->toolbar);
791 void toolbar_set_compose_button(Toolbar *toolbar,
792 ComposeButtonType compose_btn_type)
794 if (toolbar->compose_btn_type != compose_btn_type)
795 activate_compose_button(toolbar,
796 prefs_common.toolbar_style,
800 static void activate_learn_button (Toolbar *toolbar,
802 LearnButtonType type)
804 if ((!toolbar->learn_spam_btn) || (!toolbar->learn_ham_btn))
807 gtk_widget_hide(type == LEARN_SPAM ? toolbar->learn_ham_btn
808 : toolbar->learn_spam_btn);
809 gtk_widget_show_now(type == LEARN_SPAM ? toolbar->learn_spam_btn
810 : toolbar->learn_ham_btn);
811 toolbar->learn_btn_type = type;
812 gtk_widget_queue_resize(toolbar->toolbar);
813 gtk_widget_show_now(toolbar->toolbar);
817 void toolbar_set_learn_button(Toolbar *toolbar,
818 LearnButtonType learn_btn_type)
820 if (toolbar->learn_btn_type != learn_btn_type)
821 activate_learn_button(toolbar,
822 prefs_common.toolbar_style,
826 void toolbar_toggle(guint action, gpointer data)
828 MainWindow *mainwin = (MainWindow*)data;
832 g_return_if_fail(mainwin != NULL);
834 toolbar_style(TOOLBAR_MAIN, action, mainwin);
836 list = compose_get_compose_list();
837 for (cur = list; cur != NULL; cur = cur->next) {
838 toolbar_style(TOOLBAR_COMPOSE, action, cur->data);
840 list = messageview_get_msgview_list();
841 for (cur = list; cur != NULL; cur = cur->next) {
842 toolbar_style(TOOLBAR_MSGVIEW, action, cur->data);
847 void toolbar_set_style(GtkWidget *toolbar_wid, GtkWidget *handlebox_wid, guint action)
849 switch ((ToolbarStyle)action) {
851 gtk_widget_hide(handlebox_wid);
854 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
858 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
862 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
865 case TOOLBAR_BOTH_HORIZ:
866 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
867 GTK_TOOLBAR_BOTH_HORIZ);
873 prefs_common.toolbar_style = (ToolbarStyle)action;
874 gtk_widget_set_size_request(handlebox_wid, 1, -1);
876 if (prefs_common.toolbar_style != TOOLBAR_NONE) {
877 gtk_widget_show(handlebox_wid);
878 gtk_widget_queue_resize(handlebox_wid);
882 * Change the style of toolbar
884 static void toolbar_style(ToolbarType type, guint action, gpointer data)
886 GtkWidget *handlebox_wid;
887 GtkWidget *toolbar_wid;
888 MainWindow *mainwin = (MainWindow*)data;
889 Compose *compose = (Compose*)data;
890 MessageView *msgview = (MessageView*)data;
892 g_return_if_fail(data != NULL);
896 handlebox_wid = mainwin->handlebox;
897 toolbar_wid = mainwin->toolbar->toolbar;
899 case TOOLBAR_COMPOSE:
900 handlebox_wid = compose->handlebox;
901 toolbar_wid = compose->toolbar->toolbar;
903 case TOOLBAR_MSGVIEW:
904 handlebox_wid = msgview->handlebox;
905 toolbar_wid = msgview->toolbar->toolbar;
911 toolbar_set_style(toolbar_wid, handlebox_wid, action);
914 /* Toolbar handling */
915 static void toolbar_inc_cb(GtkWidget *widget,
918 ToolbarItem *toolbar_item = (ToolbarItem*)data;
921 g_return_if_fail(toolbar_item != NULL);
923 switch (toolbar_item->type) {
925 mainwin = (MainWindow*)toolbar_item->parent;
926 inc_mail_cb(mainwin, 0, NULL);
933 static void toolbar_inc_all_cb(GtkWidget *widget,
936 ToolbarItem *toolbar_item = (ToolbarItem*)data;
939 g_return_if_fail(toolbar_item != NULL);
941 switch (toolbar_item->type) {
943 mainwin = (MainWindow*)toolbar_item->parent;
944 inc_all_account_mail_cb(mainwin, 0, NULL);
951 static void toolbar_send_queued_cb(GtkWidget *widget,gpointer data)
953 ToolbarItem *toolbar_item = (ToolbarItem*)data;
956 g_return_if_fail(toolbar_item != NULL);
958 switch (toolbar_item->type) {
960 mainwin = (MainWindow*)toolbar_item->parent;
961 send_queue_cb(mainwin, 0, NULL);
968 static void toolbar_exec_cb(GtkWidget *widget,
971 MainWindow *mainwin = get_mainwin(data);
973 g_return_if_fail(mainwin != NULL);
974 summary_execute(mainwin->summaryview);
978 * Delete current/selected(s) message(s)
980 static void toolbar_trash_cb(GtkWidget *widget, gpointer data)
982 ToolbarItem *toolbar_item = (ToolbarItem*)data;
985 g_return_if_fail(toolbar_item != NULL);
986 g_return_if_fail(toolbar_item->parent);
988 switch (toolbar_item->type) {
989 case TOOLBAR_MSGVIEW:
990 messageview_delete((MessageView *)toolbar_item->parent);
993 mainwin = (MainWindow *)toolbar_item->parent;
994 summary_delete_trash(mainwin->summaryview);
997 debug_print("toolbar event not supported\n");
1003 * Delete current/selected(s) message(s)
1005 static void toolbar_delete_cb(GtkWidget *widget, gpointer data)
1007 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1008 MainWindow *mainwin;
1010 g_return_if_fail(toolbar_item != NULL);
1011 g_return_if_fail(toolbar_item->parent);
1013 switch (toolbar_item->type) {
1014 case TOOLBAR_MSGVIEW:
1015 messageview_delete((MessageView *)toolbar_item->parent);
1018 mainwin = (MainWindow *)toolbar_item->parent;
1019 summary_delete(mainwin->summaryview);
1022 debug_print("toolbar event not supported\n");
1029 * Compose new message
1031 static void toolbar_compose_cb(GtkWidget *widget, gpointer data)
1033 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1034 MainWindow *mainwin;
1035 MessageView *msgview;
1037 g_return_if_fail(toolbar_item != NULL);
1039 switch (toolbar_item->type) {
1041 mainwin = (MainWindow*)toolbar_item->parent;
1042 if (mainwin->toolbar->compose_btn_type == COMPOSEBUTTON_NEWS)
1043 compose_news_cb(mainwin, 0, NULL);
1045 compose_mail_cb(mainwin, 0, NULL);
1047 case TOOLBAR_MSGVIEW:
1048 msgview = (MessageView*)toolbar_item->parent;
1049 compose_new_with_folderitem(NULL,
1050 msgview->msginfo->folder, NULL);
1053 debug_print("toolbar event not supported\n");
1057 static void toolbar_learn(gpointer data, guint as_spam)
1059 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1060 MainWindow *mainwin;
1061 MessageView *msgview;
1063 g_return_if_fail(toolbar_item != NULL);
1065 switch (toolbar_item->type) {
1067 mainwin = (MainWindow*)toolbar_item->parent;
1069 mainwindow_learn(mainwin, TRUE);
1071 mainwindow_learn(mainwin, FALSE);
1073 case TOOLBAR_MSGVIEW:
1074 msgview = (MessageView*)toolbar_item->parent;
1076 messageview_learn(msgview, TRUE);
1078 messageview_learn(msgview, FALSE);
1081 debug_print("toolbar event not supported\n");
1085 static void toolbar_learn_cb(GtkWidget *widget, gpointer data)
1087 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1088 MainWindow *mainwin;
1089 MessageView *msgview;
1091 g_return_if_fail(toolbar_item != NULL);
1093 switch (toolbar_item->type) {
1095 mainwin = (MainWindow*)toolbar_item->parent;
1096 if (mainwin->toolbar->learn_btn_type == LEARN_SPAM)
1097 mainwindow_learn(mainwin, TRUE);
1099 mainwindow_learn(mainwin, FALSE);
1101 case TOOLBAR_MSGVIEW:
1102 msgview = (MessageView*)toolbar_item->parent;
1103 if (msgview->toolbar->learn_btn_type == LEARN_SPAM)
1104 messageview_learn(msgview, TRUE);
1106 messageview_learn(msgview, FALSE);
1109 debug_print("toolbar event not supported\n");
1117 static void toolbar_reply_cb(GtkWidget *widget, gpointer data)
1119 toolbar_reply(data, prefs_common.reply_with_quote ?
1120 COMPOSE_REPLY_WITH_QUOTE : COMPOSE_REPLY_WITHOUT_QUOTE);
1125 * Reply message to Sender and All recipients
1127 static void toolbar_reply_to_all_cb(GtkWidget *widget, gpointer data)
1130 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_ALL_WITH_QUOTE
1131 : COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE);
1136 * Reply to Mailing List
1138 static void toolbar_reply_to_list_cb(GtkWidget *widget, gpointer data)
1141 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_LIST_WITH_QUOTE
1142 : COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE);
1147 * Reply to sender of message
1149 static void toolbar_reply_to_sender_cb(GtkWidget *widget, gpointer data)
1152 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
1153 : COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE);
1159 static void toolbar_addrbook_cb(GtkWidget *widget, gpointer data)
1161 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1164 g_return_if_fail(toolbar_item != NULL);
1166 switch (toolbar_item->type) {
1168 case TOOLBAR_MSGVIEW:
1171 case TOOLBAR_COMPOSE:
1172 compose = (Compose *)toolbar_item->parent;
1177 addressbook_open(compose);
1182 * Forward current/selected(s) message(s)
1184 static void toolbar_forward_cb(GtkWidget *widget, gpointer data)
1186 toolbar_reply(data, COMPOSE_FORWARD);
1190 * Goto Prev Unread Message
1192 static void toolbar_prev_unread_cb(GtkWidget *widget, gpointer data)
1194 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1195 MainWindow *mainwin;
1196 MessageView *msgview;
1198 g_return_if_fail(toolbar_item != NULL);
1200 switch (toolbar_item->type) {
1202 mainwin = (MainWindow*)toolbar_item->parent;
1203 summary_select_prev_unread(mainwin->summaryview);
1206 case TOOLBAR_MSGVIEW:
1207 msgview = (MessageView*)toolbar_item->parent;
1208 msgview->updating = TRUE;
1209 summary_select_prev_unread(msgview->mainwin->summaryview);
1210 msgview->updating = FALSE;
1212 if (msgview->deferred_destroy) {
1213 debug_print("messageview got away!\n");
1214 messageview_destroy(msgview);
1218 /* Now we need to update the messageview window */
1219 if (msgview->mainwin->summaryview->selected) {
1221 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1224 messageview_show(msgview, msginfo,
1225 msgview->all_headers);
1228 gtk_widget_destroy(msgview->window);
1232 debug_print("toolbar event not supported\n");
1237 * Goto Next Unread Message
1239 static void toolbar_next_unread_cb(GtkWidget *widget, gpointer data)
1241 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1242 MainWindow *mainwin;
1243 MessageView *msgview;
1245 g_return_if_fail(toolbar_item != NULL);
1247 switch (toolbar_item->type) {
1249 mainwin = (MainWindow*)toolbar_item->parent;
1250 summary_select_next_unread(mainwin->summaryview);
1253 case TOOLBAR_MSGVIEW:
1254 msgview = (MessageView*)toolbar_item->parent;
1255 msgview->updating = TRUE;
1256 summary_select_next_unread(msgview->mainwin->summaryview);
1257 msgview->updating = FALSE;
1259 if (msgview->deferred_destroy) {
1260 debug_print("messageview got away!\n");
1261 messageview_destroy(msgview);
1265 /* Now we need to update the messageview window */
1266 if (msgview->mainwin->summaryview->selected) {
1268 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1271 messageview_show(msgview, msginfo,
1272 msgview->all_headers);
1275 gtk_widget_destroy(msgview->window);
1279 debug_print("toolbar event not supported\n");
1283 static void toolbar_ignore_thread_cb(GtkWidget *widget, gpointer data)
1285 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1286 MainWindow *mainwin;
1288 g_return_if_fail(toolbar_item != NULL);
1290 switch (toolbar_item->type) {
1292 mainwin = (MainWindow *) toolbar_item->parent;
1293 summary_toggle_ignore_thread(mainwin->summaryview);
1295 case TOOLBAR_MSGVIEW:
1296 /* TODO: see toolbar_next_unread_cb() if you need
1297 * this in the message view */
1300 debug_print("toolbar event not supported\n");
1305 static void toolbar_cancel_inc_cb(GtkWidget *widget, gpointer data)
1307 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1309 g_return_if_fail(toolbar_item != NULL);
1315 static void toolbar_print_cb(GtkWidget *widget, gpointer data)
1317 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1318 MainWindow *mainwin;
1320 g_return_if_fail(toolbar_item != NULL);
1322 switch (toolbar_item->type) {
1324 mainwin = (MainWindow *) toolbar_item->parent;
1325 summary_print(mainwin->summaryview);
1327 case TOOLBAR_MSGVIEW:
1328 /* TODO: see toolbar_next_unread_cb() if you need
1329 * this in the message view */
1332 debug_print("toolbar event not supported\n");
1337 static void toolbar_send_cb(GtkWidget *widget, gpointer data)
1339 compose_toolbar_cb(A_SEND, data);
1342 static void toolbar_send_later_cb(GtkWidget *widget, gpointer data)
1344 compose_toolbar_cb(A_SENDL, data);
1347 static void toolbar_draft_cb(GtkWidget *widget, gpointer data)
1349 compose_toolbar_cb(A_DRAFT, data);
1352 static void toolbar_close_cb(GtkWidget *widget, gpointer data)
1354 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1355 MainWindow *mainwin;
1356 MessageView *messageview;
1359 g_return_if_fail(toolbar_item != NULL);
1361 switch (toolbar_item->type) {
1363 mainwin = (MainWindow *) toolbar_item->parent;
1364 app_will_exit(NULL, mainwin);
1366 case TOOLBAR_MSGVIEW:
1367 messageview = (MessageView *)toolbar_item->parent;
1368 messageview_destroy(messageview);
1370 case TOOLBAR_COMPOSE:
1371 compose = (Compose *)toolbar_item->parent;
1372 compose_close_toolbar(compose);
1377 static void toolbar_open_mail_cb(GtkWidget *widget, gpointer data)
1379 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1380 MainWindow *mainwin;
1382 g_return_if_fail(toolbar_item != NULL);
1384 switch (toolbar_item->type) {
1386 mainwin = (MainWindow *) toolbar_item->parent;
1387 summary_open_row(NULL, mainwin->summaryview);
1389 case TOOLBAR_MSGVIEW:
1390 debug_print("toolbar event not supported\n");
1392 case TOOLBAR_COMPOSE:
1393 debug_print("toolbar event not supported\n");
1398 static void toolbar_insert_cb(GtkWidget *widget, gpointer data)
1400 compose_toolbar_cb(A_INSERT, data);
1403 static void toolbar_attach_cb(GtkWidget *widget, gpointer data)
1405 compose_toolbar_cb(A_ATTACH, data);
1408 static void toolbar_sig_cb(GtkWidget *widget, gpointer data)
1410 compose_toolbar_cb(A_SIG, data);
1413 static void toolbar_ext_editor_cb(GtkWidget *widget, gpointer data)
1415 compose_toolbar_cb(A_EXTEDITOR, data);
1418 static void toolbar_linewrap_current_cb(GtkWidget *widget, gpointer data)
1420 compose_toolbar_cb(A_LINEWRAP_CURRENT, data);
1423 static void toolbar_linewrap_all_cb(GtkWidget *widget, gpointer data)
1425 compose_toolbar_cb(A_LINEWRAP_ALL, data);
1429 static void toolbar_check_spelling_cb(GtkWidget *widget, gpointer data)
1431 compose_toolbar_cb(A_CHECK_SPELLING, data);
1435 * Execute actions from toolbar
1437 static void toolbar_actions_execute_cb(GtkWidget *widget, gpointer data)
1439 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1440 GSList *action_list;
1441 MainWindow *mainwin;
1443 MessageView *msgview;
1444 gpointer parent = toolbar_item->parent;
1446 g_return_if_fail(toolbar_item != NULL);
1448 switch (toolbar_item->type) {
1450 mainwin = (MainWindow*)parent;
1451 action_list = mainwin->toolbar->action_list;
1453 case TOOLBAR_COMPOSE:
1454 compose = (Compose*)parent;
1455 action_list = compose->toolbar->action_list;
1457 case TOOLBAR_MSGVIEW:
1458 msgview = (MessageView*)parent;
1459 action_list = msgview->toolbar->action_list;
1462 debug_print("toolbar event not supported\n");
1465 toolbar_action_execute(widget, action_list, parent, toolbar_item->type);
1468 static MainWindow *get_mainwin(gpointer data)
1470 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1471 MainWindow *mainwin = NULL;
1472 MessageView *msgview;
1474 g_return_val_if_fail(toolbar_item != NULL, NULL);
1476 switch(toolbar_item->type) {
1478 mainwin = (MainWindow*)toolbar_item->parent;
1480 case TOOLBAR_MSGVIEW:
1481 msgview = (MessageView*)toolbar_item->parent;
1482 mainwin = (MainWindow*)msgview->mainwin;
1491 static void toolbar_go_folders_cb(GtkWidget *widget, gpointer data)
1493 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1494 MainWindow *mainwin = NULL;
1495 switch(toolbar_item->type) {
1497 mainwin = (MainWindow*)toolbar_item->parent;
1500 g_warning("wrong toolbar type\n");
1504 if (!mainwin->in_folder) {
1505 FolderItem *item = folderview_get_selected_item(mainwin->folderview);
1507 folderview_select(mainwin->folderview, item);
1510 gtk_widget_grab_focus(mainwin->folderview->ctree);
1511 mainwindow_exit_folder(mainwin);
1515 static void toolbar_buttons_cb(GtkWidget *widget,
1522 void (*func)(GtkWidget *widget, gpointer data);
1524 { A_RECEIVE_ALL, toolbar_inc_all_cb },
1525 { A_RECEIVE_CUR, toolbar_inc_cb },
1526 { A_SEND_QUEUED, toolbar_send_queued_cb },
1527 { A_COMPOSE_EMAIL, toolbar_compose_cb },
1528 { A_COMPOSE_NEWS, toolbar_compose_cb },
1529 { A_REPLY_MESSAGE, toolbar_reply_cb },
1530 { A_REPLY_SENDER, toolbar_reply_to_sender_cb },
1531 { A_REPLY_ALL, toolbar_reply_to_all_cb },
1532 { A_REPLY_ML, toolbar_reply_to_list_cb },
1533 { A_FORWARD, toolbar_forward_cb },
1534 { A_TRASH, toolbar_trash_cb },
1535 { A_DELETE_REAL, toolbar_delete_cb },
1536 { A_EXECUTE, toolbar_exec_cb },
1537 { A_GOTO_PREV, toolbar_prev_unread_cb },
1538 { A_GOTO_NEXT, toolbar_next_unread_cb },
1539 { A_IGNORE_THREAD, toolbar_ignore_thread_cb },
1540 { A_PRINT, toolbar_print_cb },
1541 { A_LEARN_SPAM, toolbar_learn_cb },
1542 { A_GO_FOLDERS, toolbar_go_folders_cb },
1544 { A_SEND, toolbar_send_cb },
1545 { A_SENDL, toolbar_send_later_cb },
1546 { A_DRAFT, toolbar_draft_cb },
1547 { A_OPEN_MAIL, toolbar_open_mail_cb },
1548 { A_CLOSE, toolbar_close_cb },
1549 { A_INSERT, toolbar_insert_cb },
1550 { A_ATTACH, toolbar_attach_cb },
1551 { A_SIG, toolbar_sig_cb },
1552 { A_EXTEDITOR, toolbar_ext_editor_cb },
1553 { A_LINEWRAP_CURRENT, toolbar_linewrap_current_cb },
1554 { A_LINEWRAP_ALL, toolbar_linewrap_all_cb },
1555 { A_ADDRBOOK, toolbar_addrbook_cb },
1557 { A_CHECK_SPELLING, toolbar_check_spelling_cb },
1559 { A_SYL_ACTIONS, toolbar_actions_execute_cb },
1560 { A_CANCEL_INC, toolbar_cancel_inc_cb }
1563 num_items = sizeof(callbacks)/sizeof(callbacks[0]);
1565 for (i = 0; i < num_items; i++) {
1566 if (callbacks[i].index == item->index) {
1567 callbacks[i].func(widget, item);
1573 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
1574 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
1575 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1576 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1577 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1578 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1579 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLTIPS(toolbar_tips), \
1583 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
1584 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
1585 GList *gchild = NULL; \
1586 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
1587 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1588 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1589 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1590 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1591 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLTIPS(toolbar_tips), \
1593 gtk_menu_tool_button_set_arrow_tooltip(GTK_MENU_TOOL_BUTTON(item), \
1594 GTK_TOOLTIPS(toolbar_tips), menutip, NULL); \
1595 child = gtk_bin_get_child(GTK_BIN(item)); \
1596 gchild = gtk_container_get_children( \
1597 GTK_CONTAINER(child)); \
1598 btn = (GtkWidget *)gchild->data; \
1599 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
1600 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
1601 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
1604 #define MAKE_MENU(entries,path,btn) { \
1605 n_menu_entries = sizeof(entries) / \
1606 sizeof(entries[0]); \
1607 menu = menu_create_items(entries, n_menu_entries, path, &factory, toolbar_item); \
1608 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(btn), menu); \
1612 * Create a new toolbar with specified type
1613 * if a callback list is passed it will be used before the
1614 * common callback list
1616 Toolbar *toolbar_create(ToolbarType type,
1617 GtkWidget *container,
1620 ToolbarItem *toolbar_item;
1623 GtkWidget *icon_wid = NULL;
1624 GtkWidget *icon_news;
1625 GtkWidget *icon_ham;
1628 guint n_menu_entries;
1629 GtkItemFactory *factory;
1630 GtkTooltips *toolbar_tips;
1631 ToolbarSylpheedActions *action_item;
1633 GSList *toolbar_list;
1634 Toolbar *toolbar_data;
1637 toolbar_tips = gtk_tooltips_new();
1639 toolbar_read_config_file(type);
1640 toolbar_list = toolbar_get_list(type);
1642 toolbar_data = g_new0(Toolbar, 1);
1644 toolbar = gtk_toolbar_new();
1646 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1647 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
1648 gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar), TRUE);
1650 for (cur = toolbar_list; cur != NULL; cur = cur->next) {
1652 if (g_ascii_strcasecmp(((ToolbarItem*)cur->data)->file, TOOLBAR_TAG_SEPARATOR) == 0) {
1653 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new(), -1);
1657 toolbar_item = g_new0(ToolbarItem, 1);
1658 toolbar_item->index = ((ToolbarItem*)cur->data)->index;
1659 toolbar_item->file = g_strdup(((ToolbarItem*)cur->data)->file);
1660 toolbar_item->text = g_strdup(((ToolbarItem*)cur->data)->text);
1661 toolbar_item->parent = data;
1662 toolbar_item->type = type;
1664 /* collect toolbar items in list to keep track */
1665 toolbar_data->item_list =
1666 g_slist_append(toolbar_data->item_list,
1668 icon_wid = stock_pixmap_widget(container, stock_pixmap_get_icon(toolbar_item->file));
1670 switch (toolbar_item->index) {
1673 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to folder list"));
1674 toolbar_data->folders_btn = item;
1677 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1678 _("Receive Mail on all Accounts"),
1679 _("Receive Mail on selected Account"));
1680 toolbar_data->getall_btn = item;
1683 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text, _("Receive Mail on current Account"));
1684 toolbar_data->get_btn = item;
1687 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Queued Messages"));
1688 toolbar_data->send_btn = item;
1691 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Close window"));
1692 toolbar_data->close_window_btn = item;
1695 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Open email"));
1696 toolbar_data->open_mail_btn = item;
1698 case A_COMPOSE_EMAIL:
1700 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1702 _("Compose with selected Account"));
1703 toolbar_data->compose_mail_btn = item;
1705 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1706 TOOLBAR_MENUITEM(item,icon_news,_("Compose"),
1708 _("Compose with selected Account"));
1709 toolbar_data->compose_news_btn = item;
1711 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1712 _("Compose Email"));
1713 toolbar_data->compose_mail_btn = item;
1715 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1716 TOOLBAR_ITEM(item,icon_news,_("Compose"),
1718 toolbar_data->compose_news_btn = item;
1722 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1725 toolbar_data->learn_spam_btn = item;
1727 icon_ham = stock_pixmap_widget(container, STOCK_PIXMAP_HAM_BTN);
1728 TOOLBAR_MENUITEM(item,icon_ham,_("Ham"),
1731 toolbar_data->learn_ham_btn = item;
1733 MAKE_MENU(learn_entries,"<LearnSpam>",toolbar_data->learn_spam_btn);
1734 MAKE_MENU(learn_entries,"<LearnHam>",toolbar_data->learn_ham_btn);
1736 case A_REPLY_MESSAGE:
1738 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1739 _("Reply to Message"),
1740 _("Reply to Message options"));
1741 toolbar_data->reply_btn = item;
1743 MAKE_MENU(reply_entries,"<Reply>",toolbar_data->reply_btn);
1745 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1746 _("Reply to Message"));
1747 toolbar_data->reply_btn = item;
1750 case A_REPLY_SENDER:
1752 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1753 _("Reply to Sender"),
1754 _("Reply to Sender options"));
1755 toolbar_data->replysender_btn = item;
1757 MAKE_MENU(replysender_entries,"<ReplySender>",toolbar_data->replysender_btn);
1759 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1760 _("Reply to Sender"));
1761 toolbar_data->replysender_btn = item;
1766 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1768 _("Reply to All options"));
1769 toolbar_data->replyall_btn = item;
1771 MAKE_MENU(replyall_entries,"<ReplyAll>",toolbar_data->replyall_btn);
1773 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1775 toolbar_data->replyall_btn = item;
1780 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1781 _("Reply to Mailing-list"),
1782 _("Reply to Mailing-list options"));
1783 toolbar_data->replylist_btn = item;
1785 MAKE_MENU(replylist_entries,"<ReplyList>",toolbar_data->replylist_btn);
1787 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1788 _("Reply to Mailing-list"));
1789 toolbar_data->replylist_btn = item;
1794 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1795 _("Forward Message"),
1796 _("Forward Message options"));
1797 toolbar_data->fwd_btn = item;
1799 MAKE_MENU(forward_entries,"<Forward>",toolbar_data->fwd_btn);
1801 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1802 _("Forward Message"));
1803 toolbar_data->fwd_btn = item;
1807 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Trash Message"));
1808 toolbar_data->trash_btn = item;
1811 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Delete Message"));
1812 toolbar_data->delete_btn = item;
1815 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Execute"));
1816 toolbar_data->exec_btn = item;
1819 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Previous Unread Message"));
1820 toolbar_data->prev_btn = item;
1823 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Next Unread Message"));
1824 toolbar_data->next_btn = item;
1827 /* Compose Toolbar */
1829 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Message"));
1830 toolbar_data->send_btn = item;
1833 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Put into queue folder and send later"));
1834 toolbar_data->sendl_btn = item;
1837 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Save to draft folder"));
1838 toolbar_data->draft_btn = item;
1841 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert file"));
1842 toolbar_data->insert_btn = item;
1845 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Attach file"));
1846 toolbar_data->attach_btn = item;
1849 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert signature"));
1850 toolbar_data->sig_btn = item;
1853 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Edit with external editor"));
1854 toolbar_data->exteditor_btn = item;
1856 case A_LINEWRAP_CURRENT:
1857 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap long lines of current paragraph"));
1858 toolbar_data->linewrap_current_btn = item;
1860 case A_LINEWRAP_ALL:
1861 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap all long lines"));
1862 toolbar_data->linewrap_all_btn = item;
1865 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Address book"));
1866 toolbar_data->addrbook_btn = item;
1869 case A_CHECK_SPELLING:
1870 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Check spelling"));
1871 toolbar_data->spellcheck_btn = item;
1876 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,toolbar_item->text);
1877 action_item = g_new0(ToolbarSylpheedActions, 1);
1878 action_item->widget = item;
1879 action_item->name = g_strdup(toolbar_item->text);
1881 toolbar_data->action_list =
1882 g_slist_append(toolbar_data->action_list,
1886 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Cancel receiving"));
1887 toolbar_data->cancel_inc_btn = item;
1890 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1891 toolbar_ret_descr_from_val(toolbar_item->index));
1892 /* find and set the tool tip text */
1897 toolbar_data->toolbar = toolbar;
1898 gtk_widget_show_all(toolbar);
1900 if (type == TOOLBAR_MAIN) {
1902 MainWindow *mainwin = mainwindow_get_mainwindow();
1903 GtkWidget *progressbar = gtk_progress_bar_new();
1904 item = gtk_tool_item_new();
1905 gtk_container_add (GTK_CONTAINER (item), progressbar);
1906 gtk_widget_show(item);
1907 gtk_widget_show(progressbar);
1908 gtk_widget_set_size_request(progressbar, 70, -1);
1909 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1910 mainwin->progressbar = progressbar;
1912 activate_compose_button(toolbar_data,
1913 prefs_common.toolbar_style,
1914 toolbar_data->compose_btn_type);
1916 if (type != TOOLBAR_COMPOSE)
1917 activate_learn_button(toolbar_data, prefs_common.toolbar_style,
1921 gtk_container_add(GTK_CONTAINER(container), toolbar);
1922 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
1924 if ( GTK_IS_WINDOW(container) ) {
1925 hildon_window_add_toolbar (HILDON_WINDOW(container), GTK_TOOLBAR(toolbar));
1926 gtk_widget_show_all (container);
1928 gtk_container_add(GTK_CONTAINER(container), toolbar);
1929 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
1932 return toolbar_data;
1936 * Free toolbar structures
1938 void toolbar_destroy(Toolbar * toolbar) {
1940 TOOLBAR_DESTROY_ITEMS(toolbar->item_list);
1941 TOOLBAR_DESTROY_ACTIONS(toolbar->action_list);
1944 void toolbar_update(ToolbarType type, gpointer data)
1946 Toolbar *toolbar_data;
1947 GtkWidget *handlebox;
1948 MainWindow *mainwin = (MainWindow*)data;
1949 Compose *compose = (Compose*)data;
1950 MessageView *msgview = (MessageView*)data;
1954 toolbar_data = mainwin->toolbar;
1955 handlebox = mainwin->handlebox;
1957 case TOOLBAR_COMPOSE:
1958 toolbar_data = compose->toolbar;
1959 handlebox = compose->handlebox;
1961 case TOOLBAR_MSGVIEW:
1962 toolbar_data = msgview->toolbar;
1963 handlebox = msgview->handlebox;
1969 gtk_container_remove(GTK_CONTAINER(handlebox),
1970 GTK_WIDGET(toolbar_data->toolbar));
1972 toolbar_init(toolbar_data);
1973 toolbar_data = toolbar_create(type, handlebox, data);
1976 mainwin->toolbar = toolbar_data;
1978 case TOOLBAR_COMPOSE:
1979 compose->toolbar = toolbar_data;
1981 case TOOLBAR_MSGVIEW:
1982 msgview->toolbar = toolbar_data;
1986 toolbar_style(type, prefs_common.toolbar_style, data);
1988 if (type == TOOLBAR_MAIN) {
1989 toolbar_main_set_sensitive((MainWindow*)data);
1990 account_set_menu_only_toolbar();
1994 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
1995 gboolean in_btn1 = FALSE, in_btn2 = FALSE; \
1996 if (GTK_IS_BUTTON(widget)) \
1997 in_btn1 = GTK_BUTTON(widget)->in_button; \
1998 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
1999 GtkWidget *child = gtk_bin_get_child( \
2001 GList *gchild = gtk_container_get_children( \
2002 GTK_CONTAINER(child)); \
2003 GtkWidget *btn = (GtkWidget *)gchild->data; \
2004 GtkWidget *arr = (GtkWidget *) \
2005 (gchild->next?gchild->next->data:NULL); \
2006 if (GTK_IS_BUTTON(btn)) \
2007 in_btn1 = GTK_BUTTON(btn)->in_button; \
2008 if (GTK_IS_BUTTON(arr)) \
2009 in_btn2 = GTK_BUTTON(arr)->in_button; \
2011 else if (GTK_IS_TOOL_ITEM(widget)) { \
2012 GtkWidget *child = gtk_bin_get_child( \
2014 if (GTK_IS_BUTTON(child)) \
2015 in_btn1 = GTK_BUTTON(child)->in_button; \
2017 gtk_widget_set_sensitive(widget, sensitive); \
2018 if (GTK_IS_BUTTON(widget)) \
2019 GTK_BUTTON(widget)->in_button = in_btn1; \
2020 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2021 GtkWidget *child = gtk_bin_get_child( \
2023 GList *gchild = gtk_container_get_children( \
2024 GTK_CONTAINER(child)); \
2025 GtkWidget *btn = (GtkWidget *)gchild->data; \
2026 GtkWidget *arr = (GtkWidget *) \
2027 (gchild->next?gchild->next->data:NULL); \
2028 if (GTK_IS_BUTTON(btn)) \
2029 GTK_BUTTON(btn)->in_button = in_btn1; \
2030 if (GTK_IS_BUTTON(arr)) \
2031 GTK_BUTTON(arr)->in_button = in_btn2; \
2033 else if (GTK_IS_TOOL_ITEM(widget)) { \
2034 GtkWidget *child = gtk_bin_get_child( \
2036 if (GTK_IS_BUTTON(child)) \
2037 GTK_BUTTON(child)->in_button = in_btn1; \
2041 void toolbar_main_set_sensitive(gpointer data)
2043 SensitiveCond state;
2045 MainWindow *mainwin = (MainWindow*)data;
2046 Toolbar *toolbar = mainwin->toolbar;
2048 GSList *entry_list = NULL;
2050 typedef struct _Entry Entry;
2057 #define SET_WIDGET_COND(w, c) \
2059 Entry *e = g_new0(Entry, 1); \
2062 entry_list = g_slist_append(entry_list, e); \
2066 if (toolbar->get_btn)
2067 SET_WIDGET_COND(toolbar->get_btn,
2068 M_HAVE_ACCOUNT|M_UNLOCKED);
2070 if (toolbar->getall_btn) {
2071 SET_WIDGET_COND(toolbar->getall_btn,
2072 M_HAVE_ACCOUNT|M_UNLOCKED);
2074 if (toolbar->send_btn) {
2075 SET_WIDGET_COND(toolbar->send_btn,
2076 M_HAVE_QUEUED_MAILS);
2078 if (toolbar->compose_mail_btn) {
2079 SET_WIDGET_COND(toolbar->compose_news_btn,
2082 if (toolbar->close_window_btn) {
2083 SET_WIDGET_COND(toolbar->compose_news_btn,
2086 if (toolbar->open_mail_btn) {
2087 SET_WIDGET_COND(toolbar->open_mail_btn,
2090 if (toolbar->reply_btn) {
2091 SET_WIDGET_COND(toolbar->reply_btn,
2092 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2094 if (toolbar->replyall_btn) {
2095 SET_WIDGET_COND(toolbar->replyall_btn,
2096 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2098 if (toolbar->replylist_btn) {
2099 SET_WIDGET_COND(toolbar->replylist_btn,
2100 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2102 if (toolbar->replysender_btn) {
2103 SET_WIDGET_COND(toolbar->replysender_btn,
2104 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2106 if (toolbar->fwd_btn) {
2107 SET_WIDGET_COND(toolbar->fwd_btn,
2108 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2111 if (prefs_common.next_unread_msg_dialog == NEXTUNREADMSGDIALOG_ASSUME_NO) {
2112 SET_WIDGET_COND(toolbar->next_btn, M_MSG_EXIST);
2114 SET_WIDGET_COND(toolbar->next_btn, 0);
2117 if (toolbar->trash_btn)
2118 SET_WIDGET_COND(toolbar->trash_btn,
2119 M_TARGET_EXIST|M_ALLOW_DELETE);
2121 if (toolbar->delete_btn)
2122 SET_WIDGET_COND(toolbar->delete_btn,
2123 M_TARGET_EXIST|M_ALLOW_DELETE);
2125 if (toolbar->exec_btn)
2126 SET_WIDGET_COND(toolbar->exec_btn,
2129 if (toolbar->learn_ham_btn)
2130 SET_WIDGET_COND(toolbar->learn_ham_btn,
2131 M_TARGET_EXIST|M_CAN_LEARN_SPAM);
2133 if (toolbar->learn_spam_btn)
2134 SET_WIDGET_COND(toolbar->learn_spam_btn,
2135 M_TARGET_EXIST|M_CAN_LEARN_SPAM);
2137 if (toolbar->cancel_inc_btn)
2138 SET_WIDGET_COND(toolbar->cancel_inc_btn,
2141 for (cur = toolbar->action_list; cur != NULL; cur = cur->next) {
2142 ToolbarSylpheedActions *act = (ToolbarSylpheedActions*)cur->data;
2144 SET_WIDGET_COND(act->widget, M_TARGET_EXIST|M_UNLOCKED);
2147 #undef SET_WIDGET_COND
2149 state = main_window_get_current_state(mainwin);
2151 for (cur = entry_list; cur != NULL; cur = cur->next) {
2152 Entry *e = (Entry*) cur->data;
2154 if (e->widget != NULL) {
2155 sensitive = ((e->cond & state) == e->cond);
2156 GTK_BUTTON_SET_SENSITIVE(e->widget, sensitive);
2160 while (entry_list != NULL) {
2161 Entry *e = (Entry*) entry_list->data;
2164 entry_list = g_slist_remove(entry_list, e);
2167 g_slist_free(entry_list);
2169 activate_compose_button(toolbar,
2170 prefs_common.toolbar_style,
2171 toolbar->compose_btn_type);
2175 void toolbar_comp_set_sensitive(gpointer data, gboolean sensitive)
2177 Compose *compose = (Compose*)data;
2178 GSList *items = compose->toolbar->action_list;
2180 if (compose->toolbar->send_btn)
2181 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->send_btn, sensitive);
2182 if (compose->toolbar->sendl_btn)
2183 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sendl_btn, sensitive);
2184 if (compose->toolbar->draft_btn )
2185 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->draft_btn , sensitive);
2186 if (compose->toolbar->insert_btn )
2187 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->insert_btn , sensitive);
2188 if (compose->toolbar->attach_btn)
2189 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->attach_btn, sensitive);
2190 if (compose->toolbar->sig_btn)
2191 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sig_btn, sensitive);
2192 if (compose->toolbar->exteditor_btn)
2193 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->exteditor_btn, sensitive);
2194 if (compose->toolbar->linewrap_current_btn)
2195 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_current_btn, sensitive);
2196 if (compose->toolbar->linewrap_all_btn)
2197 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_all_btn, sensitive);
2198 if (compose->toolbar->addrbook_btn)
2199 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->addrbook_btn, sensitive);
2201 if (compose->toolbar->spellcheck_btn)
2202 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->spellcheck_btn, sensitive);
2204 for (; items != NULL; items = g_slist_next(items)) {
2205 ToolbarSylpheedActions *item = (ToolbarSylpheedActions *)items->data;
2206 GTK_BUTTON_SET_SENSITIVE(item->widget, sensitive);
2211 * Initialize toolbar structure
2213 void toolbar_init(Toolbar * toolbar) {
2215 toolbar->toolbar = NULL;
2216 toolbar->folders_btn = NULL;
2217 toolbar->get_btn = NULL;
2218 toolbar->getall_btn = NULL;
2219 toolbar->send_btn = NULL;
2220 toolbar->compose_mail_btn = NULL;
2221 toolbar->compose_news_btn = NULL;
2222 toolbar->reply_btn = NULL;
2223 toolbar->replysender_btn = NULL;
2224 toolbar->replyall_btn = NULL;
2225 toolbar->replylist_btn = NULL;
2226 toolbar->fwd_btn = NULL;
2227 toolbar->trash_btn = NULL;
2228 toolbar->delete_btn = NULL;
2229 toolbar->prev_btn = NULL;
2230 toolbar->next_btn = NULL;
2231 toolbar->exec_btn = NULL;
2232 toolbar->open_mail_btn = NULL;
2233 toolbar->close_window_btn = NULL;
2234 /* compose buttons */
2235 toolbar->sendl_btn = NULL;
2236 toolbar->draft_btn = NULL;
2237 toolbar->insert_btn = NULL;
2238 toolbar->attach_btn = NULL;
2239 toolbar->sig_btn = NULL;
2240 toolbar->exteditor_btn = NULL;
2241 toolbar->linewrap_current_btn = NULL;
2242 toolbar->linewrap_all_btn = NULL;
2243 toolbar->addrbook_btn = NULL;
2245 toolbar->spellcheck_btn = NULL;
2248 toolbar_destroy(toolbar);
2253 static void toolbar_reply(gpointer data, guint action)
2255 ToolbarItem *toolbar_item = (ToolbarItem*)data;
2256 MainWindow *mainwin;
2257 MessageView *msgview;
2258 GSList *msginfo_list = NULL;
2260 g_return_if_fail(toolbar_item != NULL);
2262 switch (toolbar_item->type) {
2264 mainwin = (MainWindow*)toolbar_item->parent;
2265 msginfo_list = summary_get_selection(mainwin->summaryview);
2266 msgview = (MessageView*)mainwin->messageview;
2268 case TOOLBAR_MSGVIEW:
2269 msgview = (MessageView*)toolbar_item->parent;
2270 g_return_if_fail(msgview != NULL);
2271 msginfo_list = g_slist_append(msginfo_list, msgview->msginfo);
2277 g_return_if_fail(msgview != NULL);
2278 g_return_if_fail(msginfo_list != NULL);
2279 compose_reply_from_messageview(msgview, msginfo_list, action);
2280 g_slist_free(msginfo_list);
2282 /* TODO: update reply state ion summaryview */
2286 /* exported functions */
2288 void inc_mail_cb(gpointer data, guint action, GtkWidget *widget)
2290 MainWindow *mainwin = (MainWindow*)data;
2292 inc_mail(mainwin, prefs_common.newmail_notify_manu);
2295 void inc_all_account_mail_cb(gpointer data, guint action, GtkWidget *widget)
2297 MainWindow *mainwin = (MainWindow*)data;
2299 inc_all_account_mail(mainwin, FALSE, prefs_common.newmail_notify_manu);
2302 void send_queue_cb(gpointer data, guint action, GtkWidget *widget)
2306 gboolean got_error = FALSE;
2307 gchar *errstr = NULL;
2309 if (prefs_common.work_offline)
2310 if (alertpanel(_("Offline warning"),
2311 _("You're working offline. Override?"),
2312 GTK_STOCK_NO, GTK_STOCK_YES,
2313 NULL) != G_ALERTALTERNATE)
2316 /* ask for confirmation before sending queued messages only
2317 in online mode and if there is at least one message queued
2318 in any of the folder queue
2320 if (prefs_common.confirm_send_queued_messages) {
2322 /* check if there's a queued message */
2323 for (list = folder_get_list(); !found && list != NULL; list = list->next) {
2324 Folder *folder = list->data;
2326 found = !procmsg_queue_is_empty(folder->queue);
2328 /* if necessary, ask for confirmation before sending */
2329 if (found && !prefs_common.work_offline) {
2330 if (alertpanel(_("Send queued messages"),
2331 _("Send all queued messages?"),
2332 GTK_STOCK_CANCEL, _("_Send"),
2333 NULL) != G_ALERTALTERNATE)
2338 for (list = folder_get_list(); list != NULL; list = list->next) {
2339 Folder *folder = list->data;
2341 if (folder->queue) {
2342 if (procmsg_send_queue(folder->queue,
2343 prefs_common.savemsg,
2350 alertpanel_error_log(_("Some errors occurred while "
2351 "sending queued messages."));
2353 gchar *tmp = g_strdup_printf(_("Some errors occurred "
2354 "while sending queued messages:\n%s"), errstr);
2356 alertpanel_error_log(tmp);
2362 void compose_mail_cb(gpointer data, guint action, GtkWidget *widget)
2364 MainWindow *mainwin = (MainWindow*)data;
2365 PrefsAccount *ac = NULL;
2366 FolderItem *item = mainwin->summaryview->folder_item;
2371 ac = account_find_from_item(item);
2372 if (ac && ac->protocol != A_NNTP) {
2373 compose_new_with_folderitem(ac, item, NULL); /* CLAWS */
2379 * CLAWS - use current account
2381 if (cur_account && (cur_account->protocol != A_NNTP)) {
2382 compose_new_with_folderitem(cur_account, item, NULL);
2387 * CLAWS - just get the first one
2389 list = account_get_list();
2390 for (cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2391 ac = (PrefsAccount *) cur->data;
2392 if (ac->protocol != A_NNTP) {
2393 compose_new_with_folderitem(ac, item, NULL);
2399 void compose_news_cb(gpointer data, guint action, GtkWidget *widget)
2401 MainWindow *mainwin = (MainWindow*)data;
2402 PrefsAccount * ac = NULL;
2406 if (mainwin->summaryview->folder_item) {
2407 ac = mainwin->summaryview->folder_item->folder->account;
2408 if (ac && ac->protocol == A_NNTP) {
2409 compose_new_with_folderitem(ac,
2410 mainwin->summaryview->folder_item, NULL);
2415 list = account_get_list();
2416 for(cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2417 ac = (PrefsAccount *) cur->data;
2418 if (ac->protocol == A_NNTP) {
2419 compose_new_with_folderitem(ac,
2420 mainwin->summaryview->folder_item, NULL);