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_DIR_OPEN, _("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))
782 gtk_widget_hide(type == COMPOSEBUTTON_NEWS ? toolbar->compose_mail_btn
783 : toolbar->compose_news_btn);
784 gtk_widget_show(type == COMPOSEBUTTON_NEWS ? toolbar->compose_news_btn
785 : toolbar->compose_mail_btn);
786 toolbar->compose_btn_type = type;
789 void toolbar_set_compose_button(Toolbar *toolbar,
790 ComposeButtonType compose_btn_type)
792 if (toolbar->compose_btn_type != compose_btn_type)
793 activate_compose_button(toolbar,
794 prefs_common.toolbar_style,
798 static void activate_learn_button (Toolbar *toolbar,
800 LearnButtonType type)
802 if ((!toolbar->learn_spam_btn) || (!toolbar->learn_ham_btn))
805 gtk_widget_hide(type == LEARN_SPAM ? toolbar->learn_ham_btn
806 : toolbar->learn_spam_btn);
807 gtk_widget_show(type == LEARN_SPAM ? toolbar->learn_spam_btn
808 : toolbar->learn_ham_btn);
809 toolbar->learn_btn_type = type;
812 void toolbar_set_learn_button(Toolbar *toolbar,
813 LearnButtonType learn_btn_type)
815 if (toolbar->learn_btn_type != learn_btn_type)
816 activate_learn_button(toolbar,
817 prefs_common.toolbar_style,
821 void toolbar_toggle(guint action, gpointer data)
823 MainWindow *mainwin = (MainWindow*)data;
827 g_return_if_fail(mainwin != NULL);
829 toolbar_style(TOOLBAR_MAIN, action, mainwin);
831 list = compose_get_compose_list();
832 for (cur = list; cur != NULL; cur = cur->next) {
833 toolbar_style(TOOLBAR_COMPOSE, action, cur->data);
835 list = messageview_get_msgview_list();
836 for (cur = list; cur != NULL; cur = cur->next) {
837 toolbar_style(TOOLBAR_MSGVIEW, action, cur->data);
842 void toolbar_set_style(GtkWidget *toolbar_wid, GtkWidget *handlebox_wid, guint action)
844 switch ((ToolbarStyle)action) {
846 gtk_widget_hide(handlebox_wid);
849 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
853 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
857 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
860 case TOOLBAR_BOTH_HORIZ:
861 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
862 GTK_TOOLBAR_BOTH_HORIZ);
868 prefs_common.toolbar_style = (ToolbarStyle)action;
869 gtk_widget_set_size_request(handlebox_wid, 1, -1);
871 if (prefs_common.toolbar_style != TOOLBAR_NONE) {
872 gtk_widget_show(handlebox_wid);
873 gtk_widget_queue_resize(handlebox_wid);
877 * Change the style of toolbar
879 static void toolbar_style(ToolbarType type, guint action, gpointer data)
881 GtkWidget *handlebox_wid;
882 GtkWidget *toolbar_wid;
883 MainWindow *mainwin = (MainWindow*)data;
884 Compose *compose = (Compose*)data;
885 MessageView *msgview = (MessageView*)data;
887 g_return_if_fail(data != NULL);
891 handlebox_wid = mainwin->handlebox;
892 toolbar_wid = mainwin->toolbar->toolbar;
894 case TOOLBAR_COMPOSE:
895 handlebox_wid = compose->handlebox;
896 toolbar_wid = compose->toolbar->toolbar;
898 case TOOLBAR_MSGVIEW:
899 handlebox_wid = msgview->handlebox;
900 toolbar_wid = msgview->toolbar->toolbar;
906 toolbar_set_style(toolbar_wid, handlebox_wid, action);
909 /* Toolbar handling */
910 static void toolbar_inc_cb(GtkWidget *widget,
913 ToolbarItem *toolbar_item = (ToolbarItem*)data;
916 g_return_if_fail(toolbar_item != NULL);
918 switch (toolbar_item->type) {
920 mainwin = (MainWindow*)toolbar_item->parent;
921 inc_mail_cb(mainwin, 0, NULL);
928 static void toolbar_inc_all_cb(GtkWidget *widget,
931 ToolbarItem *toolbar_item = (ToolbarItem*)data;
934 g_return_if_fail(toolbar_item != NULL);
936 switch (toolbar_item->type) {
938 mainwin = (MainWindow*)toolbar_item->parent;
939 inc_all_account_mail_cb(mainwin, 0, NULL);
946 static void toolbar_send_queued_cb(GtkWidget *widget,gpointer data)
948 ToolbarItem *toolbar_item = (ToolbarItem*)data;
951 g_return_if_fail(toolbar_item != NULL);
953 switch (toolbar_item->type) {
955 mainwin = (MainWindow*)toolbar_item->parent;
956 send_queue_cb(mainwin, 0, NULL);
963 static void toolbar_exec_cb(GtkWidget *widget,
966 MainWindow *mainwin = get_mainwin(data);
968 g_return_if_fail(mainwin != NULL);
969 summary_execute(mainwin->summaryview);
973 * Delete current/selected(s) message(s)
975 static void toolbar_trash_cb(GtkWidget *widget, gpointer data)
977 ToolbarItem *toolbar_item = (ToolbarItem*)data;
980 g_return_if_fail(toolbar_item != NULL);
981 g_return_if_fail(toolbar_item->parent);
983 switch (toolbar_item->type) {
984 case TOOLBAR_MSGVIEW:
985 messageview_delete((MessageView *)toolbar_item->parent);
988 mainwin = (MainWindow *)toolbar_item->parent;
989 summary_delete_trash(mainwin->summaryview);
992 debug_print("toolbar event not supported\n");
998 * Delete current/selected(s) message(s)
1000 static void toolbar_delete_cb(GtkWidget *widget, gpointer data)
1002 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1003 MainWindow *mainwin;
1005 g_return_if_fail(toolbar_item != NULL);
1006 g_return_if_fail(toolbar_item->parent);
1008 switch (toolbar_item->type) {
1009 case TOOLBAR_MSGVIEW:
1010 messageview_delete((MessageView *)toolbar_item->parent);
1013 mainwin = (MainWindow *)toolbar_item->parent;
1014 summary_delete(mainwin->summaryview);
1017 debug_print("toolbar event not supported\n");
1024 * Compose new message
1026 static void toolbar_compose_cb(GtkWidget *widget, gpointer data)
1028 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1029 MainWindow *mainwin;
1030 MessageView *msgview;
1032 g_return_if_fail(toolbar_item != NULL);
1034 switch (toolbar_item->type) {
1036 mainwin = (MainWindow*)toolbar_item->parent;
1037 if (mainwin->toolbar->compose_btn_type == COMPOSEBUTTON_NEWS)
1038 compose_news_cb(mainwin, 0, NULL);
1040 compose_mail_cb(mainwin, 0, NULL);
1042 case TOOLBAR_MSGVIEW:
1043 msgview = (MessageView*)toolbar_item->parent;
1044 compose_new_with_folderitem(NULL,
1045 msgview->msginfo->folder, NULL);
1048 debug_print("toolbar event not supported\n");
1052 static void toolbar_learn(gpointer data, guint as_spam)
1054 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1055 MainWindow *mainwin;
1056 MessageView *msgview;
1058 g_return_if_fail(toolbar_item != NULL);
1060 switch (toolbar_item->type) {
1062 mainwin = (MainWindow*)toolbar_item->parent;
1064 mainwindow_learn(mainwin, TRUE);
1066 mainwindow_learn(mainwin, FALSE);
1068 case TOOLBAR_MSGVIEW:
1069 msgview = (MessageView*)toolbar_item->parent;
1071 messageview_learn(msgview, TRUE);
1073 messageview_learn(msgview, FALSE);
1076 debug_print("toolbar event not supported\n");
1080 static void toolbar_learn_cb(GtkWidget *widget, gpointer data)
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;
1091 if (mainwin->toolbar->learn_btn_type == LEARN_SPAM)
1092 mainwindow_learn(mainwin, TRUE);
1094 mainwindow_learn(mainwin, FALSE);
1096 case TOOLBAR_MSGVIEW:
1097 msgview = (MessageView*)toolbar_item->parent;
1098 if (msgview->toolbar->learn_btn_type == LEARN_SPAM)
1099 messageview_learn(msgview, TRUE);
1101 messageview_learn(msgview, FALSE);
1104 debug_print("toolbar event not supported\n");
1112 static void toolbar_reply_cb(GtkWidget *widget, gpointer data)
1114 toolbar_reply(data, prefs_common.reply_with_quote ?
1115 COMPOSE_REPLY_WITH_QUOTE : COMPOSE_REPLY_WITHOUT_QUOTE);
1120 * Reply message to Sender and All recipients
1122 static void toolbar_reply_to_all_cb(GtkWidget *widget, gpointer data)
1125 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_ALL_WITH_QUOTE
1126 : COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE);
1131 * Reply to Mailing List
1133 static void toolbar_reply_to_list_cb(GtkWidget *widget, gpointer data)
1136 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_LIST_WITH_QUOTE
1137 : COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE);
1142 * Reply to sender of message
1144 static void toolbar_reply_to_sender_cb(GtkWidget *widget, gpointer data)
1147 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
1148 : COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE);
1154 static void toolbar_addrbook_cb(GtkWidget *widget, gpointer data)
1156 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1159 g_return_if_fail(toolbar_item != NULL);
1161 switch (toolbar_item->type) {
1163 case TOOLBAR_MSGVIEW:
1166 case TOOLBAR_COMPOSE:
1167 compose = (Compose *)toolbar_item->parent;
1172 addressbook_open(compose);
1177 * Forward current/selected(s) message(s)
1179 static void toolbar_forward_cb(GtkWidget *widget, gpointer data)
1181 toolbar_reply(data, COMPOSE_FORWARD);
1185 * Goto Prev Unread Message
1187 static void toolbar_prev_unread_cb(GtkWidget *widget, gpointer data)
1189 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1190 MainWindow *mainwin;
1191 MessageView *msgview;
1193 g_return_if_fail(toolbar_item != NULL);
1195 switch (toolbar_item->type) {
1197 mainwin = (MainWindow*)toolbar_item->parent;
1198 summary_select_prev_unread(mainwin->summaryview);
1201 case TOOLBAR_MSGVIEW:
1202 msgview = (MessageView*)toolbar_item->parent;
1203 msgview->updating = TRUE;
1204 summary_select_prev_unread(msgview->mainwin->summaryview);
1205 msgview->updating = FALSE;
1207 if (msgview->deferred_destroy) {
1208 debug_print("messageview got away!\n");
1209 messageview_destroy(msgview);
1213 /* Now we need to update the messageview window */
1214 if (msgview->mainwin->summaryview->selected) {
1215 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1218 messageview_show(msgview, msginfo,
1219 msgview->all_headers);
1221 gtk_widget_destroy(msgview->window);
1225 debug_print("toolbar event not supported\n");
1230 * Goto Next Unread Message
1232 static void toolbar_next_unread_cb(GtkWidget *widget, gpointer data)
1234 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1235 MainWindow *mainwin;
1236 MessageView *msgview;
1238 g_return_if_fail(toolbar_item != NULL);
1240 switch (toolbar_item->type) {
1242 mainwin = (MainWindow*)toolbar_item->parent;
1243 summary_select_next_unread(mainwin->summaryview);
1246 case TOOLBAR_MSGVIEW:
1247 msgview = (MessageView*)toolbar_item->parent;
1248 msgview->updating = TRUE;
1249 summary_select_next_unread(msgview->mainwin->summaryview);
1250 msgview->updating = FALSE;
1252 if (msgview->deferred_destroy) {
1253 debug_print("messageview got away!\n");
1254 messageview_destroy(msgview);
1258 /* Now we need to update the messageview window */
1259 if (msgview->mainwin->summaryview->selected) {
1260 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1263 messageview_show(msgview, msginfo,
1264 msgview->all_headers);
1266 gtk_widget_destroy(msgview->window);
1270 debug_print("toolbar event not supported\n");
1274 static void toolbar_ignore_thread_cb(GtkWidget *widget, gpointer data)
1276 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1277 MainWindow *mainwin;
1279 g_return_if_fail(toolbar_item != NULL);
1281 switch (toolbar_item->type) {
1283 mainwin = (MainWindow *) toolbar_item->parent;
1284 summary_toggle_ignore_thread(mainwin->summaryview);
1286 case TOOLBAR_MSGVIEW:
1287 /* TODO: see toolbar_next_unread_cb() if you need
1288 * this in the message view */
1291 debug_print("toolbar event not supported\n");
1296 static void toolbar_cancel_inc_cb(GtkWidget *widget, gpointer data)
1298 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1300 g_return_if_fail(toolbar_item != NULL);
1306 static void toolbar_print_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_print(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_send_cb(GtkWidget *widget, gpointer data)
1330 compose_toolbar_cb(A_SEND, data);
1333 static void toolbar_send_later_cb(GtkWidget *widget, gpointer data)
1335 compose_toolbar_cb(A_SENDL, data);
1338 static void toolbar_draft_cb(GtkWidget *widget, gpointer data)
1340 compose_toolbar_cb(A_DRAFT, data);
1343 static void toolbar_close_cb(GtkWidget *widget, gpointer data)
1345 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1346 MainWindow *mainwin;
1347 MessageView *messageview;
1350 g_return_if_fail(toolbar_item != NULL);
1352 switch (toolbar_item->type) {
1354 mainwin = (MainWindow *) toolbar_item->parent;
1355 app_will_exit(NULL, mainwin);
1357 case TOOLBAR_MSGVIEW:
1358 messageview = (MessageView *)toolbar_item->parent;
1359 messageview_destroy(messageview);
1361 case TOOLBAR_COMPOSE:
1362 compose = (Compose *)toolbar_item->parent;
1363 compose_close_toolbar(compose);
1368 static void toolbar_open_mail_cb(GtkWidget *widget, gpointer data)
1370 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1371 MainWindow *mainwin;
1373 g_return_if_fail(toolbar_item != NULL);
1375 switch (toolbar_item->type) {
1377 mainwin = (MainWindow *) toolbar_item->parent;
1378 summary_open_row(NULL, mainwin->summaryview);
1380 case TOOLBAR_MSGVIEW:
1381 debug_print("toolbar event not supported\n");
1383 case TOOLBAR_COMPOSE:
1384 debug_print("toolbar event not supported\n");
1389 static void toolbar_insert_cb(GtkWidget *widget, gpointer data)
1391 compose_toolbar_cb(A_INSERT, data);
1394 static void toolbar_attach_cb(GtkWidget *widget, gpointer data)
1396 compose_toolbar_cb(A_ATTACH, data);
1399 static void toolbar_sig_cb(GtkWidget *widget, gpointer data)
1401 compose_toolbar_cb(A_SIG, data);
1404 static void toolbar_ext_editor_cb(GtkWidget *widget, gpointer data)
1406 compose_toolbar_cb(A_EXTEDITOR, data);
1409 static void toolbar_linewrap_current_cb(GtkWidget *widget, gpointer data)
1411 compose_toolbar_cb(A_LINEWRAP_CURRENT, data);
1414 static void toolbar_linewrap_all_cb(GtkWidget *widget, gpointer data)
1416 compose_toolbar_cb(A_LINEWRAP_ALL, data);
1420 static void toolbar_check_spelling_cb(GtkWidget *widget, gpointer data)
1422 compose_toolbar_cb(A_CHECK_SPELLING, data);
1426 * Execute actions from toolbar
1428 static void toolbar_actions_execute_cb(GtkWidget *widget, gpointer data)
1430 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1431 GSList *action_list;
1432 MainWindow *mainwin;
1434 MessageView *msgview;
1435 gpointer parent = toolbar_item->parent;
1437 g_return_if_fail(toolbar_item != NULL);
1439 switch (toolbar_item->type) {
1441 mainwin = (MainWindow*)parent;
1442 action_list = mainwin->toolbar->action_list;
1444 case TOOLBAR_COMPOSE:
1445 compose = (Compose*)parent;
1446 action_list = compose->toolbar->action_list;
1448 case TOOLBAR_MSGVIEW:
1449 msgview = (MessageView*)parent;
1450 action_list = msgview->toolbar->action_list;
1453 debug_print("toolbar event not supported\n");
1456 toolbar_action_execute(widget, action_list, parent, toolbar_item->type);
1459 static MainWindow *get_mainwin(gpointer data)
1461 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1462 MainWindow *mainwin = NULL;
1463 MessageView *msgview;
1465 g_return_val_if_fail(toolbar_item != NULL, NULL);
1467 switch(toolbar_item->type) {
1469 mainwin = (MainWindow*)toolbar_item->parent;
1471 case TOOLBAR_MSGVIEW:
1472 msgview = (MessageView*)toolbar_item->parent;
1473 mainwin = (MainWindow*)msgview->mainwin;
1482 static void toolbar_go_folders_cb(GtkWidget *widget, gpointer data)
1484 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1485 MainWindow *mainwin = NULL;
1486 switch(toolbar_item->type) {
1488 mainwin = (MainWindow*)toolbar_item->parent;
1491 g_warning("wrong toolbar type\n");
1495 if (!mainwin->in_folder) {
1496 FolderItem *item = folderview_get_selected_item(mainwin->folderview);
1498 folderview_select(mainwin->folderview, item);
1501 gtk_widget_grab_focus(mainwin->folderview->ctree);
1502 mainwindow_exit_folder(mainwin);
1506 static void toolbar_buttons_cb(GtkWidget *widget,
1513 void (*func)(GtkWidget *widget, gpointer data);
1515 { A_RECEIVE_ALL, toolbar_inc_all_cb },
1516 { A_RECEIVE_CUR, toolbar_inc_cb },
1517 { A_SEND_QUEUED, toolbar_send_queued_cb },
1518 { A_COMPOSE_EMAIL, toolbar_compose_cb },
1519 { A_COMPOSE_NEWS, toolbar_compose_cb },
1520 { A_REPLY_MESSAGE, toolbar_reply_cb },
1521 { A_REPLY_SENDER, toolbar_reply_to_sender_cb },
1522 { A_REPLY_ALL, toolbar_reply_to_all_cb },
1523 { A_REPLY_ML, toolbar_reply_to_list_cb },
1524 { A_FORWARD, toolbar_forward_cb },
1525 { A_TRASH, toolbar_trash_cb },
1526 { A_DELETE_REAL, toolbar_delete_cb },
1527 { A_EXECUTE, toolbar_exec_cb },
1528 { A_GOTO_PREV, toolbar_prev_unread_cb },
1529 { A_GOTO_NEXT, toolbar_next_unread_cb },
1530 { A_IGNORE_THREAD, toolbar_ignore_thread_cb },
1531 { A_PRINT, toolbar_print_cb },
1532 { A_LEARN_SPAM, toolbar_learn_cb },
1533 { A_GO_FOLDERS, toolbar_go_folders_cb },
1535 { A_SEND, toolbar_send_cb },
1536 { A_SENDL, toolbar_send_later_cb },
1537 { A_DRAFT, toolbar_draft_cb },
1538 { A_OPEN_MAIL, toolbar_open_mail_cb },
1539 { A_CLOSE, toolbar_close_cb },
1540 { A_INSERT, toolbar_insert_cb },
1541 { A_ATTACH, toolbar_attach_cb },
1542 { A_SIG, toolbar_sig_cb },
1543 { A_EXTEDITOR, toolbar_ext_editor_cb },
1544 { A_LINEWRAP_CURRENT, toolbar_linewrap_current_cb },
1545 { A_LINEWRAP_ALL, toolbar_linewrap_all_cb },
1546 { A_ADDRBOOK, toolbar_addrbook_cb },
1548 { A_CHECK_SPELLING, toolbar_check_spelling_cb },
1550 { A_SYL_ACTIONS, toolbar_actions_execute_cb },
1551 { A_CANCEL_INC, toolbar_cancel_inc_cb }
1554 num_items = sizeof(callbacks)/sizeof(callbacks[0]);
1556 for (i = 0; i < num_items; i++) {
1557 if (callbacks[i].index == item->index) {
1558 callbacks[i].func(widget, item);
1564 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
1565 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
1566 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1567 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1568 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1569 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1570 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLTIPS(toolbar_tips), \
1574 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
1575 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
1576 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1577 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1578 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1579 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1580 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLTIPS(toolbar_tips), \
1582 gtk_menu_tool_button_set_arrow_tooltip(GTK_MENU_TOOL_BUTTON(item), \
1583 GTK_TOOLTIPS(toolbar_tips), menutip, NULL); \
1586 #define MAKE_MENU(entries,path,btn) { \
1587 n_menu_entries = sizeof(entries) / \
1588 sizeof(entries[0]); \
1589 menu = menu_create_items(entries, n_menu_entries, path, &factory, toolbar_item); \
1590 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(btn), menu); \
1594 * Create a new toolbar with specified type
1595 * if a callback list is passed it will be used before the
1596 * common callback list
1598 Toolbar *toolbar_create(ToolbarType type,
1599 GtkWidget *container,
1602 ToolbarItem *toolbar_item;
1605 GtkWidget *icon_wid = NULL;
1606 GtkWidget *icon_news;
1607 GtkWidget *icon_ham;
1610 guint n_menu_entries;
1611 GtkItemFactory *factory;
1612 GtkTooltips *toolbar_tips;
1613 ToolbarSylpheedActions *action_item;
1615 GSList *toolbar_list;
1616 Toolbar *toolbar_data;
1619 toolbar_tips = gtk_tooltips_new();
1621 toolbar_read_config_file(type);
1622 toolbar_list = toolbar_get_list(type);
1624 toolbar_data = g_new0(Toolbar, 1);
1626 toolbar = gtk_toolbar_new();
1628 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1629 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
1630 gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar), TRUE);
1632 for (cur = toolbar_list; cur != NULL; cur = cur->next) {
1634 if (g_ascii_strcasecmp(((ToolbarItem*)cur->data)->file, TOOLBAR_TAG_SEPARATOR) == 0) {
1635 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new(), -1);
1639 toolbar_item = g_new0(ToolbarItem, 1);
1640 toolbar_item->index = ((ToolbarItem*)cur->data)->index;
1641 toolbar_item->file = g_strdup(((ToolbarItem*)cur->data)->file);
1642 toolbar_item->text = g_strdup(((ToolbarItem*)cur->data)->text);
1643 toolbar_item->parent = data;
1644 toolbar_item->type = type;
1646 /* collect toolbar items in list to keep track */
1647 toolbar_data->item_list =
1648 g_slist_append(toolbar_data->item_list,
1650 icon_wid = stock_pixmap_widget(container, stock_pixmap_get_icon(toolbar_item->file));
1652 switch (toolbar_item->index) {
1655 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to folder list"));
1656 toolbar_data->folders_btn = item;
1659 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1660 _("Receive Mail on all Accounts"),
1661 _("Receive Mail on selected Account"));
1662 toolbar_data->getall_btn = item;
1665 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text, _("Receive Mail on current Account"));
1666 toolbar_data->get_btn = item;
1669 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Queued Messages"));
1670 toolbar_data->send_btn = item;
1673 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Close window"));
1674 toolbar_data->close_window_btn = item;
1677 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Open email"));
1678 toolbar_data->open_mail_btn = item;
1680 case A_COMPOSE_EMAIL:
1682 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1684 _("Compose with selected Account"));
1685 toolbar_data->compose_mail_btn = item;
1687 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1688 TOOLBAR_MENUITEM(item,icon_news,_("Compose"),
1690 _("Compose with selected Account"));
1691 toolbar_data->compose_news_btn = item;
1693 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1694 _("Compose Email"));
1695 toolbar_data->compose_mail_btn = item;
1697 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1698 TOOLBAR_ITEM(item,icon_news,_("Compose"),
1700 toolbar_data->compose_news_btn = item;
1704 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1707 toolbar_data->learn_spam_btn = item;
1709 icon_ham = stock_pixmap_widget(container, STOCK_PIXMAP_HAM_BTN);
1710 TOOLBAR_MENUITEM(item,icon_ham,_("Ham"),
1713 toolbar_data->learn_ham_btn = item;
1715 MAKE_MENU(learn_entries,"<LearnSpam>",toolbar_data->learn_spam_btn);
1716 MAKE_MENU(learn_entries,"<LearnHam>",toolbar_data->learn_ham_btn);
1718 case A_REPLY_MESSAGE:
1720 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1721 _("Reply to Message"),
1722 _("Reply to Message options"));
1723 toolbar_data->reply_btn = item;
1725 MAKE_MENU(reply_entries,"<Reply>",toolbar_data->reply_btn);
1727 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1728 _("Reply to Message"));
1729 toolbar_data->reply_btn = item;
1732 case A_REPLY_SENDER:
1734 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1735 _("Reply to Sender"),
1736 _("Reply to Sender options"));
1737 toolbar_data->replysender_btn = item;
1739 MAKE_MENU(replysender_entries,"<ReplySender>",toolbar_data->replysender_btn);
1741 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1742 _("Reply to Sender"));
1743 toolbar_data->replysender_btn = item;
1748 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1750 _("Reply to All options"));
1751 toolbar_data->replyall_btn = item;
1753 MAKE_MENU(replyall_entries,"<ReplyAll>",toolbar_data->replyall_btn);
1755 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1757 toolbar_data->replyall_btn = item;
1762 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1763 _("Reply to Mailing-list"),
1764 _("Reply to Mailing-list options"));
1765 toolbar_data->replylist_btn = item;
1767 MAKE_MENU(replylist_entries,"<ReplyList>",toolbar_data->replylist_btn);
1769 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1770 _("Reply to Mailing-list"));
1771 toolbar_data->replylist_btn = item;
1776 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1777 _("Forward Message"),
1778 _("Forward Message options"));
1779 toolbar_data->fwd_btn = item;
1781 MAKE_MENU(forward_entries,"<Forward>",toolbar_data->fwd_btn);
1783 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1784 _("Forward Message"));
1785 toolbar_data->fwd_btn = item;
1789 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Trash Message"));
1790 toolbar_data->trash_btn = item;
1793 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Delete Message"));
1794 toolbar_data->delete_btn = item;
1797 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Execute"));
1798 toolbar_data->exec_btn = item;
1801 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Previous Unread Message"));
1802 toolbar_data->prev_btn = item;
1805 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Next Unread Message"));
1806 toolbar_data->next_btn = item;
1809 /* Compose Toolbar */
1811 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Message"));
1812 toolbar_data->send_btn = item;
1815 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Put into queue folder and send later"));
1816 toolbar_data->sendl_btn = item;
1819 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Save to draft folder"));
1820 toolbar_data->draft_btn = item;
1823 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert file"));
1824 toolbar_data->insert_btn = item;
1827 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Attach file"));
1828 toolbar_data->attach_btn = item;
1831 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert signature"));
1832 toolbar_data->sig_btn = item;
1835 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Edit with external editor"));
1836 toolbar_data->exteditor_btn = item;
1838 case A_LINEWRAP_CURRENT:
1839 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap long lines of current paragraph"));
1840 toolbar_data->linewrap_current_btn = item;
1842 case A_LINEWRAP_ALL:
1843 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap all long lines"));
1844 toolbar_data->linewrap_all_btn = item;
1847 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Address book"));
1848 toolbar_data->addrbook_btn = item;
1851 case A_CHECK_SPELLING:
1852 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Check spelling"));
1853 toolbar_data->spellcheck_btn = item;
1858 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,toolbar_item->text);
1859 action_item = g_new0(ToolbarSylpheedActions, 1);
1860 action_item->widget = item;
1861 action_item->name = g_strdup(toolbar_item->text);
1863 toolbar_data->action_list =
1864 g_slist_append(toolbar_data->action_list,
1868 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Cancel receiving"));
1869 toolbar_data->cancel_inc_btn = item;
1872 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1873 toolbar_ret_descr_from_val(toolbar_item->index));
1874 /* find and set the tool tip text */
1879 toolbar_data->toolbar = toolbar;
1880 gtk_widget_show_all(toolbar);
1882 if (type == TOOLBAR_MAIN)
1883 activate_compose_button(toolbar_data,
1884 prefs_common.toolbar_style,
1885 toolbar_data->compose_btn_type);
1886 if (type != TOOLBAR_COMPOSE)
1887 activate_learn_button(toolbar_data, prefs_common.toolbar_style,
1891 gtk_container_add(GTK_CONTAINER(container), toolbar);
1892 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
1894 if ( GTK_IS_WINDOW(container) ) {
1895 hildon_window_add_toolbar (HILDON_WINDOW(container), GTK_TOOLBAR(toolbar));
1896 gtk_widget_show_all (container);
1898 gtk_container_add(GTK_CONTAINER(container), toolbar);
1899 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
1902 return toolbar_data;
1906 * Free toolbar structures
1908 void toolbar_destroy(Toolbar * toolbar) {
1910 TOOLBAR_DESTROY_ITEMS(toolbar->item_list);
1911 TOOLBAR_DESTROY_ACTIONS(toolbar->action_list);
1914 void toolbar_update(ToolbarType type, gpointer data)
1916 Toolbar *toolbar_data;
1917 GtkWidget *handlebox;
1918 MainWindow *mainwin = (MainWindow*)data;
1919 Compose *compose = (Compose*)data;
1920 MessageView *msgview = (MessageView*)data;
1924 toolbar_data = mainwin->toolbar;
1925 handlebox = mainwin->handlebox;
1927 case TOOLBAR_COMPOSE:
1928 toolbar_data = compose->toolbar;
1929 handlebox = compose->handlebox;
1931 case TOOLBAR_MSGVIEW:
1932 toolbar_data = msgview->toolbar;
1933 handlebox = msgview->handlebox;
1939 gtk_container_remove(GTK_CONTAINER(handlebox),
1940 GTK_WIDGET(toolbar_data->toolbar));
1942 toolbar_init(toolbar_data);
1943 toolbar_data = toolbar_create(type, handlebox, data);
1946 mainwin->toolbar = toolbar_data;
1948 case TOOLBAR_COMPOSE:
1949 compose->toolbar = toolbar_data;
1951 case TOOLBAR_MSGVIEW:
1952 msgview->toolbar = toolbar_data;
1956 toolbar_style(type, prefs_common.toolbar_style, data);
1958 if (type == TOOLBAR_MAIN) {
1959 toolbar_main_set_sensitive((MainWindow*)data);
1960 account_set_menu_only_toolbar();
1964 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
1965 gboolean in_btn = FALSE; \
1966 if (GTK_IS_BUTTON(widget)) \
1967 in_btn = GTK_BUTTON(widget)->in_button; \
1968 gtk_widget_set_sensitive(widget, sensitive); \
1969 if (GTK_IS_BUTTON(widget)) \
1970 GTK_BUTTON(widget)->in_button = in_btn; \
1973 void toolbar_main_set_sensitive(gpointer data)
1975 SensitiveCond state;
1977 MainWindow *mainwin = (MainWindow*)data;
1978 Toolbar *toolbar = mainwin->toolbar;
1980 GSList *entry_list = NULL;
1982 typedef struct _Entry Entry;
1989 #define SET_WIDGET_COND(w, c) \
1991 Entry *e = g_new0(Entry, 1); \
1994 entry_list = g_slist_append(entry_list, e); \
1998 if (toolbar->get_btn)
1999 SET_WIDGET_COND(toolbar->get_btn,
2000 M_HAVE_ACCOUNT|M_UNLOCKED);
2002 if (toolbar->getall_btn) {
2003 SET_WIDGET_COND(toolbar->getall_btn,
2004 M_HAVE_ACCOUNT|M_UNLOCKED);
2006 if (toolbar->send_btn) {
2007 SET_WIDGET_COND(toolbar->send_btn,
2008 M_HAVE_QUEUED_MAILS);
2010 if (toolbar->compose_mail_btn) {
2011 SET_WIDGET_COND(toolbar->compose_news_btn,
2014 if (toolbar->close_window_btn) {
2015 SET_WIDGET_COND(toolbar->compose_news_btn,
2018 if (toolbar->open_mail_btn) {
2019 SET_WIDGET_COND(toolbar->open_mail_btn,
2022 if (toolbar->reply_btn) {
2023 SET_WIDGET_COND(toolbar->reply_btn,
2024 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2026 if (toolbar->replyall_btn) {
2027 SET_WIDGET_COND(toolbar->replyall_btn,
2028 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2030 if (toolbar->replylist_btn) {
2031 SET_WIDGET_COND(toolbar->replylist_btn,
2032 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2034 if (toolbar->replysender_btn) {
2035 SET_WIDGET_COND(toolbar->replysender_btn,
2036 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2038 if (toolbar->fwd_btn) {
2039 SET_WIDGET_COND(toolbar->fwd_btn,
2040 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2043 if (prefs_common.next_unread_msg_dialog == NEXTUNREADMSGDIALOG_ASSUME_NO) {
2044 SET_WIDGET_COND(toolbar->next_btn, M_MSG_EXIST);
2046 SET_WIDGET_COND(toolbar->next_btn, 0);
2049 if (toolbar->trash_btn)
2050 SET_WIDGET_COND(toolbar->trash_btn,
2051 M_TARGET_EXIST|M_ALLOW_DELETE);
2053 if (toolbar->delete_btn)
2054 SET_WIDGET_COND(toolbar->delete_btn,
2055 M_TARGET_EXIST|M_ALLOW_DELETE);
2057 if (toolbar->exec_btn)
2058 SET_WIDGET_COND(toolbar->exec_btn,
2061 if (toolbar->learn_ham_btn)
2062 SET_WIDGET_COND(toolbar->learn_ham_btn,
2063 M_TARGET_EXIST|M_CAN_LEARN_SPAM);
2065 if (toolbar->learn_spam_btn)
2066 SET_WIDGET_COND(toolbar->learn_spam_btn,
2067 M_TARGET_EXIST|M_CAN_LEARN_SPAM);
2069 if (toolbar->cancel_inc_btn)
2070 SET_WIDGET_COND(toolbar->cancel_inc_btn,
2073 for (cur = toolbar->action_list; cur != NULL; cur = cur->next) {
2074 ToolbarSylpheedActions *act = (ToolbarSylpheedActions*)cur->data;
2076 SET_WIDGET_COND(act->widget, M_TARGET_EXIST|M_UNLOCKED);
2079 #undef SET_WIDGET_COND
2081 state = main_window_get_current_state(mainwin);
2083 for (cur = entry_list; cur != NULL; cur = cur->next) {
2084 Entry *e = (Entry*) cur->data;
2086 if (e->widget != NULL) {
2087 sensitive = ((e->cond & state) == e->cond);
2088 GTK_BUTTON_SET_SENSITIVE(e->widget, sensitive);
2092 while (entry_list != NULL) {
2093 Entry *e = (Entry*) entry_list->data;
2096 entry_list = g_slist_remove(entry_list, e);
2099 g_slist_free(entry_list);
2101 activate_compose_button(toolbar,
2102 prefs_common.toolbar_style,
2103 toolbar->compose_btn_type);
2107 void toolbar_comp_set_sensitive(gpointer data, gboolean sensitive)
2109 Compose *compose = (Compose*)data;
2110 GSList *items = compose->toolbar->action_list;
2112 if (compose->toolbar->send_btn)
2113 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->send_btn, sensitive);
2114 if (compose->toolbar->sendl_btn)
2115 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sendl_btn, sensitive);
2116 if (compose->toolbar->draft_btn )
2117 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->draft_btn , sensitive);
2118 if (compose->toolbar->insert_btn )
2119 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->insert_btn , sensitive);
2120 if (compose->toolbar->attach_btn)
2121 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->attach_btn, sensitive);
2122 if (compose->toolbar->sig_btn)
2123 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sig_btn, sensitive);
2124 if (compose->toolbar->exteditor_btn)
2125 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->exteditor_btn, sensitive);
2126 if (compose->toolbar->linewrap_current_btn)
2127 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_current_btn, sensitive);
2128 if (compose->toolbar->linewrap_all_btn)
2129 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_all_btn, sensitive);
2130 if (compose->toolbar->addrbook_btn)
2131 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->addrbook_btn, sensitive);
2133 if (compose->toolbar->spellcheck_btn)
2134 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->spellcheck_btn, sensitive);
2136 for (; items != NULL; items = g_slist_next(items)) {
2137 ToolbarSylpheedActions *item = (ToolbarSylpheedActions *)items->data;
2138 GTK_BUTTON_SET_SENSITIVE(item->widget, sensitive);
2143 * Initialize toolbar structure
2145 void toolbar_init(Toolbar * toolbar) {
2147 toolbar->toolbar = NULL;
2148 toolbar->folders_btn = NULL;
2149 toolbar->get_btn = NULL;
2150 toolbar->getall_btn = NULL;
2151 toolbar->send_btn = NULL;
2152 toolbar->compose_mail_btn = NULL;
2153 toolbar->compose_news_btn = NULL;
2154 toolbar->reply_btn = NULL;
2155 toolbar->replysender_btn = NULL;
2156 toolbar->replyall_btn = NULL;
2157 toolbar->replylist_btn = NULL;
2158 toolbar->fwd_btn = NULL;
2159 toolbar->trash_btn = NULL;
2160 toolbar->delete_btn = NULL;
2161 toolbar->prev_btn = NULL;
2162 toolbar->next_btn = NULL;
2163 toolbar->exec_btn = NULL;
2164 toolbar->open_mail_btn = NULL;
2165 toolbar->close_window_btn = NULL;
2166 /* compose buttons */
2167 toolbar->sendl_btn = NULL;
2168 toolbar->draft_btn = NULL;
2169 toolbar->insert_btn = NULL;
2170 toolbar->attach_btn = NULL;
2171 toolbar->sig_btn = NULL;
2172 toolbar->exteditor_btn = NULL;
2173 toolbar->linewrap_current_btn = NULL;
2174 toolbar->linewrap_all_btn = NULL;
2175 toolbar->addrbook_btn = NULL;
2177 toolbar->spellcheck_btn = NULL;
2180 toolbar_destroy(toolbar);
2185 static void toolbar_reply(gpointer data, guint action)
2187 ToolbarItem *toolbar_item = (ToolbarItem*)data;
2188 MainWindow *mainwin;
2189 MessageView *msgview;
2190 GSList *msginfo_list = NULL;
2192 g_return_if_fail(toolbar_item != NULL);
2194 switch (toolbar_item->type) {
2196 mainwin = (MainWindow*)toolbar_item->parent;
2197 msginfo_list = summary_get_selection(mainwin->summaryview);
2198 msgview = (MessageView*)mainwin->messageview;
2200 case TOOLBAR_MSGVIEW:
2201 msgview = (MessageView*)toolbar_item->parent;
2202 g_return_if_fail(msgview != NULL);
2203 msginfo_list = g_slist_append(msginfo_list, msgview->msginfo);
2209 g_return_if_fail(msgview != NULL);
2210 g_return_if_fail(msginfo_list != NULL);
2211 compose_reply_from_messageview(msgview, msginfo_list, action);
2212 g_slist_free(msginfo_list);
2214 /* TODO: update reply state ion summaryview */
2218 /* exported functions */
2220 void inc_mail_cb(gpointer data, guint action, GtkWidget *widget)
2222 MainWindow *mainwin = (MainWindow*)data;
2224 inc_mail(mainwin, prefs_common.newmail_notify_manu);
2227 void inc_all_account_mail_cb(gpointer data, guint action, GtkWidget *widget)
2229 MainWindow *mainwin = (MainWindow*)data;
2231 inc_all_account_mail(mainwin, FALSE, prefs_common.newmail_notify_manu);
2234 void send_queue_cb(gpointer data, guint action, GtkWidget *widget)
2238 gboolean got_error = FALSE;
2239 gchar *errstr = NULL;
2241 if (prefs_common.work_offline)
2242 if (alertpanel(_("Offline warning"),
2243 _("You're working offline. Override?"),
2244 GTK_STOCK_NO, GTK_STOCK_YES,
2245 NULL) != G_ALERTALTERNATE)
2248 /* ask for confirmation before sending queued messages only
2249 in online mode and if there is at least one message queued
2250 in any of the folder queue
2252 if (prefs_common.confirm_send_queued_messages) {
2254 /* check if there's a queued message */
2255 for (list = folder_get_list(); !found && list != NULL; list = list->next) {
2256 Folder *folder = list->data;
2258 found = !procmsg_queue_is_empty(folder->queue);
2260 /* if necessary, ask for confirmation before sending */
2261 if (found && !prefs_common.work_offline) {
2262 if (alertpanel(_("Send queued messages"),
2263 _("Send all queued messages?"),
2264 GTK_STOCK_CANCEL, _("_Send"),
2265 NULL) != G_ALERTALTERNATE)
2270 for (list = folder_get_list(); list != NULL; list = list->next) {
2271 Folder *folder = list->data;
2273 if (folder->queue) {
2274 if (procmsg_send_queue(folder->queue,
2275 prefs_common.savemsg,
2282 alertpanel_error_log(_("Some errors occurred while "
2283 "sending queued messages."));
2285 gchar *tmp = g_strdup_printf(_("Some errors occurred "
2286 "while sending queued messages:\n%s"), errstr);
2288 alertpanel_error_log(tmp);
2294 void compose_mail_cb(gpointer data, guint action, GtkWidget *widget)
2296 MainWindow *mainwin = (MainWindow*)data;
2297 PrefsAccount *ac = NULL;
2298 FolderItem *item = mainwin->summaryview->folder_item;
2303 ac = account_find_from_item(item);
2304 if (ac && ac->protocol != A_NNTP) {
2305 compose_new_with_folderitem(ac, item, NULL); /* CLAWS */
2311 * CLAWS - use current account
2313 if (cur_account && (cur_account->protocol != A_NNTP)) {
2314 compose_new_with_folderitem(cur_account, item, NULL);
2319 * CLAWS - just get the first one
2321 list = account_get_list();
2322 for (cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2323 ac = (PrefsAccount *) cur->data;
2324 if (ac->protocol != A_NNTP) {
2325 compose_new_with_folderitem(ac, item, NULL);
2331 void compose_news_cb(gpointer data, guint action, GtkWidget *widget)
2333 MainWindow *mainwin = (MainWindow*)data;
2334 PrefsAccount * ac = NULL;
2338 if (mainwin->summaryview->folder_item) {
2339 ac = mainwin->summaryview->folder_item->folder->account;
2340 if (ac && ac->protocol == A_NNTP) {
2341 compose_new_with_folderitem(ac,
2342 mainwin->summaryview->folder_item, NULL);
2347 list = account_get_list();
2348 for(cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2349 ac = (PrefsAccount *) cur->data;
2350 if (ac->protocol == A_NNTP) {
2351 compose_new_with_folderitem(ac,
2352 mainwin->summaryview->folder_item, NULL);