1 /*
2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2001-2017 Hiroyuki Yamamoto and the Claws Mail team
4 *
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.
9 *
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.
14 *
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/>.
17 */
18
19 #ifdef HAVE_CONFIG_H
20 # include "config.h"
21 #include "claws-features.h"
22 #endif
23
24 #include "defs.h"
25
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <dirent.h>
31 #include <sys/stat.h>
32 #include <math.h>
33 #include <setjmp.h>
34
35 #include "main.h"
36 #include "mainwindow.h"
37 #include "summaryview.h"
38 #include "compose.h"
39 #include "utils.h"
40 #include "xml.h"
41 #include "mgutils.h"
42 #include "prefs_gtk.h"
43 #include "codeconv.h"
44 #include "stock_pixmap.h"
45 #include "manage_window.h"
46 #include "gtkutils.h"
47 #include "toolbar.h"
48 #include "menu.h"
49 #include "inc.h"
50 #include "action.h"
51 #include "prefs_actions.h"
52 #include "prefs_common.h"
53 #include "prefs_toolbar.h"
54 #include "alertpanel.h"
55 #include "imap.h"
56 #include "account.h"
57 #include "send_message.h"
58 #ifndef USE_ALT_ADDRBOOK
59 #include "addressbook.h"
60 #else
61 #include "addressbook-dbus.h"
62 #endif
63
64 /* elements */
65 #define TOOLBAR_TAG_INDEX "toolbar"
66 #define TOOLBAR_TAG_ITEM "item"
67 #define TOOLBAR_TAG_SEPARATOR "separator"
68
69 #define TOOLBAR_ICON_FILE "file"
70 #define TOOLBAR_ICON_TEXT "text"
71 #define TOOLBAR_ICON_ACTION "action"
72
73 static void toolbar_init(Toolbar * toolbar);
74 static gboolean toolbar_is_duplicate (gint action,
75 ToolbarType source);
76 static void toolbar_parse_item (XMLFile *file,
77 ToolbarType source, gboolean *rewrite);
78
79 static gint toolbar_ret_val_from_text (const gchar *text);
80 static gchar *toolbar_ret_text_from_val (gint val);
81
82 typedef struct _DefaultToolbar DefaultToolbar;
83 struct _DefaultToolbar {
84 gint action;
85 };
86 static void toolbar_set_default_generic(ToolbarType toolbar_type,
87 DefaultToolbar *default_toolbar);
88
89 static void toolbar_style (ToolbarType type,
90 guint action,
91 gpointer data);
92
93 static MainWindow *get_mainwin (gpointer data);
94 static void activate_compose_button (Toolbar *toolbar,
95 ToolbarStyle style,
96 ComposeButtonType type);
97
98 /* toolbar callbacks */
99 static void toolbar_reply (gpointer data,
100 guint action);
101
102 static void toolbar_learn (gpointer data,
103 guint action);
104
105 static void toolbar_delete_dup (gpointer data,
106 guint action);
107
108 static void toolbar_trash_cb (GtkWidget *widget,
109 gpointer data);
110
111 static void toolbar_delete_cb (GtkWidget *widget,
112 gpointer data);
113
114 static void toolbar_delete_dup_cb (GtkWidget *widget,
115
116 gpointer data);
117
118 static void toolbar_compose_cb (GtkWidget *widget,
119 gpointer data);
120
121 static void toolbar_learn_cb (GtkWidget *widget,
122 gpointer data);
123
124 static void toolbar_reply_cb (GtkWidget *widget,
125 gpointer data);
126
127 static void toolbar_reply_to_all_cb (GtkWidget *widget,
128 gpointer data);
129
130 static void toolbar_reply_to_list_cb (GtkWidget *widget,
131 gpointer data);
132
133 static void toolbar_reply_to_sender_cb (GtkWidget *widget,
134 gpointer data);
135
136 static void toolbar_forward_cb (GtkWidget *widget,
137 gpointer data);
138
139 static void toolbar_prev_unread_cb (GtkWidget *widget,
140 gpointer data);
141 static void toolbar_next_unread_cb (GtkWidget *widget,
142 gpointer data);
143
144 static void toolbar_ignore_thread_cb (GtkWidget *widget,
145 gpointer data);
146
147 static void toolbar_watch_thread_cb (GtkWidget *widget,
148 gpointer data);
149
150 static void toolbar_mark_cb (GtkWidget *widget,
151 gpointer data);
152
153 static void toolbar_unmark_cb (GtkWidget *widget,
154 gpointer data);
155
156 static void toolbar_lock_cb (GtkWidget *widget,
157 gpointer data);
158
159 static void toolbar_unlock_cb (GtkWidget *widget,
160 gpointer data);
161
162 static void toolbar_all_read_cb (GtkWidget *widget,
163 gpointer data);
164
165 static void toolbar_all_unread_cb (GtkWidget *widget,
166 gpointer data);
167
168 static void toolbar_read_cb (GtkWidget *widget,
169 gpointer data);
170
171 static void toolbar_unread_cb (GtkWidget *widget,
172 gpointer data);
173
174 static void toolbar_print_cb (GtkWidget *widget,
175 gpointer data);
176
177 static void toolbar_actions_execute_cb (GtkWidget *widget,
178 gpointer data);
179 static void toolbar_plugins_execute_cb (GtkWidget *widget,
180 gpointer data);
181
182
183 static void toolbar_send_cb (GtkWidget *widget,
184 gpointer data);
185 static void toolbar_send_later_cb (GtkWidget *widget,
186 gpointer data);
187 static void toolbar_draft_cb (GtkWidget *widget,
188 gpointer data);
189 static void toolbar_close_cb (GtkWidget *widget,
190 gpointer data);
191 static void toolbar_preferences_cb (GtkWidget *widget,
192 gpointer data);
193 static void toolbar_open_mail_cb (GtkWidget *widget,
194 gpointer data);
195 static void toolbar_insert_cb (GtkWidget *widget,
196 gpointer data);
197 static void toolbar_attach_cb (GtkWidget *widget,
198 gpointer data);
199 static void toolbar_sig_cb (GtkWidget *widget,
200 gpointer data);
201 static void toolbar_ext_editor_cb (GtkWidget *widget,
202 gpointer data);
203 static void toolbar_linewrap_current_cb (GtkWidget *widget,
204 gpointer data);
205 static void toolbar_linewrap_all_cb (GtkWidget *widget,
206 gpointer data);
207 static void toolbar_addrbook_cb (GtkWidget *widget,
208 gpointer data);
209 #ifdef USE_ENCHANT
210 static void toolbar_check_spelling_cb (GtkWidget *widget,
211 gpointer data);
212 #endif
213 static void toolbar_cancel_inc_cb (GtkWidget *widget,
214 gpointer data);
215 static void toolbar_cancel_send_cb (GtkWidget *widget,
216 gpointer data);
217 static void toolbar_cancel_all_cb (GtkWidget *widget,
218 gpointer data);
219
220 struct {
221 gchar *index_str;
222 const gchar *descr;
223 } toolbar_text [] = {
224 { "A_RECEIVE_ALL", N_("Receive Mail from all Accounts") },
225 { "A_RECEIVE_CUR", N_("Receive Mail from current Account") },
226 { "A_SEND_QUEUED", N_("Send Queued Messages") },
227 { "A_COMPOSE_EMAIL", N_("Compose Email") },
228 { "A_COMPOSE_NEWS", N_("Compose News") },
229 { "A_REPLY_MESSAGE", N_("Reply to Message") },
230 { "A_REPLY_SENDER", N_("Reply to Sender") },
231 { "A_REPLY_ALL", N_("Reply to All") },
232 { "A_REPLY_ML", N_("Reply to Mailing-list") },
233 { "A_OPEN_MAIL", N_("Open email") },
234 { "A_FORWARD", N_("Forward Message") },
235 { "A_TRASH", N_("Trash Message") },
236 { "A_DELETE_REAL", N_("Delete Message") },
237 { "A_DELETE_DUP", N_("Delete duplicate messages") },
238 { "A_EXECUTE", N_("Execute") },
239 { "A_GOTO_PREV", N_("Go to Previous Unread Message") },
240 { "A_GOTO_NEXT", N_("Go to Next Unread Message") },
241
242 { "A_IGNORE_THREAD", N_("Ignore thread") },
243 { "A_WATCH_THREAD", N_("Watch thread") },
244 { "A_MARK", N_("Mark Message") },
245 { "A_UNMARK", N_("Unmark Message") },
246 { "A_LOCK", N_("Lock Message") },
247 { "A_UNLOCK", N_("Unlock Message") },
248 { "A_ALL_READ", N_("Mark all Messages as read") },
249 { "A_ALL_UNREAD", N_("Mark all Messages as unread") },
250 { "A_READ", N_("Mark Message as read") },
251 { "A_UNREAD", N_("Mark Message as unread") },
252
253 { "A_PRINT", N_("Print") },
254 { "A_LEARN_SPAM", N_("Learn Spam or Ham") },
255 { "A_GO_FOLDERS", N_("Open folder/Go to folder list") },
256 { "A_PREFERENCES", N_("Preferences") },
257
258 { "A_SEND", N_("Send Message") },
259 { "A_SEND_LATER", N_("Put into queue folder and send later") },
260 { "A_DRAFT", N_("Save to draft folder") },
261 { "A_INSERT", N_("Insert file") },
262 { "A_ATTACH", N_("Attach file") },
263 { "A_SIG", N_("Insert signature") },
264 { "A_REP_SIG", N_("Replace signature") },
265 { "A_EXTEDITOR", N_("Edit with external editor") },
266 { "A_LINEWRAP_CURRENT", N_("Wrap long lines of current paragraph") },
267 { "A_LINEWRAP_ALL", N_("Wrap all long lines") },
268 { "A_ADDRBOOK", N_("Address book") },
269 #ifdef USE_ENCHANT
270 { "A_CHECK_SPELLING", N_("Check spelling") },
271 #endif
272 { "A_PRIVACY_SIGN", N_("Sign") },
273 { "A_PRIVACY_ENCRYPT", N_("Encrypt") },
274 { "A_CLAWS_ACTIONS", N_("Claws Mail Actions Feature") },
275 { "A_CANCEL_INC", N_("Cancel receiving") },
276 { "A_CANCEL_SEND", N_("Cancel sending") },
277 { "A_CANCEL_ALL", N_("Cancel receiving/sending") },
278 { "A_CLOSE", N_("Close window") },
279 { "A_SEPARATOR", N_("Separator") },
280 { "A_CLAWS_PLUGINS", N_("Claws Mail Plugins") }
281 };
282
283 /* migration table: support reading toolbar configuration files with
284 old action names and converting them to current action names,
285 see toolbar_parse_item(), which makes uses of this alias table.
286 */
287 struct {
288 const gchar *old_name;
289 const gchar *current_name;
290 } toolbar_migration [] = {
291 { "A_SYL_ACTIONS", "A_CLAWS_ACTIONS" },
292 { "A_SENDL", "A_SEND_LATER" },
293 { NULL, NULL }
294 };
295
296 /* struct holds configuration files and a list of
297 * currently active toolbar items
298 * TOOLBAR_MAIN, TOOLBAR_COMPOSE and TOOLBAR_MSGVIEW
299 * give us an index
300 */
301 struct {
302 const gchar *conf_file;
303 GSList *item_list;
304 } toolbar_config[NUM_TOOLBARS] = {
305 { "toolbar_main.xml", NULL},
306 { "toolbar_compose.xml", NULL},
307 { "toolbar_msgview.xml", NULL}
308 };
309
toolbar_ret_val_from_descr(const gchar * descr)310 gint toolbar_ret_val_from_descr(const gchar *descr)
311 {
312 gint i;
313
314 for (i = 0; i < N_ACTION_VAL; i++) {
315 if (g_utf8_collate(gettext(toolbar_text[i].descr), descr) == 0)
316 return i;
317 }
318
319 return -1;
320 }
321
toolbar_ret_descr_from_val(gint val)322 gchar *toolbar_ret_descr_from_val(gint val)
323 {
324 cm_return_val_if_fail(val >=0 && val < N_ACTION_VAL, NULL);
325
326 return gettext(toolbar_text[val].descr);
327 }
328
toolbar_ret_val_from_text(const gchar * text)329 static gint toolbar_ret_val_from_text(const gchar *text)
330 {
331 gint i;
332
333 for (i = 0; i < N_ACTION_VAL; i++) {
334 if (g_utf8_collate(toolbar_text[i].index_str, text) == 0)
335 return i;
336 }
337
338 return -1;
339 }
340
toolbar_ret_text_from_val(gint val)341 static gchar *toolbar_ret_text_from_val(gint val)
342 {
343 cm_return_val_if_fail(val >=0 && val < N_ACTION_VAL, NULL);
344
345 return toolbar_text[val].index_str;
346 }
347
toolbar_is_duplicate(gint action,ToolbarType source)348 static gboolean toolbar_is_duplicate(gint action, ToolbarType source)
349 {
350 GSList *cur;
351
352 if ((action == A_SEPARATOR) || (action == A_CLAWS_ACTIONS) || (action == A_CLAWS_PLUGINS))
353 return FALSE;
354
355 for (cur = toolbar_config[source].item_list; cur != NULL; cur = cur->next) {
356 ToolbarItem *item = (ToolbarItem*) cur->data;
357
358 if (item->index == action)
359 return TRUE;
360 }
361 return FALSE;
362 }
363
364 /* depending on toolbar type this function
365 returns a list of available toolbar events being
366 displayed by prefs_toolbar
367 */
toolbar_get_action_items(ToolbarType source)368 GList *toolbar_get_action_items(ToolbarType source)
369 {
370 GList *items = NULL;
371 gint i = 0;
372
373 if (source == TOOLBAR_MAIN) {
374 gint main_items[] = {
375 A_RECEIVE_ALL, A_RECEIVE_CUR, A_SEND_QUEUED,
376 A_COMPOSE_EMAIL, A_REPLY_MESSAGE, A_REPLY_SENDER,
377 A_REPLY_ALL, A_REPLY_ML, A_OPEN_MAIL, A_FORWARD,
378 A_TRASH, A_DELETE_REAL, A_DELETE_DUP, A_EXECUTE,
379 A_GOTO_PREV, A_GOTO_NEXT, A_IGNORE_THREAD, A_WATCH_THREAD,
380 A_MARK, A_UNMARK, A_LOCK, A_UNLOCK,
381 A_ALL_READ, A_ALL_UNREAD, A_READ, A_UNREAD,
382 A_PRINT, A_ADDRBOOK, A_LEARN_SPAM, A_GO_FOLDERS,
383 A_CANCEL_INC, A_CANCEL_SEND, A_CANCEL_ALL, A_PREFERENCES };
384
385 for (i = 0; i < sizeof main_items / sizeof main_items[0]; i++) {
386 items = g_list_append(items, gettext(toolbar_text[main_items[i]].descr));
387 }
388 }
389 else if (source == TOOLBAR_COMPOSE) {
390 gint comp_items[] = {
391 A_SEND, A_SEND_LATER, A_DRAFT,
392 A_INSERT, A_ATTACH, A_SIG,
393 A_REP_SIG, A_EXTEDITOR, A_LINEWRAP_CURRENT,
394 A_LINEWRAP_ALL, A_ADDRBOOK,
395 #ifdef USE_ENCHANT
396 A_CHECK_SPELLING,
397 #endif
398 A_PRIVACY_SIGN, A_PRIVACY_ENCRYPT,
399 A_CLOSE };
400
401 for (i = 0; i < sizeof comp_items / sizeof comp_items[0]; i++)
402 items = g_list_append(items, gettext(toolbar_text[comp_items[i]].descr));
403 }
404 else if (source == TOOLBAR_MSGVIEW) {
405 gint msgv_items[] = {
406 A_COMPOSE_EMAIL, A_REPLY_MESSAGE, A_REPLY_SENDER,
407 A_REPLY_ALL, A_REPLY_ML, A_FORWARD,
408 A_TRASH, A_DELETE_REAL, A_GOTO_PREV, A_GOTO_NEXT,
409 A_ADDRBOOK, A_LEARN_SPAM, A_CLOSE };
410
411 for (i = 0; i < sizeof msgv_items / sizeof msgv_items[0]; i++)
412 items = g_list_append(items, gettext(toolbar_text[msgv_items[i]].descr));
413 }
414
415 return items;
416 }
417
toolbar_parse_item(XMLFile * file,ToolbarType source,gboolean * rewrite)418 static void toolbar_parse_item(XMLFile *file, ToolbarType source, gboolean *rewrite)
419 {
420 GList *attr;
421 gchar *name, *value;
422 ToolbarItem *item = NULL;
423
424 g_return_if_fail(rewrite != NULL);
425
426 attr = xml_get_current_tag_attr(file);
427 item = g_new0(ToolbarItem, 1);
428 while( attr ) {
429 name = ((XMLAttr *)attr->data)->name;
430 value = ((XMLAttr *)attr->data)->value;
431
432 if (g_utf8_collate(name, TOOLBAR_ICON_FILE) == 0)
433 item->file = g_strdup (value);
434 else if (g_utf8_collate(name, TOOLBAR_ICON_TEXT) == 0)
435 item->text = g_strdup (*value ? gettext(value):"");
436 else if (g_utf8_collate(name, TOOLBAR_ICON_ACTION) == 0)
437 item->index = toolbar_ret_val_from_text(value);
438
439 if ((item->index == -1) && !strcmp(value, "A_DELETE")) {
440 /* switch button */
441 item->index = A_TRASH;
442 g_free(item->file);
443 item->file = g_strdup("trash_btn");
444 g_free(item->text);
445 item->text = g_strdup(C_("Toolbar", "Trash"));
446 *rewrite = TRUE;
447 }
448 if (!strcmp(item->file, "mail") && !strcmp(value, "A_DRAFT")) {
449 /* switch icon file */
450 g_free(item->file);
451 item->file = g_strdup("mail_draft");
452 *rewrite = TRUE;
453 }
454 if (item->index == -1) {
455 /* item not found in table: try migrating old action names to current ones */
456 gint i;
457
458 /* replace action name */
459 for (i = 0; toolbar_migration[i].old_name != NULL; i++) {
460 if (g_utf8_collate(value, toolbar_migration[i].old_name) == 0) {
461 item->index = toolbar_ret_val_from_text(toolbar_migration[i].current_name);
462 if (item->index != -1) {
463 *rewrite = TRUE;
464 debug_print("toolbar_parse_item: migrating action label from '%s' to '%s'\n",
465 value, toolbar_migration[i].current_name);
466 break;
467 }
468 }
469 }
470 }
471 if ((item->index == -1) && !rewrite)
472 g_warning("toolbar_parse_item: unrecognized action name '%s'\n", value);
473
474 attr = g_list_next(attr);
475 }
476 if (item->index != -1) {
477 if (!toolbar_is_duplicate(item->index, source))
478 toolbar_config[source].item_list = g_slist_append(toolbar_config[source].item_list,
479 item);
480 }
481 }
482
toolbar_get_short_text(int action)483 const gchar *toolbar_get_short_text(int action) {
484 switch(action) {
485 case A_RECEIVE_ALL: return _("Get Mail");
486 case A_RECEIVE_CUR: return _("Get");
487 case A_SEND_QUEUED: return _("Send");
488 case A_COMPOSE_EMAIL: return C_("Toolbar", "Compose");
489 case A_COMPOSE_NEWS: return C_("Toolbar", "Compose");
490 case A_REPLY_MESSAGE: return _("Reply");
491 case A_REPLY_SENDER: return C_("Toolbar", "Sender");
492 case A_REPLY_ALL: return _("All");
493 case A_REPLY_ML: return _("List");
494 case A_OPEN_MAIL: return _("Open");
495 case A_FORWARD: return _("Forward");
496 case A_TRASH: return C_("Toolbar", "Trash");
497 case A_DELETE_REAL: return _("Delete");
498 case A_DELETE_DUP: return _("Delete duplicates");
499 case A_EXECUTE: return _("Execute");
500 case A_GOTO_PREV: return _("Prev");
501 case A_GOTO_NEXT: return _("Next");
502
503 case A_IGNORE_THREAD: return _("Ignore thread");
504 case A_WATCH_THREAD: return _("Watch thread");
505 case A_MARK: return _("Mark");
506 case A_UNMARK: return _("Unmark");
507 case A_LOCK: return _("Lock");
508 case A_UNLOCK: return _("Unlock");
509 case A_ALL_READ: return _("All read");
510 case A_ALL_UNREAD: return _("All unread");
511 case A_READ: return _("Read");
512 case A_UNREAD: return _("Unread");
513
514 case A_PRINT: return _("Print");
515 case A_LEARN_SPAM: return _("Spam");
516 case A_GO_FOLDERS: return _("Folders");
517 case A_PREFERENCES: return _("Preferences");
518
519 case A_SEND: return _("Send");
520 case A_SEND_LATER: return _("Send later");
521 case A_DRAFT: return _("Draft");
522 case A_INSERT: return _("Insert");
523 case A_ATTACH: return _("Attach");
524 case A_SIG: return _("Insert sig.");
525 case A_REP_SIG: return _("Replace sig.");
526 case A_EXTEDITOR: return _("Edit");
527 case A_LINEWRAP_CURRENT:return _("Wrap para.");
528 case A_LINEWRAP_ALL: return _("Wrap all");
529 case A_ADDRBOOK: return _("Address");
530 #ifdef USE_ENCHANT
531 case A_CHECK_SPELLING: return _("Check spelling");
532 #endif
533 case A_PRIVACY_SIGN: return _("Sign");
534 case A_PRIVACY_ENCRYPT: return _("Encrypt");
535
536 case A_CANCEL_INC: return _("Stop");
537 case A_CANCEL_SEND: return _("Stop");
538 case A_CANCEL_ALL: return _("Stop all");
539 case A_CLOSE: return _("Close");
540 default: return "";
541 }
542 }
543
toolbar_get_icon(int action)544 gint toolbar_get_icon(int action) {
545 switch(action) {
546 case A_RECEIVE_ALL: return STOCK_PIXMAP_MAIL_RECEIVE_ALL;
547 case A_RECEIVE_CUR: return STOCK_PIXMAP_MAIL_RECEIVE;
548 case A_SEND_QUEUED: return STOCK_PIXMAP_MAIL_SEND_QUEUE;
549 case A_COMPOSE_EMAIL: return STOCK_PIXMAP_MAIL_COMPOSE;
550 case A_COMPOSE_NEWS: return STOCK_PIXMAP_NEWS_COMPOSE;
551 case A_REPLY_MESSAGE: return STOCK_PIXMAP_MAIL_REPLY;
552 case A_REPLY_SENDER: return STOCK_PIXMAP_MAIL_REPLY_TO_AUTHOR;
553 case A_REPLY_ALL: return STOCK_PIXMAP_MAIL_REPLY_TO_ALL;
554 case A_REPLY_ML: return STOCK_PIXMAP_MAIL_REPLY_TO_LIST;
555 case A_OPEN_MAIL: return STOCK_PIXMAP_OPEN_MAIL;
556 case A_FORWARD: return STOCK_PIXMAP_MAIL_FORWARD;
557 case A_TRASH: return STOCK_PIXMAP_TRASH;
558 case A_DELETE_REAL: return STOCK_PIXMAP_DELETE;
559 case A_DELETE_DUP: return STOCK_PIXMAP_DELETE_DUP;
560 case A_EXECUTE: return STOCK_PIXMAP_EXEC;
561 case A_GOTO_PREV: return STOCK_PIXMAP_UP_ARROW;
562 case A_GOTO_NEXT: return STOCK_PIXMAP_DOWN_ARROW;
563
564 case A_IGNORE_THREAD: return STOCK_PIXMAP_MARK_IGNORETHREAD;
565 case A_WATCH_THREAD: return STOCK_PIXMAP_MARK_WATCHTHREAD;
566 case A_MARK: return STOCK_PIXMAP_MARK_MARK;
567 case A_UNMARK: return STOCK_PIXMAP_MARK_UNMARK;
568 case A_LOCK: return STOCK_PIXMAP_MARK_LOCKED;
569 case A_UNLOCK: return STOCK_PIXMAP_MARK_UNLOCKED;
570 case A_ALL_READ: return STOCK_PIXMAP_MARK_ALLREAD;
571 case A_ALL_UNREAD: return STOCK_PIXMAP_MARK_ALLUNREAD;
572 case A_READ: return STOCK_PIXMAP_MARK_READ;
573 case A_UNREAD: return STOCK_PIXMAP_MARK_UNREAD;
574
575 case A_PRINT: return STOCK_PIXMAP_PRINTER_BTN;
576 case A_LEARN_SPAM: return STOCK_PIXMAP_SPAM_BTN;
577 case A_GO_FOLDERS: return STOCK_PIXMAP_GO_FOLDERS;
578 case A_PREFERENCES: return STOCK_PIXMAP_PREFERENCES;
579
580 case A_SEND: return STOCK_PIXMAP_MAIL_SEND;
581 case A_SEND_LATER: return STOCK_PIXMAP_MAIL_SEND_QUEUE;
582 case A_DRAFT: return STOCK_PIXMAP_MAIL_DRAFT;
583 case A_INSERT: return STOCK_PIXMAP_INSERT_FILE;
584 case A_ATTACH: return STOCK_PIXMAP_MAIL_ATTACH;
585 case A_SIG: return STOCK_PIXMAP_MAIL_SIGN;
586 case A_REP_SIG: return STOCK_PIXMAP_MAIL_SIGN;
587 case A_EXTEDITOR: return STOCK_PIXMAP_EDIT_EXTERN;
588 case A_LINEWRAP_CURRENT:return STOCK_PIXMAP_LINEWRAP_CURRENT;
589 case A_LINEWRAP_ALL: return STOCK_PIXMAP_LINEWRAP_ALL;
590 case A_ADDRBOOK: return STOCK_PIXMAP_ADDRESS_BOOK;
591 #ifdef USE_ENCHANT
592 case A_CHECK_SPELLING: return STOCK_PIXMAP_CHECK_SPELLING;
593 #endif
594 case A_PRIVACY_SIGN: return STOCK_PIXMAP_MAIL_PRIVACY_SIGNED;
595 case A_PRIVACY_ENCRYPT: return STOCK_PIXMAP_MAIL_PRIVACY_ENCRYPTED;
596
597 case A_CANCEL_INC: return STOCK_PIXMAP_CANCEL;
598 case A_CANCEL_SEND: return STOCK_PIXMAP_CANCEL;
599 case A_CANCEL_ALL: return STOCK_PIXMAP_CANCEL;
600 case A_CLOSE: return STOCK_PIXMAP_CLOSE;
601 default: return -1;
602 }
603 }
604
toolbar_set_default_generic(ToolbarType toolbar_type,DefaultToolbar * default_toolbar)605 static void toolbar_set_default_generic(ToolbarType toolbar_type, DefaultToolbar *default_toolbar)
606 {
607 gint i;
608
609 g_return_if_fail(default_toolbar != NULL);
610
611 for (i = 0; default_toolbar[i].action != N_ACTION_VAL; i++) {
612
613 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
614
615 if (default_toolbar[i].action != A_SEPARATOR) {
616 gchar *file = NULL;
617 gint icon;
618
619 icon = toolbar_get_icon(default_toolbar[i].action);
620 if (icon > -1) {
621 file = stock_pixmap_get_name((StockPixmap)icon);
622 }
623 toolbar_item->file = g_strdup(file);
624 toolbar_item->index = default_toolbar[i].action;
625 toolbar_item->text = g_strdup(toolbar_get_short_text(default_toolbar[i].action));
626 } else {
627 toolbar_item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
628 toolbar_item->index = A_SEPARATOR;
629 }
630
631 if (toolbar_item->index != -1) {
632 if (!toolbar_is_duplicate(toolbar_item->index, toolbar_type))
633 toolbar_config[toolbar_type].item_list =
634 g_slist_append(toolbar_config[toolbar_type].item_list, toolbar_item);
635 }
636 }
637 }
638
toolbar_set_default(ToolbarType source)639 void toolbar_set_default(ToolbarType source)
640 {
641 DefaultToolbar default_toolbar_main[] = {
642 #ifdef GENERIC_UMPC
643 { A_GO_FOLDERS},
644 { A_OPEN_MAIL},
645 { A_SEPARATOR},
646 #endif
647 { A_RECEIVE_ALL},
648 { A_SEPARATOR},
649 { A_SEND_QUEUED},
650 { A_COMPOSE_EMAIL},
651 { A_SEPARATOR},
652 { A_REPLY_MESSAGE},
653 #ifndef GENERIC_UMPC
654 { A_REPLY_ALL},
655 { A_REPLY_SENDER},
656 #endif
657 { A_FORWARD},
658 { A_SEPARATOR},
659 { A_TRASH},
660 #ifndef GENERIC_UMPC
661 { A_LEARN_SPAM},
662 #endif
663 { A_SEPARATOR},
664 { A_GOTO_NEXT},
665 { N_ACTION_VAL}
666 };
667 DefaultToolbar default_toolbar_compose[] = {
668 #ifdef GENERIC_UMPC
669 { A_CLOSE},
670 { A_SEPARATOR},
671 #endif
672 { A_SEND},
673 { A_SEND_LATER},
674 { A_DRAFT},
675 { A_SEPARATOR},
676 #ifndef GENERIC_UMPC
677 { A_INSERT},
678 #endif
679 { A_ATTACH},
680 { A_SEPARATOR},
681 { A_ADDRBOOK},
682 { N_ACTION_VAL}
683 };
684
685 DefaultToolbar default_toolbar_msgview[] = {
686 #ifdef GENERIC_UMPC
687 { A_CLOSE},
688 { A_SEPARATOR},
689 #endif
690 { A_REPLY_MESSAGE},
691 { A_REPLY_ALL},
692 { A_REPLY_SENDER},
693 { A_FORWARD},
694 { A_SEPARATOR},
695 { A_TRASH},
696 #ifndef GENERIC_UMPC
697 { A_LEARN_SPAM},
698 #endif
699 { A_GOTO_NEXT},
700 { N_ACTION_VAL}
701 };
702
703 if (source == TOOLBAR_MAIN)
704 toolbar_set_default_generic(TOOLBAR_MAIN, default_toolbar_main);
705 else if (source == TOOLBAR_COMPOSE)
706 toolbar_set_default_generic(TOOLBAR_COMPOSE, default_toolbar_compose);
707 else if (source == TOOLBAR_MSGVIEW)
708 toolbar_set_default_generic(TOOLBAR_MSGVIEW, default_toolbar_msgview);
709 }
710
toolbar_save_config_file(ToolbarType source)711 void toolbar_save_config_file(ToolbarType source)
712 {
713 GSList *cur;
714 FILE *fp;
715 PrefFile *pfile;
716 gchar *fileSpec = NULL;
717
718 debug_print("save Toolbar Configuration to %s\n", toolbar_config[source].conf_file);
719
720 fileSpec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, toolbar_config[source].conf_file, NULL );
721 pfile = prefs_write_open(fileSpec);
722 if( pfile ) {
723 fp = pfile->fp;
724 if (fprintf(fp, "<?xml version=\"1.0\" encoding=\"%s\" ?>\n", CS_INTERNAL) < 0)
725 goto fail;
726
727 if (fprintf(fp, "<%s>\n", TOOLBAR_TAG_INDEX) < 0)
728 goto fail;
729
730 for (cur = toolbar_config[source].item_list; cur != NULL; cur = cur->next) {
731 ToolbarItem *toolbar_item = (ToolbarItem*) cur->data;
732
733 if (toolbar_item->index != A_SEPARATOR) {
734 if (fprintf(fp, "\t<%s %s=\"%s\" %s=\"",
735 TOOLBAR_TAG_ITEM,
736 TOOLBAR_ICON_FILE, toolbar_item->file,
737 TOOLBAR_ICON_TEXT) < 0)
738 goto fail;
739 if (xml_file_put_escape_str(fp, toolbar_item->text) < 0)
740 goto fail;
741 if (fprintf(fp, "\" %s=\"%s\"/>\n",
742 TOOLBAR_ICON_ACTION,
743 toolbar_ret_text_from_val(toolbar_item->index)) < 0)
744 goto fail;
745 } else {
746 if (fprintf(fp, "\t<%s/>\n", TOOLBAR_TAG_SEPARATOR) < 0)
747 goto fail;
748 }
749 }
750
751 if (fprintf(fp, "</%s>\n", TOOLBAR_TAG_INDEX) < 0)
752 goto fail;
753
754 g_free( fileSpec );
755 if (prefs_file_close (pfile) < 0 )
756 g_warning("failed to write toolbar configuration to file");
757 return;
758
759 fail:
760 FILE_OP_ERROR(fileSpec, "fprintf");
761 g_free( fileSpec );
762 prefs_file_close_revert (pfile);
763 } else
764 g_warning("failed to open toolbar configuration file for writing");
765 }
766
toolbar_read_config_file(ToolbarType source)767 void toolbar_read_config_file(ToolbarType source)
768 {
769 XMLFile *file = NULL;
770 gchar *fileSpec = NULL;
771 jmp_buf jumper;
772 gboolean rewrite = FALSE;
773
774 debug_print("read Toolbar Configuration from %s\n", toolbar_config[source].conf_file);
775
776 fileSpec = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, toolbar_config[source].conf_file, NULL );
777 file = xml_open_file(fileSpec);
778 g_free(fileSpec);
779
780 toolbar_clear_list(source);
781
782 if (file) {
783 if ((setjmp(jumper))
784 || (xml_get_dtd(file))
785 || (xml_parse_next_tag(file))
786 || (!xml_compare_tag(file, TOOLBAR_TAG_INDEX))) {
787 xml_close_file(file);
788 return;
789 }
790
791 for (;;) {
792 if (!file->level)
793 break;
794 /* Get item tag */
795 if (xml_parse_next_tag(file))
796 longjmp(jumper, 1);
797
798 /* Get next tag (icon, icon_text or icon_action) */
799 if (xml_compare_tag(file, TOOLBAR_TAG_ITEM)) {
800 toolbar_parse_item(file, source, &rewrite);
801 } else if (xml_compare_tag(file, TOOLBAR_TAG_SEPARATOR)) {
802 ToolbarItem *item = g_new0(ToolbarItem, 1);
803
804 item->file = g_strdup(TOOLBAR_TAG_SEPARATOR);
805 item->index = A_SEPARATOR;
806 toolbar_config[source].item_list =
807 g_slist_append(toolbar_config[source].item_list, item);
808 }
809
810 }
811 xml_close_file(file);
812 if (rewrite) {
813 debug_print("toolbar_read_config_file: rewriting toolbar\n");
814 toolbar_save_config_file(source);
815 }
816 }
817
818 if ((!file) || (g_slist_length(toolbar_config[source].item_list) == 0)) {
819
820 if (source == TOOLBAR_MAIN)
821 toolbar_set_default(TOOLBAR_MAIN);
822 else if (source == TOOLBAR_COMPOSE)
823 toolbar_set_default(TOOLBAR_COMPOSE);
824 else if (source == TOOLBAR_MSGVIEW)
825 toolbar_set_default(TOOLBAR_MSGVIEW);
826 else {
827 g_warning("refusing to write unknown Toolbar Configuration number %d", source);
828 return;
829 }
830
831 toolbar_save_config_file(source);
832 }
833 }
834
835 /*
836 * clears list of toolbar items read from configuration files
837 */
toolbar_clear_list(ToolbarType source)838 void toolbar_clear_list(ToolbarType source)
839 {
840 while (toolbar_config[source].item_list != NULL) {
841 ToolbarItem *item = (ToolbarItem*) toolbar_config[source].item_list->data;
842
843 toolbar_config[source].item_list =
844 g_slist_remove(toolbar_config[source].item_list, item);
845
846 g_free(item->file);
847 g_free(item->text);
848 g_free(item);
849 }
850 g_slist_free(toolbar_config[source].item_list);
851 }
852
853
854 /*
855 * return list of Toolbar items
856 */
toolbar_get_list(ToolbarType source)857 GSList *toolbar_get_list(ToolbarType source)
858 {
859 GSList *list = NULL;
860
861 if ((source == TOOLBAR_MAIN) || (source == TOOLBAR_COMPOSE) || (source == TOOLBAR_MSGVIEW))
862 list = toolbar_config[source].item_list;
863
864 return list;
865 }
866
toolbar_set_list_item(ToolbarItem * t_item,ToolbarType source)867 void toolbar_set_list_item(ToolbarItem *t_item, ToolbarType source)
868 {
869 ToolbarItem *toolbar_item = g_new0(ToolbarItem, 1);
870
871 toolbar_item->file = g_strdup(t_item->file);
872 toolbar_item->text = g_strdup(t_item->text);
873 toolbar_item->index = t_item->index;
874
875 toolbar_config[source].item_list =
876 g_slist_append(toolbar_config[source].item_list,
877 toolbar_item);
878 }
879
toolbar_action_execute(GtkWidget * widget,GSList * action_list,gpointer data,gint source)880 static void toolbar_action_execute(GtkWidget *widget,
881 GSList *action_list,
882 gpointer data,
883 gint source)
884 {
885 GSList *cur;
886 gint i = 0;
887
888 for (cur = action_list; cur != NULL; cur = cur->next) {
889 ToolbarClawsActions *act = (ToolbarClawsActions*)cur->data;
890
891 if (widget == act->widget) {
892 i = prefs_actions_find_by_name(act->name);
893
894 if (i != -1)
895 break;
896 }
897 }
898
899 if (i != -1)
900 actions_execute(data, i, widget, source);
901 else
902 g_warning ("Error: did not find Claws Action to execute");
903 }
904
toolbar_check_action_btns(ToolbarType type)905 gboolean toolbar_check_action_btns(ToolbarType type)
906 {
907 GSList *temp, *curr, *list = toolbar_config[type].item_list;
908 gboolean modified = FALSE;
909
910 curr = list;
911 while (curr != NULL) {
912 ToolbarItem *toolbar_item = (ToolbarItem *) curr->data;
913 temp = curr;
914 curr = curr->next;
915
916 if (toolbar_item->index != A_CLAWS_ACTIONS)
917 continue;
918
919 if (prefs_actions_find_by_name(toolbar_item->text) == -1) {
920 list = g_slist_delete_link(list, temp);
921 g_free(toolbar_item->file);
922 g_free(toolbar_item->text);
923 g_free(toolbar_item);
924 modified = TRUE;
925 }
926 }
927
928 return modified;
929 }
930
931 #define CLAWS_SET_TOOL_ITEM_TIP(widget,tip) { \
932 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), tip); \
933 }
934
935 #define CLAWS_SET_ARROW_TIP(widget,tip) { \
936 gtk_menu_tool_button_set_arrow_tooltip_text(GTK_MENU_TOOL_BUTTON(widget), tip); \
937 }
938
activate_compose_button(Toolbar * toolbar,ToolbarStyle style,ComposeButtonType type)939 static void activate_compose_button (Toolbar *toolbar,
940 ToolbarStyle style,
941 ComposeButtonType type)
942 {
943 if ((!toolbar->compose_mail_btn))
944 return;
945
946 if (type == COMPOSEBUTTON_NEWS) {
947 gtk_tool_button_set_icon_widget(
948 GTK_TOOL_BUTTON(toolbar->compose_mail_btn),
949 toolbar->compose_news_icon);
950 #ifndef GENERIC_UMPC
951 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar->compose_mail_btn), _("Compose News message"));
952 #endif
953 gtk_widget_show(toolbar->compose_news_icon);
954 } else {
955 gtk_tool_button_set_icon_widget(
956 GTK_TOOL_BUTTON(toolbar->compose_mail_btn),
957 toolbar->compose_mail_icon);
958 #ifndef GENERIC_UMPC
959 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar->compose_mail_btn), _("Compose Email"));
960 #endif
961 gtk_widget_show(toolbar->compose_mail_icon);
962 }
963 toolbar->compose_btn_type = type;
964 }
965
toolbar_set_compose_button(Toolbar * toolbar,ComposeButtonType compose_btn_type)966 void toolbar_set_compose_button(Toolbar *toolbar,
967 ComposeButtonType compose_btn_type)
968 {
969 if (toolbar->compose_btn_type != compose_btn_type)
970 activate_compose_button(toolbar,
971 prefs_common.toolbar_style,
972 compose_btn_type);
973 }
974
activate_learn_button(Toolbar * toolbar,ToolbarStyle style,LearnButtonType type)975 static void activate_learn_button (Toolbar *toolbar,
976 ToolbarStyle style,
977 LearnButtonType type)
978 {
979 if ((!toolbar->learn_spam_btn))
980 return;
981
982 if (type == LEARN_SPAM) {
983 gtk_tool_button_set_icon_widget(
984 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
985 toolbar->learn_spam_icon);
986 gtk_tool_button_set_label(
987 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
988 _("Spam"));
989 #ifndef GENERIC_UMPC
990 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar->learn_spam_btn), _("Learn spam"));
991 #endif
992 gtk_widget_show(toolbar->learn_spam_icon);
993 } else {
994 gtk_tool_button_set_icon_widget(
995 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
996 toolbar->learn_ham_icon);
997 gtk_tool_button_set_label(
998 GTK_TOOL_BUTTON(toolbar->learn_spam_btn),
999 _("Ham"));
1000 #ifndef GENERIC_UMPC
1001 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(toolbar->learn_spam_btn), _("Learn ham"));
1002 #endif
1003 gtk_widget_show(toolbar->learn_ham_icon);
1004 }
1005 toolbar->learn_btn_type = type;
1006 }
1007
toolbar_set_learn_button(Toolbar * toolbar,LearnButtonType learn_btn_type)1008 void toolbar_set_learn_button(Toolbar *toolbar,
1009 LearnButtonType learn_btn_type)
1010 {
1011 if (toolbar->learn_btn_type != learn_btn_type)
1012 activate_learn_button(toolbar,
1013 prefs_common.toolbar_style,
1014 learn_btn_type);
1015 }
1016
toolbar_toggle(guint action,gpointer data)1017 void toolbar_toggle(guint action, gpointer data)
1018 {
1019 MainWindow *mainwin = (MainWindow*)data;
1020 const GList *list;
1021 const GList *cur;
1022
1023 cm_return_if_fail(mainwin != NULL);
1024
1025 toolbar_style(TOOLBAR_MAIN, action, mainwin);
1026
1027 list = compose_get_compose_list();
1028 for (cur = list; cur != NULL; cur = cur->next) {
1029 toolbar_style(TOOLBAR_COMPOSE, action, cur->data);
1030 }
1031 list = messageview_get_msgview_list();
1032 for (cur = list; cur != NULL; cur = cur->next) {
1033 toolbar_style(TOOLBAR_MSGVIEW, action, cur->data);
1034 }
1035
1036 }
1037
toolbar_set_style(GtkWidget * toolbar_wid,GtkWidget * handlebox_wid,guint action)1038 void toolbar_set_style(GtkWidget *toolbar_wid, GtkWidget *handlebox_wid, guint action)
1039 {
1040 switch ((ToolbarStyle)action) {
1041 case TOOLBAR_NONE:
1042 gtk_widget_hide(handlebox_wid);
1043 break;
1044 case TOOLBAR_ICON:
1045 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
1046 GTK_TOOLBAR_ICONS);
1047 break;
1048 case TOOLBAR_TEXT:
1049 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
1050 GTK_TOOLBAR_TEXT);
1051 break;
1052 case TOOLBAR_BOTH:
1053 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
1054 GTK_TOOLBAR_BOTH);
1055 break;
1056 case TOOLBAR_BOTH_HORIZ:
1057 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar_wid),
1058 GTK_TOOLBAR_BOTH_HORIZ);
1059 break;
1060 default:
1061 return;
1062 }
1063
1064 prefs_common.toolbar_style = (ToolbarStyle)action;
1065 gtk_widget_set_size_request(handlebox_wid, 1, -1);
1066
1067 if (prefs_common.toolbar_style != TOOLBAR_NONE) {
1068 gtk_widget_show(handlebox_wid);
1069 gtk_widget_queue_resize(handlebox_wid);
1070 }
1071 }
1072 /*
1073 * Change the style of toolbar
1074 */
toolbar_style(ToolbarType type,guint action,gpointer data)1075 static void toolbar_style(ToolbarType type, guint action, gpointer data)
1076 {
1077 GtkWidget *handlebox_wid;
1078 GtkWidget *toolbar_wid;
1079 MainWindow *mainwin = (MainWindow*)data;
1080 Compose *compose = (Compose*)data;
1081 MessageView *msgview = (MessageView*)data;
1082
1083 cm_return_if_fail(data != NULL);
1084
1085 switch (type) {
1086 case TOOLBAR_MAIN:
1087 handlebox_wid = mainwin->handlebox;
1088 toolbar_wid = mainwin->toolbar->toolbar;
1089 break;
1090 case TOOLBAR_COMPOSE:
1091 handlebox_wid = compose->handlebox;
1092 toolbar_wid = compose->toolbar->toolbar;
1093 break;
1094 case TOOLBAR_MSGVIEW:
1095 handlebox_wid = msgview->handlebox;
1096 toolbar_wid = msgview->toolbar->toolbar;
1097 break;
1098 default:
1099
1100 return;
1101 }
1102 toolbar_set_style(toolbar_wid, handlebox_wid, action);
1103 }
1104
1105 /* Toolbar handling */
toolbar_inc_cb(GtkWidget * widget,gpointer data)1106 static void toolbar_inc_cb(GtkWidget *widget,
1107 gpointer data)
1108 {
1109 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1110 MainWindow *mainwin;
1111
1112 cm_return_if_fail(toolbar_item != NULL);
1113
1114 switch (toolbar_item->type) {
1115 case TOOLBAR_MAIN:
1116 mainwin = (MainWindow*)toolbar_item->parent;
1117 inc_mail_cb(mainwin, 0, NULL);
1118 break;
1119 default:
1120 break;
1121 }
1122 }
1123
toolbar_inc_all_cb(GtkWidget * widget,gpointer data)1124 static void toolbar_inc_all_cb(GtkWidget *widget,
1125 gpointer data)
1126 {
1127 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1128 MainWindow *mainwin;
1129
1130 cm_return_if_fail(toolbar_item != NULL);
1131
1132 switch (toolbar_item->type) {
1133 case TOOLBAR_MAIN:
1134 mainwin = (MainWindow*)toolbar_item->parent;
1135 inc_all_account_mail_cb(mainwin, 0, NULL);
1136 break;
1137 default:
1138 break;
1139 }
1140 }
1141
toolbar_send_queued_cb(GtkWidget * widget,gpointer data)1142 static void toolbar_send_queued_cb(GtkWidget *widget,gpointer data)
1143 {
1144 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1145 MainWindow *mainwin;
1146
1147 cm_return_if_fail(toolbar_item != NULL);
1148
1149 switch (toolbar_item->type) {
1150 case TOOLBAR_MAIN:
1151 mainwin = (MainWindow*)toolbar_item->parent;
1152 send_queue_cb(mainwin, 0, NULL);
1153 break;
1154 default:
1155 break;
1156 }
1157 }
1158
toolbar_exec_cb(GtkWidget * widget,gpointer data)1159 static void toolbar_exec_cb(GtkWidget *widget,
1160 gpointer data)
1161 {
1162 MainWindow *mainwin = get_mainwin(data);
1163
1164 cm_return_if_fail(mainwin != NULL);
1165 summary_execute(mainwin->summaryview);
1166 }
1167
1168 /*
1169 * Delete current/selected(s) message(s)
1170 */
toolbar_trash_cb(GtkWidget * widget,gpointer data)1171 static void toolbar_trash_cb(GtkWidget *widget, gpointer data)
1172 {
1173 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1174 MainWindow *mainwin;
1175
1176 cm_return_if_fail(toolbar_item != NULL);
1177 cm_return_if_fail(toolbar_item->parent);
1178
1179 switch (toolbar_item->type) {
1180 case TOOLBAR_MSGVIEW:
1181 messageview_delete((MessageView *)toolbar_item->parent);
1182 break;
1183 case TOOLBAR_MAIN:
1184 mainwin = (MainWindow *)toolbar_item->parent;
1185 summary_delete_trash(mainwin->summaryview);
1186 break;
1187 default:
1188 debug_print("toolbar event not supported\n");
1189 break;
1190 }
1191 }
1192
1193 /*
1194 * Delete current/selected(s) message(s)
1195 */
toolbar_delete_cb(GtkWidget * widget,gpointer data)1196 static void toolbar_delete_cb(GtkWidget *widget, gpointer data)
1197 {
1198 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1199 MainWindow *mainwin;
1200
1201 cm_return_if_fail(toolbar_item != NULL);
1202 cm_return_if_fail(toolbar_item->parent);
1203
1204 switch (toolbar_item->type) {
1205 case TOOLBAR_MSGVIEW:
1206 messageview_delete((MessageView *)toolbar_item->parent);
1207 break;
1208 case TOOLBAR_MAIN:
1209 mainwin = (MainWindow *)toolbar_item->parent;
1210 summary_delete(mainwin->summaryview);
1211 break;
1212 default:
1213 debug_print("toolbar event not supported\n");
1214 break;
1215 }
1216 }
1217
toolbar_delete_dup(gpointer data,guint all)1218 static void toolbar_delete_dup(gpointer data, guint all)
1219 {
1220 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1221 MainWindow *mainwin = NULL;
1222
1223 cm_return_if_fail(toolbar_item != NULL);
1224
1225 switch (toolbar_item->type) {
1226 case TOOLBAR_MAIN:
1227 mainwin = (MainWindow*)toolbar_item->parent;
1228 if (all)
1229 mainwindow_delete_duplicated_all(mainwin);
1230 else
1231 mainwindow_delete_duplicated(mainwin);
1232 break;
1233 case TOOLBAR_COMPOSE:
1234 case TOOLBAR_MSGVIEW:
1235 break;
1236 default:
1237 debug_print("toolbar event not supported\n");
1238 return;
1239 }
1240 }
1241
toolbar_delete_dup_cb(GtkWidget * widget,gpointer data)1242 static void toolbar_delete_dup_cb(GtkWidget *widget, gpointer data)
1243 {
1244 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1245 MainWindow *mainwin = NULL;
1246
1247 cm_return_if_fail(toolbar_item != NULL);
1248
1249 switch (toolbar_item->type) {
1250 case TOOLBAR_MAIN:
1251 mainwin = (MainWindow*)toolbar_item->parent;
1252 mainwindow_delete_duplicated(mainwin);
1253 break;
1254 case TOOLBAR_COMPOSE:
1255 case TOOLBAR_MSGVIEW:
1256 break;
1257 default:
1258 return;
1259 }
1260 }
1261
1262 /*
1263 * Compose new message
1264 */
toolbar_compose_cb(GtkWidget * widget,gpointer data)1265 static void toolbar_compose_cb(GtkWidget *widget, gpointer data)
1266 {
1267 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1268 MainWindow *mainwin;
1269 MessageView *msgview;
1270
1271 cm_return_if_fail(toolbar_item != NULL);
1272
1273 switch (toolbar_item->type) {
1274 case TOOLBAR_MAIN:
1275 mainwin = (MainWindow*)toolbar_item->parent;
1276 if (mainwin->toolbar->compose_btn_type == COMPOSEBUTTON_NEWS)
1277 compose_news_cb(mainwin, 0, NULL);
1278 else
1279 compose_mail_cb(mainwin, 0, NULL);
1280 break;
1281 case TOOLBAR_MSGVIEW:
1282 msgview = (MessageView*)toolbar_item->parent;
1283 compose_new_with_folderitem(NULL,
1284 msgview->msginfo->folder, NULL);
1285 break;
1286 default:
1287 debug_print("toolbar event not supported\n");
1288 }
1289 }
1290
toolbar_learn(gpointer data,guint as_spam)1291 static void toolbar_learn(gpointer data, guint as_spam)
1292 {
1293 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1294 MainWindow *mainwin;
1295 MessageView *msgview;
1296
1297 cm_return_if_fail(toolbar_item != NULL);
1298
1299 switch (toolbar_item->type) {
1300 case TOOLBAR_MAIN:
1301 mainwin = (MainWindow*)toolbar_item->parent;
1302 if (as_spam)
1303 mainwindow_learn(mainwin, TRUE);
1304 else
1305 mainwindow_learn(mainwin, FALSE);
1306 break;
1307 case TOOLBAR_MSGVIEW:
1308 msgview = (MessageView*)toolbar_item->parent;
1309 if (as_spam)
1310 messageview_learn(msgview, TRUE);
1311 else
1312 messageview_learn(msgview, FALSE);
1313 break;
1314 default:
1315 debug_print("toolbar event not supported\n");
1316 }
1317 }
1318
toolbar_learn_cb(GtkWidget * widget,gpointer data)1319 static void toolbar_learn_cb(GtkWidget *widget, gpointer data)
1320 {
1321 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1322 MainWindow *mainwin;
1323 MessageView *msgview;
1324
1325 cm_return_if_fail(toolbar_item != NULL);
1326
1327 switch (toolbar_item->type) {
1328 case TOOLBAR_MAIN:
1329 mainwin = (MainWindow*)toolbar_item->parent;
1330 if (mainwin->toolbar->learn_btn_type == LEARN_SPAM)
1331 mainwindow_learn(mainwin, TRUE);
1332 else
1333 mainwindow_learn(mainwin, FALSE);
1334 break;
1335 case TOOLBAR_MSGVIEW:
1336 msgview = (MessageView*)toolbar_item->parent;
1337 if (msgview->toolbar->learn_btn_type == LEARN_SPAM)
1338 messageview_learn(msgview, TRUE);
1339 else
1340 messageview_learn(msgview, FALSE);
1341 break;
1342 default:
1343 debug_print("toolbar event not supported\n");
1344 }
1345 }
1346
1347
1348 /*
1349 * Reply Message
1350 */
toolbar_reply_cb(GtkWidget * widget,gpointer data)1351 static void toolbar_reply_cb(GtkWidget *widget, gpointer data)
1352 {
1353 toolbar_reply(data, (prefs_common.reply_with_quote ?
1354 COMPOSE_REPLY_WITH_QUOTE : COMPOSE_REPLY_WITHOUT_QUOTE));
1355 }
1356
1357
1358 /*
1359 * Reply message to Sender and All recipients
1360 */
toolbar_reply_to_all_cb(GtkWidget * widget,gpointer data)1361 static void toolbar_reply_to_all_cb(GtkWidget *widget, gpointer data)
1362 {
1363 toolbar_reply(data,
1364 (prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_ALL_WITH_QUOTE
1365 : COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE));
1366 }
1367
1368
1369 /*
1370 * Reply to Mailing List
1371 */
toolbar_reply_to_list_cb(GtkWidget * widget,gpointer data)1372 static void toolbar_reply_to_list_cb(GtkWidget *widget, gpointer data)
1373 {
1374 toolbar_reply(data,
1375 (prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_LIST_WITH_QUOTE
1376 : COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE));
1377 }
1378
1379
1380 /*
1381 * Reply to sender of message
1382 */
toolbar_reply_to_sender_cb(GtkWidget * widget,gpointer data)1383 static void toolbar_reply_to_sender_cb(GtkWidget *widget, gpointer data)
1384 {
1385 toolbar_reply(data,
1386 (prefs_common.reply_with_quote ? COMPOSE_REPLY_TO_SENDER_WITH_QUOTE
1387 : COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE));
1388 }
1389
1390 /*
1391 * Open addressbook
1392 */
toolbar_addrbook_cb(GtkWidget * widget,gpointer data)1393 static void toolbar_addrbook_cb(GtkWidget *widget, gpointer data)
1394 {
1395 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1396 Compose *compose;
1397
1398 cm_return_if_fail(toolbar_item != NULL);
1399
1400 switch (toolbar_item->type) {
1401 case TOOLBAR_MAIN:
1402 case TOOLBAR_MSGVIEW:
1403 compose = NULL;
1404 break;
1405 case TOOLBAR_COMPOSE:
1406 compose = (Compose *)toolbar_item->parent;
1407 break;
1408 default:
1409 return;
1410 }
1411 #ifndef USE_ALT_ADDRBOOK
1412 addressbook_open(compose);
1413 #else
1414 GError* error = NULL;
1415 addressbook_connect_signals(compose);
1416 addressbook_dbus_open(TRUE, &error);
1417 if (error) {
1418 g_warning("%s", error->message);
1419 g_error_free(error);
1420 }
1421 #endif
1422 }
1423
1424
1425 /*
1426 * Forward current/selected(s) message(s)
1427 */
toolbar_forward_cb(GtkWidget * widget,gpointer data)1428 static void toolbar_forward_cb(GtkWidget *widget, gpointer data)
1429 {
1430 toolbar_reply(data, (COMPOSE_FORWARD));
1431 }
1432
1433 /*
1434 * Goto Prev Unread Message
1435 */
toolbar_prev_unread_cb(GtkWidget * widget,gpointer data)1436 static void toolbar_prev_unread_cb(GtkWidget *widget, gpointer data)
1437 {
1438 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1439 MainWindow *mainwin;
1440 MessageView *msgview;
1441
1442 cm_return_if_fail(toolbar_item != NULL);
1443
1444 switch (toolbar_item->type) {
1445 case TOOLBAR_MAIN:
1446 mainwin = (MainWindow*)toolbar_item->parent;
1447 summary_select_prev_unread(mainwin->summaryview);
1448 break;
1449
1450 case TOOLBAR_MSGVIEW:
1451 msgview = (MessageView*)toolbar_item->parent;
1452 msgview->updating = TRUE;
1453 summary_select_prev_unread(msgview->mainwin->summaryview);
1454 msgview->updating = FALSE;
1455
1456 if (msgview->deferred_destroy) {
1457 debug_print("messageview got away!\n");
1458 messageview_destroy(msgview);
1459 return;
1460 }
1461
1462 /* Now we need to update the messageview window */
1463 if (msgview->mainwin->summaryview->selected) {
1464 #ifndef GENERIC_UMPC
1465 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1466
1467 if (msginfo)
1468 messageview_show(msgview, msginfo,
1469 msgview->all_headers);
1470 #endif
1471 } else {
1472 gtk_widget_destroy(msgview->window);
1473 }
1474 break;
1475 default:
1476 debug_print("toolbar event not supported\n");
1477 }
1478 }
1479
1480 /*
1481 * Goto Next Unread Message
1482 */
toolbar_next_unread_cb(GtkWidget * widget,gpointer data)1483 static void toolbar_next_unread_cb(GtkWidget *widget, gpointer data)
1484 {
1485 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1486 MainWindow *mainwin;
1487 MessageView *msgview;
1488
1489 cm_return_if_fail(toolbar_item != NULL);
1490
1491 switch (toolbar_item->type) {
1492 case TOOLBAR_MAIN:
1493 mainwin = (MainWindow*)toolbar_item->parent;
1494 summary_select_next_unread(mainwin->summaryview);
1495 break;
1496
1497 case TOOLBAR_MSGVIEW:
1498 msgview = (MessageView*)toolbar_item->parent;
1499 msgview->updating = TRUE;
1500 summary_select_next_unread(msgview->mainwin->summaryview);
1501 msgview->updating = FALSE;
1502
1503 if (msgview->deferred_destroy) {
1504 debug_print("messageview got away!\n");
1505 messageview_destroy(msgview);
1506 return;
1507 }
1508
1509 /* Now we need to update the messageview window */
1510 if (msgview->mainwin->summaryview->selected) {
1511 #ifndef GENERIC_UMPC
1512 MsgInfo * msginfo = summary_get_selected_msg(msgview->mainwin->summaryview);
1513
1514 if (msginfo)
1515 messageview_show(msgview, msginfo,
1516 msgview->all_headers);
1517 #endif
1518 } else {
1519 gtk_widget_destroy(msgview->window);
1520 }
1521 break;
1522 default:
1523 debug_print("toolbar event not supported\n");
1524 }
1525 }
1526
toolbar_ignore_thread_cb(GtkWidget * widget,gpointer data)1527 static void toolbar_ignore_thread_cb(GtkWidget *widget, gpointer data)
1528 {
1529 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1530 MainWindow *mainwin;
1531
1532 cm_return_if_fail(toolbar_item != NULL);
1533
1534 switch (toolbar_item->type) {
1535 case TOOLBAR_MAIN:
1536 mainwin = (MainWindow *) toolbar_item->parent;
1537 summary_toggle_ignore_thread(mainwin->summaryview);
1538 break;
1539 case TOOLBAR_MSGVIEW:
1540 /* TODO: see toolbar_next_unread_cb() if you need
1541 * this in the message view */
1542 break;
1543 default:
1544 debug_print("toolbar event not supported\n");
1545 break;
1546 }
1547 }
1548
toolbar_watch_thread_cb(GtkWidget * widget,gpointer data)1549 static void toolbar_watch_thread_cb(GtkWidget *widget, gpointer data)
1550 {
1551 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1552 MainWindow *mainwin;
1553
1554 cm_return_if_fail(toolbar_item != NULL);
1555
1556 switch (toolbar_item->type) {
1557 case TOOLBAR_MAIN:
1558 mainwin = (MainWindow *) toolbar_item->parent;
1559 summary_toggle_watch_thread(mainwin->summaryview);
1560 break;
1561 case TOOLBAR_MSGVIEW:
1562 /* TODO: see toolbar_next_unread_cb() if you need
1563 * this in the message view */
1564 break;
1565 default:
1566 debug_print("toolbar event not supported\n");
1567 break;
1568 }
1569 }
1570
toolbar_mark_cb(GtkWidget * widget,gpointer data)1571 static void toolbar_mark_cb(GtkWidget *widget, gpointer data)
1572 {
1573 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1574 MainWindow *mainwin;
1575
1576 cm_return_if_fail(toolbar_item != NULL);
1577
1578 switch (toolbar_item->type) {
1579 case TOOLBAR_MAIN:
1580 mainwin = (MainWindow *) toolbar_item->parent;
1581 summary_mark(mainwin->summaryview);
1582 break;
1583 case TOOLBAR_MSGVIEW:
1584 /* TODO: see toolbar_next_unread_cb() if you need
1585 * this in the message view */
1586 break;
1587 default:
1588 debug_print("toolbar event not supported\n");
1589 break;
1590 }
1591 }
1592
toolbar_unmark_cb(GtkWidget * widget,gpointer data)1593 static void toolbar_unmark_cb(GtkWidget *widget, gpointer data)
1594 {
1595 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1596 MainWindow *mainwin;
1597
1598 cm_return_if_fail(toolbar_item != NULL);
1599
1600 switch (toolbar_item->type) {
1601 case TOOLBAR_MAIN:
1602 mainwin = (MainWindow *) toolbar_item->parent;
1603 summary_unmark(mainwin->summaryview);
1604 break;
1605 case TOOLBAR_MSGVIEW:
1606 /* TODO: see toolbar_next_unread_cb() if you need
1607 * this in the message view */
1608 break;
1609 default:
1610 debug_print("toolbar event not supported\n");
1611 break;
1612 }
1613 }
1614
toolbar_lock_cb(GtkWidget * widget,gpointer data)1615 static void toolbar_lock_cb(GtkWidget *widget, gpointer data)
1616 {
1617 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1618 MainWindow *mainwin;
1619
1620 cm_return_if_fail(toolbar_item != NULL);
1621
1622 switch (toolbar_item->type) {
1623 case TOOLBAR_MAIN:
1624 mainwin = (MainWindow *) toolbar_item->parent;
1625 summary_msgs_lock(mainwin->summaryview);
1626 break;
1627 case TOOLBAR_MSGVIEW:
1628 /* TODO: see toolbar_next_unread_cb() if you need
1629 * this in the message view */
1630 break;
1631 default:
1632 debug_print("toolbar event not supported\n");
1633 break;
1634 }
1635 }
1636
toolbar_unlock_cb(GtkWidget * widget,gpointer data)1637 static void toolbar_unlock_cb(GtkWidget *widget, gpointer data)
1638 {
1639 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1640 MainWindow *mainwin;
1641
1642 cm_return_if_fail(toolbar_item != NULL);
1643
1644 switch (toolbar_item->type) {
1645 case TOOLBAR_MAIN:
1646 mainwin = (MainWindow *) toolbar_item->parent;
1647 summary_msgs_unlock(mainwin->summaryview);
1648 break;
1649 case TOOLBAR_MSGVIEW:
1650 /* TODO: see toolbar_next_unread_cb() if you need
1651 * this in the message view */
1652 break;
1653 default:
1654 debug_print("toolbar event not supported\n");
1655 break;
1656 }
1657 }
1658
toolbar_all_read_cb(GtkWidget * widget,gpointer data)1659 static void toolbar_all_read_cb(GtkWidget *widget, gpointer data)
1660 {
1661 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1662 MainWindow *mainwin;
1663
1664 cm_return_if_fail(toolbar_item != NULL);
1665
1666 switch (toolbar_item->type) {
1667 case TOOLBAR_MAIN:
1668 mainwin = (MainWindow *) toolbar_item->parent;
1669 summary_mark_all_read(mainwin->summaryview, TRUE);
1670 break;
1671 case TOOLBAR_MSGVIEW:
1672 /* TODO: see toolbar_next_unread_cb() if you need
1673 * this in the message view */
1674 break;
1675 default:
1676 debug_print("toolbar event not supported\n");
1677 break;
1678 }
1679 }
1680
toolbar_all_unread_cb(GtkWidget * widget,gpointer data)1681 static void toolbar_all_unread_cb(GtkWidget *widget, gpointer data)
1682 {
1683 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1684 MainWindow *mainwin;
1685
1686 cm_return_if_fail(toolbar_item != NULL);
1687
1688 switch (toolbar_item->type) {
1689 case TOOLBAR_MAIN:
1690 mainwin = (MainWindow *) toolbar_item->parent;
1691 summary_mark_all_unread(mainwin->summaryview, TRUE);
1692 break;
1693 case TOOLBAR_MSGVIEW:
1694 /* TODO: see toolbar_next_unread_cb() if you need
1695 * this in the message view */
1696 break;
1697 default:
1698 debug_print("toolbar event not supported\n");
1699 break;
1700 }
1701 }
1702
toolbar_read_cb(GtkWidget * widget,gpointer data)1703 static void toolbar_read_cb(GtkWidget *widget, gpointer data)
1704 {
1705 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1706 MainWindow *mainwin;
1707
1708 cm_return_if_fail(toolbar_item != NULL);
1709
1710 switch (toolbar_item->type) {
1711 case TOOLBAR_MAIN:
1712 mainwin = (MainWindow *) toolbar_item->parent;
1713 summary_mark_as_read(mainwin->summaryview);
1714 break;
1715 case TOOLBAR_MSGVIEW:
1716 /* TODO: see toolbar_next_unread_cb() if you need
1717 * this in the message view */
1718 break;
1719 default:
1720 debug_print("toolbar event not supported\n");
1721 break;
1722 }
1723 }
1724
toolbar_unread_cb(GtkWidget * widget,gpointer data)1725 static void toolbar_unread_cb(GtkWidget *widget, gpointer data)
1726 {
1727 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1728 MainWindow *mainwin;
1729
1730 cm_return_if_fail(toolbar_item != NULL);
1731
1732 switch (toolbar_item->type) {
1733 case TOOLBAR_MAIN:
1734 mainwin = (MainWindow *) toolbar_item->parent;
1735 summary_mark_as_unread(mainwin->summaryview);
1736 break;
1737 case TOOLBAR_MSGVIEW:
1738 /* TODO: see toolbar_next_unread_cb() if you need
1739 * this in the message view */
1740 break;
1741 default:
1742 debug_print("toolbar event not supported\n");
1743 break;
1744 }
1745 }
1746
toolbar_cancel_inc_cb(GtkWidget * widget,gpointer data)1747 static void toolbar_cancel_inc_cb(GtkWidget *widget, gpointer data)
1748 {
1749 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1750
1751 cm_return_if_fail(toolbar_item != NULL);
1752 inc_cancel_all();
1753 imap_cancel_all();
1754 }
1755
toolbar_cancel_send_cb(GtkWidget * widget,gpointer data)1756 static void toolbar_cancel_send_cb(GtkWidget *widget, gpointer data)
1757 {
1758 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1759
1760 cm_return_if_fail(toolbar_item != NULL);
1761 send_cancel();
1762 }
1763
toolbar_cancel_all_cb(GtkWidget * widget,gpointer data)1764 static void toolbar_cancel_all_cb(GtkWidget *widget, gpointer data)
1765 {
1766 toolbar_cancel_inc_cb(widget, data);
1767 toolbar_cancel_send_cb(widget, data);
1768 }
1769
toolbar_print_cb(GtkWidget * widget,gpointer data)1770 static void toolbar_print_cb(GtkWidget *widget, gpointer data)
1771 {
1772 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1773 MainWindow *mainwin;
1774
1775 cm_return_if_fail(toolbar_item != NULL);
1776
1777 switch (toolbar_item->type) {
1778 case TOOLBAR_MAIN:
1779 mainwin = (MainWindow *) toolbar_item->parent;
1780 summary_print(mainwin->summaryview);
1781 break;
1782 case TOOLBAR_MSGVIEW:
1783 /* TODO: see toolbar_next_unread_cb() if you need
1784 * this in the message view */
1785 break;
1786 default:
1787 debug_print("toolbar event not supported\n");
1788 break;
1789 }
1790 }
1791
toolbar_send_cb(GtkWidget * widget,gpointer data)1792 static void toolbar_send_cb(GtkWidget *widget, gpointer data)
1793 {
1794 compose_toolbar_cb(A_SEND, data);
1795 }
1796
toolbar_send_later_cb(GtkWidget * widget,gpointer data)1797 static void toolbar_send_later_cb(GtkWidget *widget, gpointer data)
1798 {
1799 compose_toolbar_cb(A_SEND_LATER, data);
1800 }
1801
toolbar_draft_cb(GtkWidget * widget,gpointer data)1802 static void toolbar_draft_cb(GtkWidget *widget, gpointer data)
1803 {
1804 compose_toolbar_cb(A_DRAFT, data);
1805 }
1806
toolbar_close_cb(GtkWidget * widget,gpointer data)1807 static void toolbar_close_cb(GtkWidget *widget, gpointer data)
1808 {
1809 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1810 MainWindow *mainwin;
1811 MessageView *messageview;
1812 Compose *compose;
1813
1814 cm_return_if_fail(toolbar_item != NULL);
1815
1816 switch (toolbar_item->type) {
1817 case TOOLBAR_MAIN:
1818 mainwin = (MainWindow *) toolbar_item->parent;
1819 app_will_exit(NULL, mainwin);
1820 break;
1821 case TOOLBAR_MSGVIEW:
1822 messageview = (MessageView *)toolbar_item->parent;
1823 messageview_destroy(messageview);
1824 break;
1825 case TOOLBAR_COMPOSE:
1826 compose = (Compose *)toolbar_item->parent;
1827 compose_close_toolbar(compose);
1828 break;
1829 }
1830 }
1831
toolbar_preferences_cb(GtkWidget * widget,gpointer data)1832 static void toolbar_preferences_cb(GtkWidget *widget, gpointer data)
1833 {
1834 prefs_gtk_open();
1835 }
1836
toolbar_open_mail_cb(GtkWidget * widget,gpointer data)1837 static void toolbar_open_mail_cb(GtkWidget *widget, gpointer data)
1838 {
1839 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1840 MainWindow *mainwin;
1841
1842 cm_return_if_fail(toolbar_item != NULL);
1843
1844 switch (toolbar_item->type) {
1845 case TOOLBAR_MAIN:
1846 mainwin = (MainWindow *) toolbar_item->parent;
1847 summary_open_row(NULL, mainwin->summaryview);
1848 break;
1849 case TOOLBAR_MSGVIEW:
1850 debug_print("toolbar event not supported\n");
1851 break;
1852 case TOOLBAR_COMPOSE:
1853 debug_print("toolbar event not supported\n");
1854 break;
1855 }
1856 }
1857
toolbar_insert_cb(GtkWidget * widget,gpointer data)1858 static void toolbar_insert_cb(GtkWidget *widget, gpointer data)
1859 {
1860 compose_toolbar_cb(A_INSERT, data);
1861 }
1862
toolbar_attach_cb(GtkWidget * widget,gpointer data)1863 static void toolbar_attach_cb(GtkWidget *widget, gpointer data)
1864 {
1865 compose_toolbar_cb(A_ATTACH, data);
1866 }
1867
toolbar_sig_cb(GtkWidget * widget,gpointer data)1868 static void toolbar_sig_cb(GtkWidget *widget, gpointer data)
1869 {
1870 compose_toolbar_cb(A_SIG, data);
1871 }
1872
toolbar_replace_sig_cb(GtkWidget * widget,gpointer data)1873 static void toolbar_replace_sig_cb(GtkWidget *widget, gpointer data)
1874 {
1875 compose_toolbar_cb(A_REP_SIG, data);
1876 }
1877
toolbar_ext_editor_cb(GtkWidget * widget,gpointer data)1878 static void toolbar_ext_editor_cb(GtkWidget *widget, gpointer data)
1879 {
1880 compose_toolbar_cb(A_EXTEDITOR, data);
1881 }
1882
toolbar_linewrap_current_cb(GtkWidget * widget,gpointer data)1883 static void toolbar_linewrap_current_cb(GtkWidget *widget, gpointer data)
1884 {
1885 compose_toolbar_cb(A_LINEWRAP_CURRENT, data);
1886 }
1887
toolbar_linewrap_all_cb(GtkWidget * widget,gpointer data)1888 static void toolbar_linewrap_all_cb(GtkWidget *widget, gpointer data)
1889 {
1890 compose_toolbar_cb(A_LINEWRAP_ALL, data);
1891 }
1892
1893 #ifdef USE_ENCHANT
toolbar_check_spelling_cb(GtkWidget * widget,gpointer data)1894 static void toolbar_check_spelling_cb(GtkWidget *widget, gpointer data)
1895 {
1896 compose_toolbar_cb(A_CHECK_SPELLING, data);
1897 }
1898 #endif
1899
toolbar_privacy_sign_cb(GtkWidget * widget,gpointer data)1900 static void toolbar_privacy_sign_cb(GtkWidget *widget, gpointer data)
1901 {
1902 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1903 Compose *compose = (Compose *)toolbar_item->parent;
1904 gboolean state = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget));
1905
1906 cm_return_if_fail(compose != NULL);
1907 compose_use_signing(compose, state);
1908 }
1909
1910 /* Any time the toggle button gets toggled, we want to update its tooltip. */
toolbar_privacy_sign_toggled_cb(GtkWidget * widget,gpointer data)1911 static void toolbar_privacy_sign_toggled_cb(GtkWidget *widget, gpointer data)
1912 {
1913 gboolean state = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget));
1914
1915 if (state)
1916 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), _("Message will be signed"));
1917 else
1918 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), _("Message will not be signed"));
1919 }
1920
toolbar_privacy_encrypt_cb(GtkWidget * widget,gpointer data)1921 static void toolbar_privacy_encrypt_cb(GtkWidget *widget, gpointer data)
1922 {
1923 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1924 Compose *compose = (Compose *)toolbar_item->parent;
1925 gboolean state = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget));
1926
1927 cm_return_if_fail(compose != NULL);
1928 compose_use_encryption(compose, state);
1929 }
1930
1931 /* Any time the toggle button gets toggled, we want to update its tooltip. */
toolbar_privacy_encrypt_toggled_cb(GtkWidget * widget,gpointer data)1932 static void toolbar_privacy_encrypt_toggled_cb(GtkWidget *widget, gpointer data)
1933 {
1934 gboolean state = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget));
1935
1936 if (state)
1937 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), _("Message will be encrypted"));
1938 else
1939 gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), _("Message will not be encrypted"));
1940 }
1941
1942 /*
1943 * Execute actions from toolbar
1944 */
toolbar_actions_execute_cb(GtkWidget * widget,gpointer data)1945 static void toolbar_actions_execute_cb(GtkWidget *widget, gpointer data)
1946 {
1947 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1948 GSList *action_list;
1949 MainWindow *mainwin;
1950 Compose *compose;
1951 MessageView *msgview;
1952 gpointer parent = toolbar_item->parent;
1953
1954 cm_return_if_fail(toolbar_item != NULL);
1955
1956 switch (toolbar_item->type) {
1957 case TOOLBAR_MAIN:
1958 mainwin = (MainWindow*)parent;
1959 action_list = mainwin->toolbar->action_list;
1960 break;
1961 case TOOLBAR_COMPOSE:
1962 compose = (Compose*)parent;
1963 action_list = compose->toolbar->action_list;
1964 break;
1965 case TOOLBAR_MSGVIEW:
1966 msgview = (MessageView*)parent;
1967 action_list = msgview->toolbar->action_list;
1968 break;
1969 default:
1970 debug_print("toolbar event not supported\n");
1971 return;
1972 }
1973 toolbar_action_execute(widget, action_list, parent, toolbar_item->type);
1974 }
1975
toolbar_plugins_execute_cb(GtkWidget * widget,gpointer data)1976 static void toolbar_plugins_execute_cb(GtkWidget *widget, gpointer data)
1977 {
1978 ToolbarItem *toolbar_item = data;
1979 prefs_toolbar_execute_plugin_item(toolbar_item->parent, toolbar_item->type, toolbar_item->text);
1980 }
1981
get_mainwin(gpointer data)1982 static MainWindow *get_mainwin(gpointer data)
1983 {
1984 ToolbarItem *toolbar_item = (ToolbarItem*)data;
1985 MainWindow *mainwin = NULL;
1986 MessageView *msgview;
1987
1988 cm_return_val_if_fail(toolbar_item != NULL, NULL);
1989
1990 switch(toolbar_item->type) {
1991 case TOOLBAR_MAIN:
1992 mainwin = (MainWindow*)toolbar_item->parent;
1993 break;
1994 case TOOLBAR_MSGVIEW:
1995 msgview = (MessageView*)toolbar_item->parent;
1996 mainwin = (MainWindow*)msgview->mainwin;
1997 break;
1998 default:
1999 break;
2000 }
2001
2002 return mainwin;
2003 }
2004
toolbar_go_folders_cb(GtkWidget * widget,gpointer data)2005 static void toolbar_go_folders_cb(GtkWidget *widget, gpointer data)
2006 {
2007 ToolbarItem *toolbar_item = (ToolbarItem*)data;
2008 MainWindow *mainwin = NULL;
2009 switch(toolbar_item->type) {
2010 case TOOLBAR_MAIN:
2011 mainwin = (MainWindow*)toolbar_item->parent;
2012 break;
2013 default:
2014 g_warning("wrong toolbar type");
2015 return;
2016 }
2017
2018 if (!mainwin->in_folder) {
2019 FolderItem *item = folderview_get_selected_item(mainwin->folderview);
2020 if (item) {
2021 folderview_select(mainwin->folderview, item);
2022 }
2023 } else {
2024 folderview_grab_focus(mainwin->folderview);
2025 mainwindow_exit_folder(mainwin);
2026 }
2027 }
2028
toolbar_buttons_cb(GtkWidget * widget,ToolbarItem * item)2029 static void toolbar_buttons_cb(GtkWidget *widget,
2030 ToolbarItem *item)
2031 {
2032 gint num_items;
2033 gint i;
2034 struct {
2035 gint index;
2036 void (*func)(GtkWidget *widget, gpointer data);
2037 } callbacks[] = {
2038 { A_RECEIVE_ALL, toolbar_inc_all_cb },
2039 { A_RECEIVE_CUR, toolbar_inc_cb },
2040 { A_SEND_QUEUED, toolbar_send_queued_cb },
2041 { A_COMPOSE_EMAIL, toolbar_compose_cb },
2042 { A_COMPOSE_NEWS, toolbar_compose_cb },
2043 { A_REPLY_MESSAGE, toolbar_reply_cb },
2044 { A_REPLY_SENDER, toolbar_reply_to_sender_cb },
2045 { A_REPLY_ALL, toolbar_reply_to_all_cb },
2046 { A_REPLY_ML, toolbar_reply_to_list_cb },
2047 { A_FORWARD, toolbar_forward_cb },
2048 { A_TRASH, toolbar_trash_cb },
2049 { A_DELETE_REAL, toolbar_delete_cb },
2050 { A_EXECUTE, toolbar_exec_cb },
2051 { A_GOTO_PREV, toolbar_prev_unread_cb },
2052 { A_GOTO_NEXT, toolbar_next_unread_cb },
2053 { A_IGNORE_THREAD, toolbar_ignore_thread_cb },
2054 { A_WATCH_THREAD, toolbar_watch_thread_cb },
2055 { A_MARK, toolbar_mark_cb },
2056 { A_UNMARK, toolbar_unmark_cb },
2057 { A_LOCK, toolbar_lock_cb },
2058 { A_UNLOCK, toolbar_unlock_cb },
2059 { A_ALL_READ, toolbar_all_read_cb },
2060 { A_ALL_UNREAD, toolbar_all_unread_cb },
2061 { A_READ, toolbar_read_cb },
2062 { A_UNREAD, toolbar_unread_cb },
2063 { A_PRINT, toolbar_print_cb },
2064 { A_LEARN_SPAM, toolbar_learn_cb },
2065 { A_DELETE_DUP, toolbar_delete_dup_cb },
2066 { A_GO_FOLDERS, toolbar_go_folders_cb },
2067
2068 { A_SEND, toolbar_send_cb },
2069 { A_SEND_LATER, toolbar_send_later_cb },
2070 { A_DRAFT, toolbar_draft_cb },
2071 { A_OPEN_MAIL, toolbar_open_mail_cb },
2072 { A_CLOSE, toolbar_close_cb },
2073 { A_PREFERENCES, toolbar_preferences_cb },
2074 { A_INSERT, toolbar_insert_cb },
2075 { A_ATTACH, toolbar_attach_cb },
2076 { A_SIG, toolbar_sig_cb },
2077 { A_REP_SIG, toolbar_replace_sig_cb },
2078 { A_EXTEDITOR, toolbar_ext_editor_cb },
2079 { A_LINEWRAP_CURRENT, toolbar_linewrap_current_cb },
2080 { A_LINEWRAP_ALL, toolbar_linewrap_all_cb },
2081 { A_ADDRBOOK, toolbar_addrbook_cb },
2082 #ifdef USE_ENCHANT
2083 { A_CHECK_SPELLING, toolbar_check_spelling_cb },
2084 #endif
2085 { A_PRIVACY_SIGN, toolbar_privacy_sign_cb },
2086 { A_PRIVACY_ENCRYPT, toolbar_privacy_encrypt_cb },
2087 { A_CLAWS_ACTIONS, toolbar_actions_execute_cb },
2088 { A_CANCEL_INC, toolbar_cancel_inc_cb },
2089 { A_CANCEL_SEND, toolbar_cancel_send_cb },
2090 { A_CANCEL_ALL, toolbar_cancel_all_cb },
2091 { A_CLAWS_PLUGINS, toolbar_plugins_execute_cb },
2092 };
2093
2094 num_items = sizeof(callbacks)/sizeof(callbacks[0]);
2095
2096 for (i = 0; i < num_items; i++) {
2097 if (callbacks[i].index == item->index) {
2098 callbacks[i].func(widget, item);
2099 return;
2100 }
2101 }
2102 }
2103 #ifndef GENERIC_UMPC
2104 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
2105 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
2106 gtk_widget_set_can_focus(gtk_bin_get_child(GTK_BIN(item)), FALSE); \
2107 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2108 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2109 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2110 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2111 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
2112 tooltip); \
2113 }
2114
2115 #define TOOLBAR_TOGGLE_ITEM(item,icon,text,tooltip) { \
2116 item = GTK_WIDGET(gtk_toggle_tool_button_new()); \
2117 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item), icon); \
2118 gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), text); \
2119 gtk_widget_set_can_focus(gtk_bin_get_child(GTK_BIN(item)), FALSE); \
2120 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2121 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2122 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2123 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2124 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
2125 tooltip); \
2126 }
2127
2128 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
2129 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
2130 GList *gchild = NULL; \
2131 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
2132 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2133 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2134 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2135 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2136 CLAWS_SET_TOOL_ITEM_TIP(GTK_TOOL_ITEM(item), \
2137 tooltip); \
2138 CLAWS_SET_ARROW_TIP(GTK_MENU_TOOL_BUTTON(item), menutip); \
2139 child = gtk_bin_get_child(GTK_BIN(item)); \
2140 gchild = gtk_container_get_children( \
2141 GTK_CONTAINER(child)); \
2142 btn = (GtkWidget *)gchild->data; \
2143 gtk_widget_set_can_focus(btn, FALSE); \
2144 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
2145 gtk_widget_set_can_focus(arr, FALSE); \
2146 g_list_free(gchild); \
2147 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
2148 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
2149 g_list_free(gchild); \
2150 }
2151
2152 #else
2153
2154 #define TOOLBAR_ITEM(item,icon,text,tooltip) { \
2155 item = GTK_WIDGET(gtk_tool_button_new(icon, text)); \
2156 gtk_widget_set_can_focus(gtk_bin_get_child(GTK_BIN(item)), FALSE); \
2157 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2158 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2159 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2160 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2161 }
2162
2163 #define TOOLBAR_TOGGLE_ITEM(item,icon,text,tooltip) { \
2164 item = GTK_WIDGET(gtk_toggle_tool_button_new()); \
2165 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item), icon); \
2166 gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), text); \
2167 gtk_widget_set_can_focus(gtk_bin_get_child(GTK_BIN(item)), FALSE); \
2168 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2169 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2170 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2171 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2172 }
2173
2174 #define TOOLBAR_MENUITEM(item,icon,text,tooltip,menutip) { \
2175 GtkWidget *child = NULL, *btn = NULL, *arr = NULL; \
2176 GList *gchild = NULL; \
2177 item = GTK_WIDGET(gtk_menu_tool_button_new(icon, text)); \
2178 gtk_tool_item_set_homogeneous(GTK_TOOL_ITEM(item), FALSE); \
2179 gtk_tool_item_set_is_important(GTK_TOOL_ITEM(item), TRUE); \
2180 g_signal_connect (G_OBJECT(item), "clicked", G_CALLBACK(toolbar_buttons_cb), toolbar_item); \
2181 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); \
2182 child = gtk_bin_get_child(GTK_BIN(item)); \
2183 gchild = gtk_container_get_children( \
2184 GTK_CONTAINER(child)); \
2185 btn = (GtkWidget *)gchild->data; \
2186 gtk_widget_set_can_focus(btn, FALSE); \
2187 arr = (GtkWidget *)(gchild->next?gchild->next->data:NULL); \
2188 gtk_widget_set_can_focus(arr, FALSE); \
2189 g_list_free(gchild); \
2190 gchild = gtk_container_get_children(GTK_CONTAINER(arr)); \
2191 gtk_widget_set_size_request(GTK_WIDGET(gchild->data), 9, -1); \
2192 g_list_free(gchild); \
2193 }
2194 #endif
2195
2196 #define ADD_MENU_ITEM(name,cb,data) { \
2197 item = gtk_menu_item_new_with_mnemonic(name); \
2198 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); \
2199 g_signal_connect(G_OBJECT(item), "activate", \
2200 G_CALLBACK(cb), \
2201 toolbar_item); \
2202 g_object_set_data(G_OBJECT(item), "int-value", GINT_TO_POINTER(data)); \
2203 gtk_widget_show(item); \
2204 }
2205
2206 #ifndef GENERIC_UMPC
toolbar_reply_menu_cb(GtkWidget * widget,gpointer data)2207 static void toolbar_reply_menu_cb(GtkWidget *widget, gpointer data)
2208 {
2209 gpointer int_value = g_object_get_data(G_OBJECT(widget), "int-value");
2210 ToolbarItem *toolbar_item = (ToolbarItem *)data;
2211
2212 toolbar_reply(toolbar_item, GPOINTER_TO_INT(int_value));
2213 }
2214
toolbar_delete_dup_menu_cb(GtkWidget * widget,gpointer data)2215 static void toolbar_delete_dup_menu_cb(GtkWidget *widget, gpointer data)
2216 {
2217 gpointer int_value = g_object_get_data(G_OBJECT(widget), "int-value");
2218 ToolbarItem *toolbar_item = (ToolbarItem *)data;
2219
2220 toolbar_delete_dup(toolbar_item, GPOINTER_TO_INT(int_value));
2221 }
2222 #endif
2223
toolbar_learn_menu_cb(GtkWidget * widget,gpointer data)2224 static void toolbar_learn_menu_cb(GtkWidget *widget, gpointer data)
2225 {
2226 gpointer int_value = g_object_get_data(G_OBJECT(widget), "int-value");
2227 ToolbarItem *toolbar_item = (ToolbarItem *)data;
2228
2229 toolbar_learn(toolbar_item, GPOINTER_TO_INT(int_value));
2230 }
2231
2232
2233 /**
2234 * Create a new toolbar with specified type
2235 * if a callback list is passed it will be used before the
2236 * common callback list
2237 **/
toolbar_create(ToolbarType type,GtkWidget * container,gpointer data)2238 Toolbar *toolbar_create(ToolbarType type,
2239 GtkWidget *container,
2240 gpointer data)
2241 {
2242 ToolbarItem *toolbar_item;
2243
2244 GtkWidget *toolbar;
2245 GtkWidget *icon_wid = NULL;
2246 GtkWidget *icon_news;
2247 GtkWidget *icon_ham;
2248 GtkWidget *item;
2249 ToolbarClawsActions *action_item;
2250 GSList *cur;
2251 GSList *toolbar_list;
2252 Toolbar *toolbar_data;
2253 GtkWidget *menu;
2254 toolbar_read_config_file(type);
2255 toolbar_list = toolbar_get_list(type);
2256
2257 toolbar_data = g_new0(Toolbar, 1);
2258
2259 toolbar = gtk_toolbar_new();
2260
2261 gtk_orientable_set_orientation(GTK_ORIENTABLE(toolbar), GTK_ORIENTATION_HORIZONTAL);
2262
2263 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
2264 gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar), TRUE);
2265
2266 for (cur = toolbar_list; cur != NULL; cur = cur->next) {
2267
2268 if (g_ascii_strcasecmp(((ToolbarItem*)cur->data)->file, TOOLBAR_TAG_SEPARATOR) == 0) {
2269 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new(), -1);
2270 continue;
2271 }
2272
2273 toolbar_item = g_new0(ToolbarItem, 1);
2274 toolbar_item->index = ((ToolbarItem*)cur->data)->index;
2275 toolbar_item->file = g_strdup(((ToolbarItem*)cur->data)->file);
2276 toolbar_item->text = g_strdup(((ToolbarItem*)cur->data)->text);
2277 toolbar_item->parent = data;
2278 toolbar_item->type = type;
2279
2280 /* collect toolbar items in list to keep track */
2281 toolbar_data->item_list =
2282 g_slist_append(toolbar_data->item_list,
2283 toolbar_item);
2284 icon_wid = stock_pixmap_widget(stock_pixmap_get_icon(toolbar_item->file));
2285
2286 switch (toolbar_item->index) {
2287
2288 case A_GO_FOLDERS:
2289 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to folder list"));
2290 toolbar_data->folders_btn = item;
2291 break;
2292 case A_RECEIVE_ALL:
2293 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2294 _("Receive Mail from all Accounts"),
2295 _("Receive Mail from selected Account"));
2296 toolbar_data->getall_btn = item;
2297 break;
2298 case A_RECEIVE_CUR:
2299 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Receive Mail from current Account"));
2300 toolbar_data->get_btn = item;
2301 break;
2302 case A_SEND_QUEUED:
2303 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Queued Messages"));
2304 toolbar_data->send_btn = item;
2305 break;
2306 case A_CLOSE:
2307 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Close window"));
2308 toolbar_data->close_window_btn = item;
2309 break;
2310 case A_PREFERENCES:
2311 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Open preferences"));
2312 toolbar_data->preferences_btn = item;
2313 break;
2314 case A_OPEN_MAIL:
2315 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Open email"));
2316 toolbar_data->open_mail_btn = item;
2317 break;
2318 case A_COMPOSE_EMAIL:
2319 #ifndef GENERIC_UMPC
2320 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2321 _("Compose Email"),
2322 _("Compose with selected Account"));
2323 toolbar_data->compose_mail_btn = item;
2324 toolbar_data->compose_mail_icon = icon_wid;
2325 g_object_ref_sink(toolbar_data->compose_mail_icon);
2326
2327 icon_news = stock_pixmap_widget(STOCK_PIXMAP_NEWS_COMPOSE);
2328 toolbar_data->compose_news_icon = icon_news;
2329 g_object_ref_sink(toolbar_data->compose_news_icon);
2330 #else
2331 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2332 _("Compose Email"));
2333 toolbar_data->compose_mail_btn = item;
2334 toolbar_data->compose_mail_icon = icon_wid;
2335
2336 icon_news = stock_pixmap_widget(STOCK_PIXMAP_NEWS_COMPOSE);
2337 toolbar_data->compose_news_icon = icon_news;
2338 #endif
2339 break;
2340 case A_LEARN_SPAM:
2341 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2342 _("Spam"),
2343 _("Learn as..."));
2344 toolbar_data->learn_spam_btn = item;
2345 toolbar_data->learn_spam_icon = icon_wid;
2346 g_object_ref_sink(toolbar_data->learn_spam_icon);
2347
2348 icon_ham = stock_pixmap_widget(STOCK_PIXMAP_HAM_BTN);
2349 toolbar_data->learn_ham_icon = icon_ham;
2350 g_object_ref_sink(toolbar_data->learn_ham_icon);
2351
2352 menu = gtk_menu_new();
2353 ADD_MENU_ITEM(_("Learn as _Spam"), toolbar_learn_menu_cb, TRUE);
2354 ADD_MENU_ITEM(_("Learn as _Ham"), toolbar_learn_menu_cb, FALSE);
2355 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->learn_spam_btn), menu);
2356 break;
2357 case A_DELETE_DUP:
2358 #ifndef GENERIC_UMPC
2359 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2360 _("Delete duplicates"),
2361 _("Delete duplicates options"));
2362 toolbar_data->delete_dup_btn = item;
2363
2364 menu = gtk_menu_new();
2365 ADD_MENU_ITEM(_("Delete duplicates in selected folder"), toolbar_delete_dup_menu_cb, FALSE);
2366 ADD_MENU_ITEM(_("Delete duplicates in all folders"), toolbar_delete_dup_menu_cb, TRUE);
2367 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->delete_dup_btn), menu);
2368 #else
2369 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Delete duplicates"));
2370 toolbar_data->delete_dup_btn = item;
2371 #endif
2372 break;
2373 case A_REPLY_MESSAGE:
2374 #ifndef GENERIC_UMPC
2375 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2376 _("Reply to Message"),
2377 _("Reply to Message options"));
2378 toolbar_data->reply_btn = item;
2379
2380 menu = gtk_menu_new();
2381 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_WITH_QUOTE);
2382 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_WITHOUT_QUOTE);
2383 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->reply_btn), menu);
2384 #else
2385 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2386 _("Reply to Message"));
2387 toolbar_data->reply_btn = item;
2388 #endif
2389 break;
2390 case A_REPLY_SENDER:
2391 #ifndef GENERIC_UMPC
2392 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2393 _("Reply to Sender"),
2394 _("Reply to Sender options"));
2395 toolbar_data->replysender_btn = item;
2396
2397 menu = gtk_menu_new();
2398 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_SENDER_WITH_QUOTE);
2399 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE);
2400 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->replysender_btn), menu);
2401 #else
2402 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2403 _("Reply to Sender"));
2404 toolbar_data->replysender_btn = item;
2405 #endif
2406 break;
2407 case A_REPLY_ALL:
2408 #ifndef GENERIC_UMPC
2409 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2410 _("Reply to All"),
2411 _("Reply to All options"));
2412 toolbar_data->replyall_btn = item;
2413
2414 menu = gtk_menu_new();
2415 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_ALL_WITH_QUOTE);
2416 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE);
2417 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->replyall_btn), menu);
2418 #else
2419 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2420 _("Reply to All"));
2421 toolbar_data->replyall_btn = item;
2422 #endif
2423 break;
2424 case A_REPLY_ML:
2425 #ifndef GENERIC_UMPC
2426 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2427 _("Reply to Mailing-list"),
2428 _("Reply to Mailing-list options"));
2429 toolbar_data->replylist_btn = item;
2430
2431 menu = gtk_menu_new();
2432 ADD_MENU_ITEM(_("_Reply with quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_LIST_WITH_QUOTE);
2433 ADD_MENU_ITEM(_("Reply without _quote"), toolbar_reply_menu_cb, COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE);
2434 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->replylist_btn), menu);
2435 #else
2436 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2437 _("Reply to Mailing-list"));
2438 toolbar_data->replylist_btn = item;
2439 #endif
2440 break;
2441 case A_FORWARD:
2442 #ifndef GENERIC_UMPC
2443 TOOLBAR_MENUITEM(item,icon_wid,toolbar_item->text,
2444 _("Forward Message"),
2445 _("Forward Message options"));
2446 toolbar_data->fwd_btn = item;
2447
2448 menu = gtk_menu_new();
2449 ADD_MENU_ITEM(_("_Forward"), toolbar_reply_menu_cb, COMPOSE_FORWARD_INLINE);
2450 ADD_MENU_ITEM(_("For_ward as attachment"), toolbar_reply_menu_cb, COMPOSE_FORWARD_AS_ATTACH);
2451 ADD_MENU_ITEM(_("Redirec_t"), toolbar_reply_menu_cb, COMPOSE_REDIRECT);
2452 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(toolbar_data->fwd_btn), menu);
2453 #else
2454 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2455 _("Forward Message"));
2456 toolbar_data->fwd_btn = item;
2457 #endif
2458 break;
2459 case A_TRASH:
2460 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Trash Message"));
2461 toolbar_data->trash_btn = item;
2462 break;
2463 case A_DELETE_REAL:
2464 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Delete Message"));
2465 toolbar_data->delete_btn = item;
2466 break;
2467 case A_EXECUTE:
2468 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Execute"));
2469 toolbar_data->exec_btn = item;
2470 break;
2471 case A_GOTO_PREV:
2472 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Previous Unread Message"));
2473 toolbar_data->prev_btn = item;
2474 break;
2475 case A_GOTO_NEXT:
2476 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Go to Next Unread Message"));
2477 toolbar_data->next_btn = item;
2478 break;
2479
2480 /* Compose Toolbar */
2481 case A_SEND:
2482 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Send Message"));
2483 toolbar_data->send_btn = item;
2484 break;
2485 case A_SEND_LATER:
2486 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Put into queue folder and send later"));
2487 toolbar_data->sendl_btn = item;
2488 break;
2489 case A_DRAFT:
2490 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Save to draft folder"));
2491 toolbar_data->draft_btn = item;
2492 break;
2493 case A_INSERT:
2494 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert file"));
2495 toolbar_data->insert_btn = item;
2496 break;
2497 case A_ATTACH:
2498 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Attach file"));
2499 toolbar_data->attach_btn = item;
2500 break;
2501 case A_SIG:
2502 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Insert signature"));
2503 toolbar_data->sig_btn = item;
2504 break;
2505 case A_REP_SIG:
2506 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Replace signature"));
2507 toolbar_data->repsig_btn = item;
2508 break;
2509 case A_EXTEDITOR:
2510 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Edit with external editor"));
2511 toolbar_data->exteditor_btn = item;
2512 break;
2513 case A_LINEWRAP_CURRENT:
2514 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap long lines of current paragraph"));
2515 toolbar_data->linewrap_current_btn = item;
2516 break;
2517 case A_LINEWRAP_ALL:
2518 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Wrap all long lines"));
2519 toolbar_data->linewrap_all_btn = item;
2520 break;
2521 case A_ADDRBOOK:
2522 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Address book"));
2523 toolbar_data->addrbook_btn = item;
2524 break;
2525 #ifdef USE_ENCHANT
2526 case A_CHECK_SPELLING:
2527 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Check spelling"));
2528 toolbar_data->spellcheck_btn = item;
2529 break;
2530 #endif
2531 case A_PRIVACY_SIGN:
2532 TOOLBAR_TOGGLE_ITEM(item,icon_wid,toolbar_item->text,_("Sign"));
2533 g_signal_connect (G_OBJECT(item), "toggled",
2534 G_CALLBACK(toolbar_privacy_sign_toggled_cb), NULL);
2535 /* Call the "toggled" handler to set correct tooltip. */
2536 toolbar_privacy_sign_toggled_cb(item, NULL);
2537 toolbar_data->privacy_sign_btn = item;
2538 break;
2539 case A_PRIVACY_ENCRYPT:
2540 TOOLBAR_TOGGLE_ITEM(item,icon_wid,toolbar_item->text,_("Encrypt"));
2541 g_signal_connect (G_OBJECT(item), "toggled",
2542 G_CALLBACK(toolbar_privacy_encrypt_toggled_cb), NULL);
2543 /* Call the "toggled" handler to set correct tooltip. */
2544 toolbar_privacy_encrypt_toggled_cb(item, NULL);
2545 toolbar_data->privacy_encrypt_btn = item;
2546 break;
2547
2548 case A_CLAWS_ACTIONS:
2549 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,toolbar_item->text);
2550 action_item = g_new0(ToolbarClawsActions, 1);
2551 action_item->widget = item;
2552 action_item->name = g_strdup(toolbar_item->text);
2553
2554 toolbar_data->action_list =
2555 g_slist_append(toolbar_data->action_list,
2556 action_item);
2557 break;
2558 case A_CANCEL_INC:
2559 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Cancel receiving"));
2560 toolbar_data->cancel_inc_btn = item;
2561 break;
2562 case A_CANCEL_SEND:
2563 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Cancel sending"));
2564 toolbar_data->cancel_send_btn = item;
2565 break;
2566 case A_CANCEL_ALL:
2567 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,_("Cancel receiving/sending"));
2568 toolbar_data->cancel_all_btn = item;
2569 break;
2570 case A_CLAWS_PLUGINS:
2571 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text, toolbar_item->text);
2572 break;
2573 default:
2574 TOOLBAR_ITEM(item,icon_wid,toolbar_item->text,
2575 toolbar_ret_descr_from_val(toolbar_item->index));
2576 /* find and set the tool tip text */
2577 break;
2578 }
2579
2580 }
2581 toolbar_data->toolbar = toolbar;
2582
2583 gtk_widget_show_all(toolbar);
2584
2585 if (type == TOOLBAR_MAIN) {
2586 #ifdef GENERIC_UMPC
2587 MainWindow *mainwin = mainwindow_get_mainwindow();
2588 GtkWidget *progressbar = gtk_progress_bar_new();
2589 item = GTK_WIDGET(gtk_tool_item_new());
2590 gtk_container_add (GTK_CONTAINER (item), progressbar);
2591 gtk_widget_show(item);
2592 gtk_widget_set_size_request(progressbar, 84, -1);
2593 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1);
2594 mainwin->progressbar = progressbar;
2595 #endif
2596 activate_compose_button(toolbar_data,
2597 prefs_common.toolbar_style,
2598 toolbar_data->compose_btn_type);
2599 }
2600 if (type != TOOLBAR_COMPOSE)
2601 activate_learn_button(toolbar_data, prefs_common.toolbar_style,
2602 LEARN_SPAM);
2603
2604 gtk_container_add(GTK_CONTAINER(container), toolbar);
2605 gtk_container_set_border_width(GTK_CONTAINER(container), 0);
2606
2607 return toolbar_data;
2608 }
2609
2610 /**
2611 * Free toolbar structures
2612 */
2613
2614 #define UNREF_ICON(icon) if (toolbar->icon != NULL) \
2615 g_object_unref(toolbar->icon)
2616
toolbar_destroy(Toolbar * toolbar)2617 void toolbar_destroy(Toolbar * toolbar) {
2618 UNREF_ICON(compose_mail_icon);
2619 UNREF_ICON(compose_news_icon);
2620 UNREF_ICON(learn_spam_icon);
2621 UNREF_ICON(learn_ham_icon);
2622 TOOLBAR_DESTROY_ITEMS(toolbar->item_list);
2623 TOOLBAR_DESTROY_ACTIONS(toolbar->action_list);
2624 }
2625
2626 #undef UNREF_ICON
2627
toolbar_update(ToolbarType type,gpointer data)2628 void toolbar_update(ToolbarType type, gpointer data)
2629 {
2630 Toolbar *toolbar_data;
2631 GtkWidget *handlebox;
2632 MainWindow *mainwin = (MainWindow*)data;
2633 Compose *compose = (Compose*)data;
2634 MessageView *msgview = (MessageView*)data;
2635
2636 #ifndef GENERIC_UMPC
2637 switch(type) {
2638 case TOOLBAR_MAIN:
2639 toolbar_data = mainwin->toolbar;
2640 handlebox = mainwin->handlebox;
2641 break;
2642 case TOOLBAR_COMPOSE:
2643 toolbar_data = compose->toolbar;
2644 handlebox = compose->handlebox;
2645 break;
2646 case TOOLBAR_MSGVIEW:
2647 toolbar_data = msgview->toolbar;
2648 handlebox = msgview->handlebox;
2649 break;
2650 default:
2651 return;
2652 }
2653
2654 gtk_container_remove(GTK_CONTAINER(handlebox),
2655 GTK_WIDGET(toolbar_data->toolbar));
2656
2657 toolbar_init(toolbar_data);
2658 toolbar_data = toolbar_create(type, handlebox, data);
2659 #else
2660 switch(type) {
2661 case TOOLBAR_MAIN:
2662 toolbar_data = mainwin->toolbar;
2663 handlebox = mainwin->window;
2664 break;
2665 case TOOLBAR_COMPOSE:
2666 toolbar_data = compose->toolbar;
2667 handlebox = compose->window;
2668 break;
2669 case TOOLBAR_MSGVIEW:
2670 toolbar_data = msgview->toolbar;
2671 handlebox = msgview->window;
2672 break;
2673 default:
2674 return;
2675 }
2676 toolbar_init(toolbar_data);
2677 toolbar_data = toolbar_create(type, handlebox, data);
2678 #endif
2679
2680 switch(type) {
2681 case TOOLBAR_MAIN:
2682 mainwin->toolbar = toolbar_data;
2683 break;
2684 case TOOLBAR_COMPOSE:
2685 compose->toolbar = toolbar_data;
2686 break;
2687 case TOOLBAR_MSGVIEW:
2688 msgview->toolbar = toolbar_data;
2689 break;
2690 }
2691
2692 toolbar_style(type, prefs_common.toolbar_style, data);
2693
2694 if (type == TOOLBAR_MAIN) {
2695 toolbar_main_set_sensitive((MainWindow*)data);
2696 account_set_menu_only_toolbar();
2697 }
2698 }
2699
2700 #define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \
2701 gtk_widget_set_sensitive(widget, sensitive); \
2702 }
2703
toolbar_main_set_sensitive(gpointer data)2704 void toolbar_main_set_sensitive(gpointer data)
2705 {
2706 SensitiveCondMask state;
2707 gboolean sensitive;
2708 MainWindow *mainwin = (MainWindow*)data;
2709 Toolbar *toolbar = mainwin->toolbar;
2710 GSList *cur;
2711 GSList *entry_list = NULL;
2712
2713 typedef struct _Entry Entry;
2714 struct _Entry {
2715 GtkWidget *widget;
2716 SensitiveCondMask cond;
2717 gboolean empty;
2718 };
2719
2720 #define SET_WIDGET_COND(w, ...) \
2721 do { \
2722 Entry *e = g_new0(Entry, 1); \
2723 e->widget = w; \
2724 e->cond = main_window_get_mask(__VA_ARGS__, -1); \
2725 entry_list = g_slist_append(entry_list, e); \
2726 } while (0)
2727
2728 /* match all bit flags */
2729
2730 if (toolbar->get_btn)
2731 SET_WIDGET_COND(toolbar->get_btn,
2732 M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
2733
2734 if (toolbar->getall_btn) {
2735 SET_WIDGET_COND(toolbar->getall_btn,
2736 M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
2737 }
2738 if (toolbar->send_btn) {
2739 SET_WIDGET_COND(toolbar->send_btn,
2740 M_HAVE_QUEUED_MAILS);
2741 }
2742 if (toolbar->compose_mail_btn) {
2743 SET_WIDGET_COND(toolbar->compose_mail_btn,
2744 M_HAVE_ACCOUNT);
2745 }
2746 if (toolbar->close_window_btn) {
2747 SET_WIDGET_COND(toolbar->close_window_btn,
2748 M_UNLOCKED);
2749 }
2750 if (toolbar->open_mail_btn) {
2751 SET_WIDGET_COND(toolbar->open_mail_btn,
2752 M_TARGET_EXIST, M_SUMMARY_ISLIST);
2753 }
2754 if (toolbar->reply_btn) {
2755 SET_WIDGET_COND(toolbar->reply_btn,
2756 M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
2757 }
2758 if (toolbar->replyall_btn) {
2759 SET_WIDGET_COND(toolbar->replyall_btn,
2760 M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
2761 }
2762 if (toolbar->replylist_btn) {
2763 SET_WIDGET_COND(toolbar->replylist_btn,
2764 M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
2765 }
2766 if (toolbar->replysender_btn) {
2767 SET_WIDGET_COND(toolbar->replysender_btn,
2768 M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
2769 }
2770 if (toolbar->fwd_btn) {
2771 SET_WIDGET_COND(toolbar->fwd_btn,
2772 M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
2773 }
2774
2775 if (prefs_common.next_unread_msg_dialog == NEXTUNREADMSGDIALOG_ASSUME_NO) {
2776 SET_WIDGET_COND(toolbar->next_btn, M_MSG_EXIST, M_SUMMARY_ISLIST);
2777 } else {
2778 SET_WIDGET_COND(toolbar->next_btn, -1);
2779 }
2780
2781 if (toolbar->trash_btn)
2782 SET_WIDGET_COND(toolbar->trash_btn,
2783 M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
2784
2785 if (toolbar->delete_btn)
2786 SET_WIDGET_COND(toolbar->delete_btn,
2787 M_TARGET_EXIST, M_ALLOW_DELETE);
2788
2789 if (toolbar->delete_dup_btn)
2790 SET_WIDGET_COND(toolbar->delete_dup_btn,
2791 M_MSG_EXIST, M_ALLOW_DELETE, M_SUMMARY_ISLIST);
2792
2793 if (toolbar->exec_btn)
2794 SET_WIDGET_COND(toolbar->exec_btn,
2795 M_DELAY_EXEC);
2796
2797 if (toolbar->learn_spam_btn)
2798 SET_WIDGET_COND(toolbar->learn_spam_btn,
2799 M_TARGET_EXIST, M_CAN_LEARN_SPAM, M_SUMMARY_ISLIST);
2800
2801 if (toolbar->cancel_inc_btn)
2802 SET_WIDGET_COND(toolbar->cancel_inc_btn,
2803 M_INC_ACTIVE);
2804
2805 if (toolbar->cancel_send_btn)
2806 SET_WIDGET_COND(toolbar->cancel_send_btn,
2807 M_SEND_ACTIVE);
2808
2809 for (cur = toolbar->action_list; cur != NULL; cur = cur->next) {
2810 ToolbarClawsActions *act = (ToolbarClawsActions*)cur->data;
2811
2812 SET_WIDGET_COND(act->widget, M_TARGET_EXIST, M_UNLOCKED);
2813 }
2814
2815 state = main_window_get_current_state(mainwin);
2816
2817 for (cur = entry_list; cur != NULL; cur = cur->next) {
2818 Entry *e = (Entry*) cur->data;
2819
2820 if (e->widget != NULL) {
2821 sensitive = ((e->cond & state) == e->cond);
2822 GTK_BUTTON_SET_SENSITIVE(e->widget, sensitive);
2823 }
2824 }
2825
2826 while (entry_list != NULL) {
2827 Entry *e = (Entry*) entry_list->data;
2828
2829 g_free(e);
2830 entry_list = g_slist_remove(entry_list, e);
2831 }
2832
2833 /* match any bit flags */
2834
2835 if (toolbar->cancel_all_btn)
2836 SET_WIDGET_COND(toolbar->cancel_all_btn,
2837 M_INC_ACTIVE, M_SEND_ACTIVE);
2838
2839 for (cur = entry_list; cur != NULL; cur = cur->next) {
2840 Entry *e = (Entry*) cur->data;
2841
2842 if (e->widget != NULL) {
2843 sensitive = ((e->cond & state) != 0);
2844 GTK_BUTTON_SET_SENSITIVE(e->widget, sensitive);
2845 }
2846 }
2847
2848 while (entry_list != NULL) {
2849 Entry *e = (Entry*) entry_list->data;
2850
2851 g_free(e);
2852 entry_list = g_slist_remove(entry_list, e);
2853 }
2854
2855 g_slist_free(entry_list);
2856
2857 activate_compose_button(toolbar,
2858 prefs_common.toolbar_style,
2859 toolbar->compose_btn_type);
2860
2861 #undef SET_WIDGET_COND
2862 }
2863
toolbar_comp_set_sensitive(gpointer data,gboolean sensitive)2864 void toolbar_comp_set_sensitive(gpointer data, gboolean sensitive)
2865 {
2866 Compose *compose = (Compose*)data;
2867 GSList *items = compose->toolbar->action_list;
2868
2869 if (compose->toolbar->send_btn)
2870 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->send_btn, sensitive);
2871 if (compose->toolbar->sendl_btn)
2872 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sendl_btn, sensitive);
2873 if (compose->toolbar->draft_btn )
2874 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->draft_btn , sensitive);
2875 if (compose->toolbar->insert_btn )
2876 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->insert_btn , sensitive);
2877 if (compose->toolbar->attach_btn)
2878 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->attach_btn, sensitive);
2879 if (compose->toolbar->sig_btn)
2880 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->sig_btn, sensitive);
2881 if (compose->toolbar->repsig_btn)
2882 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->repsig_btn, sensitive);
2883 if (compose->toolbar->exteditor_btn)
2884 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->exteditor_btn, sensitive);
2885 if (compose->toolbar->linewrap_current_btn)
2886 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_current_btn, sensitive);
2887 if (compose->toolbar->linewrap_all_btn)
2888 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->linewrap_all_btn, sensitive);
2889 if (compose->toolbar->addrbook_btn)
2890 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->addrbook_btn, sensitive);
2891 #ifdef USE_ENCHANT
2892 if (compose->toolbar->spellcheck_btn)
2893 GTK_BUTTON_SET_SENSITIVE(compose->toolbar->spellcheck_btn, sensitive);
2894 #endif
2895 for (; items != NULL; items = g_slist_next(items)) {
2896 ToolbarClawsActions *item = (ToolbarClawsActions *)items->data;
2897 GTK_BUTTON_SET_SENSITIVE(item->widget, sensitive);
2898 }
2899 }
2900
2901 /**
2902 * Initialize toolbar structure
2903 **/
toolbar_init(Toolbar * toolbar)2904 static void toolbar_init(Toolbar * toolbar)
2905 {
2906
2907 toolbar->toolbar = NULL;
2908 toolbar->folders_btn = NULL;
2909 toolbar->get_btn = NULL;
2910 toolbar->getall_btn = NULL;
2911 toolbar->send_btn = NULL;
2912 toolbar->compose_mail_btn = NULL;
2913 toolbar->compose_mail_icon = NULL;
2914 toolbar->compose_news_icon = NULL;
2915 toolbar->reply_btn = NULL;
2916 toolbar->replysender_btn = NULL;
2917 toolbar->replyall_btn = NULL;
2918 toolbar->replylist_btn = NULL;
2919 toolbar->fwd_btn = NULL;
2920 toolbar->trash_btn = NULL;
2921 toolbar->delete_btn = NULL;
2922 toolbar->delete_dup_btn = NULL;
2923 toolbar->prev_btn = NULL;
2924 toolbar->next_btn = NULL;
2925 toolbar->exec_btn = NULL;
2926 toolbar->separator = NULL;
2927 toolbar->learn_spam_btn = NULL;
2928 toolbar->learn_spam_icon = NULL;
2929 toolbar->learn_ham_icon = NULL;
2930 toolbar->cancel_inc_btn = NULL;
2931 toolbar->cancel_send_btn = NULL;
2932 toolbar->cancel_all_btn = NULL;
2933
2934 /* compose buttons */
2935 toolbar->sendl_btn = NULL;
2936 toolbar->draft_btn = NULL;
2937 toolbar->insert_btn = NULL;
2938 toolbar->attach_btn = NULL;
2939 toolbar->sig_btn = NULL;
2940 toolbar->repsig_btn = NULL;
2941 toolbar->exteditor_btn = NULL;
2942 toolbar->linewrap_current_btn = NULL;
2943 toolbar->linewrap_all_btn = NULL;
2944 toolbar->addrbook_btn = NULL;
2945
2946 toolbar->open_mail_btn = NULL;
2947 toolbar->close_window_btn = NULL;
2948 toolbar->preferences_btn = NULL;
2949 toolbar->action_list = NULL;
2950 toolbar->item_list = NULL;
2951 #ifdef USE_ENCHANT
2952 toolbar->spellcheck_btn = NULL;
2953 #endif
2954
2955 toolbar->privacy_sign_btn = NULL;
2956 toolbar->privacy_encrypt_btn = NULL;
2957
2958 toolbar_destroy(toolbar);
2959 }
2960
2961 /*
2962 */
toolbar_reply(gpointer data,guint action)2963 static void toolbar_reply(gpointer data, guint action)
2964 {
2965 ToolbarItem *toolbar_item = (ToolbarItem*)data;
2966 MainWindow *mainwin;
2967 MessageView *msgview;
2968 GSList *msginfo_list = NULL;
2969 gboolean msg_is_selected = FALSE;
2970 gboolean msg_is_opened = FALSE;
2971
2972 cm_return_if_fail(toolbar_item != NULL);
2973
2974 switch (toolbar_item->type) {
2975 case TOOLBAR_MAIN:
2976 mainwin = (MainWindow*)toolbar_item->parent;
2977 msginfo_list = summary_get_selection(mainwin->summaryview);
2978 msgview = (MessageView*)mainwin->messageview;
2979 msg_is_opened = summary_has_opened_message(mainwin->summaryview);
2980 msg_is_selected = summary_is_opened_message_selected(mainwin->summaryview);
2981 break;
2982 case TOOLBAR_MSGVIEW:
2983 msgview = (MessageView*)toolbar_item->parent;
2984 cm_return_if_fail(msgview != NULL);
2985 msginfo_list = g_slist_append(msginfo_list, msgview->msginfo);
2986 msg_is_opened = TRUE;
2987 msg_is_selected = TRUE;
2988 break;
2989 default:
2990 return;
2991 }
2992
2993 cm_return_if_fail(msgview != NULL);
2994 cm_return_if_fail(msginfo_list != NULL);
2995 if (!msg_is_opened) {
2996 compose_reply_from_messageview(NULL, msginfo_list, action);
2997 } else if (msg_is_selected) {
2998 compose_reply_from_messageview(msgview, msginfo_list, action);
2999 } else {
3000 compose_reply_from_messageview(msgview, NULL, action);
3001 }
3002 g_slist_free(msginfo_list);
3003
3004 /* TODO: update reply state ion summaryview */
3005 }
3006
3007
3008 /* exported functions */
3009
inc_mail_cb(gpointer data,guint action,GtkWidget * widget)3010 void inc_mail_cb(gpointer data, guint action, GtkWidget *widget)
3011 {
3012 MainWindow *mainwin = (MainWindow*)data;
3013
3014 inc_mail(mainwin, prefs_common.newmail_notify_manu);
3015 }
3016
inc_all_account_mail_cb(gpointer data,guint action,GtkWidget * widget)3017 void inc_all_account_mail_cb(gpointer data, guint action, GtkWidget *widget)
3018 {
3019 MainWindow *mainwin = (MainWindow*)data;
3020
3021 inc_all_account_mail(mainwin, FALSE, FALSE, prefs_common.newmail_notify_manu);
3022 }
3023
send_queue_cb(gpointer data,guint action,GtkWidget * widget)3024 void send_queue_cb(gpointer data, guint action, GtkWidget *widget)
3025 {
3026 GList *list;
3027 gboolean found;
3028 gboolean got_error = FALSE;
3029 gchar *errstr = NULL;
3030
3031 if (prefs_common.work_offline)
3032 if (alertpanel(_("Offline warning"),
3033 _("You're working offline. Override?"),
3034 GTK_STOCK_NO, GTK_STOCK_YES,
3035 NULL, ALERTFOCUS_FIRST) != G_ALERTALTERNATE)
3036 return;
3037
3038 /* ask for confirmation before sending queued messages only
3039 in online mode and if there is at least one message queued
3040 in any of the folder queue
3041 */
3042 if (prefs_common.confirm_send_queued_messages) {
3043 found = FALSE;
3044 /* check if there's a queued message */
3045 for (list = folder_get_list(); !found && list != NULL; list = list->next) {
3046 Folder *folder = list->data;
3047
3048 found = !procmsg_queue_is_empty(folder->queue);
3049 }
3050 /* if necessary, ask for confirmation before sending */
3051 if (found && !prefs_common.work_offline) {
3052 if (alertpanel(_("Send queued messages"),
3053 _("Send all queued messages?"),
3054 GTK_STOCK_CANCEL, _("_Send"),
3055 NULL, ALERTFOCUS_FIRST) != G_ALERTALTERNATE)
3056 return;
3057 }
3058 }
3059
3060 for (list = folder_get_list(); list != NULL; list = list->next) {
3061 Folder *folder = list->data;
3062
3063 if (folder->queue) {
3064 if (procmsg_send_queue(folder->queue,
3065 prefs_common.savemsg,
3066 &errstr) < 0)
3067 got_error = TRUE;
3068 }
3069 }
3070 if (got_error) {
3071 if (!errstr)
3072 alertpanel_error_log(_("Some errors occurred while "
3073 "sending queued messages."));
3074 else {
3075 alertpanel_error_log(_("Some errors occurred "
3076 "while sending queued messages:\n%s"), errstr);
3077 g_free(errstr);
3078 }
3079 }
3080 }
3081
compose_mail_cb(gpointer data,guint action,GtkWidget * widget)3082 void compose_mail_cb(gpointer data, guint action, GtkWidget *widget)
3083 {
3084 MainWindow *mainwin = (MainWindow*)data;
3085 PrefsAccount *ac = NULL;
3086 FolderItem *item = mainwin->summaryview->folder_item;
3087 GList * list;
3088 GList * cur;
3089
3090 if (item) {
3091 ac = account_find_from_item(item);
3092 if (ac && ac->protocol != A_NNTP && ac->protocol != A_IMAP4) {
3093 compose_new_with_folderitem(ac, item, NULL); /* CLAWS */
3094 return;
3095 }
3096 }
3097
3098 /*
3099 * CLAWS - use current account
3100 */
3101 if (cur_account && (cur_account->protocol != A_NNTP)) {
3102 compose_new_with_folderitem(cur_account, item, NULL);
3103 return;
3104 }
3105
3106 /*
3107 * CLAWS - just get the first one
3108 */
3109 list = account_get_list();
3110 for (cur = list ; cur != NULL ; cur = g_list_next(cur)) {
3111 ac = (PrefsAccount *) cur->data;
3112 if (ac->protocol != A_NNTP) {
3113 compose_new_with_folderitem(ac, item, NULL);
3114 return;
3115 }
3116 }
3117 }
3118
compose_news_cb(gpointer data,guint action,GtkWidget * widget)3119 void compose_news_cb(gpointer data, guint action, GtkWidget *widget)
3120 {
3121 MainWindow *mainwin = (MainWindow*)data;
3122 PrefsAccount * ac = NULL;
3123 GList * list;
3124 GList * cur;
3125
3126 if (mainwin->summaryview->folder_item) {
3127 ac = mainwin->summaryview->folder_item->folder->account;
3128 if (ac && ac->protocol == A_NNTP) {
3129 compose_new_with_folderitem(ac,
3130 mainwin->summaryview->folder_item, NULL);
3131 return;
3132 }
3133 }
3134
3135 list = account_get_list();
3136 for(cur = list ; cur != NULL ; cur = g_list_next(cur)) {
3137 ac = (PrefsAccount *) cur->data;
3138 if (ac->protocol == A_NNTP) {
3139 compose_new_with_folderitem(ac,
3140 mainwin->summaryview->folder_item, NULL);
3141 return;
3142 }
3143 }
3144 }
3145