2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client
3 * Copyright (C) 2001-2022 the Claws Mail team and Hiroyuki Yamamoto
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 #include "claws-features.h"
27 #include <glib/gi18n.h>
36 #include "mainwindow.h"
37 #include "summaryview.h"
42 #include "prefs_gtk.h"
44 #include "stock_pixmap.h"
45 #include "manage_window.h"
51 #include "prefs_actions.h"
52 #include "prefs_common.h"
53 #include "prefs_toolbar.h"
54 #include "alertpanel.h"
57 #include "send_message.h"
58 #ifndef USE_ALT_ADDRBOOK
59 #include "addressbook.h"
61 #include "addressbook-dbus.h"
65 #define TOOLBAR_TAG_INDEX "toolbar"
66 #define TOOLBAR_TAG_ITEM "item"
67 #define TOOLBAR_TAG_SEPARATOR "separator"
69 #define TOOLBAR_ICON_FILE "file"
70 #define TOOLBAR_ICON_TEXT "text"
71 #define TOOLBAR_ICON_ACTION "action"
73 static void toolbar_init(Toolbar
* toolbar
);
74 static gboolean
toolbar_is_duplicate (gint action
,
76 static void toolbar_parse_item (XMLFile
*file
,
77 ToolbarType source
, gboolean
*rewrite
);
79 static gint
toolbar_ret_val_from_text (const gchar
*text
);
80 static gchar
*toolbar_ret_text_from_val (gint val
);
82 typedef struct _DefaultToolbar DefaultToolbar
;
83 struct _DefaultToolbar
{
86 static void toolbar_set_default_generic(ToolbarType toolbar_type
,
87 DefaultToolbar
*default_toolbar
);
89 static void toolbar_style (ToolbarType type
,
93 static MainWindow
*get_mainwin (gpointer data
);
94 static void activate_compose_button (Toolbar
*toolbar
,
96 ComposeButtonType type
);
98 /* toolbar callbacks */
99 static void toolbar_reply (gpointer data
,
102 static void toolbar_learn (gpointer data
,
105 static void toolbar_delete_dup (gpointer data
,
108 static void toolbar_trash_cb (GtkWidget
*widget
,
111 static void toolbar_delete_cb (GtkWidget
*widget
,
114 static void toolbar_delete_dup_cb (GtkWidget
*widget
,
118 static void toolbar_compose_cb (GtkWidget
*widget
,
121 static void toolbar_learn_cb (GtkWidget
*widget
,
124 static void toolbar_reply_cb (GtkWidget
*widget
,
127 static void toolbar_reply_to_all_cb (GtkWidget
*widget
,
130 static void toolbar_reply_to_list_cb (GtkWidget
*widget
,
133 static void toolbar_reply_to_sender_cb (GtkWidget
*widget
,
136 static void toolbar_forward_cb (GtkWidget
*widget
,
139 static void toolbar_prev_unread_cb (GtkWidget
*widget
,
141 static void toolbar_next_unread_cb (GtkWidget
*widget
,
144 static void toolbar_ignore_thread_cb (GtkWidget
*widget
,
147 static void toolbar_watch_thread_cb (GtkWidget
*widget
,
150 static void toolbar_mark_cb (GtkWidget
*widget
,
153 static void toolbar_unmark_cb (GtkWidget
*widget
,
156 static void toolbar_lock_cb (GtkWidget
*widget
,
159 static void toolbar_unlock_cb (GtkWidget
*widget
,
162 static void toolbar_all_read_cb (GtkWidget
*widget
,
165 static void toolbar_all_unread_cb (GtkWidget
*widget
,
168 static void toolbar_read_cb (GtkWidget
*widget
,
171 static void toolbar_unread_cb (GtkWidget
*widget
,
174 static void toolbar_run_processing_cb (GtkWidget
*widget
,
177 static void toolbar_print_cb (GtkWidget
*widget
,
180 static void toolbar_actions_execute_cb (GtkWidget
*widget
,
182 static void toolbar_plugins_execute_cb (GtkWidget
*widget
,
186 static void toolbar_send_cb (GtkWidget
*widget
,
188 static void toolbar_send_later_cb (GtkWidget
*widget
,
190 static void toolbar_draft_cb (GtkWidget
*widget
,
192 static void toolbar_close_cb (GtkWidget
*widget
,
194 static void toolbar_preferences_cb (GtkWidget
*widget
,
196 static void toolbar_open_mail_cb (GtkWidget
*widget
,
198 static void toolbar_insert_cb (GtkWidget
*widget
,
200 static void toolbar_attach_cb (GtkWidget
*widget
,
202 static void toolbar_sig_cb (GtkWidget
*widget
,
204 static void toolbar_ext_editor_cb (GtkWidget
*widget
,
206 static void toolbar_linewrap_current_cb (GtkWidget
*widget
,
208 static void toolbar_linewrap_all_cb (GtkWidget
*widget
,
210 static void toolbar_addrbook_cb (GtkWidget
*widget
,
213 static void toolbar_check_spelling_cb (GtkWidget
*widget
,
216 static void toolbar_cancel_inc_cb (GtkWidget
*widget
,
218 static void toolbar_cancel_send_cb (GtkWidget
*widget
,
220 static void toolbar_cancel_all_cb (GtkWidget
*widget
,
226 } toolbar_text
[] = {
227 { "A_RECEIVE_ALL", N_("Receive Mail from all Accounts") },
228 { "A_RECEIVE_CUR", N_("Receive Mail from current Account") },
229 { "A_SEND_QUEUED", N_("Send Queued Messages") },
230 { "A_COMPOSE_EMAIL", N_("Compose Email") },
231 { "A_COMPOSE_NEWS", N_("Compose News") },
232 { "A_REPLY_MESSAGE", N_("Reply to Message") },
233 { "A_REPLY_SENDER", N_("Reply to Sender") },
234 { "A_REPLY_ALL", N_("Reply to All") },
235 { "A_REPLY_ML", N_("Reply to Mailing-list") },
236 { "A_OPEN_MAIL", N_("Open email") },
237 { "A_FORWARD", N_("Forward Message") },
238 { "A_TRASH", N_("Trash Message") },
239 { "A_DELETE_REAL", N_("Delete Message") },
240 { "A_DELETE_DUP", N_("Delete duplicate messages") },
241 { "A_EXECUTE", N_("Execute") },
242 { "A_GOTO_PREV", N_("Go to Previous Unread Message") },
243 { "A_GOTO_NEXT", N_("Go to Next Unread Message") },
245 { "A_IGNORE_THREAD", N_("Ignore thread") },
246 { "A_WATCH_THREAD", N_("Watch thread") },
247 { "A_MARK", N_("Mark Message") },
248 { "A_UNMARK", N_("Unmark Message") },
249 { "A_LOCK", N_("Lock Message") },
250 { "A_UNLOCK", N_("Unlock Message") },
251 { "A_ALL_READ", N_("Mark all Messages as read") },
252 { "A_ALL_UNREAD", N_("Mark all Messages as unread") },
253 { "A_READ", N_("Mark Message as read") },
254 { "A_UNREAD", N_("Mark Message as unread") },
255 { "A_RUN_PROCESSING", N_("Run folder processing rules") },
257 { "A_PRINT", N_("Print") },
258 { "A_LEARN_SPAM", N_("Learn Spam or Ham") },
259 { "A_GO_FOLDERS", N_("Open folder/Go to folder list") },
260 { "A_PREFERENCES", N_("Preferences") },
262 { "A_SEND", N_("Send Message") },
263 { "A_SEND_LATER", N_("Put into queue folder and send later") },
264 { "A_DRAFT", N_("Save to draft folder") },
265 { "A_INSERT", N_("Insert file") },
266 { "A_ATTACH", N_("Attach file") },
267 { "A_SIG", N_("Insert signature") },
268 { "A_REP_SIG", N_("Replace signature") },
269 { "A_EXTEDITOR", N_("Edit with external editor") },
270 { "A_LINEWRAP_CURRENT", N_("Wrap long lines of current paragraph") },
271 { "A_LINEWRAP_ALL", N_("Wrap all long lines") },
272 { "A_ADDRBOOK", N_("Address book") },
274 { "A_CHECK_SPELLING", N_("Check spelling") },
276 { "A_PRIVACY_SIGN", N_("Sign") },
277 { "A_PRIVACY_ENCRYPT", N_("Encrypt") },
278 { "A_CLAWS_ACTIONS", N_("Claws Mail Actions Feature") },
279 { "A_CANCEL_INC", N_("Cancel receiving") },
280 { "A_CANCEL_SEND", N_("Cancel sending") },
281 { "A_CANCEL_ALL", N_("Cancel receiving/sending") },
282 { "A_CLOSE", N_("Close window") },
283 { "A_SEPARATOR", N_("Separator") },
284 { "A_CLAWS_PLUGINS", N_("Claws Mail Plugins") }
287 /* migration table: support reading toolbar configuration files with
288 old action names and converting them to current action names,
289 see toolbar_parse_item(), which makes uses of this alias table.
292 const gchar
*old_name
;
293 const gchar
*current_name
;
294 } toolbar_migration
[] = {
295 { "A_SYL_ACTIONS", "A_CLAWS_ACTIONS" },
296 { "A_SENDL", "A_SEND_LATER" },
300 /* struct holds configuration files and a list of
301 * currently active toolbar items
302 * TOOLBAR_MAIN, TOOLBAR_COMPOSE and TOOLBAR_MSGVIEW
306 const gchar
*conf_file
;
308 } toolbar_config
[NUM_TOOLBARS
] = {
309 { "toolbar_main.xml", NULL
},
310 { "toolbar_compose.xml", NULL
},
311 { "toolbar_msgview.xml", NULL
}
314 gint
toolbar_ret_val_from_descr(const gchar
*descr
)
318 for (i
= 0; i
< N_ACTION_VAL
; i
++) {
319 if (g_utf8_collate(gettext(toolbar_text
[i
].descr
), descr
) == 0)
326 gchar
*toolbar_ret_descr_from_val(gint val
)
328 cm_return_val_if_fail(val
>=0 && val
< N_ACTION_VAL
, NULL
);
330 return gettext(toolbar_text
[val
].descr
);
333 static gint
toolbar_ret_val_from_text(const gchar
*text
)
337 for (i
= 0; i
< N_ACTION_VAL
; i
++) {
338 if (g_utf8_collate(toolbar_text
[i
].index_str
, text
) == 0)
345 static gchar
*toolbar_ret_text_from_val(gint val
)
347 cm_return_val_if_fail(val
>=0 && val
< N_ACTION_VAL
, NULL
);
349 return toolbar_text
[val
].index_str
;
352 static gboolean
toolbar_is_duplicate(gint action
, ToolbarType source
)
356 if ((action
== A_SEPARATOR
) || (action
== A_CLAWS_ACTIONS
) || (action
== A_CLAWS_PLUGINS
))
359 for (cur
= toolbar_config
[source
].item_list
; cur
!= NULL
; cur
= cur
->next
) {
360 ToolbarItem
*item
= (ToolbarItem
*) cur
->data
;
362 if (item
->index
== action
)
368 /* depending on toolbar type this function
369 returns a list of available toolbar events being
370 displayed by prefs_toolbar
372 GList
*toolbar_get_action_items(ToolbarType source
)
377 if (source
== TOOLBAR_MAIN
) {
378 gint main_items
[] = {
379 A_RECEIVE_ALL
, A_RECEIVE_CUR
, A_SEND_QUEUED
,
380 A_COMPOSE_EMAIL
, A_REPLY_MESSAGE
, A_REPLY_SENDER
,
381 A_REPLY_ALL
, A_REPLY_ML
, A_OPEN_MAIL
, A_FORWARD
,
382 A_TRASH
, A_DELETE_REAL
, A_DELETE_DUP
, A_EXECUTE
,
383 A_GOTO_PREV
, A_GOTO_NEXT
, A_IGNORE_THREAD
, A_WATCH_THREAD
,
384 A_MARK
, A_UNMARK
, A_LOCK
, A_UNLOCK
,
385 A_ALL_READ
, A_ALL_UNREAD
, A_READ
, A_UNREAD
,
387 A_PRINT
, A_ADDRBOOK
, A_LEARN_SPAM
, A_GO_FOLDERS
,
388 A_CANCEL_INC
, A_CANCEL_SEND
, A_CANCEL_ALL
, A_PREFERENCES
};
390 for (i
= 0; i
< sizeof main_items
/ sizeof main_items
[0]; i
++) {
391 items
= g_list_append(items
, gettext(toolbar_text
[main_items
[i
]].descr
));
394 else if (source
== TOOLBAR_COMPOSE
) {
395 gint comp_items
[] = {
396 A_SEND
, A_SEND_LATER
, A_DRAFT
,
397 A_INSERT
, A_ATTACH
, A_SIG
,
398 A_REP_SIG
, A_EXTEDITOR
, A_LINEWRAP_CURRENT
,
399 A_LINEWRAP_ALL
, A_ADDRBOOK
,
403 A_PRIVACY_SIGN
, A_PRIVACY_ENCRYPT
,
406 for (i
= 0; i
< sizeof comp_items
/ sizeof comp_items
[0]; i
++)
407 items
= g_list_append(items
, gettext(toolbar_text
[comp_items
[i
]].descr
));
409 else if (source
== TOOLBAR_MSGVIEW
) {
410 gint msgv_items
[] = {
411 A_COMPOSE_EMAIL
, A_REPLY_MESSAGE
, A_REPLY_SENDER
,
412 A_REPLY_ALL
, A_REPLY_ML
, A_FORWARD
,
413 A_TRASH
, A_DELETE_REAL
, A_GOTO_PREV
, A_GOTO_NEXT
,
414 A_ADDRBOOK
, A_LEARN_SPAM
, A_CLOSE
};
416 for (i
= 0; i
< sizeof msgv_items
/ sizeof msgv_items
[0]; i
++)
417 items
= g_list_append(items
, gettext(toolbar_text
[msgv_items
[i
]].descr
));
423 static void toolbar_parse_item(XMLFile
*file
, ToolbarType source
, gboolean
*rewrite
)
427 ToolbarItem
*item
= NULL
;
429 g_return_if_fail(rewrite
!= NULL
);
431 attr
= xml_get_current_tag_attr(file
);
432 item
= g_new0(ToolbarItem
, 1);
434 name
= ((XMLAttr
*)attr
->data
)->name
;
435 value
= ((XMLAttr
*)attr
->data
)->value
;
437 if (g_utf8_collate(name
, TOOLBAR_ICON_FILE
) == 0)
438 item
->file
= g_strdup (value
);
439 else if (g_utf8_collate(name
, TOOLBAR_ICON_TEXT
) == 0)
440 item
->text
= g_strdup (*value
? gettext(value
):"");
441 else if (g_utf8_collate(name
, TOOLBAR_ICON_ACTION
) == 0)
442 item
->index
= toolbar_ret_val_from_text(value
);
444 if ((item
->index
== -1) && !strcmp(value
, "A_DELETE")) {
446 item
->index
= A_TRASH
;
448 item
->file
= g_strdup("trash_btn");
450 item
->text
= g_strdup(C_("Toolbar", "Trash"));
453 if (!strcmp(item
->file
, "mail") && !strcmp(value
, "A_DRAFT")) {
454 /* switch icon file */
456 item
->file
= g_strdup("mail_draft");
459 if (item
->index
== -1) {
460 /* item not found in table: try migrating old action names to current ones */
463 /* replace action name */
464 for (i
= 0; toolbar_migration
[i
].old_name
!= NULL
; i
++) {
465 if (g_utf8_collate(value
, toolbar_migration
[i
].old_name
) == 0) {
466 item
->index
= toolbar_ret_val_from_text(toolbar_migration
[i
].current_name
);
467 if (item
->index
!= -1) {
469 debug_print("toolbar_parse_item: migrating action label from '%s' to '%s'\n",
470 value
, toolbar_migration
[i
].current_name
);
476 if ((item
->index
== -1) && !rewrite
)
477 g_warning("toolbar_parse_item: unrecognized action name '%s'", value
);
479 attr
= g_list_next(attr
);
481 if (item
->index
!= -1) {
482 if (!toolbar_is_duplicate(item
->index
, source
)) {
483 toolbar_config
[source
].item_list
= g_slist_append(toolbar_config
[source
].item_list
,
486 toolbar_item_destroy(item
);
489 toolbar_item_destroy(item
);
493 const gchar
*toolbar_get_short_text(int action
) {
495 case A_RECEIVE_ALL
: return _("Get Mail");
496 case A_RECEIVE_CUR
: return _("Get");
497 case A_SEND_QUEUED
: return _("Send");
498 case A_COMPOSE_EMAIL
: return C_("Toolbar", "Compose");
499 case A_COMPOSE_NEWS
: return C_("Toolbar", "Compose");
500 case A_REPLY_MESSAGE
: return _("Reply");
501 case A_REPLY_SENDER
: return C_("Toolbar", "Sender");
502 case A_REPLY_ALL
: return _("All");
503 case A_REPLY_ML
: return _("List");
504 case A_OPEN_MAIL
: return _("Open");
505 case A_FORWARD
: return _("Forward");
506 case A_TRASH
: return C_("Toolbar", "Trash");
507 case A_DELETE_REAL
: return _("Delete");
508 case A_DELETE_DUP
: return _("Delete duplicates");
509 case A_EXECUTE
: return _("Execute");
510 case A_GOTO_PREV
: return _("Prev");
511 case A_GOTO_NEXT
: return _("Next");
513 case A_IGNORE_THREAD
: return _("Ignore thread");
514 case A_WATCH_THREAD
: return _("Watch thread");
515 case A_MARK
: return _("Mark");
516 case A_UNMARK
: return _("Unmark");
517 case A_LOCK
: return _("Lock");
518 case A_UNLOCK
: return _("Unlock");
519 case A_ALL_READ
: return _("All read");
520 case A_ALL_UNREAD
: return _("All unread");
521 case A_READ
: return _("Read");
522 case A_UNREAD
: return _("Unread");
523 case A_RUN_PROCESSING
: return _("Run proc. rules");
525 case A_PRINT
: return _("Print");
526 case A_LEARN_SPAM
: return _("Spam");
527 case A_GO_FOLDERS
: return _("Folders");
528 case A_PREFERENCES
: return _("Preferences");
530 case A_SEND
: return _("Send");
531 case A_SEND_LATER
: return _("Send later");
532 case A_DRAFT
: return _("Draft");
533 case A_INSERT
: return _("Insert");
534 case A_ATTACH
: return _("Attach");
535 case A_SIG
: return _("Insert sig.");
536 case A_REP_SIG
: return _("Replace sig.");
537 case A_EXTEDITOR
: return _("Edit");
538 case A_LINEWRAP_CURRENT
:return _("Wrap para.");
539 case A_LINEWRAP_ALL
: return _("Wrap all");
540 case A_ADDRBOOK
: return _("Address");
542 case A_CHECK_SPELLING
: return _("Check spelling");
544 case A_PRIVACY_SIGN
: return _("Sign");
545 case A_PRIVACY_ENCRYPT
: return _("Encrypt");
547 case A_CANCEL_INC
: return _("Stop");
548 case A_CANCEL_SEND
: return _("Stop");
549 case A_CANCEL_ALL
: return _("Stop all");
550 case A_CLOSE
: return _("Close");
555 gint
toolbar_get_icon(int action
) {
557 case A_RECEIVE_ALL
: return STOCK_PIXMAP_MAIL_RECEIVE_ALL
;
558 case A_RECEIVE_CUR
: return STOCK_PIXMAP_MAIL_RECEIVE
;
559 case A_SEND_QUEUED
: return STOCK_PIXMAP_MAIL_SEND_QUEUE
;
560 case A_COMPOSE_EMAIL
: return STOCK_PIXMAP_MAIL_COMPOSE
;
561 case A_COMPOSE_NEWS
: return STOCK_PIXMAP_NEWS_COMPOSE
;
562 case A_REPLY_MESSAGE
: return STOCK_PIXMAP_MAIL_REPLY
;
563 case A_REPLY_SENDER
: return STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR
;
564 case A_REPLY_ALL
: return STOCK_PIXMAP_MAIL_REPLY_TO_ALL
;
565 case A_REPLY_ML
: return STOCK_PIXMAP_MAIL_REPLY_TO_LIST
;
566 case A_OPEN_MAIL
: return STOCK_PIXMAP_OPEN_MAIL
;
567 case A_FORWARD
: return STOCK_PIXMAP_MAIL_FORWARD
;
568 case A_TRASH
: return STOCK_PIXMAP_TRASH
;
569 case A_DELETE_REAL
: return STOCK_PIXMAP_DELETE
;
570 case A_DELETE_DUP
: return STOCK_PIXMAP_DELETE_DUP
;
571 case A_EXECUTE
: return STOCK_PIXMAP_EXEC
;
572 case A_GOTO_PREV
: return STOCK_PIXMAP_UP_ARROW
;
573 case A_GOTO_NEXT
: return STOCK_PIXMAP_DOWN_ARROW
;
575 case A_IGNORE_THREAD
: return STOCK_PIXMAP_MARK_IGNORETHREAD
;
576 case A_WATCH_THREAD
: return STOCK_PIXMAP_MARK_WATCHTHREAD
;
577 case A_MARK
: return STOCK_PIXMAP_MARK_MARK
;
578 case A_UNMARK
: return STOCK_PIXMAP_MARK_UNMARK
;
579 case A_LOCK
: return STOCK_PIXMAP_MARK_LOCKED
;
580 case A_UNLOCK
: return STOCK_PIXMAP_MARK_UNLOCKED
;
581 case A_ALL_READ
: return STOCK_PIXMAP_MARK_ALLREAD
;
582 case A_ALL_UNREAD
: return STOCK_PIXMAP_MARK_ALLUNREAD
;
583 case A_READ
: return STOCK_PIXMAP_MARK_READ
;
584 case A_UNREAD
: return STOCK_PIXMAP_MARK_UNREAD
;
585 case A_RUN_PROCESSING
: return STOCK_PIXMAP_DIR_OPEN
;
587 case A_PRINT
: return STOCK_PIXMAP_PRINTER_BTN
;
588 case A_LEARN_SPAM
: return STOCK_PIXMAP_SPAM_BTN
;
589 case A_GO_FOLDERS
: return STOCK_PIXMAP_GO_FOLDERS
;
590 case A_PREFERENCES
: return STOCK_PIXMAP_PREFERENCES
;
592 case A_SEND
: return STOCK_PIXMAP_MAIL_SEND
;
593 case A_SEND_LATER
: return STOCK_PIXMAP_MAIL_SEND_QUEUE
;
594 case A_DRAFT
: return STOCK_PIXMAP_MAIL_DRAFT
;
595 case A_INSERT
: return STOCK_PIXMAP_INSERT_FILE
;
596 case A_ATTACH
: return STOCK_PIXMAP_MAIL_ATTACH
;
597 case A_SIG
: return STOCK_PIXMAP_MAIL_SIGN
;
598 case A_REP_SIG
: return STOCK_PIXMAP_MAIL_SIGN
;
599 case A_EXTEDITOR
: return STOCK_PIXMAP_EDIT_EXTERN
;
600 case A_LINEWRAP_CURRENT
:return STOCK_PIXMAP_LINEWRAP_CURRENT
;
601 case A_LINEWRAP_ALL
: return STOCK_PIXMAP_LINEWRAP_ALL
;
602 case A_ADDRBOOK
: return STOCK_PIXMAP_ADDRESS_BOOK
;
604 case A_CHECK_SPELLING
: return STOCK_PIXMAP_CHECK_SPELLING
;
606 case A_PRIVACY_SIGN
: return STOCK_PIXMAP_MAIL_PRIVACY_SIGNED
;
607 case A_PRIVACY_ENCRYPT
: return STOCK_PIXMAP_MAIL_PRIVACY_ENCRYPTED
;
609 case A_CANCEL_INC
: return STOCK_PIXMAP_CANCEL
;
610 case A_CANCEL_SEND
: return STOCK_PIXMAP_CANCEL
;
611 case A_CANCEL_ALL
: return STOCK_PIXMAP_CANCEL
;
612 case A_CLOSE
: return STOCK_PIXMAP_CLOSE
;
617 static void toolbar_set_default_generic(ToolbarType toolbar_type
, DefaultToolbar
*default_toolbar
)
621 g_return_if_fail(default_toolbar
!= NULL
);
623 for (i
= 0; default_toolbar
[i
].action
!= N_ACTION_VAL
; i
++) {
625 ToolbarItem
*toolbar_item
= g_new0(ToolbarItem
, 1);
627 if (default_toolbar
[i
].action
!= A_SEPARATOR
) {
631 icon
= toolbar_get_icon(default_toolbar
[i
].action
);
633 file
= stock_pixmap_get_name((StockPixmap
)icon
);
635 toolbar_item
->file
= g_strdup(file
);
636 toolbar_item
->index
= default_toolbar
[i
].action
;
637 toolbar_item
->text
= g_strdup(toolbar_get_short_text(default_toolbar
[i
].action
));
639 toolbar_item
->file
= g_strdup(TOOLBAR_TAG_SEPARATOR
);
640 toolbar_item
->index
= A_SEPARATOR
;
643 if (toolbar_item
->index
!= -1) {
644 if (!toolbar_is_duplicate(toolbar_item
->index
, toolbar_type
)) {
645 toolbar_config
[toolbar_type
].item_list
=
646 g_slist_append(toolbar_config
[toolbar_type
].item_list
, toolbar_item
);
648 toolbar_item_destroy(toolbar_item
);
651 toolbar_item_destroy(toolbar_item
);
656 void toolbar_set_default(ToolbarType source
)
658 DefaultToolbar default_toolbar_main
[] = {
684 DefaultToolbar default_toolbar_compose
[] = {
702 DefaultToolbar default_toolbar_msgview
[] = {
720 if (source
== TOOLBAR_MAIN
)
721 toolbar_set_default_generic(TOOLBAR_MAIN
, default_toolbar_main
);
722 else if (source
== TOOLBAR_COMPOSE
)
723 toolbar_set_default_generic(TOOLBAR_COMPOSE
, default_toolbar_compose
);
724 else if (source
== TOOLBAR_MSGVIEW
)
725 toolbar_set_default_generic(TOOLBAR_MSGVIEW
, default_toolbar_msgview
);
728 void toolbar_save_config_file(ToolbarType source
)
733 gchar
*fileSpec
= NULL
;
735 debug_print("save Toolbar Configuration to %s\n", toolbar_config
[source
].conf_file
);
737 fileSpec
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
, toolbar_config
[source
].conf_file
, NULL
);
738 pfile
= prefs_write_open(fileSpec
);
741 if (fprintf(fp
, "<?xml version=\"1.0\" encoding=\"%s\" ?>\n", CS_INTERNAL
) < 0)
744 if (fprintf(fp
, "<%s>\n", TOOLBAR_TAG_INDEX
) < 0)
747 for (cur
= toolbar_config
[source
].item_list
; cur
!= NULL
; cur
= cur
->next
) {
748 ToolbarItem
*toolbar_item
= (ToolbarItem
*) cur
->data
;
750 if (toolbar_item
->index
!= A_SEPARATOR
) {
751 if (fprintf(fp
, "\t<%s %s=\"%s\" %s=\"",
753 TOOLBAR_ICON_FILE
, toolbar_item
->file
,
754 TOOLBAR_ICON_TEXT
) < 0)
756 if (xml_file_put_escape_str(fp
, toolbar_item
->text
) < 0)
758 if (fprintf(fp
, "\" %s=\"%s\"/>\n",
760 toolbar_ret_text_from_val(toolbar_item
->index
)) < 0)
763 if (fprintf(fp
, "\t<%s/>\n", TOOLBAR_TAG_SEPARATOR
) < 0)
768 if (fprintf(fp
, "</%s>\n", TOOLBAR_TAG_INDEX
) < 0)
772 if (prefs_file_close (pfile
) < 0 )
773 g_warning("failed to write toolbar configuration to file");
777 FILE_OP_ERROR(fileSpec
, "fprintf");
779 prefs_file_close_revert (pfile
);
782 g_warning("failed to open toolbar configuration file for writing");
786 void toolbar_read_config_file(ToolbarType source
)
788 XMLFile
*file
= NULL
;
789 gchar
*fileSpec
= NULL
;
791 gboolean rewrite
= FALSE
;
793 debug_print("read Toolbar Configuration from %s\n", toolbar_config
[source
].conf_file
);
795 fileSpec
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
, toolbar_config
[source
].conf_file
, NULL
);
796 file
= xml_open_file(fileSpec
);
799 toolbar_clear_list(source
);
803 || (xml_get_dtd(file
))
804 || (xml_parse_next_tag(file
))
805 || (!xml_compare_tag(file
, TOOLBAR_TAG_INDEX
))) {
806 xml_close_file(file
);
814 if (xml_parse_next_tag(file
))
817 /* Get next tag (icon, icon_text or icon_action) */
818 if (xml_compare_tag(file
, TOOLBAR_TAG_ITEM
)) {
819 toolbar_parse_item(file
, source
, &rewrite
);
820 } else if (xml_compare_tag(file
, TOOLBAR_TAG_SEPARATOR
)) {
821 ToolbarItem
*item
= g_new0(ToolbarItem
, 1);
823 item
->file
= g_strdup(TOOLBAR_TAG_SEPARATOR
);
824 item
->index
= A_SEPARATOR
;
825 toolbar_config
[source
].item_list
=
826 g_slist_append(toolbar_config
[source
].item_list
, item
);
830 xml_close_file(file
);
832 debug_print("toolbar_read_config_file: rewriting toolbar\n");
833 toolbar_save_config_file(source
);
837 if ((!file
) || (g_slist_length(toolbar_config
[source
].item_list
) == 0)) {
839 if (source
== TOOLBAR_MAIN
)
840 toolbar_set_default(TOOLBAR_MAIN
);
841 else if (source
== TOOLBAR_COMPOSE
)
842 toolbar_set_default(TOOLBAR_COMPOSE
);
843 else if (source
== TOOLBAR_MSGVIEW
)
844 toolbar_set_default(TOOLBAR_MSGVIEW
);
846 g_warning("refusing to write unknown Toolbar Configuration number %d", source
);
850 toolbar_save_config_file(source
);
855 * clears list of toolbar items read from configuration files
857 void toolbar_clear_list(ToolbarType source
)
859 while (toolbar_config
[source
].item_list
!= NULL
) {
860 ToolbarItem
*item
= (ToolbarItem
*) toolbar_config
[source
].item_list
->data
;
862 toolbar_config
[source
].item_list
=
863 g_slist_remove(toolbar_config
[source
].item_list
, item
);
865 toolbar_item_destroy(item
);
867 g_slist_free(toolbar_config
[source
].item_list
);
872 * return list of Toolbar items
874 GSList
*toolbar_get_list(ToolbarType source
)
878 if ((source
== TOOLBAR_MAIN
) || (source
== TOOLBAR_COMPOSE
) || (source
== TOOLBAR_MSGVIEW
))
879 list
= toolbar_config
[source
].item_list
;
884 void toolbar_set_list_item(ToolbarItem
*t_item
, ToolbarType source
)
886 ToolbarItem
*toolbar_item
= g_new0(ToolbarItem
, 1);
888 toolbar_item
->file
= g_strdup(t_item
->file
);
889 toolbar_item
->text
= g_strdup(t_item
->text
);
890 toolbar_item
->index
= t_item
->index
;
892 toolbar_config
[source
].item_list
=
893 g_slist_append(toolbar_config
[source
].item_list
,
897 static void toolbar_action_execute(GtkWidget
*widget
,
905 for (cur
= action_list
; cur
!= NULL
; cur
= cur
->next
) {
906 ToolbarClawsActions
*act
= (ToolbarClawsActions
*)cur
->data
;
908 if (widget
== act
->widget
) {
909 i
= prefs_actions_find_by_name(act
->name
);
917 actions_execute(data
, i
, widget
, source
);
919 g_warning("error: did not find Action to execute");
922 gboolean
toolbar_check_action_btns(ToolbarType type
)
924 GSList
*temp
, *curr
, *list
= toolbar_config
[type
].item_list
;
925 gboolean modified
= FALSE
;
928 while (curr
!= NULL
) {
929 ToolbarItem
*toolbar_item
= (ToolbarItem
*) curr
->data
;
933 if (toolbar_item
->index
!= A_CLAWS_ACTIONS
)
936 if (prefs_actions_find_by_name(toolbar_item
->text
) == -1) {
937 list
= g_slist_delete_link(list
, temp
);
938 g_free(toolbar_item
->file
);
939 g_free(toolbar_item
->text
);
940 g_free(toolbar_item
);
948 #define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
949 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), tip); \
952 #define CLAWS_SET_ARROW_TIP(widget,tip) { \
953 gtk_menu_tool_button_set_arrow_tooltip_text(GTK_MENU_TOOL_BUTTON(widget), tip); \
956 static void activate_compose_button (Toolbar
*toolbar
,
958 ComposeButtonType type
)
960 if ((!toolbar
->compose_mail_btn
))
963 if (type
== COMPOSEBUTTON_NEWS
) {
964 gtk_tool_button_set_icon_widget(
965 GTK_TOOL_BUTTON(toolbar
->compose_mail_btn
),
966 toolbar
->compose_news_icon
);
968 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar
->compose_mail_btn
), _("Compose News message"));
970 gtk_widget_show(toolbar
->compose_news_icon
);
972 gtk_tool_button_set_icon_widget(
973 GTK_TOOL_BUTTON(toolbar
->compose_mail_btn
),
974 toolbar
->compose_mail_icon
);
976 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar
->compose_mail_btn
), _("Compose Email"));
978 gtk_widget_show(toolbar
->compose_mail_icon
);
980 toolbar
->compose_btn_type
= type
;
983 void toolbar_set_compose_button(Toolbar
*toolbar
,
984 ComposeButtonType compose_btn_type
)
986 if (toolbar
->compose_btn_type
!= compose_btn_type
)
987 activate_compose_button(toolbar
,
988 prefs_common
.toolbar_style
,
992 static void activate_learn_button (Toolbar
*toolbar
,
994 LearnButtonType type
)
996 if ((!toolbar
->learn_spam_btn
))
999 if (type
== LEARN_SPAM
) {
1000 gtk_tool_button_set_icon_widget(
1001 GTK_TOOL_BUTTON(toolbar
->learn_spam_btn
),
1002 toolbar
->learn_spam_icon
);
1003 gtk_tool_button_set_label(
1004 GTK_TOOL_BUTTON(toolbar
->learn_spam_btn
),
1006 #ifndef GENERIC_UMPC
1007 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar
->learn_spam_btn
), _("Learn spam"));
1009 gtk_widget_show(toolbar
->learn_spam_icon
);
1011 gtk_tool_button_set_icon_widget(
1012 GTK_TOOL_BUTTON(toolbar
->learn_spam_btn
),
1013 toolbar
->learn_ham_icon
);
1014 gtk_tool_button_set_label(
1015 GTK_TOOL_BUTTON(toolbar
->learn_spam_btn
),
1017 #ifndef GENERIC_UMPC
1018 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar
->learn_spam_btn
), _("Learn ham"));
1020 gtk_widget_show(toolbar
->learn_ham_icon
);
1022 toolbar
->learn_btn_type
= type
;
1025 void toolbar_set_learn_button(Toolbar
*toolbar
,
1026 LearnButtonType learn_btn_type
)
1028 if (toolbar
->learn_btn_type
!= learn_btn_type
)
1029 activate_learn_button(toolbar
,
1030 prefs_common
.toolbar_style
,
1034 void toolbar_toggle(guint action
, gpointer data
)
1036 MainWindow
*mainwin
= (MainWindow
*)data
;
1040 cm_return_if_fail(mainwin
!= NULL
);
1042 toolbar_style(TOOLBAR_MAIN
, action
, mainwin
);
1044 list
= compose_get_compose_list();
1045 for (cur
= list
; cur
!= NULL
; cur
= cur
->next
) {
1046 toolbar_style(TOOLBAR_COMPOSE
, action
, cur
->data
);
1048 list
= messageview_get_msgview_list();
1049 for (cur
= list
; cur
!= NULL
; cur
= cur
->next
) {
1050 toolbar_style(TOOLBAR_MSGVIEW
, action
, cur
->data
);
1055 void toolbar_set_style(GtkWidget
*toolbar_wid
, GtkWidget
*handlebox_wid
, guint action
)
1057 switch ((ToolbarStyle
)action
) {
1059 gtk_widget_hide(handlebox_wid
);
1062 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid
),
1066 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid
),
1070 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid
),
1073 case TOOLBAR_BOTH_HORIZ
:
1074 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid
),
1075 GTK_TOOLBAR_BOTH_HORIZ
);
1081 prefs_common
.toolbar_style
= (ToolbarStyle
)action
;
1082 gtk_widget_set_size_request(handlebox_wid
, 1, -1);
1084 if (prefs_common
.toolbar_style
!= TOOLBAR_NONE
) {
1085 gtk_widget_show(handlebox_wid
);
1086 gtk_widget_queue_resize(handlebox_wid
);
1090 * Change the style of toolbar
1092 static void toolbar_style(ToolbarType type
, guint action
, gpointer data
)
1094 GtkWidget
*handlebox_wid
;
1095 GtkWidget
*toolbar_wid
;
1096 MainWindow
*mainwin
= (MainWindow
*)data
;
1097 Compose
*compose
= (Compose
*)data
;
1098 MessageView
*msgview
= (MessageView
*)data
;
1100 cm_return_if_fail(data
!= NULL
);
1104 handlebox_wid
= mainwin
->handlebox
;
1105 toolbar_wid
= mainwin
->toolbar
->toolbar
;
1107 case TOOLBAR_COMPOSE
:
1108 handlebox_wid
= compose
->handlebox
;
1109 toolbar_wid
= compose
->toolbar
->toolbar
;
1111 case TOOLBAR_MSGVIEW
:
1112 handlebox_wid
= msgview
->handlebox
;
1113 toolbar_wid
= msgview
->toolbar
->toolbar
;
1119 toolbar_set_style(toolbar_wid
, handlebox_wid
, action
);
1122 /* Toolbar handling */
1123 static void toolbar_inc_cb(GtkWidget
*widget
,
1126 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1127 MainWindow
*mainwin
;
1129 cm_return_if_fail(toolbar_item
!= NULL
);
1131 switch (toolbar_item
->type
) {
1133 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1134 inc_mail_cb(mainwin
, 0, NULL
);
1141 static void toolbar_inc_all_cb(GtkWidget
*widget
,
1144 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1145 MainWindow
*mainwin
;
1147 cm_return_if_fail(toolbar_item
!= NULL
);
1149 switch (toolbar_item
->type
) {
1151 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1152 inc_all_account_mail_cb(mainwin
, 0, NULL
);
1159 static void toolbar_send_queued_cb(GtkWidget
*widget
,gpointer data
)
1161 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1162 MainWindow
*mainwin
;
1164 cm_return_if_fail(toolbar_item
!= NULL
);
1166 switch (toolbar_item
->type
) {
1168 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1169 send_queue_cb(mainwin
, 0, NULL
);
1176 static void toolbar_exec_cb(GtkWidget
*widget
,
1179 MainWindow
*mainwin
= get_mainwin(data
);
1181 cm_return_if_fail(mainwin
!= NULL
);
1182 summary_execute(mainwin
->summaryview
);
1186 * Delete current/selected(s) message(s)
1188 static void toolbar_trash_cb(GtkWidget
*widget
, gpointer data
)
1190 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1191 MainWindow
*mainwin
;
1193 cm_return_if_fail(toolbar_item
!= NULL
);
1194 cm_return_if_fail(toolbar_item
->parent
);
1196 switch (toolbar_item
->type
) {
1197 case TOOLBAR_MSGVIEW
:
1198 messageview_delete((MessageView
*)toolbar_item
->parent
);
1201 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1202 summary_delete_trash(mainwin
->summaryview
);
1205 debug_print("toolbar event not supported\n");
1211 * Delete current/selected(s) message(s)
1213 static void toolbar_delete_cb(GtkWidget
*widget
, gpointer data
)
1215 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1216 MainWindow
*mainwin
;
1218 cm_return_if_fail(toolbar_item
!= NULL
);
1219 cm_return_if_fail(toolbar_item
->parent
);
1221 switch (toolbar_item
->type
) {
1222 case TOOLBAR_MSGVIEW
:
1223 messageview_delete((MessageView
*)toolbar_item
->parent
);
1226 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1227 summary_delete(mainwin
->summaryview
);
1230 debug_print("toolbar event not supported\n");
1235 static void toolbar_delete_dup(gpointer data
, guint all
)
1237 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1238 MainWindow
*mainwin
= NULL
;
1240 cm_return_if_fail(toolbar_item
!= NULL
);
1242 switch (toolbar_item
->type
) {
1244 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1246 mainwindow_delete_duplicated_all(mainwin
);
1248 mainwindow_delete_duplicated(mainwin
);
1250 case TOOLBAR_COMPOSE
:
1251 case TOOLBAR_MSGVIEW
:
1254 debug_print("toolbar event not supported\n");
1259 static void toolbar_delete_dup_cb(GtkWidget
*widget
, gpointer data
)
1261 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1262 MainWindow
*mainwin
= NULL
;
1264 cm_return_if_fail(toolbar_item
!= NULL
);
1266 switch (toolbar_item
->type
) {
1268 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1269 mainwindow_delete_duplicated(mainwin
);
1271 case TOOLBAR_COMPOSE
:
1272 case TOOLBAR_MSGVIEW
:
1280 * Compose new message
1282 static void toolbar_compose_cb(GtkWidget
*widget
, gpointer data
)
1284 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1285 MainWindow
*mainwin
;
1286 MessageView
*msgview
;
1288 cm_return_if_fail(toolbar_item
!= NULL
);
1290 switch (toolbar_item
->type
) {
1292 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1293 if (mainwin
->toolbar
->compose_btn_type
== COMPOSEBUTTON_NEWS
)
1294 compose_news_cb(mainwin
, 0, NULL
);
1296 compose_mail_cb(mainwin
, 0, NULL
);
1298 case TOOLBAR_MSGVIEW
:
1299 msgview
= (MessageView
*)toolbar_item
->parent
;
1300 compose_new_with_folderitem(NULL
,
1301 msgview
->msginfo
->folder
, NULL
);
1304 debug_print("toolbar event not supported\n");
1308 static void toolbar_learn(gpointer data
, guint as_spam
)
1310 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1311 MainWindow
*mainwin
;
1312 MessageView
*msgview
;
1314 cm_return_if_fail(toolbar_item
!= NULL
);
1316 switch (toolbar_item
->type
) {
1318 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1320 mainwindow_learn(mainwin
, TRUE
);
1322 mainwindow_learn(mainwin
, FALSE
);
1324 case TOOLBAR_MSGVIEW
:
1325 msgview
= (MessageView
*)toolbar_item
->parent
;
1327 messageview_learn(msgview
, TRUE
);
1329 messageview_learn(msgview
, FALSE
);
1332 debug_print("toolbar event not supported\n");
1336 static void toolbar_learn_cb(GtkWidget
*widget
, gpointer data
)
1338 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1339 MainWindow
*mainwin
;
1340 MessageView
*msgview
;
1342 cm_return_if_fail(toolbar_item
!= NULL
);
1344 switch (toolbar_item
->type
) {
1346 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1347 if (mainwin
->toolbar
->learn_btn_type
== LEARN_SPAM
)
1348 mainwindow_learn(mainwin
, TRUE
);
1350 mainwindow_learn(mainwin
, FALSE
);
1352 case TOOLBAR_MSGVIEW
:
1353 msgview
= (MessageView
*)toolbar_item
->parent
;
1354 if (msgview
->toolbar
->learn_btn_type
== LEARN_SPAM
)
1355 messageview_learn(msgview
, TRUE
);
1357 messageview_learn(msgview
, FALSE
);
1360 debug_print("toolbar event not supported\n");
1368 static void toolbar_reply_cb(GtkWidget
*widget
, gpointer data
)
1370 toolbar_reply(data
, (prefs_common
.reply_with_quote
?
1371 COMPOSE_REPLY_WITH_QUOTE
: COMPOSE_REPLY_WITHOUT_QUOTE
));
1376 * Reply message to Sender and All recipients
1378 static void toolbar_reply_to_all_cb(GtkWidget
*widget
, gpointer data
)
1381 (prefs_common
.reply_with_quote
? COMPOSE_REPLY_TO_ALL_WITH_QUOTE
1382 : COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE
));
1387 * Reply to Mailing List
1389 static void toolbar_reply_to_list_cb(GtkWidget
*widget
, gpointer data
)
1392 (prefs_common
.reply_with_quote
? COMPOSE_REPLY_TO_LIST_WITH_QUOTE
1393 : COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE
));
1398 * Reply to sender of message
1400 static void toolbar_reply_to_sender_cb(GtkWidget
*widget
, gpointer data
)
1403 (prefs_common
.reply_with_quote
? COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
1404 : COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE
));
1410 static void toolbar_addrbook_cb(GtkWidget
*widget
, gpointer data
)
1412 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1415 cm_return_if_fail(toolbar_item
!= NULL
);
1417 switch (toolbar_item
->type
) {
1419 case TOOLBAR_MSGVIEW
:
1422 case TOOLBAR_COMPOSE
:
1423 compose
= (Compose
*)toolbar_item
->parent
;
1428 #ifndef USE_ALT_ADDRBOOK
1429 addressbook_open(compose
);
1431 GError
* error
= NULL
;
1432 addressbook_connect_signals(compose
);
1433 addressbook_dbus_open(TRUE
, &error
);
1435 g_warning("%s", error
->message
);
1436 g_error_free(error
);
1443 * Forward current/selected(s) message(s)
1445 static void toolbar_forward_cb(GtkWidget
*widget
, gpointer data
)
1447 toolbar_reply(data
, (COMPOSE_FORWARD
));
1451 * Goto Prev Unread Message
1453 static void toolbar_prev_unread_cb(GtkWidget
*widget
, gpointer data
)
1455 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1456 MainWindow
*mainwin
;
1457 MessageView
*msgview
;
1459 cm_return_if_fail(toolbar_item
!= NULL
);
1461 switch (toolbar_item
->type
) {
1463 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1464 summary_select_prev_unread(mainwin
->summaryview
);
1467 case TOOLBAR_MSGVIEW
:
1468 msgview
= (MessageView
*)toolbar_item
->parent
;
1469 msgview
->updating
= TRUE
;
1470 summary_select_prev_unread(msgview
->mainwin
->summaryview
);
1471 msgview
->updating
= FALSE
;
1473 if (msgview
->deferred_destroy
) {
1474 debug_print("messageview got away!\n");
1475 messageview_destroy(msgview
);
1479 /* Now we need to update the messageview window */
1480 if (msgview
->mainwin
->summaryview
->selected
) {
1481 #ifndef GENERIC_UMPC
1482 MsgInfo
* msginfo
= summary_get_selected_msg(msgview
->mainwin
->summaryview
);
1485 messageview_show(msgview
, msginfo
,
1486 msgview
->all_headers
);
1489 gtk_widget_destroy(msgview
->window
);
1493 debug_print("toolbar event not supported\n");
1498 * Goto Next Unread Message
1500 static void toolbar_next_unread_cb(GtkWidget
*widget
, gpointer data
)
1502 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1503 MainWindow
*mainwin
;
1504 MessageView
*msgview
;
1506 cm_return_if_fail(toolbar_item
!= NULL
);
1508 switch (toolbar_item
->type
) {
1510 mainwin
= (MainWindow
*)toolbar_item
->parent
;
1511 summary_select_next_unread(mainwin
->summaryview
);
1514 case TOOLBAR_MSGVIEW
:
1515 msgview
= (MessageView
*)toolbar_item
->parent
;
1516 msgview
->updating
= TRUE
;
1517 summary_select_next_unread(msgview
->mainwin
->summaryview
);
1518 msgview
->updating
= FALSE
;
1520 if (msgview
->deferred_destroy
) {
1521 debug_print("messageview got away!\n");
1522 messageview_destroy(msgview
);
1526 /* Now we need to update the messageview window */
1527 if (msgview
->mainwin
->summaryview
->selected
) {
1528 #ifndef GENERIC_UMPC
1529 MsgInfo
* msginfo
= summary_get_selected_msg(msgview
->mainwin
->summaryview
);
1532 messageview_show(msgview
, msginfo
,
1533 msgview
->all_headers
);
1536 gtk_widget_destroy(msgview
->window
);
1540 debug_print("toolbar event not supported\n");
1544 static void toolbar_ignore_thread_cb(GtkWidget
*widget
, gpointer data
)
1546 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1547 MainWindow
*mainwin
;
1549 cm_return_if_fail(toolbar_item
!= NULL
);
1551 switch (toolbar_item
->type
) {
1553 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1554 summary_toggle_ignore_thread(mainwin
->summaryview
);
1556 case TOOLBAR_MSGVIEW
:
1557 /* TODO: see toolbar_next_unread_cb() if you need
1558 * this in the message view */
1561 debug_print("toolbar event not supported\n");
1566 static void toolbar_watch_thread_cb(GtkWidget
*widget
, gpointer data
)
1568 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1569 MainWindow
*mainwin
;
1571 cm_return_if_fail(toolbar_item
!= NULL
);
1573 switch (toolbar_item
->type
) {
1575 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1576 summary_toggle_watch_thread(mainwin
->summaryview
);
1578 case TOOLBAR_MSGVIEW
:
1579 /* TODO: see toolbar_next_unread_cb() if you need
1580 * this in the message view */
1583 debug_print("toolbar event not supported\n");
1588 static void toolbar_mark_cb(GtkWidget
*widget
, gpointer data
)
1590 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1591 MainWindow
*mainwin
;
1593 cm_return_if_fail(toolbar_item
!= NULL
);
1595 switch (toolbar_item
->type
) {
1597 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1598 summary_mark(mainwin
->summaryview
);
1600 case TOOLBAR_MSGVIEW
:
1601 /* TODO: see toolbar_next_unread_cb() if you need
1602 * this in the message view */
1605 debug_print("toolbar event not supported\n");
1610 static void toolbar_unmark_cb(GtkWidget
*widget
, gpointer data
)
1612 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1613 MainWindow
*mainwin
;
1615 cm_return_if_fail(toolbar_item
!= NULL
);
1617 switch (toolbar_item
->type
) {
1619 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1620 summary_unmark(mainwin
->summaryview
);
1622 case TOOLBAR_MSGVIEW
:
1623 /* TODO: see toolbar_next_unread_cb() if you need
1624 * this in the message view */
1627 debug_print("toolbar event not supported\n");
1632 static void toolbar_lock_cb(GtkWidget
*widget
, gpointer data
)
1634 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1635 MainWindow
*mainwin
;
1637 cm_return_if_fail(toolbar_item
!= NULL
);
1639 switch (toolbar_item
->type
) {
1641 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1642 summary_msgs_lock(mainwin
->summaryview
);
1644 case TOOLBAR_MSGVIEW
:
1645 /* TODO: see toolbar_next_unread_cb() if you need
1646 * this in the message view */
1649 debug_print("toolbar event not supported\n");
1654 static void toolbar_unlock_cb(GtkWidget
*widget
, gpointer data
)
1656 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1657 MainWindow
*mainwin
;
1659 cm_return_if_fail(toolbar_item
!= NULL
);
1661 switch (toolbar_item
->type
) {
1663 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1664 summary_msgs_unlock(mainwin
->summaryview
);
1666 case TOOLBAR_MSGVIEW
:
1667 /* TODO: see toolbar_next_unread_cb() if you need
1668 * this in the message view */
1671 debug_print("toolbar event not supported\n");
1676 static void toolbar_all_read_cb(GtkWidget
*widget
, gpointer data
)
1678 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1679 MainWindow
*mainwin
;
1681 cm_return_if_fail(toolbar_item
!= NULL
);
1683 switch (toolbar_item
->type
) {
1685 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1686 summary_mark_all_read(mainwin
->summaryview
, TRUE
);
1688 case TOOLBAR_MSGVIEW
:
1689 /* TODO: see toolbar_next_unread_cb() if you need
1690 * this in the message view */
1693 debug_print("toolbar event not supported\n");
1698 static void toolbar_all_unread_cb(GtkWidget
*widget
, gpointer data
)
1700 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1701 MainWindow
*mainwin
;
1703 cm_return_if_fail(toolbar_item
!= NULL
);
1705 switch (toolbar_item
->type
) {
1707 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1708 summary_mark_all_unread(mainwin
->summaryview
, TRUE
);
1710 case TOOLBAR_MSGVIEW
:
1711 /* TODO: see toolbar_next_unread_cb() if you need
1712 * this in the message view */
1715 debug_print("toolbar event not supported\n");
1720 static void toolbar_read_cb(GtkWidget
*widget
, gpointer data
)
1722 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1723 MainWindow
*mainwin
;
1725 cm_return_if_fail(toolbar_item
!= NULL
);
1727 switch (toolbar_item
->type
) {
1729 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1730 summary_mark_as_read(mainwin
->summaryview
);
1732 case TOOLBAR_MSGVIEW
:
1733 /* TODO: see toolbar_next_unread_cb() if you need
1734 * this in the message view */
1737 debug_print("toolbar event not supported\n");
1742 static void toolbar_unread_cb(GtkWidget
*widget
, gpointer data
)
1744 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1745 MainWindow
*mainwin
;
1747 cm_return_if_fail(toolbar_item
!= NULL
);
1749 switch (toolbar_item
->type
) {
1751 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1752 summary_mark_as_unread(mainwin
->summaryview
);
1754 case TOOLBAR_MSGVIEW
:
1755 /* TODO: see toolbar_next_unread_cb() if you need
1756 * this in the message view */
1759 debug_print("toolbar event not supported\n");
1764 static void toolbar_run_processing_cb(GtkWidget
*widget
, gpointer data
)
1766 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1767 MainWindow
*mainwin
;
1770 cm_return_if_fail(toolbar_item
!= NULL
);
1772 switch (toolbar_item
->type
) {
1774 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1775 item
= mainwin
->summaryview
->folder_item
;
1776 cm_return_if_fail(item
!= NULL
);
1777 item
->processing_pending
= TRUE
;
1778 folder_item_apply_processing(item
);
1779 item
->processing_pending
= FALSE
;
1782 debug_print("toolbar event not supported\n");
1787 static void toolbar_cancel_inc_cb(GtkWidget
*widget
, gpointer data
)
1789 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1791 cm_return_if_fail(toolbar_item
!= NULL
);
1796 static void toolbar_cancel_send_cb(GtkWidget
*widget
, gpointer data
)
1798 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1800 cm_return_if_fail(toolbar_item
!= NULL
);
1804 static void toolbar_cancel_all_cb(GtkWidget
*widget
, gpointer data
)
1806 toolbar_cancel_inc_cb(widget
, data
);
1807 toolbar_cancel_send_cb(widget
, data
);
1810 static void toolbar_print_cb(GtkWidget
*widget
, gpointer data
)
1812 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1813 MainWindow
*mainwin
;
1815 cm_return_if_fail(toolbar_item
!= NULL
);
1817 switch (toolbar_item
->type
) {
1819 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1820 summary_print(mainwin
->summaryview
);
1822 case TOOLBAR_MSGVIEW
:
1823 /* TODO: see toolbar_next_unread_cb() if you need
1824 * this in the message view */
1827 debug_print("toolbar event not supported\n");
1832 static void toolbar_send_cb(GtkWidget
*widget
, gpointer data
)
1834 compose_toolbar_cb(A_SEND
, data
);
1837 static void toolbar_send_later_cb(GtkWidget
*widget
, gpointer data
)
1839 compose_toolbar_cb(A_SEND_LATER
, data
);
1842 static void toolbar_draft_cb(GtkWidget
*widget
, gpointer data
)
1844 compose_toolbar_cb(A_DRAFT
, data
);
1847 static void toolbar_close_cb(GtkWidget
*widget
, gpointer data
)
1849 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1850 MainWindow
*mainwin
;
1851 MessageView
*messageview
;
1854 cm_return_if_fail(toolbar_item
!= NULL
);
1856 switch (toolbar_item
->type
) {
1858 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1859 app_will_exit(NULL
, mainwin
);
1861 case TOOLBAR_MSGVIEW
:
1862 messageview
= (MessageView
*)toolbar_item
->parent
;
1863 messageview_destroy(messageview
);
1865 case TOOLBAR_COMPOSE
:
1866 compose
= (Compose
*)toolbar_item
->parent
;
1867 compose_close_toolbar(compose
);
1872 static void toolbar_preferences_cb(GtkWidget
*widget
, gpointer data
)
1877 static void toolbar_open_mail_cb(GtkWidget
*widget
, gpointer data
)
1879 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1880 MainWindow
*mainwin
;
1882 cm_return_if_fail(toolbar_item
!= NULL
);
1884 switch (toolbar_item
->type
) {
1886 mainwin
= (MainWindow
*) toolbar_item
->parent
;
1887 summary_open_row(NULL
, mainwin
->summaryview
);
1889 case TOOLBAR_MSGVIEW
:
1890 debug_print("toolbar event not supported\n");
1892 case TOOLBAR_COMPOSE
:
1893 debug_print("toolbar event not supported\n");
1898 static void toolbar_insert_cb(GtkWidget
*widget
, gpointer data
)
1900 compose_toolbar_cb(A_INSERT
, data
);
1903 static void toolbar_attach_cb(GtkWidget
*widget
, gpointer data
)
1905 compose_toolbar_cb(A_ATTACH
, data
);
1908 static void toolbar_sig_cb(GtkWidget
*widget
, gpointer data
)
1910 compose_toolbar_cb(A_SIG
, data
);
1913 static void toolbar_replace_sig_cb(GtkWidget
*widget
, gpointer data
)
1915 compose_toolbar_cb(A_REP_SIG
, data
);
1918 static void toolbar_ext_editor_cb(GtkWidget
*widget
, gpointer data
)
1920 compose_toolbar_cb(A_EXTEDITOR
, data
);
1923 static void toolbar_linewrap_current_cb(GtkWidget
*widget
, gpointer data
)
1925 compose_toolbar_cb(A_LINEWRAP_CURRENT
, data
);
1928 static void toolbar_linewrap_all_cb(GtkWidget
*widget
, gpointer data
)
1930 compose_toolbar_cb(A_LINEWRAP_ALL
, data
);
1934 static void toolbar_check_spelling_cb(GtkWidget
*widget
, gpointer data
)
1936 compose_toolbar_cb(A_CHECK_SPELLING
, data
);
1940 static void toolbar_privacy_sign_cb(GtkWidget
*widget
, gpointer data
)
1942 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1943 Compose
*compose
= (Compose
*)toolbar_item
->parent
;
1944 gboolean state
= gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget
));
1946 cm_return_if_fail(compose
!= NULL
);
1947 compose_use_signing(compose
, state
);
1950 /* Any time the toggle button gets toggled, we want to update its tooltip. */
1951 static void toolbar_privacy_sign_toggled_cb(GtkWidget
*widget
, gpointer data
)
1953 gboolean state
= gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget
));
1956 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget
), _("Message will be signed"));
1958 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget
), _("Message will not be signed"));
1961 static void toolbar_privacy_encrypt_cb(GtkWidget
*widget
, gpointer data
)
1963 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1964 Compose
*compose
= (Compose
*)toolbar_item
->parent
;
1965 gboolean state
= gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget
));
1967 cm_return_if_fail(compose
!= NULL
);
1968 compose_use_encryption(compose
, state
);
1971 /* Any time the toggle button gets toggled, we want to update its tooltip. */
1972 static void toolbar_privacy_encrypt_toggled_cb(GtkWidget
*widget
, gpointer data
)
1974 gboolean state
= gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget
));
1977 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget
), _("Message will be encrypted"));
1979 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget
), _("Message will not be encrypted"));
1983 * Execute actions from toolbar
1985 static void toolbar_actions_execute_cb(GtkWidget
*widget
, gpointer data
)
1987 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
1988 GSList
*action_list
;
1989 MainWindow
*mainwin
;
1991 MessageView
*msgview
;
1992 gpointer parent
= toolbar_item
->parent
;
1994 cm_return_if_fail(toolbar_item
!= NULL
);
1996 switch (toolbar_item
->type
) {
1998 mainwin
= (MainWindow
*)parent
;
1999 action_list
= mainwin
->toolbar
->action_list
;
2001 case TOOLBAR_COMPOSE
:
2002 compose
= (Compose
*)parent
;
2003 action_list
= compose
->toolbar
->action_list
;
2005 case TOOLBAR_MSGVIEW
:
2006 msgview
= (MessageView
*)parent
;
2007 action_list
= msgview
->toolbar
->action_list
;
2010 debug_print("toolbar event not supported\n");
2013 toolbar_action_execute(widget
, action_list
, parent
, toolbar_item
->type
);
2016 static void toolbar_plugins_execute_cb(GtkWidget
*widget
, gpointer data
)
2018 ToolbarItem
*toolbar_item
= data
;
2019 prefs_toolbar_execute_plugin_item(toolbar_item
->parent
, toolbar_item
->type
, toolbar_item
->text
);
2022 static MainWindow
*get_mainwin(gpointer data
)
2024 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
2025 MainWindow
*mainwin
= NULL
;
2026 MessageView
*msgview
;
2028 cm_return_val_if_fail(toolbar_item
!= NULL
, NULL
);
2030 switch(toolbar_item
->type
) {
2032 mainwin
= (MainWindow
*)toolbar_item
->parent
;
2034 case TOOLBAR_MSGVIEW
:
2035 msgview
= (MessageView
*)toolbar_item
->parent
;
2036 mainwin
= (MainWindow
*)msgview
->mainwin
;
2045 static void toolbar_go_folders_cb(GtkWidget
*widget
, gpointer data
)
2047 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
2048 MainWindow
*mainwin
= NULL
;
2049 switch(toolbar_item
->type
) {
2051 mainwin
= (MainWindow
*)toolbar_item
->parent
;
2054 g_warning("wrong toolbar type");
2058 if (!mainwin
->in_folder
) {
2059 FolderItem
*item
= folderview_get_selected_item(mainwin
->folderview
);
2061 folderview_select(mainwin
->folderview
, item
);
2064 folderview_grab_focus(mainwin
->folderview
);
2065 mainwindow_exit_folder(mainwin
);
2069 static void toolbar_buttons_cb(GtkWidget
*widget
,
2076 void (*func
)(GtkWidget
*widget
, gpointer data
);
2078 { A_RECEIVE_ALL
, toolbar_inc_all_cb
},
2079 { A_RECEIVE_CUR
, toolbar_inc_cb
},
2080 { A_SEND_QUEUED
, toolbar_send_queued_cb
},
2081 { A_COMPOSE_EMAIL
, toolbar_compose_cb
},
2082 { A_COMPOSE_NEWS
, toolbar_compose_cb
},
2083 { A_REPLY_MESSAGE
, toolbar_reply_cb
},
2084 { A_REPLY_SENDER
, toolbar_reply_to_sender_cb
},
2085 { A_REPLY_ALL
, toolbar_reply_to_all_cb
},
2086 { A_REPLY_ML
, toolbar_reply_to_list_cb
},
2087 { A_FORWARD
, toolbar_forward_cb
},
2088 { A_TRASH
, toolbar_trash_cb
},
2089 { A_DELETE_REAL
, toolbar_delete_cb
},
2090 { A_EXECUTE
, toolbar_exec_cb
},
2091 { A_GOTO_PREV
, toolbar_prev_unread_cb
},
2092 { A_GOTO_NEXT
, toolbar_next_unread_cb
},
2093 { A_IGNORE_THREAD
, toolbar_ignore_thread_cb
},
2094 { A_WATCH_THREAD
, toolbar_watch_thread_cb
},
2095 { A_MARK
, toolbar_mark_cb
},
2096 { A_UNMARK
, toolbar_unmark_cb
},
2097 { A_LOCK
, toolbar_lock_cb
},
2098 { A_UNLOCK
, toolbar_unlock_cb
},
2099 { A_ALL_READ
, toolbar_all_read_cb
},
2100 { A_ALL_UNREAD
, toolbar_all_unread_cb
},
2101 { A_READ
, toolbar_read_cb
},
2102 { A_UNREAD
, toolbar_unread_cb
},
2103 { A_RUN_PROCESSING
, toolbar_run_processing_cb
},
2104 { A_PRINT
, toolbar_print_cb
},
2105 { A_LEARN_SPAM
, toolbar_learn_cb
},
2106 { A_DELETE_DUP
, toolbar_delete_dup_cb
},
2107 { A_GO_FOLDERS
, toolbar_go_folders_cb
},
2109 { A_SEND
, toolbar_send_cb
},
2110 { A_SEND_LATER
, toolbar_send_later_cb
},
2111 { A_DRAFT
, toolbar_draft_cb
},
2112 { A_OPEN_MAIL
, toolbar_open_mail_cb
},
2113 { A_CLOSE
, toolbar_close_cb
},
2114 { A_PREFERENCES
, toolbar_preferences_cb
},
2115 { A_INSERT
, toolbar_insert_cb
},
2116 { A_ATTACH
, toolbar_attach_cb
},
2117 { A_SIG
, toolbar_sig_cb
},
2118 { A_REP_SIG
, toolbar_replace_sig_cb
},
2119 { A_EXTEDITOR
, toolbar_ext_editor_cb
},
2120 { A_LINEWRAP_CURRENT
, toolbar_linewrap_current_cb
},
2121 { A_LINEWRAP_ALL
, toolbar_linewrap_all_cb
},
2122 { A_ADDRBOOK
, toolbar_addrbook_cb
},
2124 { A_CHECK_SPELLING
, toolbar_check_spelling_cb
},
2126 { A_PRIVACY_SIGN
, toolbar_privacy_sign_cb
},
2127 { A_PRIVACY_ENCRYPT
, toolbar_privacy_encrypt_cb
},
2128 { A_CLAWS_ACTIONS
, toolbar_actions_execute_cb
},
2129 { A_CANCEL_INC
, toolbar_cancel_inc_cb
},
2130 { A_CANCEL_SEND
, toolbar_cancel_send_cb
},
2131 { A_CANCEL_ALL
, toolbar_cancel_all_cb
},
2132 { A_CLAWS_PLUGINS
, toolbar_plugins_execute_cb
},
2135 num_items
= sizeof(callbacks
)/sizeof(callbacks
[0]);
2137 for (i
= 0; i
< num_items
; i
++) {
2138 if (callbacks
[i
].index
== item
->index
) {
2139 callbacks
[i
].func(widget
, item
);
2144 #ifndef GENERIC_UMPC
2145 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
2146 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
2147 gtk_widget_set_can_focus(gtk_bin_get_child(GTK_BIN(item)), FALSE); \
2148 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2149 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2150 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2151 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2152 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
2156 #define TOOLBAR_TOGGLE_ITEM(item,icon,text,tooltip) { \
2157 item = GTK_WIDGET(gtk_toggle_tool_button_new()); \
2158 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item), icon); \
2159 gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), text); \
2160 gtk_widget_set_can_focus(gtk_bin_get_child(GTK_BIN(item)), FALSE); \
2161 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2162 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2163 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2164 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2165 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
2169 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
2170 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
2171 GList *gchild = NULL; \
2172 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
2173 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2174 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2175 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2176 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2177 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
2179 CLAWS_SET_ARROW_TIP(GTK_MENU_TOOL_BUTTON(item), menutip); \
2180 child = gtk_bin_get_child(GTK_BIN(item)); \
2181 gchild = gtk_container_get_children( \
2182 GTK_CONTAINER(child)); \
2183 btn = (GtkWidget *)gchild->data; \
2184 gtk_widget_set_can_focus(btn, FALSE); \
2185 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
2186 gtk_widget_set_can_focus(arr, FALSE); \
2187 g_list_free(gchild); \
2188 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
2189 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
2190 g_list_free(gchild); \
2195 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
2196 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
2197 gtk_widget_set_can_focus(gtk_bin_get_child(GTK_BIN(item)), FALSE); \
2198 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2199 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2200 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2201 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2204 #define TOOLBAR_TOGGLE_ITEM(item,icon,text,tooltip) { \
2205 item = GTK_WIDGET(gtk_toggle_tool_button_new()); \
2206 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item), icon); \
2207 gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), text); \
2208 gtk_widget_set_can_focus(gtk_bin_get_child(GTK_BIN(item)), FALSE); \
2209 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2210 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2211 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2212 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2215 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
2216 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
2217 GList *gchild = NULL; \
2218 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
2219 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2220 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2221 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2222 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2223 child = gtk_bin_get_child(GTK_BIN(item)); \
2224 gchild = gtk_container_get_children( \
2225 GTK_CONTAINER(child)); \
2226 btn = (GtkWidget *)gchild->data; \
2227 gtk_widget_set_can_focus(btn, FALSE); \
2228 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
2229 gtk_widget_set_can_focus(arr, FALSE); \
2230 g_list_free(gchild); \
2231 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
2232 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
2233 g_list_free(gchild); \
2237 #define ADD_MENU_ITEM(name,cb,data) { \
2238 item = gtk_menu_item_new_with_mnemonic(name); \
2239 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); \
2240 g_signal_connect(G_OBJECT(item), "activate", \
2243 g_object_set_data(G_OBJECT(item), "int-value", GINT_TO_POINTER(data)); \
2244 gtk_widget_show(item); \
2247 #ifndef GENERIC_UMPC
2248 static void toolbar_reply_menu_cb(GtkWidget
*widget
, gpointer data
)
2250 gpointer int_value
= g_object_get_data(G_OBJECT(widget
), "int-value");
2251 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
2253 toolbar_reply(toolbar_item
, GPOINTER_TO_INT(int_value
));
2256 static void toolbar_delete_dup_menu_cb(GtkWidget
*widget
, gpointer data
)
2258 gpointer int_value
= g_object_get_data(G_OBJECT(widget
), "int-value");
2259 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
2261 toolbar_delete_dup(toolbar_item
, GPOINTER_TO_INT(int_value
));
2265 static void toolbar_learn_menu_cb(GtkWidget
*widget
, gpointer data
)
2267 gpointer int_value
= g_object_get_data(G_OBJECT(widget
), "int-value");
2268 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
2270 toolbar_learn(toolbar_item
, GPOINTER_TO_INT(int_value
));
2275 * Create a new toolbar with specified type
2276 * if a callback list is passed it will be used before the
2277 * common callback list
2279 Toolbar
*toolbar_create(ToolbarType type
,
2280 GtkWidget
*container
,
2283 ToolbarItem
*toolbar_item
;
2286 GtkWidget
*icon_wid
= NULL
;
2287 GtkWidget
*icon_news
;
2288 GtkWidget
*icon_ham
;
2290 ToolbarClawsActions
*action_item
;
2292 GSList
*toolbar_list
;
2293 Toolbar
*toolbar_data
;
2295 toolbar_read_config_file(type
);
2296 toolbar_list
= toolbar_get_list(type
);
2298 toolbar_data
= g_new0(Toolbar
, 1);
2300 toolbar
= gtk_toolbar_new();
2302 gtk_orientable_set_orientation(GTK_ORIENTABLE(toolbar
), GTK_ORIENTATION_HORIZONTAL
);
2304 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar
), GTK_TOOLBAR_BOTH
);
2305 gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar
), TRUE
);
2306 gtk_widget_set_hexpand(toolbar
, TRUE
);
2308 for (cur
= toolbar_list
; cur
!= NULL
; cur
= cur
->next
) {
2310 if (g_ascii_strcasecmp(((ToolbarItem
*)cur
->data
)->file
, TOOLBAR_TAG_SEPARATOR
) == 0) {
2311 gtk_toolbar_insert(GTK_TOOLBAR(toolbar
), gtk_separator_tool_item_new(), -1);
2315 toolbar_item
= g_new0(ToolbarItem
, 1);
2316 toolbar_item
->index
= ((ToolbarItem
*)cur
->data
)->index
;
2317 toolbar_item
->file
= g_strdup(((ToolbarItem
*)cur
->data
)->file
);
2318 toolbar_item
->text
= g_strdup(((ToolbarItem
*)cur
->data
)->text
);
2319 toolbar_item
->parent
= data
;
2320 toolbar_item
->type
= type
;
2322 /* collect toolbar items in list to keep track */
2323 toolbar_data
->item_list
=
2324 g_slist_append(toolbar_data
->item_list
,
2326 icon_wid
= stock_pixmap_widget(stock_pixmap_get_icon(toolbar_item
->file
));
2328 switch (toolbar_item
->index
) {
2331 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Go to folder list"));
2332 toolbar_data
->folders_btn
= item
;
2335 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2336 _("Receive Mail from all Accounts"),
2337 _("Receive Mail from selected Account"));
2338 toolbar_data
->getall_btn
= item
;
2341 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Receive Mail from current Account"));
2342 toolbar_data
->get_btn
= item
;
2345 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Send Queued Messages"));
2346 toolbar_data
->send_btn
= item
;
2349 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Close window"));
2350 toolbar_data
->close_window_btn
= item
;
2353 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Open preferences"));
2354 toolbar_data
->preferences_btn
= item
;
2357 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Open email"));
2358 toolbar_data
->open_mail_btn
= item
;
2360 case A_COMPOSE_EMAIL
:
2361 #ifndef GENERIC_UMPC
2362 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2364 _("Compose with selected Account"));
2365 toolbar_data
->compose_mail_btn
= item
;
2366 toolbar_data
->compose_mail_icon
= icon_wid
;
2367 g_object_ref_sink(toolbar_data
->compose_mail_icon
);
2369 icon_news
= stock_pixmap_widget(STOCK_PIXMAP_NEWS_COMPOSE
);
2370 toolbar_data
->compose_news_icon
= icon_news
;
2371 g_object_ref_sink(toolbar_data
->compose_news_icon
);
2373 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2374 _("Compose Email"));
2375 toolbar_data
->compose_mail_btn
= item
;
2376 toolbar_data
->compose_mail_icon
= icon_wid
;
2378 icon_news
= stock_pixmap_widget(STOCK_PIXMAP_NEWS_COMPOSE
);
2379 toolbar_data
->compose_news_icon
= icon_news
;
2383 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2386 toolbar_data
->learn_spam_btn
= item
;
2387 toolbar_data
->learn_spam_icon
= icon_wid
;
2388 g_object_ref_sink(toolbar_data
->learn_spam_icon
);
2390 icon_ham
= stock_pixmap_widget(STOCK_PIXMAP_HAM_BTN
);
2391 toolbar_data
->learn_ham_icon
= icon_ham
;
2392 g_object_ref_sink(toolbar_data
->learn_ham_icon
);
2394 menu
= gtk_menu_new();
2395 ADD_MENU_ITEM(_("Learn as _Spam"), toolbar_learn_menu_cb
, TRUE
);
2396 ADD_MENU_ITEM(_("Learn as _Ham"), toolbar_learn_menu_cb
, FALSE
);
2397 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->learn_spam_btn
), menu
);
2400 #ifndef GENERIC_UMPC
2401 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2402 _("Delete duplicates"),
2403 _("Delete duplicates options"));
2404 toolbar_data
->delete_dup_btn
= item
;
2406 menu
= gtk_menu_new();
2407 ADD_MENU_ITEM(_("Delete duplicates in selected folder"), toolbar_delete_dup_menu_cb
, FALSE
);
2408 ADD_MENU_ITEM(_("Delete duplicates in all folders"), toolbar_delete_dup_menu_cb
, TRUE
);
2409 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->delete_dup_btn
), menu
);
2411 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Delete duplicates"));
2412 toolbar_data
->delete_dup_btn
= item
;
2415 case A_REPLY_MESSAGE
:
2416 #ifndef GENERIC_UMPC
2417 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2418 _("Reply to Message"),
2419 _("Reply to Message options"));
2420 toolbar_data
->reply_btn
= item
;
2422 menu
= gtk_menu_new();
2423 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_WITH_QUOTE
);
2424 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_WITHOUT_QUOTE
);
2425 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->reply_btn
), menu
);
2427 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2428 _("Reply to Message"));
2429 toolbar_data
->reply_btn
= item
;
2432 case A_REPLY_SENDER
:
2433 #ifndef GENERIC_UMPC
2434 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2435 _("Reply to Sender"),
2436 _("Reply to Sender options"));
2437 toolbar_data
->replysender_btn
= item
;
2439 menu
= gtk_menu_new();
2440 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
);
2441 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE
);
2442 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->replysender_btn
), menu
);
2444 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2445 _("Reply to Sender"));
2446 toolbar_data
->replysender_btn
= item
;
2450 #ifndef GENERIC_UMPC
2451 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2453 _("Reply to All options"));
2454 toolbar_data
->replyall_btn
= item
;
2456 menu
= gtk_menu_new();
2457 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_ALL_WITH_QUOTE
);
2458 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE
);
2459 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->replyall_btn
), menu
);
2461 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2463 toolbar_data
->replyall_btn
= item
;
2467 #ifndef GENERIC_UMPC
2468 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2469 _("Reply to Mailing-list"),
2470 _("Reply to Mailing-list options"));
2471 toolbar_data
->replylist_btn
= item
;
2473 menu
= gtk_menu_new();
2474 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_LIST_WITH_QUOTE
);
2475 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb
, COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE
);
2476 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->replylist_btn
), menu
);
2478 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2479 _("Reply to Mailing-list"));
2480 toolbar_data
->replylist_btn
= item
;
2484 #ifndef GENERIC_UMPC
2485 TOOLBAR_MENUITEM(item
,icon_wid
,toolbar_item
->text
,
2486 _("Forward Message"),
2487 _("Forward Message options"));
2488 toolbar_data
->fwd_btn
= item
;
2490 menu
= gtk_menu_new();
2491 ADD_MENU_ITEM(_("_Forward"), toolbar_reply_menu_cb
, COMPOSE_FORWARD_INLINE
);
2492 ADD_MENU_ITEM(_("For_ward as attachment"), toolbar_reply_menu_cb
, COMPOSE_FORWARD_AS_ATTACH
);
2493 ADD_MENU_ITEM(_("Redirec_t"), toolbar_reply_menu_cb
, COMPOSE_REDIRECT
);
2494 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data
->fwd_btn
), menu
);
2496 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2497 _("Forward Message"));
2498 toolbar_data
->fwd_btn
= item
;
2502 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Trash Message"));
2503 toolbar_data
->trash_btn
= item
;
2506 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Delete Message"));
2507 toolbar_data
->delete_btn
= item
;
2510 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Execute"));
2511 toolbar_data
->exec_btn
= item
;
2514 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Go to Previous Unread Message"));
2515 toolbar_data
->prev_btn
= item
;
2518 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Go to Next Unread Message"));
2519 toolbar_data
->next_btn
= item
;
2522 /* Compose Toolbar */
2524 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Send Message"));
2525 toolbar_data
->send_btn
= item
;
2528 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Put into queue folder and send later"));
2529 toolbar_data
->sendl_btn
= item
;
2532 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Save to draft folder"));
2533 toolbar_data
->draft_btn
= item
;
2536 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Insert file"));
2537 toolbar_data
->insert_btn
= item
;
2540 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Attach file"));
2541 toolbar_data
->attach_btn
= item
;
2544 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Insert signature"));
2545 toolbar_data
->sig_btn
= item
;
2548 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Replace signature"));
2549 toolbar_data
->repsig_btn
= item
;
2552 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Edit with external editor"));
2553 toolbar_data
->exteditor_btn
= item
;
2555 case A_LINEWRAP_CURRENT
:
2556 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Wrap long lines of current paragraph"));
2557 toolbar_data
->linewrap_current_btn
= item
;
2559 case A_LINEWRAP_ALL
:
2560 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Wrap all long lines"));
2561 toolbar_data
->linewrap_all_btn
= item
;
2564 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Address book"));
2565 toolbar_data
->addrbook_btn
= item
;
2568 case A_CHECK_SPELLING
:
2569 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Check spelling"));
2570 toolbar_data
->spellcheck_btn
= item
;
2573 case A_PRIVACY_SIGN
:
2574 TOOLBAR_TOGGLE_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Sign"));
2575 g_signal_connect (G_OBJECT(item
), "toggled",
2576 G_CALLBACK(toolbar_privacy_sign_toggled_cb
), NULL
);
2577 /* Call the "toggled" handler to set correct tooltip. */
2578 toolbar_privacy_sign_toggled_cb(item
, NULL
);
2579 toolbar_data
->privacy_sign_btn
= item
;
2581 case A_PRIVACY_ENCRYPT
:
2582 TOOLBAR_TOGGLE_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Encrypt"));
2583 g_signal_connect (G_OBJECT(item
), "toggled",
2584 G_CALLBACK(toolbar_privacy_encrypt_toggled_cb
), NULL
);
2585 /* Call the "toggled" handler to set correct tooltip. */
2586 toolbar_privacy_encrypt_toggled_cb(item
, NULL
);
2587 toolbar_data
->privacy_encrypt_btn
= item
;
2590 case A_CLAWS_ACTIONS
:
2591 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,toolbar_item
->text
);
2592 action_item
= g_new0(ToolbarClawsActions
, 1);
2593 action_item
->widget
= item
;
2594 action_item
->name
= g_strdup(toolbar_item
->text
);
2596 toolbar_data
->action_list
=
2597 g_slist_append(toolbar_data
->action_list
,
2601 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Cancel receiving"));
2602 toolbar_data
->cancel_inc_btn
= item
;
2605 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Cancel sending"));
2606 toolbar_data
->cancel_send_btn
= item
;
2609 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,_("Cancel receiving/sending"));
2610 toolbar_data
->cancel_all_btn
= item
;
2612 case A_CLAWS_PLUGINS
:
2613 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
, toolbar_item
->text
);
2616 TOOLBAR_ITEM(item
,icon_wid
,toolbar_item
->text
,
2617 toolbar_ret_descr_from_val(toolbar_item
->index
));
2618 /* find and set the tool tip text */
2623 toolbar_data
->toolbar
= toolbar
;
2625 gtk_widget_show_all(toolbar
);
2627 if (type
== TOOLBAR_MAIN
) {
2629 MainWindow
*mainwin
= mainwindow_get_mainwindow();
2630 GtkWidget
*progressbar
= gtk_progress_bar_new();
2631 item
= GTK_WIDGET(gtk_tool_item_new());
2632 gtk_container_add (GTK_CONTAINER (item
), progressbar
);
2633 gtk_widget_show(item
);
2634 gtk_widget_set_size_request(progressbar
, 84, -1);
2635 gtk_toolbar_insert(GTK_TOOLBAR(toolbar
), GTK_TOOL_ITEM(item
), -1);
2636 mainwin
->progressbar
= progressbar
;
2638 activate_compose_button(toolbar_data
,
2639 prefs_common
.toolbar_style
,
2640 toolbar_data
->compose_btn_type
);
2642 if (type
!= TOOLBAR_COMPOSE
)
2643 activate_learn_button(toolbar_data
, prefs_common
.toolbar_style
,
2646 gtk_container_add(GTK_CONTAINER(container
), toolbar
);
2647 gtk_container_set_border_width(GTK_CONTAINER(container
), 0);
2649 return toolbar_data
;
2653 * Free toolbar structures
2656 #define UNREF_ICON(icon) if (toolbar->icon != NULL) \
2657 g_object_unref(toolbar->icon)
2659 void toolbar_destroy(Toolbar
* toolbar
)
2661 UNREF_ICON(compose_mail_icon
);
2662 UNREF_ICON(compose_news_icon
);
2663 UNREF_ICON(learn_spam_icon
);
2664 UNREF_ICON(learn_ham_icon
);
2665 TOOLBAR_DESTROY_ITEMS(toolbar
->item_list
);
2666 TOOLBAR_DESTROY_ACTIONS(toolbar
->action_list
);
2671 void toolbar_item_destroy(ToolbarItem
*item
)
2673 cm_return_if_fail(item
!= NULL
);
2682 void toolbar_update(ToolbarType type
, gpointer data
)
2684 Toolbar
*toolbar_data
;
2685 GtkWidget
*handlebox
;
2686 MainWindow
*mainwin
= (MainWindow
*)data
;
2687 Compose
*compose
= (Compose
*)data
;
2688 MessageView
*msgview
= (MessageView
*)data
;
2690 #ifndef GENERIC_UMPC
2693 toolbar_data
= mainwin
->toolbar
;
2694 handlebox
= mainwin
->handlebox
;
2696 case TOOLBAR_COMPOSE
:
2697 toolbar_data
= compose
->toolbar
;
2698 handlebox
= compose
->handlebox
;
2700 case TOOLBAR_MSGVIEW
:
2701 toolbar_data
= msgview
->toolbar
;
2702 handlebox
= msgview
->handlebox
;
2708 gtk_container_remove(GTK_CONTAINER(handlebox
),
2709 GTK_WIDGET(toolbar_data
->toolbar
));
2711 toolbar_init(toolbar_data
);
2712 toolbar_data
= toolbar_create(type
, handlebox
, data
);
2716 toolbar_data
= mainwin
->toolbar
;
2717 handlebox
= mainwin
->window
;
2719 case TOOLBAR_COMPOSE
:
2720 toolbar_data
= compose
->toolbar
;
2721 handlebox
= compose
->window
;
2723 case TOOLBAR_MSGVIEW
:
2724 toolbar_data
= msgview
->toolbar
;
2725 handlebox
= msgview
->window
;
2730 toolbar_init(toolbar_data
);
2731 toolbar_data
= toolbar_create(type
, handlebox
, data
);
2736 mainwin
->toolbar
= toolbar_data
;
2738 case TOOLBAR_COMPOSE
:
2739 compose
->toolbar
= toolbar_data
;
2741 case TOOLBAR_MSGVIEW
:
2742 msgview
->toolbar
= toolbar_data
;
2746 toolbar_style(type
, prefs_common
.toolbar_style
, data
);
2748 if (type
== TOOLBAR_MAIN
) {
2749 toolbar_main_set_sensitive((MainWindow
*)data
);
2750 account_set_menu_only_toolbar();
2754 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
2755 gtk_widget_set_sensitive(widget, sensitive); \
2758 void toolbar_main_set_sensitive(gpointer data
)
2760 SensitiveCondMask state
;
2762 MainWindow
*mainwin
= (MainWindow
*)data
;
2763 Toolbar
*toolbar
= mainwin
->toolbar
;
2765 GSList
*entry_list
= NULL
;
2767 typedef struct _Entry Entry
;
2770 SensitiveCondMask cond
;
2774 #define SET_WIDGET_COND(w, ...) \
2776 Entry *e = g_new0(Entry, 1); \
2778 e->cond = main_window_get_mask(__VA_ARGS__, -1); \
2779 entry_list = g_slist_append(entry_list, e); \
2782 /* match all bit flags */
2784 if (toolbar
->get_btn
)
2785 SET_WIDGET_COND(toolbar
->get_btn
,
2786 M_HAVE_ACCOUNT
, M_UNLOCKED
, M_HAVE_RETRIEVABLE_ACCOUNT
);
2788 if (toolbar
->getall_btn
) {
2789 SET_WIDGET_COND(toolbar
->getall_btn
,
2790 M_HAVE_ACCOUNT
, M_UNLOCKED
, M_HAVE_ANY_RETRIEVABLE_ACCOUNT
);
2792 if (toolbar
->send_btn
) {
2793 SET_WIDGET_COND(toolbar
->send_btn
,
2794 M_HAVE_QUEUED_MAILS
);
2796 if (toolbar
->compose_mail_btn
) {
2797 SET_WIDGET_COND(toolbar
->compose_mail_btn
,
2800 if (toolbar
->close_window_btn
) {
2801 SET_WIDGET_COND(toolbar
->close_window_btn
,
2804 if (toolbar
->open_mail_btn
) {
2805 SET_WIDGET_COND(toolbar
->open_mail_btn
,
2806 M_TARGET_EXIST
, M_SUMMARY_ISLIST
);
2808 if (toolbar
->reply_btn
) {
2809 SET_WIDGET_COND(toolbar
->reply_btn
,
2810 M_HAVE_ACCOUNT
, M_TARGET_EXIST
, M_SUMMARY_ISLIST
);
2812 if (toolbar
->replyall_btn
) {
2813 SET_WIDGET_COND(toolbar
->replyall_btn
,
2814 M_HAVE_ACCOUNT
, M_TARGET_EXIST
, M_SUMMARY_ISLIST
);
2816 if (toolbar
->replylist_btn
) {
2817 SET_WIDGET_COND(toolbar
->replylist_btn
,
2818 M_HAVE_ACCOUNT
, M_TARGET_EXIST
, M_SUMMARY_ISLIST
);
2820 if (toolbar
->replysender_btn
) {
2821 SET_WIDGET_COND(toolbar
->replysender_btn
,
2822 M_HAVE_ACCOUNT
, M_TARGET_EXIST
, M_SUMMARY_ISLIST
);
2824 if (toolbar
->fwd_btn
) {
2825 SET_WIDGET_COND(toolbar
->fwd_btn
,
2826 M_HAVE_ACCOUNT
, M_TARGET_EXIST
, M_SUMMARY_ISLIST
);
2829 if (prefs_common
.next_unread_msg_dialog
== NEXTUNREADMSGDIALOG_ASSUME_NO
) {
2830 SET_WIDGET_COND(toolbar
->next_btn
, M_MSG_EXIST
, M_SUMMARY_ISLIST
);
2832 SET_WIDGET_COND(toolbar
->next_btn
, -1);
2835 if (toolbar
->trash_btn
)
2836 SET_WIDGET_COND(toolbar
->trash_btn
,
2837 M_TARGET_EXIST
, M_ALLOW_DELETE
, M_NOT_NEWS
);
2839 if (toolbar
->delete_btn
)
2840 SET_WIDGET_COND(toolbar
->delete_btn
,
2841 M_TARGET_EXIST
, M_ALLOW_DELETE
);
2843 if (toolbar
->delete_dup_btn
)
2844 SET_WIDGET_COND(toolbar
->delete_dup_btn
,
2845 M_MSG_EXIST
, M_ALLOW_DELETE
, M_SUMMARY_ISLIST
);
2847 if (toolbar
->exec_btn
)
2848 SET_WIDGET_COND(toolbar
->exec_btn
,
2851 if (toolbar
->learn_spam_btn
)
2852 SET_WIDGET_COND(toolbar
->learn_spam_btn
,
2853 M_TARGET_EXIST
, M_CAN_LEARN_SPAM
, M_SUMMARY_ISLIST
);
2855 if (toolbar
->cancel_inc_btn
)
2856 SET_WIDGET_COND(toolbar
->cancel_inc_btn
,
2859 if (toolbar
->cancel_send_btn
)
2860 SET_WIDGET_COND(toolbar
->cancel_send_btn
,
2863 for (cur
= toolbar
->action_list
; cur
!= NULL
; cur
= cur
->next
) {
2864 ToolbarClawsActions
*act
= (ToolbarClawsActions
*)cur
->data
;
2866 SET_WIDGET_COND(act
->widget
, M_TARGET_EXIST
, M_UNLOCKED
);
2869 state
= main_window_get_current_state(mainwin
);
2871 for (cur
= entry_list
; cur
!= NULL
; cur
= cur
->next
) {
2872 Entry
*e
= (Entry
*) cur
->data
;
2874 if (e
->widget
!= NULL
) {
2875 sensitive
= ((e
->cond
& state
) == e
->cond
);
2876 GTK_BUTTON_SET_SENSITIVE(e
->widget
, sensitive
);
2880 while (entry_list
!= NULL
) {
2881 Entry
*e
= (Entry
*) entry_list
->data
;
2883 entry_list
= g_slist_remove(entry_list
, e
);
2887 /* match any bit flags */
2889 if (toolbar
->cancel_all_btn
)
2890 SET_WIDGET_COND(toolbar
->cancel_all_btn
,
2891 M_INC_ACTIVE
, M_SEND_ACTIVE
);
2893 for (cur
= entry_list
; cur
!= NULL
; cur
= cur
->next
) {
2894 Entry
*e
= (Entry
*) cur
->data
;
2896 if (e
->widget
!= NULL
) {
2897 sensitive
= ((e
->cond
& state
) != 0);
2898 GTK_BUTTON_SET_SENSITIVE(e
->widget
, sensitive
);
2902 while (entry_list
!= NULL
) {
2903 Entry
*e
= (Entry
*) entry_list
->data
;
2905 entry_list
= g_slist_remove(entry_list
, e
);
2909 g_slist_free(entry_list
);
2911 activate_compose_button(toolbar
,
2912 prefs_common
.toolbar_style
,
2913 toolbar
->compose_btn_type
);
2915 #undef SET_WIDGET_COND
2918 void toolbar_comp_set_sensitive(gpointer data
, gboolean sensitive
)
2920 Compose
*compose
= (Compose
*)data
;
2921 GSList
*items
= compose
->toolbar
->action_list
;
2923 if (compose
->toolbar
->send_btn
)
2924 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->send_btn
, sensitive
);
2925 if (compose
->toolbar
->sendl_btn
)
2926 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->sendl_btn
, sensitive
);
2927 if (compose
->toolbar
->draft_btn
)
2928 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->draft_btn
, sensitive
);
2929 if (compose
->toolbar
->insert_btn
)
2930 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->insert_btn
, sensitive
);
2931 if (compose
->toolbar
->attach_btn
)
2932 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->attach_btn
, sensitive
);
2933 if (compose
->toolbar
->sig_btn
)
2934 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->sig_btn
, sensitive
);
2935 if (compose
->toolbar
->repsig_btn
)
2936 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->repsig_btn
, sensitive
);
2937 if (compose
->toolbar
->exteditor_btn
)
2938 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->exteditor_btn
, sensitive
);
2939 if (compose
->toolbar
->linewrap_current_btn
)
2940 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->linewrap_current_btn
, sensitive
);
2941 if (compose
->toolbar
->linewrap_all_btn
)
2942 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->linewrap_all_btn
, sensitive
);
2943 if (compose
->toolbar
->addrbook_btn
)
2944 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->addrbook_btn
, sensitive
);
2946 if (compose
->toolbar
->spellcheck_btn
)
2947 GTK_BUTTON_SET_SENSITIVE(compose
->toolbar
->spellcheck_btn
, sensitive
);
2949 for (; items
!= NULL
; items
= g_slist_next(items
)) {
2950 ToolbarClawsActions
*item
= (ToolbarClawsActions
*)items
->data
;
2951 GTK_BUTTON_SET_SENSITIVE(item
->widget
, sensitive
);
2956 * Initialize toolbar structure
2958 static void toolbar_init(Toolbar
* toolbar
)
2961 toolbar
->toolbar
= NULL
;
2962 toolbar
->folders_btn
= NULL
;
2963 toolbar
->get_btn
= NULL
;
2964 toolbar
->getall_btn
= NULL
;
2965 toolbar
->send_btn
= NULL
;
2966 toolbar
->compose_mail_btn
= NULL
;
2967 toolbar
->compose_mail_icon
= NULL
;
2968 toolbar
->compose_news_icon
= NULL
;
2969 toolbar
->reply_btn
= NULL
;
2970 toolbar
->replysender_btn
= NULL
;
2971 toolbar
->replyall_btn
= NULL
;
2972 toolbar
->replylist_btn
= NULL
;
2973 toolbar
->fwd_btn
= NULL
;
2974 toolbar
->trash_btn
= NULL
;
2975 toolbar
->delete_btn
= NULL
;
2976 toolbar
->delete_dup_btn
= NULL
;
2977 toolbar
->prev_btn
= NULL
;
2978 toolbar
->next_btn
= NULL
;
2979 toolbar
->exec_btn
= NULL
;
2980 toolbar
->separator
= NULL
;
2981 toolbar
->learn_spam_btn
= NULL
;
2982 toolbar
->learn_spam_icon
= NULL
;
2983 toolbar
->learn_ham_icon
= NULL
;
2984 toolbar
->cancel_inc_btn
= NULL
;
2985 toolbar
->cancel_send_btn
= NULL
;
2986 toolbar
->cancel_all_btn
= NULL
;
2988 /* compose buttons */
2989 toolbar
->sendl_btn
= NULL
;
2990 toolbar
->draft_btn
= NULL
;
2991 toolbar
->insert_btn
= NULL
;
2992 toolbar
->attach_btn
= NULL
;
2993 toolbar
->sig_btn
= NULL
;
2994 toolbar
->repsig_btn
= NULL
;
2995 toolbar
->exteditor_btn
= NULL
;
2996 toolbar
->linewrap_current_btn
= NULL
;
2997 toolbar
->linewrap_all_btn
= NULL
;
2998 toolbar
->addrbook_btn
= NULL
;
3000 toolbar
->open_mail_btn
= NULL
;
3001 toolbar
->close_window_btn
= NULL
;
3002 toolbar
->preferences_btn
= NULL
;
3003 toolbar
->action_list
= NULL
;
3004 toolbar
->item_list
= NULL
;
3006 toolbar
->spellcheck_btn
= NULL
;
3009 toolbar
->privacy_sign_btn
= NULL
;
3010 toolbar
->privacy_encrypt_btn
= NULL
;
3012 toolbar_destroy(toolbar
);
3017 static void toolbar_reply(gpointer data
, guint action
)
3019 ToolbarItem
*toolbar_item
= (ToolbarItem
*)data
;
3020 MainWindow
*mainwin
;
3021 MessageView
*msgview
;
3022 GSList
*msginfo_list
= NULL
;
3023 gboolean msg_is_selected
= FALSE
;
3024 gboolean msg_is_opened
= FALSE
;
3026 cm_return_if_fail(toolbar_item
!= NULL
);
3028 switch (toolbar_item
->type
) {
3030 mainwin
= (MainWindow
*)toolbar_item
->parent
;
3031 msginfo_list
= summary_get_selection(mainwin
->summaryview
);
3032 msgview
= (MessageView
*)mainwin
->messageview
;
3033 msg_is_opened
= summary_has_opened_message(mainwin
->summaryview
);
3034 msg_is_selected
= summary_is_opened_message_selected(mainwin
->summaryview
);
3036 case TOOLBAR_MSGVIEW
:
3037 msgview
= (MessageView
*)toolbar_item
->parent
;
3038 cm_return_if_fail(msgview
!= NULL
);
3039 msginfo_list
= g_slist_append(msginfo_list
, msgview
->msginfo
);
3040 msg_is_opened
= TRUE
;
3041 msg_is_selected
= TRUE
;
3047 cm_return_if_fail(msgview
!= NULL
);
3048 cm_return_if_fail(msginfo_list
!= NULL
);
3049 if (!msg_is_opened
) {
3050 compose_reply_from_messageview(NULL
, msginfo_list
, action
);
3051 } else if (msg_is_selected
) {
3052 compose_reply_from_messageview(msgview
, msginfo_list
, action
);
3054 compose_reply_from_messageview(msgview
, NULL
, action
);
3056 g_slist_free(msginfo_list
);
3058 /* TODO: update reply state ion summaryview */
3062 /* exported functions */
3064 void inc_mail_cb(gpointer data
, guint action
, GtkWidget
*widget
)
3066 MainWindow
*mainwin
= (MainWindow
*)data
;
3068 inc_mail(mainwin
, prefs_common
.newmail_notify_manu
);
3071 void inc_all_account_mail_cb(gpointer data
, guint action
, GtkWidget
*widget
)
3073 MainWindow
*mainwin
= (MainWindow
*)data
;
3075 inc_all_account_mail(mainwin
, FALSE
, FALSE
, prefs_common
.newmail_notify_manu
);
3078 void send_queue_cb(gpointer data
, guint action
, GtkWidget
*widget
)
3082 gboolean got_error
= FALSE
;
3083 gchar
*errstr
= NULL
;
3085 if (prefs_common
.work_offline
)
3086 if (alertpanel(_("Offline warning"),
3087 _("You're working offline. Override?"),
3088 NULL
, _("_No"), NULL
, _("_Yes"),
3089 NULL
, NULL
, ALERTFOCUS_FIRST
) != G_ALERTALTERNATE
)
3092 /* ask for confirmation before sending queued messages only
3093 in online mode and if there is at least one message queued
3094 in any of the folder queue
3096 if (prefs_common
.confirm_send_queued_messages
) {
3098 /* check if there's a queued message */
3099 for (list
= folder_get_list(); !found
&& list
!= NULL
; list
= list
->next
) {
3100 Folder
*folder
= list
->data
;
3102 found
= !procmsg_queue_is_empty(folder
->queue
);
3104 /* if necessary, ask for confirmation before sending */
3105 if (found
&& !prefs_common
.work_offline
) {
3106 if (alertpanel(_("Send queued messages"),
3107 _("Send all queued messages?"),
3108 NULL
, _("_Cancel"), NULL
, _("_Send"),
3109 NULL
, NULL
, ALERTFOCUS_FIRST
) != G_ALERTALTERNATE
)
3114 for (list
= folder_get_list(); list
!= NULL
; list
= list
->next
) {
3115 Folder
*folder
= list
->data
;
3117 if (folder
->queue
) {
3118 if (procmsg_send_queue(folder
->queue
,
3119 prefs_common
.savemsg
,
3126 alertpanel_error_log(_("Some errors occurred while "
3127 "sending queued messages."));
3129 alertpanel_error_log(_("Some errors occurred "
3130 "while sending queued messages:\n%s"), errstr
);
3136 void compose_mail_cb(gpointer data
, guint action
, GtkWidget
*widget
)
3138 MainWindow
*mainwin
= (MainWindow
*)data
;
3139 PrefsAccount
*ac
= NULL
;
3140 FolderItem
*item
= mainwin
->summaryview
->folder_item
;
3145 ac
= account_find_from_item(item
);
3146 if (ac
&& ac
->protocol
!= A_NNTP
&& ac
->protocol
!= A_IMAP4
) {
3147 compose_new_with_folderitem(ac
, item
, NULL
); /* CLAWS */
3153 * CLAWS - use current account
3155 if (cur_account
&& (cur_account
->protocol
!= A_NNTP
)) {
3156 compose_new_with_folderitem(cur_account
, item
, NULL
);
3161 * CLAWS - just get the first one
3163 list
= account_get_list();
3164 for (cur
= list
; cur
!= NULL
; cur
= g_list_next(cur
)) {
3165 ac
= (PrefsAccount
*) cur
->data
;
3166 if (ac
->protocol
!= A_NNTP
) {
3167 compose_new_with_folderitem(ac
, item
, NULL
);
3173 void compose_news_cb(gpointer data
, guint action
, GtkWidget
*widget
)
3175 MainWindow
*mainwin
= (MainWindow
*)data
;
3176 PrefsAccount
* ac
= NULL
;
3180 if (mainwin
->summaryview
->folder_item
) {
3181 ac
= mainwin
->summaryview
->folder_item
->folder
->account
;
3182 if (ac
&& ac
->protocol
== A_NNTP
) {
3183 compose_new_with_folderitem(ac
,
3184 mainwin
->summaryview
->folder_item
, NULL
);
3189 list
= account_get_list();
3190 for(cur
= list
; cur
!= NULL
; cur
= g_list_next(cur
)) {
3191 ac
= (PrefsAccount
*) cur
->data
;
3192 if (ac
->protocol
== A_NNTP
) {
3193 compose_new_with_folderitem(ac
,
3194 mainwin
->summaryview
->folder_item
, NULL
);