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 void toolbar_init(Toolbar * toolbar);
71 static gboolean toolbar_is_duplicate (gint action,
73 static void toolbar_parse_item (XMLFile *file,
76 static gint toolbar_ret_val_from_text (const gchar *text);
77 static gchar *toolbar_ret_text_from_val (gint val);
79 static void toolbar_set_default_main (void);
80 static void toolbar_set_default_compose (void);
81 static void toolbar_set_default_msgview (void);
83 static void toolbar_style (ToolbarType type,
87 static MainWindow *get_mainwin (gpointer data);
88 static void activate_compose_button (Toolbar *toolbar,
90 ComposeButtonType type);
92 /* toolbar callbacks */
93 static void toolbar_reply (gpointer data,
95 static void toolbar_learn (gpointer data,
97 static void toolbar_delete_cb (GtkWidget *widget,
99 static void toolbar_trash_cb (GtkWidget *widget,
102 static void toolbar_compose_cb (GtkWidget *widget,
105 static void toolbar_learn_cb (GtkWidget *widget,
108 static void toolbar_reply_cb (GtkWidget *widget,
111 static void toolbar_reply_to_all_cb (GtkWidget *widget,
114 static void toolbar_reply_to_list_cb (GtkWidget *widget,
117 static void toolbar_reply_to_sender_cb (GtkWidget *widget,
120 static void toolbar_forward_cb (GtkWidget *widget,
123 static void toolbar_prev_unread_cb (GtkWidget *widget,
125 static void toolbar_next_unread_cb (GtkWidget *widget,
128 static void toolbar_ignore_thread_cb (GtkWidget *widget,
131 static void toolbar_watch_thread_cb (GtkWidget *widget,
134 static void toolbar_print_cb (GtkWidget *widget,
137 static void toolbar_actions_execute_cb (GtkWidget *widget,
141 static void toolbar_send_cb (GtkWidget *widget,
143 static void toolbar_send_later_cb (GtkWidget *widget,
145 static void toolbar_draft_cb (GtkWidget *widget,
147 static void toolbar_close_cb (GtkWidget *widget,
149 static void toolbar_preferences_cb (GtkWidget *widget,
151 static void toolbar_open_mail_cb (GtkWidget *widget,
153 static void toolbar_insert_cb (GtkWidget *widget,
155 static void toolbar_attach_cb (GtkWidget *widget,
157 static void toolbar_sig_cb (GtkWidget *widget,
159 static void toolbar_ext_editor_cb (GtkWidget *widget,
161 static void toolbar_linewrap_current_cb (GtkWidget *widget,
163 static void toolbar_linewrap_all_cb (GtkWidget *widget,
165 static void toolbar_addrbook_cb (GtkWidget *widget,
168 static void toolbar_check_spelling_cb (GtkWidget *widget,
171 static void toolbar_cancel_inc_cb (GtkWidget *widget,
177 } toolbar_text [] = {
178 { "A_RECEIVE_ALL", N_("Receive Mail on all Accounts") },
179 { "A_RECEIVE_CUR", N_("Receive Mail on current Account") },
180 { "A_SEND_QUEUED", N_("Send Queued Messages") },
181 { "A_COMPOSE_EMAIL", N_("Compose Email") },
182 { "A_COMPOSE_NEWS", N_("Compose News") },
183 { "A_REPLY_MESSAGE", N_("Reply to Message") },
184 { "A_REPLY_SENDER", N_("Reply to Sender") },
185 { "A_REPLY_ALL", N_("Reply to All") },
186 { "A_REPLY_ML", N_("Reply to Mailing-list") },
187 { "A_OPEN_MAIL", N_("Open email") },
188 { "A_FORWARD", N_("Forward Message") },
189 { "A_TRASH", N_("Trash Message") },
190 { "A_DELETE_REAL", N_("Delete Message") },
191 { "A_EXECUTE", N_("Execute") },
192 { "A_GOTO_PREV", N_("Go to Previous Unread Message") },
193 { "A_GOTO_NEXT", N_("Go to Next Unread Message") },
194 { "A_IGNORE_THREAD", N_("Ignore thread") },
195 { "A_WATCH_THREAD", N_("Watch thread") },
196 { "A_PRINT", N_("Print") },
197 { "A_LEARN_SPAM", N_("Learn Spam or Ham") },
198 { "A_GO_FOLDERS", N_("Open folder/Go to folder list") },
199 { "A_PREFERENCES", N_("Preferences") },
201 { "A_SEND", N_("Send Message") },
202 { "A_SENDL", N_("Put into queue folder and send later") },
203 { "A_DRAFT", N_("Save to draft folder") },
204 { "A_INSERT", N_("Insert file") },
205 { "A_ATTACH", N_("Attach file") },
206 { "A_SIG", N_("Insert signature") },
207 { "A_EXTEDITOR", N_("Edit with external editor") },
208 { "A_LINEWRAP_CURRENT", N_("Wrap long lines of current paragraph") },
209 { "A_LINEWRAP_ALL", N_("Wrap all long lines") },
210 { "A_ADDRBOOK", N_("Address book") },
212 { "A_CHECK_SPELLING", N_("Check spelling") },
214 { "A_CLAWS_ACTIONS", N_("Claws Mail Actions Feature") },
215 { "A_CANCEL_INC", N_("Cancel receiving") },
216 { "A_CLOSE", N_("Close window") },
217 { "A_SEPARATOR", N_("Separator") }
220 /* struct holds configuration files and a list of
221 * currently active toolbar items
222 * TOOLBAR_MAIN, TOOLBAR_COMPOSE and TOOLBAR_MSGVIEW
226 const gchar *conf_file;
228 } toolbar_config[3] = {
229 { "toolbar_main.xml", NULL},
230 { "toolbar_compose.xml", NULL},
231 { "toolbar_msgview.xml", NULL}
234 gint toolbar_ret_val_from_descr(const gchar *descr)
238 for (i = 0; i < N_ACTION_VAL; i++) {
239 if (g_utf8_collate(gettext(toolbar_text[i].descr), descr) == 0)
246 gchar *toolbar_ret_descr_from_val(gint val)
248 g_return_val_if_fail(val >=0 && val < N_ACTION_VAL, NULL);
250 return gettext(toolbar_text[val].descr);
253 static gint toolbar_ret_val_from_text(const gchar *text)
257 for (i = 0; i < N_ACTION_VAL; i++) {
258 if (g_utf8_collate(toolbar_text[i].index_str, text) == 0)
265 static gchar *toolbar_ret_text_from_val(gint val)
267 g_return_val_if_fail(val >=0 && val < N_ACTION_VAL, NULL);
269 return toolbar_text[val].index_str;
272 static gboolean toolbar_is_duplicate(gint action, ToolbarType source)
276 if ((action == A_SEPARATOR) || (action == A_CLAWS_ACTIONS))
279 for (cur = toolbar_config[source].item_list; cur != NULL; cur = cur->next) {
280 ToolbarItem *item = (ToolbarItem*) cur->data;
282 if (item->index == action)
288 /* depending on toolbar type this function
289 returns a list of available toolbar events being
290 displayed by prefs_toolbar
292 GList *toolbar_get_action_items(ToolbarType source)
297 if (source == TOOLBAR_MAIN) {
298 gint main_items[] = { A_RECEIVE_ALL, A_RECEIVE_CUR, A_SEND_QUEUED,
299 A_COMPOSE_EMAIL, A_REPLY_MESSAGE, A_REPLY_SENDER,
300 A_REPLY_ALL, A_REPLY_ML, A_OPEN_MAIL, A_FORWARD,
301 A_TRASH , A_DELETE_REAL, A_EXECUTE, A_GOTO_PREV,
302 A_GOTO_NEXT, A_IGNORE_THREAD, A_WATCH_THREAD, A_PRINT,
303 A_ADDRBOOK, A_LEARN_SPAM, A_GO_FOLDERS,
304 A_CANCEL_INC, A_PREFERENCES };
306 for (i = 0; i < sizeof main_items / sizeof main_items[0]; i++) {
307 items = g_list_append(items, gettext(toolbar_text[main_items[i]].descr));
310 else if (source == TOOLBAR_COMPOSE) {
311 gint comp_items[] = { A_SEND, A_SENDL, A_DRAFT,
312 A_INSERT, A_ATTACH, A_SIG,
313 A_EXTEDITOR, A_LINEWRAP_CURRENT,
314 A_LINEWRAP_ALL, A_ADDRBOOK,
320 for (i = 0; i < sizeof comp_items / sizeof comp_items[0]; i++)
321 items = g_list_append(items, gettext(toolbar_text[comp_items[i]].descr));
323 else if (source == TOOLBAR_MSGVIEW) {
324 gint msgv_items[] = { A_COMPOSE_EMAIL, A_REPLY_MESSAGE, A_REPLY_SENDER,
325 A_REPLY_ALL, A_REPLY_ML, A_FORWARD,
326 A_TRASH, A_DELETE_REAL, A_GOTO_PREV, A_GOTO_NEXT,
327 A_ADDRBOOK, A_LEARN_SPAM, A_CLOSE };
329 for (i = 0; i < sizeof msgv_items / sizeof msgv_items[0]; i++)
330 items = g_list_append(items, gettext(toolbar_text[msgv_items[i]].descr));
336 static void toolbar_parse_item(XMLFile *file, ToolbarType source)
340 ToolbarItem *item = NULL;
341 gboolean rewrite = FALSE;
343 attr = xml_get_current_tag_attr(file);
344 item = g_new0(ToolbarItem, 1);
346 name = ((XMLAttr *)attr->data)->name;
347 value = ((XMLAttr *)attr->data)->value;
349 if (g_utf8_collate(name, TOOLBAR_ICON_FILE) == 0)
350 item->file = g_strdup (value);
351 else if (g_utf8_collate(name, TOOLBAR_ICON_TEXT) == 0)
352 item->text = g_strdup (gettext(value));
353 else if (g_utf8_collate(name, TOOLBAR_ICON_ACTION) == 0)
354 item->index = toolbar_ret_val_from_text(value);
355 if (item->index == -1 && !strcmp(value, "A_DELETE")) {
357 item->index = A_TRASH;
359 item->file = g_strdup("trash_btn");
361 item->text = g_strdup(_("Trash"));
364 if (item->index == -1 && !strcmp(value, "A_SYL_ACTIONS")) {
366 item->index = A_CLAWS_ACTIONS;
369 attr = g_list_next(attr);
371 if (item->index != -1) {
373 if (!toolbar_is_duplicate(item->index, source))
374 toolbar_config[source].item_list = g_slist_append(toolbar_config[source].item_list,
378 toolbar_save_config_file(source);
382 const gchar *toolbar_get_short_text(int action) {
384 case A_GO_FOLDERS: return _("Folders");
385 case A_OPEN_MAIL: return _("Open");
386 case A_RECEIVE_ALL: return _("Get Mail");
387 case A_RECEIVE_CUR: return _("Get");
388 case A_SEND_QUEUED: return _("Send");
389 case A_COMPOSE_EMAIL: return Q_("Toolbar|Compose");
390 case A_COMPOSE_NEWS: return Q_("Toolbar|Compose");
391 case A_REPLY_MESSAGE: return _("Reply");
392 case A_REPLY_ALL: return _("All");
393 case A_REPLY_SENDER: return _("Sender");
394 case A_REPLY_ML: return _("List");
395 case A_FORWARD: return _("Forward");
396 case A_TRASH: return _("Trash");
397 case A_DELETE_REAL: return _("Delete");
398 case A_LEARN_SPAM: return _("Spam");
399 case A_GOTO_PREV: return _("Prev");
400 case A_GOTO_NEXT: return _("Next");
401 case A_IGNORE_THREAD: return _("Ignore thread");
402 case A_WATCH_THREAD: return _("Watch thread");
403 case A_PRINT: return _("Print");
404 case A_CLOSE: return _("Close");
405 case A_PREFERENCES: return _("Preferences");
406 case A_SEND: return _("Send");
407 case A_SENDL: return _("Send later");
408 case A_DRAFT: return _("Draft");
409 case A_INSERT: return _("Insert");
410 case A_ATTACH: return _("Attach");
411 case A_SIG: return _("Insert sig.");
412 case A_EXTEDITOR: return _("Edit");
413 case A_LINEWRAP_CURRENT:return _("Wrap para.");
414 case A_LINEWRAP_ALL: return _("Wrap all");
415 case A_ADDRBOOK: return _("Address");
416 case A_CANCEL_INC: return _("Stop");
417 case A_EXECUTE: return _("Execute");
419 case A_CHECK_SPELLING: return _("Check spelling");
425 gint toolbar_get_icon(int action) {
427 case A_GO_FOLDERS: return STOCK_PIXMAP_GO_FOLDERS;
428 case A_OPEN_MAIL: return STOCK_PIXMAP_OPEN_MAIL;
429 case A_RECEIVE_ALL: return STOCK_PIXMAP_MAIL_RECEIVE_ALL;
430 case A_RECEIVE_CUR: return STOCK_PIXMAP_MAIL_RECEIVE;
431 case A_SEND_QUEUED: return STOCK_PIXMAP_MAIL_SEND_QUEUE;
432 case A_COMPOSE_EMAIL: return STOCK_PIXMAP_MAIL_COMPOSE;
433 case A_COMPOSE_NEWS: return STOCK_PIXMAP_NEWS_COMPOSE;
434 case A_REPLY_MESSAGE: return STOCK_PIXMAP_MAIL_REPLY;
435 case A_REPLY_ALL: return STOCK_PIXMAP_MAIL_REPLY_TO_ALL;
436 case A_REPLY_SENDER: return STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR;
437 case A_REPLY_ML: return STOCK_PIXMAP_MAIL_REPLY_TO_LIST;
438 case A_FORWARD: return STOCK_PIXMAP_MAIL_FORWARD;
439 case A_TRASH: return STOCK_PIXMAP_TRASH;
440 case A_DELETE_REAL: return STOCK_PIXMAP_DELETE;
441 case A_LEARN_SPAM: return STOCK_PIXMAP_SPAM_BTN;
442 case A_GOTO_PREV: return STOCK_PIXMAP_UP_ARROW;
443 case A_GOTO_NEXT: return STOCK_PIXMAP_DOWN_ARROW;
444 case A_IGNORE_THREAD: return STOCK_PIXMAP_IGNORETHREAD;
445 case A_WATCH_THREAD: return STOCK_PIXMAP_WATCHTHREAD;
446 case A_PRINT: return STOCK_PIXMAP_PRINTER;
447 case A_CLOSE: return STOCK_PIXMAP_CLOSE;
448 case A_PREFERENCES: return STOCK_PIXMAP_PREFERENCES;
449 case A_SEND: return STOCK_PIXMAP_MAIL_SEND;
450 case A_SENDL: return STOCK_PIXMAP_MAIL_SEND_QUEUE;
451 case A_DRAFT: return STOCK_PIXMAP_MAIL;
452 case A_INSERT: return STOCK_PIXMAP_INSERT_FILE;
453 case A_ATTACH: return STOCK_PIXMAP_MAIL_ATTACH;
454 case A_SIG: return STOCK_PIXMAP_MAIL_SIGN;
455 case A_EXTEDITOR: return STOCK_PIXMAP_EDIT_EXTERN;
456 case A_LINEWRAP_CURRENT:return STOCK_PIXMAP_LINEWRAP_CURRENT;
457 case A_LINEWRAP_ALL: return STOCK_PIXMAP_LINEWRAP_ALL;
458 case A_ADDRBOOK: return STOCK_PIXMAP_ADDRESS_BOOK;
459 case A_CANCEL_INC: return STOCK_PIXMAP_CANCEL;
460 case A_EXECUTE: return STOCK_PIXMAP_EXEC;
462 case A_CHECK_SPELLING: return STOCK_PIXMAP_CHECK_SPELLING;
468 static void toolbar_set_default_main(void)
472 } default_toolbar[] = {
492 #if (defined(USE_SPAMASSASSIN_PLUGIN) || defined(USE_BOGOFILTER_PLUGIN))
502 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
504 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
506 if (default_toolbar[i].action != A_SEPARATOR) {
508 gchar *file = stock_pixmap_get_name((StockPixmap)toolbar_get_icon(default_toolbar[i].action));
510 toolbar_item->file = g_strdup(file);
511 toolbar_item->index = default_toolbar[i].action;
512 toolbar_item->text = g_strdup(toolbar_get_short_text(default_toolbar[i].action));
515 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
516 toolbar_item->index = A_SEPARATOR;
519 if (toolbar_item->index != -1) {
520 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_MAIN))
521 toolbar_config[TOOLBAR_MAIN].item_list =
522 g_slist_append(toolbar_config[TOOLBAR_MAIN].item_list, toolbar_item);
527 static void toolbar_set_default_compose(void)
531 } default_toolbar[] = {
550 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
552 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
554 if (default_toolbar[i].action != A_SEPARATOR) {
556 gchar *file = stock_pixmap_get_name((StockPixmap)toolbar_get_icon(default_toolbar[i].action));
558 toolbar_item->file = g_strdup(file);
559 toolbar_item->index = default_toolbar[i].action;
560 toolbar_item->text = g_strdup(toolbar_get_short_text(default_toolbar[i].action));
563 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
564 toolbar_item->index = A_SEPARATOR;
567 if (toolbar_item->index != -1) {
568 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_COMPOSE))
569 toolbar_config[TOOLBAR_COMPOSE].item_list =
570 g_slist_append(toolbar_config[TOOLBAR_COMPOSE].item_list, toolbar_item);
575 static void toolbar_set_default_msgview(void)
579 } default_toolbar[] = {
591 #if (defined(USE_SPAMASSASSIN_PLUGIN) || defined(USE_BOGOFILTER_PLUGIN))
600 for (i = 0; i < sizeof(default_toolbar) / sizeof(default_toolbar[0]); i++) {
602 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
604 if (default_toolbar[i].action != A_SEPARATOR) {
606 gchar *file = stock_pixmap_get_name((StockPixmap)toolbar_get_icon(default_toolbar[i].action));
608 toolbar_item->file = g_strdup(file);
609 toolbar_item->index = default_toolbar[i].action;
610 toolbar_item->text = g_strdup(toolbar_get_short_text(default_toolbar[i].action));
613 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
614 toolbar_item->index = A_SEPARATOR;
617 if (toolbar_item->index != -1) {
618 if ( !toolbar_is_duplicate(toolbar_item->index, TOOLBAR_MSGVIEW))
619 toolbar_config[TOOLBAR_MSGVIEW].item_list =
620 g_slist_append(toolbar_config[TOOLBAR_MSGVIEW].item_list, toolbar_item);
625 void toolbar_set_default(ToolbarType source)
627 if (source == TOOLBAR_MAIN)
628 toolbar_set_default_main();
629 else if (source == TOOLBAR_COMPOSE)
630 toolbar_set_default_compose();
631 else if (source == TOOLBAR_MSGVIEW)
632 toolbar_set_default_msgview();
635 void toolbar_save_config_file(ToolbarType source)
640 gchar *fileSpec = NULL;
642 debug_print("save Toolbar Configuration to %s\n", toolbar_config[source].conf_file);
644 fileSpec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, toolbar_config[source].conf_file, NULL );
645 pfile = prefs_write_open(fileSpec);
648 if (fprintf(fp, "<?xml version=\"1.0\" encoding=\"%s\" ?>\n", CS_INTERNAL) < 0)
651 if (fprintf(fp, "<%s>\n", TOOLBAR_TAG_INDEX) < 0)
654 for (cur = toolbar_config[source].item_list; cur != NULL; cur = cur->next) {
655 ToolbarItem *toolbar_item = (ToolbarItem*) cur->data;
657 if (toolbar_item->index != A_SEPARATOR) {
658 if (fprintf(fp, "\t<%s %s=\"%s\" %s=\"",
660 TOOLBAR_ICON_FILE, toolbar_item->file,
661 TOOLBAR_ICON_TEXT) < 0)
663 if (xml_file_put_escape_str(fp, toolbar_item->text) < 0)
665 if (fprintf(fp, "\" %s=\"%s\"/>\n",
667 toolbar_ret_text_from_val(toolbar_item->index)) < 0)
670 if (fprintf(fp, "\t<%s/>\n", TOOLBAR_TAG_SEPARATOR) < 0)
675 if (fprintf(fp, "</%s>\n", TOOLBAR_TAG_INDEX) < 0)
679 if (prefs_file_close (pfile) < 0 )
680 g_warning("failed to write toolbar configuration to file\n");
684 FILE_OP_ERROR(fileSpec, "fprintf");
686 prefs_file_close_revert (pfile);
688 g_warning("failed to open toolbar configuration file for writing\n");
691 void toolbar_read_config_file(ToolbarType source)
693 XMLFile *file = NULL;
694 gchar *fileSpec = NULL;
699 debug_print("read Toolbar Configuration from %s\n", toolbar_config[source].conf_file);
701 fileSpec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, toolbar_config[source].conf_file, NULL );
702 file = xml_open_file(fileSpec);
705 toolbar_clear_list(source);
709 || (xml_get_dtd(file))
710 || (xml_parse_next_tag(file))
711 || (!xml_compare_tag(file, TOOLBAR_TAG_INDEX))) {
712 xml_close_file(file);
716 attr = xml_get_current_tag_attr(file);
723 if (xml_parse_next_tag(file))
726 /* Get next tag (icon, icon_text or icon_action) */
727 if (xml_compare_tag(file, TOOLBAR_TAG_ITEM)) {
728 toolbar_parse_item(file, source);
729 } else if (xml_compare_tag(file, TOOLBAR_TAG_SEPARATOR)) {
730 ToolbarItem *item = g_new0(ToolbarItem, 1);
732 item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
733 item->index = A_SEPARATOR;
734 toolbar_config[source].item_list =
735 g_slist_append(toolbar_config[source].item_list, item);
739 xml_close_file(file);
742 if ((!file) || (g_slist_length(toolbar_config[source].item_list) == 0)) {
744 if (source == TOOLBAR_MAIN)
745 toolbar_set_default(TOOLBAR_MAIN);
746 else if (source == TOOLBAR_COMPOSE)
747 toolbar_set_default(TOOLBAR_COMPOSE);
748 else if (source == TOOLBAR_MSGVIEW)
749 toolbar_set_default(TOOLBAR_MSGVIEW);
751 g_warning("failed to write Toolbar Configuration to %s\n", toolbar_config[source].conf_file);
755 toolbar_save_config_file(source);
760 * clears list of toolbar items read from configuration files
762 void toolbar_clear_list(ToolbarType source)
764 while (toolbar_config[source].item_list != NULL) {
765 ToolbarItem *item = (ToolbarItem*) toolbar_config[source].item_list->data;
767 toolbar_config[source].item_list =
768 g_slist_remove(toolbar_config[source].item_list, item);
774 g_slist_free(toolbar_config[source].item_list);
779 * return list of Toolbar items
781 GSList *toolbar_get_list(ToolbarType source)
785 if ((source == TOOLBAR_MAIN) || (source == TOOLBAR_COMPOSE) || (source == TOOLBAR_MSGVIEW))
786 list = toolbar_config[source].item_list;
791 void toolbar_set_list_item(ToolbarItem *t_item, ToolbarType source)
793 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
795 toolbar_item->file = g_strdup(t_item->file);
796 toolbar_item->text = g_strdup(t_item->text);
797 toolbar_item->index = t_item->index;
799 toolbar_config[source].item_list =
800 g_slist_append(toolbar_config[source].item_list,
804 static void toolbar_action_execute(GtkWidget *widget,
810 gchar *action, *action_p;
811 gboolean found = FALSE;
814 for (cur = action_list; cur != NULL; cur = cur->next) {
815 ToolbarClawsActions *act = (ToolbarClawsActions*)cur->data;
817 if (widget == act->widget) {
819 for (lop = prefs_common.actions_list; lop != NULL; lop = lop->next) {
820 action = g_strdup((gchar*)lop->data);
822 action_p = strstr(action, ": ");
824 if (g_utf8_collate(act->name, action) == 0) {
838 actions_execute(data, i, widget, source);
840 g_warning ("Error: did not find Claws Action to execute");
843 #if !(GTK_CHECK_VERSION(2,12,0))
844 #define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
845 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(widget), GTK_TOOLTIPS(toolbar_tips), \
849 #define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
850 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), tip); \
854 #if !(GTK_CHECK_VERSION(2,12,0))
855 #define CLAWS_SET_ARROW_TIP(widget,tip) { \
856 gtk_menu_tool_button_set_arrow_tooltip(GTK_MENU_TOOL_BUTTON(widget), GTK_TOOLTIPS(toolbar_tips), \
860 #define CLAWS_SET_ARROW_TIP(widget,tip) { \
861 gtk_menu_tool_button_set_arrow_tooltip_text(GTK_MENU_TOOL_BUTTON(widget), tip); \
865 static void activate_compose_button (Toolbar *toolbar,
867 ComposeButtonType type)
869 #if !(GTK_CHECK_VERSION(2,12,0))
870 GtkTooltips *toolbar_tips = toolbar->tooltips;
872 if ((!toolbar->compose_mail_btn))
875 if (type == COMPOSEBUTTON_NEWS) {
876 gtk_tool_button_set_icon_widget(
877 GTK_TOOL_BUTTON(toolbar->compose_mail_btn),
878 toolbar->compose_news_icon);
880 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar->compose_mail_btn), _("Compose News message"));
882 gtk_widget_show(toolbar->compose_news_icon);
884 gtk_tool_button_set_icon_widget(
885 GTK_TOOL_BUTTON(toolbar->compose_mail_btn),
886 toolbar->compose_mail_icon);
888 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar->compose_mail_btn), _("Compose Email"));
890 gtk_widget_show(toolbar->compose_mail_icon);
892 toolbar->compose_btn_type = type;
895 void toolbar_set_compose_button(Toolbar *toolbar,
896 ComposeButtonType compose_btn_type)
898 if (toolbar->compose_btn_type != compose_btn_type)
899 activate_compose_button(toolbar,
900 prefs_common.toolbar_style,
904 static void activate_learn_button (Toolbar *toolbar,
906 LearnButtonType type)
908 #if !(GTK_CHECK_VERSION(2,12,0))
909 GtkTooltips *toolbar_tips = toolbar->tooltips;
911 if ((!toolbar->learn_spam_btn))
914 if (type == LEARN_SPAM) {
915 gtk_tool_button_set_icon_widget(
916 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
917 toolbar->learn_spam_icon);
918 gtk_tool_button_set_label(
919 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
922 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar->learn_spam_btn), _("Learn spam"));
924 gtk_widget_show(toolbar->learn_spam_icon);
926 gtk_tool_button_set_icon_widget(
927 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
928 toolbar->learn_ham_icon);
929 gtk_tool_button_set_label(
930 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
933 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar->learn_spam_btn), _("Learn ham"));
935 gtk_widget_show(toolbar->learn_ham_icon);
937 toolbar->learn_btn_type = type;
940 void toolbar_set_learn_button(Toolbar *toolbar,
941 LearnButtonType learn_btn_type)
943 if (toolbar->learn_btn_type != learn_btn_type)
944 activate_learn_button(toolbar,
945 prefs_common.toolbar_style,
949 void toolbar_toggle(guint action, gpointer data)
951 MainWindow *mainwin = (MainWindow*)data;
955 g_return_if_fail(mainwin != NULL);
957 toolbar_style(TOOLBAR_MAIN, action, mainwin);
959 list = compose_get_compose_list();
960 for (cur = list; cur != NULL; cur = cur->next) {
961 toolbar_style(TOOLBAR_COMPOSE, action, cur->data);
963 list = messageview_get_msgview_list();
964 for (cur = list; cur != NULL; cur = cur->next) {
965 toolbar_style(TOOLBAR_MSGVIEW, action, cur->data);
970 void toolbar_set_style(GtkWidget *toolbar_wid, GtkWidget *handlebox_wid, guint action)
972 switch ((ToolbarStyle)action) {
974 gtk_widget_hide(handlebox_wid);
977 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
981 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
985 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
988 case TOOLBAR_BOTH_HORIZ:
989 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
990 GTK_TOOLBAR_BOTH_HORIZ);
996 prefs_common.toolbar_style = (ToolbarStyle)action;
997 gtk_widget_set_size_request(handlebox_wid, 1, -1);
999 if (prefs_common.toolbar_style != TOOLBAR_NONE) {
1000 gtk_widget_show(handlebox_wid);
1001 gtk_widget_queue_resize(handlebox_wid);
1005 * Change the style of toolbar
1007 static void toolbar_style(ToolbarType type, guint action, gpointer data)
1009 GtkWidget *handlebox_wid;
1010 GtkWidget *toolbar_wid;
1011 MainWindow *mainwin = (MainWindow*)data;
1012 Compose *compose = (Compose*)data;
1013 MessageView *msgview = (MessageView*)data;
1015 g_return_if_fail(data != NULL);
1019 handlebox_wid = mainwin->handlebox;
1020 toolbar_wid = mainwin->toolbar->toolbar;
1022 case TOOLBAR_COMPOSE:
1023 handlebox_wid = compose->handlebox;
1024 toolbar_wid = compose->toolbar->toolbar;
1026 case TOOLBAR_MSGVIEW:
1027 handlebox_wid = msgview->handlebox;
1028 toolbar_wid = msgview->toolbar->toolbar;
1034 toolbar_set_style(toolbar_wid, handlebox_wid, action);
1037 /* Toolbar handling */
1038 static void toolbar_inc_cb(GtkWidget *widget,
1041 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1042 MainWindow *mainwin;
1044 g_return_if_fail(toolbar_item != NULL);
1046 switch (toolbar_item->type) {
1048 mainwin = (MainWindow*)toolbar_item->parent;
1049 inc_mail_cb(mainwin, 0, NULL);
1056 static void toolbar_inc_all_cb(GtkWidget *widget,
1059 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1060 MainWindow *mainwin;
1062 g_return_if_fail(toolbar_item != NULL);
1064 switch (toolbar_item->type) {
1066 mainwin = (MainWindow*)toolbar_item->parent;
1067 inc_all_account_mail_cb(mainwin, 0, NULL);
1074 static void toolbar_send_queued_cb(GtkWidget *widget,gpointer data)
1076 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1077 MainWindow *mainwin;
1079 g_return_if_fail(toolbar_item != NULL);
1081 switch (toolbar_item->type) {
1083 mainwin = (MainWindow*)toolbar_item->parent;
1084 send_queue_cb(mainwin, 0, NULL);
1091 static void toolbar_exec_cb(GtkWidget *widget,
1094 MainWindow *mainwin = get_mainwin(data);
1096 g_return_if_fail(mainwin != NULL);
1097 summary_execute(mainwin->summaryview);
1101 * Delete current/selected(s) message(s)
1103 static void toolbar_trash_cb(GtkWidget *widget, gpointer data)
1105 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1106 MainWindow *mainwin;
1108 g_return_if_fail(toolbar_item != NULL);
1109 g_return_if_fail(toolbar_item->parent);
1111 switch (toolbar_item->type) {
1112 case TOOLBAR_MSGVIEW:
1113 messageview_delete((MessageView *)toolbar_item->parent);
1116 mainwin = (MainWindow *)toolbar_item->parent;
1117 summary_delete_trash(mainwin->summaryview);
1120 debug_print("toolbar event not supported\n");
1126 * Delete current/selected(s) message(s)
1128 static void toolbar_delete_cb(GtkWidget *widget, gpointer data)
1130 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1131 MainWindow *mainwin;
1133 g_return_if_fail(toolbar_item != NULL);
1134 g_return_if_fail(toolbar_item->parent);
1136 switch (toolbar_item->type) {
1137 case TOOLBAR_MSGVIEW:
1138 messageview_delete((MessageView *)toolbar_item->parent);
1141 mainwin = (MainWindow *)toolbar_item->parent;
1142 summary_delete(mainwin->summaryview);
1145 debug_print("toolbar event not supported\n");
1152 * Compose new message
1154 static void toolbar_compose_cb(GtkWidget *widget, gpointer data)
1156 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1157 MainWindow *mainwin;
1158 MessageView *msgview;
1160 g_return_if_fail(toolbar_item != NULL);
1162 switch (toolbar_item->type) {
1164 mainwin = (MainWindow*)toolbar_item->parent;
1165 if (mainwin->toolbar->compose_btn_type == COMPOSEBUTTON_NEWS)
1166 compose_news_cb(mainwin, 0, NULL);
1168 compose_mail_cb(mainwin, 0, NULL);
1170 case TOOLBAR_MSGVIEW:
1171 msgview = (MessageView*)toolbar_item->parent;
1172 compose_new_with_folderitem(NULL,
1173 msgview->msginfo->folder, NULL);
1176 debug_print("toolbar event not supported\n");
1180 static void toolbar_learn(gpointer data, guint as_spam)
1182 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1183 MainWindow *mainwin;
1184 MessageView *msgview;
1186 g_return_if_fail(toolbar_item != NULL);
1188 switch (toolbar_item->type) {
1190 mainwin = (MainWindow*)toolbar_item->parent;
1192 mainwindow_learn(mainwin, TRUE);
1194 mainwindow_learn(mainwin, FALSE);
1196 case TOOLBAR_MSGVIEW:
1197 msgview = (MessageView*)toolbar_item->parent;
1199 messageview_learn(msgview, TRUE);
1201 messageview_learn(msgview, FALSE);
1204 debug_print("toolbar event not supported\n");
1208 static void toolbar_learn_cb(GtkWidget *widget, gpointer data)
1210 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1211 MainWindow *mainwin;
1212 MessageView *msgview;
1214 g_return_if_fail(toolbar_item != NULL);
1216 switch (toolbar_item->type) {
1218 mainwin = (MainWindow*)toolbar_item->parent;
1219 if (mainwin->toolbar->learn_btn_type == LEARN_SPAM)
1220 mainwindow_learn(mainwin, TRUE);
1222 mainwindow_learn(mainwin, FALSE);
1224 case TOOLBAR_MSGVIEW:
1225 msgview = (MessageView*)toolbar_item->parent;
1226 if (msgview->toolbar->learn_btn_type == LEARN_SPAM)
1227 messageview_learn(msgview, TRUE);
1229 messageview_learn(msgview, FALSE);
1232 debug_print("toolbar event not supported\n");
1240 static void toolbar_reply_cb(GtkWidget *widget, gpointer data)
1242 toolbar_reply(data, (prefs_common.reply_with_quote ?
1243 COMPOSE_REPLY_WITH_QUOTE : COMPOSE_REPLY_WITHOUT_QUOTE));
1248 * Reply message to Sender and All recipients
1250 static void toolbar_reply_to_all_cb(GtkWidget *widget, gpointer data)
1253 (prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_ALL_WITH_QUOTE
1254 : COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE));
1259 * Reply to Mailing List
1261 static void toolbar_reply_to_list_cb(GtkWidget *widget, gpointer data)
1264 (prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_LIST_WITH_QUOTE
1265 : COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE));
1270 * Reply to sender of message
1272 static void toolbar_reply_to_sender_cb(GtkWidget *widget, gpointer data)
1275 (prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
1276 : COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE));
1282 static void toolbar_addrbook_cb(GtkWidget *widget, gpointer data)
1284 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1287 g_return_if_fail(toolbar_item != NULL);
1289 switch (toolbar_item->type) {
1291 case TOOLBAR_MSGVIEW:
1294 case TOOLBAR_COMPOSE:
1295 compose = (Compose *)toolbar_item->parent;
1300 addressbook_open(compose);
1305 * Forward current/selected(s) message(s)
1307 static void toolbar_forward_cb(GtkWidget *widget, gpointer data)
1309 toolbar_reply(data, (COMPOSE_FORWARD));
1313 * Goto Prev Unread Message
1315 static void toolbar_prev_unread_cb(GtkWidget *widget, gpointer data)
1317 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1318 MainWindow *mainwin;
1319 MessageView *msgview;
1321 g_return_if_fail(toolbar_item != NULL);
1323 switch (toolbar_item->type) {
1325 mainwin = (MainWindow*)toolbar_item->parent;
1326 summary_select_prev_unread(mainwin->summaryview);
1329 case TOOLBAR_MSGVIEW:
1330 msgview = (MessageView*)toolbar_item->parent;
1331 msgview->updating = TRUE;
1332 summary_select_prev_unread(msgview->mainwin->summaryview);
1333 msgview->updating = FALSE;
1335 if (msgview->deferred_destroy) {
1336 debug_print("messageview got away!\n");
1337 messageview_destroy(msgview);
1341 /* Now we need to update the messageview window */
1342 if (msgview->mainwin->summaryview->selected) {
1343 #ifndef GENERIC_UMPC
1344 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1347 messageview_show(msgview, msginfo,
1348 msgview->all_headers);
1351 gtk_widget_destroy(msgview->window);
1355 debug_print("toolbar event not supported\n");
1360 * Goto Next Unread Message
1362 static void toolbar_next_unread_cb(GtkWidget *widget, gpointer data)
1364 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1365 MainWindow *mainwin;
1366 MessageView *msgview;
1368 g_return_if_fail(toolbar_item != NULL);
1370 switch (toolbar_item->type) {
1372 mainwin = (MainWindow*)toolbar_item->parent;
1373 summary_select_next_unread(mainwin->summaryview);
1376 case TOOLBAR_MSGVIEW:
1377 msgview = (MessageView*)toolbar_item->parent;
1378 msgview->updating = TRUE;
1379 summary_select_next_unread(msgview->mainwin->summaryview);
1380 msgview->updating = FALSE;
1382 if (msgview->deferred_destroy) {
1383 debug_print("messageview got away!\n");
1384 messageview_destroy(msgview);
1388 /* Now we need to update the messageview window */
1389 if (msgview->mainwin->summaryview->selected) {
1390 #ifndef GENERIC_UMPC
1391 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1394 messageview_show(msgview, msginfo,
1395 msgview->all_headers);
1398 gtk_widget_destroy(msgview->window);
1402 debug_print("toolbar event not supported\n");
1406 static void toolbar_ignore_thread_cb(GtkWidget *widget, gpointer data)
1408 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1409 MainWindow *mainwin;
1411 g_return_if_fail(toolbar_item != NULL);
1413 switch (toolbar_item->type) {
1415 mainwin = (MainWindow *) toolbar_item->parent;
1416 summary_toggle_ignore_thread(mainwin->summaryview);
1418 case TOOLBAR_MSGVIEW:
1419 /* TODO: see toolbar_next_unread_cb() if you need
1420 * this in the message view */
1423 debug_print("toolbar event not supported\n");
1428 static void toolbar_watch_thread_cb(GtkWidget *widget, gpointer data)
1430 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1431 MainWindow *mainwin;
1433 g_return_if_fail(toolbar_item != NULL);
1435 switch (toolbar_item->type) {
1437 mainwin = (MainWindow *) toolbar_item->parent;
1438 summary_toggle_watch_thread(mainwin->summaryview);
1440 case TOOLBAR_MSGVIEW:
1441 /* TODO: see toolbar_next_unread_cb() if you need
1442 * this in the message view */
1445 debug_print("toolbar event not supported\n");
1450 static void toolbar_cancel_inc_cb(GtkWidget *widget, gpointer data)
1452 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1454 g_return_if_fail(toolbar_item != NULL);
1460 static void toolbar_print_cb(GtkWidget *widget, gpointer data)
1462 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1463 MainWindow *mainwin;
1465 g_return_if_fail(toolbar_item != NULL);
1467 switch (toolbar_item->type) {
1469 mainwin = (MainWindow *) toolbar_item->parent;
1470 summary_print(mainwin->summaryview);
1472 case TOOLBAR_MSGVIEW:
1473 /* TODO: see toolbar_next_unread_cb() if you need
1474 * this in the message view */
1477 debug_print("toolbar event not supported\n");
1482 static void toolbar_send_cb(GtkWidget *widget, gpointer data)
1484 compose_toolbar_cb(A_SEND, data);
1487 static void toolbar_send_later_cb(GtkWidget *widget, gpointer data)
1489 compose_toolbar_cb(A_SENDL, data);
1492 static void toolbar_draft_cb(GtkWidget *widget, gpointer data)
1494 compose_toolbar_cb(A_DRAFT, data);
1497 static void toolbar_close_cb(GtkWidget *widget, gpointer data)
1499 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1500 MainWindow *mainwin;
1501 MessageView *messageview;
1504 g_return_if_fail(toolbar_item != NULL);
1506 switch (toolbar_item->type) {
1508 mainwin = (MainWindow *) toolbar_item->parent;
1509 app_will_exit(NULL, mainwin);
1511 case TOOLBAR_MSGVIEW:
1512 messageview = (MessageView *)toolbar_item->parent;
1513 messageview_destroy(messageview);
1515 case TOOLBAR_COMPOSE:
1516 compose = (Compose *)toolbar_item->parent;
1517 compose_close_toolbar(compose);
1522 static void toolbar_preferences_cb(GtkWidget *widget, gpointer data)
1527 static void toolbar_open_mail_cb(GtkWidget *widget, gpointer data)
1529 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1530 MainWindow *mainwin;
1532 g_return_if_fail(toolbar_item != NULL);
1534 switch (toolbar_item->type) {
1536 mainwin = (MainWindow *) toolbar_item->parent;
1537 summary_open_row(NULL, mainwin->summaryview);
1539 case TOOLBAR_MSGVIEW:
1540 debug_print("toolbar event not supported\n");
1542 case TOOLBAR_COMPOSE:
1543 debug_print("toolbar event not supported\n");
1548 static void toolbar_insert_cb(GtkWidget *widget, gpointer data)
1550 compose_toolbar_cb(A_INSERT, data);
1553 static void toolbar_attach_cb(GtkWidget *widget, gpointer data)
1555 compose_toolbar_cb(A_ATTACH, data);
1558 static void toolbar_sig_cb(GtkWidget *widget, gpointer data)
1560 compose_toolbar_cb(A_SIG, data);
1563 static void toolbar_ext_editor_cb(GtkWidget *widget, gpointer data)
1565 compose_toolbar_cb(A_EXTEDITOR, data);
1568 static void toolbar_linewrap_current_cb(GtkWidget *widget, gpointer data)
1570 compose_toolbar_cb(A_LINEWRAP_CURRENT, data);
1573 static void toolbar_linewrap_all_cb(GtkWidget *widget, gpointer data)
1575 compose_toolbar_cb(A_LINEWRAP_ALL, data);
1579 static void toolbar_check_spelling_cb(GtkWidget *widget, gpointer data)
1581 compose_toolbar_cb(A_CHECK_SPELLING, data);
1585 * Execute actions from toolbar
1587 static void toolbar_actions_execute_cb(GtkWidget *widget, gpointer data)
1589 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1590 GSList *action_list;
1591 MainWindow *mainwin;
1593 MessageView *msgview;
1594 gpointer parent = toolbar_item->parent;
1596 g_return_if_fail(toolbar_item != NULL);
1598 switch (toolbar_item->type) {
1600 mainwin = (MainWindow*)parent;
1601 action_list = mainwin->toolbar->action_list;
1603 case TOOLBAR_COMPOSE:
1604 compose = (Compose*)parent;
1605 action_list = compose->toolbar->action_list;
1607 case TOOLBAR_MSGVIEW:
1608 msgview = (MessageView*)parent;
1609 action_list = msgview->toolbar->action_list;
1612 debug_print("toolbar event not supported\n");
1615 toolbar_action_execute(widget, action_list, parent, toolbar_item->type);
1618 static MainWindow *get_mainwin(gpointer data)
1620 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1621 MainWindow *mainwin = NULL;
1622 MessageView *msgview;
1624 g_return_val_if_fail(toolbar_item != NULL, NULL);
1626 switch(toolbar_item->type) {
1628 mainwin = (MainWindow*)toolbar_item->parent;
1630 case TOOLBAR_MSGVIEW:
1631 msgview = (MessageView*)toolbar_item->parent;
1632 mainwin = (MainWindow*)msgview->mainwin;
1641 static void toolbar_go_folders_cb(GtkWidget *widget, gpointer data)
1643 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1644 MainWindow *mainwin = NULL;
1645 switch(toolbar_item->type) {
1647 mainwin = (MainWindow*)toolbar_item->parent;
1650 g_warning("wrong toolbar type\n");
1654 if (!mainwin->in_folder) {
1655 FolderItem *item = folderview_get_selected_item(mainwin->folderview);
1657 folderview_select(mainwin->folderview, item);
1660 gtk_widget_grab_focus(mainwin->folderview->ctree);
1661 mainwindow_exit_folder(mainwin);
1665 static void toolbar_buttons_cb(GtkWidget *widget,
1672 void (*func)(GtkWidget *widget, gpointer data);
1674 { A_RECEIVE_ALL, toolbar_inc_all_cb },
1675 { A_RECEIVE_CUR, toolbar_inc_cb },
1676 { A_SEND_QUEUED, toolbar_send_queued_cb },
1677 { A_COMPOSE_EMAIL, toolbar_compose_cb },
1678 { A_COMPOSE_NEWS, toolbar_compose_cb },
1679 { A_REPLY_MESSAGE, toolbar_reply_cb },
1680 { A_REPLY_SENDER, toolbar_reply_to_sender_cb },
1681 { A_REPLY_ALL, toolbar_reply_to_all_cb },
1682 { A_REPLY_ML, toolbar_reply_to_list_cb },
1683 { A_FORWARD, toolbar_forward_cb },
1684 { A_TRASH, toolbar_trash_cb },
1685 { A_DELETE_REAL, toolbar_delete_cb },
1686 { A_EXECUTE, toolbar_exec_cb },
1687 { A_GOTO_PREV, toolbar_prev_unread_cb },
1688 { A_GOTO_NEXT, toolbar_next_unread_cb },
1689 { A_IGNORE_THREAD, toolbar_ignore_thread_cb },
1690 { A_WATCH_THREAD, toolbar_watch_thread_cb },
1691 { A_PRINT, toolbar_print_cb },
1692 { A_LEARN_SPAM, toolbar_learn_cb },
1693 { A_GO_FOLDERS, toolbar_go_folders_cb },
1695 { A_SEND, toolbar_send_cb },
1696 { A_SENDL, toolbar_send_later_cb },
1697 { A_DRAFT, toolbar_draft_cb },
1698 { A_OPEN_MAIL, toolbar_open_mail_cb },
1699 { A_CLOSE, toolbar_close_cb },
1700 { A_PREFERENCES, toolbar_preferences_cb },
1701 { A_INSERT, toolbar_insert_cb },
1702 { A_ATTACH, toolbar_attach_cb },
1703 { A_SIG, toolbar_sig_cb },
1704 { A_EXTEDITOR, toolbar_ext_editor_cb },
1705 { A_LINEWRAP_CURRENT, toolbar_linewrap_current_cb },
1706 { A_LINEWRAP_ALL, toolbar_linewrap_all_cb },
1707 { A_ADDRBOOK, toolbar_addrbook_cb },
1709 { A_CHECK_SPELLING, toolbar_check_spelling_cb },
1711 { A_CLAWS_ACTIONS, toolbar_actions_execute_cb },
1712 { A_CANCEL_INC, toolbar_cancel_inc_cb }
1715 num_items = sizeof(callbacks)/sizeof(callbacks[0]);
1717 for (i = 0; i < num_items; i++) {
1718 if (callbacks[i].index == item->index) {
1719 callbacks[i].func(widget, item);
1724 #ifndef GENERIC_UMPC
1725 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
1726 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
1727 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1728 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1729 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1730 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1731 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
1735 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
1736 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
1737 GList *gchild = NULL; \
1738 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
1739 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1740 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1741 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1742 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1743 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
1745 CLAWS_SET_ARROW_TIP(GTK_MENU_TOOL_BUTTON(item), menutip); \
1746 child = gtk_bin_get_child(GTK_BIN(item)); \
1747 gchild = gtk_container_get_children( \
1748 GTK_CONTAINER(child)); \
1749 btn = (GtkWidget *)gchild->data; \
1750 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
1751 g_list_free(gchild); \
1752 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
1753 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
1754 g_list_free(gchild); \
1757 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
1758 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
1759 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1760 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1761 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1762 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1765 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
1766 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
1767 GList *gchild = NULL; \
1768 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
1769 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1770 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1771 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1772 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1773 child = gtk_bin_get_child(GTK_BIN(item)); \
1774 gchild = gtk_container_get_children( \
1775 GTK_CONTAINER(child)); \
1776 btn = (GtkWidget *)gchild->data; \
1777 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
1778 g_list_free(gchild); \
1779 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
1780 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
1781 g_list_free(gchild); \
1785 #define ADD_MENU_ITEM(name,cb,data) { \
1786 item = gtk_menu_item_new_with_mnemonic(name); \
1787 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); \
1788 g_signal_connect(G_OBJECT(item), "activate", \
1791 g_object_set_data(G_OBJECT(item), "int-value", GINT_TO_POINTER(data)); \
1792 gtk_widget_show(item); \
1795 static void toolbar_reply_menu_cb(GtkWidget *widget, gpointer data)
1797 gpointer int_value = g_object_get_data(G_OBJECT(widget), "int-value");
1798 ToolbarItem *toolbar_item = (ToolbarItem *)data;
1800 toolbar_reply(toolbar_item, GPOINTER_TO_INT(int_value));
1803 static void toolbar_learn_menu_cb(GtkWidget *widget, gpointer data)
1805 gpointer int_value = g_object_get_data(G_OBJECT(widget), "int-value");
1806 ToolbarItem *toolbar_item = (ToolbarItem *)data;
1808 toolbar_learn(toolbar_item, GPOINTER_TO_INT(int_value));
1812 * Create a new toolbar with specified type
1813 * if a callback list is passed it will be used before the
1814 * common callback list
1816 Toolbar *toolbar_create(ToolbarType type,
1817 GtkWidget *container,
1820 ToolbarItem *toolbar_item;
1823 GtkWidget *icon_wid = NULL;
1824 GtkWidget *icon_news;
1825 GtkWidget *icon_ham;
1827 ToolbarClawsActions *action_item;
1829 GSList *toolbar_list;
1830 Toolbar *toolbar_data;
1832 #ifndef GENERIC_UMPC
1833 #if !(GTK_CHECK_VERSION(2,12,0))
1834 GtkTooltips *toolbar_tips = gtk_tooltips_new();
1837 toolbar_read_config_file(type);
1838 toolbar_list = toolbar_get_list(type);
1840 toolbar_data = g_new0(Toolbar, 1);
1842 toolbar = gtk_toolbar_new();
1844 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
1845 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
1846 gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar), TRUE);
1848 for (cur = toolbar_list; cur != NULL; cur = cur->next) {
1850 if (g_ascii_strcasecmp(((ToolbarItem*)cur->data)->file, TOOLBAR_TAG_SEPARATOR) == 0) {
1851 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new(), -1);
1855 toolbar_item = g_new0(ToolbarItem, 1);
1856 toolbar_item->index = ((ToolbarItem*)cur->data)->index;
1857 toolbar_item->file = g_strdup(((ToolbarItem*)cur->data)->file);
1858 toolbar_item->text = g_strdup(((ToolbarItem*)cur->data)->text);
1859 toolbar_item->parent = data;
1860 toolbar_item->type = type;
1862 /* collect toolbar items in list to keep track */
1863 toolbar_data->item_list =
1864 g_slist_append(toolbar_data->item_list,
1866 icon_wid = stock_pixmap_widget(container, stock_pixmap_get_icon(toolbar_item->file));
1868 switch (toolbar_item->index) {
1871 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to folder list"));
1872 toolbar_data->folders_btn = item;
1875 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1876 _("Receive Mail on all Accounts"),
1877 _("Receive Mail on selected Account"));
1878 toolbar_data->getall_btn = item;
1881 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text, _("Receive Mail on current Account"));
1882 toolbar_data->get_btn = item;
1885 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Queued Messages"));
1886 toolbar_data->send_btn = item;
1889 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Close window"));
1890 toolbar_data->close_window_btn = item;
1893 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Open preferences"));
1894 toolbar_data->preferences_btn = item;
1897 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Open email"));
1898 toolbar_data->open_mail_btn = item;
1900 case A_COMPOSE_EMAIL:
1901 #ifndef GENERIC_UMPC
1902 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1904 _("Compose with selected Account"));
1905 toolbar_data->compose_mail_btn = item;
1906 toolbar_data->compose_mail_icon = icon_wid;
1907 g_object_ref(toolbar_data->compose_mail_icon);
1909 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1910 toolbar_data->compose_news_icon = icon_news;
1911 g_object_ref(toolbar_data->compose_news_icon);
1913 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1914 _("Compose Email"));
1915 toolbar_data->compose_mail_btn = item;
1916 toolbar_data->compose_mail_icon = icon_wid;
1918 icon_news = stock_pixmap_widget(container, STOCK_PIXMAP_NEWS_COMPOSE);
1919 toolbar_data->compose_news_icon = icon_news;
1923 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1926 toolbar_data->learn_spam_btn = item;
1927 toolbar_data->learn_spam_icon = icon_wid;
1928 g_object_ref(toolbar_data->learn_spam_icon);
1930 icon_ham = stock_pixmap_widget(container, STOCK_PIXMAP_HAM_BTN);
1931 toolbar_data->learn_ham_icon = icon_ham;
1932 g_object_ref(toolbar_data->learn_ham_icon);
1934 menu = gtk_menu_new();
1935 ADD_MENU_ITEM(_("Learn as _Spam"), toolbar_learn_menu_cb, TRUE);
1936 ADD_MENU_ITEM(_("Learn as _Ham"), toolbar_learn_menu_cb, FALSE);
1937 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->learn_spam_btn), menu);
1939 case A_REPLY_MESSAGE:
1940 #ifndef GENERIC_UMPC
1941 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1942 _("Reply to Message"),
1943 _("Reply to Message options"));
1944 toolbar_data->reply_btn = item;
1946 menu = gtk_menu_new();
1947 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_WITH_QUOTE);
1948 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_WITHOUT_QUOTE);
1949 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->reply_btn), menu);
1951 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1952 _("Reply to Message"));
1953 toolbar_data->reply_btn = item;
1956 case A_REPLY_SENDER:
1957 #ifndef GENERIC_UMPC
1958 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1959 _("Reply to Sender"),
1960 _("Reply to Sender options"));
1961 toolbar_data->replysender_btn = item;
1963 menu = gtk_menu_new();
1964 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_SENDER_WITH_QUOTE);
1965 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE);
1966 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->replysender_btn), menu);
1968 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1969 _("Reply to Sender"));
1970 toolbar_data->replysender_btn = item;
1974 #ifndef GENERIC_UMPC
1975 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1977 _("Reply to All options"));
1978 toolbar_data->replyall_btn = item;
1980 menu = gtk_menu_new();
1981 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_ALL_WITH_QUOTE);
1982 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE);
1983 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->replyall_btn), menu);
1985 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
1987 toolbar_data->replyall_btn = item;
1991 #ifndef GENERIC_UMPC
1992 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
1993 _("Reply to Mailing-list"),
1994 _("Reply to Mailing-list options"));
1995 toolbar_data->replylist_btn = item;
1997 menu = gtk_menu_new();
1998 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_LIST_WITH_QUOTE);
1999 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE);
2000 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->replylist_btn), menu);
2002 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2003 _("Reply to Mailing-list"));
2004 toolbar_data->replylist_btn = item;
2008 #ifndef GENERIC_UMPC
2009 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2010 _("Forward Message"),
2011 _("Forward Message options"));
2012 toolbar_data->fwd_btn = item;
2014 menu = gtk_menu_new();
2015 ADD_MENU_ITEM(_("_Forward"), toolbar_reply_menu_cb, COMPOSE_FORWARD_INLINE);
2016 ADD_MENU_ITEM(_("For_ward as attachment"), toolbar_reply_menu_cb, COMPOSE_FORWARD_AS_ATTACH);
2017 ADD_MENU_ITEM(_("Redirec_t"), toolbar_reply_menu_cb, COMPOSE_REDIRECT);
2018 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->fwd_btn), menu);
2020 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2021 _("Forward Message"));
2022 toolbar_data->fwd_btn = item;
2026 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Trash Message"));
2027 toolbar_data->trash_btn = item;
2030 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Delete Message"));
2031 toolbar_data->delete_btn = item;
2034 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Execute"));
2035 toolbar_data->exec_btn = item;
2038 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Previous Unread Message"));
2039 toolbar_data->prev_btn = item;
2042 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Next Unread Message"));
2043 toolbar_data->next_btn = item;
2046 /* Compose Toolbar */
2048 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Message"));
2049 toolbar_data->send_btn = item;
2052 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Put into queue folder and send later"));
2053 toolbar_data->sendl_btn = item;
2056 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Save to draft folder"));
2057 toolbar_data->draft_btn = item;
2060 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert file"));
2061 toolbar_data->insert_btn = item;
2064 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Attach file"));
2065 toolbar_data->attach_btn = item;
2068 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert signature"));
2069 toolbar_data->sig_btn = item;
2072 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Edit with external editor"));
2073 toolbar_data->exteditor_btn = item;
2075 case A_LINEWRAP_CURRENT:
2076 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap long lines of current paragraph"));
2077 toolbar_data->linewrap_current_btn = item;
2079 case A_LINEWRAP_ALL:
2080 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap all long lines"));
2081 toolbar_data->linewrap_all_btn = item;
2084 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Address book"));
2085 toolbar_data->addrbook_btn = item;
2088 case A_CHECK_SPELLING:
2089 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Check spelling"));
2090 toolbar_data->spellcheck_btn = item;
2094 case A_CLAWS_ACTIONS:
2095 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,toolbar_item->text);
2096 action_item = g_new0(ToolbarClawsActions, 1);
2097 action_item->widget = item;
2098 action_item->name = g_strdup(toolbar_item->text);
2100 toolbar_data->action_list =
2101 g_slist_append(toolbar_data->action_list,
2105 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Cancel receiving"));
2106 toolbar_data->cancel_inc_btn = item;
2109 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2110 toolbar_ret_descr_from_val(toolbar_item->index));
2111 /* find and set the tool tip text */
2116 toolbar_data->toolbar = toolbar;
2117 #ifndef GENERIC_UMPC
2118 #if !(GTK_CHECK_VERSION(2,12,0))
2119 toolbar_data->tooltips = toolbar_tips;
2122 gtk_widget_show_all(toolbar);
2124 if (type == TOOLBAR_MAIN) {
2126 MainWindow *mainwin = mainwindow_get_mainwindow();
2127 GtkWidget *progressbar = gtk_progress_bar_new();
2128 item = GTK_WIDGET(gtk_tool_item_new());
2129 gtk_container_add (GTK_CONTAINER (item), progressbar);
2130 gtk_widget_show(item);
2131 gtk_widget_show(progressbar);
2132 gtk_widget_set_size_request(progressbar, 70, -1);
2133 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1);
2134 mainwin->progressbar = progressbar;
2136 activate_compose_button(toolbar_data,
2137 prefs_common.toolbar_style,
2138 toolbar_data->compose_btn_type);
2140 if (type != TOOLBAR_COMPOSE)
2141 activate_learn_button(toolbar_data, prefs_common.toolbar_style,
2145 gtk_container_add(GTK_CONTAINER(container), toolbar);
2146 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
2148 if ( GTK_IS_WINDOW(container) ) {
2149 hildon_window_add_toolbar (HILDON_WINDOW(container), GTK_TOOLBAR(toolbar));
2150 gtk_widget_show_all (container);
2152 gtk_container_add(GTK_CONTAINER(container), toolbar);
2153 gtk_container_set_border_width(GTK_CONTAINER(container), 2);
2156 return toolbar_data;
2160 * Free toolbar structures
2162 void toolbar_destroy(Toolbar * toolbar) {
2164 TOOLBAR_DESTROY_ITEMS(toolbar->item_list);
2165 TOOLBAR_DESTROY_ACTIONS(toolbar->action_list);
2168 void toolbar_update(ToolbarType type, gpointer data)
2170 Toolbar *toolbar_data;
2171 GtkWidget *handlebox;
2172 MainWindow *mainwin = (MainWindow*)data;
2173 Compose *compose = (Compose*)data;
2174 MessageView *msgview = (MessageView*)data;
2176 #ifndef GENERIC_UMPC
2179 toolbar_data = mainwin->toolbar;
2180 handlebox = mainwin->handlebox;
2182 case TOOLBAR_COMPOSE:
2183 toolbar_data = compose->toolbar;
2184 handlebox = compose->handlebox;
2186 case TOOLBAR_MSGVIEW:
2187 toolbar_data = msgview->toolbar;
2188 handlebox = msgview->handlebox;
2194 gtk_container_remove(GTK_CONTAINER(handlebox),
2195 GTK_WIDGET(toolbar_data->toolbar));
2197 toolbar_init(toolbar_data);
2198 toolbar_data = toolbar_create(type, handlebox, data);
2202 toolbar_data = mainwin->toolbar;
2203 handlebox = mainwin->window;
2205 case TOOLBAR_COMPOSE:
2206 toolbar_data = compose->toolbar;
2207 handlebox = compose->window;
2209 case TOOLBAR_MSGVIEW:
2210 toolbar_data = msgview->toolbar;
2211 handlebox = msgview->window;
2217 hildon_window_remove_toolbar(HILDON_WINDOW(handlebox), GTK_TOOLBAR(toolbar_data->toolbar));
2219 toolbar_init(toolbar_data);
2220 toolbar_data = toolbar_create(type, handlebox, data);
2225 mainwin->toolbar = toolbar_data;
2227 case TOOLBAR_COMPOSE:
2228 compose->toolbar = toolbar_data;
2230 case TOOLBAR_MSGVIEW:
2231 msgview->toolbar = toolbar_data;
2235 toolbar_style(type, prefs_common.toolbar_style, data);
2237 if (type == TOOLBAR_MAIN) {
2238 toolbar_main_set_sensitive((MainWindow*)data);
2239 account_set_menu_only_toolbar();
2243 #if !GTK_CHECK_VERSION(2,14,0)
2244 /* Work around http://bugzilla.gnome.org/show_bug.cgi?id=56070 */
2245 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
2246 gboolean in_btn1 = FALSE, in_btn2 = FALSE; \
2247 if (GTK_IS_BUTTON(widget)) \
2248 in_btn1 = GTK_BUTTON(widget)->in_button; \
2249 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2250 GtkWidget *child = gtk_bin_get_child( \
2252 GList *gchild = gtk_container_get_children( \
2253 GTK_CONTAINER(child)); \
2254 GtkWidget *btn = (GtkWidget *)gchild->data; \
2255 GtkWidget *arr = (GtkWidget *) \
2256 (gchild->next?gchild->next->data:NULL); \
2257 g_list_free(gchild); \
2258 if (GTK_IS_BUTTON(btn)) \
2259 in_btn1 = GTK_BUTTON(btn)->in_button; \
2260 if (GTK_IS_BUTTON(arr)) \
2261 in_btn2 = GTK_BUTTON(arr)->in_button; \
2263 else if (GTK_IS_TOOL_ITEM(widget)) { \
2264 GtkWidget *child = gtk_bin_get_child( \
2266 if (GTK_IS_BUTTON(child)) \
2267 in_btn1 = GTK_BUTTON(child)->in_button; \
2269 gtk_widget_set_sensitive(widget, sensitive); \
2270 if (GTK_IS_BUTTON(widget)) \
2271 GTK_BUTTON(widget)->in_button = in_btn1; \
2272 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2273 GtkWidget *child = gtk_bin_get_child( \
2275 GList *gchild = gtk_container_get_children( \
2276 GTK_CONTAINER(child)); \
2277 GtkWidget *btn = (GtkWidget *)gchild->data; \
2278 GtkWidget *arr = (GtkWidget *) \
2279 (gchild->next?gchild->next->data:NULL); \
2280 g_list_free(gchild); \
2281 if (GTK_IS_BUTTON(btn)) \
2282 GTK_BUTTON(btn)->in_button = in_btn1; \
2283 if (GTK_IS_BUTTON(arr)) \
2284 GTK_BUTTON(arr)->in_button = in_btn2; \
2286 else if (GTK_IS_TOOL_ITEM(widget)) { \
2287 GtkWidget *child = gtk_bin_get_child( \
2289 if (GTK_IS_BUTTON(child)) \
2290 GTK_BUTTON(child)->in_button = in_btn1; \
2294 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
2295 gtk_widget_set_sensitive(widget, sensitive); \
2299 void toolbar_main_set_sensitive(gpointer data)
2301 SensitiveCond state;
2303 MainWindow *mainwin = (MainWindow*)data;
2304 Toolbar *toolbar = mainwin->toolbar;
2306 GSList *entry_list = NULL;
2308 typedef struct _Entry Entry;
2315 #define SET_WIDGET_COND(w, c) \
2317 Entry *e = g_new0(Entry, 1); \
2320 entry_list = g_slist_append(entry_list, e); \
2324 if (toolbar->get_btn)
2325 SET_WIDGET_COND(toolbar->get_btn,
2326 M_HAVE_ACCOUNT|M_UNLOCKED);
2328 if (toolbar->getall_btn) {
2329 SET_WIDGET_COND(toolbar->getall_btn,
2330 M_HAVE_ACCOUNT|M_UNLOCKED);
2332 if (toolbar->send_btn) {
2333 SET_WIDGET_COND(toolbar->send_btn,
2334 M_HAVE_QUEUED_MAILS);
2336 if (toolbar->compose_mail_btn) {
2337 SET_WIDGET_COND(toolbar->compose_mail_btn,
2340 if (toolbar->close_window_btn) {
2341 SET_WIDGET_COND(toolbar->close_window_btn,
2344 if (toolbar->open_mail_btn) {
2345 SET_WIDGET_COND(toolbar->open_mail_btn,
2346 M_TARGET_EXIST|M_SUMMARY_ISLIST);
2348 if (toolbar->reply_btn) {
2349 SET_WIDGET_COND(toolbar->reply_btn,
2350 M_HAVE_ACCOUNT|M_TARGET_EXIST|M_SUMMARY_ISLIST);
2352 if (toolbar->replyall_btn) {
2353 SET_WIDGET_COND(toolbar->replyall_btn,
2354 M_HAVE_ACCOUNT|M_TARGET_EXIST|M_SUMMARY_ISLIST);
2356 if (toolbar->replylist_btn) {
2357 SET_WIDGET_COND(toolbar->replylist_btn,
2358 M_HAVE_ACCOUNT|M_TARGET_EXIST|M_SUMMARY_ISLIST);
2360 if (toolbar->replysender_btn) {
2361 SET_WIDGET_COND(toolbar->replysender_btn,
2362 M_HAVE_ACCOUNT|M_TARGET_EXIST|M_SUMMARY_ISLIST);
2364 if (toolbar->fwd_btn) {
2365 SET_WIDGET_COND(toolbar->fwd_btn,
2366 M_HAVE_ACCOUNT|M_TARGET_EXIST|M_SUMMARY_ISLIST);
2369 if (prefs_common.next_unread_msg_dialog == NEXTUNREADMSGDIALOG_ASSUME_NO) {
2370 SET_WIDGET_COND(toolbar->next_btn, M_MSG_EXIST|M_SUMMARY_ISLIST);
2372 SET_WIDGET_COND(toolbar->next_btn, 0);
2375 if (toolbar->trash_btn)
2376 SET_WIDGET_COND(toolbar->trash_btn,
2377 M_TARGET_EXIST|M_ALLOW_DELETE|M_NOT_NEWS);
2379 if (toolbar->delete_btn)
2380 SET_WIDGET_COND(toolbar->delete_btn,
2381 M_TARGET_EXIST|M_ALLOW_DELETE);
2383 if (toolbar->exec_btn)
2384 SET_WIDGET_COND(toolbar->exec_btn,
2387 if (toolbar->learn_spam_btn)
2388 SET_WIDGET_COND(toolbar->learn_spam_btn,
2389 M_TARGET_EXIST|M_CAN_LEARN_SPAM|M_SUMMARY_ISLIST);
2391 if (toolbar->cancel_inc_btn)
2392 SET_WIDGET_COND(toolbar->cancel_inc_btn,
2395 for (cur = toolbar->action_list; cur != NULL; cur = cur->next) {
2396 ToolbarClawsActions *act = (ToolbarClawsActions*)cur->data;
2398 SET_WIDGET_COND(act->widget, M_TARGET_EXIST|M_UNLOCKED);
2401 #undef SET_WIDGET_COND
2403 state = main_window_get_current_state(mainwin);
2405 for (cur = entry_list; cur != NULL; cur = cur->next) {
2406 Entry *e = (Entry*) cur->data;
2408 if (e->widget != NULL) {
2409 sensitive = ((e->cond & state) == e->cond);
2410 GTK_BUTTON_SET_SENSITIVE(e->widget, sensitive);
2414 while (entry_list != NULL) {
2415 Entry *e = (Entry*) entry_list->data;
2418 entry_list = g_slist_remove(entry_list, e);
2421 g_slist_free(entry_list);
2423 activate_compose_button(toolbar,
2424 prefs_common.toolbar_style,
2425 toolbar->compose_btn_type);
2429 void toolbar_comp_set_sensitive(gpointer data, gboolean sensitive)
2431 Compose *compose = (Compose*)data;
2432 GSList *items = compose->toolbar->action_list;
2434 if (compose->toolbar->send_btn)
2435 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->send_btn, sensitive);
2436 if (compose->toolbar->sendl_btn)
2437 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sendl_btn, sensitive);
2438 if (compose->toolbar->draft_btn )
2439 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->draft_btn , sensitive);
2440 if (compose->toolbar->insert_btn )
2441 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->insert_btn , sensitive);
2442 if (compose->toolbar->attach_btn)
2443 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->attach_btn, sensitive);
2444 if (compose->toolbar->sig_btn)
2445 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sig_btn, sensitive);
2446 if (compose->toolbar->exteditor_btn)
2447 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->exteditor_btn, sensitive);
2448 if (compose->toolbar->linewrap_current_btn)
2449 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_current_btn, sensitive);
2450 if (compose->toolbar->linewrap_all_btn)
2451 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_all_btn, sensitive);
2452 if (compose->toolbar->addrbook_btn)
2453 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->addrbook_btn, sensitive);
2455 if (compose->toolbar->spellcheck_btn)
2456 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->spellcheck_btn, sensitive);
2458 for (; items != NULL; items = g_slist_next(items)) {
2459 ToolbarClawsActions *item = (ToolbarClawsActions *)items->data;
2460 GTK_BUTTON_SET_SENSITIVE(item->widget, sensitive);
2465 * Initialize toolbar structure
2467 static void toolbar_init(Toolbar * toolbar)
2470 toolbar->toolbar = NULL;
2471 toolbar->folders_btn = NULL;
2472 toolbar->get_btn = NULL;
2473 toolbar->getall_btn = NULL;
2474 toolbar->send_btn = NULL;
2475 toolbar->compose_mail_btn = NULL;
2476 toolbar->compose_mail_icon = NULL;
2477 toolbar->compose_news_icon = NULL;
2478 toolbar->reply_btn = NULL;
2479 toolbar->replysender_btn = NULL;
2480 toolbar->replyall_btn = NULL;
2481 toolbar->replylist_btn = NULL;
2482 toolbar->fwd_btn = NULL;
2483 toolbar->trash_btn = NULL;
2484 toolbar->delete_btn = NULL;
2485 toolbar->prev_btn = NULL;
2486 toolbar->next_btn = NULL;
2487 toolbar->exec_btn = NULL;
2488 toolbar->open_mail_btn = NULL;
2489 toolbar->close_window_btn = NULL;
2490 /* compose buttons */
2491 toolbar->sendl_btn = NULL;
2492 toolbar->draft_btn = NULL;
2493 toolbar->insert_btn = NULL;
2494 toolbar->attach_btn = NULL;
2495 toolbar->sig_btn = NULL;
2496 toolbar->exteditor_btn = NULL;
2497 toolbar->linewrap_current_btn = NULL;
2498 toolbar->linewrap_all_btn = NULL;
2499 toolbar->addrbook_btn = NULL;
2501 toolbar->spellcheck_btn = NULL;
2504 toolbar_destroy(toolbar);
2509 static void toolbar_reply(gpointer data, guint action)
2511 ToolbarItem *toolbar_item = (ToolbarItem*)data;
2512 MainWindow *mainwin;
2513 MessageView *msgview;
2514 GSList *msginfo_list = NULL;
2516 g_return_if_fail(toolbar_item != NULL);
2518 switch (toolbar_item->type) {
2520 mainwin = (MainWindow*)toolbar_item->parent;
2521 msginfo_list = summary_get_selection(mainwin->summaryview);
2522 msgview = (MessageView*)mainwin->messageview;
2524 case TOOLBAR_MSGVIEW:
2525 msgview = (MessageView*)toolbar_item->parent;
2526 g_return_if_fail(msgview != NULL);
2527 msginfo_list = g_slist_append(msginfo_list, msgview->msginfo);
2533 g_return_if_fail(msgview != NULL);
2534 g_return_if_fail(msginfo_list != NULL);
2535 compose_reply_from_messageview(msgview, msginfo_list, action);
2536 g_slist_free(msginfo_list);
2538 /* TODO: update reply state ion summaryview */
2542 /* exported functions */
2544 void inc_mail_cb(gpointer data, guint action, GtkWidget *widget)
2546 MainWindow *mainwin = (MainWindow*)data;
2548 inc_mail(mainwin, prefs_common.newmail_notify_manu);
2551 void inc_all_account_mail_cb(gpointer data, guint action, GtkWidget *widget)
2553 MainWindow *mainwin = (MainWindow*)data;
2555 inc_all_account_mail(mainwin, FALSE, prefs_common.newmail_notify_manu);
2558 void send_queue_cb(gpointer data, guint action, GtkWidget *widget)
2562 gboolean got_error = FALSE;
2563 gchar *errstr = NULL;
2565 if (prefs_common.work_offline)
2566 if (alertpanel(_("Offline warning"),
2567 _("You're working offline. Override?"),
2568 GTK_STOCK_NO, GTK_STOCK_YES,
2569 NULL) != G_ALERTALTERNATE)
2572 /* ask for confirmation before sending queued messages only
2573 in online mode and if there is at least one message queued
2574 in any of the folder queue
2576 if (prefs_common.confirm_send_queued_messages) {
2578 /* check if there's a queued message */
2579 for (list = folder_get_list(); !found && list != NULL; list = list->next) {
2580 Folder *folder = list->data;
2582 found = !procmsg_queue_is_empty(folder->queue);
2584 /* if necessary, ask for confirmation before sending */
2585 if (found && !prefs_common.work_offline) {
2586 if (alertpanel(_("Send queued messages"),
2587 _("Send all queued messages?"),
2588 GTK_STOCK_CANCEL, _("_Send"),
2589 NULL) != G_ALERTALTERNATE)
2594 for (list = folder_get_list(); list != NULL; list = list->next) {
2595 Folder *folder = list->data;
2597 if (folder->queue) {
2598 if (procmsg_send_queue(folder->queue,
2599 prefs_common.savemsg,
2606 alertpanel_error_log(_("Some errors occurred while "
2607 "sending queued messages."));
2609 alertpanel_error_log(_("Some errors occurred "
2610 "while sending queued messages:\n%s"), errstr);
2616 void compose_mail_cb(gpointer data, guint action, GtkWidget *widget)
2618 MainWindow *mainwin = (MainWindow*)data;
2619 PrefsAccount *ac = NULL;
2620 FolderItem *item = mainwin->summaryview->folder_item;
2625 ac = account_find_from_item(item);
2626 if (ac && ac->protocol != A_NNTP) {
2627 compose_new_with_folderitem(ac, item, NULL); /* CLAWS */
2633 * CLAWS - use current account
2635 if (cur_account && (cur_account->protocol != A_NNTP)) {
2636 compose_new_with_folderitem(cur_account, item, NULL);
2641 * CLAWS - just get the first one
2643 list = account_get_list();
2644 for (cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2645 ac = (PrefsAccount *) cur->data;
2646 if (ac->protocol != A_NNTP) {
2647 compose_new_with_folderitem(ac, item, NULL);
2653 void compose_news_cb(gpointer data, guint action, GtkWidget *widget)
2655 MainWindow *mainwin = (MainWindow*)data;
2656 PrefsAccount * ac = NULL;
2660 if (mainwin->summaryview->folder_item) {
2661 ac = mainwin->summaryview->folder_item->folder->account;
2662 if (ac && ac->protocol == A_NNTP) {
2663 compose_new_with_folderitem(ac,
2664 mainwin->summaryview->folder_item, NULL);
2669 list = account_get_list();
2670 for(cur = list ; cur != NULL ; cur = g_list_next(cur)) {
2671 ac = (PrefsAccount *) cur->data;
2672 if (ac->protocol == A_NNTP) {
2673 compose_new_with_folderitem(ac,
2674 mainwin->summaryview->folder_item, NULL);