2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Claws Mail team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 #include <glib/gi18n.h>
24 #include <gdk/gdkkeysyms.h>
25 #include <gtk/gtkmain.h>
26 #include <gtk/gtkwindow.h>
27 #include <gtk/gtkwidget.h>
28 #include <gtk/gtksignal.h>
29 #include <gtk/gtkvbox.h>
30 #include <gtk/gtkcontainer.h>
31 #include <gtk/gtkstatusbar.h>
32 #include <gtk/gtkprogressbar.h>
33 #include <gtk/gtkhpaned.h>
34 #include <gtk/gtkvpaned.h>
35 #include <gtk/gtkcheckmenuitem.h>
36 #include <gtk/gtkitemfactory.h>
37 #include <gtk/gtkeditable.h>
38 #include <gtk/gtkmenu.h>
39 #include <gtk/gtkmenuitem.h>
40 #include <gtk/gtkhandlebox.h>
41 #include <gtk/gtktoolbar.h>
42 #include <gtk/gtkbutton.h>
43 #include <gtk/gtktooltips.h>
47 #include "mainwindow.h"
48 #include "folderview.h"
49 #include "foldersel.h"
50 #include "summaryview.h"
51 #include "summary_search.h"
52 #include "messageview.h"
53 #include "message_search.h"
54 #include "headerview.h"
56 #include "stock_pixmap.h"
64 #include "prefs_common.h"
65 #include "prefs_actions.h"
66 #include "prefs_filtering.h"
67 #include "prefs_account.h"
68 #include "prefs_summary_column.h"
69 #include "prefs_folder_column.h"
70 #include "prefs_template.h"
73 #include "addressbook.h"
74 #include "logwindow.h"
75 #include "manage_window.h"
76 #include "alertpanel.h"
77 #include "statusbar.h"
78 #include "inputdialog.h"
85 #include "ssl_manager.h"
86 #include "sslcertwindow.h"
87 #include "prefs_gtk.h"
88 #include "pluginwindow.h"
90 #include "progressindicator.h"
91 #include "localfolder.h"
92 #include "filtering.h"
93 #include "folderutils.h"
94 #include "foldersort.h"
95 #include "icon_legend.h"
96 #include "colorlabel.h"
101 #define AC_LABEL_WIDTH 240
103 /* list of all instantiated MainWindow */
104 static GList
*mainwin_list
= NULL
;
106 static GdkCursor
*watch_cursor
= NULL
;
107 static GdkCursor
*hand_cursor
= NULL
;
109 static void main_window_menu_callback_block (MainWindow
*mainwin
);
110 static void main_window_menu_callback_unblock (MainWindow
*mainwin
);
112 static void main_window_show_cur_account (MainWindow
*mainwin
);
114 static void main_window_set_widgets (MainWindow
*mainwin
,
117 static void toolbar_child_attached (GtkWidget
*widget
,
120 static void toolbar_child_detached (GtkWidget
*widget
,
124 static gboolean
ac_label_button_pressed (GtkWidget
*widget
,
125 GdkEventButton
*event
,
128 static gint
main_window_close_cb (GtkWidget
*widget
,
131 static gint
folder_window_close_cb (GtkWidget
*widget
,
134 static gint
message_window_close_cb (GtkWidget
*widget
,
138 static void main_window_size_allocate_cb (GtkWidget
*widget
,
139 GtkAllocation
*allocation
,
141 static void folder_window_size_allocate_cb (GtkWidget
*widget
,
142 GtkAllocation
*allocation
,
144 static void message_window_size_allocate_cb (GtkWidget
*widget
,
145 GtkAllocation
*allocation
,
148 static void update_folderview_cb (MainWindow
*mainwin
,
151 static void add_mailbox_cb (MainWindow
*mainwin
,
154 static void foldersort_cb (MainWindow
*mainwin
,
157 static void import_mbox_cb (MainWindow
*mainwin
,
160 static void export_mbox_cb (MainWindow
*mainwin
,
163 static void export_list_mbox_cb (MainWindow
*mainwin
,
166 static void empty_trash_cb (MainWindow
*mainwin
,
170 static void save_as_cb (MainWindow
*mainwin
,
173 static void print_cb (MainWindow
*mainwin
,
176 static void app_exit_cb (MainWindow
*mainwin
,
180 static void search_cb (MainWindow
*mainwin
,
184 static void toggle_folder_cb (MainWindow
*mainwin
,
187 static void toggle_message_cb (MainWindow
*mainwin
,
190 static void toggle_toolbar_cb (MainWindow
*mainwin
,
193 static void toggle_statusbar_cb (MainWindow
*mainwin
,
196 static void separate_widget_cb (MainWindow
*mainwin
,
200 static void addressbook_open_cb (MainWindow
*mainwin
,
203 static void log_window_show_cb (MainWindow
*mainwin
,
207 static void inc_cancel_cb (MainWindow
*mainwin
,
211 static void open_msg_cb (MainWindow
*mainwin
,
215 static void view_source_cb (MainWindow
*mainwin
,
219 static void show_all_header_cb (MainWindow
*mainwin
,
223 static void hide_quotes_cb(MainWindow
*mainwin
,
227 static void move_to_cb (MainWindow
*mainwin
,
230 static void copy_to_cb (MainWindow
*mainwin
,
233 static void delete_cb (MainWindow
*mainwin
,
236 static void delete_trash_cb (MainWindow
*mainwin
,
240 static void cancel_cb (MainWindow
*mainwin
,
244 static void mark_cb (MainWindow
*mainwin
,
247 static void unmark_cb (MainWindow
*mainwin
,
251 static void mark_as_unread_cb (MainWindow
*mainwin
,
254 static void mark_as_read_cb (MainWindow
*mainwin
,
257 static void mark_all_read_cb (MainWindow
*mainwin
,
260 static void mark_as_spam_cb (MainWindow
*mainwin
,
264 static void ignore_thread_cb (MainWindow
*mainwin
,
267 static void unignore_thread_cb (MainWindow
*mainwin
,
270 static void lock_msgs_cb (MainWindow
*mainwin
,
273 static void unlock_msgs_cb (MainWindow
*mainwin
,
277 static void reedit_cb (MainWindow
*mainwin
,
281 static void add_address_cb (MainWindow
*mainwin
,
285 static void set_charset_cb (MainWindow
*mainwin
,
289 static void set_decode_cb (MainWindow
*mainwin
,
293 static void hide_read_messages (MainWindow
*mainwin
,
297 static void thread_cb (MainWindow
*mainwin
,
300 static void expand_threads_cb (MainWindow
*mainwin
,
303 static void collapse_threads_cb (MainWindow
*mainwin
,
307 static void set_summary_display_item_cb (MainWindow
*mainwin
,
310 static void set_folder_display_item_cb (MainWindow
*mainwin
,
313 static void sort_summary_cb (MainWindow
*mainwin
,
316 static void sort_summary_type_cb (MainWindow
*mainwin
,
319 static void attract_by_subject_cb(MainWindow
*mainwin
,
323 static void delete_duplicated_cb (MainWindow
*mainwin
,
326 static void delete_duplicated_all_cb (MainWindow
*mainwin
,
329 static void filter_cb (MainWindow
*mainwin
,
332 static void execute_summary_cb (MainWindow
*mainwin
,
335 static void update_summary_cb (MainWindow
*mainwin
,
339 static void prev_cb (MainWindow
*mainwin
,
342 static void next_cb (MainWindow
*mainwin
,
345 static void next_unread_cb (MainWindow
*mainwin
,
348 static void prev_unread_cb (MainWindow
*mainwin
,
352 static void prev_new_cb (MainWindow
*mainwin
,
355 static void next_new_cb (MainWindow
*mainwin
,
358 static void prev_marked_cb (MainWindow
*mainwin
,
361 static void next_marked_cb (MainWindow
*mainwin
,
364 static void prev_labeled_cb (MainWindow
*mainwin
,
367 static void next_labeled_cb (MainWindow
*mainwin
,
370 static void last_read_cb (MainWindow
*mainwin
,
373 static void parent_cb (MainWindow
*mainwin
,
377 static void goto_folder_cb (MainWindow
*mainwin
,
380 static void goto_unread_folder_cb(MainWindow
*mainwin
,
384 static void copy_cb (MainWindow
*mainwin
,
387 static void allsel_cb (MainWindow
*mainwin
,
390 static void select_thread_cb (MainWindow
*mainwin
,
394 static void create_filter_cb (MainWindow
*mainwin
,
397 static void create_processing_cb (MainWindow
*mainwin
,
401 static void prefs_template_open_cb (MainWindow
*mainwin
,
404 static void prefs_actions_open_cb (MainWindow
*mainwin
,
407 static void prefs_account_open_cb (MainWindow
*mainwin
,
411 static void prefs_pre_processing_open_cb (MainWindow
*mainwin
,
415 static void prefs_post_processing_open_cb (MainWindow
*mainwin
,
419 static void prefs_filtering_open_cb (MainWindow
*mainwin
,
423 static void ssl_manager_open_cb (MainWindow
*mainwin
,
427 static void new_account_cb (MainWindow
*mainwin
,
431 static void account_selector_menu_cb (GtkMenuItem
*menuitem
,
433 static void account_receive_menu_cb (GtkMenuItem
*menuitem
,
435 static void account_compose_menu_cb (GtkMenuItem
*menuitem
,
438 static void prefs_open_cb (GtkMenuItem
*menuitem
,
440 static void plugins_open_cb (GtkMenuItem
*menuitem
,
443 static void online_switch_clicked(GtkButton
*btn
,
446 static void manual_open_cb (MainWindow
*mainwin
,
450 static void legend_open_cb (GtkMenuItem
*menuitem
,
453 static void scan_tree_func (Folder
*folder
,
457 static void toggle_work_offline_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
);
459 static void addr_harvest_cb ( MainWindow
*mainwin
,
463 static void addr_harvest_msg_cb ( MainWindow
*mainwin
,
466 static void sync_cb ( MainWindow
*mainwin
,
470 static gboolean
mainwindow_focus_in_event (GtkWidget
*widget
,
471 GdkEventFocus
*focus
,
473 void main_window_reply_cb (MainWindow
*mainwin
,
476 gboolean
mainwindow_progressindicator_hook (gpointer source
,
479 static gint
mailing_list_create_submenu(GtkItemFactory
*ifactory
,
482 static gint
mailing_list_populate_submenu(GtkWidget
*menu
, const gchar
* list_header
);
484 static void get_url_part(const gchar
**buf
, gchar
*url_decoded
, gint maxlen
);
486 static void mailing_list_compose(GtkWidget
*w
, gpointer
*data
);
488 static void mailing_list_open_uri(GtkWidget
*w
, gpointer
*data
);
489 #define SEPARATE_ACTION 500
490 static void mainwindow_quicksearch (MainWindow
*mainwin
,
494 static GtkItemFactoryEntry mainwin_entries
[] =
496 {N_("/_File"), NULL
, NULL
, 0, "<Branch>"},
497 {N_("/_File/_Add mailbox"), NULL
, NULL
, 0, "<Branch>"},
498 {N_("/_File/_Add mailbox/MH..."), NULL
, add_mailbox_cb
, 0, NULL
},
499 {N_("/_File/---"), NULL
, NULL
, 0, "<Separator>"},
500 {N_("/_File/Change folder order..."), NULL
, foldersort_cb
, 0, NULL
},
501 {N_("/_File/---"), NULL
, NULL
, 0, "<Separator>"},
502 {N_("/_File/_Import mbox file..."), NULL
, import_mbox_cb
, 0, NULL
},
503 {N_("/_File/_Export to mbox file..."), NULL
, export_mbox_cb
, 0, NULL
},
504 {N_("/_File/Exp_ort selected to mbox file..."),
505 NULL
, export_list_mbox_cb
, 0, NULL
},
506 {N_("/_File/---"), NULL
, NULL
, 0, "<Separator>"},
507 {N_("/_File/Empty all _Trash folders"), "<shift>D", empty_trash_cb
, 0, NULL
},
508 {N_("/_File/---"), NULL
, NULL
, 0, "<Separator>"},
509 {N_("/_File/_Save as..."), "<control>S", save_as_cb
, 0, NULL
},
510 {N_("/_File/_Print..."), "<control>P", print_cb
, 0, NULL
},
511 {N_("/_File/---"), NULL
, NULL
, 0, "<Separator>"},
512 {N_("/_File/_Work offline"), "<control>W", toggle_work_offline_cb
, 0, "<ToggleItem>"},
513 {N_("/_File/Synchronise folders"), "<control><shift>S", sync_cb
, 0, NULL
},
514 {N_("/_File/---"), NULL
, NULL
, 0, "<Separator>"},
515 /* {N_("/_File/_Close"), "<alt>W", app_exit_cb, 0, NULL}, */
516 {N_("/_File/E_xit"), "<control>Q", app_exit_cb
, 0, NULL
},
518 {N_("/_Edit"), NULL
, NULL
, 0, "<Branch>"},
519 {N_("/_Edit/_Copy"), "<control>C", copy_cb
, 0, NULL
},
520 {N_("/_Edit/Select _all"), "<control>A", allsel_cb
, 0, NULL
},
521 {N_("/_Edit/Select _thread"), NULL
, select_thread_cb
, 0, NULL
},
522 {N_("/_Edit/---"), NULL
, NULL
, 0, "<Separator>"},
523 {N_("/_Edit/_Find in current message..."),
524 "<control>F", search_cb
, 0, NULL
},
525 {N_("/_Edit/_Search folder..."), "<shift><control>F", search_cb
, 1, NULL
},
526 {N_("/_Edit/_Quick search"), "slash", mainwindow_quicksearch
, 0, NULL
},
527 {N_("/_View"), NULL
, NULL
, 0, "<Branch>"},
528 {N_("/_View/Show or hi_de"), NULL
, NULL
, 0, "<Branch>"},
529 {N_("/_View/Show or hi_de/_Folder tree"),
530 NULL
, toggle_folder_cb
, 0, "<ToggleItem>"},
531 {N_("/_View/Show or hi_de/_Message view"),
532 "V", toggle_message_cb
, 0, "<ToggleItem>"},
533 {N_("/_View/Show or hi_de/_Toolbar"),
534 NULL
, NULL
, 0, "<Branch>"},
535 {N_("/_View/Show or hi_de/_Toolbar/Text _below icons"),
536 NULL
, toggle_toolbar_cb
, TOOLBAR_BOTH
, "<RadioItem>"},
537 {N_("/_View/Show or hi_de/_Toolbar/Text be_side icons"),
538 NULL
, toggle_toolbar_cb
, TOOLBAR_BOTH_HORIZ
, "/View/Show or hide/Toolbar/Text below icons"},
539 {N_("/_View/Show or hi_de/_Toolbar/_Icons only"),
540 NULL
, toggle_toolbar_cb
, TOOLBAR_ICON
, "/View/Show or hide/Toolbar/Text below icons"},
541 {N_("/_View/Show or hi_de/_Toolbar/_Text only"),
542 NULL
, toggle_toolbar_cb
, TOOLBAR_TEXT
, "/View/Show or hide/Toolbar/Text below icons"},
543 {N_("/_View/Show or hi_de/_Toolbar/_Hide"),
544 NULL
, toggle_toolbar_cb
, TOOLBAR_NONE
, "/View/Show or hide/Toolbar/Text below icons"},
545 {N_("/_View/Show or hi_de/Status _bar"),
546 NULL
, toggle_statusbar_cb
, 0, "<ToggleItem>"},
547 {N_("/_View/Set displayed _columns"), NULL
, NULL
, 0, "<Branch>"},
548 {N_("/_View/Set displayed _columns/in _Folder list..."), NULL
, set_folder_display_item_cb
, 0, NULL
},
549 {N_("/_View/Set displayed _columns/in _Message list..."),NULL
, set_summary_display_item_cb
, 0, NULL
},
551 {N_("/_View/---"), NULL
, NULL
, 0, "<Separator>"},
552 {N_("/_View/Separate f_older tree"), NULL
, separate_widget_cb
, SEPARATE_FOLDER
, "<ToggleItem>"},
553 {N_("/_View/Separate _message view"), NULL
, separate_widget_cb
, SEPARATE_MESSAGE
, "<ToggleItem>"},
554 {N_("/_View/---"), NULL
, NULL
, 0, "<Separator>"},
555 {N_("/_View/_Sort"), NULL
, NULL
, 0, "<Branch>"},
556 {N_("/_View/_Sort/by _number"), NULL
, sort_summary_cb
, SORT_BY_NUMBER
, "<RadioItem>"},
557 {N_("/_View/_Sort/by S_ize"), NULL
, sort_summary_cb
, SORT_BY_SIZE
, "/View/Sort/by number"},
558 {N_("/_View/_Sort/by _Date"), NULL
, sort_summary_cb
, SORT_BY_DATE
, "/View/Sort/by number"},
559 {N_("/_View/_Sort/by _From"), NULL
, sort_summary_cb
, SORT_BY_FROM
, "/View/Sort/by number"},
560 {N_("/_View/_Sort/by _To"), NULL
, sort_summary_cb
, SORT_BY_TO
, "/View/Sort/by number"},
561 {N_("/_View/_Sort/by S_ubject"), NULL
, sort_summary_cb
, SORT_BY_SUBJECT
, "/View/Sort/by number"},
562 {N_("/_View/_Sort/by _color label"),
563 NULL
, sort_summary_cb
, SORT_BY_LABEL
, "/View/Sort/by number"},
564 {N_("/_View/_Sort/by _mark"), NULL
, sort_summary_cb
, SORT_BY_MARK
, "/View/Sort/by number"},
565 {N_("/_View/_Sort/by _status"), NULL
, sort_summary_cb
, SORT_BY_STATUS
, "/View/Sort/by number"},
566 {N_("/_View/_Sort/by a_ttachment"),
567 NULL
, sort_summary_cb
, SORT_BY_MIME
, "/View/Sort/by number"},
568 {N_("/_View/_Sort/by score"), NULL
, sort_summary_cb
, SORT_BY_SCORE
, "/View/Sort/by number"},
569 {N_("/_View/_Sort/by locked"), NULL
, sort_summary_cb
, SORT_BY_LOCKED
, "/View/Sort/by number"},
570 {N_("/_View/_Sort/D_on't sort"), NULL
, sort_summary_cb
, SORT_BY_NONE
, "/View/Sort/by number"},
571 {N_("/_View/_Sort/---"), NULL
, NULL
, 0, "<Separator>"},
572 {N_("/_View/_Sort/Ascending"), NULL
, sort_summary_type_cb
, SORT_ASCENDING
, "<RadioItem>"},
573 {N_("/_View/_Sort/Descending"), NULL
, sort_summary_type_cb
, SORT_DESCENDING
, "/View/Sort/Ascending"},
574 {N_("/_View/_Sort/---"), NULL
, NULL
, 0, "<Separator>"},
575 {N_("/_View/_Sort/_Attract by subject"),
576 NULL
, attract_by_subject_cb
, 0, NULL
},
577 {N_("/_View/Th_read view"), "<control>T", thread_cb
, 0, "<ToggleItem>"},
578 {N_("/_View/E_xpand all threads"), NULL
, expand_threads_cb
, 0, NULL
},
579 {N_("/_View/Co_llapse all threads"), NULL
, collapse_threads_cb
, 0, NULL
},
580 {N_("/_View/_Hide read messages"), NULL
, hide_read_messages
, 0, "<ToggleItem>"},
582 {N_("/_View/---"), NULL
, NULL
, 0, "<Separator>"},
583 {N_("/_View/_Go to"), NULL
, NULL
, 0, "<Branch>"},
584 {N_("/_View/_Go to/_Previous message"), "P", prev_cb
, 0, NULL
},
585 {N_("/_View/_Go to/_Next message"), "N", next_cb
, 0, NULL
},
586 {N_("/_View/_Go to/---"), NULL
, NULL
, 0, "<Separator>"},
587 {N_("/_View/_Go to/P_revious unread message"),
588 "<shift>P", prev_unread_cb
, 0, NULL
},
589 {N_("/_View/_Go to/N_ext unread message"),
590 "<shift>N", next_unread_cb
, 0, NULL
},
591 {N_("/_View/_Go to/---"), NULL
, NULL
, 0, "<Separator>"},
592 {N_("/_View/_Go to/Previous ne_w message"), NULL
, prev_new_cb
, 0, NULL
},
593 {N_("/_View/_Go to/Ne_xt new message"), NULL
, next_new_cb
, 0, NULL
},
594 {N_("/_View/_Go to/---"), NULL
, NULL
, 0, "<Separator>"},
595 {N_("/_View/_Go to/Previous _marked message"),
596 NULL
, prev_marked_cb
, 0, NULL
},
597 {N_("/_View/_Go to/Next m_arked message"),
598 NULL
, next_marked_cb
, 0, NULL
},
599 {N_("/_View/_Go to/---"), NULL
, NULL
, 0, "<Separator>"},
600 {N_("/_View/_Go to/Previous _labeled message"),
601 NULL
, prev_labeled_cb
, 0, NULL
},
602 {N_("/_View/_Go to/Next la_beled message"),
603 NULL
, next_labeled_cb
, 0, NULL
},
604 {N_("/_View/_Go to/---"), NULL
, NULL
, 0, "<Separator>"},
605 {N_("/_View/_Go to/Last read message"),
606 NULL
, last_read_cb
, 0, NULL
},
607 {N_("/_View/_Go to/Parent message"),
608 "<control>Up", parent_cb
, 0, NULL
},
609 {N_("/_View/_Go to/---"), NULL
, NULL
, 0, "<Separator>"},
610 {N_("/_View/_Go to/Next unread _folder"), "<shift>G", goto_unread_folder_cb
, 0, NULL
},
611 {N_("/_View/_Go to/_Other folder..."), "G", goto_folder_cb
, 0, NULL
},
612 {N_("/_View/---"), NULL
, NULL
, 0, "<Separator>"},
614 #define ENC_SEPARATOR \
615 {N_("/_View/Character _encoding/---"), NULL, NULL, 0, "<Separator>"}
616 #define ENC_ACTION(action) \
617 NULL, set_charset_cb, action, "/View/Character encoding/Auto detect"
619 {N_("/_View/Character _encoding"), NULL
, NULL
, 0, "<Branch>"},
620 {N_("/_View/Character _encoding/_Auto detect"),
621 NULL
, set_charset_cb
, C_AUTO
, "<RadioItem>"},
622 {N_("/_View/Character _encoding/---"), NULL
, NULL
, 0, "<Separator>"},
623 {N_("/_View/Character _encoding/7bit ascii (US-ASC_II)"),
624 ENC_ACTION(C_US_ASCII
)},
625 {N_("/_View/Character _encoding/Unicode (_UTF-8)"),
626 ENC_ACTION(C_UTF_8
)},
629 {N_("/_View/Character _encoding/Western European (ISO-8859-_1)"),
630 ENC_ACTION(C_ISO_8859_1
)},
631 {N_("/_View/Character _encoding/Western European (ISO-8859-15)"),
632 ENC_ACTION(C_ISO_8859_15
)},
633 {N_("/_View/Character _encoding/Western European (Windows-1252)"),
634 ENC_ACTION(C_WINDOWS_1252
)},
637 {N_("/_View/Character _encoding/Central European (ISO-8859-_2)"),
638 ENC_ACTION(C_ISO_8859_2
)},
641 {N_("/_View/Character _encoding/_Baltic (ISO-8859-13)"),
642 ENC_ACTION(C_ISO_8859_13
)},
643 {N_("/_View/Character _encoding/Baltic (ISO-8859-_4)"),
644 ENC_ACTION(C_ISO_8859_4
)},
647 {N_("/_View/Character _encoding/Greek (ISO-8859-_7)"),
648 ENC_ACTION(C_ISO_8859_7
)},
651 {N_("/_View/Character _encoding/Hebrew (ISO-8859-_8)"),
652 ENC_ACTION(C_ISO_8859_8
)},
653 {N_("/_View/Character _encoding/Hebrew (Windows-1255)"),
654 ENC_ACTION(C_CP1255
)},
657 {N_("/_View/Character _encoding/Arabic (ISO-8859-_6)"),
658 ENC_ACTION(C_ISO_8859_6
)},
659 {N_("/_View/Character _encoding/Arabic (Windows-1256)"),
660 ENC_ACTION(C_CP1256
)},
663 {N_("/_View/Character _encoding/Turkish (ISO-8859-_9)"),
664 ENC_ACTION(C_ISO_8859_9
)},
667 {N_("/_View/Character _encoding/Cyrillic (ISO-8859-_5)"),
668 ENC_ACTION(C_ISO_8859_5
)},
669 {N_("/_View/Character _encoding/Cyrillic (KOI8-_R)"),
670 ENC_ACTION(C_KOI8_R
)},
671 {N_("/_View/Character _encoding/Cyrillic (KOI8-U)"),
672 ENC_ACTION(C_KOI8_U
)},
673 {N_("/_View/Character _encoding/Cyrillic (Windows-1251)"),
674 ENC_ACTION(C_CP1251
)},
677 {N_("/_View/Character _encoding/Japanese (ISO-2022-_JP)"),
678 ENC_ACTION(C_ISO_2022_JP
)},
679 {N_("/_View/Character _encoding/Japanese (ISO-2022-JP-2)"),
680 ENC_ACTION(C_ISO_2022_JP_2
)},
681 {N_("/_View/Character _encoding/Japanese (_EUC-JP)"),
682 ENC_ACTION(C_EUC_JP
)},
683 {N_("/_View/Character _encoding/Japanese (_Shift__JIS)"),
684 ENC_ACTION(C_SHIFT_JIS
)},
687 {N_("/_View/Character _encoding/Simplified Chinese (_GB2312)"),
688 ENC_ACTION(C_GB2312
)},
689 {N_("/_View/Character _encoding/Simplified Chinese (GBK)"),
691 {N_("/_View/Character _encoding/Traditional Chinese (_Big5)"),
693 {N_("/_View/Character _encoding/Traditional Chinese (EUC-_TW)"),
694 ENC_ACTION(C_EUC_TW
)},
695 {N_("/_View/Character _encoding/Chinese (ISO-2022-_CN)"),
696 ENC_ACTION(C_ISO_2022_CN
)},
699 {N_("/_View/Character _encoding/Korean (EUC-_KR)"),
700 ENC_ACTION(C_EUC_KR
)},
701 {N_("/_View/Character _encoding/Korean (ISO-2022-KR)"),
702 ENC_ACTION(C_ISO_2022_KR
)},
705 {N_("/_View/Character _encoding/Thai (TIS-620)"),
706 ENC_ACTION(C_TIS_620
)},
707 {N_("/_View/Character _encoding/Thai (Windows-874)"),
708 ENC_ACTION(C_WINDOWS_874
)},
713 #define DEC_SEPARATOR \
714 {N_("/_View/Decode/---"), NULL, NULL, 0, "<Separator>"}
715 #define DEC_ACTION(action) \
716 NULL, set_decode_cb, action, "/View/Decode/Auto detect"
717 {N_("/_View/Decode"), NULL
, NULL
, 0, "<Branch>"},
718 {N_("/_View/Decode/_Auto detect"),
719 NULL
, set_decode_cb
, 0, "<RadioItem>"},
720 {N_("/_View/Decode/---"), NULL
, NULL
, 0, "<Separator>"},
721 {N_("/_View/Decode/_8bit"), DEC_ACTION(ENC_8BIT
)},
722 {N_("/_View/Decode/_Quoted printable"), DEC_ACTION(ENC_QUOTED_PRINTABLE
)},
723 {N_("/_View/Decode/_Base64"), DEC_ACTION(ENC_BASE64
)},
724 {N_("/_View/Decode/_Uuencode"), DEC_ACTION(ENC_X_UUENCODE
)},
729 {N_("/_View/---"), NULL
, NULL
, 0, "<Separator>"},
730 {N_("/_View/Open in new _window"), "<control><alt>N", open_msg_cb
, 0, NULL
},
731 {N_("/_View/Mess_age source"), "<control>U", view_source_cb
, 0, NULL
},
732 {N_("/_View/All headers"), "<control>H", show_all_header_cb
, 0, "<ToggleItem>"},
733 {N_("/_View/Quotes"), NULL
, NULL
, 0, "<Branch>"},
734 {N_("/_View/Quotes/_Fold all"), "<control><shift>Q", hide_quotes_cb
, 1, "<ToggleItem>"},
735 {N_("/_View/Quotes/Fold from level _2"),NULL
, hide_quotes_cb
, 2, "<ToggleItem>"},
736 {N_("/_View/Quotes/Fold from level _3"),NULL
, hide_quotes_cb
, 3, "<ToggleItem>"},
737 {N_("/_View/---"), NULL
, NULL
, 0, "<Separator>"},
738 {N_("/_View/_Update summary"), "<control><alt>U", update_summary_cb
, 0, NULL
},
740 {N_("/_Message"), NULL
, NULL
, 0, "<Branch>"},
741 {N_("/_Message/Recei_ve"), NULL
, NULL
, 0, "<Branch>"},
742 {N_("/_Message/Recei_ve/Get from _current account"),
743 "<control>I", inc_mail_cb
, 0, NULL
},
744 {N_("/_Message/Recei_ve/Get from _all accounts"),
745 "<shift><control>I", inc_all_account_mail_cb
, 0, NULL
},
746 {N_("/_Message/Recei_ve/Cancel receivin_g"),
747 NULL
, inc_cancel_cb
, 0, NULL
},
748 {N_("/_Message/Recei_ve/---"), NULL
, NULL
, 0, "<Separator>"},
749 {N_("/_Message/_Send queued messages"), NULL
, send_queue_cb
, 0, NULL
},
750 {N_("/_Message/---"), NULL
, NULL
, 0, "<Separator>"},
751 {N_("/_Message/Compose a_n email message"), "<control>M", compose_mail_cb
, 0, NULL
},
752 {N_("/_Message/Compose a news message"), NULL
, compose_news_cb
, 0, NULL
},
753 {N_("/_Message/_Reply"), "<control>R", main_window_reply_cb
, COMPOSE_REPLY
, NULL
},
754 {N_("/_Message/Repl_y to"), NULL
, NULL
, 0, "<Branch>"},
755 {N_("/_Message/Repl_y to/_all"), "<shift><control>R", main_window_reply_cb
, COMPOSE_REPLY_TO_ALL
, NULL
},
756 {N_("/_Message/Repl_y to/_sender"), NULL
, main_window_reply_cb
, COMPOSE_REPLY_TO_SENDER
, NULL
},
757 {N_("/_Message/Repl_y to/mailing _list"),
758 "<control>L", main_window_reply_cb
, COMPOSE_REPLY_TO_LIST
, NULL
},
759 {N_("/_Message/Follow-up and reply to"),NULL
, main_window_reply_cb
, COMPOSE_FOLLOWUP_AND_REPLY_TO
, NULL
},
760 {N_("/_Message/---"), NULL
, NULL
, 0, "<Separator>"},
761 {N_("/_Message/_Forward"), "<control><alt>F", main_window_reply_cb
, COMPOSE_FORWARD_INLINE
, NULL
},
762 {N_("/_Message/For_ward as attachment"), NULL
, main_window_reply_cb
, COMPOSE_FORWARD_AS_ATTACH
, NULL
},
763 {N_("/_Message/Redirect"), NULL
, main_window_reply_cb
, COMPOSE_REDIRECT
, NULL
},
765 {N_("/_Message/Mailing-_List"), NULL
, NULL
, 0, "<Branch>"},
766 {N_("/_Message/Mailing-_List/Post"), NULL
, NULL
, 0, "<Branch>"},
767 {N_("/_Message/Mailing-_List/Help"), NULL
, NULL
, 0, "<Branch>"},
768 {N_("/_Message/Mailing-_List/Subscribe"), NULL
, NULL
, 0, "<Branch>"},
769 {N_("/_Message/Mailing-_List/Unsubscribe"), NULL
, NULL
, 0, "<Branch>"},
770 {N_("/_Message/Mailing-_List/View archive"), NULL
, NULL
, 0, "<Branch>"},
771 {N_("/_Message/Mailing-_List/Contact owner"), NULL
, NULL
, 0, "<Branch>"},
773 {N_("/_Message/---"), NULL
, NULL
, 0, "<Separator>"},
774 {N_("/_Message/M_ove..."), "<control>O", move_to_cb
, 0, NULL
},
775 {N_("/_Message/_Copy..."), "<shift><control>O", copy_to_cb
, 0, NULL
},
776 {N_("/_Message/Move to _trash"), "<control>D", delete_trash_cb
, 0, NULL
},
777 {N_("/_Message/_Delete..."), NULL
, delete_cb
, 0, NULL
},
778 {N_("/_Message/Cancel a news message"), "", cancel_cb
, 0, NULL
},
779 {N_("/_Message/---"), NULL
, NULL
, 0, "<Separator>"},
780 {N_("/_Message/_Mark"), NULL
, NULL
, 0, "<Branch>"},
781 {N_("/_Message/_Mark/_Mark"), "<shift>asterisk", mark_cb
, 0, NULL
},
782 {N_("/_Message/_Mark/_Unmark"), "U", unmark_cb
, 0, NULL
},
783 {N_("/_Message/_Mark/---"), NULL
, NULL
, 0, "<Separator>"},
784 {N_("/_Message/_Mark/Mark as unr_ead"), "<shift>exclam", mark_as_unread_cb
, 0, NULL
},
785 {N_("/_Message/_Mark/Mark as rea_d"), NULL
, mark_as_read_cb
, 0, NULL
},
786 {N_("/_Message/_Mark/Mark all _read"), NULL
, mark_all_read_cb
, 0, NULL
},
787 {N_("/_Message/_Mark/Ignore thread"), NULL
, ignore_thread_cb
, 0, NULL
},
788 {N_("/_Message/_Mark/Unignore thread"), NULL
, unignore_thread_cb
, 0, NULL
},
789 {N_("/_Message/_Mark/---"), NULL
, NULL
, 0, "<Separator>"},
790 {N_("/_Message/_Mark/Mark as _spam"), NULL
, mark_as_spam_cb
, 1, NULL
},
791 {N_("/_Message/_Mark/Mark as _ham"), NULL
, mark_as_spam_cb
, 0, NULL
},
792 {N_("/_Message/_Mark/---"), NULL
, NULL
, 0, "<Separator>"},
793 {N_("/_Message/_Mark/Lock"), NULL
, lock_msgs_cb
, 0, NULL
},
794 {N_("/_Message/_Mark/Unlock"), NULL
, unlock_msgs_cb
, 0, NULL
},
795 {N_("/_Message/Color la_bel"), NULL
, NULL
, 0, NULL
},
796 {N_("/_Message/---"), NULL
, NULL
, 0, "<Separator>"},
797 {N_("/_Message/Re-_edit"), NULL
, reedit_cb
, 0, NULL
},
799 {N_("/_Tools"), NULL
, NULL
, 0, "<Branch>"},
800 {N_("/_Tools/_Address book..."), "<shift><control>A", addressbook_open_cb
, 0, NULL
},
801 {N_("/_Tools/Add sender to address boo_k"),
802 NULL
, add_address_cb
, 0, NULL
},
803 {N_("/_Tools/_Harvest addresses"), NULL
, NULL
, 0, "<Branch>"},
804 {N_("/_Tools/_Harvest addresses/from _Folder..."),
805 NULL
, addr_harvest_cb
, 0, NULL
},
806 {N_("/_Tools/_Harvest addresses/from _Messages..."),
807 NULL
, addr_harvest_msg_cb
, 0, NULL
},
808 {N_("/_Tools/---"), NULL
, NULL
, 0, "<Separator>"},
809 {N_("/_Tools/_Filter all messages in folder"),
810 NULL
, filter_cb
, 0, NULL
},
811 {N_("/_Tools/Filter _selected messages"),
812 NULL
, filter_cb
, 1, NULL
},
813 {N_("/_Tools/_Create filter rule"), NULL
, NULL
, 0, "<Branch>"},
814 {N_("/_Tools/_Create filter rule/_Automatically"),
815 NULL
, create_filter_cb
, FILTER_BY_AUTO
, NULL
},
816 {N_("/_Tools/_Create filter rule/by _From"),
817 NULL
, create_filter_cb
, FILTER_BY_FROM
, NULL
},
818 {N_("/_Tools/_Create filter rule/by _To"),
819 NULL
, create_filter_cb
, FILTER_BY_TO
, NULL
},
820 {N_("/_Tools/_Create filter rule/by _Subject"),
821 NULL
, create_filter_cb
, FILTER_BY_SUBJECT
, NULL
},
822 {N_("/_Tools/C_reate processing rule"), NULL
, NULL
, 0, "<Branch>"},
823 {N_("/_Tools/C_reate processing rule/_Automatically"),
824 NULL
, create_processing_cb
, FILTER_BY_AUTO
, NULL
},
825 {N_("/_Tools/C_reate processing rule/by _From"),
826 NULL
, create_processing_cb
, FILTER_BY_FROM
, NULL
},
827 {N_("/_Tools/C_reate processing rule/by _To"),
828 NULL
, create_processing_cb
, FILTER_BY_TO
, NULL
},
829 {N_("/_Tools/C_reate processing rule/by _Subject"),
830 NULL
, create_processing_cb
, FILTER_BY_SUBJECT
, NULL
},
831 {N_("/_Tools/---"), NULL
, NULL
, 0, "<Separator>"},
832 {N_("/_Tools/Actio_ns"), NULL
, NULL
, 0, "<Branch>"},
833 {N_("/_Tools/---"), NULL
, NULL
, 0, "<Separator>"},
834 {N_("/_Tools/Ch_eck for new messages in all folders"),
835 NULL
, update_folderview_cb
, 0, NULL
},
836 {N_("/_Tools/Delete du_plicated messages"),
837 NULL
, NULL
, 0, "<Branch>"},
838 {N_("/_Tools/Delete du_plicated messages/In selected folder"),
839 NULL
, delete_duplicated_cb
, 0, NULL
},
840 {N_("/_Tools/Delete du_plicated messages/In all folders"),
841 NULL
, delete_duplicated_all_cb
, 0, NULL
},
842 {N_("/_Tools/---"), NULL
, NULL
, 0, "<Separator>"},
843 {N_("/_Tools/E_xecute"), "X", execute_summary_cb
, 0, NULL
},
845 {N_("/_Tools/---"), NULL
, NULL
, 0, "<Separator>"},
846 {N_("/_Tools/SSL cer_tificates..."),
847 NULL
, ssl_manager_open_cb
, 0, NULL
},
849 {N_("/_Tools/---"), NULL
, NULL
, 0, "<Separator>"},
850 {N_("/_Tools/_Log window"), "<shift><control>L", log_window_show_cb
, 0, NULL
},
852 {N_("/_Configuration"), NULL
, NULL
, 0, "<Branch>"},
853 {N_("/_Configuration/C_hange current account"),
854 NULL
, NULL
, 0, "<Branch>"},
855 {N_("/_Configuration/_Preferences for current account..."),
856 NULL
, prefs_account_open_cb
, 0, NULL
},
857 {N_("/_Configuration/Create _new account..."),
858 NULL
, new_account_cb
, 0, NULL
},
859 {N_("/_Configuration/_Edit accounts..."),
860 NULL
, account_edit_open
, 0, NULL
},
861 {N_("/_Configuration/---"), NULL
, NULL
, 0, "<Separator>"},
862 {N_("/_Configuration/P_references..."),
863 NULL
, prefs_open_cb
, 0, NULL
},
864 {N_("/_Configuration/Pre-pr_ocessing..."),
865 NULL
, prefs_pre_processing_open_cb
, 0, NULL
},
866 {N_("/_Configuration/Post-pro_cessing..."),
867 NULL
, prefs_post_processing_open_cb
, 0, NULL
},
868 {N_("/_Configuration/_Filtering..."),
869 NULL
, prefs_filtering_open_cb
, 0, NULL
},
870 {N_("/_Configuration/_Templates..."), NULL
, prefs_template_open_cb
, 0, NULL
},
871 {N_("/_Configuration/_Actions..."), NULL
, prefs_actions_open_cb
, 0, NULL
},
872 {N_("/_Configuration/Plu_gins..."), NULL
, plugins_open_cb
, 0, NULL
},
874 {N_("/_Help"), NULL
, NULL
, 0, "<Branch>"},
875 {N_("/_Help/_Manual"), NULL
, manual_open_cb
, MANUAL_MANUAL_LOCAL
, NULL
},
876 {N_("/_Help/_Online User-contributed FAQ"),
877 NULL
, manual_open_cb
, MANUAL_FAQ_CLAWS
, NULL
},
878 {N_("/_Help/Icon _Legend"), NULL
, legend_open_cb
, 0, NULL
},
879 {N_("/_Help/---"), NULL
, NULL
, 0, "<Separator>"},
880 {N_("/_Help/_About"), NULL
, about_show
, 0, NULL
}
883 static gboolean offline_ask_sync
= TRUE
;
884 static guint lastkey
;
886 static gboolean
main_window_accel_activate (GtkAccelGroup
*accelgroup
,
892 MainWindow
*mainwin
= (MainWindow
*)user_data
;
894 if (mainwin
->summaryview
&&
895 mainwin
->summaryview
->quicksearch
&&
896 quicksearch_has_focus(mainwin
->summaryview
->quicksearch
) &&
897 (mod
== 0 || mod
== GDK_SHIFT_MASK
)) {
898 quicksearch_pass_key(mainwin
->summaryview
->quicksearch
, lastkey
, mod
);
904 #define N_COLOR_LABELS colorlabel_get_color_count()
906 static void mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem
*menu_item
,
911 GtkCheckMenuItem
**items
;
916 mainwin
= (MainWindow
*)data
;
917 g_return_if_fail(mainwin
!= NULL
);
919 sel
= summary_get_selection(mainwin
->summaryview
);
922 menu
= GTK_MENU_SHELL(mainwin
->colorlabel_menu
);
923 g_return_if_fail(menu
!= NULL
);
925 Xalloca(items
, (N_COLOR_LABELS
+ 1) * sizeof(GtkWidget
*), return);
927 /* NOTE: don't return prematurely because we set the "dont_toggle"
928 * state for check menu items */
929 g_object_set_data(G_OBJECT(menu
), "dont_toggle",
932 /* clear items. get item pointers. */
933 for (n
= 0, cur
= menu
->children
; cur
!= NULL
&& cur
->data
!= NULL
; cur
= cur
->next
) {
934 if (GTK_IS_CHECK_MENU_ITEM(cur
->data
)) {
935 gtk_check_menu_item_set_active
936 (GTK_CHECK_MENU_ITEM(cur
->data
), FALSE
);
937 items
[n
] = GTK_CHECK_MENU_ITEM(cur
->data
);
942 if (n
== (N_COLOR_LABELS
+ 1)) {
943 /* iterate all messages and set the state of the appropriate
945 for (; sel
!= NULL
; sel
= sel
->next
) {
949 msginfo
= (MsgInfo
*)sel
->data
;
951 clabel
= MSG_GET_COLORLABEL_VALUE(msginfo
->flags
);
952 if (!items
[clabel
]->active
)
953 gtk_check_menu_item_set_active
954 (items
[clabel
], TRUE
);
958 g_warning("invalid number of color elements (%d)\n", n
);
960 /* reset "dont_toggle" state */
961 g_object_set_data(G_OBJECT(menu
), "dont_toggle",
965 static void mainwindow_colorlabel_menu_item_activate_cb(GtkWidget
*widget
,
968 guint color
= GPOINTER_TO_UINT(data
);
971 mainwin
= g_object_get_data(G_OBJECT(widget
), "mainwin");
972 g_return_if_fail(mainwin
!= NULL
);
974 /* "dont_toggle" state set? */
975 if (g_object_get_data(G_OBJECT(mainwin
->colorlabel_menu
),
979 summary_set_colorlabel(mainwin
->summaryview
, color
, NULL
);
982 static void mainwindow_colorlabel_menu_create(MainWindow
*mainwin
, gboolean refresh
)
984 GtkWidget
*label_menuitem
;
989 label_menuitem
= gtk_item_factory_get_item(mainwin
->menu_factory
,
990 "/Message/Color label");
991 g_signal_connect(G_OBJECT(label_menuitem
), "activate",
992 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_item_cb
),
994 gtk_widget_show(label_menuitem
);
996 menu
= gtk_menu_new();
998 /* create sub items. for the menu item activation callback we pass the
999 * index of label_colors[] as data parameter. for the None color we
1000 * pass an invalid (high) value. also we attach a data pointer so we
1001 * can always get back the Mainwindow pointer. */
1003 item
= gtk_check_menu_item_new_with_label(_("None"));
1004 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), item
);
1005 g_signal_connect(G_OBJECT(item
), "activate",
1006 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb
),
1007 GUINT_TO_POINTER(0));
1008 g_object_set_data(G_OBJECT(item
), "mainwin", mainwin
);
1009 gtk_widget_show(item
);
1011 gtk_widget_add_accelerator(item
, "activate",
1012 mainwin
->menu_factory
->accel_group
,
1013 GDK_0
, GDK_CONTROL_MASK
,
1014 GTK_ACCEL_LOCKED
| GTK_ACCEL_VISIBLE
);
1016 item
= gtk_menu_item_new();
1017 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), item
);
1018 gtk_widget_show(item
);
1020 /* create pixmap/label menu items */
1021 for (i
= 0; i
< N_COLOR_LABELS
; i
++) {
1022 item
= colorlabel_create_check_color_menu_item(
1023 i
, refresh
, MAINWIN_COLORMENU
);
1024 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), item
);
1025 g_signal_connect(G_OBJECT(item
), "activate",
1026 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb
),
1027 GUINT_TO_POINTER(i
+ 1));
1028 g_object_set_data(G_OBJECT(item
), "mainwin",
1030 gtk_widget_show(item
);
1031 gtk_widget_add_accelerator(item
, "activate",
1032 mainwin
->menu_factory
->accel_group
,
1033 GDK_1
+i
, GDK_CONTROL_MASK
,
1034 GTK_ACCEL_LOCKED
| GTK_ACCEL_VISIBLE
);
1037 gtk_widget_show(menu
);
1038 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem
), menu
);
1039 mainwin
->colorlabel_menu
= menu
;
1042 static gboolean
warning_icon_pressed(GtkWidget
*widget
, GdkEventButton
*evt
,
1043 MainWindow
*mainwindow
)
1045 if (evt
&& evt
->button
== 1) {
1046 log_window_show_error(mainwindow
->logwin
);
1047 gtk_widget_hide(mainwindow
->warning_btn
);
1052 static gboolean
warning_visi_notify(GtkWidget
*widget
,
1053 GdkEventVisibility
*event
,
1054 MainWindow
*mainwindow
)
1056 gdk_window_set_cursor(mainwindow
->warning_btn
->window
, hand_cursor
);
1060 static gboolean
warning_leave_notify(GtkWidget
*widget
,
1061 GdkEventCrossing
*event
,
1062 MainWindow
*mainwindow
)
1064 gdk_window_set_cursor(mainwindow
->warning_btn
->window
, NULL
);
1068 static gboolean
warning_enter_notify(GtkWidget
*widget
,
1069 GdkEventCrossing
*event
,
1070 MainWindow
*mainwindow
)
1072 gdk_window_set_cursor(mainwindow
->warning_btn
->window
, hand_cursor
);
1076 void mainwindow_show_error(void)
1078 MainWindow
*mainwin
= mainwindow_get_mainwindow();
1079 gtk_widget_show(mainwin
->warning_btn
);
1082 void mainwindow_clear_error(MainWindow
*mainwin
)
1084 gtk_widget_hide(mainwin
->warning_btn
);
1087 MainWindow
*main_window_create(SeparateType type
)
1089 MainWindow
*mainwin
;
1093 GtkWidget
*handlebox
;
1094 GtkWidget
*vbox_body
;
1095 GtkWidget
*hbox_stat
;
1096 GtkWidget
*statusbar
;
1097 GtkWidget
*progressbar
;
1098 GtkWidget
*statuslabel
;
1099 GtkWidget
*ac_button
;
1100 GtkWidget
*ac_label
;
1101 GtkWidget
*online_pixmap
;
1102 GtkWidget
*offline_pixmap
;
1103 GtkWidget
*online_switch
;
1104 GtkWidget
*offline_switch
;
1106 GtkWidget
*warning_icon
;
1107 GtkWidget
*warning_btn
;
1109 FolderView
*folderview
;
1110 SummaryView
*summaryview
;
1111 MessageView
*messageview
;
1112 GdkColormap
*colormap
;
1114 gboolean success
[4];
1115 GtkItemFactory
*ifactory
;
1117 GtkWidget
*menuitem
;
1119 guint n_menu_entries
;
1121 static GdkGeometry geometry
;
1123 debug_print("Creating main window...\n");
1124 mainwin
= g_new0(MainWindow
, 1);
1127 window
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
1128 gtk_window_set_title(GTK_WINDOW(window
), PROG_VERSION
);
1129 gtk_window_set_resizable(GTK_WINDOW(window
), TRUE
);
1131 if (!geometry
.min_height
) {
1132 geometry
.min_width
= 320;
1133 geometry
.min_height
= 200;
1135 gtk_window_set_geometry_hints(GTK_WINDOW(window
), NULL
, &geometry
,
1138 g_signal_connect(G_OBJECT(window
), "delete_event",
1139 G_CALLBACK(main_window_close_cb
), mainwin
);
1140 MANAGE_WINDOW_SIGNALS_CONNECT(window
);
1141 g_signal_connect(G_OBJECT(window
), "focus_in_event",
1142 G_CALLBACK(mainwindow_focus_in_event
),
1144 g_signal_connect(G_OBJECT(window
), "key_press_event",
1145 G_CALLBACK(mainwindow_key_pressed
), mainwin
);
1147 gtk_widget_realize(window
);
1148 gtk_widget_add_events(window
, GDK_KEY_PRESS_MASK
|GDK_KEY_RELEASE_MASK
);
1151 gtkut_widget_set_app_icon(window
);
1153 vbox
= gtk_vbox_new(FALSE
, 0);
1154 gtk_widget_show(vbox
);
1155 gtk_container_add(GTK_CONTAINER(window
), vbox
);
1158 n_menu_entries
= sizeof(mainwin_entries
) / sizeof(mainwin_entries
[0]);
1159 menubar
= menubar_create(window
, mainwin_entries
,
1160 n_menu_entries
, "<Main>", mainwin
);
1161 gtk_widget_show(menubar
);
1162 gtk_box_pack_start(GTK_BOX(vbox
), menubar
, FALSE
, TRUE
, 0);
1163 ifactory
= gtk_item_factory_from_widget(menubar
);
1165 /* gtk_widget_show(gtk_item_factory_get_item(ifactory,"/Message/Mailing-List"));
1166 main_create_mailing_list_menu (mainwin, NULL); */
1168 menu_set_sensitive(ifactory
, "/Help/Manual", manual_available(MANUAL_MANUAL_LOCAL
));
1170 if (prefs_common
.toolbar_detachable
) {
1171 handlebox
= gtk_handle_box_new();
1172 gtk_widget_show(handlebox
);
1173 gtk_box_pack_start(GTK_BOX(vbox
), handlebox
, FALSE
, FALSE
, 0);
1174 g_signal_connect(G_OBJECT(handlebox
), "child_attached",
1175 G_CALLBACK(toolbar_child_attached
), mainwin
);
1176 g_signal_connect(G_OBJECT(handlebox
), "child_detached",
1177 G_CALLBACK(toolbar_child_detached
), mainwin
);
1179 handlebox
= gtk_hbox_new(FALSE
, 0);
1180 gtk_widget_show(handlebox
);
1181 gtk_box_pack_start(GTK_BOX(vbox
), handlebox
, FALSE
, FALSE
, 0);
1183 /* link window to mainwin->window to avoid gdk warnings */
1184 mainwin
->window
= window
;
1186 /* create toolbar */
1187 mainwin
->toolbar
= toolbar_create(TOOLBAR_MAIN
,
1190 toolbar_set_learn_button
1194 /* vbox that contains body */
1195 vbox_body
= gtk_vbox_new(FALSE
, BORDER_WIDTH
);
1196 gtk_widget_show(vbox_body
);
1197 gtk_container_set_border_width(GTK_CONTAINER(vbox_body
), BORDER_WIDTH
);
1198 gtk_box_pack_start(GTK_BOX(vbox
), vbox_body
, TRUE
, TRUE
, 0);
1200 hbox_stat
= gtk_hbox_new(FALSE
, 2);
1201 gtk_box_pack_end(GTK_BOX(vbox_body
), hbox_stat
, FALSE
, FALSE
, 0);
1203 tips
= gtk_tooltips_new();
1205 warning_icon
= gtk_image_new_from_stock
1206 (GTK_STOCK_DIALOG_WARNING
, GTK_ICON_SIZE_SMALL_TOOLBAR
);
1207 warning_btn
= gtk_event_box_new();
1208 gtk_event_box_set_visible_window(GTK_EVENT_BOX(warning_btn
), FALSE
);
1210 mainwin
->warning_btn
= warning_btn
;
1212 g_signal_connect(G_OBJECT(warning_btn
), "button-press-event",
1213 G_CALLBACK(warning_icon_pressed
),
1214 (gpointer
) mainwin
);
1215 g_signal_connect(G_OBJECT(warning_btn
), "visibility-notify-event",
1216 G_CALLBACK(warning_visi_notify
), mainwin
);
1217 g_signal_connect(G_OBJECT(warning_btn
), "motion-notify-event",
1218 G_CALLBACK(warning_visi_notify
), mainwin
);
1219 g_signal_connect(G_OBJECT(warning_btn
), "leave-notify-event",
1220 G_CALLBACK(warning_leave_notify
), mainwin
);
1221 g_signal_connect(G_OBJECT(warning_btn
), "enter-notify-event",
1222 G_CALLBACK(warning_enter_notify
), mainwin
);
1224 gtk_container_add (GTK_CONTAINER(warning_btn
), warning_icon
);
1226 gtk_tooltips_set_tip(GTK_TOOLTIPS(tips
),warning_btn
,
1227 _("Some error(s) happened. Click here to view log."), NULL
);
1228 gtk_box_pack_start(GTK_BOX(hbox_stat
), warning_btn
, FALSE
, FALSE
, 0);
1230 statusbar
= statusbar_create();
1231 gtk_box_pack_start(GTK_BOX(hbox_stat
), statusbar
, TRUE
, TRUE
, 0);
1233 progressbar
= gtk_progress_bar_new();
1234 gtk_widget_set_size_request(progressbar
, 120, 1);
1235 gtk_box_pack_start(GTK_BOX(hbox_stat
), progressbar
, FALSE
, FALSE
, 0);
1237 online_pixmap
= stock_pixmap_widget(hbox_stat
, STOCK_PIXMAP_ONLINE
);
1238 offline_pixmap
= stock_pixmap_widget(hbox_stat
, STOCK_PIXMAP_OFFLINE
);
1239 online_switch
= gtk_button_new ();
1240 gtk_tooltips_set_tip(GTK_TOOLTIPS(tips
),online_switch
,
1241 _("You are online. Click the icon to go offline"), NULL
);
1242 offline_switch
= gtk_button_new ();
1243 gtk_tooltips_set_tip(GTK_TOOLTIPS(tips
),offline_switch
,
1244 _("You are offline. Click the icon to go online"),
1246 gtk_container_add (GTK_CONTAINER(online_switch
), online_pixmap
);
1247 gtk_button_set_relief (GTK_BUTTON(online_switch
), GTK_RELIEF_NONE
);
1248 g_signal_connect (G_OBJECT(online_switch
), "clicked", G_CALLBACK(online_switch_clicked
), mainwin
);
1249 gtk_box_pack_start (GTK_BOX(hbox_stat
), online_switch
, FALSE
, FALSE
, 0);
1250 gtk_container_add (GTK_CONTAINER(offline_switch
), offline_pixmap
);
1251 gtk_button_set_relief (GTK_BUTTON(offline_switch
), GTK_RELIEF_NONE
);
1252 g_signal_connect (G_OBJECT(offline_switch
), "clicked", G_CALLBACK(online_switch_clicked
), mainwin
);
1253 gtk_box_pack_start (GTK_BOX(hbox_stat
), offline_switch
, FALSE
, FALSE
, 0);
1255 statuslabel
= gtk_label_new("");
1256 gtk_box_pack_start(GTK_BOX(hbox_stat
), statuslabel
, FALSE
, FALSE
, 0);
1258 ac_button
= gtk_button_new();
1259 gtk_tooltips_set_tip(GTK_TOOLTIPS(tips
),
1260 ac_button
, _("Select account"), NULL
);
1261 GTK_WIDGET_UNSET_FLAGS(ac_button
, GTK_CAN_FOCUS
);
1262 gtk_widget_set_size_request(ac_button
, -1, 0);
1263 gtk_box_pack_end(GTK_BOX(hbox_stat
), ac_button
, FALSE
, FALSE
, 0);
1264 g_signal_connect(G_OBJECT(ac_button
), "button_press_event",
1265 G_CALLBACK(ac_label_button_pressed
), mainwin
);
1267 ac_label
= gtk_label_new("");
1268 gtk_container_add(GTK_CONTAINER(ac_button
), ac_label
);
1270 gtk_widget_show_all(hbox_stat
);
1272 gtk_widget_hide(offline_switch
);
1273 gtk_widget_hide(warning_btn
);
1275 mainwin
->folderview
= folderview
= folderview_create();
1276 mainwin
->summaryview
= summaryview
= summary_create();
1277 mainwin
->messageview
= messageview
= messageview_create(mainwin
);
1278 mainwin
->logwin
= log_window_create();
1280 log_window_init(mainwin
->logwin
);
1281 log_window_set_clipping(mainwin
->logwin
, prefs_common
.cliplog
,
1282 prefs_common
.loglength
);
1284 folderview
->mainwin
= mainwin
;
1285 folderview
->summaryview
= summaryview
;
1287 summaryview
->mainwin
= mainwin
;
1288 summaryview
->folderview
= folderview
;
1289 summaryview
->messageview
= messageview
;
1290 summaryview
->window
= window
;
1292 messageview
->statusbar
= statusbar
;
1293 mainwin
->vbox
= vbox
;
1294 mainwin
->menubar
= menubar
;
1295 mainwin
->menu_factory
= ifactory
;
1296 mainwin
->handlebox
= handlebox
;
1297 mainwin
->vbox_body
= vbox_body
;
1298 mainwin
->hbox_stat
= hbox_stat
;
1299 mainwin
->statusbar
= statusbar
;
1300 mainwin
->progressbar
= progressbar
;
1301 mainwin
->statuslabel
= statuslabel
;
1302 mainwin
->online_switch
= online_switch
;
1303 mainwin
->online_pixmap
= online_pixmap
;
1304 mainwin
->offline_pixmap
= offline_pixmap
;
1305 mainwin
->ac_button
= ac_button
;
1306 mainwin
->ac_label
= ac_label
;
1307 mainwin
->offline_switch
= offline_switch
;
1309 /* set context IDs for status bar */
1310 mainwin
->mainwin_cid
= gtk_statusbar_get_context_id
1311 (GTK_STATUSBAR(statusbar
), "Main Window");
1312 mainwin
->folderview_cid
= gtk_statusbar_get_context_id
1313 (GTK_STATUSBAR(statusbar
), "Folder View");
1314 mainwin
->summaryview_cid
= gtk_statusbar_get_context_id
1315 (GTK_STATUSBAR(statusbar
), "Summary View");
1316 mainwin
->messageview_cid
= gtk_statusbar_get_context_id
1317 (GTK_STATUSBAR(statusbar
), "Message View");
1319 messageview
->statusbar_cid
= mainwin
->messageview_cid
;
1321 /* allocate colors for summary view and folder view */
1322 summaryview
->color_marked
.red
= summaryview
->color_marked
.green
= 0;
1323 summaryview
->color_marked
.blue
= (guint16
)65535;
1325 summaryview
->color_dim
.red
= summaryview
->color_dim
.green
=
1326 summaryview
->color_dim
.blue
= COLOR_DIM
;
1328 gtkut_convert_int_to_gdk_color(prefs_common
.color_new
,
1329 &folderview
->color_new
);
1331 gtkut_convert_int_to_gdk_color(prefs_common
.tgt_folder_col
,
1332 &folderview
->color_op
);
1334 summaryview
->color_important
.red
= 0;
1335 summaryview
->color_important
.green
= 0;
1336 summaryview
->color_important
.blue
= (guint16
)65535;
1338 color
[0] = summaryview
->color_marked
;
1339 color
[1] = summaryview
->color_dim
;
1340 color
[2] = folderview
->color_new
;
1341 color
[3] = folderview
->color_op
;
1343 colormap
= gdk_drawable_get_colormap(window
->window
);
1344 gdk_colormap_alloc_colors(colormap
, color
, 4, FALSE
, TRUE
, success
);
1345 for (i
= 0; i
< 4; i
++) {
1346 if (success
[i
] == FALSE
)
1347 g_warning("MainWindow: color allocation %d failed\n", i
);
1350 debug_print("done.\n");
1352 messageview
->visible
= prefs_common
.msgview_visible
;
1354 main_window_set_widgets(mainwin
, type
);
1356 g_signal_connect(G_OBJECT(window
), "size_allocate",
1357 G_CALLBACK(main_window_size_allocate_cb
),
1360 /* set menu items */
1361 menuitem
= gtk_item_factory_get_item
1362 (ifactory
, "/View/Character encoding/Auto detect");
1363 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem
), TRUE
);
1365 switch (prefs_common
.toolbar_style
) {
1367 menuitem
= gtk_item_factory_get_item
1368 (ifactory
, "/View/Show or hide/Toolbar/Hide");
1371 menuitem
= gtk_item_factory_get_item
1372 (ifactory
, "/View/Show or hide/Toolbar/Icons only");
1375 menuitem
= gtk_item_factory_get_item
1376 (ifactory
, "/View/Show or hide/Toolbar/Text only");
1379 menuitem
= gtk_item_factory_get_item
1380 (ifactory
, "/View/Show or hide/Toolbar/Text below icons");
1382 case TOOLBAR_BOTH_HORIZ
:
1383 menuitem
= gtk_item_factory_get_item
1385 "/View/Show or hide/Toolbar/Text beside icons");
1387 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem
), TRUE
);
1389 gtk_widget_hide(mainwin
->hbox_stat
);
1390 menuitem
= gtk_item_factory_get_item
1391 (ifactory
, "/View/Show or hide/Status bar");
1392 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem
),
1393 prefs_common
.show_statusbar
);
1395 /* set account selection menu */
1396 ac_menu
= gtk_item_factory_get_widget
1397 (ifactory
, "/Configuration/Change current account");
1398 mainwin
->ac_menu
= ac_menu
;
1400 toolbar_main_set_sensitive(mainwin
);
1402 /* create actions menu */
1403 main_window_update_actions_menu(mainwin
);
1405 main_create_mailing_list_menu (mainwin
, NULL
);
1407 /* attach accel groups to main window */
1408 #define ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win) \
1409 gtk_window_add_accel_group \
1411 gtk_item_factory_from_widget(menu)->accel_group); \
1412 g_signal_connect(G_OBJECT(gtk_item_factory_from_widget(menu)->accel_group), \
1414 G_CALLBACK(main_window_accel_activate), mainwin);
1417 ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview
->popupmenu
, mainwin
->window
);
1419 /* connect the accelerators for equivalent
1420 menu items in different menus */
1421 menu_connect_identical_items();
1424 gtk_window_iconify(GTK_WINDOW(mainwin
->window
));
1426 gtk_widget_show(mainwin
->window
);
1428 /* initialize views */
1429 folderview_init(folderview
);
1430 summary_init(summaryview
);
1431 messageview_init(messageview
);
1433 sslcertwindow_register_hook();
1435 mainwin
->lock_count
= 0;
1436 mainwin
->menu_lock_count
= 0;
1437 mainwin
->cursor_count
= 0;
1439 mainwin
->progressindicator_hook
=
1440 hooks_register_hook(PROGRESSINDICATOR_HOOKLIST
, mainwindow_progressindicator_hook
, mainwin
);
1443 watch_cursor
= gdk_cursor_new(GDK_WATCH
);
1445 hand_cursor
= gdk_cursor_new(GDK_HAND2
);
1447 mainwin_list
= g_list_append(mainwin_list
, mainwin
);
1449 /* init work_offline */
1450 if (prefs_common
.work_offline
)
1451 online_switch_clicked (GTK_BUTTON(online_switch
), mainwin
);
1453 mainwindow_colorlabel_menu_create(mainwin
, FALSE
);
1458 void main_window_destroy(MainWindow
*mainwin
)
1460 /* TODO : destroy other component */
1461 messageview_destroy(mainwin
->messageview
);
1462 mainwin
->messageview
= NULL
;
1465 void main_window_update_actions_menu(MainWindow
*mainwin
)
1467 GtkItemFactory
*ifactory
;
1469 ifactory
= gtk_item_factory_from_widget(mainwin
->menubar
);
1470 action_update_mainwin_menu(ifactory
, "/Tools/Actions", mainwin
);
1473 void main_window_cursor_wait(MainWindow
*mainwin
)
1476 if (mainwin
->cursor_count
== 0) {
1477 gdk_window_set_cursor(mainwin
->window
->window
, watch_cursor
);
1478 textview_cursor_wait(mainwin
->messageview
->mimeview
->textview
);
1481 mainwin
->cursor_count
++;
1486 void main_window_cursor_normal(MainWindow
*mainwin
)
1488 if (mainwin
->cursor_count
)
1489 mainwin
->cursor_count
--;
1491 if (mainwin
->cursor_count
== 0) {
1492 gdk_window_set_cursor(mainwin
->window
->window
, NULL
);
1493 textview_cursor_normal(mainwin
->messageview
->mimeview
->textview
);
1498 /* lock / unlock the user-interface */
1499 void main_window_lock(MainWindow
*mainwin
)
1501 if (mainwin
->lock_count
== 0)
1502 gtk_widget_set_sensitive(mainwin
->ac_button
, FALSE
);
1504 mainwin
->lock_count
++;
1506 main_window_set_menu_sensitive(mainwin
);
1507 toolbar_main_set_sensitive(mainwin
);
1510 void main_window_unlock(MainWindow
*mainwin
)
1512 if (mainwin
->lock_count
)
1513 mainwin
->lock_count
--;
1515 main_window_set_menu_sensitive(mainwin
);
1516 toolbar_main_set_sensitive(mainwin
);
1518 if (mainwin
->lock_count
== 0)
1519 gtk_widget_set_sensitive(mainwin
->ac_button
, TRUE
);
1522 static void main_window_menu_callback_block(MainWindow
*mainwin
)
1524 mainwin
->menu_lock_count
++;
1527 static void main_window_menu_callback_unblock(MainWindow
*mainwin
)
1529 if (mainwin
->menu_lock_count
)
1530 mainwin
->menu_lock_count
--;
1533 static guint prefs_tag
= 0;
1535 void main_window_reflect_prefs_all(void)
1537 main_window_reflect_prefs_all_real(FALSE
);
1540 static gboolean
reflect_prefs_timeout_cb(gpointer data
)
1542 gboolean pixmap_theme_changed
= GPOINTER_TO_INT(data
);
1544 MainWindow
*mainwin
;
1547 for (cur
= mainwin_list
; cur
!= NULL
; cur
= cur
->next
) {
1548 mainwin
= (MainWindow
*)cur
->data
;
1550 main_window_show_cur_account(mainwin
);
1551 main_window_set_menu_sensitive(mainwin
);
1552 toolbar_main_set_sensitive(mainwin
);
1555 if (pixmap_theme_changed
) {
1556 toolbar_update(TOOLBAR_MAIN
, mainwin
);
1557 messageview_reflect_prefs_pixmap_theme();
1558 compose_reflect_prefs_pixmap_theme();
1559 folderview_reflect_prefs_pixmap_theme(mainwin
->folderview
);
1560 summary_reflect_prefs_pixmap_theme(mainwin
->summaryview
);
1562 pixmap
= stock_pixmap_widget(mainwin
->hbox_stat
, STOCK_PIXMAP_ONLINE
);
1563 gtk_container_remove(GTK_CONTAINER(mainwin
->online_switch
),
1564 mainwin
->online_pixmap
);
1565 gtk_container_add (GTK_CONTAINER(mainwin
->online_switch
), pixmap
);
1566 gtk_widget_show(pixmap
);
1567 mainwin
->online_pixmap
= pixmap
;
1568 pixmap
= stock_pixmap_widget(mainwin
->hbox_stat
, STOCK_PIXMAP_OFFLINE
);
1569 gtk_container_remove(GTK_CONTAINER(mainwin
->offline_switch
),
1570 mainwin
->offline_pixmap
);
1571 gtk_container_add (GTK_CONTAINER(mainwin
->offline_switch
), pixmap
);
1572 gtk_widget_show(pixmap
);
1573 mainwin
->offline_pixmap
= pixmap
;
1576 headerview_set_font(mainwin
->messageview
->headerview
);
1577 headerview_set_visibility(mainwin
->messageview
->headerview
,
1578 prefs_common
.display_header_pane
);
1579 textview_reflect_prefs(mainwin
->messageview
->mimeview
->textview
);
1580 folderview_reflect_prefs();
1581 summary_reflect_prefs();
1582 summary_redisplay_msg(mainwin
->summaryview
);
1588 void main_window_reflect_prefs_all_now(void)
1590 reflect_prefs_timeout_cb(GINT_TO_POINTER(FALSE
));
1593 void main_window_reflect_prefs_custom_colors(MainWindow
*mainwin
)
1598 /* re-create colorlabel submenu */
1599 menu
= GTK_MENU_SHELL(mainwin
->colorlabel_menu
);
1600 g_return_if_fail(menu
!= NULL
);
1602 /* clear items. get item pointers. */
1603 for (cur
= menu
->children
; cur
!= NULL
&& cur
->data
!= NULL
; cur
= cur
->next
) {
1604 gtk_menu_item_remove_submenu(GTK_MENU_ITEM(cur
->data
));
1606 mainwindow_colorlabel_menu_create(mainwin
, TRUE
);
1607 summary_reflect_prefs_custom_colors(mainwin
->summaryview
);
1611 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed
)
1613 if (prefs_tag
== 0 || pixmap_theme_changed
) {
1614 prefs_tag
= g_timeout_add(500, reflect_prefs_timeout_cb
,
1615 GINT_TO_POINTER(pixmap_theme_changed
));
1619 void main_window_set_summary_column(void)
1622 MainWindow
*mainwin
;
1624 for (cur
= mainwin_list
; cur
!= NULL
; cur
= cur
->next
) {
1625 mainwin
= (MainWindow
*)cur
->data
;
1626 summary_set_column_order(mainwin
->summaryview
);
1630 void main_window_set_folder_column(void)
1633 MainWindow
*mainwin
;
1635 for (cur
= mainwin_list
; cur
!= NULL
; cur
= cur
->next
) {
1636 mainwin
= (MainWindow
*)cur
->data
;
1637 folderview_set_column_order(mainwin
->folderview
);
1641 static void main_window_set_account_selector_menu(MainWindow
*mainwin
,
1642 GList
*account_list
)
1644 GList
*cur_ac
, *cur_item
;
1645 GtkWidget
*menuitem
;
1646 PrefsAccount
*ac_prefs
;
1648 /* destroy all previous menu item */
1649 cur_item
= GTK_MENU_SHELL(mainwin
->ac_menu
)->children
;
1650 while (cur_item
!= NULL
) {
1651 GList
*next
= cur_item
->next
;
1652 gtk_widget_destroy(GTK_WIDGET(cur_item
->data
));
1656 for (cur_ac
= account_list
; cur_ac
!= NULL
; cur_ac
= cur_ac
->next
) {
1657 ac_prefs
= (PrefsAccount
*)cur_ac
->data
;
1659 menuitem
= gtk_menu_item_new_with_label
1660 (ac_prefs
->account_name
1661 ? ac_prefs
->account_name
: _("Untitled"));
1662 gtk_widget_show(menuitem
);
1663 gtk_menu_append(GTK_MENU(mainwin
->ac_menu
), menuitem
);
1664 g_signal_connect(G_OBJECT(menuitem
), "activate",
1665 G_CALLBACK(account_selector_menu_cb
),
1670 static void main_window_set_account_receive_menu(MainWindow
*mainwin
,
1671 GList
*account_list
)
1673 GList
*cur_ac
, *cur_item
;
1675 GtkWidget
*menuitem
;
1676 PrefsAccount
*ac_prefs
;
1678 menu
= gtk_item_factory_get_widget(mainwin
->menu_factory
,
1679 "/Message/Receive");
1681 /* search for separator */
1682 for (cur_item
= GTK_MENU_SHELL(menu
)->children
; cur_item
!= NULL
;
1683 cur_item
= cur_item
->next
) {
1684 if (GTK_BIN(cur_item
->data
)->child
== NULL
) {
1685 cur_item
= cur_item
->next
;
1690 /* destroy all previous menu item */
1691 while (cur_item
!= NULL
) {
1692 GList
*next
= cur_item
->next
;
1693 gtk_widget_destroy(GTK_WIDGET(cur_item
->data
));
1697 for (cur_ac
= account_list
; cur_ac
!= NULL
; cur_ac
= cur_ac
->next
) {
1698 ac_prefs
= (PrefsAccount
*)cur_ac
->data
;
1700 menuitem
= gtk_menu_item_new_with_label
1701 (ac_prefs
->account_name
? ac_prefs
->account_name
1703 gtk_widget_show(menuitem
);
1704 gtk_menu_append(GTK_MENU(menu
), menuitem
);
1705 g_signal_connect(G_OBJECT(menuitem
), "activate",
1706 G_CALLBACK(account_receive_menu_cb
),
1711 static void main_window_set_toolbar_combo_receive_menu(MainWindow
*mainwin
,
1712 GList
*account_list
)
1714 GList
*cur_ac
, *cur_item
;
1715 GtkWidget
*menuitem
;
1716 PrefsAccount
*ac_prefs
;
1717 GtkWidget
*menu
= NULL
;
1719 if (mainwin
->toolbar
->getall_btn
== NULL
1720 || mainwin
->toolbar
->getall_combo
== NULL
) /* button doesn't exist */
1723 menu
= mainwin
->toolbar
->getall_combo
->menu
;
1725 /* destroy all previous menu item */
1726 cur_item
= GTK_MENU_SHELL(menu
)->children
;
1727 while (cur_item
!= NULL
) {
1728 GList
*next
= cur_item
->next
;
1729 gtk_widget_destroy(GTK_WIDGET(cur_item
->data
));
1733 for (cur_ac
= account_list
; cur_ac
!= NULL
; cur_ac
= cur_ac
->next
) {
1734 ac_prefs
= (PrefsAccount
*)cur_ac
->data
;
1736 menuitem
= gtk_menu_item_new_with_label
1737 (ac_prefs
->account_name
1738 ? ac_prefs
->account_name
: _("Untitled"));
1739 gtk_widget_show(menuitem
);
1740 gtk_menu_append(GTK_MENU(menu
), menuitem
);
1741 g_signal_connect(G_OBJECT(menuitem
), "activate",
1742 G_CALLBACK(account_receive_menu_cb
),
1747 static void main_window_set_toolbar_combo_compose_menu(MainWindow
*mainwin
,
1748 GList
*account_list
)
1750 GList
*cur_ac
, *cur_item
;
1751 GtkWidget
*menuitem
;
1752 PrefsAccount
*ac_prefs
;
1753 GtkWidget
*menu
= NULL
;
1755 if (mainwin
->toolbar
->compose_mail_btn
== NULL
1756 || mainwin
->toolbar
->compose_combo
== NULL
) /* button doesn't exist */
1759 menu
= mainwin
->toolbar
->compose_combo
->menu
;
1761 /* destroy all previous menu item */
1762 cur_item
= GTK_MENU_SHELL(menu
)->children
;
1763 while (cur_item
!= NULL
) {
1764 GList
*next
= cur_item
->next
;
1765 gtk_widget_destroy(GTK_WIDGET(cur_item
->data
));
1769 for (cur_ac
= account_list
; cur_ac
!= NULL
; cur_ac
= cur_ac
->next
) {
1770 ac_prefs
= (PrefsAccount
*)cur_ac
->data
;
1772 menuitem
= gtk_menu_item_new_with_label
1773 (ac_prefs
->account_name
1774 ? ac_prefs
->account_name
: _("Untitled"));
1775 gtk_widget_show(menuitem
);
1776 gtk_menu_append(GTK_MENU(menu
), menuitem
);
1777 g_signal_connect(G_OBJECT(menuitem
), "activate",
1778 G_CALLBACK(account_compose_menu_cb
),
1783 void main_window_set_account_menu(GList
*account_list
)
1786 MainWindow
*mainwin
;
1788 for (cur
= mainwin_list
; cur
!= NULL
; cur
= cur
->next
) {
1789 mainwin
= (MainWindow
*)cur
->data
;
1790 main_window_set_account_selector_menu(mainwin
, account_list
);
1791 main_window_set_account_receive_menu(mainwin
, account_list
);
1792 main_window_set_toolbar_combo_receive_menu(mainwin
, account_list
);
1793 main_window_set_toolbar_combo_compose_menu(mainwin
, account_list
);
1795 hooks_invoke(ACCOUNT_LIST_CHANGED_HOOKLIST
, NULL
);
1798 void main_window_set_account_menu_only_toolbar(GList
*account_list
)
1801 MainWindow
*mainwin
;
1803 for (cur
= mainwin_list
; cur
!= NULL
; cur
= cur
->next
) {
1804 mainwin
= (MainWindow
*)cur
->data
;
1805 main_window_set_toolbar_combo_receive_menu(mainwin
, account_list
);
1806 main_window_set_toolbar_combo_compose_menu(mainwin
, account_list
);
1810 static void main_window_show_cur_account(MainWindow
*mainwin
)
1815 ac_name
= g_strdup(cur_account
1816 ? (cur_account
->account_name
1817 ? cur_account
->account_name
: _("Untitled"))
1821 buf
= g_strdup_printf("%s - %s", ac_name
, PROG_VERSION
);
1823 buf
= g_strdup(PROG_VERSION
);
1824 gtk_window_set_title(GTK_WINDOW(mainwin
->window
), buf
);
1827 gtk_label_set_text(GTK_LABEL(mainwin
->ac_label
), ac_name
);
1828 gtk_widget_queue_resize(mainwin
->ac_button
);
1833 GtkWidget
*main_window_get_folder_window(MainWindow
*mainwin
)
1835 switch (mainwin
->type
) {
1836 case SEPARATE_FOLDER
:
1837 return mainwin
->win
.sep_folder
.folderwin
;
1839 return mainwin
->win
.sep_both
.folderwin
;
1845 GtkWidget
*main_window_get_message_window(MainWindow
*mainwin
)
1847 switch (mainwin
->type
) {
1848 case SEPARATE_MESSAGE
:
1849 return mainwin
->win
.sep_message
.messagewin
;
1851 return mainwin
->win
.sep_both
.messagewin
;
1857 void main_window_separation_change(MainWindow
*mainwin
, SeparateType type
)
1859 GtkWidget
*folder_wid
= GTK_WIDGET_PTR(mainwin
->folderview
);
1860 GtkWidget
*summary_wid
= GTK_WIDGET_PTR(mainwin
->summaryview
);
1861 /* GtkWidget *message_wid = GTK_WIDGET_PTR(mainwin->messageview); */
1862 GtkWidget
*message_wid
= mainwin
->messageview
->vbox
;
1864 debug_print("Changing window separation type from %d to %d\n",
1865 mainwin
->type
, type
);
1867 if (mainwin
->type
== type
) return;
1869 /* remove widgets from those containers */
1870 gtk_widget_ref(folder_wid
);
1871 gtk_widget_ref(summary_wid
);
1872 gtk_widget_ref(message_wid
);
1873 gtkut_container_remove
1874 (GTK_CONTAINER(folder_wid
->parent
), folder_wid
);
1875 gtkut_container_remove
1876 (GTK_CONTAINER(summary_wid
->parent
), summary_wid
);
1877 gtkut_container_remove
1878 (GTK_CONTAINER(message_wid
->parent
), message_wid
);
1880 /* clean containers */
1881 switch (mainwin
->type
) {
1883 gtk_widget_destroy(mainwin
->win
.sep_none
.hpaned
);
1885 case SEPARATE_FOLDER
:
1886 gtk_widget_destroy(mainwin
->win
.sep_folder
.vpaned
);
1887 gtk_widget_destroy(mainwin
->win
.sep_folder
.folderwin
);
1889 case SEPARATE_MESSAGE
:
1890 gtk_widget_destroy(mainwin
->win
.sep_message
.hpaned
);
1891 gtk_widget_destroy(mainwin
->win
.sep_message
.messagewin
);
1894 gtk_widget_destroy(mainwin
->win
.sep_both
.messagewin
);
1895 gtk_widget_destroy(mainwin
->win
.sep_both
.folderwin
);
1899 gtk_widget_hide(mainwin
->window
);
1900 main_window_set_widgets(mainwin
, type
);
1901 gtk_widget_show(mainwin
->window
);
1903 gtk_widget_unref(folder_wid
);
1904 gtk_widget_unref(summary_wid
);
1905 gtk_widget_unref(message_wid
);
1908 void main_window_toggle_message_view(MainWindow
*mainwin
)
1910 SummaryView
*summaryview
= mainwin
->summaryview
;
1911 union CompositeWin
*cwin
= &mainwin
->win
;
1912 GtkWidget
*vpaned
= NULL
;
1913 GtkWidget
*container
= NULL
;
1914 GtkWidget
*msgwin
= NULL
;
1916 switch (mainwin
->type
) {
1918 vpaned
= cwin
->sep_none
.vpaned
;
1919 container
= cwin
->sep_none
.hpaned
;
1921 case SEPARATE_FOLDER
:
1922 vpaned
= cwin
->sep_folder
.vpaned
;
1923 container
= mainwin
->vbox_body
;
1925 case SEPARATE_MESSAGE
:
1926 msgwin
= mainwin
->win
.sep_message
.messagewin
;
1929 msgwin
= mainwin
->win
.sep_both
.messagewin
;
1934 if (GTK_WIDGET_VISIBLE(msgwin
)) {
1935 gtk_widget_hide(msgwin
);
1936 mainwin
->messageview
->visible
= FALSE
;
1937 summaryview
->displayed
= NULL
;
1939 gtk_widget_show(msgwin
);
1940 mainwin
->messageview
->visible
= TRUE
;
1942 } else if (vpaned
->parent
!= NULL
) {
1943 mainwin
->messageview
->visible
= FALSE
;
1944 summaryview
->displayed
= NULL
;
1945 gtk_widget_ref(vpaned
);
1946 gtkut_container_remove(GTK_CONTAINER(container
), vpaned
);
1947 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview
), container
);
1949 mainwin
->messageview
->visible
= TRUE
;
1950 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview
), vpaned
);
1951 gtk_container_add(GTK_CONTAINER(container
), vpaned
);
1952 gtk_widget_unref(vpaned
);
1955 if (messageview_is_visible(mainwin
->messageview
))
1956 gtk_arrow_set(GTK_ARROW(mainwin
->summaryview
->toggle_arrow
),
1957 GTK_ARROW_DOWN
, GTK_SHADOW_OUT
);
1959 gtk_arrow_set(GTK_ARROW(mainwin
->summaryview
->toggle_arrow
),
1960 GTK_ARROW_UP
, GTK_SHADOW_OUT
);
1962 if (mainwin
->messageview
->visible
== FALSE
)
1963 messageview_clear(mainwin
->messageview
);
1965 main_window_set_menu_sensitive(mainwin
);
1967 prefs_common
.msgview_visible
= mainwin
->messageview
->visible
;
1969 summary_grab_focus(summaryview
);
1972 void main_window_get_size(MainWindow
*mainwin
)
1974 GtkAllocation
*allocation
;
1976 if (mainwin_list
== NULL
|| mainwin
->messageview
== NULL
) {
1977 debug_print("called after messageview "
1978 "has been deallocated!\n");
1982 allocation
= &(GTK_WIDGET_PTR(mainwin
->summaryview
)->allocation
);
1984 if (allocation
->width
> 1 && allocation
->height
> 1) {
1985 prefs_common
.summaryview_width
= allocation
->width
;
1987 if ((mainwin
->type
== SEPARATE_NONE
||
1988 mainwin
->type
== SEPARATE_FOLDER
) &&
1989 messageview_is_visible(mainwin
->messageview
))
1990 prefs_common
.summaryview_height
= allocation
->height
;
1992 prefs_common
.mainview_width
= allocation
->width
;
1995 allocation
= &mainwin
->window
->allocation
;
1996 if (allocation
->width
> 1 && allocation
->height
> 1) {
1997 prefs_common
.mainview_height
= allocation
->height
;
1998 prefs_common
.mainwin_width
= allocation
->width
;
1999 prefs_common
.mainwin_height
= allocation
->height
;
2002 allocation
= &(GTK_WIDGET_PTR(mainwin
->folderview
)->allocation
);
2003 if (allocation
->width
> 1 && allocation
->height
> 1) {
2004 prefs_common
.folderview_width
= allocation
->width
;
2005 prefs_common
.folderview_height
= allocation
->height
;
2008 allocation
= &(GTK_WIDGET_PTR(mainwin
->messageview
)->allocation
);
2009 if (allocation
->width
> 1 && allocation
->height
> 1) {
2010 prefs_common
.msgview_width
= allocation
->width
;
2011 prefs_common
.msgview_height
= allocation
->height
;
2014 /* debug_print("summaryview size: %d x %d\n",
2015 prefs_common.summaryview_width,
2016 prefs_common.summaryview_height);
2017 debug_print("folderview size: %d x %d\n",
2018 prefs_common.folderview_width,
2019 prefs_common.folderview_height);
2020 debug_print("messageview size: %d x %d\n",
2021 prefs_common.msgview_width,
2022 prefs_common.msgview_height); */
2025 void main_window_get_position(MainWindow
*mainwin
)
2030 gtkut_widget_get_uposition(mainwin
->window
, &x
, &y
);
2032 prefs_common
.mainview_x
= x
;
2033 prefs_common
.mainview_y
= y
;
2034 prefs_common
.mainwin_x
= x
;
2035 prefs_common
.mainwin_y
= y
;
2037 debug_print("main window position: %d, %d\n", x
, y
);
2039 window
= main_window_get_folder_window(mainwin
);
2041 gtkut_widget_get_uposition(window
, &x
, &y
);
2042 prefs_common
.folderwin_x
= x
;
2043 prefs_common
.folderwin_y
= y
;
2044 debug_print("folder window position: %d, %d\n", x
, y
);
2046 window
= main_window_get_message_window(mainwin
);
2048 gtkut_widget_get_uposition(window
, &x
, &y
);
2049 prefs_common
.main_msgwin_x
= x
;
2050 prefs_common
.main_msgwin_y
= y
;
2051 debug_print("message window position: %d, %d\n", x
, y
);
2055 void main_window_progress_on(MainWindow
*mainwin
)
2057 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin
->progressbar
), "");
2060 void main_window_progress_off(MainWindow
*mainwin
)
2062 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin
->progressbar
), 0.0);
2063 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin
->progressbar
), "");
2066 void main_window_progress_set(MainWindow
*mainwin
, gint cur
, gint total
)
2070 g_snprintf(buf
, sizeof(buf
), "%d / %d", cur
, total
);
2071 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin
->progressbar
), buf
);
2072 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin
->progressbar
),
2073 (total
== 0) ? 0 : (gfloat
)cur
/ (gfloat
)total
);
2076 void main_window_empty_trash(MainWindow
*mainwin
, gboolean confirm
)
2079 if (alertpanel(_("Empty trash"),
2080 _("Delete all messages in trash folders?"),
2081 GTK_STOCK_CANCEL
, _("+_Empty trash"), NULL
)
2082 != G_ALERTALTERNATE
)
2084 manage_window_focus_in(mainwin
->window
, NULL
, NULL
);
2087 procmsg_empty_all_trash();
2089 if (mainwin
->summaryview
->folder_item
&&
2090 mainwin
->summaryview
->folder_item
->stype
== F_TRASH
)
2091 gtk_widget_grab_focus(mainwin
->folderview
->ctree
);
2094 void main_window_add_mailbox(MainWindow
*mainwin
)
2099 path
= input_dialog(_("Add mailbox"),
2100 _("Input the location of mailbox.\n"
2101 "If the existing mailbox is specified, it will be\n"
2102 "scanned automatically."),
2105 if (folder_find_from_path(path
)) {
2106 alertpanel_error(_("The mailbox '%s' already exists."), path
);
2110 folder
= folder_new(folder_get_class_from_string("mh"),
2111 !strcmp(path
, "Mail") ? _("Mailbox") :
2112 g_path_get_basename(path
), path
);
2115 if (folder
->klass
->create_tree(folder
) < 0) {
2116 alertpanel_error(_("Creation of the mailbox failed.\n"
2117 "Maybe some files already exist, or you don't have the permission to write there."));
2118 folder_destroy(folder
);
2123 folder_set_ui_func(folder
, scan_tree_func
, mainwin
);
2124 folder_scan_tree(folder
, TRUE
);
2125 folder_set_ui_func(folder
, NULL
, NULL
);
2128 SensitiveCond
main_window_get_current_state(MainWindow
*mainwin
)
2130 SensitiveCond state
= 0;
2131 SummarySelection selection
;
2132 FolderItem
*item
= mainwin
->summaryview
->folder_item
;
2133 GList
*account_list
= account_get_list();
2135 selection
= summary_get_selection_type(mainwin
->summaryview
);
2137 if (mainwin
->lock_count
== 0)
2138 state
|= M_UNLOCKED
;
2139 if (selection
!= SUMMARY_NONE
)
2140 state
|= M_MSG_EXIST
;
2141 if (item
&& item
->path
&& folder_item_parent(item
) && !item
->no_select
) {
2143 /* if (item->folder->type != F_NEWS) */
2144 state
|= M_ALLOW_DELETE
;
2146 if (prefs_common
.immediate_exec
== 0
2147 && mainwin
->lock_count
== 0)
2148 state
|= M_DELAY_EXEC
;
2150 if ((selection
== SUMMARY_NONE
&& item
->hide_read_msgs
)
2151 || selection
!= SUMMARY_NONE
)
2152 state
|= M_HIDE_READ_MSG
;
2154 if (mainwin
->summaryview
->threaded
)
2155 state
|= M_THREADED
;
2157 state
|= M_UNTHREADED
;
2158 if (selection
== SUMMARY_SELECTED_SINGLE
||
2159 selection
== SUMMARY_SELECTED_MULTIPLE
)
2160 state
|= M_TARGET_EXIST
;
2161 if (selection
== SUMMARY_SELECTED_SINGLE
)
2162 state
|= M_SINGLE_TARGET_EXIST
;
2163 if (mainwin
->summaryview
->folder_item
&&
2164 mainwin
->summaryview
->folder_item
->folder
->klass
->type
== F_NEWS
)
2167 state
|= M_NOT_NEWS
;
2168 if (prefs_common
.actions_list
&& g_slist_length(prefs_common
.actions_list
))
2169 state
|= M_ACTIONS_EXIST
;
2171 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
2172 state
|= M_HAVE_QUEUED_MAILS
;
2174 if (selection
== SUMMARY_SELECTED_SINGLE
&&
2176 (folder_has_parent_of_type(item
, F_DRAFT
) ||
2177 folder_has_parent_of_type(item
, F_OUTBOX
) ||
2178 folder_has_parent_of_type(item
, F_QUEUE
))))
2179 state
|= M_ALLOW_REEDIT
;
2181 state
|= M_HAVE_ACCOUNT
;
2183 for ( ; account_list
!= NULL
; account_list
= account_list
->next
) {
2184 if (((PrefsAccount
*)account_list
->data
)->protocol
== A_NNTP
) {
2185 state
|= M_HAVE_NEWS_ACCOUNT
;
2190 if (procmsg_spam_can_learn()) {
2191 state
|= M_CAN_LEARN_SPAM
;
2194 if (inc_is_active())
2195 state
|= M_INC_ACTIVE
;
2197 if (mainwin
->summaryview
->deleted
> 0 ||
2198 mainwin
->summaryview
->moved
> 0 ||
2199 mainwin
->summaryview
->copied
> 0)
2200 state
|= M_DELAY_EXEC
;
2207 void main_window_set_menu_sensitive(MainWindow
*mainwin
)
2209 GtkItemFactory
*ifactory
= mainwin
->menu_factory
;
2210 SensitiveCond state
;
2213 GtkWidget
*menuitem
;
2214 SummaryView
*summaryview
;
2219 static const struct {
2223 {"/File/Save as...", M_TARGET_EXIST
},
2224 {"/File/Print..." , M_TARGET_EXIST
},
2225 {"/File/Exit" , M_UNLOCKED
},
2227 {"/Edit/Select thread" , M_SINGLE_TARGET_EXIST
},
2228 {"/Edit/Find in current message...", M_SINGLE_TARGET_EXIST
},
2230 {"/View/Sort" , M_EXEC
},
2231 {"/View/Thread view" , M_EXEC
},
2232 {"/View/Expand all threads" , M_MSG_EXIST
},
2233 {"/View/Collapse all threads" , M_MSG_EXIST
},
2234 {"/View/Hide read messages" , M_HIDE_READ_MSG
},
2235 {"/View/Go to/Previous message" , M_MSG_EXIST
},
2236 {"/View/Go to/Next message" , M_MSG_EXIST
},
2237 {"/View/Go to/Previous unread message" , M_MSG_EXIST
},
2238 {"/View/Go to/Previous new message" , M_MSG_EXIST
},
2239 {"/View/Go to/Previous marked message" , M_MSG_EXIST
},
2240 {"/View/Go to/Previous labeled message", M_MSG_EXIST
},
2241 {"/View/Go to/Next labeled message", M_MSG_EXIST
},
2242 {"/View/Go to/Last read message" , M_SINGLE_TARGET_EXIST
},
2243 {"/View/Go to/Parent message" , M_SINGLE_TARGET_EXIST
},
2244 {"/View/Open in new window" , M_SINGLE_TARGET_EXIST
},
2245 {"/View/Message source" , M_SINGLE_TARGET_EXIST
},
2246 {"/View/All headers" , M_SINGLE_TARGET_EXIST
},
2247 {"/View/Quotes" , M_SINGLE_TARGET_EXIST
},
2249 {"/Message/Receive/Get from current account"
2250 , M_HAVE_ACCOUNT
|M_UNLOCKED
},
2251 {"/Message/Receive/Get from all accounts"
2252 , M_HAVE_ACCOUNT
|M_UNLOCKED
},
2253 {"/Message/Receive/Cancel receiving"
2255 {"/Message/Send queued messages" , M_HAVE_ACCOUNT
|M_HAVE_QUEUED_MAILS
},
2256 {"/Message/Compose a news message", M_HAVE_NEWS_ACCOUNT
},
2257 {"/Message/Reply" , M_HAVE_ACCOUNT
|M_TARGET_EXIST
},
2258 {"/Message/Reply to" , M_HAVE_ACCOUNT
|M_TARGET_EXIST
},
2259 {"/Message/Follow-up and reply to", M_HAVE_ACCOUNT
|M_TARGET_EXIST
|M_NEWS
},
2260 {"/Message/Forward" , M_HAVE_ACCOUNT
|M_TARGET_EXIST
},
2261 {"/Message/Forward as attachment" , M_HAVE_ACCOUNT
|M_TARGET_EXIST
},
2262 {"/Message/Redirect" , M_HAVE_ACCOUNT
|M_TARGET_EXIST
},
2263 {"/Message/Move..." , M_TARGET_EXIST
|M_ALLOW_DELETE
},
2264 {"/Message/Copy..." , M_TARGET_EXIST
|M_EXEC
},
2265 {"/Message/Move to trash" , M_TARGET_EXIST
|M_ALLOW_DELETE
|M_NOT_NEWS
},
2266 {"/Message/Delete..." , M_TARGET_EXIST
|M_ALLOW_DELETE
},
2267 {"/Message/Cancel a news message" , M_TARGET_EXIST
|M_ALLOW_DELETE
|M_NEWS
},
2268 {"/Message/Mark" , M_TARGET_EXIST
},
2269 {"/Message/Mark/Mark as spam" , M_TARGET_EXIST
|M_CAN_LEARN_SPAM
},
2270 {"/Message/Mark/Mark as ham" , M_TARGET_EXIST
|M_CAN_LEARN_SPAM
},
2271 {"/Message/Mark/Ignore thread" , M_TARGET_EXIST
},
2272 {"/Message/Mark/Unignore thread" , M_TARGET_EXIST
},
2273 {"/Message/Mark/Lock" , M_TARGET_EXIST
},
2274 {"/Message/Mark/Unlock" , M_TARGET_EXIST
},
2275 {"/Message/Color label" , M_TARGET_EXIST
},
2276 {"/Message/Re-edit" , M_HAVE_ACCOUNT
|M_ALLOW_REEDIT
},
2278 {"/Tools/Add sender to address book" , M_SINGLE_TARGET_EXIST
},
2279 {"/Tools/Harvest addresses" , M_MSG_EXIST
},
2280 {"/Tools/Harvest addresses/from Messages..."
2282 {"/Tools/Filter all messages in folder", M_MSG_EXIST
|M_EXEC
},
2283 {"/Tools/Filter selected messages" , M_TARGET_EXIST
|M_EXEC
},
2284 {"/Tools/Create filter rule" , M_SINGLE_TARGET_EXIST
|M_UNLOCKED
},
2285 {"/Tools/Create processing rule" , M_SINGLE_TARGET_EXIST
|M_UNLOCKED
},
2286 {"/Tools/Actions" , M_TARGET_EXIST
|M_ACTIONS_EXIST
},
2287 {"/Tools/Execute" , M_DELAY_EXEC
},
2288 {"/Tools/Delete duplicated messages/In selected folder" , M_MSG_EXIST
|M_ALLOW_DELETE
},
2290 {"/Configuration", M_UNLOCKED
},
2295 state
= main_window_get_current_state(mainwin
);
2297 for (i
= 0; entry
[i
].entry
!= NULL
; i
++) {
2298 sensitive
= ((entry
[i
].cond
& state
) == entry
[i
].cond
);
2299 menu_set_sensitive(ifactory
, entry
[i
].entry
, sensitive
);
2302 menu
= gtk_item_factory_get_widget(ifactory
, "/Message/Receive");
2304 /* search for separator */
2305 for (cur_item
= GTK_MENU_SHELL(menu
)->children
; cur_item
!= NULL
;
2306 cur_item
= cur_item
->next
) {
2307 if (GTK_BIN(cur_item
->data
)->child
== NULL
) {
2308 cur_item
= cur_item
->next
;
2313 for (; cur_item
!= NULL
; cur_item
= cur_item
->next
) {
2314 gtk_widget_set_sensitive(GTK_WIDGET(cur_item
->data
),
2315 (M_UNLOCKED
& state
) != 0);
2318 main_window_menu_callback_block(mainwin
);
2320 #define SET_CHECK_MENU_ACTIVE(path, active) \
2322 menuitem = gtk_item_factory_get_widget(ifactory, path); \
2323 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), active); \
2326 SET_CHECK_MENU_ACTIVE("/View/Show or hide/Message view",
2327 messageview_is_visible(mainwin
->messageview
));
2329 summaryview
= mainwin
->summaryview
;
2330 menu_path
= "/View/Sort/Don't sort";
2332 switch (summaryview
->sort_key
) {
2333 case SORT_BY_NUMBER
:
2334 menu_path
= "/View/Sort/by number"; break;
2336 menu_path
= "/View/Sort/by Size"; break;
2338 menu_path
= "/View/Sort/by Date"; break;
2340 menu_path
= "/View/Sort/by From"; break;
2342 menu_path
= "/View/Sort/by To"; break;
2343 case SORT_BY_SUBJECT
:
2344 menu_path
= "/View/Sort/by Subject"; break;
2346 menu_path
= "/View/Sort/by color label"; break;
2348 menu_path
= "/View/Sort/by mark"; break;
2349 case SORT_BY_STATUS
:
2350 menu_path
= "/View/Sort/by status"; break;
2352 menu_path
= "/View/Sort/by attachment"; break;
2354 menu_path
= "/View/Sort/by score"; break;
2355 case SORT_BY_LOCKED
:
2356 menu_path
= "/View/Sort/by locked"; break;
2359 menu_path
= "/View/Sort/Don't sort"; break;
2361 SET_CHECK_MENU_ACTIVE(menu_path
, TRUE
);
2363 if (summaryview
->sort_type
== SORT_ASCENDING
) {
2364 SET_CHECK_MENU_ACTIVE("/View/Sort/Ascending", TRUE
);
2366 SET_CHECK_MENU_ACTIVE("/View/Sort/Descending", TRUE
);
2369 if (summaryview
->sort_key
!= SORT_BY_NONE
) {
2370 menu_set_sensitive(ifactory
, "/View/Sort/Ascending", TRUE
);
2371 menu_set_sensitive(ifactory
, "/View/Sort/Descending", TRUE
);
2373 menu_set_sensitive(ifactory
, "/View/Sort/Ascending", FALSE
);
2374 menu_set_sensitive(ifactory
, "/View/Sort/Descending", FALSE
);
2377 if (mainwin
->messageview
2378 && mainwin
->messageview
->mimeview
2379 && mainwin
->messageview
->mimeview
->textview
)
2380 SET_CHECK_MENU_ACTIVE("/View/All headers",
2381 mainwin
->messageview
->mimeview
->textview
->show_all_headers
);
2382 SET_CHECK_MENU_ACTIVE("/View/Thread view", (state
& M_THREADED
) != 0);
2383 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold all", FALSE
);
2384 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold from level 2", FALSE
);
2385 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold from level 3", FALSE
);
2386 if (prefs_common
.hide_quotes
== 1)
2387 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold all", TRUE
);
2388 if (prefs_common
.hide_quotes
== 2)
2389 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold from level 2", TRUE
);
2390 if (prefs_common
.hide_quotes
== 3)
2391 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold from level 3", TRUE
);
2393 #undef SET_CHECK_MENU_ACTIVE
2395 main_window_menu_callback_unblock(mainwin
);
2398 void main_create_mailing_list_menu (MainWindow
*mainwin
, MsgInfo
*msginfo
)
2400 GtkItemFactory
*ifactory
;
2402 ifactory
= gtk_item_factory_from_widget(mainwin
->menubar
);
2405 is_menu
= mailing_list_create_submenu (ifactory
, msginfo
);
2407 gtk_widget_set_sensitive (gtk_item_factory_get_item
2408 (ifactory
,"/Message/Mailing-List"), TRUE
);
2410 gtk_widget_set_sensitive (gtk_item_factory_get_item
2411 (ifactory
,"/Message/Mailing-List"), FALSE
);
2414 static gint
mailing_list_create_submenu (GtkItemFactory
*ifactory
, MsgInfo
*msginfo
)
2417 GtkWidget
*menuitem
;
2419 if (!msginfo
|| !msginfo
->extradata
) {
2420 menu_set_sensitive(ifactory
, "/Message/Mailing-List/Post", FALSE
);
2421 menu_set_sensitive(ifactory
, "/Message/Mailing-List/Help", FALSE
);
2422 menu_set_sensitive(ifactory
, "/Message/Mailing-List/Subscribe", FALSE
);
2423 menu_set_sensitive(ifactory
, "/Message/Mailing-List/Unsubscribe", FALSE
);
2424 menu_set_sensitive(ifactory
, "/Message/Mailing-List/View archive", FALSE
);
2425 menu_set_sensitive(ifactory
, "/Message/Mailing-List/Contact owner", FALSE
);
2429 /* Mailing list post */
2430 if (!strcmp2 (msginfo
->extradata
->list_post
, "NO")) {
2431 g_free(msginfo
->extradata
->list_post
);
2432 msginfo
->extradata
->list_post
= g_strdup (_("No posting allowed"));
2434 menuitem
= gtk_item_factory_get_item (ifactory
, "/Message/Mailing-List/Post");
2436 menu_nb
+= mailing_list_populate_submenu (menuitem
, msginfo
->extradata
->list_post
);
2438 /* Mailing list help */
2439 menuitem
= gtk_item_factory_get_item (ifactory
, "/Message/Mailing-List/Help");
2441 menu_nb
+= mailing_list_populate_submenu (menuitem
, msginfo
->extradata
->list_help
);
2443 /* Mailing list subscribe */
2444 menuitem
= gtk_item_factory_get_item (ifactory
, "/Message/Mailing-List/Subscribe");
2446 menu_nb
+= mailing_list_populate_submenu (menuitem
, msginfo
->extradata
->list_subscribe
);
2448 /* Mailing list unsubscribe */
2449 menuitem
= gtk_item_factory_get_item (ifactory
, "/Message/Mailing-List/Unsubscribe");
2451 menu_nb
+= mailing_list_populate_submenu (menuitem
, msginfo
->extradata
->list_unsubscribe
);
2453 /* Mailing list view archive */
2454 menuitem
= gtk_item_factory_get_item (ifactory
, "/Message/Mailing-List/View archive");
2456 menu_nb
+= mailing_list_populate_submenu (menuitem
, msginfo
->extradata
->list_archive
);
2458 /* Mailing list contact owner */
2459 menuitem
= gtk_item_factory_get_item (ifactory
, "/Message/Mailing-List/Contact owner");
2461 menu_nb
+= mailing_list_populate_submenu (menuitem
, msginfo
->extradata
->list_owner
);
2466 static gint
mailing_list_populate_submenu (GtkWidget
*menuitem
, const gchar
* list_header
)
2468 GtkWidget
*item
, *menu
;
2469 const gchar
*url_pt
;
2470 gchar url_decoded
[BUFFSIZE
];
2471 GList
*amenu
, *alist
;
2474 menu
= GTK_WIDGET(GTK_MENU_ITEM(menuitem
)->submenu
);
2476 /* First delete old submenu */
2477 /* FIXME: we can optimize this, and only change/add/delete necessary items */
2478 for (amenu
= (GTK_MENU_SHELL(menu
)->children
) ; amenu
; ) {
2479 alist
= amenu
->next
;
2480 item
= GTK_WIDGET (amenu
->data
);
2481 gtk_widget_destroy (item
);
2485 for (url_pt
= list_header
; url_pt
&& *url_pt
;) {
2486 get_url_part (&url_pt
, url_decoded
, BUFFSIZE
);
2488 if (!g_strncasecmp(url_decoded
, "mailto:", 7)) {
2489 item
= gtk_menu_item_new_with_label ((url_decoded
));
2490 g_signal_connect(G_OBJECT(item
), "activate",
2491 G_CALLBACK(mailing_list_compose
),
2494 else if (!g_strncasecmp (url_decoded
, "http:", 5) ||
2495 !g_strncasecmp (url_decoded
, "https:",6)) {
2497 item
= gtk_menu_item_new_with_label ((url_decoded
));
2498 g_signal_connect(G_OBJECT(item
), "activate",
2499 G_CALLBACK(mailing_list_open_uri
),
2503 gtk_menu_append (GTK_MENU(menu
), item
);
2504 gtk_widget_show (item
);
2510 gtk_widget_set_sensitive (menuitem
, TRUE
);
2512 gtk_widget_set_sensitive (menuitem
, FALSE
);
2518 static void get_url_part (const gchar
**buffer
, gchar
*url_decoded
, gint maxlen
)
2520 gchar tmp
[BUFFSIZE
];
2526 *url_decoded
= '\0';
2530 /* Ignore spaces, comments and tabs () */
2531 for (;*buf
== ' ' || *buf
== '(' || *buf
== '\t'; buf
++)
2533 for (;*buf
!= ')' && *buf
!= 0x00; buf
++);
2535 /* First non space and non comment must be a < */
2538 for (i
= 0; *buf
!= '>' && *buf
!= 0x00 && i
<maxlen
; tmp
[i
++] = *(buf
++));
2543 *url_decoded
= '\0';
2548 *url_decoded
= '\0';
2554 decode_uri (url_decoded
, (const gchar
*)tmp
);
2556 /* Prepare the work for the next url in the list */
2557 /* after the closing bracket >, ignore space, comments and tabs */
2558 for (;buf
&& *buf
&& (*buf
== ' ' || *buf
== '(' || *buf
== '\t'); buf
++)
2560 for (;*buf
!= ')' && *buf
!= 0x00; buf
++);
2562 if (!buf
|| !*buf
) {
2567 /* now first non space, non comment must be a comma */
2569 for (;*buf
!= 0x00; buf
++);
2575 static void mailing_list_compose (GtkWidget
*w
, gpointer
*data
)
2579 gtk_label_get (GTK_LABEL (GTK_BIN (w
)->child
), (gchar
**) &mailto
);
2580 compose_new(NULL
, mailto
+7, NULL
);
2583 static void mailing_list_open_uri (GtkWidget
*w
, gpointer
*data
)
2588 gtk_label_get (GTK_LABEL (GTK_BIN (w
)->child
), (gchar
**) &mailto
);
2589 open_uri (mailto
, prefs_common
.uri_cmd
);
2592 void main_window_popup(MainWindow
*mainwin
)
2594 if (!GTK_WIDGET_VISIBLE(GTK_WIDGET(mainwin
->window
)))
2595 main_window_show(mainwin
);
2597 gtkut_window_popup(mainwin
->window
);
2599 switch (mainwin
->type
) {
2600 case SEPARATE_FOLDER
:
2601 gtkut_window_popup(mainwin
->win
.sep_folder
.folderwin
);
2603 case SEPARATE_MESSAGE
:
2604 gtkut_window_popup(mainwin
->win
.sep_message
.messagewin
);
2607 gtkut_window_popup(mainwin
->win
.sep_both
.folderwin
);
2608 gtkut_window_popup(mainwin
->win
.sep_both
.messagewin
);
2615 void main_window_show(MainWindow
*mainwin
)
2617 gtk_widget_show(mainwin
->window
);
2618 gtk_widget_show(mainwin
->vbox_body
);
2620 gtk_widget_set_uposition(mainwin
->window
,
2621 prefs_common
.mainwin_x
,
2622 prefs_common
.mainwin_y
);
2624 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin
->folderview
),
2625 prefs_common
.folderview_width
,
2626 prefs_common
.folderview_height
);
2627 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin
->summaryview
),
2628 prefs_common
.summaryview_width
,
2629 prefs_common
.summaryview_height
);
2630 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin
->messageview
),
2631 prefs_common
.msgview_width
,
2632 prefs_common
.msgview_height
);
2634 if (mainwin
->type
& SEPARATE_FOLDER
) {
2635 GtkWidget
*folderwin
;
2637 folderwin
= main_window_get_folder_window(mainwin
);
2638 gtk_widget_show(folderwin
);
2639 gtk_widget_set_uposition(folderwin
, prefs_common
.folderwin_x
,
2640 prefs_common
.folderwin_y
);
2643 if (mainwin
->type
& SEPARATE_MESSAGE
) {
2644 GtkWidget
*messagewin
;
2646 messagewin
= main_window_get_message_window(mainwin
);
2647 gtk_widget_show(messagewin
);
2648 gtk_widget_set_uposition(messagewin
, prefs_common
.main_msgwin_x
,
2649 prefs_common
.main_msgwin_y
);
2653 void main_window_hide(MainWindow
*mainwin
)
2655 main_window_get_size(mainwin
);
2656 main_window_get_position(mainwin
);
2658 gtk_widget_hide(mainwin
->window
);
2659 gtk_widget_hide(mainwin
->vbox_body
);
2661 if (mainwin
->type
& SEPARATE_FOLDER
) {
2662 gtk_widget_hide(mainwin
->win
.sep_folder
.folderwin
);
2665 if (mainwin
->type
& SEPARATE_MESSAGE
) {
2666 gtk_widget_hide(mainwin
->win
.sep_message
.messagewin
);
2670 static void main_window_set_widgets(MainWindow
*mainwin
, SeparateType type
)
2672 GtkWidget
*folderwin
= NULL
;
2673 GtkWidget
*messagewin
= NULL
;
2676 GtkWidget
*vbox_body
= mainwin
->vbox_body
;
2677 GtkItemFactory
*ifactory
= mainwin
->menu_factory
;
2678 GtkWidget
*menuitem
;
2679 GtkItemFactory
*msgview_ifactory
;
2681 debug_print("Setting widgets... ");
2683 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin
->folderview
),
2684 prefs_common
.folderview_width
,
2685 prefs_common
.folderview_height
);
2686 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin
->summaryview
),
2687 prefs_common
.summaryview_width
,
2688 prefs_common
.summaryview_height
);
2689 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin
->messageview
),
2690 prefs_common
.msgview_width
,
2691 prefs_common
.msgview_height
);
2693 /* create separated window(s) if needed */
2694 if (type
& SEPARATE_FOLDER
) {
2695 static GdkGeometry folderwin_geometry
;
2697 folderwin
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
2698 gtk_window_set_title(GTK_WINDOW(folderwin
),
2699 _("Claws Mail - Folder View"));
2701 gtk_window_move(GTK_WINDOW(folderwin
),
2702 prefs_common
.folderwin_x
,
2703 prefs_common
.folderwin_y
);
2705 if (!folderwin_geometry
.min_height
) {
2706 folderwin_geometry
.min_width
= 320;
2707 folderwin_geometry
.min_height
= 200;
2709 gtk_window_set_geometry_hints(GTK_WINDOW(folderwin
), NULL
,
2710 &folderwin_geometry
, GDK_HINT_MIN_SIZE
);
2712 gtk_widget_set_size_request(folderwin
,
2713 prefs_common
.folderview_width
,
2714 prefs_common
.folderview_height
);
2716 gtk_container_set_border_width(GTK_CONTAINER(folderwin
),
2719 g_signal_connect(G_OBJECT(folderwin
), "delete_event",
2720 G_CALLBACK(folder_window_close_cb
),
2722 gtk_container_add(GTK_CONTAINER(folderwin
),
2723 GTK_WIDGET_PTR(mainwin
->folderview
));
2724 gtk_widget_realize(folderwin
);
2726 if (prefs_common
.folderview_visible
)
2727 gtk_widget_show(folderwin
);
2730 if (type
& SEPARATE_MESSAGE
) {
2731 static GdkGeometry msgwin_geometry
;
2733 messagewin
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
2734 gtk_window_set_title(GTK_WINDOW(messagewin
),
2735 _("Claws Mail - Message View"));
2737 gtk_window_move(GTK_WINDOW(messagewin
),
2738 prefs_common
.main_msgwin_x
,
2739 prefs_common
.main_msgwin_y
);
2741 if (!msgwin_geometry
.min_height
) {
2742 msgwin_geometry
.min_width
= 320;
2743 msgwin_geometry
.min_height
= 200;
2745 gtk_window_set_geometry_hints(GTK_WINDOW(messagewin
), NULL
,
2746 &msgwin_geometry
, GDK_HINT_MIN_SIZE
);
2748 gtk_widget_set_size_request(messagewin
,
2749 prefs_common
.msgwin_width
,
2750 prefs_common
.msgwin_height
);
2752 gtk_container_set_border_width(GTK_CONTAINER(messagewin
),
2754 g_signal_connect(G_OBJECT(messagewin
), "delete_event",
2755 G_CALLBACK(message_window_close_cb
),
2757 if (messageview_is_visible(mainwin
->messageview
))
2758 gtk_widget_show(messagewin
);
2760 mainwin
->messageview
->statusbar
= mainwin
->statusbar
;
2761 mainwin
->messageview
->statusbar_cid
= mainwin
->messageview_cid
;
2766 hpaned
= gtk_hpaned_new();
2767 gtk_box_pack_start(GTK_BOX(vbox_body
), hpaned
, TRUE
, TRUE
, 0);
2768 gtk_paned_add1(GTK_PANED(hpaned
),
2769 GTK_WIDGET_PTR(mainwin
->folderview
));
2770 gtk_widget_show(hpaned
);
2771 gtk_widget_queue_resize(hpaned
);
2773 vpaned
= gtk_vpaned_new();
2774 if (messageview_is_visible(mainwin
->messageview
)) {
2775 gtk_paned_add2(GTK_PANED(hpaned
), vpaned
);
2776 gtk_paned_add1(GTK_PANED(vpaned
),
2777 GTK_WIDGET_PTR(mainwin
->summaryview
));
2779 gtk_paned_add2(GTK_PANED(hpaned
),
2780 GTK_WIDGET_PTR(mainwin
->summaryview
));
2781 gtk_widget_ref(vpaned
);
2783 gtk_paned_add2(GTK_PANED(vpaned
),
2784 GTK_WIDGET_PTR(mainwin
->messageview
));
2785 gtk_widget_show(vpaned
);
2786 gtk_widget_queue_resize(vpaned
);
2788 mainwin
->win
.sep_none
.hpaned
= hpaned
;
2789 mainwin
->win
.sep_none
.vpaned
= vpaned
;
2791 /* remove headerview if not in prefs */
2792 headerview_set_visibility(mainwin
->messageview
->headerview
,
2793 prefs_common
.display_header_pane
);
2795 case SEPARATE_FOLDER
:
2796 vpaned
= gtk_vpaned_new();
2797 if (messageview_is_visible(mainwin
->messageview
)) {
2798 gtk_box_pack_start(GTK_BOX(vbox_body
), vpaned
,
2800 gtk_paned_add1(GTK_PANED(vpaned
),
2801 GTK_WIDGET_PTR(mainwin
->summaryview
));
2803 gtk_box_pack_start(GTK_BOX(vbox_body
),
2804 GTK_WIDGET_PTR(mainwin
->summaryview
),
2806 gtk_widget_ref(vpaned
);
2808 gtk_paned_add2(GTK_PANED(vpaned
),
2809 GTK_WIDGET_PTR(mainwin
->messageview
));
2810 gtk_widget_show(vpaned
);
2811 gtk_widget_queue_resize(vpaned
);
2813 mainwin
->win
.sep_folder
.folderwin
= folderwin
;
2814 mainwin
->win
.sep_folder
.vpaned
= vpaned
;
2816 /* remove headerview if not in prefs */
2817 headerview_set_visibility(mainwin
->messageview
->headerview
,
2818 prefs_common
.display_header_pane
);
2821 case SEPARATE_MESSAGE
:
2822 hpaned
= gtk_hpaned_new();
2823 gtk_box_pack_start(GTK_BOX(vbox_body
), hpaned
, TRUE
, TRUE
, 0);
2824 gtk_paned_add1(GTK_PANED(hpaned
),
2825 GTK_WIDGET_PTR(mainwin
->folderview
));
2826 gtk_paned_add2(GTK_PANED(hpaned
),
2827 GTK_WIDGET_PTR(mainwin
->summaryview
));
2828 gtk_widget_show(hpaned
);
2829 gtk_widget_queue_resize(hpaned
);
2830 messageview_add_toolbar(mainwin
->messageview
, messagewin
);
2831 msgview_ifactory
= gtk_item_factory_from_widget(mainwin
->messageview
->menubar
);
2832 menu_set_sensitive(msgview_ifactory
, "/File/Close", FALSE
);
2834 mainwin
->win
.sep_message
.messagewin
= messagewin
;
2835 mainwin
->win
.sep_message
.hpaned
= hpaned
;
2837 gtk_widget_realize(messagewin
);
2838 gtk_widget_show_all(GTK_WIDGET_PTR(mainwin
->messageview
));
2839 gtk_widget_show_all(messagewin
);
2840 toolbar_set_style(mainwin
->messageview
->toolbar
->toolbar
,
2841 mainwin
->messageview
->handlebox
,
2842 prefs_common
.toolbar_style
);
2844 /* remove headerview if not in prefs */
2845 headerview_set_visibility(mainwin
->messageview
->headerview
,
2846 prefs_common
.display_header_pane
);
2850 messageview_add_toolbar(mainwin
->messageview
, messagewin
);
2851 msgview_ifactory
= gtk_item_factory_from_widget(mainwin
->messageview
->menubar
);
2852 menu_set_sensitive(msgview_ifactory
, "/File/Close", FALSE
);
2854 gtk_box_pack_start(GTK_BOX(vbox_body
),
2855 GTK_WIDGET_PTR(mainwin
->summaryview
),
2858 mainwin
->win
.sep_both
.folderwin
= folderwin
;
2859 mainwin
->win
.sep_both
.messagewin
= messagewin
;
2861 gtk_widget_realize(messagewin
);
2862 gtk_widget_show_all(GTK_WIDGET_PTR(mainwin
->messageview
));
2863 gtk_widget_show_all(messagewin
);
2864 toolbar_set_style(mainwin
->messageview
->toolbar
->toolbar
,
2865 mainwin
->messageview
->handlebox
,
2866 prefs_common
.toolbar_style
);
2868 /* remove headerview if not in prefs */
2869 headerview_set_visibility(mainwin
->messageview
->headerview
,
2870 prefs_common
.display_header_pane
);
2875 if (messageview_is_visible(mainwin
->messageview
))
2876 gtk_arrow_set(GTK_ARROW(mainwin
->summaryview
->toggle_arrow
),
2877 GTK_ARROW_DOWN
, GTK_SHADOW_OUT
);
2879 gtk_arrow_set(GTK_ARROW(mainwin
->summaryview
->toggle_arrow
),
2880 GTK_ARROW_UP
, GTK_SHADOW_OUT
);
2882 gtk_window_move(GTK_WINDOW(mainwin
->window
),
2883 prefs_common
.mainwin_x
,
2884 prefs_common
.mainwin_y
);
2886 gtk_widget_queue_resize(vbox_body
);
2887 gtk_widget_queue_resize(mainwin
->vbox
);
2888 gtk_widget_queue_resize(mainwin
->window
);
2889 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
2890 * and mimeview icon list/ctree lose track of their visibility states */
2891 if (!noticeview_is_visible(mainwin
->messageview
->noticeview
))
2892 gtk_widget_hide(GTK_WIDGET_PTR(mainwin
->messageview
->noticeview
));
2893 if (!noticeview_is_visible(mainwin
->messageview
->mimeview
->siginfoview
))
2894 gtk_widget_hide(GTK_WIDGET_PTR(mainwin
->messageview
->mimeview
->siginfoview
));
2895 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mainwin
->messageview
->mimeview
->mime_toggle
)))
2896 gtk_widget_hide(mainwin
->messageview
->mimeview
->icon_mainbox
);
2898 gtk_widget_hide(mainwin
->messageview
->mimeview
->ctree_mainbox
);
2900 mainwin
->type
= type
;
2903 /* toggle menu state */
2904 menuitem
= gtk_item_factory_get_item
2905 (ifactory
, "/View/Show or hide/Folder tree");
2906 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem
),
2907 (type
& SEPARATE_FOLDER
) == 0 ? TRUE
:
2908 prefs_common
.folderview_visible
);
2909 gtk_widget_set_sensitive(menuitem
, ((type
& SEPARATE_FOLDER
) != 0));
2910 menuitem
= gtk_item_factory_get_item
2911 (ifactory
, "/View/Show or hide/Message view");
2912 gtk_check_menu_item_set_active
2913 (GTK_CHECK_MENU_ITEM(menuitem
),
2914 messageview_is_visible(mainwin
->messageview
));
2916 menuitem
= gtk_item_factory_get_item
2917 (ifactory
, "/View/Separate folder tree");
2918 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem
),
2919 ((type
& SEPARATE_FOLDER
) != 0));
2920 menuitem
= gtk_item_factory_get_item
2921 (ifactory
, "/View/Separate message view");
2922 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem
),
2923 ((type
& SEPARATE_MESSAGE
) != 0));
2927 (G_OBJECT(folderwin
), "size_allocate",
2928 G_CALLBACK(folder_window_size_allocate_cb
),
2933 (G_OBJECT(messagewin
), "size_allocate",
2934 G_CALLBACK(message_window_size_allocate_cb
),
2938 debug_print("done.\n");
2941 void main_window_destroy_all(void)
2943 while (mainwin_list
!= NULL
) {
2944 MainWindow
*mainwin
= (MainWindow
*)mainwin_list
->data
;
2946 /* free toolbar stuff */
2947 toolbar_clear_list(TOOLBAR_MAIN
);
2948 TOOLBAR_DESTROY_ACTIONS(mainwin
->toolbar
->action_list
);
2949 TOOLBAR_DESTROY_ITEMS(mainwin
->toolbar
->item_list
);
2951 mainwin
->folderview
->mainwin
= NULL
;
2952 mainwin
->summaryview
->mainwin
= NULL
;
2953 mainwin
->messageview
->mainwin
= NULL
;
2955 g_free(mainwin
->toolbar
);
2958 mainwin_list
= g_list_remove(mainwin_list
, mainwin
);
2960 g_list_free(mainwin_list
);
2961 mainwin_list
= NULL
;
2964 static void toolbar_child_attached(GtkWidget
*widget
, GtkWidget
*child
,
2967 gtk_widget_set_size_request(child
, 1, -1);
2970 static void toolbar_child_detached(GtkWidget
*widget
, GtkWidget
*child
,
2973 gtk_widget_set_size_request(child
, -1, -1);
2976 static gboolean
ac_label_button_pressed(GtkWidget
*widget
, GdkEventButton
*event
,
2979 MainWindow
*mainwin
= (MainWindow
*)data
;
2981 if (!event
) return FALSE
;
2983 gtk_button_set_relief(GTK_BUTTON(widget
), GTK_RELIEF_NORMAL
);
2984 g_object_set_data(G_OBJECT(mainwin
->ac_menu
), "menu_button",
2987 gtk_menu_popup(GTK_MENU(mainwin
->ac_menu
), NULL
, NULL
,
2988 menu_button_position
, widget
,
2989 event
->button
, event
->time
);
2994 static gint
main_window_close_cb(GtkWidget
*widget
, GdkEventAny
*event
,
2997 MainWindow
*mainwin
= (MainWindow
*)data
;
2999 if (mainwin
->lock_count
== 0)
3000 app_exit_cb(data
, 0, widget
);
3005 static gint
folder_window_close_cb(GtkWidget
*widget
, GdkEventAny
*event
,
3008 MainWindow
*mainwin
= (MainWindow
*)data
;
3009 GtkWidget
*menuitem
;
3011 menuitem
= gtk_item_factory_get_item
3012 (mainwin
->menu_factory
, "/View/Show or hide/Folder tree");
3013 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem
), FALSE
);
3018 static gint
message_window_close_cb(GtkWidget
*widget
, GdkEventAny
*event
,
3021 MainWindow
*mainwin
= (MainWindow
*)data
;
3022 GtkWidget
*menuitem
;
3024 menuitem
= gtk_item_factory_get_item
3025 (mainwin
->menu_factory
, "/View/Show or hide/Message view");
3026 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem
), FALSE
);
3028 mainwin
->messageview
->statusbar
= mainwin
->statusbar
;
3029 mainwin
->messageview
->statusbar_cid
= mainwin
->messageview_cid
;
3034 static void main_window_size_allocate_cb(GtkWidget
*widget
,
3035 GtkAllocation
*allocation
,
3038 MainWindow
*mainwin
= (MainWindow
*)data
;
3040 main_window_get_size(mainwin
);
3043 static void folder_window_size_allocate_cb(GtkWidget
*widget
,
3044 GtkAllocation
*allocation
,
3047 MainWindow
*mainwin
= (MainWindow
*)data
;
3049 main_window_get_size(mainwin
);
3052 static void message_window_size_allocate_cb(GtkWidget
*widget
,
3053 GtkAllocation
*allocation
,
3056 MainWindow
*mainwin
= (MainWindow
*)data
;
3058 main_window_get_size(mainwin
);
3061 static void add_mailbox_cb(MainWindow
*mainwin
, guint action
,
3064 main_window_add_mailbox(mainwin
);
3067 static void update_folderview_cb(MainWindow
*mainwin
, guint action
,
3070 summary_show(mainwin
->summaryview
, NULL
);
3071 folderview_check_new_all();
3074 static void foldersort_cb(MainWindow
*mainwin
, guint action
,
3080 static void import_mbox_cb(MainWindow
*mainwin
, guint action
,
3083 /* only notify if import has failed */
3084 if (import_mbox(mainwin
->summaryview
->folder_item
) == -1) {
3085 alertpanel_error(_("Mbox import has failed."));
3089 static void export_mbox_cb(MainWindow
*mainwin
, guint action
,
3092 /* only notify if export has failed */
3093 if (export_mbox(mainwin
->summaryview
->folder_item
) == -1) {
3094 alertpanel_error(_("Export to mbox has failed."));
3098 static void export_list_mbox_cb(MainWindow
*mainwin
, guint action
,
3101 /* only notify if export has failed */
3102 if (summaryview_export_mbox_list(mainwin
->summaryview
) == -1) {
3103 alertpanel_error(_("Export to mbox has failed."));
3107 static void empty_trash_cb(MainWindow
*mainwin
, guint action
,
3110 main_window_empty_trash(mainwin
, TRUE
);
3113 static void save_as_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3115 summary_save_as(mainwin
->summaryview
);
3118 static void print_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3120 summary_print(mainwin
->summaryview
);
3123 static void app_exit_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3125 if (prefs_common
.confirm_on_exit
) {
3126 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
3127 GTK_STOCK_CANCEL
, GTK_STOCK_QUIT
, NULL
)
3128 != G_ALERTALTERNATE
)
3130 manage_window_focus_in(mainwin
->window
, NULL
, NULL
);
3133 app_will_exit(widget
, mainwin
);
3136 static void search_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3139 summary_search(mainwin
->summaryview
);
3141 message_search(mainwin
->messageview
);
3144 static void mainwindow_quicksearch(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3146 prefs_common
.show_searchbar
= TRUE
;
3147 summaryview_activate_quicksearch(mainwin
->summaryview
);
3150 static void toggle_folder_cb(MainWindow
*mainwin
, guint action
,
3155 active
= GTK_CHECK_MENU_ITEM(widget
)->active
;
3157 switch (mainwin
->type
) {
3159 case SEPARATE_MESSAGE
:
3161 case SEPARATE_FOLDER
:
3162 debug_print("separate folder\n");
3164 gtk_widget_show(mainwin
->win
.sep_folder
.folderwin
);
3166 gtk_widget_hide(mainwin
->win
.sep_folder
.folderwin
);
3170 gtk_widget_show(mainwin
->win
.sep_both
.folderwin
);
3172 gtk_widget_hide(mainwin
->win
.sep_both
.folderwin
);
3176 prefs_common
.folderview_visible
= active
;
3179 static void toggle_message_cb(MainWindow
*mainwin
, guint action
,
3184 active
= GTK_CHECK_MENU_ITEM(widget
)->active
;
3186 if (active
!= messageview_is_visible(mainwin
->messageview
))
3187 summary_toggle_view(mainwin
->summaryview
);
3190 static void toggle_toolbar_cb(MainWindow
*mainwin
, guint action
,
3193 toolbar_toggle(action
, mainwin
);
3196 void main_window_reply_cb(MainWindow
*mainwin
, guint action
,
3199 MessageView
*msgview
= (MessageView
*)mainwin
->messageview
;
3200 GSList
*msginfo_list
= NULL
;
3202 g_return_if_fail(msgview
!= NULL
);
3204 msginfo_list
= summary_get_selection(mainwin
->summaryview
);
3205 g_return_if_fail(msginfo_list
!= NULL
);
3206 compose_reply_from_messageview(msgview
, msginfo_list
, action
);
3207 g_slist_free(msginfo_list
);
3211 static void toggle_statusbar_cb(MainWindow
*mainwin
, guint action
,
3214 if (GTK_CHECK_MENU_ITEM(widget
)->active
) {
3215 gtk_widget_show(mainwin
->hbox_stat
);
3216 prefs_common
.show_statusbar
= TRUE
;
3218 gtk_widget_hide(mainwin
->hbox_stat
);
3219 prefs_common
.show_statusbar
= FALSE
;
3223 static void separate_widget_cb(MainWindow
*mainwin
, guint action
,
3228 if (GTK_CHECK_MENU_ITEM(widget
)->active
)
3229 type
= mainwin
->type
| action
;
3231 type
= mainwin
->type
& ~action
;
3233 main_window_separation_change(mainwin
, type
);
3235 prefs_common
.sep_folder
= (type
& SEPARATE_FOLDER
) != 0;
3236 prefs_common
.sep_msg
= (type
& SEPARATE_MESSAGE
) != 0;
3239 void main_window_toggle_work_offline (MainWindow
*mainwin
, gboolean offline
,
3242 offline_ask_sync
= ask_sync
;
3244 online_switch_clicked (GTK_BUTTON(mainwin
->online_switch
), mainwin
);
3246 online_switch_clicked (GTK_BUTTON(mainwin
->offline_switch
), mainwin
);
3247 offline_ask_sync
= TRUE
;
3250 static void toggle_work_offline_cb (MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3252 main_window_toggle_work_offline(mainwin
, GTK_CHECK_MENU_ITEM(widget
)->active
, TRUE
);
3255 static void mainwindow_check_synchronise(MainWindow
*mainwin
, gboolean ask
)
3257 GList
*folderlist
= folder_get_list();
3258 gboolean found
= FALSE
;
3260 /* see if there are synchronised folders */
3261 for (; folderlist
; folderlist
= folderlist
->next
) {
3262 Folder
*folder
= (Folder
*)folderlist
->data
;
3263 if (folder_want_synchronise(folder
)) {
3272 if (offline_ask_sync
&& ask
&& alertpanel(_("Folder synchronisation"),
3273 _("Do you want to synchronise your folders now?"),
3274 GTK_STOCK_CANCEL
, _("+_Synchronise"), NULL
) != G_ALERTALTERNATE
)
3277 folder_synchronise(NULL
);
3280 static void online_switch_clicked (GtkButton
*btn
, gpointer data
)
3282 MainWindow
*mainwin
;
3283 GtkItemFactory
*ifactory
;
3284 GtkCheckMenuItem
*menuitem
;
3286 mainwin
= (MainWindow
*) data
;
3288 ifactory
= gtk_item_factory_from_widget(mainwin
->menubar
);
3289 menuitem
= GTK_CHECK_MENU_ITEM (gtk_item_factory_get_widget(ifactory
, "/File/Work offline"));
3291 g_return_if_fail(mainwin
!= NULL
);
3292 g_return_if_fail(menuitem
!= NULL
);
3294 if (btn
== GTK_BUTTON(mainwin
->online_switch
)) {
3295 gtk_widget_hide (mainwin
->online_switch
);
3296 gtk_widget_show (mainwin
->offline_switch
);
3297 menuitem
->active
= TRUE
;
3298 inc_autocheck_timer_remove();
3301 if (prefs_common
.work_offline
)
3303 mainwindow_check_synchronise(mainwin
, TRUE
);
3304 prefs_common
.work_offline
= TRUE
;
3305 imap_disconnect_all();
3306 hooks_invoke(OFFLINE_SWITCH_HOOKLIST
, NULL
);
3309 if (!prefs_common
.work_offline
)
3311 gtk_widget_hide (mainwin
->offline_switch
);
3312 gtk_widget_show (mainwin
->online_switch
);
3313 menuitem
->active
= FALSE
;
3314 prefs_common
.work_offline
= FALSE
;
3315 inc_autocheck_timer_set();
3316 refresh_resolvers();
3317 hooks_invoke(OFFLINE_SWITCH_HOOKLIST
, NULL
);
3321 static void addressbook_open_cb(MainWindow
*mainwin
, guint action
,
3324 addressbook_open(NULL
);
3327 static void log_window_show_cb(MainWindow
*mainwin
, guint action
,
3330 log_window_show(mainwin
->logwin
);
3333 static void inc_cancel_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3338 static void move_to_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3340 summary_move_to(mainwin
->summaryview
);
3343 static void copy_to_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3345 summary_copy_to(mainwin
->summaryview
);
3348 static void delete_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3350 summary_delete(mainwin
->summaryview
);
3353 static void delete_trash_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3355 summary_delete_trash(mainwin
->summaryview
);
3358 static void cancel_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3360 summary_cancel(mainwin
->summaryview
);
3363 static void open_msg_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3365 summary_open_msg(mainwin
->summaryview
);
3368 static void view_source_cb(MainWindow
*mainwin
, guint action
,
3371 summary_view_source(mainwin
->summaryview
);
3374 static void show_all_header_cb(MainWindow
*mainwin
, guint action
,
3377 if (mainwin
->menu_lock_count
) return;
3378 mainwin
->summaryview
->messageview
->all_headers
=
3379 GTK_CHECK_MENU_ITEM(widget
)->active
;
3380 summary_display_msg_selected(mainwin
->summaryview
,
3381 GTK_CHECK_MENU_ITEM(widget
)->active
);
3384 #define SET_CHECK_MENU_ACTIVE(path, active) \
3386 menuitem = gtk_item_factory_get_widget(ifactory, path); \
3387 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), active); \
3390 static void hide_quotes_cb(MainWindow
*mainwin
, guint action
,
3393 GtkWidget
*menuitem
;
3394 GtkItemFactory
*ifactory
= mainwin
->menu_factory
;
3396 if (mainwin
->menu_lock_count
) return;
3398 prefs_common
.hide_quotes
=
3399 GTK_CHECK_MENU_ITEM(widget
)->active
? action
: 0;
3401 mainwin
->menu_lock_count
++;
3402 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold all", FALSE
);
3403 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold from level 2", FALSE
);
3404 SET_CHECK_MENU_ACTIVE("/View/Quotes/Fold from level 3", FALSE
);
3405 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget
), prefs_common
.hide_quotes
> 0);
3406 mainwin
->menu_lock_count
--;
3408 summary_redisplay_msg(mainwin
->summaryview
);
3411 #undef SET_CHECK_MENU_ACTIVE
3412 static void mark_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3414 summary_mark(mainwin
->summaryview
);
3417 static void unmark_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3419 summary_unmark(mainwin
->summaryview
);
3422 static void mark_as_unread_cb(MainWindow
*mainwin
, guint action
,
3425 summary_mark_as_unread(mainwin
->summaryview
);
3428 static void mark_as_read_cb(MainWindow
*mainwin
, guint action
,
3431 summary_mark_as_read(mainwin
->summaryview
);
3434 static void mark_all_read_cb(MainWindow
*mainwin
, guint action
,
3437 summary_mark_all_read(mainwin
->summaryview
);
3440 static void mark_as_spam_cb(MainWindow
*mainwin
, guint action
,
3443 summary_mark_as_spam(mainwin
->summaryview
, action
, NULL
);
3446 static void ignore_thread_cb(MainWindow
*mainwin
, guint action
,
3449 summary_ignore_thread(mainwin
->summaryview
);
3452 static void unignore_thread_cb(MainWindow
*mainwin
, guint action
,
3455 summary_unignore_thread(mainwin
->summaryview
);
3458 static void lock_msgs_cb(MainWindow
*mainwin
, guint action
,
3461 summary_msgs_lock(mainwin
->summaryview
);
3464 static void unlock_msgs_cb(MainWindow
*mainwin
, guint action
,
3467 summary_msgs_unlock(mainwin
->summaryview
);
3471 static void reedit_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3473 summary_reedit(mainwin
->summaryview
);
3476 static void add_address_cb(MainWindow
*mainwin
, guint action
,
3479 summary_add_address(mainwin
->summaryview
);
3482 static void set_charset_cb(MainWindow
*mainwin
, guint action
,
3487 if (GTK_CHECK_MENU_ITEM(widget
)->active
) {
3488 str
= conv_get_charset_str((CharSet
)action
);
3490 g_free(mainwin
->messageview
->forced_charset
);
3491 mainwin
->messageview
->forced_charset
= str
? g_strdup(str
) : NULL
;
3492 procmime_force_charset(str
);
3494 summary_redisplay_msg(mainwin
->summaryview
);
3496 debug_print("forced charset: %s\n", str
? str
: "Auto-Detect");
3500 static void set_decode_cb(MainWindow
*mainwin
, guint action
,
3503 if (GTK_CHECK_MENU_ITEM(widget
)->active
) {
3504 mainwin
->messageview
->forced_encoding
= (EncodingType
)action
;
3506 summary_redisplay_msg(mainwin
->summaryview
);
3508 debug_print("forced encoding: %d\n", action
);
3512 static void hide_read_messages (MainWindow
*mainwin
, guint action
,
3515 if (!mainwin
->summaryview
->folder_item
3516 || g_object_get_data(G_OBJECT(widget
), "dont_toggle"))
3518 summary_toggle_show_read_messages(mainwin
->summaryview
);
3521 static void thread_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3523 gboolean threaded
= FALSE
;
3524 if (mainwin
->menu_lock_count
) return;
3525 if (!mainwin
->summaryview
->folder_item
) return;
3527 threaded
= GTK_CHECK_MENU_ITEM(widget
)->active
;
3529 mainwin
->summaryview
->folder_item
->threaded
= threaded
;
3531 mainwin
->summaryview
->threaded
= threaded
;
3533 summary_show(mainwin
->summaryview
,
3534 mainwin
->summaryview
->folder_item
);
3537 static void expand_threads_cb(MainWindow
*mainwin
, guint action
,
3540 summary_expand_threads(mainwin
->summaryview
);
3543 static void collapse_threads_cb(MainWindow
*mainwin
, guint action
,
3546 summary_collapse_threads(mainwin
->summaryview
);
3549 static void set_summary_display_item_cb(MainWindow
*mainwin
, guint action
,
3552 prefs_summary_column_open();
3555 static void set_folder_display_item_cb(MainWindow
*mainwin
, guint action
,
3558 prefs_folder_column_open();
3561 static void sort_summary_cb(MainWindow
*mainwin
, guint action
,
3564 FolderItem
*item
= mainwin
->summaryview
->folder_item
;
3565 GtkWidget
*menuitem
;
3567 if (mainwin
->menu_lock_count
) return;
3569 if (GTK_CHECK_MENU_ITEM(widget
)->active
&& item
) {
3570 menuitem
= gtk_item_factory_get_item
3571 (mainwin
->menu_factory
, "/View/Sort/Ascending");
3572 summary_sort(mainwin
->summaryview
, (FolderSortKey
)action
,
3573 GTK_CHECK_MENU_ITEM(menuitem
)->active
3574 ? SORT_ASCENDING
: SORT_DESCENDING
);
3575 item
->sort_key
= action
;
3579 static void sort_summary_type_cb(MainWindow
*mainwin
, guint action
,
3582 FolderItem
*item
= mainwin
->summaryview
->folder_item
;
3584 if (mainwin
->menu_lock_count
) return;
3586 if (GTK_CHECK_MENU_ITEM(widget
)->active
&& item
)
3587 summary_sort(mainwin
->summaryview
,
3588 item
->sort_key
, (FolderSortType
)action
);
3591 static void attract_by_subject_cb(MainWindow
*mainwin
, guint action
,
3594 summary_attract_by_subject(mainwin
->summaryview
);
3597 static void delete_duplicated_cb(MainWindow
*mainwin
, guint action
,
3602 item
= folderview_get_selected_item(mainwin
->folderview
);
3604 main_window_cursor_wait(mainwin
);
3605 STATUSBAR_PUSH(mainwin
, _("Deleting duplicated messages..."));
3607 folderutils_delete_duplicates(item
, prefs_common
.immediate_exec
?
3608 DELETE_DUPLICATES_REMOVE
: DELETE_DUPLICATES_SETFLAG
);
3610 STATUSBAR_POP(mainwin
);
3611 main_window_cursor_normal(mainwin
);
3621 static void deldup_all(FolderItem
*item
, gpointer _data
)
3623 struct DelDupsData
*data
= _data
;
3626 result
= folderutils_delete_duplicates(item
, DELETE_DUPLICATES_REMOVE
);
3628 data
->dups
+= result
;
3633 static void delete_duplicated_all_cb(MainWindow
*mainwin
, guint action
,
3636 struct DelDupsData data
= {0, 0};
3638 main_window_cursor_wait(mainwin
);
3639 folder_func_to_all_folders(deldup_all
, &data
);
3640 main_window_cursor_normal(mainwin
);
3642 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
3643 "Deleted %d duplicate messages in %d folders.\n",
3645 data
.dups
, data
.folders
);
3648 static void filter_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3650 summary_filter(mainwin
->summaryview
, (gboolean
)action
);
3653 static void execute_summary_cb(MainWindow
*mainwin
, guint action
,
3656 summary_execute(mainwin
->summaryview
);
3659 static void update_summary_cb(MainWindow
*mainwin
, guint action
,
3663 FolderView
*folderview
= mainwin
->folderview
;
3665 if (!mainwin
->summaryview
->folder_item
) return;
3666 if (!folderview
->opened
) return;
3668 folder_update_op_count();
3670 fitem
= gtk_ctree_node_get_row_data(GTK_CTREE(folderview
->ctree
),
3671 folderview
->opened
);
3674 folder_item_scan(fitem
);
3675 summary_show(mainwin
->summaryview
, fitem
);
3678 static void prev_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3680 summary_step(mainwin
->summaryview
, GTK_SCROLL_STEP_BACKWARD
);
3683 static void next_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3685 summary_step(mainwin
->summaryview
, GTK_SCROLL_STEP_FORWARD
);
3688 static void prev_unread_cb(MainWindow
*mainwin
, guint action
,
3691 summary_select_prev_unread(mainwin
->summaryview
);
3694 static void next_unread_cb(MainWindow
*mainwin
, guint action
,
3697 summary_select_next_unread(mainwin
->summaryview
);
3700 static void prev_new_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3702 summary_select_prev_new(mainwin
->summaryview
);
3705 static void next_new_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3707 summary_select_next_new(mainwin
->summaryview
);
3710 static void prev_marked_cb(MainWindow
*mainwin
, guint action
,
3713 summary_select_prev_marked(mainwin
->summaryview
);
3716 static void next_marked_cb(MainWindow
*mainwin
, guint action
,
3719 summary_select_next_marked(mainwin
->summaryview
);
3722 static void prev_labeled_cb(MainWindow
*mainwin
, guint action
,
3725 summary_select_prev_labeled(mainwin
->summaryview
);
3728 static void next_labeled_cb(MainWindow
*mainwin
, guint action
,
3731 summary_select_next_labeled(mainwin
->summaryview
);
3734 static void last_read_cb(MainWindow
*mainwin
, guint action
,
3737 summary_select_last_read(mainwin
->summaryview
);
3740 static void parent_cb(MainWindow
*mainwin
, guint action
,
3743 summary_select_parent(mainwin
->summaryview
);
3746 static void goto_folder_cb(MainWindow
*mainwin
, guint action
,
3749 FolderItem
*to_folder
;
3751 to_folder
= foldersel_folder_sel(NULL
, FOLDER_SEL_ALL
, NULL
);
3754 folderview_select(mainwin
->folderview
, to_folder
);
3757 static void goto_unread_folder_cb(MainWindow
*mainwin
, guint action
,
3760 folderview_select_next_unread(mainwin
->folderview
, FALSE
);
3763 static void copy_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3765 messageview_copy_clipboard(mainwin
->messageview
);
3768 static void allsel_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
3770 MessageView
*msgview
= mainwin
->messageview
;
3772 if (messageview_is_visible(msgview
) &&
3773 (GTK_WIDGET_HAS_FOCUS(msgview
->mimeview
->textview
->text
)))
3774 messageview_select_all(mainwin
->messageview
);
3776 summary_select_all(mainwin
->summaryview
);
3779 static void select_thread_cb(MainWindow
*mainwin
, guint action
,
3782 summary_select_thread(mainwin
->summaryview
);
3785 static void create_filter_cb(MainWindow
*mainwin
, guint action
,
3788 summary_filter_open(mainwin
->summaryview
, (PrefsFilterType
)action
, 0);
3791 static void create_processing_cb(MainWindow
*mainwin
, guint action
,
3794 summary_filter_open(mainwin
->summaryview
, (PrefsFilterType
)action
, 1);
3797 static void prefs_pre_processing_open_cb(MainWindow
*mainwin
, guint action
,
3800 prefs_filtering_open(&pre_global_processing
,
3801 _("Processing rules to apply before folder rules"),
3802 MANUAL_ANCHOR_PROCESSING
,
3806 static void prefs_post_processing_open_cb(MainWindow
*mainwin
, guint action
,
3809 prefs_filtering_open(&post_global_processing
,
3810 _("Processing rules to apply after folder rules"),
3811 MANUAL_ANCHOR_PROCESSING
,
3815 static void prefs_filtering_open_cb(MainWindow
*mainwin
, guint action
,
3818 prefs_filtering_open(&filtering_rules
,
3819 _("Filtering configuration"),
3820 MANUAL_ANCHOR_FILTERING
,
3824 static void prefs_template_open_cb(MainWindow
*mainwin
, guint action
,
3827 prefs_template_open();
3830 static void prefs_actions_open_cb(MainWindow
*mainwin
, guint action
,
3833 prefs_actions_open(mainwin
);
3836 static void ssl_manager_open_cb(MainWindow
*mainwin
, guint action
,
3839 ssl_manager_open(mainwin
);
3842 static void prefs_account_open_cb(MainWindow
*mainwin
, guint action
,
3846 new_account_cb(mainwin
, 0, widget
);
3848 account_open(cur_account
);
3852 static void new_account_cb(MainWindow
*mainwin
, guint action
,
3855 account_edit_open();
3856 if (!compose_get_compose_list()) account_add();
3859 static void account_selector_menu_cb(GtkMenuItem
*menuitem
, gpointer data
)
3861 FolderItem
*item
= NULL
;
3862 cur_account
= (PrefsAccount
*)data
;
3864 if (!mainwindow_get_mainwindow())
3866 main_window_show_cur_account(mainwindow_get_mainwindow());
3867 toolbar_update(TOOLBAR_MAIN
, mainwindow_get_mainwindow());
3868 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
3869 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
3870 item
= folderview_get_selected_item(
3871 mainwindow_get_mainwindow()->folderview
);
3873 toolbar_set_compose_button
3874 (mainwindow_get_mainwindow()->toolbar
,
3875 FOLDER_TYPE(item
->folder
) == F_NEWS
?
3876 COMPOSEBUTTON_NEWS
: COMPOSEBUTTON_MAIL
);
3880 static void account_receive_menu_cb(GtkMenuItem
*menuitem
, gpointer data
)
3882 MainWindow
*mainwin
= (MainWindow
*)mainwin_list
->data
;
3883 PrefsAccount
*account
= (PrefsAccount
*)data
;
3885 inc_account_mail(mainwin
, account
);
3888 static void account_compose_menu_cb(GtkMenuItem
*menuitem
, gpointer data
)
3890 MainWindow
*mainwin
= (MainWindow
*)mainwin_list
->data
;
3891 PrefsAccount
*account
= (PrefsAccount
*)data
;
3892 FolderItem
*item
= mainwin
->summaryview
->folder_item
;
3894 compose_new_with_folderitem(account
, item
, NULL
);
3897 static void prefs_open_cb(GtkMenuItem
*menuitem
, gpointer data
)
3902 static void plugins_open_cb(GtkMenuItem
*menuitem
, gpointer data
)
3904 pluginwindow_create();
3907 static void manual_open_cb(MainWindow
*mainwin
, guint action
,
3910 manual_open((ManualType
)action
, NULL
);
3913 static void legend_open_cb(GtkMenuItem
*menuitem
, gpointer data
)
3918 static void scan_tree_func(Folder
*folder
, FolderItem
*item
, gpointer data
)
3920 MainWindow
*mainwin
= (MainWindow
*)data
;
3924 str
= g_strdup_printf(_("Scanning folder %s%c%s ..."),
3925 LOCAL_FOLDER(folder
)->rootpath
,
3929 str
= g_strdup_printf(_("Scanning folder %s ..."),
3930 LOCAL_FOLDER(folder
)->rootpath
);
3932 STATUSBAR_PUSH(mainwin
, str
);
3933 STATUSBAR_POP(mainwin
);
3937 static gboolean
mainwindow_focus_in_event(GtkWidget
*widget
, GdkEventFocus
*focus
,
3940 SummaryView
*summary
;
3942 g_return_val_if_fail(data
, FALSE
);
3943 if (!g_list_find(mainwin_list
, data
))
3945 summary
= ((MainWindow
*)data
)->summaryview
;
3946 g_return_val_if_fail(summary
, FALSE
);
3948 if (GTK_CLIST(summary
->ctree
)->selection
&&
3949 g_list_length(GTK_CLIST(summary
->ctree
)->selection
) > 1)
3955 #define BREAK_ON_MODIFIER_KEY() \
3956 if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
3958 gboolean
mainwindow_key_pressed (GtkWidget
*widget
, GdkEventKey
*event
,
3961 MainWindow
*mainwin
= (MainWindow
*) data
;
3963 if (!mainwin
|| !event
)
3966 if (quicksearch_has_focus(mainwin
->summaryview
->quicksearch
))
3968 lastkey
= event
->keyval
;
3972 switch (event
->keyval
) {
3973 case GDK_Q
: /* Quit */
3974 BREAK_ON_MODIFIER_KEY();
3976 app_exit_cb(mainwin
, 0, NULL
);
3979 if (mainwin
->folderview
&& mainwin
->summaryview
3980 && ((!mainwin
->summaryview
->displayed
3981 && !mainwin
->summaryview
->selected
)
3982 || (mainwin
->summaryview
->folder_item
3983 && mainwin
->summaryview
->folder_item
->total_msgs
== 0))) {
3984 g_signal_stop_emission_by_name(G_OBJECT(widget
),
3986 folderview_select_next_unread(mainwin
->folderview
, TRUE
);
3995 #undef BREAK_ON_MODIFIER_KEY
3998 * Harvest addresses for selected folder.
4000 static void addr_harvest_cb( MainWindow
*mainwin
,
4004 addressbook_harvest( mainwin
->summaryview
->folder_item
, FALSE
, NULL
);
4008 * Harvest addresses for selected messages in summary view.
4010 static void addr_harvest_msg_cb( MainWindow
*mainwin
,
4014 summary_harvest_address( mainwin
->summaryview
);
4018 *\brief get a MainWindow
4020 *\return MainWindow * The first mainwindow in the mainwin_list
4022 MainWindow
*mainwindow_get_mainwindow(void)
4024 if (mainwin_list
&& mainwin_list
->data
)
4025 return (MainWindow
*)(mainwin_list
->data
);
4030 gboolean
mainwindow_progressindicator_hook(gpointer source
, gpointer userdata
)
4032 ProgressData
*data
= (ProgressData
*) source
;
4033 MainWindow
*mainwin
= (MainWindow
*) userdata
;
4035 switch (data
->cmd
) {
4036 case PROGRESS_COMMAND_START
:
4037 case PROGRESS_COMMAND_STOP
:
4038 gtk_progress_bar_set_fraction
4039 (GTK_PROGRESS_BAR(mainwin
->progressbar
), 0.0);
4041 case PROGRESS_COMMAND_SET_PERCENTAGE
:
4042 gtk_progress_bar_set_fraction
4043 (GTK_PROGRESS_BAR(mainwin
->progressbar
), data
->value
);
4046 while (gtk_events_pending()) gtk_main_iteration ();
4051 static void sync_cb(MainWindow
*mainwin
, guint action
, GtkWidget
*widget
)
4053 mainwindow_check_synchronise(mainwin
, FALSE
);
4056 void mainwindow_learn (MainWindow
*mainwin
, gboolean is_spam
)
4058 summary_mark_as_spam(mainwin
->summaryview
, is_spam
, NULL
);
4061 void mainwindow_jump_to(const gchar
*target
)
4065 FolderItem
*item
= NULL
;
4067 MainWindow
*mainwin
= mainwindow_get_mainwindow();
4073 printf(_("not initialized\n"));
4077 tmp
= g_strdup(target
);
4079 if ((p
= strstr(tmp
, "\r")) != NULL
)
4081 if ((p
= strstr(tmp
, "\n")) != NULL
)
4084 if ((item
= folder_find_item_from_identifier(tmp
))) {
4085 printf(_("selecting folder '%s'\n"), tmp
);
4086 folderview_select(mainwin
->folderview
, item
);
4087 main_window_popup(mainwin
);
4092 msg
= strrchr(tmp
, G_DIR_SEPARATOR
);
4095 if ((item
= folder_find_item_from_identifier(tmp
))) {
4096 printf(_("selecting folder '%s'\n"), tmp
);
4097 folderview_select(mainwin
->folderview
, item
);
4099 if (item
&& msg
&& atoi(msg
)) {
4100 printf(_("selecting message %d\n"), atoi(msg
));
4101 summary_select_by_msgnum(mainwin
->summaryview
, atoi(msg
));
4102 summary_display_msg_selected(mainwin
->summaryview
, FALSE
);
4103 main_window_popup(mainwin
);
4109 printf("'%s' not found\n", tmp
);