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_watch_thread_cb (GtkWidget *widget,
133 static void toolbar_print_cb (GtkWidget *widget,
136 static void toolbar_actions_execute_cb (GtkWidget *widget,
140 static void toolbar_send_cb (GtkWidget *widget,
142 static void toolbar_send_later_cb (GtkWidget *widget,
144 static void toolbar_draft_cb (GtkWidget *widget,
146 static void toolbar_close_cb (GtkWidget *widget,
148 static void toolbar_open_mail_cb (GtkWidget *widget,
150 static void toolbar_insert_cb (GtkWidget *widget,
152 static void toolbar_attach_cb (GtkWidget *widget,
154 static void toolbar_sig_cb (GtkWidget *widget,
156 static void toolbar_ext_editor_cb (GtkWidget *widget,
158 static void toolbar_linewrap_current_cb (GtkWidget *widget,
160 static void toolbar_linewrap_all_cb (GtkWidget *widget,
162 static void toolbar_addrbook_cb (GtkWidget *widget,
165 static void toolbar_check_spelling_cb (GtkWidget *widget,
168 static void toolbar_cancel_inc_cb (GtkWidget *widget,
174 } toolbar_text [] = {
175 { "A_RECEIVE_ALL", N_("Receive Mail on all Accounts") },
176 { "A_RECEIVE_CUR", N_("Receive Mail on current Account") },
177 { "A_SEND_QUEUED", N_("Send Queued Messages") },
178 { "A_COMPOSE_EMAIL", N_("Compose Email") },
179 { "A_COMPOSE_NEWS", N_("Compose News") },
180 { "A_REPLY_MESSAGE", N_("Reply to Message") },
181 { "A_REPLY_SENDER", N_("Reply to Sender") },
182 { "A_REPLY_ALL", N_("Reply to All") },
183 { "A_REPLY_ML", N_("Reply to Mailing-list") },
184 { "A_OPEN_MAIL", N_("Open email") },
185 { "A_FORWARD", N_("Forward Message") },
186 { "A_TRASH", N_("Trash Message") },
187 { "A_DELETE_REAL", N_("Delete Message") },
188 { "A_EXECUTE", N_("Execute") },
189 { "A_GOTO_PREV", N_("Go to Previous Unread Message") },
190 { "A_GOTO_NEXT", N_("Go to Next Unread Message") },
191 { "A_IGNORE_THREAD", N_("Ignore thread") },
192 { "A_WATCH_THREAD", N_("Watch thread") },
193 { "A_PRINT", N_("Print") },
194 { "A_LEARN_SPAM", N_("Learn Spam or Ham") },
195 { "A_GO_FOLDERS", N_("Open folder/Go to folder list") },
197 { "A_SEND", N_("Send Message") },
198 { "A_SENDL", N_("Put into queue folder and send later") },
199 { "A_DRAFT", N_("Save to draft folder") },
200 { "A_INSERT", N_("Insert file") },
201 { "A_ATTACH", N_("Attach file") },
202 { "A_SIG", N_("Insert signature") },
203 { "A_EXTEDITOR", N_("Edit with external editor") },
204 { "A_LINEWRAP_CURRENT", N_("Wrap long lines of current paragraph") },
205 { "A_LINEWRAP_ALL", N_("Wrap all long lines") },
206 { "A_ADDRBOOK", N_("Address book") },
208 { "A_CHECK_SPELLING", N_("Check spelling") },
210 { "A_SYL_ACTIONS", N_("Claws Mail Actions Feature") },
211 { "A_CANCEL_INC", N_("Cancel receiving") },
212 { "A_CLOSE", N_("Close window") },
213 { "A_SEPARATOR", "Separator" }
216 /* struct holds configuration files and a list of
217 * currently active toolbar items
218 * TOOLBAR_MAIN, TOOLBAR_COMPOSE and TOOLBAR_MSGVIEW
222 const gchar *conf_file;
224 } toolbar_config[3] = {
225 { "toolbar_main.xml", NULL},
226 { "toolbar_compose.xml", NULL},
227 { "toolbar_msgview.xml", NULL}
230 static GtkItemFactoryEntry reply_entries[] =
232 {N_("/Reply with _quote"), NULL, toolbar_reply, COMPOSE_REPLY_WITH_QUOTE, NULL},
233 {N_("/_Reply without quote"), NULL, toolbar_reply, COMPOSE_REPLY_WITHOUT_QUOTE, NULL}
235 static GtkItemFactoryEntry replyall_entries[] =
237 {N_("/Reply to all with _quote"), "<shift>A", toolbar_reply, COMPOSE_REPLY_TO_ALL_WITH_QUOTE, NULL},
238 {N_("/_Reply to all without quote"), "a", toolbar_reply, COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE, NULL}
240 static GtkItemFactoryEntry replylist_entries[] =
242 {N_("/Reply to list with _quote"), NULL, toolbar_reply, COMPOSE_REPLY_TO_LIST_WITH_QUOTE, NULL},
243 {N_("/_Reply to list without quote"), NULL, toolbar_reply, COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE, NULL}
245 static GtkItemFactoryEntry replysender_entries[] =
247 {N_("/Reply to sender with _quote"), NULL, toolbar_reply, COMPOSE_REPLY_TO_SENDER_WITH_QUOTE, NULL},
248 {N_("/_Reply to sender without quote"), NULL, toolbar_reply, COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE, NULL}
250 static GtkItemFactoryEntry forward_entries[] =
252 {N_("/_Forward"), "f", toolbar_reply, COMPOSE_FORWARD_INLINE, NULL},
253 {N_("/For_ward as attachment"), "<shift>F", toolbar_reply, COMPOSE_FORWARD_AS_ATTACH, NULL},
254 {N_("/Redirec_t"), NULL, toolbar_reply, COMPOSE_REDIRECT, NULL}
256 static GtkItemFactoryEntry learn_entries[] =
258 {N_("/Learn as _Spam"), NULL, toolbar_learn, TRUE, NULL},
259 {N_("/Learn as _Ham"), NULL, toolbar_learn, FALSE, NULL}
263 gint toolbar_ret_val_from_descr(const gchar *descr)
267 for (i = 0; i < N_ACTION_VAL; i++) {
268 if (g_utf8_collate(gettext(toolbar_text[i].descr), descr) == 0)
275 gchar *toolbar_ret_descr_from_val(gint val)
277 g_return_val_if_fail(val >=0 && val < N_ACTION_VAL, NULL);
279 return gettext(toolbar_text[val].descr);
282 static gint toolbar_ret_val_from_text(const gchar *text)
286 for (i = 0; i < N_ACTION_VAL; i++) {
287 if (g_utf8_collate(toolbar_text[i].index_str, text) == 0)
294 static gchar *toolbar_ret_text_from_val(gint val)
296 g_return_val_if_fail(val >=0 && val < N_ACTION_VAL, NULL);
298 return toolbar_text[val].index_str;
301 static gboolean toolbar_is_duplicate(gint action, ToolbarType source)
305 if ((action == A_SEPARATOR) || (action == A_SYL_ACTIONS))
308 for (cur = toolbar_config[source].item_list; cur != NULL; cur = cur->next) {
309 ToolbarItem *item = (ToolbarItem*) cur->data;
311 if (item->index == action)
317 /* depending on toolbar type this function
318 returns a list of available toolbar events being
319 displayed by prefs_toolbar
321 GList *toolbar_get_action_items(ToolbarType source)
326 if (source == TOOLBAR_MAIN) {
327 gint main_items[] = { A_RECEIVE_ALL, A_RECEIVE_CUR, A_SEND_QUEUED,
328 A_COMPOSE_EMAIL, A_REPLY_MESSAGE, A_REPLY_SENDER,
329 A_REPLY_ALL, A_REPLY_ML, A_OPEN_MAIL, A_FORWARD,
330 A_TRASH , A_DELETE_REAL, A_EXECUTE, A_GOTO_PREV,
331 A_GOTO_NEXT, A_IGNORE_THREAD, A_WATCH_THREAD, A_PRINT,
332 A_ADDRBOOK, A_LEARN_SPAM, A_GO_FOLDERS,
333 A_SYL_ACTIONS, A_CANCEL_INC };
335 for (i = 0; i < sizeof main_items / sizeof main_items[0]; i++) {
336 items = g_list_append(items, gettext(toolbar_text[main_items[i]].descr));
339 else if (source == TOOLBAR_COMPOSE) {
340 gint comp_items[] = { A_SEND, A_SENDL, A_DRAFT,
341 A_INSERT, A_ATTACH, A_SIG,
342 A_EXTEDITOR, A_LINEWRAP_CURRENT,
343 A_LINEWRAP_ALL, A_ADDRBOOK,
347 A_SYL_ACTIONS, A_CLOSE };
349 for (i = 0; i < sizeof comp_items / sizeof comp_items[0]; i++)
350 items = g_list_append(items, gettext(toolbar_text[comp_items[i]].descr));
352 else if (source == TOOLBAR_MSGVIEW) {
353 gint msgv_items[] = { A_COMPOSE_EMAIL, A_REPLY_MESSAGE, A_REPLY_SENDER,
354 A_REPLY_ALL, A_REPLY_ML, A_FORWARD,
355 A_TRASH, A_DELETE_REAL, A_GOTO_PREV, A_GOTO_NEXT,
356 A_ADDRBOOK, A_LEARN_SPAM, A_SYL_ACTIONS, A_CLOSE };
358 for (i = 0; i < sizeof msgv_items / sizeof msgv_items[0]; i++)
359 items = g_list_append(items, gettext(toolbar_text[msgv_items[i]].descr));
365 static void toolbar_parse_item(XMLFile *file, ToolbarType source)
369 ToolbarItem *item = NULL;
370 gboolean rewrite = FALSE;
372 attr = xml_get_current_tag_attr(file);
373 item = g_new0(ToolbarItem, 1);
375 name = ((XMLAttr *)attr->data)->name;
376 value = ((XMLAttr *)attr->data)->value;
378 if (g_utf8_collate(name, TOOLBAR_ICON_FILE) == 0)
379 item->file = g_strdup (value);
380 else if (g_utf8_collate(name, TOOLBAR_ICON_TEXT) == 0)
381 item->text = g_strdup (gettext(value));
382 else if (g_utf8_collate(name, TOOLBAR_ICON_ACTION) == 0)
383 item->index = toolbar_ret_val_from_text(value);
384 if (item->index == -1 && !strcmp(value, "A_DELETE")) {
386 item->index = A_TRASH;
388 item->file = g_strdup("trash_btn");
390 item->text = g_strdup(_("Trash"));
393 attr = g_list_next(attr);
395 if (item->index != -1) {
397 if (!toolbar_is_duplicate(item->index, source))
398 toolbar_config[source].item_list = g_slist_append(toolbar_config[source].item_list,
402 toolbar_save_config_file(source);
406 static void toolbar_set_default_main(void)
412 } default_toolbar[] = {
414 { A_GO_FOLDERS, STOCK_PIXMAP_GO_FOLDERS, _("Folders") },
415 { A_OPEN_MAIL, STOCK_PIXMAP_OPEN_MAIL, _("Open") },
416 { A_SEPARATOR, 0, ("") },
418 { A_RECEIVE_ALL, STOCK_PIXMAP_MAIL_RECEIVE_ALL, _("Get Mail")},
419 { A_SEPARATOR, 0, ("") },
420 { A_SEND_QUEUED, STOCK_PIXMAP_MAIL_SEND_QUEUE, _("Send") },
421 { A_COMPOSE_EMAIL, STOCK_PIXMAP_MAIL_COMPOSE,
422 (gchar*)Q_("Toolbar|Compose") },
423 { A_SEPARATOR, 0, ("") },
424 { A_REPLY_MESSAGE, STOCK_PIXMAP_MAIL_REPLY, _("Reply") },
426 { A_REPLY_ALL, STOCK_PIXMAP_MAIL_REPLY_TO_ALL, _("All") },
427 { A_REPLY_SENDER, STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR, _("Sender") },
429 { A_FORWARD, STOCK_PIXMAP_MAIL_FORWARD, _("Forward") },
430 { A_SEPARATOR, 0, ("") },
431 { A_TRASH, STOCK_PIXMAP_TRASH, _("Trash") },
433 #if (defined(USE_SPAMASSASSIN_PLUGIN) || defined(USE_BOGOFILTER_PLUGIN))
434 { A_LEARN_SPAM, STOCK_PIXMAP_SPAM_BTN, _("Spam") },
437 { A_SEPARATOR, 0, ("") },
438 { A_GOTO_NEXT, STOCK_PIXMAP_DOWN_ARROW, _("Next") }
443 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
445 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
447 if (default_toolbar[i].action != A_SEPARATOR) {
449 gchar *file = stock_pixmap_get_name((StockPixmap)default_toolbar[i].icon);
451 toolbar_item->file = g_strdup(file);
452 toolbar_item->index = default_toolbar[i].action;
453 toolbar_item->text = g_strdup(default_toolbar[i].text);
456 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
457 toolbar_item->index = A_SEPARATOR;
460 if (toolbar_item->index != -1) {
461 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_MAIN))
462 toolbar_config[TOOLBAR_MAIN].item_list =
463 g_slist_append(toolbar_config[TOOLBAR_MAIN].item_list, toolbar_item);
468 static void toolbar_set_default_compose(void)
474 } default_toolbar[] = {
476 { A_CLOSE, STOCK_PIXMAP_CLOSE, _("Close") },
477 { A_SEPARATOR, 0, ("") },
479 { A_SEND, STOCK_PIXMAP_MAIL_SEND, _("Send") },
480 { A_SENDL, STOCK_PIXMAP_MAIL_SEND_QUEUE, _("Send later") },
481 { A_DRAFT, STOCK_PIXMAP_MAIL, _("Draft") },
482 { A_SEPARATOR, 0, ("") },
484 { A_INSERT, STOCK_PIXMAP_INSERT_FILE, _("Insert") },
486 { A_ATTACH, STOCK_PIXMAP_MAIL_ATTACH, _("Attach") },
487 { A_SEPARATOR, 0, ("") },
488 { A_ADDRBOOK, STOCK_PIXMAP_ADDRESS_BOOK, _("Address") }
493 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
495 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
497 if (default_toolbar[i].action != A_SEPARATOR) {
499 gchar *file = stock_pixmap_get_name((StockPixmap)default_toolbar[i].icon);
501 toolbar_item->file = g_strdup(file);
502 toolbar_item->index = default_toolbar[i].action;
503 toolbar_item->text = g_strdup(default_toolbar[i].text);
506 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
507 toolbar_item->index = A_SEPARATOR;
510 if (toolbar_item->index != -1) {
511 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_COMPOSE))
512 toolbar_config[TOOLBAR_COMPOSE].item_list =
513 g_slist_append(toolbar_config[TOOLBAR_COMPOSE].item_list, toolbar_item);
518 static void toolbar_set_default_msgview(void)
524 } default_toolbar[] = {
526 { A_CLOSE, STOCK_PIXMAP_CLOSE, _("Close") },
527 { A_SEPARATOR, 0, ("") },
529 { A_REPLY_MESSAGE, STOCK_PIXMAP_MAIL_REPLY, _("Reply") },
530 { A_REPLY_ALL, STOCK_PIXMAP_MAIL_REPLY_TO_ALL, _("All") },
531 { A_REPLY_SENDER, STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR, _("Sender") },
532 { A_FORWARD, STOCK_PIXMAP_MAIL_FORWARD, _("Forward") },
533 { A_SEPARATOR, 0, ("") },
534 { A_TRASH, STOCK_PIXMAP_TRASH, _("Trash") },
536 #if (defined(USE_SPAMASSASSIN_PLUGIN) || defined(USE_BOGOFILTER_PLUGIN))
537 { A_LEARN_SPAM, STOCK_PIXMAP_SPAM_BTN, _("Spam") },
540 { A_GOTO_NEXT, STOCK_PIXMAP_DOWN_ARROW, _("Next") }
545 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
547 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
549 if (default_toolbar[i].action != A_SEPARATOR) {
551 gchar *file = stock_pixmap_get_name((StockPixmap)default_toolbar[i].icon);
553 toolbar_item->file = g_strdup(file);
554 toolbar_item->index = default_toolbar[i].action;
555 toolbar_item->text = g_strdup(default_toolbar[i].text);
558 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
559 toolbar_item->index = A_SEPARATOR;
562 if (toolbar_item->index != -1) {
563 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_MSGVIEW))
564 toolbar_config[TOOLBAR_MSGVIEW].item_list =
565 g_slist_append(toolbar_config[TOOLBAR_MSGVIEW].item_list, toolbar_item);
570 void toolbar_set_default(ToolbarType source)
572 if (source == TOOLBAR_MAIN)
573 toolbar_set_default_main();
574 else if (source == TOOLBAR_COMPOSE)
575 toolbar_set_default_compose();
576 else if (source == TOOLBAR_MSGVIEW)
577 toolbar_set_default_msgview();
580 void toolbar_save_config_file(ToolbarType source)
585 gchar *fileSpec = NULL;
587 debug_print("save Toolbar Configuration to %s\n", toolbar_config[source].conf_file);
589 fileSpec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, toolbar_config[source].conf_file, NULL );
590 pfile = prefs_write_open(fileSpec);
594 fprintf(fp, "<?xml version=\"1.0\" encoding=\"%s\" ?>\n", CS_INTERNAL);
596 fprintf(fp, "<%s>\n", TOOLBAR_TAG_INDEX);
598 for (cur = toolbar_config[source].item_list; cur != NULL; cur = cur->next) {
599 ToolbarItem *toolbar_item = (ToolbarItem*) cur->data;
601 if (toolbar_item->index != A_SEPARATOR) {
602 fprintf(fp, "\t<%s %s=\"%s\" %s=\"",
604 TOOLBAR_ICON_FILE, toolbar_item->file,
606 xml_file_put_escape_str(fp, toolbar_item->text);
607 fprintf(fp, "\" %s=\"%s\"/>\n",
609 toolbar_ret_text_from_val(toolbar_item->index));
611 fprintf(fp, "\t<%s/>\n", TOOLBAR_TAG_SEPARATOR);
615 fprintf(fp, "</%s>\n", TOOLBAR_TAG_INDEX);
617 if (prefs_file_close (pfile) < 0 )
618 g_warning("failed to write toolbar configuration to file\n");
620 g_warning("failed to open toolbar configuration file for writing\n");
623 void toolbar_read_config_file(ToolbarType source)
625 XMLFile *file = NULL;
626 gchar *fileSpec = NULL;
631 debug_print("read Toolbar Configuration from %s\n", toolbar_config[source].conf_file);
633 fileSpec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, toolbar_config[source].conf_file, NULL );
634 file = xml_open_file(fileSpec);
637 toolbar_clear_list(source);
641 || (xml_get_dtd(file))
642 || (xml_parse_next_tag(file))
643 || (!xml_compare_tag(file, TOOLBAR_TAG_INDEX))) {
644 xml_close_file(file);
648 attr = xml_get_current_tag_attr(file);
655 if (xml_parse_next_tag(file))
658 /* Get next tag (icon, icon_text or icon_action) */
659 if (xml_compare_tag(file, TOOLBAR_TAG_ITEM)) {
660 toolbar_parse_item(file, source);
661 } else if (xml_compare_tag(file, TOOLBAR_TAG_SEPARATOR)) {
662 ToolbarItem *item = g_new0(ToolbarItem, 1);
664 item->file = g_strdup(toolbar_ret_descr_from_val(A_SEPARATOR));
665 item->index = A_SEPARATOR;
666 toolbar_config[source].item_list =
667 g_slist_append(toolbar_config[source].item_list, item);
671 xml_close_file(file);
674 if ((!file) || (g_slist_length(toolbar_config[source].item_list) == 0)) {
676 if (source == TOOLBAR_MAIN)
677 toolbar_set_default(TOOLBAR_MAIN);
678 else if (source == TOOLBAR_COMPOSE)
679 toolbar_set_default(TOOLBAR_COMPOSE);
680 else if (source == TOOLBAR_MSGVIEW)
681 toolbar_set_default(TOOLBAR_MSGVIEW);
683 g_warning("failed to write Toolbar Configuration to %s\n", toolbar_config[source].conf_file);
687 toolbar_save_config_file(source);
692 * clears list of toolbar items read from configuration files
694 void toolbar_clear_list(ToolbarType source)
696 while (toolbar_config[source].item_list != NULL) {
697 ToolbarItem *item = (ToolbarItem*) toolbar_config[source].item_list->data;
699 toolbar_config[source].item_list =
700 g_slist_remove(toolbar_config[source].item_list, item);
706 g_slist_free(toolbar_config[source].item_list);
711 * return list of Toolbar items
713 GSList *toolbar_get_list(ToolbarType source)
717 if ((source == TOOLBAR_MAIN) || (source == TOOLBAR_COMPOSE) || (source == TOOLBAR_MSGVIEW))
718 list = toolbar_config[source].item_list;
723 void toolbar_set_list_item(ToolbarItem *t_item, ToolbarType source)
725 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
727 toolbar_item->file = g_strdup(t_item->file);
728 toolbar_item->text = g_strdup(t_item->text);
729 toolbar_item->index = t_item->index;
731 toolbar_config[source].item_list =
732 g_slist_append(toolbar_config[source].item_list,
736 void toolbar_action_execute(GtkWidget *widget,
742 gchar *action, *action_p;
743 gboolean found = FALSE;
746 for (cur = action_list; cur != NULL; cur = cur->next) {
747 ToolbarSylpheedActions *act = (ToolbarSylpheedActions*)cur->data;
749 if (widget == act->widget) {
751 for (lop = prefs_common.actions_list; lop != NULL; lop = lop->next) {
752 action = g_strdup((gchar*)lop->data);
754 action_p = strstr(action, ": ");
756 if (g_utf8_collate(act->name, action) == 0) {
770 actions_execute(data, i, widget, source);
772 g_warning ("Error: did not find Claws Action to execute");
775 static void activate_compose_button (Toolbar *toolbar,
777 ComposeButtonType type)
779 if ((!toolbar->compose_mail_btn))
782 if (type == COMPOSEBUTTON_NEWS) {
783 gtk_tool_button_set_icon_widget(
784 GTK_TOOL_BUTTON(toolbar->compose_mail_btn),
785 toolbar->compose_news_icon);
786 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolbar->compose_mail_btn), GTK_TOOLTIPS(toolbar->tooltips),
787 _("Compose News message"), NULL);
788 gtk_widget_show(toolbar->compose_news_icon);
790 gtk_tool_button_set_icon_widget(
791 GTK_TOOL_BUTTON(toolbar->compose_mail_btn),
792 toolbar->compose_mail_icon);
793 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolbar->compose_mail_btn), GTK_TOOLTIPS(toolbar->tooltips),
794 _("Compose Email"), NULL);
795 gtk_widget_show(toolbar->compose_mail_icon);
797 toolbar->compose_btn_type = type;
800 void toolbar_set_compose_button(Toolbar *toolbar,
801 ComposeButtonType compose_btn_type)
803 if (toolbar->compose_btn_type != compose_btn_type)
804 activate_compose_button(toolbar,
805 prefs_common.toolbar_style,
809 static void activate_learn_button (Toolbar *toolbar,
811 LearnButtonType type)
813 if ((!toolbar->learn_spam_btn))
816 if (type == LEARN_SPAM) {
817 gtk_tool_button_set_icon_widget(
818 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
819 toolbar->learn_spam_icon);
820 gtk_tool_button_set_label(
821 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
823 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolbar->learn_spam_btn), GTK_TOOLTIPS(toolbar->tooltips),
824 _("Learn spam"), NULL);
825 gtk_widget_show(toolbar->learn_spam_icon);
827 gtk_tool_button_set_icon_widget(
828 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
829 toolbar->learn_ham_icon);
830 gtk_tool_button_set_label(
831 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
833 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(toolbar->learn_spam_btn), GTK_TOOLTIPS(toolbar->tooltips),
834 _("Learn ham"), NULL);
835 gtk_widget_show(toolbar->learn_ham_icon);
837 toolbar->learn_btn_type = type;
840 void toolbar_set_learn_button(Toolbar *toolbar,
841 LearnButtonType learn_btn_type)
843 if (toolbar->learn_btn_type != learn_btn_type)
844 activate_learn_button(toolbar,
845 prefs_common.toolbar_style,
849 void toolbar_toggle(guint action, gpointer data)
851 MainWindow *mainwin = (MainWindow*)data;
855 g_return_if_fail(mainwin != NULL);
857 toolbar_style(TOOLBAR_MAIN, action, mainwin);
859 list = compose_get_compose_list();
860 for (cur = list; cur != NULL; cur = cur->next) {
861 toolbar_style(TOOLBAR_COMPOSE, action, cur->data);
863 list = messageview_get_msgview_list();
864 for (cur = list; cur != NULL; cur = cur->next) {
865 toolbar_style(TOOLBAR_MSGVIEW, action, cur->data);
870 void toolbar_set_style(GtkWidget *toolbar_wid, GtkWidget *handlebox_wid, guint action)
872 switch ((ToolbarStyle)action) {
874 gtk_widget_hide(handlebox_wid);
877 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
881 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
885 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
888 case TOOLBAR_BOTH_HORIZ:
889 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
890 GTK_TOOLBAR_BOTH_HORIZ);
896 prefs_common.toolbar_style = (ToolbarStyle)action;
897 gtk_widget_set_size_request(handlebox_wid, 1, -1);
899 if (prefs_common.toolbar_style != TOOLBAR_NONE) {
900 gtk_widget_show(handlebox_wid);
901 gtk_widget_queue_resize(handlebox_wid);
905 * Change the style of toolbar
907 static void toolbar_style(ToolbarType type, guint action, gpointer data)
909 GtkWidget *handlebox_wid;
910 GtkWidget *toolbar_wid;
911 MainWindow *mainwin = (MainWindow*)data;
912 Compose *compose = (Compose*)data;
913 MessageView *msgview = (MessageView*)data;
915 g_return_if_fail(data != NULL);
919 handlebox_wid = mainwin->handlebox;
920 toolbar_wid = mainwin->toolbar->toolbar;
922 case TOOLBAR_COMPOSE:
923 handlebox_wid = compose->handlebox;
924 toolbar_wid = compose->toolbar->toolbar;
926 case TOOLBAR_MSGVIEW:
927 handlebox_wid = msgview->handlebox;
928 toolbar_wid = msgview->toolbar->toolbar;
934 toolbar_set_style(toolbar_wid, handlebox_wid, action);
937 /* Toolbar handling */
938 static void toolbar_inc_cb(GtkWidget *widget,
941 ToolbarItem *toolbar_item = (ToolbarItem*)data;
944 g_return_if_fail(toolbar_item != NULL);
946 switch (toolbar_item->type) {
948 mainwin = (MainWindow*)toolbar_item->parent;
949 inc_mail_cb(mainwin, 0, NULL);
956 static void toolbar_inc_all_cb(GtkWidget *widget,
959 ToolbarItem *toolbar_item = (ToolbarItem*)data;
962 g_return_if_fail(toolbar_item != NULL);
964 switch (toolbar_item->type) {
966 mainwin = (MainWindow*)toolbar_item->parent;
967 inc_all_account_mail_cb(mainwin, 0, NULL);
974 static void toolbar_send_queued_cb(GtkWidget *widget,gpointer data)
976 ToolbarItem *toolbar_item = (ToolbarItem*)data;
979 g_return_if_fail(toolbar_item != NULL);
981 switch (toolbar_item->type) {
983 mainwin = (MainWindow*)toolbar_item->parent;
984 send_queue_cb(mainwin, 0, NULL);
991 static void toolbar_exec_cb(GtkWidget *widget,
994 MainWindow *mainwin = get_mainwin(data);
996 g_return_if_fail(mainwin != NULL);
997 summary_execute(mainwin->summaryview);
1001 * Delete current/selected(s) message(s)
1003 static void toolbar_trash_cb(GtkWidget *widget, gpointer data)
1005 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1006 MainWindow *mainwin;
1008 g_return_if_fail(toolbar_item != NULL);
1009 g_return_if_fail(toolbar_item->parent);
1011 switch (toolbar_item->type) {
1012 case TOOLBAR_MSGVIEW:
1013 messageview_delete((MessageView *)toolbar_item->parent);
1016 mainwin = (MainWindow *)toolbar_item->parent;
1017 summary_delete_trash(mainwin->summaryview);
1020 debug_print("toolbar event not supported\n");
1026 * Delete current/selected(s) message(s)
1028 static void toolbar_delete_cb(GtkWidget *widget, gpointer data)
1030 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1031 MainWindow *mainwin;
1033 g_return_if_fail(toolbar_item != NULL);
1034 g_return_if_fail(toolbar_item->parent);
1036 switch (toolbar_item->type) {
1037 case TOOLBAR_MSGVIEW:
1038 messageview_delete((MessageView *)toolbar_item->parent);
1041 mainwin = (MainWindow *)toolbar_item->parent;
1042 summary_delete(mainwin->summaryview);
1045 debug_print("toolbar event not supported\n");
1052 * Compose new message
1054 static void toolbar_compose_cb(GtkWidget *widget, gpointer data)
1056 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1057 MainWindow *mainwin;
1058 MessageView *msgview;
1060 g_return_if_fail(toolbar_item != NULL);
1062 switch (toolbar_item->type) {
1064 mainwin = (MainWindow*)toolbar_item->parent;
1065 if (mainwin->toolbar->compose_btn_type == COMPOSEBUTTON_NEWS)
1066 compose_news_cb(mainwin, 0, NULL);
1068 compose_mail_cb(mainwin, 0, NULL);
1070 case TOOLBAR_MSGVIEW:
1071 msgview = (MessageView*)toolbar_item->parent;
1072 compose_new_with_folderitem(NULL,
1073 msgview->msginfo->folder, NULL);
1076 debug_print("toolbar event not supported\n");
1080 static void toolbar_learn(gpointer data, guint as_spam)
1082 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1083 MainWindow *mainwin;
1084 MessageView *msgview;
1086 g_return_if_fail(toolbar_item != NULL);
1088 switch (toolbar_item->type) {
1090 mainwin = (MainWindow*)toolbar_item->parent;
1092 mainwindow_learn(mainwin, TRUE);
1094 mainwindow_learn(mainwin, FALSE);
1096 case TOOLBAR_MSGVIEW:
1097 msgview = (MessageView*)toolbar_item->parent;
1099 messageview_learn(msgview, TRUE);
1101 messageview_learn(msgview, FALSE);
1104 debug_print("toolbar event not supported\n");
1108 static void toolbar_learn_cb(GtkWidget *widget, gpointer data)
1110 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1111 MainWindow *mainwin;
1112 MessageView *msgview;
1114 g_return_if_fail(toolbar_item != NULL);
1116 switch (toolbar_item->type) {
1118 mainwin = (MainWindow*)toolbar_item->parent;
1119 if (mainwin->toolbar->learn_btn_type == LEARN_SPAM)
1120 mainwindow_learn(mainwin, TRUE);
1122 mainwindow_learn(mainwin, FALSE);
1124 case TOOLBAR_MSGVIEW:
1125 msgview = (MessageView*)toolbar_item->parent;
1126 if (msgview->toolbar->learn_btn_type == LEARN_SPAM)
1127 messageview_learn(msgview, TRUE);
1129 messageview_learn(msgview, FALSE);
1132 debug_print("toolbar event not supported\n");
1140 static void toolbar_reply_cb(GtkWidget *widget, gpointer data)
1142 toolbar_reply(data, prefs_common.reply_with_quote ?
1143 COMPOSE_REPLY_WITH_QUOTE : COMPOSE_REPLY_WITHOUT_QUOTE);
1148 * Reply message to Sender and All recipients
1150 static void toolbar_reply_to_all_cb(GtkWidget *widget, gpointer data)
1153 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_ALL_WITH_QUOTE
1154 : COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE);
1159 * Reply to Mailing List
1161 static void toolbar_reply_to_list_cb(GtkWidget *widget, gpointer data)
1164 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_LIST_WITH_QUOTE
1165 : COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE);
1170 * Reply to sender of message
1172 static void toolbar_reply_to_sender_cb(GtkWidget *widget, gpointer data)
1175 prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
1176 : COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE);
1182 static void toolbar_addrbook_cb(GtkWidget *widget, gpointer data)
1184 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1187 g_return_if_fail(toolbar_item != NULL);
1189 switch (toolbar_item->type) {
1191 case TOOLBAR_MSGVIEW:
1194 case TOOLBAR_COMPOSE:
1195 compose = (Compose *)toolbar_item->parent;
1200 addressbook_open(compose);
1205 * Forward current/selected(s) message(s)
1207 static void toolbar_forward_cb(GtkWidget *widget, gpointer data)
1209 toolbar_reply(data, COMPOSE_FORWARD);
1213 * Goto Prev Unread Message
1215 static void toolbar_prev_unread_cb(GtkWidget *widget, gpointer data)
1217 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1218 MainWindow *mainwin;
1219 MessageView *msgview;
1221 g_return_if_fail(toolbar_item != NULL);
1223 switch (toolbar_item->type) {
1225 mainwin = (MainWindow*)toolbar_item->parent;
1226 summary_select_prev_unread(mainwin->summaryview);
1229 case TOOLBAR_MSGVIEW:
1230 msgview = (MessageView*)toolbar_item->parent;
1231 msgview->updating = TRUE;
1232 summary_select_prev_unread(msgview->mainwin->summaryview);
1233 msgview->updating = FALSE;
1235 if (msgview->deferred_destroy) {
1236 debug_print("messageview got away!\n");
1237 messageview_destroy(msgview);
1241 /* Now we need to update the messageview window */
1242 if (msgview->mainwin->summaryview->selected) {
1244 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1247 messageview_show(msgview, msginfo,
1248 msgview->all_headers);
1251 gtk_widget_destroy(msgview->window);
1255 debug_print("toolbar event not supported\n");
1260 * Goto Next Unread Message
1262 static void toolbar_next_unread_cb(GtkWidget *widget, gpointer data)
1264 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1265 MainWindow *mainwin;
1266 MessageView *msgview;
1268 g_return_if_fail(toolbar_item != NULL);
1270 switch (toolbar_item->type) {
1272 mainwin = (MainWindow*)toolbar_item->parent;
1273 summary_select_next_unread(mainwin->summaryview);
1276 case TOOLBAR_MSGVIEW:
1277 msgview = (MessageView*)toolbar_item->parent;
1278 msgview->updating = TRUE;
1279 summary_select_next_unread(msgview->mainwin->summaryview);
1280 msgview->updating = FALSE;
1282 if (msgview->deferred_destroy) {
1283 debug_print("messageview got away!\n");
1284 messageview_destroy(msgview);
1288 /* Now we need to update the messageview window */
1289 if (msgview->mainwin->summaryview->selected) {
1291 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1294 messageview_show(msgview, msginfo,
1295 msgview->all_headers);
1298 gtk_widget_destroy(msgview->window);
1302 debug_print("toolbar event not supported\n");
1306 static void toolbar_ignore_thread_cb(GtkWidget *widget, gpointer data)
1308 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1309 MainWindow *mainwin;
1311 g_return_if_fail(toolbar_item != NULL);
1313 switch (toolbar_item->type) {
1315 mainwin = (MainWindow *) toolbar_item->parent;
1316 summary_toggle_ignore_thread(mainwin->summaryview);
1318 case TOOLBAR_MSGVIEW:
1319 /* TODO: see toolbar_next_unread_cb() if you need
1320 * this in the message view */
1323 debug_print("toolbar event not supported\n");
1328 static void toolbar_watch_thread_cb(GtkWidget *widget, gpointer data)
1330 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1331 MainWindow *mainwin;
1333 g_return_if_fail(toolbar_item != NULL);
1335 switch (toolbar_item->type) {
1337 mainwin = (MainWindow *) toolbar_item->parent;
1338 summary_toggle_watch_thread(mainwin->summaryview);
1340 case TOOLBAR_MSGVIEW:
1341 /* TODO: see toolbar_next_unread_cb() if you need
1342 * this in the message view */
1345 debug_print("toolbar event not supported\n");
1350 static void toolbar_cancel_inc_cb(GtkWidget *widget, gpointer data)
1352 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1354 g_return_if_fail(toolbar_item != NULL);
1360 static void toolbar_print_cb(GtkWidget *widget, gpointer data)
1362 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1363 MainWindow *mainwin;
1365 g_return_if_fail(toolbar_item != NULL);
1367 switch (toolbar_item->type) {
1369 mainwin = (MainWindow *) toolbar_item->parent;
1370 summary_print(mainwin->summaryview);
1372 case TOOLBAR_MSGVIEW:
1373 /* TODO: see toolbar_next_unread_cb() if you need
1374 * this in the message view */
1377 debug_print("toolbar event not supported\n");
1382 static void toolbar_send_cb(GtkWidget *widget, gpointer data)
1384 compose_toolbar_cb(A_SEND, data);
1387 static void toolbar_send_later_cb(GtkWidget *widget, gpointer data)
1389 compose_toolbar_cb(A_SENDL, data);
1392 static void toolbar_draft_cb(GtkWidget *widget, gpointer data)
1394 compose_toolbar_cb(A_DRAFT, data);
1397 static void toolbar_close_cb(GtkWidget *widget, gpointer data)
1399 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1400 MainWindow *mainwin;
1401 MessageView *messageview;
1404 g_return_if_fail(toolbar_item != NULL);
1406 switch (toolbar_item->type) {
1408 mainwin = (MainWindow *) toolbar_item->parent;
1409 app_will_exit(NULL, mainwin);
1411 case TOOLBAR_MSGVIEW:
1412 messageview = (MessageView *)toolbar_item->parent;
1413 messageview_destroy(messageview);
1415 case TOOLBAR_COMPOSE:
1416 compose = (Compose *)toolbar_item->parent;
1417 compose_close_toolbar(compose);
1422 static void toolbar_open_mail_cb(GtkWidget *widget, gpointer data)
1424 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1425 MainWindow *mainwin;
1427 g_return_if_fail(toolbar_item != NULL);
1429 switch (toolbar_item->type) {
1431 mainwin = (MainWindow *) toolbar_item->parent;
1432 summary_open_row(NULL, mainwin->summaryview);
1434 case TOOLBAR_MSGVIEW:
1435 debug_print("toolbar event not supported\n");
1437 case TOOLBAR_COMPOSE:
1438 debug_print("toolbar event not supported\n");
1443 static void toolbar_insert_cb(GtkWidget *widget, gpointer data)
1445 compose_toolbar_cb(A_INSERT, data);
1448 static void toolbar_attach_cb(GtkWidget *widget, gpointer data)
1450 compose_toolbar_cb(A_ATTACH, data);
1453 static void toolbar_sig_cb(GtkWidget *widget, gpointer data)
1455 compose_toolbar_cb(A_SIG, data);
1458 static void toolbar_ext_editor_cb(GtkWidget *widget, gpointer data)
1460 compose_toolbar_cb(A_EXTEDITOR, data);
1463 static void toolbar_linewrap_current_cb(GtkWidget *widget, gpointer data)
1465 compose_toolbar_cb(A_LINEWRAP_CURRENT, data);
1468 static void toolbar_linewrap_all_cb(GtkWidget *widget, gpointer data)
1470 compose_toolbar_cb(A_LINEWRAP_ALL, data);
1474 static void toolbar_check_spelling_cb(GtkWidget *widget, gpointer data)
1476 compose_toolbar_cb(A_CHECK_SPELLING, data);
1480 * Execute actions from toolbar
1482 static void toolbar_actions_execute_cb(GtkWidget *widget, gpointer data)
1484 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1485 GSList *action_list;
1486 MainWindow *mainwin;
1488 MessageView *msgview;
1489 gpointer parent = toolbar_item->parent;
1491 g_return_if_fail(toolbar_item != NULL);
1493 switch (toolbar_item->type) {
1495 mainwin = (MainWindow*)parent;
1496 action_list = mainwin->toolbar->action_list;
1498 case TOOLBAR_COMPOSE:
1499 compose = (Compose*)parent;
1500 action_list = compose->toolbar->action_list;
1502 case TOOLBAR_MSGVIEW:
1503 msgview = (MessageView*)parent;
1504 action_list = msgview->toolbar->action_list;
1507 debug_print("toolbar event not supported\n");
1510 toolbar_action_execute(widget, action_list, parent, toolbar_item->type);
1513 static MainWindow *get_mainwin(gpointer data)
1515 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1516 MainWindow *mainwin = NULL;
1517 MessageView *msgview;
1519 g_return_val_if_fail(toolbar_item != NULL, NULL);
1521 switch(toolbar_item->type) {
1523 mainwin = (MainWindow*)toolbar_item->parent;
1525 case TOOLBAR_MSGVIEW:
1526 msgview = (MessageView*)toolbar_item->parent;
1527 mainwin = (MainWindow*)msgview->mainwin;
1536 static void toolbar_go_folders_cb(GtkWidget *widget, gpointer data)
1538 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1539 MainWindow *mainwin = NULL;
1540 switch(toolbar_item->type) {
1542 mainwin = (MainWindow*)toolbar_item->parent;
1545 g_warning("wrong toolbar type\n");
1549 if (!mainwin->in_folder) {
1550 FolderItem *item = folderview_get_selected_item(mainwin->folderview);
1552 folderview_select(mainwin->folderview, item);
1555 gtk_widget_grab_focus(mainwin->folderview->ctree);
1556 mainwindow_exit_folder(mainwin);
1560 static void toolbar_buttons_cb(GtkWidget *widget,
1567 void (*func)(GtkWidget *widget, gpointer data);
1569 { A_RECEIVE_ALL, toolbar_inc_all_cb },
1570 { A_RECEIVE_CUR, toolbar_inc_cb },
1571 { A_SEND_QUEUED, toolbar_send_queued_cb },
1572 { A_COMPOSE_EMAIL, toolbar_compose_cb },
1573 { A_COMPOSE_NEWS, toolbar_compose_cb },
1574 { A_REPLY_MESSAGE, toolbar_reply_cb },
1575 { A_REPLY_SENDER, toolbar_reply_to_sender_cb },
1576 { A_REPLY_ALL, toolbar_reply_to_all_cb },
1577 { A_REPLY_ML, toolbar_reply_to_list_cb },
1578 { A_FORWARD, toolbar_forward_cb },
1579 { A_TRASH, toolbar_trash_cb },
1580 { A_DELETE_REAL, toolbar_delete_cb },
1581 { A_EXECUTE, toolbar_exec_cb },
1582 { A_GOTO_PREV, toolbar_prev_unread_cb },
1583 { A_GOTO_NEXT, toolbar_next_unread_cb },
1584 { A_IGNORE_THREAD, toolbar_ignore_thread_cb },
1585 { A_WATCH_THREAD, toolbar_watch_thread_cb },
1586 { A_PRINT, toolbar_print_cb },
1587 { A_LEARN_SPAM, toolbar_learn_cb },
1588 { A_GO_FOLDERS, toolbar_go_folders_cb },
1590 { A_SEND, toolbar_send_cb },
1591 { A_SENDL, toolbar_send_later_cb },
1592 { A_DRAFT, toolbar_draft_cb },
1593 { A_OPEN_MAIL, toolbar_open_mail_cb },
1594 { A_CLOSE, toolbar_close_cb },
1595 { A_INSERT, toolbar_insert_cb },
1596 { A_ATTACH, toolbar_attach_cb },
1597 { A_SIG, toolbar_sig_cb },
1598 { A_EXTEDITOR, toolbar_ext_editor_cb },
1599 { A_LINEWRAP_CURRENT, toolbar_linewrap_current_cb },
1600 { A_LINEWRAP_ALL, toolbar_linewrap_all_cb },
1601 { A_ADDRBOOK, toolbar_addrbook_cb },
1603 { A_CHECK_SPELLING, toolbar_check_spelling_cb },
1605 { A_SYL_ACTIONS, toolbar_actions_execute_cb },
1606 { A_CANCEL_INC, toolbar_cancel_inc_cb }
1609 num_items = sizeof(callbacks)/sizeof(callbacks[0]);
1611 for (i = 0; i < num_items; i++) {
1612 if (callbacks[i].index == item->index) {
1613 callbacks[i].func(widget, item);
1619 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
1620 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
1621 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1622 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1623 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1624 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1625 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLTIPS(toolbar_tips), \
1629 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
1630 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
1631 GList *gchild = NULL; \
1632 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
1633 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1634 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1635 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1636 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1637 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), GTK_TOOLTIPS(toolbar_tips), \
1639 gtk_menu_tool_button_set_arrow_tooltip(GTK_MENU_TOOL_BUTTON(item), \
1640 GTK_TOOLTIPS(toolbar_tips), menutip, NULL); \
1641 child = gtk_bin_get_child(GTK_BIN(item)); \
1642 gchild = gtk_container_get_children( \
1643 GTK_CONTAINER(child)); \
1644 btn = (GtkWidget *)gchild->data; \
1645 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
1646 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
1647 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
1650 #define MAKE_MENU(entries,path,btn) { \
1651 n_menu_entries = sizeof(entries) / \
1652 sizeof(entries[0]); \
1653 menu = menu_create_items(entries, n_menu_entries, path, &factory, toolbar_item); \
1654 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(btn), menu); \
1658 * Create a new toolbar with specified type
1659 * if a callback list is passed it will be used before the
1660 * common callback list
1662 Toolbar *toolbar_create(ToolbarType type,
1663 GtkWidget *container,
1666 ToolbarItem *toolbar_item;
1669 GtkWidget *icon_wid = NULL;
1670 GtkWidget *icon_news;
1671 GtkWidget *icon_ham;
1674 guint n_menu_entries;
1675 GtkItemFactory *factory;
1676 GtkTooltips *toolbar_tips;
1677 ToolbarSylpheedActions *action_item;
1679 GSList *toolbar_list;
1680 Toolbar *toolbar_data;
1683 toolbar_tips = gtk_tooltips_new();
1685 toolbar_read_config_file(type);
1686 toolbar_list = toolbar_get_list(type);
1688 toolbar_data = g_new0(Toolbar, 1);
1690 toolbar = gtk_toolbar_new();
1692 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1693 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
1694 gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar), TRUE);
1696 for (cur = toolbar_list; cur != NULL; cur = cur->next) {
1698 if (g_ascii_strcasecmp(((ToolbarItem*)cur->data)->file, TOOLBAR_TAG_SEPARATOR) == 0) {
1699 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new(), -1);
1703 toolbar_item = g_new0(ToolbarItem, 1);
1704 toolbar_item->index = ((ToolbarItem*)cur->data)->index;
1705 toolbar_item->file = g_strdup(((ToolbarItem*)cur->data)->file);
1706 toolbar_item->text = g_strdup(((ToolbarItem*)cur->data)->text);
1707 toolbar_item->parent = data;
1708 toolbar_item->type = type;
1710 /* collect toolbar items in list to keep track */
1711 toolbar_data->item_list =
1712 g_slist_append(toolbar_data->item_list,
1714 icon_wid = stock_pixmap_widget(container, stock_pixmap_get_icon(toolbar_item->file));
1716 switch (toolbar_item->index) {
1719 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to folder list"));
1720 toolbar_data->folders_btn = item;
1723 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1724 _("Receive Mail on all Accounts"),
1725 _("Receive Mail on selected Account"));
1726 toolbar_data->getall_btn = item;
1729 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text, _("Receive Mail on current Account"));
1730 toolbar_data->get_btn = item;
1733 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Queued Messages"));
1734 toolbar_data->send_btn = item;
1737 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Close window"));
1738 toolbar_data->close_window_btn = item;
1741 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Open email"));
1742 toolbar_data->open_mail_btn = item;
1744 case A_COMPOSE_EMAIL:
1746 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1748 _("Compose with selected Account"));
1749 toolbar_data->compose_mail_btn = item;
1750 toolbar_data->compose_mail_icon = icon_wid;
1751 g_object_ref(toolbar_data->compose_mail_icon);
1753 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1754 toolbar_data->compose_news_icon = icon_news;
1755 g_object_ref(toolbar_data->compose_news_icon);
1757 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1758 _("Compose Email"));
1759 toolbar_data->compose_mail_btn = item;
1760 toolbar_data->compose_mail_icon = icon_wid;
1762 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1763 toolbar_data->compose_news_icon = icon_news;
1767 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1770 toolbar_data->learn_spam_btn = item;
1771 toolbar_data->learn_spam_icon = icon_wid;
1772 g_object_ref(toolbar_data->learn_spam_icon);
1774 icon_ham = stock_pixmap_widget(container, STOCK_PIXMAP_HAM_BTN);
1775 toolbar_data->learn_ham_icon = icon_ham;
1776 g_object_ref(toolbar_data->learn_ham_icon);
1778 MAKE_MENU(learn_entries,"<LearnSpam>",toolbar_data->learn_spam_btn);
1780 case A_REPLY_MESSAGE:
1782 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1783 _("Reply to Message"),
1784 _("Reply to Message options"));
1785 toolbar_data->reply_btn = item;
1787 MAKE_MENU(reply_entries,"<Reply>",toolbar_data->reply_btn);
1789 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1790 _("Reply to Message"));
1791 toolbar_data->reply_btn = item;
1794 case A_REPLY_SENDER:
1796 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1797 _("Reply to Sender"),
1798 _("Reply to Sender options"));
1799 toolbar_data->replysender_btn = item;
1801 MAKE_MENU(replysender_entries,"<ReplySender>",toolbar_data->replysender_btn);
1803 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1804 _("Reply to Sender"));
1805 toolbar_data->replysender_btn = item;
1810 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1812 _("Reply to All options"));
1813 toolbar_data->replyall_btn = item;
1815 MAKE_MENU(replyall_entries,"<ReplyAll>",toolbar_data->replyall_btn);
1817 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1819 toolbar_data->replyall_btn = item;
1824 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1825 _("Reply to Mailing-list"),
1826 _("Reply to Mailing-list options"));
1827 toolbar_data->replylist_btn = item;
1829 MAKE_MENU(replylist_entries,"<ReplyList>",toolbar_data->replylist_btn);
1831 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1832 _("Reply to Mailing-list"));
1833 toolbar_data->replylist_btn = item;
1838 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1839 _("Forward Message"),
1840 _("Forward Message options"));
1841 toolbar_data->fwd_btn = item;
1843 MAKE_MENU(forward_entries,"<Forward>",toolbar_data->fwd_btn);
1845 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1846 _("Forward Message"));
1847 toolbar_data->fwd_btn = item;
1851 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Trash Message"));
1852 toolbar_data->trash_btn = item;
1855 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Delete Message"));
1856 toolbar_data->delete_btn = item;
1859 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Execute"));
1860 toolbar_data->exec_btn = item;
1863 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Previous Unread Message"));
1864 toolbar_data->prev_btn = item;
1867 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Next Unread Message"));
1868 toolbar_data->next_btn = item;
1871 /* Compose Toolbar */
1873 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Message"));
1874 toolbar_data->send_btn = item;
1877 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Put into queue folder and send later"));
1878 toolbar_data->sendl_btn = item;
1881 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Save to draft folder"));
1882 toolbar_data->draft_btn = item;
1885 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert file"));
1886 toolbar_data->insert_btn = item;
1889 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Attach file"));
1890 toolbar_data->attach_btn = item;
1893 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert signature"));
1894 toolbar_data->sig_btn = item;
1897 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Edit with external editor"));
1898 toolbar_data->exteditor_btn = item;
1900 case A_LINEWRAP_CURRENT:
1901 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap long lines of current paragraph"));
1902 toolbar_data->linewrap_current_btn = item;
1904 case A_LINEWRAP_ALL:
1905 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap all long lines"));
1906 toolbar_data->linewrap_all_btn = item;
1909 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Address book"));
1910 toolbar_data->addrbook_btn = item;
1913 case A_CHECK_SPELLING:
1914 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Check spelling"));
1915 toolbar_data->spellcheck_btn = item;
1920 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,toolbar_item->text);
1921 action_item = g_new0(ToolbarSylpheedActions, 1);
1922 action_item->widget = item;
1923 action_item->name = g_strdup(toolbar_item->text);
1925 toolbar_data->action_list =
1926 g_slist_append(toolbar_data->action_list,
1930 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Cancel receiving"));
1931 toolbar_data->cancel_inc_btn = item;
1934 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1935 toolbar_ret_descr_from_val(toolbar_item->index));
1936 /* find and set the tool tip text */
1941 toolbar_data->toolbar = toolbar;
1942 toolbar_data->tooltips = toolbar_tips;
1943 gtk_widget_show_all(toolbar);
1945 if (type == TOOLBAR_MAIN) {
1947 MainWindow *mainwin = mainwindow_get_mainwindow();
1948 GtkWidget *progressbar = gtk_progress_bar_new();
1949 item = gtk_tool_item_new();
1950 gtk_container_add (GTK_CONTAINER (item), progressbar);
1951 gtk_widget_show(item);
1952 gtk_widget_show(progressbar);
1953 gtk_widget_set_size_request(progressbar, 70, -1);
1954 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1955 mainwin->progressbar = progressbar;
1957 activate_compose_button(toolbar_data,
1958 prefs_common.toolbar_style,
1959 toolbar_data->compose_btn_type);
1961 if (type != TOOLBAR_COMPOSE)
1962 activate_learn_button(toolbar_data, prefs_common.toolbar_style,
1966 gtk_container_add(GTK_CONTAINER(container), toolbar);
1967 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
1969 if ( GTK_IS_WINDOW(container) ) {
1970 hildon_window_add_toolbar (HILDON_WINDOW(container), GTK_TOOLBAR(toolbar));
1971 gtk_widget_show_all (container);
1973 gtk_container_add(GTK_CONTAINER(container), toolbar);
1974 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
1977 return toolbar_data;
1981 * Free toolbar structures
1983 void toolbar_destroy(Toolbar * toolbar) {
1985 TOOLBAR_DESTROY_ITEMS(toolbar->item_list);
1986 TOOLBAR_DESTROY_ACTIONS(toolbar->action_list);
1989 void toolbar_update(ToolbarType type, gpointer data)
1991 Toolbar *toolbar_data;
1992 GtkWidget *handlebox;
1993 MainWindow *mainwin = (MainWindow*)data;
1994 Compose *compose = (Compose*)data;
1995 MessageView *msgview = (MessageView*)data;
2000 toolbar_data = mainwin->toolbar;
2001 handlebox = mainwin->handlebox;
2003 case TOOLBAR_COMPOSE:
2004 toolbar_data = compose->toolbar;
2005 handlebox = compose->handlebox;
2007 case TOOLBAR_MSGVIEW:
2008 toolbar_data = msgview->toolbar;
2009 handlebox = msgview->handlebox;
2015 gtk_container_remove(GTK_CONTAINER(handlebox),
2016 GTK_WIDGET(toolbar_data->toolbar));
2018 toolbar_init(toolbar_data);
2019 toolbar_data = toolbar_create(type, handlebox, data);
2023 toolbar_data = mainwin->toolbar;
2024 handlebox = mainwin->window;
2026 case TOOLBAR_COMPOSE:
2027 toolbar_data = compose->toolbar;
2028 handlebox = compose->window;
2030 case TOOLBAR_MSGVIEW:
2031 toolbar_data = msgview->toolbar;
2032 handlebox = msgview->window;
2038 hildon_window_remove_toolbar(HILDON_WINDOW(handlebox), GTK_WIDGET(toolbar_data->toolbar));
2040 toolbar_init(toolbar_data);
2041 toolbar_data = toolbar_create(type, handlebox, data);
2046 mainwin->toolbar = toolbar_data;
2048 case TOOLBAR_COMPOSE:
2049 compose->toolbar = toolbar_data;
2051 case TOOLBAR_MSGVIEW:
2052 msgview->toolbar = toolbar_data;
2056 toolbar_style(type, prefs_common.toolbar_style, data);
2058 if (type == TOOLBAR_MAIN) {
2059 toolbar_main_set_sensitive((MainWindow*)data);
2060 account_set_menu_only_toolbar();
2064 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
2065 gboolean in_btn1 = FALSE, in_btn2 = FALSE; \
2066 if (GTK_IS_BUTTON(widget)) \
2067 in_btn1 = GTK_BUTTON(widget)->in_button; \
2068 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2069 GtkWidget *child = gtk_bin_get_child( \
2071 GList *gchild = gtk_container_get_children( \
2072 GTK_CONTAINER(child)); \
2073 GtkWidget *btn = (GtkWidget *)gchild->data; \
2074 GtkWidget *arr = (GtkWidget *) \
2075 (gchild->next?gchild->next->data:NULL); \
2076 if (GTK_IS_BUTTON(btn)) \
2077 in_btn1 = GTK_BUTTON(btn)->in_button; \
2078 if (GTK_IS_BUTTON(arr)) \
2079 in_btn2 = GTK_BUTTON(arr)->in_button; \
2081 else if (GTK_IS_TOOL_ITEM(widget)) { \
2082 GtkWidget *child = gtk_bin_get_child( \
2084 if (GTK_IS_BUTTON(child)) \
2085 in_btn1 = GTK_BUTTON(child)->in_button; \
2087 gtk_widget_set_sensitive(widget, sensitive); \
2088 if (GTK_IS_BUTTON(widget)) \
2089 GTK_BUTTON(widget)->in_button = in_btn1; \
2090 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2091 GtkWidget *child = gtk_bin_get_child( \
2093 GList *gchild = gtk_container_get_children( \
2094 GTK_CONTAINER(child)); \
2095 GtkWidget *btn = (GtkWidget *)gchild->data; \
2096 GtkWidget *arr = (GtkWidget *) \
2097 (gchild->next?gchild->next->data:NULL); \
2098 if (GTK_IS_BUTTON(btn)) \
2099 GTK_BUTTON(btn)->in_button = in_btn1; \
2100 if (GTK_IS_BUTTON(arr)) \
2101 GTK_BUTTON(arr)->in_button = in_btn2; \
2103 else if (GTK_IS_TOOL_ITEM(widget)) { \
2104 GtkWidget *child = gtk_bin_get_child( \
2106 if (GTK_IS_BUTTON(child)) \
2107 GTK_BUTTON(child)->in_button = in_btn1; \
2111 void toolbar_main_set_sensitive(gpointer data)
2113 SensitiveCond state;
2115 MainWindow *mainwin = (MainWindow*)data;
2116 Toolbar *toolbar = mainwin->toolbar;
2118 GSList *entry_list = NULL;
2120 typedef struct _Entry Entry;
2127 #define SET_WIDGET_COND(w, c) \
2129 Entry *e = g_new0(Entry, 1); \
2132 entry_list = g_slist_append(entry_list, e); \
2136 if (toolbar->get_btn)
2137 SET_WIDGET_COND(toolbar->get_btn,
2138 M_HAVE_ACCOUNT|M_UNLOCKED);
2140 if (toolbar->getall_btn) {
2141 SET_WIDGET_COND(toolbar->getall_btn,
2142 M_HAVE_ACCOUNT|M_UNLOCKED);
2144 if (toolbar->send_btn) {
2145 SET_WIDGET_COND(toolbar->send_btn,
2146 M_HAVE_QUEUED_MAILS);
2148 if (toolbar->compose_mail_btn) {
2149 SET_WIDGET_COND(toolbar->compose_mail_btn,
2152 if (toolbar->close_window_btn) {
2153 SET_WIDGET_COND(toolbar->close_window_btn,
2156 if (toolbar->open_mail_btn) {
2157 SET_WIDGET_COND(toolbar->open_mail_btn,
2160 if (toolbar->reply_btn) {
2161 SET_WIDGET_COND(toolbar->reply_btn,
2162 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2164 if (toolbar->replyall_btn) {
2165 SET_WIDGET_COND(toolbar->replyall_btn,
2166 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2168 if (toolbar->replylist_btn) {
2169 SET_WIDGET_COND(toolbar->replylist_btn,
2170 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2172 if (toolbar->replysender_btn) {
2173 SET_WIDGET_COND(toolbar->replysender_btn,
2174 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2176 if (toolbar->fwd_btn) {
2177 SET_WIDGET_COND(toolbar->fwd_btn,
2178 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2181 if (prefs_common.next_unread_msg_dialog == NEXTUNREADMSGDIALOG_ASSUME_NO) {
2182 SET_WIDGET_COND(toolbar->next_btn, M_MSG_EXIST);
2184 SET_WIDGET_COND(toolbar->next_btn, 0);
2187 if (toolbar->trash_btn)
2188 SET_WIDGET_COND(toolbar->trash_btn,
2189 M_TARGET_EXIST|M_ALLOW_DELETE);
2191 if (toolbar->delete_btn)
2192 SET_WIDGET_COND(toolbar->delete_btn,
2193 M_TARGET_EXIST|M_ALLOW_DELETE);
2195 if (toolbar->exec_btn)
2196 SET_WIDGET_COND(toolbar->exec_btn,
2199 /* if (toolbar->learn_ham_btn)
2200 SET_WIDGET_COND(toolbar->learn_ham_btn,
2201 M_TARGET_EXIST|M_CAN_LEARN_SPAM);
2203 if (toolbar->learn_spam_btn)
2204 SET_WIDGET_COND(toolbar->learn_spam_btn,
2205 M_TARGET_EXIST|M_CAN_LEARN_SPAM);
2207 if (toolbar->cancel_inc_btn)
2208 SET_WIDGET_COND(toolbar->cancel_inc_btn,
2211 for (cur = toolbar->action_list; cur != NULL; cur = cur->next) {
2212 ToolbarSylpheedActions *act = (ToolbarSylpheedActions*)cur->data;
2214 SET_WIDGET_COND(act->widget, M_TARGET_EXIST|M_UNLOCKED);
2217 #undef SET_WIDGET_COND
2219 state = main_window_get_current_state(mainwin);
2221 for (cur = entry_list; cur != NULL; cur = cur->next) {
2222 Entry *e = (Entry*) cur->data;
2224 if (e->widget != NULL) {
2225 sensitive = ((e->cond & state) == e->cond);
2226 GTK_BUTTON_SET_SENSITIVE(e->widget, sensitive);
2230 while (entry_list != NULL) {
2231 Entry *e = (Entry*) entry_list->data;
2234 entry_list = g_slist_remove(entry_list, e);
2237 g_slist_free(entry_list);
2239 activate_compose_button(toolbar,
2240 prefs_common.toolbar_style,
2241 toolbar->compose_btn_type);
2245 void toolbar_comp_set_sensitive(gpointer data, gboolean sensitive)
2247 Compose *compose = (Compose*)data;
2248 GSList *items = compose->toolbar->action_list;
2250 if (compose->toolbar->send_btn)
2251 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->send_btn, sensitive);
2252 if (compose->toolbar->sendl_btn)
2253 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sendl_btn, sensitive);
2254 if (compose->toolbar->draft_btn )
2255 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->draft_btn , sensitive);
2256 if (compose->toolbar->insert_btn )
2257 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->insert_btn , sensitive);
2258 if (compose->toolbar->attach_btn)
2259 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->attach_btn, sensitive);
2260 if (compose->toolbar->sig_btn)
2261 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sig_btn, sensitive);
2262 if (compose->toolbar->exteditor_btn)
2263 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->exteditor_btn, sensitive);
2264 if (compose->toolbar->linewrap_current_btn)
2265 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_current_btn, sensitive);
2266 if (compose->toolbar->linewrap_all_btn)
2267 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_all_btn, sensitive);
2268 if (compose->toolbar->addrbook_btn)
2269 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->addrbook_btn, sensitive);
2271 if (compose->toolbar->spellcheck_btn)
2272 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->spellcheck_btn, sensitive);
2274 for (; items != NULL; items = g_slist_next(items)) {
2275 ToolbarSylpheedActions *item = (ToolbarSylpheedActions *)items->data;
2276 GTK_BUTTON_SET_SENSITIVE(item->widget, sensitive);
2281 * Initialize toolbar structure
2283 void toolbar_init(Toolbar * toolbar) {
2285 toolbar->toolbar = NULL;
2286 toolbar->folders_btn = NULL;
2287 toolbar->get_btn = NULL;
2288 toolbar->getall_btn = NULL;
2289 toolbar->send_btn = NULL;
2290 toolbar->compose_mail_btn = NULL;
2291 toolbar->compose_mail_icon = NULL;
2292 toolbar->compose_news_icon = NULL;
2293 toolbar->reply_btn = NULL;
2294 toolbar->replysender_btn = NULL;
2295 toolbar->replyall_btn = NULL;
2296 toolbar->replylist_btn = NULL;
2297 toolbar->fwd_btn = NULL;
2298 toolbar->trash_btn = NULL;
2299 toolbar->delete_btn = NULL;
2300 toolbar->prev_btn = NULL;
2301 toolbar->next_btn = NULL;
2302 toolbar->exec_btn = NULL;
2303 toolbar->open_mail_btn = NULL;
2304 toolbar->close_window_btn = NULL;
2305 /* compose buttons */
2306 toolbar->sendl_btn = NULL;
2307 toolbar->draft_btn = NULL;
2308 toolbar->insert_btn = NULL;
2309 toolbar->attach_btn = NULL;
2310 toolbar->sig_btn = NULL;
2311 toolbar->exteditor_btn = NULL;
2312 toolbar->linewrap_current_btn = NULL;
2313 toolbar->linewrap_all_btn = NULL;
2314 toolbar->addrbook_btn = NULL;
2316 toolbar->spellcheck_btn = NULL;
2319 toolbar_destroy(toolbar);
2324 static void toolbar_reply(gpointer data, guint action)
2326 ToolbarItem *toolbar_item = (ToolbarItem*)data;
2327 MainWindow *mainwin;
2328 MessageView *msgview;
2329 GSList *msginfo_list = NULL;
2331 g_return_if_fail(toolbar_item != NULL);
2333 switch (toolbar_item->type) {
2335 mainwin = (MainWindow*)toolbar_item->parent;
2336 msginfo_list = summary_get_selection(mainwin->summaryview);
2337 msgview = (MessageView*)mainwin->messageview;
2339 case TOOLBAR_MSGVIEW:
2340 msgview = (MessageView*)toolbar_item->parent;
2341 g_return_if_fail(msgview != NULL);
2342 msginfo_list = g_slist_append(msginfo_list, msgview->msginfo);
2348 g_return_if_fail(msgview != NULL);
2349 g_return_if_fail(msginfo_list != NULL);
2350 compose_reply_from_messageview(msgview, msginfo_list, action);
2351 g_slist_free(msginfo_list);
2353 /* TODO: update reply state ion summaryview */
2357 /* exported functions */
2359 void inc_mail_cb(gpointer data, guint action, GtkWidget *widget)
2361 MainWindow *mainwin = (MainWindow*)data;
2363 inc_mail(mainwin, prefs_common.newmail_notify_manu);
2366 void inc_all_account_mail_cb(gpointer data, guint action, GtkWidget *widget)
2368 MainWindow *mainwin = (MainWindow*)data;
2370 inc_all_account_mail(mainwin, FALSE, prefs_common.newmail_notify_manu);
2373 void send_queue_cb(gpointer data, guint action, GtkWidget *widget)
2377 gboolean got_error = FALSE;
2378 gchar *errstr = NULL;
2380 if (prefs_common.work_offline)
2381 if (alertpanel(_("Offline warning"),
2382 _("You're working offline. Override?"),
2383 GTK_STOCK_NO, GTK_STOCK_YES,
2384 NULL) != G_ALERTALTERNATE)
2387 /* ask for confirmation before sending queued messages only
2388 in online mode and if there is at least one message queued
2389 in any of the folder queue
2391 if (prefs_common.confirm_send_queued_messages) {
2393 /* check if there's a queued message */
2394 for (list = folder_get_list(); !found && list != NULL; list = list->next) {
2395 Folder *folder = list->data;
2397 found = !procmsg_queue_is_empty(folder->queue);
2399 /* if necessary, ask for confirmation before sending */
2400 if (found && !prefs_common.work_offline) {
2401 if (alertpanel(_("Send queued messages"),
2402 _("Send all queued messages?"),
2403 GTK_STOCK_CANCEL, _("_Send"),
2404 NULL) != G_ALERTALTERNATE)
2409 for (list = folder_get_list(); list != NULL; list = list->next) {
2410 Folder *folder = list->data;
2412 if (folder->queue) {
2413 if (procmsg_send_queue(folder->queue,
2414 prefs_common.savemsg,
2421 alertpanel_error_log(_("Some errors occurred while "
2422 "sending queued messages."));
2424 gchar *tmp = g_strdup_printf(_("Some errors occurred "
2425 "while sending queued messages:\n%s"), errstr);
2427 alertpanel_error_log(tmp);
2433 void compose_mail_cb(gpointer data, guint action, GtkWidget *widget)
2435 MainWindow *mainwin = (MainWindow*)data;
2436 PrefsAccount *ac = NULL;
2437 FolderItem *item = mainwin->summaryview->folder_item;
2442 ac = account_find_from_item(item);
2443 if (ac && ac->protocol != A_NNTP) {
2444 compose_new_with_folderitem(ac, item, NULL); /* CLAWS */
2450 * CLAWS - use current account
2452 if (cur_account && (cur_account->protocol != A_NNTP)) {
2453 compose_new_with_folderitem(cur_account, item, NULL);
2458 * CLAWS - just get the first one
2460 list = account_get_list();
2461 for (cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2462 ac = (PrefsAccount *) cur->data;
2463 if (ac->protocol != A_NNTP) {
2464 compose_new_with_folderitem(ac, item, NULL);
2470 void compose_news_cb(gpointer data, guint action, GtkWidget *widget)
2472 MainWindow *mainwin = (MainWindow*)data;
2473 PrefsAccount * ac = NULL;
2477 if (mainwin->summaryview->folder_item) {
2478 ac = mainwin->summaryview->folder_item->folder->account;
2479 if (ac && ac->protocol == A_NNTP) {
2480 compose_new_with_folderitem(ac,
2481 mainwin->summaryview->folder_item, NULL);
2486 list = account_get_list();
2487 for(cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2488 ac = (PrefsAccount *) cur->data;
2489 if (ac->protocol == A_NNTP) {
2490 compose_new_with_folderitem(ac,
2491 mainwin->summaryview->folder_item, NULL);