2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2001-2009 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 cm_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 cm_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
[] = {
500 for (i
= 0; i
< sizeof(default_toolbar
) / sizeof(default_toolbar
[0]); i
++) {
502 ToolbarItem
*toolbar_item
= g_new0(ToolbarItem
, 1);
504 if (default_toolbar
[i
].action
!= A_SEPARATOR
) {
507 if (toolbar_get_icon(default_toolbar
[i
].action
) > -1) {
508 file
= stock_pixmap_get_name((StockPixmap
)toolbar_get_icon(default_toolbar
[i
].action
));
511 toolbar_item
->file
= g_strdup(file
);
512 toolbar_item
->index
= default_toolbar
[i
].action
;
513 toolbar_item
->text
= g_strdup(toolbar_get_short_text(default_toolbar
[i
].action
));
516 toolbar_item
->file
= g_strdup(TOOLBAR_TAG_SEPARATOR
);
517 toolbar_item
->index
= A_SEPARATOR
;
520 if (toolbar_item
->index
!= -1) {
521 if ( !toolbar_is_duplicate(toolbar_item
->index
, TOOLBAR_MAIN
))
522 toolbar_config
[TOOLBAR_MAIN
].item_list
=
523 g_slist_append(toolbar_config
[TOOLBAR_MAIN
].item_list
, toolbar_item
);
528 static void toolbar_set_default_compose(void)
532 } default_toolbar
[] = {
551 for (i
= 0; i
< sizeof(default_toolbar
) / sizeof(default_toolbar
[0]); i
++) {
553 ToolbarItem
*toolbar_item
= g_new0(ToolbarItem
, 1);
555 if (default_toolbar
[i
].action
!= A_SEPARATOR
) {
558 if (toolbar_get_icon(default_toolbar
[i
].action
) > -1) {
559 file
= stock_pixmap_get_name((StockPixmap
)toolbar_get_icon(default_toolbar
[i
].action
));
561 toolbar_item
->file
= g_strdup(file
);
562 toolbar_item
->index
= default_toolbar
[i
].action
;
563 toolbar_item
->text
= g_strdup(toolbar_get_short_text(default_toolbar
[i
].action
));
566 toolbar_item
->file
= g_strdup(TOOLBAR_TAG_SEPARATOR
);
567 toolbar_item
->index
= A_SEPARATOR
;
570 if (toolbar_item
->index
!= -1) {
571 if ( !toolbar_is_duplicate(toolbar_item
->index
, TOOLBAR_COMPOSE
))
572 toolbar_config
[TOOLBAR_COMPOSE
].item_list
=
573 g_slist_append(toolbar_config
[TOOLBAR_COMPOSE
].item_list
, toolbar_item
);
578 static void toolbar_set_default_msgview(void)
582 } default_toolbar
[] = {
601 for (i
= 0; i
< sizeof(default_toolbar
) / sizeof(default_toolbar
[0]); i
++) {
603 ToolbarItem
*toolbar_item
= g_new0(ToolbarItem
, 1);
605 if (default_toolbar
[i
].action
!= A_SEPARATOR
) {
607 if (toolbar_get_icon(default_toolbar
[i
].action
) > -1) {
608 file
= stock_pixmap_get_name((StockPixmap
)toolbar_get_icon(default_toolbar
[i
].action
));
611 toolbar_item
->file
= g_strdup(file
);
612 toolbar_item
->index
= default_toolbar
[i
].action
;
613 toolbar_item
->text
= g_strdup(toolbar_get_short_text(default_toolbar
[i
].action
));
616 toolbar_item
->file
= g_strdup(TOOLBAR_TAG_SEPARATOR
);
617 toolbar_item
->index
= A_SEPARATOR
;
620 if (toolbar_item
->index
!= -1) {
621 if ( !toolbar_is_duplicate(toolbar_item
->index
, TOOLBAR_MSGVIEW
))
622 toolbar_config
[TOOLBAR_MSGVIEW
].item_list
=
623 g_slist_append(toolbar_config
[TOOLBAR_MSGVIEW
].item_list
, toolbar_item
);
628 void toolbar_set_default(ToolbarType source
)
630 if (source
== TOOLBAR_MAIN
)
631 toolbar_set_default_main();
632 else if (source
== TOOLBAR_COMPOSE
)
633 toolbar_set_default_compose();
634 else if (source
== TOOLBAR_MSGVIEW
)
635 toolbar_set_default_msgview();
638 void toolbar_save_config_file(ToolbarType source
)
643 gchar
*fileSpec
= NULL
;
645 debug_print("save Toolbar Configuration to %s\n", toolbar_config
[source
].conf_file
);
647 fileSpec
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
, toolbar_config
[source
].conf_file
, NULL
);
648 pfile
= prefs_write_open(fileSpec
);
651 if (fprintf(fp
, "<?xml version=\"1.0\" encoding=\"%s\" ?>\n", CS_INTERNAL
) < 0)
654 if (fprintf(fp
, "<%s>\n", TOOLBAR_TAG_INDEX
) < 0)
657 for (cur
= toolbar_config
[source
].item_list
; cur
!= NULL
; cur
= cur
->next
) {
658 ToolbarItem
*toolbar_item
= (ToolbarItem
*) cur
->data
;
660 if (toolbar_item
->index
!= A_SEPARATOR
) {
661 if (fprintf(fp
, "\t<%s %s=\"%s\" %s=\"",
663 TOOLBAR_ICON_FILE
, toolbar_item
->file
,
664 TOOLBAR_ICON_TEXT
) < 0)
666 if (xml_file_put_escape_str(fp
, toolbar_item
->text
) < 0)
668 if (fprintf(fp
, "\" %s=\"%s\"/>\n",
670 toolbar_ret_text_from_val(toolbar_item
->index
)) < 0)
673 if (fprintf(fp
, "\t<%s/>\n", TOOLBAR_TAG_SEPARATOR
) < 0)
678 if (fprintf(fp
, "</%s>\n", TOOLBAR_TAG_INDEX
) < 0)
682 if (prefs_file_close (pfile
) < 0 )
683 g_warning("failed to write toolbar configuration to file\n");
687 FILE_OP_ERROR(fileSpec
, "fprintf");
689 prefs_file_close_revert (pfile
);
691 g_warning("failed to open toolbar configuration file for writing\n");
694 void toolbar_read_config_file(ToolbarType source
)
696 XMLFile
*file
= NULL
;
697 gchar
*fileSpec
= NULL
;
702 debug_print("read Toolbar Configuration from %s\n", toolbar_config
[source
].conf_file
);
704 fileSpec
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
, toolbar_config
[source
].conf_file
, NULL
);
705 file
= xml_open_file(fileSpec
);
708 toolbar_clear_list(source
);
712 || (xml_get_dtd(file
))
713 || (xml_parse_next_tag(file
))
714 || (!xml_compare_tag(file
, TOOLBAR_TAG_INDEX
))) {
715 xml_close_file(file
);
719 attr
= xml_get_current_tag_attr(file
);
726 if (xml_parse_next_tag(file
))
729 /* Get next tag (icon, icon_text or icon_action) */
730 if (xml_compare_tag(file
, TOOLBAR_TAG_ITEM
)) {
731 toolbar_parse_item(file
, source
);
732 } else if (xml_compare_tag(file
, TOOLBAR_TAG_SEPARATOR
)) {
733 ToolbarItem
*item
= g_new0(ToolbarItem
, 1);
735 item
->file
= g_strdup(TOOLBAR_TAG_SEPARATOR
);
736 item
->index
= A_SEPARATOR
;
737 toolbar_config
[source
].item_list
=
738 g_slist_append(toolbar_config
[source
].item_list
, item
);
742 xml_close_file(file
);
745 if ((!file
) || (g_slist_length(toolbar_config
[source
].item_list
) == 0)) {
747 if (source
== TOOLBAR_MAIN
)
748 toolbar_set_default(TOOLBAR_MAIN
);
749 else if (source
== TOOLBAR_COMPOSE
)
750 toolbar_set_default(TOOLBAR_COMPOSE
);
751 else if (source
== TOOLBAR_MSGVIEW
)
752 toolbar_set_default(TOOLBAR_MSGVIEW
);
754 g_warning("failed to write Toolbar Configuration to %s\n", toolbar_config
[source
].conf_file
);
758 toolbar_save_config_file(source
);
763 * clears list of toolbar items read from configuration files
765 void toolbar_clear_list(ToolbarType source
)
767 while (toolbar_config
[source
].item_list
!= NULL
) {
768 ToolbarItem
*item
= (ToolbarItem
*) toolbar_config
[source
].item_list
->data
;
770 toolbar_config
[source
].item_list
=
771 g_slist_remove(toolbar_config
[source
].item_list
, item
);
777 g_slist_free(toolbar_config
[source
].item_list
);
782 * return list of Toolbar items
784 GSList
*toolbar_get_list(ToolbarType source
)
788 if ((source
== TOOLBAR_MAIN
) || (source
== TOOLBAR_COMPOSE
) || (source
== TOOLBAR_MSGVIEW
))
789 list
= toolbar_config
[source
].item_list
;
794 void toolbar_set_list_item(ToolbarItem
*t_item
, ToolbarType source
)
796 ToolbarItem
*toolbar_item
= g_new0(ToolbarItem
, 1);
798 toolbar_item
->file
= g_strdup(t_item
->file
);
799 toolbar_item
->text
= g_strdup(t_item
->text
);
800 toolbar_item
->index
= t_item
->index
;
802 toolbar_config
[source
].item_list
=
803 g_slist_append(toolbar_config
[source
].item_list
,
807 static void toolbar_action_execute(GtkWidget
*widget
,
813 gchar
*action
, *action_p
;
814 gboolean found
= FALSE
;
817 for (cur
= action_list
; cur
!= NULL
; cur
= cur
->next
) {
818 ToolbarClawsActions
*act
= (ToolbarClawsActions
*)cur
->data
;
820 if (widget
== act
->widget
) {
822 for (lop
= prefs_common
.actions_list
; lop
!= NULL
; lop
= lop
->next
) {
823 action
= g_strdup((gchar
*)lop
->data
);
825 action_p
= strstr(action
, ": ");
827 if (g_utf8_collate(act
->name
, action
) == 0) {
841 actions_execute(data
, i
, widget
, source
);
843 g_warning ("Error: did not find Claws Action to execute");
846 #if !(GTK_CHECK_VERSION(2,12,0))
847 #define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
848 gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(widget), GTK_TOOLTIPS(toolbar_tips), \
852 #define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
853 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), tip); \
857 #if !(GTK_CHECK_VERSION(2,12,0))
858 #define CLAWS_SET_ARROW_TIP(widget,tip) { \
859 gtk_menu_tool_button_set_arrow_tooltip(GTK_MENU_TOOL_BUTTON(widget), GTK_TOOLTIPS(toolbar_tips), \
863 #define CLAWS_SET_ARROW_TIP(widget,tip) { \
864 gtk_menu_tool_button_set_arrow_tooltip_text(GTK_MENU_TOOL_BUTTON(widget), tip); \
868 static void activate_compose_button (Toolbar
*toolbar
,
870 ComposeButtonType type
)
872 #if !(GTK_CHECK_VERSION(2,12,0))
873 GtkTooltips
*toolbar_tips
= toolbar
->tooltips
;
875 if ((!toolbar
->compose_mail_btn
))
878 if (type
== COMPOSEBUTTON_NEWS
) {
879 gtk_tool_button_set_icon_widget(
880 GTK_TOOL_BUTTON(toolbar
->compose_mail_btn
),
881 toolbar
->compose_news_icon
);
883 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar
->compose_mail_btn
), _("Compose News message"));
885 gtk_widget_show(toolbar
->compose_news_icon
);
887 gtk_tool_button_set_icon_widget(
888 GTK_TOOL_BUTTON(toolbar
->compose_mail_btn
),
889 toolbar
->compose_mail_icon
);
891 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar
->compose_mail_btn
), _("Compose Email"));
893 gtk_widget_show(toolbar
->compose_mail_icon
);
895 toolbar
->compose_btn_type
= type
;
898 void toolbar_set_compose_button(Toolbar
*toolbar
,
899 ComposeButtonType compose_btn_type
)
901 if (toolbar
->compose_btn_type
!= compose_btn_type
)
902 activate_compose_button(toolbar
,
903 prefs_common
.toolbar_style
,
907 static void activate_learn_button (Toolbar
*toolbar
,
909 LearnButtonType type
)
911 #if !(GTK_CHECK_VERSION(2,12,0))
912 GtkTooltips
*toolbar_tips
= toolbar
->tooltips
;
914 if ((!toolbar
->learn_spam_btn
))
917 if (type
== LEARN_SPAM
) {
918 gtk_tool_button_set_icon_widget(
919 GTK_TOOL_BUTTON(toolbar
->learn_spam_btn
),
920 toolbar
->learn_spam_icon
);
921 gtk_tool_button_set_label(
922 GTK_TOOL_BUTTON(toolbar
->learn_spam_btn
),
925 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar
->learn_spam_btn
), _("Learn spam"));
927 gtk_widget_show(toolbar
->learn_spam_icon
);
929 gtk_tool_button_set_icon_widget(
930 GTK_TOOL_BUTTON(toolbar
->learn_spam_btn
),
931 toolbar
->learn_ham_icon
);
932 gtk_tool_button_set_label(
933 GTK_TOOL_BUTTON(toolbar
->learn_spam_btn
),
936 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar
->learn_spam_btn
), _("Learn ham"));
938 gtk_widget_show(toolbar
->learn_ham_icon
);
940 toolbar
->learn_btn_type
= type
;
943 void toolbar_set_learn_button(Toolbar
*toolbar
,
944 LearnButtonType learn_btn_type
)
946 if (toolbar
->learn_btn_type
!= learn_btn_type
)
947 activate_learn_button(toolbar
,
948 prefs_common
.toolbar_style
,
952 void toolbar_toggle(guint action
, gpointer data
)
954 MainWindow
*mainwin
= (MainWindow
*)data
;
958 cm_return_if_fail(mainwin
!= NULL
);
960 toolbar_style(TOOLBAR_MAIN
, action
, mainwin
);
962 list
= compose_get_compose_list();
963 for (cur
= list
; cur
!= NULL
; cur
= cur
->next
) {
964 toolbar_style(TOOLBAR_COMPOSE
, action
, cur
->data
);
966 list
= messageview_get_msgview_list();
967 for (cur
= list
; cur
!= NULL
; cur
= cur
->next
) {
968 toolbar_style(TOOLBAR_MSGVIEW
, action
, cur
->data
);
973 void toolbar_set_style(GtkWidget
*toolbar_wid
, GtkWidget
*handlebox_wid
, guint action
)
975 switch ((ToolbarStyle
)action
) {
977 gtk_widget_hide(handlebox_wid
);
980 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid
),
984 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid
),
988 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid
),
991 case TOOLBAR_BOTH_HORIZ
:
992 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid
),
993 GTK_TOOLBAR_BOTH_HORIZ
);
999 prefs_common
.toolbar_style
= (ToolbarStyle
)action
;
1000 gtk_widget_set_size_request(handlebox_wid
, 1, -1);
1002 if (prefs_common
.toolbar_style
!= TOOLBAR_NONE
) {
1003 gtk_widget_show(handlebox_wid
);
1004 gtk_widget_queue_resize(handlebox_wid
);
1008 * Change the style of toolbar
1010 static void toolbar_style(ToolbarType type
, guint action
, gpointer data
)
1012 GtkWidget
*handlebox_wid
;
1013 GtkWidget
*toolbar_wid
;
1014 MainWindow
*mainwin
= (MainWindow
*)data
;
1015 Compose
*compose
= (Compose
*)data
;
1016 MessageView
*msgview
= (MessageView
*)data
;
1018 cm_return_if_fail(data
!= NULL
);
1022 handlebox_wid
= mainwin
->handlebox
;
1023 toolbar_wid
= mainwin
->toolbar
->toolbar
;
1025 case TOOLBAR_COMPOSE
:
1026 handlebox_wid
= compose
->handlebox
;
1027 toolbar_wid
= compose
->toolbar
->toolbar
;
1029 case TOOLBAR_MSGVIEW
:
1030 handlebox_wid
= msgview
->handlebox
;
1031 toolbar_wid
= msgview
->toolbar
->toolbar
;
1037 toolbar_set_style(toolbar_wid
, handlebox_wid
, action
);
1040 /* Toolbar handling */
1041 static void toolbar_inc_cb(GtkWidget
*widget
,
1044 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1045 MainWindow
*mainwin
;
1047 cm_return_if_fail(toolbar_item
!= NULL
);
1049 switch (toolbar_item
->type
) {
1051 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1052 inc_mail_cb(mainwin
, 0, NULL
);
1059 static void toolbar_inc_all_cb(GtkWidget
*widget
,
1062 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1063 MainWindow
*mainwin
;
1065 cm_return_if_fail(toolbar_item
!= NULL
);
1067 switch (toolbar_item
->type
) {
1069 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1070 inc_all_account_mail_cb(mainwin
, 0, NULL
);
1077 static void toolbar_send_queued_cb(GtkWidget
*widget
,gpointer data
)
1079 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1080 MainWindow
*mainwin
;
1082 cm_return_if_fail(toolbar_item
!= NULL
);
1084 switch (toolbar_item
->type
) {
1086 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1087 send_queue_cb(mainwin
, 0, NULL
);
1094 static void toolbar_exec_cb(GtkWidget
*widget
,
1097 MainWindow
*mainwin
= get_mainwin(data
);
1099 cm_return_if_fail(mainwin
!= NULL
);
1100 summary_execute(mainwin
->summaryview
);
1104 * Delete current/selected(s) message(s)
1106 static void toolbar_trash_cb(GtkWidget
*widget
, gpointer data
)
1108 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1109 MainWindow
*mainwin
;
1111 cm_return_if_fail(toolbar_item
!= NULL
);
1112 cm_return_if_fail(toolbar_item
->parent
);
1114 switch (toolbar_item
->type
) {
1115 case TOOLBAR_MSGVIEW
:
1116 messageview_delete((MessageView
*)toolbar_item
->parent
);
1119 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1120 summary_delete_trash(mainwin
->summaryview
);
1123 debug_print("toolbar event not supported\n");
1129 * Delete current/selected(s) message(s)
1131 static void toolbar_delete_cb(GtkWidget
*widget
, gpointer data
)
1133 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1134 MainWindow
*mainwin
;
1136 cm_return_if_fail(toolbar_item
!= NULL
);
1137 cm_return_if_fail(toolbar_item
->parent
);
1139 switch (toolbar_item
->type
) {
1140 case TOOLBAR_MSGVIEW
:
1141 messageview_delete((MessageView
*)toolbar_item
->parent
);
1144 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1145 summary_delete(mainwin
->summaryview
);
1148 debug_print("toolbar event not supported\n");
1155 * Compose new message
1157 static void toolbar_compose_cb(GtkWidget
*widget
, gpointer data
)
1159 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1160 MainWindow
*mainwin
;
1161 MessageView
*msgview
;
1163 cm_return_if_fail(toolbar_item
!= NULL
);
1165 switch (toolbar_item
->type
) {
1167 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1168 if (mainwin
->toolbar
->compose_btn_type
== COMPOSEBUTTON_NEWS
)
1169 compose_news_cb(mainwin
, 0, NULL
);
1171 compose_mail_cb(mainwin
, 0, NULL
);
1173 case TOOLBAR_MSGVIEW
:
1174 msgview
= (MessageView
*)toolbar_item
->parent
;
1175 compose_new_with_folderitem(NULL
,
1176 msgview
->msginfo
->folder
, NULL
);
1179 debug_print("toolbar event not supported\n");
1183 static void toolbar_learn(gpointer data
, guint as_spam
)
1185 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1186 MainWindow
*mainwin
;
1187 MessageView
*msgview
;
1189 cm_return_if_fail(toolbar_item
!= NULL
);
1191 switch (toolbar_item
->type
) {
1193 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1195 mainwindow_learn(mainwin
, TRUE
);
1197 mainwindow_learn(mainwin
, FALSE
);
1199 case TOOLBAR_MSGVIEW
:
1200 msgview
= (MessageView
*)toolbar_item
->parent
;
1202 messageview_learn(msgview
, TRUE
);
1204 messageview_learn(msgview
, FALSE
);
1207 debug_print("toolbar event not supported\n");
1211 static void toolbar_learn_cb(GtkWidget
*widget
, gpointer data
)
1213 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1214 MainWindow
*mainwin
;
1215 MessageView
*msgview
;
1217 cm_return_if_fail(toolbar_item
!= NULL
);
1219 switch (toolbar_item
->type
) {
1221 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1222 if (mainwin
->toolbar
->learn_btn_type
== LEARN_SPAM
)
1223 mainwindow_learn(mainwin
, TRUE
);
1225 mainwindow_learn(mainwin
, FALSE
);
1227 case TOOLBAR_MSGVIEW
:
1228 msgview
= (MessageView
*)toolbar_item
->parent
;
1229 if (msgview
->toolbar
->learn_btn_type
== LEARN_SPAM
)
1230 messageview_learn(msgview
, TRUE
);
1232 messageview_learn(msgview
, FALSE
);
1235 debug_print("toolbar event not supported\n");
1243 static void toolbar_reply_cb(GtkWidget
*widget
, gpointer data
)
1245 toolbar_reply(data
, (prefs_common
.reply_with_quote
?
1246 COMPOSE_REPLY_WITH_QUOTE
: COMPOSE_REPLY_WITHOUT_QUOTE
));
1251 * Reply message to Sender and All recipients
1253 static void toolbar_reply_to_all_cb(GtkWidget
*widget
, gpointer data
)
1256 (prefs_common
.reply_with_quote
? COMPOSE_REPLY_TO_ALL_WITH_QUOTE
1257 : COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE
));
1262 * Reply to Mailing List
1264 static void toolbar_reply_to_list_cb(GtkWidget
*widget
, gpointer data
)
1267 (prefs_common
.reply_with_quote
? COMPOSE_REPLY_TO_LIST_WITH_QUOTE
1268 : COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE
));
1273 * Reply to sender of message
1275 static void toolbar_reply_to_sender_cb(GtkWidget
*widget
, gpointer data
)
1278 (prefs_common
.reply_with_quote
? COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
1279 : COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE
));
1285 static void toolbar_addrbook_cb(GtkWidget
*widget
, gpointer data
)
1287 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1290 cm_return_if_fail(toolbar_item
!= NULL
);
1292 switch (toolbar_item
->type
) {
1294 case TOOLBAR_MSGVIEW
:
1297 case TOOLBAR_COMPOSE
:
1298 compose
= (Compose
*)toolbar_item
->parent
;
1303 addressbook_open(compose
);
1308 * Forward current/selected(s) message(s)
1310 static void toolbar_forward_cb(GtkWidget
*widget
, gpointer data
)
1312 toolbar_reply(data
, (COMPOSE_FORWARD
));
1316 * Goto Prev Unread Message
1318 static void toolbar_prev_unread_cb(GtkWidget
*widget
, gpointer data
)
1320 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1321 MainWindow
*mainwin
;
1322 MessageView
*msgview
;
1324 cm_return_if_fail(toolbar_item
!= NULL
);
1326 switch (toolbar_item
->type
) {
1328 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1329 summary_select_prev_unread(mainwin
->summaryview
);
1332 case TOOLBAR_MSGVIEW
:
1333 msgview
= (MessageView
*)toolbar_item
->parent
;
1334 msgview
->updating
= TRUE
;
1335 summary_select_prev_unread(msgview
->mainwin
->summaryview
);
1336 msgview
->updating
= FALSE
;
1338 if (msgview
->deferred_destroy
) {
1339 debug_print("messageview got away!\n");
1340 messageview_destroy(msgview
);
1344 /* Now we need to update the messageview window */
1345 if (msgview
->mainwin
->summaryview
->selected
) {
1346 #ifndef GENERIC_UMPC
1347 MsgInfo
* msginfo
= summary_get_selected_msg(msgview
->mainwin
->summaryview
);
1350 messageview_show(msgview
, msginfo
,
1351 msgview
->all_headers
);
1354 gtk_widget_destroy(msgview
->window
);
1358 debug_print("toolbar event not supported\n");
1363 * Goto Next Unread Message
1365 static void toolbar_next_unread_cb(GtkWidget
*widget
, gpointer data
)
1367 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1368 MainWindow
*mainwin
;
1369 MessageView
*msgview
;
1371 cm_return_if_fail(toolbar_item
!= NULL
);
1373 switch (toolbar_item
->type
) {
1375 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1376 summary_select_next_unread(mainwin
->summaryview
);
1379 case TOOLBAR_MSGVIEW
:
1380 msgview
= (MessageView
*)toolbar_item
->parent
;
1381 msgview
->updating
= TRUE
;
1382 summary_select_next_unread(msgview
->mainwin
->summaryview
);
1383 msgview
->updating
= FALSE
;
1385 if (msgview
->deferred_destroy
) {
1386 debug_print("messageview got away!\n");
1387 messageview_destroy(msgview
);
1391 /* Now we need to update the messageview window */
1392 if (msgview
->mainwin
->summaryview
->selected
) {
1393 #ifndef GENERIC_UMPC
1394 MsgInfo
* msginfo
= summary_get_selected_msg(msgview
->mainwin
->summaryview
);
1397 messageview_show(msgview
, msginfo
,
1398 msgview
->all_headers
);
1401 gtk_widget_destroy(msgview
->window
);
1405 debug_print("toolbar event not supported\n");
1409 static void toolbar_ignore_thread_cb(GtkWidget
*widget
, gpointer data
)
1411 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1412 MainWindow
*mainwin
;
1414 cm_return_if_fail(toolbar_item
!= NULL
);
1416 switch (toolbar_item
->type
) {
1418 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1419 summary_toggle_ignore_thread(mainwin
->summaryview
);
1421 case TOOLBAR_MSGVIEW
:
1422 /* TODO: see toolbar_next_unread_cb() if you need
1423 * this in the message view */
1426 debug_print("toolbar event not supported\n");
1431 static void toolbar_watch_thread_cb(GtkWidget
*widget
, gpointer data
)
1433 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1434 MainWindow
*mainwin
;
1436 cm_return_if_fail(toolbar_item
!= NULL
);
1438 switch (toolbar_item
->type
) {
1440 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1441 summary_toggle_watch_thread(mainwin
->summaryview
);
1443 case TOOLBAR_MSGVIEW
:
1444 /* TODO: see toolbar_next_unread_cb() if you need
1445 * this in the message view */
1448 debug_print("toolbar event not supported\n");
1453 static void toolbar_cancel_inc_cb(GtkWidget
*widget
, gpointer data
)
1455 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1457 cm_return_if_fail(toolbar_item
!= NULL
);
1463 static void toolbar_print_cb(GtkWidget
*widget
, gpointer data
)
1465 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1466 MainWindow
*mainwin
;
1468 cm_return_if_fail(toolbar_item
!= NULL
);
1470 switch (toolbar_item
->type
) {
1472 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1473 summary_print(mainwin
->summaryview
);
1475 case TOOLBAR_MSGVIEW
:
1476 /* TODO: see toolbar_next_unread_cb() if you need
1477 * this in the message view */
1480 debug_print("toolbar event not supported\n");
1485 static void toolbar_send_cb(GtkWidget
*widget
, gpointer data
)
1487 compose_toolbar_cb(A_SEND
, data
);
1490 static void toolbar_send_later_cb(GtkWidget
*widget
, gpointer data
)
1492 compose_toolbar_cb(A_SENDL
, data
);
1495 static void toolbar_draft_cb(GtkWidget
*widget
, gpointer data
)
1497 compose_toolbar_cb(A_DRAFT
, data
);
1500 static void toolbar_close_cb(GtkWidget
*widget
, gpointer data
)
1502 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1503 MainWindow
*mainwin
;
1504 MessageView
*messageview
;
1507 cm_return_if_fail(toolbar_item
!= NULL
);
1509 switch (toolbar_item
->type
) {
1511 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1512 app_will_exit(NULL
, mainwin
);
1514 case TOOLBAR_MSGVIEW
:
1515 messageview
= (MessageView
*)toolbar_item
->parent
;
1516 messageview_destroy(messageview
);
1518 case TOOLBAR_COMPOSE
:
1519 compose
= (Compose
*)toolbar_item
->parent
;
1520 compose_close_toolbar(compose
);
1525 static void toolbar_preferences_cb(GtkWidget
*widget
, gpointer data
)
1530 static void toolbar_open_mail_cb(GtkWidget
*widget
, gpointer data
)
1532 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1533 MainWindow
*mainwin
;
1535 cm_return_if_fail(toolbar_item
!= NULL
);
1537 switch (toolbar_item
->type
) {
1539 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1540 summary_open_row(NULL
, mainwin
->summaryview
);
1542 case TOOLBAR_MSGVIEW
:
1543 debug_print("toolbar event not supported\n");
1545 case TOOLBAR_COMPOSE
:
1546 debug_print("toolbar event not supported\n");
1551 static void toolbar_insert_cb(GtkWidget
*widget
, gpointer data
)
1553 compose_toolbar_cb(A_INSERT
, data
);
1556 static void toolbar_attach_cb(GtkWidget
*widget
, gpointer data
)
1558 compose_toolbar_cb(A_ATTACH
, data
);
1561 static void toolbar_sig_cb(GtkWidget
*widget
, gpointer data
)
1563 compose_toolbar_cb(A_SIG
, data
);
1566 static void toolbar_ext_editor_cb(GtkWidget
*widget
, gpointer data
)
1568 compose_toolbar_cb(A_EXTEDITOR
, data
);
1571 static void toolbar_linewrap_current_cb(GtkWidget
*widget
, gpointer data
)
1573 compose_toolbar_cb(A_LINEWRAP_CURRENT
, data
);
1576 static void toolbar_linewrap_all_cb(GtkWidget
*widget
, gpointer data
)
1578 compose_toolbar_cb(A_LINEWRAP_ALL
, data
);
1582 static void toolbar_check_spelling_cb(GtkWidget
*widget
, gpointer data
)
1584 compose_toolbar_cb(A_CHECK_SPELLING
, data
);
1588 * Execute actions from toolbar
1590 static void toolbar_actions_execute_cb(GtkWidget
*widget
, gpointer data
)
1592 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1593 GSList
*action_list
;
1594 MainWindow
*mainwin
;
1596 MessageView
*msgview
;
1597 gpointer parent
= toolbar_item
->parent
;
1599 cm_return_if_fail(toolbar_item
!= NULL
);
1601 switch (toolbar_item
->type
) {
1603 mainwin
= (MainWindow
*)parent
;
1604 action_list
= mainwin
->toolbar
->action_list
;
1606 case TOOLBAR_COMPOSE
:
1607 compose
= (Compose
*)parent
;
1608 action_list
= compose
->toolbar
->action_list
;
1610 case TOOLBAR_MSGVIEW
:
1611 msgview
= (MessageView
*)parent
;
1612 action_list
= msgview
->toolbar
->action_list
;
1615 debug_print("toolbar event not supported\n");
1618 toolbar_action_execute(widget
, action_list
, parent
, toolbar_item
->type
);
1621 static MainWindow
*get_mainwin(gpointer data
)
1623 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1624 MainWindow
*mainwin
= NULL
;
1625 MessageView
*msgview
;
1627 cm_return_val_if_fail(toolbar_item
!= NULL
, NULL
);
1629 switch(toolbar_item
->type
) {
1631 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1633 case TOOLBAR_MSGVIEW
:
1634 msgview
= (MessageView
*)toolbar_item
->parent
;
1635 mainwin
= (MainWindow
*)msgview
->mainwin
;
1644 static void toolbar_go_folders_cb(GtkWidget
*widget
, gpointer data
)
1646 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1647 MainWindow
*mainwin
= NULL
;
1648 switch(toolbar_item
->type
) {
1650 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1653 g_warning("wrong toolbar type\n");
1657 if (!mainwin
->in_folder
) {
1658 FolderItem
*item
= folderview_get_selected_item(mainwin
->folderview
);
1660 folderview_select(mainwin
->folderview
, item
);
1663 gtk_widget_grab_focus(mainwin
->folderview
->ctree
);
1664 mainwindow_exit_folder(mainwin
);
1668 static void toolbar_buttons_cb(GtkWidget
*widget
,
1675 void (*func
)(GtkWidget
*widget
, gpointer data
);
1677 { A_RECEIVE_ALL
, toolbar_inc_all_cb
},
1678 { A_RECEIVE_CUR
, toolbar_inc_cb
},
1679 { A_SEND_QUEUED
, toolbar_send_queued_cb
},
1680 { A_COMPOSE_EMAIL
, toolbar_compose_cb
},
1681 { A_COMPOSE_NEWS
, toolbar_compose_cb
},
1682 { A_REPLY_MESSAGE
, toolbar_reply_cb
},
1683 { A_REPLY_SENDER
, toolbar_reply_to_sender_cb
},
1684 { A_REPLY_ALL
, toolbar_reply_to_all_cb
},
1685 { A_REPLY_ML
, toolbar_reply_to_list_cb
},
1686 { A_FORWARD
, toolbar_forward_cb
},
1687 { A_TRASH
, toolbar_trash_cb
},
1688 { A_DELETE_REAL
, toolbar_delete_cb
},
1689 { A_EXECUTE
, toolbar_exec_cb
},
1690 { A_GOTO_PREV
, toolbar_prev_unread_cb
},
1691 { A_GOTO_NEXT
, toolbar_next_unread_cb
},
1692 { A_IGNORE_THREAD
, toolbar_ignore_thread_cb
},
1693 { A_WATCH_THREAD
, toolbar_watch_thread_cb
},
1694 { A_PRINT
, toolbar_print_cb
},
1695 { A_LEARN_SPAM
, toolbar_learn_cb
},
1696 { A_GO_FOLDERS
, toolbar_go_folders_cb
},
1698 { A_SEND
, toolbar_send_cb
},
1699 { A_SENDL
, toolbar_send_later_cb
},
1700 { A_DRAFT
, toolbar_draft_cb
},
1701 { A_OPEN_MAIL
, toolbar_open_mail_cb
},
1702 { A_CLOSE
, toolbar_close_cb
},
1703 { A_PREFERENCES
, toolbar_preferences_cb
},
1704 { A_INSERT
, toolbar_insert_cb
},
1705 { A_ATTACH
, toolbar_attach_cb
},
1706 { A_SIG
, toolbar_sig_cb
},
1707 { A_EXTEDITOR
, toolbar_ext_editor_cb
},
1708 { A_LINEWRAP_CURRENT
, toolbar_linewrap_current_cb
},
1709 { A_LINEWRAP_ALL
, toolbar_linewrap_all_cb
},
1710 { A_ADDRBOOK
, toolbar_addrbook_cb
},
1712 { A_CHECK_SPELLING
, toolbar_check_spelling_cb
},
1714 { A_CLAWS_ACTIONS
, toolbar_actions_execute_cb
},
1715 { A_CANCEL_INC
, toolbar_cancel_inc_cb
}
1718 num_items
= sizeof(callbacks
)/sizeof(callbacks
[0]);
1720 for (i
= 0; i
< num_items
; i
++) {
1721 if (callbacks
[i
].index
== item
->index
) {
1722 callbacks
[i
].func(widget
, item
);
1727 #ifndef GENERIC_UMPC
1728 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
1729 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
1730 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1731 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1732 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1733 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1734 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
1738 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
1739 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
1740 GList *gchild = NULL; \
1741 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
1742 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1743 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1744 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1745 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1746 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
1748 CLAWS_SET_ARROW_TIP(GTK_MENU_TOOL_BUTTON(item), menutip); \
1749 child = gtk_bin_get_child(GTK_BIN(item)); \
1750 gchild = gtk_container_get_children( \
1751 GTK_CONTAINER(child)); \
1752 btn = (GtkWidget *)gchild->data; \
1753 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
1754 g_list_free(gchild); \
1755 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
1756 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
1757 g_list_free(gchild); \
1760 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
1761 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
1762 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1763 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1764 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1765 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1768 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
1769 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
1770 GList *gchild = NULL; \
1771 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
1772 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
1773 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
1774 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
1775 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
1776 child = gtk_bin_get_child(GTK_BIN(item)); \
1777 gchild = gtk_container_get_children( \
1778 GTK_CONTAINER(child)); \
1779 btn = (GtkWidget *)gchild->data; \
1780 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
1781 g_list_free(gchild); \
1782 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
1783 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
1784 g_list_free(gchild); \
1788 #define ADD_MENU_ITEM(name,cb,data) { \
1789 item = gtk_menu_item_new_with_mnemonic(name); \
1790 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); \
1791 g_signal_connect(G_OBJECT(item), "activate", \
1794 g_object_set_data(G_OBJECT(item), "int-value", GINT_TO_POINTER(data)); \
1795 gtk_widget_show(item); \
1798 static void toolbar_reply_menu_cb(GtkWidget
*widget
, gpointer data
)
1800 gpointer int_value
= g_object_get_data(G_OBJECT(widget
), "int-value");
1801 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1803 toolbar_reply(toolbar_item
, GPOINTER_TO_INT(int_value
));
1806 static void toolbar_learn_menu_cb(GtkWidget
*widget
, gpointer data
)
1808 gpointer int_value
= g_object_get_data(G_OBJECT(widget
), "int-value");
1809 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1811 toolbar_learn(toolbar_item
, GPOINTER_TO_INT(int_value
));
1815 * Create a new toolbar with specified type
1816 * if a callback list is passed it will be used before the
1817 * common callback list
1819 Toolbar
*toolbar_create(ToolbarType type
,
1820 GtkWidget
*container
,
1823 ToolbarItem
*toolbar_item
;
1826 GtkWidget
*icon_wid
= NULL
;
1827 GtkWidget
*icon_news
;
1828 GtkWidget
*icon_ham
;
1830 ToolbarClawsActions
*action_item
;
1832 GSList
*toolbar_list
;
1833 Toolbar
*toolbar_data
;
1835 #ifndef GENERIC_UMPC
1836 #if !(GTK_CHECK_VERSION(2,12,0))
1837 GtkTooltips
*toolbar_tips
= gtk_tooltips_new();
1840 toolbar_read_config_file(type
);
1841 toolbar_list
= toolbar_get_list(type
);
1843 toolbar_data
= g_new0(Toolbar
, 1);
1845 toolbar
= gtk_toolbar_new();
1847 #if (GTK_CHECK_VERSION(2,16,0))
1848 gtk_orientable_set_orientation(GTK_ORIENTABLE(toolbar
), GTK_ORIENTATION_HORIZONTAL
);
1850 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar
), GTK_ORIENTATION_HORIZONTAL
);
1852 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar
), GTK_TOOLBAR_BOTH
);
1853 gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar
), TRUE
);
1855 for (cur
= toolbar_list
; cur
!= NULL
; cur
= cur
->next
) {
1857 if (g_ascii_strcasecmp(((ToolbarItem
*)cur
->data
)->file
, TOOLBAR_TAG_SEPARATOR
) == 0) {
1858 gtk_toolbar_insert(GTK_TOOLBAR(toolbar
), gtk_separator_tool_item_new(), -1);
1862 toolbar_item
= g_new0(ToolbarItem
, 1);
1863 toolbar_item
->index
= ((ToolbarItem
*)cur
->data
)->index
;
1864 toolbar_item
->file
= g_strdup(((ToolbarItem
*)cur
->data
)->file
);
1865 toolbar_item
->text
= g_strdup(((ToolbarItem
*)cur
->data
)->text
);
1866 toolbar_item
->parent
= data
;
1867 toolbar_item
->type
= type
;
1869 /* collect toolbar items in list to keep track */
1870 toolbar_data
->item_list
=
1871 g_slist_append(toolbar_data
->item_list
,
1873 icon_wid
= stock_pixmap_widget(container
, stock_pixmap_get_icon(toolbar_item
->file
));
1875 switch (toolbar_item
->index
) {
1878 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Go to folder list"));
1879 toolbar_data
->folders_btn
= item
;
1882 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
1883 _("Receive Mail on all Accounts"),
1884 _("Receive Mail on selected Account"));
1885 toolbar_data
->getall_btn
= item
;
1888 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
, _("Receive Mail on current Account"));
1889 toolbar_data
->get_btn
= item
;
1892 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Send Queued Messages"));
1893 toolbar_data
->send_btn
= item
;
1896 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Close window"));
1897 toolbar_data
->close_window_btn
= item
;
1900 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Open preferences"));
1901 toolbar_data
->preferences_btn
= item
;
1904 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Open email"));
1905 toolbar_data
->open_mail_btn
= item
;
1907 case A_COMPOSE_EMAIL
:
1908 #ifndef GENERIC_UMPC
1909 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
1911 _("Compose with selected Account"));
1912 toolbar_data
->compose_mail_btn
= item
;
1913 toolbar_data
->compose_mail_icon
= icon_wid
;
1914 g_object_ref(toolbar_data
->compose_mail_icon
);
1916 icon_news
= stock_pixmap_widget(container
, STOCK_PIXMAP_NEWS_COMPOSE
);
1917 toolbar_data
->compose_news_icon
= icon_news
;
1918 g_object_ref(toolbar_data
->compose_news_icon
);
1920 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
1921 _("Compose Email"));
1922 toolbar_data
->compose_mail_btn
= item
;
1923 toolbar_data
->compose_mail_icon
= icon_wid
;
1925 icon_news
= stock_pixmap_widget(container
, STOCK_PIXMAP_NEWS_COMPOSE
);
1926 toolbar_data
->compose_news_icon
= icon_news
;
1930 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
1933 toolbar_data
->learn_spam_btn
= item
;
1934 toolbar_data
->learn_spam_icon
= icon_wid
;
1935 g_object_ref(toolbar_data
->learn_spam_icon
);
1937 icon_ham
= stock_pixmap_widget(container
, STOCK_PIXMAP_HAM_BTN
);
1938 toolbar_data
->learn_ham_icon
= icon_ham
;
1939 g_object_ref(toolbar_data
->learn_ham_icon
);
1941 menu
= gtk_menu_new();
1942 ADD_MENU_ITEM(_("Learn as _Spam"), toolbar_learn_menu_cb
, TRUE
);
1943 ADD_MENU_ITEM(_("Learn as _Ham"), toolbar_learn_menu_cb
, FALSE
);
1944 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->learn_spam_btn
), menu
);
1946 case A_REPLY_MESSAGE
:
1947 #ifndef GENERIC_UMPC
1948 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
1949 _("Reply to Message"),
1950 _("Reply to Message options"));
1951 toolbar_data
->reply_btn
= item
;
1953 menu
= gtk_menu_new();
1954 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_WITH_QUOTE
);
1955 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_WITHOUT_QUOTE
);
1956 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->reply_btn
), menu
);
1958 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
1959 _("Reply to Message"));
1960 toolbar_data
->reply_btn
= item
;
1963 case A_REPLY_SENDER
:
1964 #ifndef GENERIC_UMPC
1965 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
1966 _("Reply to Sender"),
1967 _("Reply to Sender options"));
1968 toolbar_data
->replysender_btn
= item
;
1970 menu
= gtk_menu_new();
1971 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
);
1972 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE
);
1973 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->replysender_btn
), menu
);
1975 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
1976 _("Reply to Sender"));
1977 toolbar_data
->replysender_btn
= item
;
1981 #ifndef GENERIC_UMPC
1982 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
1984 _("Reply to All options"));
1985 toolbar_data
->replyall_btn
= item
;
1987 menu
= gtk_menu_new();
1988 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_ALL_WITH_QUOTE
);
1989 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE
);
1990 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->replyall_btn
), menu
);
1992 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
1994 toolbar_data
->replyall_btn
= item
;
1998 #ifndef GENERIC_UMPC
1999 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2000 _("Reply to Mailing-list"),
2001 _("Reply to Mailing-list options"));
2002 toolbar_data
->replylist_btn
= item
;
2004 menu
= gtk_menu_new();
2005 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_LIST_WITH_QUOTE
);
2006 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE
);
2007 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->replylist_btn
), menu
);
2009 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2010 _("Reply to Mailing-list"));
2011 toolbar_data
->replylist_btn
= item
;
2015 #ifndef GENERIC_UMPC
2016 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2017 _("Forward Message"),
2018 _("Forward Message options"));
2019 toolbar_data
->fwd_btn
= item
;
2021 menu
= gtk_menu_new();
2022 ADD_MENU_ITEM(_("_Forward"), toolbar_reply_menu_cb
, COMPOSE_FORWARD_INLINE
);
2023 ADD_MENU_ITEM(_("For_ward as attachment"), toolbar_reply_menu_cb
, COMPOSE_FORWARD_AS_ATTACH
);
2024 ADD_MENU_ITEM(_("Redirec_t"), toolbar_reply_menu_cb
, COMPOSE_REDIRECT
);
2025 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->fwd_btn
), menu
);
2027 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2028 _("Forward Message"));
2029 toolbar_data
->fwd_btn
= item
;
2033 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Trash Message"));
2034 toolbar_data
->trash_btn
= item
;
2037 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Delete Message"));
2038 toolbar_data
->delete_btn
= item
;
2041 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Execute"));
2042 toolbar_data
->exec_btn
= item
;
2045 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Go to Previous Unread Message"));
2046 toolbar_data
->prev_btn
= item
;
2049 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Go to Next Unread Message"));
2050 toolbar_data
->next_btn
= item
;
2053 /* Compose Toolbar */
2055 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Send Message"));
2056 toolbar_data
->send_btn
= item
;
2059 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Put into queue folder and send later"));
2060 toolbar_data
->sendl_btn
= item
;
2063 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Save to draft folder"));
2064 toolbar_data
->draft_btn
= item
;
2067 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Insert file"));
2068 toolbar_data
->insert_btn
= item
;
2071 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Attach file"));
2072 toolbar_data
->attach_btn
= item
;
2075 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Insert signature"));
2076 toolbar_data
->sig_btn
= item
;
2079 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Edit with external editor"));
2080 toolbar_data
->exteditor_btn
= item
;
2082 case A_LINEWRAP_CURRENT
:
2083 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Wrap long lines of current paragraph"));
2084 toolbar_data
->linewrap_current_btn
= item
;
2086 case A_LINEWRAP_ALL
:
2087 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Wrap all long lines"));
2088 toolbar_data
->linewrap_all_btn
= item
;
2091 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Address book"));
2092 toolbar_data
->addrbook_btn
= item
;
2095 case A_CHECK_SPELLING
:
2096 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Check spelling"));
2097 toolbar_data
->spellcheck_btn
= item
;
2101 case A_CLAWS_ACTIONS
:
2102 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,toolbar_item
->text
);
2103 action_item
= g_new0(ToolbarClawsActions
, 1);
2104 action_item
->widget
= item
;
2105 action_item
->name
= g_strdup(toolbar_item
->text
);
2107 toolbar_data
->action_list
=
2108 g_slist_append(toolbar_data
->action_list
,
2112 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Cancel receiving"));
2113 toolbar_data
->cancel_inc_btn
= item
;
2116 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2117 toolbar_ret_descr_from_val(toolbar_item
->index
));
2118 /* find and set the tool tip text */
2123 toolbar_data
->toolbar
= toolbar
;
2124 #ifndef GENERIC_UMPC
2125 #if !(GTK_CHECK_VERSION(2,12,0))
2126 toolbar_data
->tooltips
= toolbar_tips
;
2129 gtk_widget_show_all(toolbar
);
2131 if (type
== TOOLBAR_MAIN
) {
2133 MainWindow
*mainwin
= mainwindow_get_mainwindow();
2134 GtkWidget
*progressbar
= gtk_progress_bar_new();
2135 item
= GTK_WIDGET(gtk_tool_item_new());
2136 gtk_container_add (GTK_CONTAINER (item
), progressbar
);
2137 gtk_widget_show(item
);
2138 gtk_widget_show(progressbar
);
2139 gtk_widget_set_size_request(progressbar
, 70, -1);
2140 gtk_toolbar_insert(GTK_TOOLBAR(toolbar
), GTK_TOOL_ITEM(item
), -1);
2141 mainwin
->progressbar
= progressbar
;
2143 activate_compose_button(toolbar_data
,
2144 prefs_common
.toolbar_style
,
2145 toolbar_data
->compose_btn_type
);
2147 if (type
!= TOOLBAR_COMPOSE
)
2148 activate_learn_button(toolbar_data
, prefs_common
.toolbar_style
,
2152 gtk_container_add(GTK_CONTAINER(container
), toolbar
);
2153 gtk_container_set_border_width(GTK_CONTAINER(container
), 2);
2155 if ( GTK_IS_WINDOW(container
) ) {
2156 hildon_window_add_toolbar (HILDON_WINDOW(container
), GTK_TOOLBAR(toolbar
));
2157 gtk_widget_show_all (container
);
2159 gtk_container_add(GTK_CONTAINER(container
), toolbar
);
2160 gtk_container_set_border_width(GTK_CONTAINER(container
), 2);
2163 return toolbar_data
;
2167 * Free toolbar structures
2169 void toolbar_destroy(Toolbar
* toolbar
) {
2171 TOOLBAR_DESTROY_ITEMS(toolbar
->item_list
);
2172 TOOLBAR_DESTROY_ACTIONS(toolbar
->action_list
);
2175 void toolbar_update(ToolbarType type
, gpointer data
)
2177 Toolbar
*toolbar_data
;
2178 GtkWidget
*handlebox
;
2179 MainWindow
*mainwin
= (MainWindow
*)data
;
2180 Compose
*compose
= (Compose
*)data
;
2181 MessageView
*msgview
= (MessageView
*)data
;
2183 #ifndef GENERIC_UMPC
2186 toolbar_data
= mainwin
->toolbar
;
2187 handlebox
= mainwin
->handlebox
;
2189 case TOOLBAR_COMPOSE
:
2190 toolbar_data
= compose
->toolbar
;
2191 handlebox
= compose
->handlebox
;
2193 case TOOLBAR_MSGVIEW
:
2194 toolbar_data
= msgview
->toolbar
;
2195 handlebox
= msgview
->handlebox
;
2201 gtk_container_remove(GTK_CONTAINER(handlebox
),
2202 GTK_WIDGET(toolbar_data
->toolbar
));
2204 toolbar_init(toolbar_data
);
2205 toolbar_data
= toolbar_create(type
, handlebox
, data
);
2209 toolbar_data
= mainwin
->toolbar
;
2210 handlebox
= mainwin
->window
;
2212 case TOOLBAR_COMPOSE
:
2213 toolbar_data
= compose
->toolbar
;
2214 handlebox
= compose
->window
;
2216 case TOOLBAR_MSGVIEW
:
2217 toolbar_data
= msgview
->toolbar
;
2218 handlebox
= msgview
->window
;
2224 hildon_window_remove_toolbar(HILDON_WINDOW(handlebox
), GTK_TOOLBAR(toolbar_data
->toolbar
));
2226 toolbar_init(toolbar_data
);
2227 toolbar_data
= toolbar_create(type
, handlebox
, data
);
2232 mainwin
->toolbar
= toolbar_data
;
2234 case TOOLBAR_COMPOSE
:
2235 compose
->toolbar
= toolbar_data
;
2237 case TOOLBAR_MSGVIEW
:
2238 msgview
->toolbar
= toolbar_data
;
2242 toolbar_style(type
, prefs_common
.toolbar_style
, data
);
2244 if (type
== TOOLBAR_MAIN
) {
2245 toolbar_main_set_sensitive((MainWindow
*)data
);
2246 account_set_menu_only_toolbar();
2250 #if !GTK_CHECK_VERSION(2,14,0)
2251 /* Work around http://bugzilla.gnome.org/show_bug.cgi?id=56070 */
2252 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
2253 gboolean in_btn1 = FALSE, in_btn2 = FALSE; \
2254 if (GTK_IS_BUTTON(widget)) \
2255 in_btn1 = GTK_BUTTON(widget)->in_button; \
2256 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2257 GtkWidget *child = gtk_bin_get_child( \
2259 GList *gchild = gtk_container_get_children( \
2260 GTK_CONTAINER(child)); \
2261 GtkWidget *btn = (GtkWidget *)gchild->data; \
2262 GtkWidget *arr = (GtkWidget *) \
2263 (gchild->next?gchild->next->data:NULL); \
2264 g_list_free(gchild); \
2265 if (GTK_IS_BUTTON(btn)) \
2266 in_btn1 = GTK_BUTTON(btn)->in_button; \
2267 if (GTK_IS_BUTTON(arr)) \
2268 in_btn2 = GTK_BUTTON(arr)->in_button; \
2270 else if (GTK_IS_TOOL_ITEM(widget)) { \
2271 GtkWidget *child = gtk_bin_get_child( \
2273 if (GTK_IS_BUTTON(child)) \
2274 in_btn1 = GTK_BUTTON(child)->in_button; \
2276 gtk_widget_set_sensitive(widget, sensitive); \
2277 if (GTK_IS_BUTTON(widget)) \
2278 GTK_BUTTON(widget)->in_button = in_btn1; \
2279 else if (GTK_IS_MENU_TOOL_BUTTON(widget)) { \
2280 GtkWidget *child = gtk_bin_get_child( \
2282 GList *gchild = gtk_container_get_children( \
2283 GTK_CONTAINER(child)); \
2284 GtkWidget *btn = (GtkWidget *)gchild->data; \
2285 GtkWidget *arr = (GtkWidget *) \
2286 (gchild->next?gchild->next->data:NULL); \
2287 g_list_free(gchild); \
2288 if (GTK_IS_BUTTON(btn)) \
2289 GTK_BUTTON(btn)->in_button = in_btn1; \
2290 if (GTK_IS_BUTTON(arr)) \
2291 GTK_BUTTON(arr)->in_button = in_btn2; \
2293 else if (GTK_IS_TOOL_ITEM(widget)) { \
2294 GtkWidget *child = gtk_bin_get_child( \
2296 if (GTK_IS_BUTTON(child)) \
2297 GTK_BUTTON(child)->in_button = in_btn1; \
2301 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
2302 gtk_widget_set_sensitive(widget, sensitive); \
2306 void toolbar_main_set_sensitive(gpointer data
)
2308 SensitiveCond state
;
2310 MainWindow
*mainwin
= (MainWindow
*)data
;
2311 Toolbar
*toolbar
= mainwin
->toolbar
;
2313 GSList
*entry_list
= NULL
;
2315 typedef struct _Entry Entry
;
2322 #define SET_WIDGET_COND(w, c) \
2324 Entry *e = g_new0(Entry, 1); \
2327 entry_list = g_slist_append(entry_list, e); \
2331 if (toolbar
->get_btn
)
2332 SET_WIDGET_COND(toolbar
->get_btn
,
2333 M_HAVE_ACCOUNT
|M_UNLOCKED
);
2335 if (toolbar
->getall_btn
) {
2336 SET_WIDGET_COND(toolbar
->getall_btn
,
2337 M_HAVE_ACCOUNT
|M_UNLOCKED
);
2339 if (toolbar
->send_btn
) {
2340 SET_WIDGET_COND(toolbar
->send_btn
,
2341 M_HAVE_QUEUED_MAILS
);
2343 if (toolbar
->compose_mail_btn
) {
2344 SET_WIDGET_COND(toolbar
->compose_mail_btn
,
2347 if (toolbar
->close_window_btn
) {
2348 SET_WIDGET_COND(toolbar
->close_window_btn
,
2351 if (toolbar
->open_mail_btn
) {
2352 SET_WIDGET_COND(toolbar
->open_mail_btn
,
2353 M_TARGET_EXIST
|M_SUMMARY_ISLIST
);
2355 if (toolbar
->reply_btn
) {
2356 SET_WIDGET_COND(toolbar
->reply_btn
,
2357 M_HAVE_ACCOUNT
|M_TARGET_EXIST
|M_SUMMARY_ISLIST
);
2359 if (toolbar
->replyall_btn
) {
2360 SET_WIDGET_COND(toolbar
->replyall_btn
,
2361 M_HAVE_ACCOUNT
|M_TARGET_EXIST
|M_SUMMARY_ISLIST
);
2363 if (toolbar
->replylist_btn
) {
2364 SET_WIDGET_COND(toolbar
->replylist_btn
,
2365 M_HAVE_ACCOUNT
|M_TARGET_EXIST
|M_SUMMARY_ISLIST
);
2367 if (toolbar
->replysender_btn
) {
2368 SET_WIDGET_COND(toolbar
->replysender_btn
,
2369 M_HAVE_ACCOUNT
|M_TARGET_EXIST
|M_SUMMARY_ISLIST
);
2371 if (toolbar
->fwd_btn
) {
2372 SET_WIDGET_COND(toolbar
->fwd_btn
,
2373 M_HAVE_ACCOUNT
|M_TARGET_EXIST
|M_SUMMARY_ISLIST
);
2376 if (prefs_common
.next_unread_msg_dialog
== NEXTUNREADMSGDIALOG_ASSUME_NO
) {
2377 SET_WIDGET_COND(toolbar
->next_btn
, M_MSG_EXIST
|M_SUMMARY_ISLIST
);
2379 SET_WIDGET_COND(toolbar
->next_btn
, 0);
2382 if (toolbar
->trash_btn
)
2383 SET_WIDGET_COND(toolbar
->trash_btn
,
2384 M_TARGET_EXIST
|M_ALLOW_DELETE
|M_NOT_NEWS
);
2386 if (toolbar
->delete_btn
)
2387 SET_WIDGET_COND(toolbar
->delete_btn
,
2388 M_TARGET_EXIST
|M_ALLOW_DELETE
);
2390 if (toolbar
->exec_btn
)
2391 SET_WIDGET_COND(toolbar
->exec_btn
,
2394 if (toolbar
->learn_spam_btn
)
2395 SET_WIDGET_COND(toolbar
->learn_spam_btn
,
2396 M_TARGET_EXIST
|M_CAN_LEARN_SPAM
|M_SUMMARY_ISLIST
);
2398 if (toolbar
->cancel_inc_btn
)
2399 SET_WIDGET_COND(toolbar
->cancel_inc_btn
,
2402 for (cur
= toolbar
->action_list
; cur
!= NULL
; cur
= cur
->next
) {
2403 ToolbarClawsActions
*act
= (ToolbarClawsActions
*)cur
->data
;
2405 SET_WIDGET_COND(act
->widget
, M_TARGET_EXIST
|M_UNLOCKED
);
2408 #undef SET_WIDGET_COND
2410 state
= main_window_get_current_state(mainwin
);
2412 for (cur
= entry_list
; cur
!= NULL
; cur
= cur
->next
) {
2413 Entry
*e
= (Entry
*) cur
->data
;
2415 if (e
->widget
!= NULL
) {
2416 sensitive
= ((e
->cond
& state
) == e
->cond
);
2417 GTK_BUTTON_SET_SENSITIVE(e
->widget
, sensitive
);
2421 while (entry_list
!= NULL
) {
2422 Entry
*e
= (Entry
*) entry_list
->data
;
2425 entry_list
= g_slist_remove(entry_list
, e
);
2428 g_slist_free(entry_list
);
2430 activate_compose_button(toolbar
,
2431 prefs_common
.toolbar_style
,
2432 toolbar
->compose_btn_type
);
2436 void toolbar_comp_set_sensitive(gpointer data
, gboolean sensitive
)
2438 Compose
*compose
= (Compose
*)data
;
2439 GSList
*items
= compose
->toolbar
->action_list
;
2441 if (compose
->toolbar
->send_btn
)
2442 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->send_btn
, sensitive
);
2443 if (compose
->toolbar
->sendl_btn
)
2444 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->sendl_btn
, sensitive
);
2445 if (compose
->toolbar
->draft_btn
)
2446 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->draft_btn
, sensitive
);
2447 if (compose
->toolbar
->insert_btn
)
2448 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->insert_btn
, sensitive
);
2449 if (compose
->toolbar
->attach_btn
)
2450 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->attach_btn
, sensitive
);
2451 if (compose
->toolbar
->sig_btn
)
2452 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->sig_btn
, sensitive
);
2453 if (compose
->toolbar
->exteditor_btn
)
2454 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->exteditor_btn
, sensitive
);
2455 if (compose
->toolbar
->linewrap_current_btn
)
2456 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->linewrap_current_btn
, sensitive
);
2457 if (compose
->toolbar
->linewrap_all_btn
)
2458 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->linewrap_all_btn
, sensitive
);
2459 if (compose
->toolbar
->addrbook_btn
)
2460 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->addrbook_btn
, sensitive
);
2462 if (compose
->toolbar
->spellcheck_btn
)
2463 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->spellcheck_btn
, sensitive
);
2465 for (; items
!= NULL
; items
= g_slist_next(items
)) {
2466 ToolbarClawsActions
*item
= (ToolbarClawsActions
*)items
->data
;
2467 GTK_BUTTON_SET_SENSITIVE(item
->widget
, sensitive
);
2472 * Initialize toolbar structure
2474 static void toolbar_init(Toolbar
* toolbar
)
2477 toolbar
->toolbar
= NULL
;
2478 toolbar
->folders_btn
= NULL
;
2479 toolbar
->get_btn
= NULL
;
2480 toolbar
->getall_btn
= NULL
;
2481 toolbar
->send_btn
= NULL
;
2482 toolbar
->compose_mail_btn
= NULL
;
2483 toolbar
->compose_mail_icon
= NULL
;
2484 toolbar
->compose_news_icon
= NULL
;
2485 toolbar
->reply_btn
= NULL
;
2486 toolbar
->replysender_btn
= NULL
;
2487 toolbar
->replyall_btn
= NULL
;
2488 toolbar
->replylist_btn
= NULL
;
2489 toolbar
->fwd_btn
= NULL
;
2490 toolbar
->trash_btn
= NULL
;
2491 toolbar
->delete_btn
= NULL
;
2492 toolbar
->prev_btn
= NULL
;
2493 toolbar
->next_btn
= NULL
;
2494 toolbar
->exec_btn
= NULL
;
2495 toolbar
->open_mail_btn
= NULL
;
2496 toolbar
->close_window_btn
= NULL
;
2497 /* compose buttons */
2498 toolbar
->sendl_btn
= NULL
;
2499 toolbar
->draft_btn
= NULL
;
2500 toolbar
->insert_btn
= NULL
;
2501 toolbar
->attach_btn
= NULL
;
2502 toolbar
->sig_btn
= NULL
;
2503 toolbar
->exteditor_btn
= NULL
;
2504 toolbar
->linewrap_current_btn
= NULL
;
2505 toolbar
->linewrap_all_btn
= NULL
;
2506 toolbar
->addrbook_btn
= NULL
;
2508 toolbar
->spellcheck_btn
= NULL
;
2511 toolbar_destroy(toolbar
);
2516 static void toolbar_reply(gpointer data
, guint action
)
2518 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
2519 MainWindow
*mainwin
;
2520 MessageView
*msgview
;
2521 GSList
*msginfo_list
= NULL
;
2523 cm_return_if_fail(toolbar_item
!= NULL
);
2525 switch (toolbar_item
->type
) {
2527 mainwin
= (MainWindow
*)toolbar_item
->parent
;
2528 msginfo_list
= summary_get_selection(mainwin
->summaryview
);
2529 msgview
= (MessageView
*)mainwin
->messageview
;
2531 case TOOLBAR_MSGVIEW
:
2532 msgview
= (MessageView
*)toolbar_item
->parent
;
2533 cm_return_if_fail(msgview
!= NULL
);
2534 msginfo_list
= g_slist_append(msginfo_list
, msgview
->msginfo
);
2540 cm_return_if_fail(msgview
!= NULL
);
2541 cm_return_if_fail(msginfo_list
!= NULL
);
2542 compose_reply_from_messageview(msgview
, msginfo_list
, action
);
2543 g_slist_free(msginfo_list
);
2545 /* TODO: update reply state ion summaryview */
2549 /* exported functions */
2551 void inc_mail_cb(gpointer data
, guint action
, GtkWidget
*widget
)
2553 MainWindow
*mainwin
= (MainWindow
*)data
;
2555 inc_mail(mainwin
, prefs_common
.newmail_notify_manu
);
2558 void inc_all_account_mail_cb(gpointer data
, guint action
, GtkWidget
*widget
)
2560 MainWindow
*mainwin
= (MainWindow
*)data
;
2562 inc_all_account_mail(mainwin
, FALSE
, prefs_common
.newmail_notify_manu
);
2565 void send_queue_cb(gpointer data
, guint action
, GtkWidget
*widget
)
2569 gboolean got_error
= FALSE
;
2570 gchar
*errstr
= NULL
;
2572 if (prefs_common
.work_offline
)
2573 if (alertpanel(_("Offline warning"),
2574 _("You're working offline. Override?"),
2575 GTK_STOCK_NO
, GTK_STOCK_YES
,
2576 NULL
) != G_ALERTALTERNATE
)
2579 /* ask for confirmation before sending queued messages only
2580 in online mode and if there is at least one message queued
2581 in any of the folder queue
2583 if (prefs_common
.confirm_send_queued_messages
) {
2585 /* check if there's a queued message */
2586 for (list
= folder_get_list(); !found
&& list
!= NULL
; list
= list
->next
) {
2587 Folder
*folder
= list
->data
;
2589 found
= !procmsg_queue_is_empty(folder
->queue
);
2591 /* if necessary, ask for confirmation before sending */
2592 if (found
&& !prefs_common
.work_offline
) {
2593 if (alertpanel(_("Send queued messages"),
2594 _("Send all queued messages?"),
2595 GTK_STOCK_CANCEL
, _("_Send"),
2596 NULL
) != G_ALERTALTERNATE
)
2601 for (list
= folder_get_list(); list
!= NULL
; list
= list
->next
) {
2602 Folder
*folder
= list
->data
;
2604 if (folder
->queue
) {
2605 if (procmsg_send_queue(folder
->queue
,
2606 prefs_common
.savemsg
,
2613 alertpanel_error_log(_("Some errors occurred while "
2614 "sending queued messages."));
2616 alertpanel_error_log(_("Some errors occurred "
2617 "while sending queued messages:\n%s"), errstr
);
2623 void compose_mail_cb(gpointer data
, guint action
, GtkWidget
*widget
)
2625 MainWindow
*mainwin
= (MainWindow
*)data
;
2626 PrefsAccount
*ac
= NULL
;
2627 FolderItem
*item
= mainwin
->summaryview
->folder_item
;
2632 ac
= account_find_from_item(item
);
2633 if (ac
&& ac
->protocol
!= A_NNTP
) {
2634 compose_new_with_folderitem(ac
, item
, NULL
); /* CLAWS */
2640 * CLAWS - use current account
2642 if (cur_account
&& (cur_account
->protocol
!= A_NNTP
)) {
2643 compose_new_with_folderitem(cur_account
, item
, NULL
);
2648 * CLAWS - just get the first one
2650 list
= account_get_list();
2651 for (cur
= list
; cur
!= NULL
; cur
= g_list_next(cur
)) {
2652 ac
= (PrefsAccount
*) cur
->data
;
2653 if (ac
->protocol
!= A_NNTP
) {
2654 compose_new_with_folderitem(ac
, item
, NULL
);
2660 void compose_news_cb(gpointer data
, guint action
, GtkWidget
*widget
)
2662 MainWindow
*mainwin
= (MainWindow
*)data
;
2663 PrefsAccount
* ac
= NULL
;
2667 if (mainwin
->summaryview
->folder_item
) {
2668 ac
= mainwin
->summaryview
->folder_item
->folder
->account
;
2669 if (ac
&& ac
->protocol
== A_NNTP
) {
2670 compose_new_with_folderitem(ac
,
2671 mainwin
->summaryview
->folder_item
, NULL
);
2676 list
= account_get_list();
2677 for(cur
= list
; cur
!= NULL
; cur
= g_list_next(cur
)) {
2678 ac
= (PrefsAccount
*) cur
->data
;
2679 if (ac
->protocol
== A_NNTP
) {
2680 compose_new_with_folderitem(ac
,
2681 mainwin
->summaryview
->folder_item
, NULL
);