315ab7c00d1c7a25dbbe0a554d8b7ec2ebbce268
[claws.git] / src / mainwindow.c
1 /*
2    Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3    Copyright (C) 1999-2018 the Claws Mail team and Hiroyuki Yamamoto
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "defs.h"
20
21 #ifdef G_OS_WIN32
22 #define UNICODE
23 #define _UNICODE
24 #endif
25
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <gtk/gtk.h>
30 #include <string.h>
31 #include <stdarg.h>
32
33 #include "main.h"
34 #include "mainwindow.h"
35 #include "folderview.h"
36 #include "folder_item_prefs.h"
37 #include "foldersel.h"
38 #include "quicksearch.h"
39 #include "summaryview.h"
40 #include "summary_search.h"
41 #include "messageview.h"
42 #include "mimeview.h"
43 #include "message_search.h"
44 #include "headerview.h"
45 #include "menu.h"
46 #include "stock_pixmap.h"
47 #include "folder.h"
48 #include "inc.h"
49 #include "log.h"
50 #include "compose.h"
51 #include "procmsg.h"
52 #include "import.h"
53 #include "export.h"
54 #include "edittags.h"
55 #include "password.h"
56 #include "prefs_common.h"
57 #include "prefs_actions.h"
58 #include "prefs_filtering.h"
59 #include "prefs_account.h"
60 #include "prefs_summary_column.h"
61 #include "prefs_folder_column.h"
62 #include "prefs_template.h"
63 #include "action.h"
64 #include "account.h"
65 #ifndef USE_ALT_ADDRBOOK
66         #include "addressbook.h"
67 #else
68         #include "addressbook-dbus.h"
69 #endif
70 #include "logwindow.h"
71 #include "manage_window.h"
72 #include "alertpanel.h"
73 #include "statusbar.h"
74 #include "inputdialog.h"
75 #include "utils.h"
76 #include "gtkutils.h"
77 #include "codeconv.h"
78 #include "about.h"
79 #include "manual.h"
80 #include "version.h"
81 #include "ssl_manager.h"
82 #include "sslcertwindow.h"
83 #include "prefs_gtk.h"
84 #include "pluginwindow.h"
85 #include "hooks.h"
86 #include "progressindicator.h"
87 #include "localfolder.h"
88 #include "filtering.h"
89 #include "folderutils.h"
90 #include "foldersort.h"
91 #include "icon_legend.h"
92 #include "colorlabel.h"
93 #include "tags.h"
94 #include "textview.h"
95 #include "imap.h"
96 #include "news.h"
97 #include "socket.h"
98 #include "printing.h"
99 #include "send_message.h"
100 #ifdef G_OS_WIN32
101 #include "w32lib.h"
102 #endif
103
104 #define AC_LABEL_WIDTH  240
105
106 /* list of all instantiated MainWindow */
107 static GList *mainwin_list = NULL;
108
109 static GdkCursor *watch_cursor = NULL;
110 static GdkCursor *hand_cursor = NULL;
111
112 static gint iconified_count = 0;
113
114 static void main_window_menu_callback_block     (MainWindow     *mainwin);
115 static void main_window_menu_callback_unblock   (MainWindow     *mainwin);
116
117 static void main_window_show_cur_account        (MainWindow     *mainwin);
118 #ifndef GENERIC_UMPC
119 static void main_window_separation_change       (MainWindow     *mainwin,
120                                                  LayoutType      layout_mode);
121 #endif
122 static void main_window_set_widgets             (MainWindow     *mainwin,
123                                                  LayoutType      layout_mode);
124
125 static void toolbar_child_attached              (GtkWidget      *widget,
126                                                  GtkWidget      *child,
127                                                  gpointer        data);
128 static void toolbar_child_detached              (GtkWidget      *widget,
129                                                  GtkWidget      *child,
130                                                  gpointer        data);
131 #ifndef GENERIC_UMPC
132 static gboolean ac_label_button_pressed         (GtkWidget      *widget,
133                                                  GdkEventButton *event,
134                                                  gpointer        data);
135 #endif
136 static gint main_window_close_cb                (GtkWidget      *widget,
137                                                  GdkEventAny    *event,
138                                                  gpointer        data);
139
140 static void main_window_size_allocate_cb        (GtkWidget      *widget,
141                                                  GtkAllocation  *allocation,
142                                                  gpointer        data);
143 static void folder_window_size_allocate_cb      (GtkWidget      *widget,
144                                                  GtkAllocation  *allocation,
145                                                  gpointer        data);
146 static void message_window_size_allocate_cb     (GtkWidget      *widget,
147                                                  GtkAllocation  *allocation,
148                                                  gpointer        data);
149
150 static void update_folderview_cb (GtkAction     *action,
151                                   gpointer       data);
152 static void add_mailbox_cb       (GtkAction     *action,
153                                   gpointer       data);
154 static void foldersort_cb        (GtkAction     *action,
155                                   gpointer       data);
156 static void import_mbox_cb       (GtkAction     *action,
157                                   gpointer       data);
158 static void export_mbox_cb       (GtkAction     *action,
159                                   gpointer       data);
160 static void export_list_mbox_cb  (GtkAction     *action,
161                                   gpointer       data);
162 static void empty_trash_cb       (GtkAction     *action,
163                                   gpointer       data);
164 static void save_as_cb           (GtkAction     *action,
165                                   gpointer       data);
166 static void page_setup_cb        (GtkAction     *action,
167                                   gpointer       data);
168 static void print_cb             (GtkAction     *action,
169                                   gpointer       data);
170 static void app_exit_cb          (GtkAction     *action,
171                                   gpointer       data);
172
173
174 static void search_cb            (GtkAction     *action,
175                                   gpointer       data);
176 static void search_folder_cb     (GtkAction     *action,
177                                   gpointer       data);
178
179 static void toggle_message_cb    (GtkAction     *action,
180                                   gpointer       data);
181 static void toggle_toolbar_cb    (GtkAction *action, GtkRadioAction *current, gpointer data);
182 static void toggle_col_headers_cb(GtkAction     *action,
183                                   gpointer       data);
184 #ifndef GENERIC_UMPC
185 static void toggle_statusbar_cb  (GtkAction     *action,
186                                   gpointer       data);
187 static void set_layout_cb        (GtkAction *action, GtkRadioAction *current, gpointer data);
188 #endif
189 static void addressbook_open_cb (GtkAction      *action,
190                                   gpointer       data);
191 static void log_window_show_cb  (GtkAction      *action,
192                                   gpointer       data);
193 static void filtering_debug_window_show_cb      (GtkAction      *action,
194                                   gpointer       data);
195 #ifdef G_OS_WIN32
196 static void debug_log_show_cb(GtkAction *action, gpointer data);
197 #endif
198
199 static void inc_cancel_cb               (GtkAction      *action,
200                                   gpointer       data);
201 static void send_cancel_cb              (GtkAction      *action,
202                                   gpointer       data);
203
204 static void open_msg_cb                 (GtkAction      *action,
205                                   gpointer       data);
206
207 static void view_source_cb              (GtkAction      *action,
208                                   gpointer       data);
209
210 static void show_all_header_cb          (GtkAction      *action,
211                                   gpointer       data);
212 static void toggle_fullscreen_cb        (GtkAction      *action,
213                                   gpointer       data);
214 static void toggle_menubar_cb   (GtkAction      *action,
215                                   gpointer       data);
216
217 static void hide_quotes_cb(GtkAction    *action,
218                                   gpointer       data);
219
220 static void move_to_cb                  (GtkAction      *action,
221                                   gpointer       data);
222 static void copy_to_cb                  (GtkAction      *action,
223                                   gpointer       data);
224 static void delete_cb                   (GtkAction      *action,
225                                   gpointer       data);
226 static void delete_trash_cb                     (GtkAction      *action,
227                                   gpointer       data);
228
229 static void cancel_cb                   (GtkAction      *action,
230                                   gpointer       data);
231
232 static void mark_cb                     (GtkAction      *action,
233                                   gpointer       data);
234 static void unmark_cb                   (GtkAction      *action,
235                                   gpointer       data);
236
237 static void mark_as_unread_cb           (GtkAction      *action,
238                                   gpointer       data);
239 static void mark_as_read_cb             (GtkAction      *action,
240                                   gpointer       data);
241 static void mark_all_read_cb            (GtkAction      *action,
242                                   gpointer       data);
243 static void mark_all_unread_cb          (GtkAction      *action,
244                                   gpointer       data);
245 static void mark_as_spam_cb             (GtkAction      *action,
246                                   gpointer       data);
247 static void mark_as_ham_cb              (GtkAction      *action,
248                                   gpointer       data);
249
250 static void ignore_thread_cb            (GtkAction      *action,
251                                   gpointer       data);
252 static void unignore_thread_cb          (GtkAction      *action,
253                                   gpointer       data);
254 static void watch_thread_cb             (GtkAction      *action,
255                                   gpointer       data);
256 static void unwatch_thread_cb           (GtkAction      *action,
257                                   gpointer       data);
258 static void lock_msgs_cb                (GtkAction      *action,
259                                   gpointer       data);
260 static void unlock_msgs_cb              (GtkAction      *action,
261                                   gpointer       data);
262
263 static void reedit_cb                   (GtkAction      *action,
264                                   gpointer       data);
265
266 static void add_address_cb              (GtkAction      *action,
267                                   gpointer       data);
268
269 static void set_charset_cb              (GtkAction *action, GtkRadioAction *current, gpointer data);
270
271 static void set_decode_cb               (GtkAction *action, GtkRadioAction *current, gpointer data);
272
273 static void hide_read_messages   (GtkAction     *action,
274                                   gpointer       data);
275 static void hide_read_threads   (GtkAction      *action,
276                                   gpointer       data);
277 static void hide_del_messages   (GtkAction      *action,
278                                   gpointer       data);
279
280 static void thread_cb            (GtkAction     *action,
281                                   gpointer       data);
282 static void expand_threads_cb    (GtkAction     *action,
283                                   gpointer       data);
284 static void collapse_threads_cb  (GtkAction     *action,
285                                   gpointer       data);
286
287 static void set_summary_display_item_cb  (GtkAction     *action,
288                                   gpointer       data);
289 static void set_folder_display_item_cb   (GtkAction     *action,
290                                   gpointer       data);
291 static void sort_summary_cb      (GtkAction *action, GtkRadioAction *current, gpointer data);
292 static void sort_summary_type_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
293 static void attract_by_subject_cb(GtkAction     *action,
294                                   gpointer       data);
295
296 static void delete_duplicated_cb (GtkAction     *action,
297                                   gpointer       data);
298 static void delete_duplicated_all_cb (GtkAction *action,
299                                   gpointer       data);
300 static void filter_cb            (GtkAction     *action,
301                                   gpointer       data);
302 static void filter_list_cb       (GtkAction     *action,
303                                   gpointer       data);
304 static void process_cb           (GtkAction     *action,
305                                   gpointer       data);
306 static void execute_summary_cb   (GtkAction     *action,
307                                   gpointer       data);
308 static void expunge_summary_cb   (GtkAction     *action,
309                                   gpointer       data);
310 static void update_summary_cb    (GtkAction     *action,
311                                   gpointer       data);
312
313 static void prev_cb              (GtkAction     *action,
314                                   gpointer       data);
315 static void next_cb              (GtkAction     *action,
316                                   gpointer       data);
317 static void next_unread_cb       (GtkAction     *action,
318                                   gpointer       data);
319 static void prev_unread_cb       (GtkAction     *action,
320                                   gpointer       data);
321
322 static void prev_new_cb          (GtkAction     *action,
323                                   gpointer       data);
324 static void next_new_cb          (GtkAction     *action,
325                                   gpointer       data);
326 static void prev_marked_cb       (GtkAction     *action,
327                                   gpointer       data);
328 static void next_marked_cb       (GtkAction     *action,
329                                   gpointer       data);
330 static void prev_labeled_cb      (GtkAction     *action,
331                                   gpointer       data);
332 static void next_labeled_cb      (GtkAction     *action,
333                                   gpointer       data);
334 static void prev_history_cb      (GtkAction     *action,
335                                   gpointer       data);
336 static void next_history_cb      (GtkAction     *action,
337                                   gpointer       data);
338 static void parent_cb            (GtkAction     *action,
339                                   gpointer       data);
340
341 static void goto_folder_cb       (GtkAction     *action,
342                                   gpointer       data);
343 static void goto_unread_folder_cb(GtkAction     *action,
344                                   gpointer       data);
345
346 static void scroll_prev_line_cb  (GtkAction      *action,
347                                   gpointer        data);
348 static void scroll_next_line_cb  (GtkAction      *action,
349                                   gpointer        data);
350 static void scroll_prev_page_cb  (GtkAction      *action,
351                                   gpointer        data);
352 static void scroll_next_page_cb  (GtkAction      *action,
353                                   gpointer        data);
354
355 static void copy_cb              (GtkAction     *action,
356                                   gpointer       data);
357 static void allsel_cb            (GtkAction     *action,
358                                   gpointer       data);
359 static void select_thread_cb     (GtkAction     *action,
360                                   gpointer       data);
361 static void trash_thread_cb      (GtkAction     *action,
362                                   gpointer       data);
363 static void delete_thread_cb     (GtkAction     *action,
364                                   gpointer       data);
365
366 static void create_filter_cb     (GtkAction     *action,
367                                   gpointer       data);
368 static void create_processing_cb (GtkAction     *action,
369                                   gpointer       data);
370 static void open_urls_cb         (GtkAction     *action,
371                                   gpointer       data);
372
373 static void prefs_template_open_cb      (GtkAction      *action,
374                                   gpointer       data);
375 static void prefs_actions_open_cb       (GtkAction      *action,
376                                   gpointer       data);
377 static void prefs_tags_open_cb          (GtkAction      *action,
378                                   gpointer       data);
379 static void prefs_account_open_cb       (GtkAction      *action,
380                                   gpointer       data);
381
382 static void prefs_pre_processing_open_cb  (GtkAction    *action,
383                                   gpointer       data);
384
385 static void prefs_post_processing_open_cb (GtkAction    *action,
386                                   gpointer       data);
387
388 static void prefs_filtering_open_cb     (GtkAction      *action,
389                                   gpointer       data);
390 #ifdef USE_GNUTLS
391 static void ssl_manager_open_cb         (GtkAction      *action,
392                                   gpointer       data);
393 #endif
394 static void new_account_cb       (GtkAction     *action,
395                                   gpointer       data);
396
397 static void account_selector_menu_cb     (GtkMenuItem   *menuitem,
398                                           gpointer       data);
399 static void account_receive_menu_cb      (GtkMenuItem   *menuitem,
400                                           gpointer       data);
401 #ifndef GENERIC_UMPC
402 static void account_compose_menu_cb      (GtkMenuItem   *menuitem,
403                                           gpointer       data);
404 #endif
405 static void prefs_open_cb       (GtkAction      *action,
406                                   gpointer       data);
407 static void plugins_open_cb     (GtkAction      *action,
408                                   gpointer       data);
409
410 static void online_switch_clicked(GtkButton     *btn, 
411                                   gpointer data);
412
413 static void manual_open_cb       (GtkAction     *action,
414                                   gpointer       data);
415 static void manual_faq_open_cb   (GtkAction     *action,
416                                   gpointer       data);
417
418 static void legend_open_cb       (GtkAction     *action,
419                                   gpointer       data);
420
421 #ifdef G_OS_WIN32
422 static void set_default_client_cb (GtkAction    *action,
423                                   gpointer       data);
424 #endif
425
426 static void scan_tree_func       (Folder        *folder,
427                                   FolderItem    *item,
428                                   gpointer       data);
429                                   
430 static void toggle_work_offline_cb(GtkAction    *action,
431                                   gpointer       data);
432
433 static void addr_harvest_cb      ( GtkAction    *action,
434                                   gpointer       data );
435
436 static void addr_harvest_msg_cb  ( GtkAction    *action,
437                                   gpointer       data );
438 static void sync_cb              ( GtkAction    *action,
439                                   gpointer       data );
440
441 static void forget_session_passwords_cb (GtkAction      *action,
442                                          gpointer        data );
443 #ifndef PASSWORD_CRYPTO_OLD
444 static void forget_master_passphrase_cb (GtkAction      *action,
445                                          gpointer        data );
446 #endif
447 static gboolean mainwindow_focus_in_event       (GtkWidget      *widget, 
448                                                  GdkEventFocus  *focus,
449                                                  gpointer        data);
450 static gboolean mainwindow_visibility_event_cb  (GtkWidget      *widget, 
451                                                  GdkEventVisibility     *state,
452                                                  gpointer        data);
453 static gboolean mainwindow_state_event_cb       (GtkWidget      *widget, 
454                                                  GdkEventWindowState    *state,
455                                                  gpointer        data);
456 static void main_window_reply_cb                        (GtkAction      *action,
457                                   gpointer       data);
458 static gboolean mainwindow_progressindicator_hook       (gpointer        source,
459                                                  gpointer        userdata);
460
461 static gint mailing_list_create_submenu(MainWindow *mainwindow,
462                                        MsgInfo *msginfo);
463
464 static gint mailing_list_populate_submenu(GtkWidget *menu, const gchar * list_header);
465         
466 static void get_url_part(const gchar **buf, gchar *url_decoded);
467
468 static void mailing_list_compose(GtkWidget *w, gpointer *data);
469  
470 static void mailing_list_open_uri(GtkWidget *w, gpointer *data);
471 #define  SEPARATE_ACTION 500 
472 static void mainwindow_quicksearch              (GtkAction      *action,
473                                   gpointer       data);
474 static gboolean any_folder_want_synchronise(void);
475
476 static void save_part_as_cb(GtkAction *action, gpointer data);
477 static void view_part_as_text_cb(GtkAction *action, gpointer data);
478 static void open_part_cb(GtkAction *action, gpointer data);
479 #ifndef G_OS_WIN32
480 static void open_part_with_cb(GtkAction *action, gpointer data);
481 #endif
482 static void check_signature_cb(GtkAction *action, gpointer data);
483 static void goto_next_part_cb(GtkAction *action, gpointer data);
484 static void goto_prev_part_cb(GtkAction *action, gpointer data);
485 #define DO_ACTION(name, act)    { if (!strcmp(a_name, name)) action = act; }
486
487 static void mainwindow_nothing_cb          (GtkAction *action, gpointer data)
488 {
489
490 }
491
492 static void about_cb(GtkAction *gaction, gpointer data)
493 {
494         about_show();
495 }
496
497 static void     mw_inc_mail_cb                  (GtkAction *gaction, gpointer data)
498 {
499         inc_mail_cb(data, 0, NULL);
500 }
501 static void     mw_inc_all_account_mail_cb              (GtkAction *gaction, gpointer data)
502 {
503         inc_all_account_mail_cb(data, 0, NULL);
504 }
505 static void     mw_send_queue_cb                        (GtkAction *gaction, gpointer data)
506 {
507         send_queue_cb(data, 0, NULL);
508 }
509 static void     mw_compose_mail_cb                      (GtkAction *gaction, gpointer data)
510 {
511         compose_mail_cb(data, 0, NULL);
512 }
513 static void     mw_compose_news_cb                      (GtkAction *gaction, gpointer data)
514 {
515         compose_news_cb(data, 0, NULL);
516 }
517
518 static GtkActionEntry mainwin_entries[] =
519 {
520         {"Menu",                        NULL, "Menu", NULL, NULL, NULL },
521 /* menus */
522         {"File",                        NULL, N_("_File"), NULL, NULL, NULL },
523         {"Edit",                        NULL, N_("_Edit"), NULL, NULL, NULL },
524         {"View",                        NULL, N_("_View"), NULL, NULL, NULL },
525         {"Message",                     NULL, N_("_Message"), NULL, NULL, NULL },
526         {"Tools",                       NULL, N_("_Tools"), NULL, NULL, NULL },
527         {"Configuration",               NULL, N_("_Configuration"), NULL, NULL, NULL },
528         {"Help",                        NULL, N_("_Help"), NULL, NULL, NULL },
529
530 /* File menu */
531         {"File/AddMailbox",             NULL, N_("_Add mailbox"), NULL, NULL, NULL },
532         {"File/AddMailbox/MH",          NULL, N_("MH..."), NULL, NULL, G_CALLBACK(add_mailbox_cb) },
533         {"File/---",                    NULL, "---", NULL, NULL, NULL },
534
535         {"File/SortMailboxes",          NULL, N_("Change mailbox order..."), NULL, NULL, G_CALLBACK(foldersort_cb) },
536
537         /* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
538         {"File/ImportMbox",             NULL, N_("_Import mbox file..."), NULL, NULL, G_CALLBACK(import_mbox_cb) },
539         {"File/ExportMbox",             NULL, N_("_Export to mbox file..."), NULL, NULL, G_CALLBACK(export_mbox_cb) },
540         {"File/ExportSelMbox",          NULL, N_("_Export selected to mbox file..."), NULL, NULL, G_CALLBACK(export_list_mbox_cb) },
541         /* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
542         {"File/EmptyTrashes",           NULL, N_("Empty all _Trash folders"), "<shift>D", NULL, G_CALLBACK(empty_trash_cb) },
543         /* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
544
545         {"File/SaveAs",                 NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
546         {"File/SavePartAs",             NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
547         /* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
548
549         {"File/PageSetup",              NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
550         {"File/Print",                  NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
551         /* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
552         {"File/SynchroniseFolders",     NULL, N_("Synchronise folders"), "<control><shift>S", NULL, G_CALLBACK(sync_cb) }, 
553         /* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
554         {"File/Exit",                   NULL, N_("E_xit"), "<control>Q", NULL, G_CALLBACK(app_exit_cb) }, 
555
556 /* Edit menu */
557         {"Edit/Copy",                   NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) }, 
558         {"Edit/SelectAll",              NULL, N_("Select _all"), "<control>A", NULL, G_CALLBACK(allsel_cb) }, 
559         {"Edit/SelectThread",           NULL, N_("Select _thread"), NULL, NULL, G_CALLBACK(select_thread_cb) }, 
560         {"Edit/---",                    NULL, "---", NULL, NULL, NULL },
561         {"Edit/Find",                   NULL, N_("_Find in current message..."), "<control>F", NULL, G_CALLBACK(search_cb) },
562         {"Edit/SearchFolder",                   NULL, N_("_Search folder..."), "<shift><control>F", NULL, G_CALLBACK(search_folder_cb) },
563         {"Edit/QuickSearch",                    NULL, N_("_Quick search"), "slash", NULL, G_CALLBACK(mainwindow_quicksearch) },
564
565 /* View menu */
566         {"View/ShowHide",               NULL, N_("Show or hi_de"), NULL, NULL, NULL },
567         {"View/ShowHide/Toolbar",       NULL, N_("_Toolbar"), NULL, NULL, NULL },
568
569         {"View/SetColumns",             NULL, N_("Set displayed _columns"), NULL, NULL, NULL },
570         {"View/SetColumns/Folderlist",  NULL, N_("In _folder list..."), NULL, NULL, G_CALLBACK(set_folder_display_item_cb) },
571         {"View/SetColumns/Messagelist", NULL, N_("In _message list..."), NULL, NULL, G_CALLBACK(set_summary_display_item_cb) },
572         {"View/---",                    NULL, "---", NULL, NULL, NULL },
573
574
575 #ifndef GENERIC_UMPC
576         {"View/Layout",                 NULL, N_("La_yout"), NULL, NULL, NULL },
577 #endif
578         {"View/Sort",                   NULL, N_("_Sort"), NULL, NULL, NULL },
579         {"View/Sort/---",               NULL, "---", NULL, NULL, NULL }, 
580         {"View/Sort/AttractSubj",               NULL, N_("_Attract by subject"), NULL, NULL, G_CALLBACK(attract_by_subject_cb) }, 
581
582         {"View/ExpandThreads",                  NULL, N_("E_xpand all threads"), NULL, NULL, G_CALLBACK(expand_threads_cb) }, 
583         {"View/CollapseThreads",                NULL, N_("Co_llapse all threads"), NULL, NULL, G_CALLBACK(collapse_threads_cb) }, 
584
585         {"View/Goto",                   NULL, N_("_Go to"), NULL, NULL, NULL },
586         {"View/Goto/Prev",              NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
587         {"View/Goto/Next",              NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
588         {"View/Goto/---",               NULL, "---", NULL, NULL, NULL },
589         {"View/Goto/PrevUnread",        NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
590         {"View/Goto/NextUnread",        NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
591         /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
592         {"View/Goto/PrevNew",           NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
593         {"View/Goto/NextNew",           NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
594         /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
595         {"View/Goto/PrevMarked",        NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
596         {"View/Goto/NextMarked",        NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
597         /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
598         {"View/Goto/PrevLabeled",       NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
599         {"View/Goto/NextLabeled",       NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
600         /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
601         {"View/Goto/PrevHistory",       NULL, N_("Previous opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
602         {"View/Goto/NextHistory",       NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
603         /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
604         {"View/Goto/ParentMessage",     NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
605         /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
606         {"View/Goto/NextUnreadFolder",  NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
607         {"View/Goto/Folder",            NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
608         /* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
609         {"View/Goto/NextPart",          NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
610         {"View/Goto/PrevPart",          NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
611
612         /* {"View/Scroll/---",          NULL, "---", NULL, NULL, NULL }, */
613         {"View/Scroll",                 NULL, N_("Message scroll"), NULL, NULL, NULL },
614         {"View/Scroll/PrevLine",        NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
615         {"View/Scroll/NextLine",        NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
616         {"View/Scroll/PrevPage",        NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
617         {"View/Scroll/NextPage",        NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
618
619         /* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
620         {"View/Encoding",               NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
621         {"View/Encoding/---",           NULL, "---", NULL, NULL, NULL },
622 #define ENC_ACTION(cs_char,c_char,string) \
623         { "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
624
625         {"View/Encoding/Western",       NULL, N_("Western European"), NULL, NULL, NULL },
626         {"View/Encoding/Baltic",        NULL, N_("Baltic"), NULL, NULL, NULL },
627         {"View/Encoding/Hebrew",        NULL, N_("Hebrew"), NULL, NULL, NULL },
628         {"View/Encoding/Arabic",        NULL, N_("Arabic"), NULL, NULL, NULL },
629         {"View/Encoding/Cyrillic",      NULL, N_("Cyrillic"), NULL, NULL, NULL },
630         {"View/Encoding/Japanese",      NULL, N_("Japanese"), NULL, NULL, NULL },
631         {"View/Encoding/Chinese",       NULL, N_("Chinese"), NULL, NULL, NULL },
632         {"View/Encoding/Korean",        NULL, N_("Korean"), NULL, NULL, NULL },
633         {"View/Encoding/Thai",          NULL, N_("Thai"), NULL, NULL, NULL },
634
635         {"View/Decode",                 NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
636         {"View/Decode/---",             NULL, "---", NULL, NULL, NULL },
637
638 #define DEC_ACTION(cs_type,c_type,string) \
639         { "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
640
641         /* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
642         {"View/OpenNewWindow",          NULL, N_("Open in new _window"), "<control><alt>N", NULL, G_CALLBACK(open_msg_cb) },
643         {"View/MessageSource",          NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
644         /* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
645         {"View/Part",                   NULL, N_("Message part"), NULL, NULL, NULL },
646         {"View/Part/AsText",            NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
647         {"View/Part/Open",              NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
648 #ifndef G_OS_WIN32
649         {"View/Part/OpenWith",          NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
650 #endif
651         /* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
652
653         {"View/Quotes",                 NULL, N_("Quotes"), NULL, NULL, NULL }, 
654         /* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
655         {"View/UpdateSummary",          NULL, N_("_Update summary"), "<control><alt>U", NULL, G_CALLBACK(update_summary_cb) },
656
657 /* Message menu */
658         {"Message/Receive",                              NULL, N_("Recei_ve"), NULL, NULL, NULL },
659         {"Message/Receive/CurrentAccount",               NULL, N_("Get from _current account"), "<control>I", NULL, G_CALLBACK(mw_inc_mail_cb) },
660         {"Message/Receive/AllAccounts",                  NULL, N_("Get from _all accounts"), "<shift><control>I", NULL, G_CALLBACK(mw_inc_all_account_mail_cb) },
661         {"Message/Receive/CancelReceiving",              NULL, N_("Cancel receivin_g"), NULL, NULL, G_CALLBACK(inc_cancel_cb) },
662         {"Message/Receive/---",                          NULL, "---", NULL, NULL, NULL },
663         {"Message/Receive/PlaceHolder",                  NULL, "PlaceHolder,", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
664         {"Message/SendQueue",                            NULL, N_("_Send queued messages"), NULL, NULL, G_CALLBACK(mw_send_queue_cb) },
665         {"Message/CancelSending",                        NULL, N_("Cancel sending"), NULL, NULL, G_CALLBACK(send_cancel_cb) },
666
667         {"Message/---",                                  NULL, "---", NULL, NULL, NULL },
668
669         {"Message/ComposeEmail",                         NULL, N_("Compose a_n email message"), "<control>M", NULL, G_CALLBACK(mw_compose_mail_cb) },
670         {"Message/ComposeNews",                          NULL, N_("Compose a news message"), NULL, NULL, G_CALLBACK(mw_compose_news_cb) },
671
672         {"Message/Reply",                                NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY */
673         {"Message/ReplyTo",                              NULL, N_("Repl_y to"), NULL, NULL, NULL }, 
674         {"Message/ReplyTo/All",                          NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
675         {"Message/ReplyTo/Sender",                       NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
676         {"Message/ReplyTo/List",                         NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
677         {"Message/FollowupReply",                        NULL, N_("Follow-up and reply to"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FOLLOWUP_AND_REPLY_TO */
678         /* {"Message/---",                               NULL, "---", NULL, NULL, NULL }, */
679
680         {"Message/Forward",                              NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_INLINE */
681         {"Message/ForwardAtt",                           NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
682         {"Message/Redirect",                             NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REDIRECT */
683
684         {"Message/MailingList",                          NULL, N_("Mailing-_List"), NULL, NULL, NULL }, 
685         {"Message/MailingList/Post",                     NULL, N_("Post"), NULL, NULL, NULL }, 
686         {"Message/MailingList/Post/PlaceHolder",         NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
687         {"Message/MailingList/Help",                     NULL, N_("Help"), NULL, NULL, NULL }, 
688         {"Message/MailingList/Help/PlaceHolder",         NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
689         {"Message/MailingList/Subscribe",                NULL, N_("Subscribe"), NULL, NULL, NULL }, 
690         {"Message/MailingList/Subscribe/PlaceHolder",    NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
691         {"Message/MailingList/Unsubscribe",              NULL, N_("Unsubscribe"), NULL, NULL, NULL }, 
692         {"Message/MailingList/Unsubscribe/PlaceHolder",  NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
693         {"Message/MailingList/ViewArchive",              NULL, N_("View archive"), NULL, NULL, NULL }, 
694         {"Message/MailingList/ViewArchive/PlaceHolder",  NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
695         {"Message/MailingList/ContactOwner",             NULL, N_("Contact owner"), NULL, NULL, NULL }, 
696         {"Message/MailingList/ContactOwner/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
697         /* separation */
698
699         {"Message/Move",                             NULL, N_("M_ove..."), "<control>O", NULL, G_CALLBACK(move_to_cb) },
700         {"Message/Copy",                             NULL, N_("_Copy..."), "<shift><control>O", NULL, G_CALLBACK(copy_to_cb) },
701         {"Message/Trash",                            NULL, N_("Move to _trash"), "<control>D", NULL, G_CALLBACK(delete_trash_cb) },
702         {"Message/Delete",                           NULL, N_("_Delete..."), NULL, NULL, G_CALLBACK(delete_cb) },
703         {"Message/TrashThread",                      NULL, N_("Move thread to tr_ash"), NULL, NULL, G_CALLBACK(trash_thread_cb) }, 
704         {"Message/DeleteThread",                     NULL, N_("Delete t_hread"), NULL, NULL, G_CALLBACK(delete_thread_cb) }, 
705         {"Message/CancelNews",                       NULL, N_("Cancel a news message"), NULL, NULL, G_CALLBACK(cancel_cb) },
706         /* separation */
707         
708         {"Message/Mark",                             NULL, N_("_Mark"), NULL, NULL, NULL },
709         {"Message/Mark/Mark",                        NULL, N_("_Mark"), "<shift>asterisk", NULL, G_CALLBACK(mark_cb) },
710         {"Message/Mark/Unmark",                      NULL, N_("_Unmark"), "U", NULL, G_CALLBACK(unmark_cb) },
711         {"Message/Mark/---",                         NULL, "---", NULL, NULL, NULL },
712
713         {"Message/Mark/MarkRead",                    NULL, N_("Mark as rea_d"), NULL, NULL, G_CALLBACK(mark_as_read_cb) },
714         {"Message/Mark/MarkUnread",                  NULL, N_("Mark as unr_ead"), "<shift>exclam", NULL, G_CALLBACK(mark_as_unread_cb) },
715         /* separation */
716         {"Message/Mark/MarkAllRead",                 NULL, N_("Mark all read"), NULL, NULL, G_CALLBACK(mark_all_read_cb) },
717         {"Message/Mark/MarkAllUnread",               NULL, N_("Mark all unread"), NULL, NULL, G_CALLBACK(mark_all_unread_cb) },
718         /* separation */
719         {"Message/Mark/IgnoreThread",                NULL, N_("Ignore thread"), NULL, NULL, G_CALLBACK(ignore_thread_cb) },
720         {"Message/Mark/UnignoreThread",              NULL, N_("Unignore thread"), NULL, NULL, G_CALLBACK(unignore_thread_cb) },
721         {"Message/Mark/WatchThread",                 NULL, N_("Watch thread"), NULL, NULL, G_CALLBACK(watch_thread_cb) },
722         {"Message/Mark/UnwatchThread",               NULL, N_("Unwatch thread"), NULL, NULL, G_CALLBACK(unwatch_thread_cb) },
723         /* separation */
724
725         {"Message/Mark/MarkSpam",                    NULL, N_("Mark as _spam"), NULL, NULL, G_CALLBACK(mark_as_spam_cb) },
726         {"Message/Mark/MarkHam",                     NULL, N_("Mark as _ham"), NULL, NULL, G_CALLBACK(mark_as_ham_cb) },
727         /* separation */
728
729         {"Message/Mark/Lock",                        NULL, N_("Lock"), NULL, NULL, G_CALLBACK(lock_msgs_cb) },
730         {"Message/Mark/Unlock",                      NULL, N_("Unlock"), NULL, NULL, G_CALLBACK(unlock_msgs_cb) },
731
732         {"Message/ColorLabel",                       NULL, N_("Color la_bel"), NULL, NULL, NULL },
733         {"Message/Tags",                             NULL, N_("Ta_gs"), NULL, NULL, NULL },
734         /*{"Message/---",                            NULL, "---", NULL, NULL, NULL },*/
735
736         {"Message/Reedit",                           NULL, N_("Re-_edit"), NULL, NULL, G_CALLBACK(reedit_cb) },
737         /*{"Message/---",                            NULL, "---", NULL, NULL, NULL },*/
738
739         {"Message/CheckSignature",                   NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
740
741 /* Tools menu */
742
743         {"Tools/AddressBook",                        NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) }, 
744         {"Tools/AddSenderToAB",                      NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) }, 
745
746         {"Tools/CollectAddresses",                   NULL, N_("C_ollect addresses"), NULL, NULL, NULL }, 
747         {"Tools/CollectAddresses/FromFolder",        NULL, N_("From current _folder..."), NULL, NULL, G_CALLBACK(addr_harvest_cb) }, 
748         {"Tools/CollectAddresses/FromSelected",      NULL, N_("From selected _messages..."), NULL, NULL, G_CALLBACK(addr_harvest_msg_cb) }, 
749         {"Tools/---",                                NULL, "---", NULL, NULL, NULL },
750
751         {"Tools/FilterFolder",                       NULL, N_("_Filter all messages in folder"), NULL, NULL, G_CALLBACK(filter_cb) }, 
752         {"Tools/FilterSelected",                     NULL, N_("Filter _selected messages"), NULL, NULL, G_CALLBACK(filter_list_cb) }, 
753         {"Tools/RunProcessing",                      NULL, N_("Run folder pr_ocessing rules"), NULL, NULL, G_CALLBACK(process_cb) }, 
754
755         {"Tools/CreateFilterRule",                   NULL, N_("_Create filter rule"), NULL, NULL, NULL },
756         {"Tools/CreateFilterRule/Automatically",     NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
757         {"Tools/CreateFilterRule/ByFrom",            NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
758         {"Tools/CreateFilterRule/ByTo",              NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO     */
759         {"Tools/CreateFilterRule/BySubject",         NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
760
761         {"Tools/CreateProcessingRule",               NULL, N_("Create processing rule"), NULL, NULL, NULL },
762         {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
763         {"Tools/CreateProcessingRule/ByFrom",        NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
764         {"Tools/CreateProcessingRule/ByTo",          NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
765         {"Tools/CreateProcessingRule/BySubject",     NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) }, 
766         /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
767
768         {"Tools/ListUrls",                           NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) }, 
769
770         /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
771         {"Tools/Actions",                            NULL, N_("Actio_ns"), NULL, NULL, NULL },
772         {"Tools/Actions/PlaceHolder",                NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
773         /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
774
775         {"Tools/CheckNewMessages",                   NULL, N_("Ch_eck for new messages in all folders"), NULL, NULL, G_CALLBACK(update_folderview_cb) }, 
776         {"Tools/DeleteDuplicates",                   NULL, N_("Delete du_plicated messages"), NULL, NULL, NULL },
777         {"Tools/DeleteDuplicates/SelFolder",         NULL, N_("In selected folder"), NULL, NULL, G_CALLBACK(delete_duplicated_cb) },
778         {"Tools/DeleteDuplicates/AllFolders",        NULL, N_("In all folders"), NULL, NULL, G_CALLBACK(delete_duplicated_all_cb) },
779         /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
780
781         {"Tools/Execute",                            NULL, N_("E_xecute"), "X", NULL, G_CALLBACK(execute_summary_cb) }, 
782         {"Tools/Expunge",                            NULL, N_("Exp_unge"), "<control>E", NULL, G_CALLBACK(expunge_summary_cb) }, 
783 #ifdef USE_GNUTLS
784         /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
785         {"Tools/SSLCertificates",                    NULL, N_("SSL/TLS cer_tificates"), NULL, NULL, G_CALLBACK(ssl_manager_open_cb) }, 
786 #endif
787         /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
788         {"Tools/FilteringLog",                       NULL, N_("Filtering Lo_g"), NULL, NULL, G_CALLBACK(filtering_debug_window_show_cb) }, 
789         {"Tools/NetworkLog",                         NULL, N_("Network _Log"), "<shift><control>L", NULL, G_CALLBACK(log_window_show_cb) }, 
790 #ifdef G_OS_WIN32
791         {"Tools/DebugLog",                           NULL, N_("Debug _Log"), NULL, NULL, G_CALLBACK(debug_log_show_cb) },
792 #endif
793         /* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
794         {"Tools/ForgetSessionPasswords",             NULL, N_("_Forget all session passwords"), NULL, NULL, G_CALLBACK(forget_session_passwords_cb) }, 
795 #ifndef PASSWORD_CRYPTO_OLD
796         {"Tools/ForgetMasterPassphrase",             NULL, N_("Forget _master passphrase"), NULL, NULL, G_CALLBACK(forget_master_passphrase_cb) },
797 #endif
798
799 /* Configuration menu */        
800         {"Configuration/ChangeAccount",              NULL, N_("C_hange current account"), NULL, NULL, NULL },
801         {"Configuration/ChangeAccount/PlaceHolder",  NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
802         {"Configuration/AccountPrefs",               NULL, N_("_Preferences for current account..."), NULL, NULL, G_CALLBACK(prefs_account_open_cb) },
803         {"Configuration/CreateAccount",              NULL, N_("Create _new account..."), NULL, NULL, G_CALLBACK(new_account_cb) },
804         {"Configuration/EditAccounts",               NULL, N_("_Edit accounts..."), NULL, NULL, G_CALLBACK(account_edit_open) },
805         {"Configuration/---",                        NULL, "---", NULL, NULL, NULL }, 
806
807         {"Configuration/Preferences",                NULL, N_("P_references..."), NULL, NULL, G_CALLBACK(prefs_open_cb) },
808         {"Configuration/PreProcessing",              NULL, N_("Pre-pr_ocessing..."), NULL, NULL, G_CALLBACK(prefs_pre_processing_open_cb) },
809         {"Configuration/PostProcessing",             NULL, N_("Post-pro_cessing..."), NULL, NULL, G_CALLBACK(prefs_post_processing_open_cb) },
810         {"Configuration/Filtering",                  NULL, N_("_Filtering..."), NULL, NULL, G_CALLBACK(prefs_filtering_open_cb) },
811         {"Configuration/Templates",                  NULL, N_("_Templates..."), NULL, NULL, G_CALLBACK(prefs_template_open_cb) },
812         {"Configuration/Actions",                    NULL, N_("_Actions..."), NULL, NULL, G_CALLBACK(prefs_actions_open_cb) },
813         {"Configuration/Tags",                       NULL, N_("Tag_s..."), NULL, NULL, G_CALLBACK(prefs_tags_open_cb) },
814         /* {"Configuration/---",                     NULL, "---", NULL, NULL, NULL }, */
815         {"Configuration/Plugins",                    NULL, N_("Plu_gins..."), NULL, NULL, G_CALLBACK(plugins_open_cb) },
816
817 /* Help menu */
818         {"Help/Manual",                              NULL, N_("_Manual"), NULL, NULL, G_CALLBACK(manual_open_cb) }, 
819         {"Help/FAQ",                                 NULL, N_("_Online User-contributed FAQ"), NULL, NULL, G_CALLBACK(manual_faq_open_cb) }, 
820         {"Help/IconLegend",                          NULL, N_("Icon _Legend"), NULL, NULL, G_CALLBACK(legend_open_cb) }, 
821 #ifdef G_OS_WIN32
822         {"Help/SetDefault",                          NULL, N_("Set as default client"), NULL, NULL, G_CALLBACK(set_default_client_cb) }, 
823 #endif
824         {"Help/---",                                 NULL, "---", NULL, NULL, NULL }, 
825         {"Help/About",                               NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) }, 
826 };
827
828 static GtkToggleActionEntry mainwin_toggle_entries[] = {
829         {"File/OfflineMode",                     NULL, N_("Offline _mode"), "<control>W", NULL, G_CALLBACK(toggle_work_offline_cb), FALSE }, /*toggle*/
830         {"View/ShowHide/MenuBar",                NULL, N_("Men_ubar"), "<control>F12", NULL, G_CALLBACK(toggle_menubar_cb), FALSE }, /* toggle */
831         {"View/ShowHide/MessageView",            NULL, N_("_Message view"), "V", NULL, G_CALLBACK(toggle_message_cb), FALSE }, /* toggle */
832 #ifndef GENERIC_UMPC
833         {"View/ShowHide/StatusBar",              NULL, N_("Status _bar"), NULL, NULL, G_CALLBACK(toggle_statusbar_cb), FALSE }, /* toggle */
834 #endif
835         {"View/ShowHide/ColumnHeaders",          NULL, N_("Column headers"), NULL, NULL, G_CALLBACK(toggle_col_headers_cb), FALSE }, /* toggle */
836         {"View/ThreadView",                      NULL, N_("Th_read view"), "<control>T", NULL, G_CALLBACK(thread_cb), FALSE }, /* toggle */
837         {"View/HideReadThreads",                 NULL, N_("Hide read threads"), NULL, NULL, G_CALLBACK(hide_read_threads), FALSE }, /* toggle */
838         {"View/HideReadMessages",                NULL, N_("_Hide read messages"), NULL, NULL, G_CALLBACK(hide_read_messages), FALSE }, /* toggle */
839         {"View/HideDelMessages",                 NULL, N_("Hide deleted messages"), NULL, NULL, G_CALLBACK(hide_del_messages), FALSE }, /* toggle */
840         {"View/FullScreen",                      NULL, N_("_Fullscreen"), "F11", NULL, G_CALLBACK(toggle_fullscreen_cb), FALSE }, /* toggle */
841         {"View/AllHeaders",                      NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
842         {"View/Quotes/CollapseAll",              NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 1 toggle */
843         {"View/Quotes/Collapse2",                NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 2 toggle */
844         {"View/Quotes/Collapse3",                NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 3 toggle */
845 };
846
847 static GtkRadioActionEntry mainwin_showhide_radio_entries[] = { /* toggle_toolbar_cb */
848         {"View/ShowHide/Toolbar/TextBelowIcon",  NULL, N_("Text _below icons"), NULL, NULL, TOOLBAR_BOTH }, /* radio TOOLBAR_BOTH */
849         {"View/ShowHide/Toolbar/TextBesideIcon", NULL, N_("Text be_side icons"), NULL, NULL, TOOLBAR_BOTH_HORIZ }, /* radio TOOLBAR_BOTH_HORIZ */
850         {"View/ShowHide/Toolbar/IconOnly",       NULL, N_("_Icons only"), NULL, NULL, TOOLBAR_ICON }, /* radio TOOLBAR_ICON */
851         {"View/ShowHide/Toolbar/TextOnly",       NULL, N_("_Text only"), NULL, NULL, TOOLBAR_TEXT }, /* radio TOOLBAR_TEXT */
852 #ifndef GENERIC_UMPC
853         {"View/ShowHide/Toolbar/Hide",           NULL, N_("_Hide"), NULL, NULL, TOOLBAR_NONE }, /* radio TOOLBAR_NONE */
854 #endif
855 };
856 #ifndef GENERIC_UMPC
857 static GtkRadioActionEntry mainwin_layout_radio_entries[] = { /* set_layout_cb */
858         {"View/Layout/Standard",                 NULL, N_("_Standard"), NULL, NULL, NORMAL_LAYOUT }, /* radio NORMAL_LAYOUT */
859         {"View/Layout/ThreeColumns",             NULL, N_("_Three columns"), NULL, NULL, VERTICAL_LAYOUT }, /* radio VERTICAL_LAYOUT */
860         {"View/Layout/WideMessage",              NULL, N_("_Wide message"), NULL, NULL, WIDE_LAYOUT }, /* radio WIDE_LAYOUT */
861         {"View/Layout/WideMessageList",          NULL, N_("W_ide message list"), NULL, NULL, WIDE_MSGLIST_LAYOUT }, /* radio WIDE_MSGLIST_LAYOUT */
862         {"View/Layout/SmallScreen",              NULL, N_("S_mall screen"), NULL, NULL, SMALL_LAYOUT }, /* radio SMALL_LAYOUT */
863 };
864 #endif
865 static GtkRadioActionEntry mainwin_sort_radio_entries[] = { /* sort_summary_cb */
866         {"View/Sort/Number",                     NULL, N_("By _number"), NULL, NULL, SORT_BY_NUMBER }, /* radio SORT_BY_NUMBER */
867         {"View/Sort/Size",                       NULL, N_("By s_ize"), NULL, NULL, SORT_BY_SIZE }, /* radio SORT_BY_SIZE */
868         {"View/Sort/Date",                       NULL, N_("By _date"), NULL, NULL, SORT_BY_DATE }, /* radio SORT_BY_DATE */
869         {"View/Sort/ThreadDate",                 NULL, N_("By thread date"), NULL, NULL, SORT_BY_THREAD_DATE }, /* radio SORT_BY_THREAD_DATE */
870         {"View/Sort/From",                       NULL, N_("By _From"), NULL, NULL, SORT_BY_FROM }, /* radio SORT_BY_FROM */
871         {"View/Sort/To",                         NULL, N_("By _To"), NULL, NULL, SORT_BY_TO }, /* radio SORT_BY_TO */
872         {"View/Sort/Subject",                    NULL, N_("By s_ubject"), NULL, NULL, SORT_BY_SUBJECT }, /* radio SORT_BY_SUBJECT */
873         {"View/Sort/Color",                      NULL, N_("By _color label"), NULL, NULL, SORT_BY_LABEL }, /* radio SORT_BY_LABEL */
874         {"View/Sort/Tag",                        NULL, N_("By tag"), NULL, NULL, SORT_BY_TAGS }, /* radio SORT_BY_TAGS */
875         {"View/Sort/Mark",                       NULL, N_("By _mark"), NULL, NULL, SORT_BY_MARK }, /* radio SORT_BY_MARK */
876         {"View/Sort/Status",                     NULL, N_("By _status"), NULL, NULL, SORT_BY_STATUS }, /* radio SORT_BY_STATUS */
877         {"View/Sort/Attachment",                 NULL, N_("By a_ttachment"), NULL, NULL, SORT_BY_MIME }, /* radio SORT_BY_MIME */
878         {"View/Sort/Score",                      NULL, N_("By score"), NULL, NULL, SORT_BY_SCORE }, /* radio SORT_BY_SCORE */
879         {"View/Sort/Locked",                     NULL, N_("By locked"), NULL, NULL, SORT_BY_LOCKED }, /* radio SORT_BY_LOCKED */
880         {"View/Sort/DontSort",                   NULL, N_("D_on't sort"), NULL, NULL, SORT_BY_NONE }, /* radio SORT_BY_NONE */
881 };
882
883 static GtkRadioActionEntry mainwin_sorttype_radio_entries[] = { /* sort_summary_type_cb */
884         {"View/Sort/Ascending",                  NULL, N_("Ascending"), NULL, NULL, SORT_ASCENDING }, /* radio SORT_ASCENDING */
885         {"View/Sort/Descending",                 NULL, N_("Descending"), NULL, NULL, SORT_DESCENDING }, /* radio SORT_DESCENDING */
886 };
887
888 static GtkRadioActionEntry mainwin_radio_enc_entries[] =
889 {
890         ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO set_charset_cb */
891         ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO set_charset_cb */
892         ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO set_charset_cb */
893         ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO set_charset_cb */
894         ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO set_charset_cb */
895         ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO set_charset_cb */
896         ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO set_charset_cb */
897         ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO set_charset_cb */
898         ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO set_charset_cb */
899         ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO set_charset_cb */
900         ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO set_charset_cb */
901         ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO set_charset_cb */
902         ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO set_charset_cb */
903         ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO set_charset_cb */
904         ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO set_charset_cb */
905         ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO set_charset_cb */
906         ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO set_charset_cb */
907         ENC_ACTION("Cyrillic/"CS_MACCYR, C_MACCYR, "_Mac-Cyrillic"), /* RADIO set_charset_cb */
908         ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO set_charset_cb */
909         ENC_ACTION("Cyrillic/"CS_WINDOWS_1251, C_WINDOWS_1251, "Windows-1251"), /* RADIO set_charset_cb */
910         ENC_ACTION("Japanese/"CS_ISO_2022_JP, C_ISO_2022_JP, "ISO-2022-_JP"), /* RADIO set_charset_cb */
911         ENC_ACTION("Japanese/"CS_ISO_2022_JP_2, C_ISO_2022_JP_2, "ISO-2022-JP-_2"), /* RADIO set_charset_cb */
912         ENC_ACTION("Japanese/"CS_EUC_JP, C_EUC_JP, "_EUC-JP"), /* RADIO set_charset_cb */
913         ENC_ACTION("Japanese/"CS_SHIFT_JIS, C_SHIFT_JIS, "_Shift-JIS"), /* RADIO set_charset_cb */
914         ENC_ACTION("Chinese/"CS_GB18030, C_GB18030, "_GB18030"), /* RADIO set_charset_cb */
915         ENC_ACTION("Chinese/"CS_GB2312, C_GB2312, "_GB2312"), /* RADIO set_charset_cb */
916         ENC_ACTION("Chinese/"CS_GBK, C_GBK, "GB_K"), /* RADIO set_charset_cb */
917         ENC_ACTION("Chinese/"CS_BIG5, C_BIG5, "_Big5-JP"), /* RADIO set_charset_cb */
918         ENC_ACTION("Chinese/"CS_EUC_TW, C_EUC_TW, "EUC-_TW"), /* RADIO set_charset_cb */
919         ENC_ACTION("Korean/"CS_EUC_KR, C_EUC_KR, "_EUC-KR"), /* RADIO set_charset_cb */
920         ENC_ACTION("Korean/"CS_ISO_2022_KR, C_ISO_2022_KR, "_ISO-2022-KR"), /* RADIO set_charset_cb */
921         ENC_ACTION("Thai/"CS_TIS_620, C_TIS_620, "_TIS-620-KR"), /* RADIO set_charset_cb */
922         ENC_ACTION("Thai/"CS_WINDOWS_874, C_WINDOWS_874, "_Windows-874"), /* RADIO set_charset_cb */
923 };
924
925 static GtkRadioActionEntry mainwin_radio_dec_entries[] =
926 {
927         DEC_ACTION("AutoDetect", 0, N_("_Auto detect")),        /* set_decode_cb */
928         /* --- */
929         DEC_ACTION("8bit", ENC_8BIT, "_8bit"),
930         DEC_ACTION("QP", ENC_QUOTED_PRINTABLE, "_Quoted printable"),
931         DEC_ACTION("B64", ENC_BASE64, "_Base64"),
932         DEC_ACTION("Uuencode", ENC_X_UUENCODE, "_Uuencode"),
933 };
934
935 static gboolean offline_ask_sync = TRUE;
936 static gboolean is_obscured = FALSE;
937
938 #define N_COLOR_LABELS colorlabel_get_color_count()
939
940 static void mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
941                                                           gpointer data)
942 {
943         MainWindow *mainwin;
944         GtkMenuShell *menu;
945         GtkCheckMenuItem **items;
946         gint n;
947         GList *children, *cur;
948         GSList *sel;
949
950         mainwin = (MainWindow *)data;
951         cm_return_if_fail(mainwin != NULL);
952
953         sel = summary_get_selection(mainwin->summaryview);
954         if (!sel) return;
955
956         menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
957         cm_return_if_fail(menu != NULL);
958
959         Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
960
961         /* NOTE: don't return prematurely because we set the "dont_toggle"
962          * state for check menu items. This would be bad! */
963         g_object_set_data(G_OBJECT(menu), "dont_toggle",
964                           GINT_TO_POINTER(1));
965
966         /* clear items. get item pointers. */
967         children = gtk_container_get_children(GTK_CONTAINER(menu));
968         for (n = 0, cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
969                 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
970                         gtk_check_menu_item_set_active
971                                 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
972                         items[n] = GTK_CHECK_MENU_ITEM(cur->data);
973                         n++;
974                 }
975         }
976
977         g_list_free(children);
978
979         if (n == (N_COLOR_LABELS + 1)) {
980                 /* iterate all messages and set the state of the appropriate
981                  * items */
982                 for (; sel != NULL; sel = sel->next) {
983                         MsgInfo *msginfo;
984                         gint clabel;
985
986                         msginfo = (MsgInfo *)sel->data;
987                         if (msginfo) {
988                                 clabel = MSG_GET_COLORLABEL_VALUE(msginfo->flags);
989                                 if (!gtk_check_menu_item_get_active(items[clabel]))
990                                         gtk_check_menu_item_set_active
991                                                 (items[clabel], TRUE);
992                         }
993                 }
994         } else
995                 g_warning("invalid number of color elements (%d)", n);
996
997         g_slist_free(sel);
998         /* reset "dont_toggle" state */
999         g_object_set_data(G_OBJECT(menu), "dont_toggle",
1000                           GINT_TO_POINTER(0));
1001 }
1002
1003 static void mainwindow_colorlabel_menu_item_activate_cb(GtkWidget *widget,
1004                                                      gpointer data)
1005 {
1006         guint color = GPOINTER_TO_UINT(data);
1007         MainWindow *mainwin;
1008
1009         mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1010         cm_return_if_fail(mainwin != NULL);
1011
1012         /* "dont_toggle" state set? */
1013         if (g_object_get_data(G_OBJECT(mainwin->colorlabel_menu),
1014                                 "dont_toggle"))
1015                 return;
1016
1017         summary_set_colorlabel(mainwin->summaryview, color, NULL);
1018 }
1019
1020 static void mainwindow_tags_menu_item_activate_item_cb(GtkMenuItem *menu_item,
1021                                                           gpointer data)
1022 {
1023         MainWindow *mainwin;
1024         GtkMenuShell *menu;
1025         GList *children, *cur;
1026         GSList *sel;
1027         GHashTable *menu_table = g_hash_table_new_full(
1028                                         g_direct_hash,
1029                                         g_direct_equal,
1030                                         NULL, NULL);
1031         GHashTable *menu_allsel_table = g_hash_table_new_full(
1032                                         g_direct_hash,
1033                                         g_direct_equal,
1034                                         NULL, NULL);
1035         gint sel_len;
1036         mainwin = (MainWindow *)data;
1037         cm_return_if_fail(mainwin != NULL);
1038
1039         sel = summary_get_selection(mainwin->summaryview);
1040         if (!sel) return;
1041
1042         menu = GTK_MENU_SHELL(mainwin->tags_menu);
1043         cm_return_if_fail(menu != NULL);
1044
1045         /* NOTE: don't return prematurely because we set the "dont_toggle"
1046          * state for check menu items */
1047         g_object_set_data(G_OBJECT(menu), "dont_toggle",
1048                           GINT_TO_POINTER(1));
1049
1050         /* clear items. get item pointers. */
1051         children = gtk_container_get_children(GTK_CONTAINER(menu));
1052         for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1053                 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1054                         gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1055                                 "tag_id"));
1056                         gtk_check_menu_item_set_active
1057                                 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1058                                 
1059                         g_hash_table_insert(menu_table, GINT_TO_POINTER(id), GTK_CHECK_MENU_ITEM(cur->data));
1060                         g_hash_table_insert(menu_allsel_table, GINT_TO_POINTER(id), GINT_TO_POINTER(0));
1061                 }
1062         }
1063
1064         g_list_free(children);
1065
1066         /* iterate all messages and set the state of the appropriate
1067          * items */
1068         sel_len = 0;
1069         for (; sel != NULL; sel = sel->next) {
1070                 MsgInfo *msginfo;
1071                 GSList *tags = NULL;
1072                 GtkCheckMenuItem *item;
1073                 msginfo = (MsgInfo *)sel->data;
1074                 sel_len++;
1075                 if (msginfo) {
1076                         tags =  msginfo->tags;
1077                         if (!tags)
1078                                 continue;
1079
1080                         for (; tags; tags = tags->next) {
1081                                 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, tags->data));
1082                                 item = g_hash_table_lookup(menu_table, GINT_TO_POINTER(tags->data));
1083                                 if (item && !gtk_check_menu_item_get_active(item)) {
1084                                         gtk_check_menu_item_set_active
1085                                                 (item, TRUE);
1086                                 }
1087                                 num_checked++;
1088                                 g_hash_table_replace(menu_allsel_table, tags->data, GINT_TO_POINTER(num_checked));
1089                         }
1090                 }
1091         }
1092
1093         children = gtk_container_get_children(GTK_CONTAINER(menu));
1094         for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1095                 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1096                         gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1097                                 "tag_id"));
1098                         gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, GINT_TO_POINTER(id)));
1099                         if (num_checked < sel_len && num_checked > 0)
1100                                 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), TRUE);
1101                         else
1102                                 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1103                 }
1104         }
1105         g_list_free(children);
1106         g_slist_free(sel);
1107         g_hash_table_destroy(menu_table);
1108         g_hash_table_destroy(menu_allsel_table);
1109         /* reset "dont_toggle" state */
1110         g_object_set_data(G_OBJECT(menu), "dont_toggle",
1111                           GINT_TO_POINTER(0));
1112 }
1113
1114 static void mainwindow_tags_menu_item_activate_cb(GtkWidget *widget,
1115                                                      gpointer data)
1116 {
1117         gint id = GPOINTER_TO_INT(data);
1118         gboolean set = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
1119         MainWindow *mainwin;
1120
1121         mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1122         cm_return_if_fail(mainwin != NULL);
1123
1124         /* "dont_toggle" state set? */
1125         if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1126                                 "dont_toggle"))
1127                 return;
1128
1129         if (!set)
1130                 id = -id;
1131         summary_set_tag(mainwin->summaryview, id, NULL);
1132 }
1133
1134 void mainwin_accel_changed_cb (GtkAccelGroup *accelgroup, guint keyval, GdkModifierType modifier,
1135                                   GClosure *closure, GtkMenuItem *item)
1136 {
1137         GList *closures = gtk_widget_list_accel_closures(GTK_WIDGET(item));
1138         GList *cur;
1139         for (cur = closures; cur; cur = cur->next) {
1140                 if (closure == cur->data) {
1141                         GtkLabel *label = g_object_get_data(G_OBJECT(item), "accel_label");
1142                         gchar *new_accel;
1143                         
1144                         if (keyval == GDK_KEY_Delete) {
1145                                 const gchar *accel_path;
1146                                 accel_path = gtk_menu_item_get_accel_path(item);
1147                                 keyval = 0; modifier = 0;
1148                                 gtk_accel_map_change_entry (accel_path, keyval, modifier, TRUE);
1149                         }
1150                         new_accel = gtk_accelerator_get_label(keyval, modifier);
1151                         gtk_label_set_text(label, new_accel);
1152                         g_free(new_accel);
1153                 }
1154         }
1155         g_list_free(closures);
1156 }
1157
1158 static void mainwindow_colorlabel_menu_create(MainWindow *mainwin, gboolean refresh)
1159 {
1160         GtkWidget *label_menuitem;
1161         GtkWidget *menu;
1162         GtkWidget *item;
1163         gint i;
1164         gchar *accel_path = NULL;
1165
1166         label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/ColorLabel");
1167         g_signal_connect(G_OBJECT(label_menuitem), "activate",
1168                          G_CALLBACK(mainwindow_colorlabel_menu_item_activate_item_cb),
1169                            mainwin);
1170         gtk_widget_show(label_menuitem);
1171
1172         menu = gtk_menu_new();
1173         gtk_menu_set_accel_group (GTK_MENU (menu), 
1174                 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1175
1176         /* create sub items. for the menu item activation callback we pass the
1177          * index of label_colors[] as data parameter. for the None color we
1178          * pass an invalid (high) value. also we attach a data pointer so we
1179          * can always get back the Mainwindow pointer. */
1180
1181         item = gtk_check_menu_item_new_with_label(_("None"));
1182         gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1183         g_signal_connect(G_OBJECT(item), "activate",
1184                          G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1185                            GUINT_TO_POINTER(0));
1186         g_object_set_data(G_OBJECT(item), "mainwin", mainwin);
1187         gtk_widget_show(item);
1188
1189         accel_path = g_strdup_printf("<ClawsColorLabels>/None");
1190         gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1191         g_free(accel_path);
1192         gtk_accel_map_add_entry("<ClawsColorLabels>/None", GDK_KEY_0, GDK_CONTROL_MASK);
1193         item = gtk_menu_item_new();
1194         gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1195         gtk_widget_show(item);
1196
1197         /* create pixmap/label menu items */
1198         for (i = 0; i < N_COLOR_LABELS; i++) {
1199                 item = colorlabel_create_check_color_menu_item(
1200                         i, refresh, MAINWIN_COLORMENU);
1201                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1202                 g_signal_connect(G_OBJECT(item), "activate",
1203                                  G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1204                                  GUINT_TO_POINTER(i + 1));
1205                 g_object_set_data(G_OBJECT(item), "mainwin",
1206                                   mainwin);
1207                 gtk_widget_show(item);
1208                 accel_path = g_strdup_printf("<ClawsColorLabels>/%d", i+1);
1209                 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1210                 if (i < 9)
1211                         gtk_accel_map_add_entry(accel_path, GDK_KEY_1+i, GDK_CONTROL_MASK);
1212                 g_free(accel_path);
1213                 g_signal_connect (gtk_ui_manager_get_accel_group(mainwin->ui_manager), 
1214                         "accel-changed", G_CALLBACK (mainwin_accel_changed_cb), item);
1215
1216
1217         }
1218         gtk_widget_show(menu);
1219         gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1220         mainwin->colorlabel_menu = menu;
1221 }
1222
1223 static void mainwindow_tags_menu_item_apply_tags_activate_cb(GtkWidget *widget,
1224                                                      gpointer data)
1225 {
1226         MainWindow *mainwin;
1227
1228         mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1229         cm_return_if_fail(mainwin != NULL);
1230
1231         /* "dont_toggle" state set? */
1232         if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1233                                 "dont_toggle"))
1234                 return;
1235         
1236         tag_apply_open(summary_get_selection(mainwin->summaryview));    
1237 }
1238
1239 static gint mainwin_tag_cmp_list(gconstpointer a, gconstpointer b)
1240 {
1241         gint id_a = GPOINTER_TO_INT(a);
1242         gint id_b = GPOINTER_TO_INT(b);
1243         const gchar *tag_a = tags_get_tag(id_a);
1244         const gchar *tag_b = tags_get_tag(id_b);
1245         
1246                 
1247         if (tag_a == NULL)
1248                 return tag_b == NULL ? 0:1;
1249         
1250         if (tag_b == NULL)
1251                 return 1;
1252  
1253         return g_utf8_collate(tag_a, tag_b);
1254 }
1255
1256 static void mainwindow_tags_menu_create(MainWindow *mainwin, gboolean refresh)
1257 {
1258         GtkWidget *label_menuitem;
1259         GtkWidget *menu;
1260         GtkWidget *item;
1261         GSList *cur = tags_get_list();
1262         GSList *orig = NULL;
1263         gboolean existing_tags = FALSE;
1264         gchar *accel_path;
1265         cur = orig = g_slist_sort(cur, mainwin_tag_cmp_list);
1266
1267         label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Tags");
1268         g_signal_connect(G_OBJECT(label_menuitem), "activate",
1269                          G_CALLBACK(mainwindow_tags_menu_item_activate_item_cb),
1270                            mainwin);
1271
1272         gtk_widget_show(label_menuitem);
1273
1274         menu = gtk_menu_new();
1275         gtk_menu_set_accel_group (GTK_MENU (menu), 
1276                 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1277
1278         /* create tags menu items */
1279         for (; cur; cur = cur->next) {
1280                 gint id = GPOINTER_TO_INT(cur->data);
1281                 const gchar *tag = tags_get_tag(id);
1282
1283                 item = gtk_check_menu_item_new_with_label(tag);
1284                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1285                 g_signal_connect(G_OBJECT(item), "activate",
1286                                  G_CALLBACK(mainwindow_tags_menu_item_activate_cb),
1287                                  GINT_TO_POINTER(id));
1288                 g_object_set_data(G_OBJECT(item), "mainwin",
1289                                   mainwin);
1290                 g_object_set_data(G_OBJECT(item), "tag_id",
1291                                   GINT_TO_POINTER(id));
1292                 gtk_widget_show(item);
1293                 accel_path = g_strconcat("<ClawsTags>/",tag, NULL);
1294                 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1295                 g_free(accel_path);
1296                 existing_tags = TRUE;
1297         }
1298         if (existing_tags) {
1299                 /* separator */
1300                 item = gtk_menu_item_new();
1301                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1302                 gtk_widget_show(item);
1303         }
1304
1305         item = gtk_menu_item_new_with_label(_("Apply tags..."));
1306         gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1307         g_signal_connect(G_OBJECT(item), "activate",
1308                          G_CALLBACK(mainwindow_tags_menu_item_apply_tags_activate_cb),
1309                          NULL);
1310         g_object_set_data(G_OBJECT(item), "mainwin",
1311                           mainwin);
1312         gtk_widget_show(item);
1313         accel_path = g_strdup_printf("<ClawsTags>/ApplyTags");
1314         gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1315         g_free(accel_path);
1316         gtk_accel_map_add_entry("<ClawsTags>/ApplyTags", GDK_KEY_T, GDK_CONTROL_MASK|GDK_SHIFT_MASK);
1317         g_slist_free(orig);
1318         gtk_widget_show(menu);
1319         gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1320         mainwin->tags_menu = menu;
1321 }
1322 #ifndef GENERIC_UMPC
1323 static gboolean warning_icon_pressed(GtkWidget *widget, GdkEventButton *evt,
1324                                     MainWindow *mainwindow)
1325 {
1326         if (evt && evt->button == 1) {
1327                 log_window_show_error(mainwindow->logwin);
1328                 gtk_widget_hide(mainwindow->warning_btn);
1329         }
1330         return FALSE;
1331 }
1332
1333 static gboolean warning_visi_notify(GtkWidget *widget,
1334                                        GdkEventVisibility *event,
1335                                        MainWindow *mainwindow)
1336 {
1337         gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1338         return FALSE;
1339 }
1340
1341 static gboolean warning_leave_notify(GtkWidget *widget,
1342                                       GdkEventCrossing *event,
1343                                       MainWindow *mainwindow)
1344 {
1345         gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), NULL);
1346         return FALSE;
1347 }
1348
1349 static gboolean warning_enter_notify(GtkWidget *widget,
1350                                       GdkEventCrossing *event,
1351                                       MainWindow *mainwindow)
1352 {
1353         gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1354         return FALSE;
1355 }
1356 #endif
1357 void mainwindow_show_error(void)
1358 {
1359         MainWindow *mainwin = mainwindow_get_mainwindow();
1360         gtk_widget_show(mainwin->warning_btn);
1361 }
1362
1363 void mainwindow_clear_error(MainWindow *mainwin)
1364 {
1365         gtk_widget_hide(mainwin->warning_btn);
1366 }
1367
1368 #define BREAK_ON_MODIFIER_KEY() \
1369         if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
1370
1371 static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
1372                                     gpointer data)
1373 {
1374         MainWindow *mainwin = (MainWindow*) data;
1375
1376         if (!mainwin || !event) 
1377                 return FALSE;
1378
1379         if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
1380         {
1381                 GtkWidget *entry =
1382                         quicksearch_get_entry(mainwin->summaryview->quicksearch);
1383                 gboolean handled;
1384                 g_signal_emit_by_name(entry, "key-press-event", event, &handled);
1385                 if (handled) {
1386                         return TRUE;
1387                 }
1388         }
1389
1390         switch (event->keyval) {
1391         case GDK_KEY_Q:             /* Quit */
1392                 BREAK_ON_MODIFIER_KEY();
1393
1394                 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1395                         app_exit_cb(NULL, mainwin);
1396                 }
1397                 return FALSE;
1398         case GDK_KEY_space:
1399                 BREAK_ON_MODIFIER_KEY();
1400                 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1401                         if (mainwin->folderview != NULL && mainwin->summaryview != NULL
1402                             && ((!mainwin->summaryview->displayed
1403                                 && !mainwin->summaryview->selected) 
1404                                 || (mainwin->summaryview->folder_item
1405                                     && mainwin->summaryview->folder_item->total_msgs == 0))) {
1406                                 g_signal_stop_emission_by_name(G_OBJECT(widget), 
1407                                                "key_press_event");
1408                                 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
1409                         }
1410                 }
1411                 break;
1412         default:
1413                 break;
1414         }
1415         return FALSE;
1416 }
1417
1418 #undef BREAK_ON_MODIFIER_KEY
1419
1420 MainWindow *main_window_create()
1421 {
1422         MainWindow *mainwin;
1423         GtkWidget *window;
1424         GtkWidget *vbox;
1425         GtkWidget *menubar;
1426         GtkWidget *handlebox;
1427         GtkWidget *vbox_body;
1428         GtkWidget *menuitem;
1429 #ifndef GENERIC_UMPC
1430         GtkWidget *hbox_stat;
1431         GtkWidget *statusbar;
1432         GtkWidget *progressbar;
1433         GtkWidget *statuslabel;
1434         GtkWidget *ac_button;
1435         GtkWidget *ac_label;
1436         GtkWidget *online_pixmap;
1437         GtkWidget *offline_pixmap;
1438         GtkWidget *warning_icon;
1439         GtkWidget *warning_btn;
1440 #endif
1441         GtkWidget *online_switch;
1442         GtkWidget *offline_switch;
1443         FolderView *folderview;
1444         SummaryView *summaryview;
1445         MessageView *messageview;
1446         GdkColormap *colormap;
1447         gboolean success[4];
1448         GdkColor color[4];
1449         GtkWidget *ac_menu;
1450         gint i;
1451
1452         static GdkGeometry geometry;
1453
1454         debug_print("Creating main window...\n");
1455         mainwin = g_new0(MainWindow, 1);
1456
1457         /* main window */
1458         window = GTK_WIDGET(gtkut_window_new(GTK_WINDOW_TOPLEVEL, "mainwindow"));
1459         gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
1460         gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
1461 #ifdef GENERIC_UMPC
1462         prefs_common.layout_mode = SMALL_LAYOUT;
1463 #endif
1464         if (!geometry.min_height) {
1465                 geometry.min_width = 320;
1466                 geometry.min_height = 200;
1467         }
1468         gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
1469                                       GDK_HINT_MIN_SIZE);
1470
1471         g_signal_connect(G_OBJECT(window), "delete_event",
1472                          G_CALLBACK(main_window_close_cb), mainwin);
1473         MANAGE_WINDOW_SIGNALS_CONNECT(window);
1474         g_signal_connect(G_OBJECT(window), "focus_in_event",
1475                          G_CALLBACK(mainwindow_focus_in_event),
1476                          mainwin);
1477         g_signal_connect(G_OBJECT(window), "key_press_event",
1478                          G_CALLBACK(mainwindow_key_pressed), mainwin);
1479
1480         gtk_widget_realize(window);
1481         gtk_widget_add_events(window, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
1482         
1483
1484         gtkut_widget_set_app_icon(window);
1485
1486         vbox = gtk_vbox_new(FALSE, 0);
1487         gtk_widget_show(vbox);
1488         gtk_container_add(GTK_CONTAINER(window), vbox);
1489
1490         /* menu bar */
1491
1492         mainwin->ui_manager = gtk_ui_manager_new();
1493         mainwin->action_group = cm_menu_create_action_group_full(mainwin->ui_manager,"Menu", mainwin_entries,
1494                         G_N_ELEMENTS(mainwin_entries), (gpointer)mainwin);
1495         gtk_action_group_add_toggle_actions(mainwin->action_group, mainwin_toggle_entries,
1496                         G_N_ELEMENTS(mainwin_toggle_entries), (gpointer)mainwin);
1497         gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_showhide_radio_entries,
1498                         G_N_ELEMENTS(mainwin_showhide_radio_entries), C_AUTO, G_CALLBACK(toggle_toolbar_cb), (gpointer)mainwin);
1499 #ifndef GENERIC_UMPC
1500         gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_layout_radio_entries,
1501                         G_N_ELEMENTS(mainwin_layout_radio_entries), C_AUTO, G_CALLBACK(set_layout_cb), (gpointer)mainwin);
1502 #endif
1503         gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sort_radio_entries,
1504                         G_N_ELEMENTS(mainwin_sort_radio_entries), C_AUTO, G_CALLBACK(sort_summary_cb), (gpointer)mainwin);
1505         gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sorttype_radio_entries,
1506                         G_N_ELEMENTS(mainwin_sorttype_radio_entries), C_AUTO, G_CALLBACK(sort_summary_type_cb), (gpointer)mainwin);
1507         gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_enc_entries,
1508                         G_N_ELEMENTS(mainwin_radio_enc_entries), C_AUTO, G_CALLBACK(set_charset_cb), (gpointer)mainwin);
1509         gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_dec_entries,
1510                         G_N_ELEMENTS(mainwin_radio_dec_entries), C_AUTO, G_CALLBACK(set_decode_cb), (gpointer)mainwin);
1511
1512         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
1513         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "File", "File", GTK_UI_MANAGER_MENU)
1514         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
1515         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "View", "View", GTK_UI_MANAGER_MENU)
1516         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
1517         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Tools", "Tools", GTK_UI_MANAGER_MENU)
1518         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Configuration", "Configuration", GTK_UI_MANAGER_MENU)
1519         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Help", "Help", GTK_UI_MANAGER_MENU)
1520
1521 /* File menu */
1522         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "AddMailbox", "File/AddMailbox", GTK_UI_MANAGER_MENU)
1523         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File/AddMailbox", "MH", "File/AddMailbox/MH", GTK_UI_MANAGER_MENUITEM)
1524         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator1", "File/---", GTK_UI_MANAGER_SEPARATOR)
1525         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SortMailboxes", "File/SortMailboxes", GTK_UI_MANAGER_MENUITEM)
1526         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator2", "File/---", GTK_UI_MANAGER_SEPARATOR)
1527         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ImportMbox", "File/ImportMbox", GTK_UI_MANAGER_MENUITEM)
1528         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportMbox", "File/ExportMbox", GTK_UI_MANAGER_MENUITEM)
1529         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportSelMbox", "File/ExportSelMbox", GTK_UI_MANAGER_MENUITEM)
1530         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator3", "File/---", GTK_UI_MANAGER_SEPARATOR)
1531         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "EmptyTrashes", "File/EmptyTrashes", GTK_UI_MANAGER_MENUITEM)
1532         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator4", "File/---", GTK_UI_MANAGER_SEPARATOR)
1533         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SaveAs", "File/SaveAs", GTK_UI_MANAGER_MENUITEM)
1534         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SavePartAs", "File/SavePartAs", GTK_UI_MANAGER_MENUITEM)
1535         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator5", "File/---", GTK_UI_MANAGER_SEPARATOR)
1536         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "PageSetup", "File/PageSetup", GTK_UI_MANAGER_MENUITEM)
1537         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Print", "File/Print", GTK_UI_MANAGER_MENUITEM)
1538         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator6", "File/---", GTK_UI_MANAGER_SEPARATOR)
1539         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "OfflineMode", "File/OfflineMode", GTK_UI_MANAGER_MENUITEM)
1540         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SynchroniseFolders", "File/SynchroniseFolders", GTK_UI_MANAGER_MENUITEM)
1541         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator7", "File/---", GTK_UI_MANAGER_SEPARATOR)
1542         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Exit", "File/Exit", GTK_UI_MANAGER_MENUITEM)
1543
1544 /* Edit menu */
1545         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Copy", "Edit/Copy", GTK_UI_MANAGER_MENUITEM)
1546         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectAll", "Edit/SelectAll", GTK_UI_MANAGER_MENUITEM)
1547         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectThread", "Edit/SelectThread", GTK_UI_MANAGER_MENUITEM)
1548         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
1549         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM)
1550         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SearchFolder", "Edit/SearchFolder", GTK_UI_MANAGER_MENUITEM)
1551         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "QuickSearch", "Edit/QuickSearch", GTK_UI_MANAGER_MENUITEM)
1552
1553 /* View menu */
1554         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ShowHide", "View/ShowHide", GTK_UI_MANAGER_MENU)
1555         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MenuBar", "View/ShowHide/MenuBar", GTK_UI_MANAGER_MENUITEM)
1556         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "Toolbar", "View/ShowHide/Toolbar", GTK_UI_MANAGER_MENU)
1557         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBelowIcon", "View/ShowHide/Toolbar/TextBelowIcon", GTK_UI_MANAGER_MENUITEM)
1558         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBesideIcon", "View/ShowHide/Toolbar/TextBesideIcon", GTK_UI_MANAGER_MENUITEM)
1559         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "IconOnly", "View/ShowHide/Toolbar/IconOnly", GTK_UI_MANAGER_MENUITEM)
1560         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextOnly", "View/ShowHide/Toolbar/TextOnly", GTK_UI_MANAGER_MENUITEM)
1561 #ifndef GENERIC_UMPC
1562         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "Hide", "View/ShowHide/Toolbar/Hide", GTK_UI_MANAGER_MENUITEM)
1563 #endif
1564         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MessageView", "View/ShowHide/MessageView", GTK_UI_MANAGER_MENUITEM)
1565 #ifndef GENERIC_UMPC
1566         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "StatusBar", "View/ShowHide/StatusBar", GTK_UI_MANAGER_MENUITEM)
1567 #endif
1568         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "ColumnHeaders", "View/ShowHide/ColumnHeaders", GTK_UI_MANAGER_MENUITEM)
1569         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "SetColumns", "View/SetColumns", GTK_UI_MANAGER_MENU)
1570         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Folderlist", "View/SetColumns/Folderlist", GTK_UI_MANAGER_MENUITEM)
1571         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Messagelist", "View/SetColumns/Messagelist", GTK_UI_MANAGER_MENUITEM)
1572         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator1", "View/---", GTK_UI_MANAGER_SEPARATOR)
1573
1574         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "FullScreen", "View/FullScreen", GTK_UI_MANAGER_MENUITEM)
1575 #ifndef GENERIC_UMPC
1576         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Layout", "View/Layout", GTK_UI_MANAGER_MENU)
1577         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "Standard", "View/Layout/Standard", GTK_UI_MANAGER_MENUITEM)
1578         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "ThreeColumns", "View/Layout/ThreeColumns", GTK_UI_MANAGER_MENUITEM)
1579         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessage", "View/Layout/WideMessage", GTK_UI_MANAGER_MENUITEM)
1580         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessageList", "View/Layout/WideMessageList", GTK_UI_MANAGER_MENUITEM)
1581         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "SmallScreen", "View/Layout/SmallScreen", GTK_UI_MANAGER_MENUITEM)
1582         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator2", "View/---", GTK_UI_MANAGER_SEPARATOR)
1583 #endif
1584
1585         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Sort", "View/Sort", GTK_UI_MANAGER_MENU)
1586         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Number", "View/Sort/Number", GTK_UI_MANAGER_MENUITEM)
1587         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Size", "View/Sort/Size", GTK_UI_MANAGER_MENUITEM)
1588         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Date", "View/Sort/Date", GTK_UI_MANAGER_MENUITEM)
1589         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "ThreadDate", "View/Sort/ThreadDate", GTK_UI_MANAGER_MENUITEM)
1590         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "From", "View/Sort/From", GTK_UI_MANAGER_MENUITEM)
1591         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "To", "View/Sort/To", GTK_UI_MANAGER_MENUITEM)
1592         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Subject", "View/Sort/Subject", GTK_UI_MANAGER_MENUITEM)
1593         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Color", "View/Sort/Color", GTK_UI_MANAGER_MENUITEM)
1594         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Tag", "View/Sort/Tag", GTK_UI_MANAGER_MENUITEM)
1595         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Mark", "View/Sort/Mark", GTK_UI_MANAGER_MENUITEM)
1596         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Status", "View/Sort/Status", GTK_UI_MANAGER_MENUITEM)
1597         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Attachment", "View/Sort/Attachment", GTK_UI_MANAGER_MENUITEM)
1598         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Score", "View/Sort/Score", GTK_UI_MANAGER_MENUITEM)
1599         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Locked", "View/Sort/Locked", GTK_UI_MANAGER_MENUITEM)
1600         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "DontSort", "View/Sort/DontSort", GTK_UI_MANAGER_MENUITEM)
1601         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator1", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1602         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Ascending", "View/Sort/Ascending", GTK_UI_MANAGER_MENUITEM)
1603         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Descending", "View/Sort/Descending", GTK_UI_MANAGER_MENUITEM)
1604         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator2", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1605         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "AttractSubj", "View/Sort/AttractSubj", GTK_UI_MANAGER_MENUITEM)
1606
1607         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ThreadView", "View/ThreadView", GTK_UI_MANAGER_MENUITEM)
1608         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ExpandThreads", "View/ExpandThreads", GTK_UI_MANAGER_MENUITEM)
1609         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "CollapseThreads", "View/CollapseThreads", GTK_UI_MANAGER_MENUITEM)
1610         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadThreads", "View/HideReadThreads", GTK_UI_MANAGER_MENUITEM)
1611         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadMessages", "View/HideReadMessages", GTK_UI_MANAGER_MENUITEM)
1612         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideDelMessages", "View/HideDelMessages", GTK_UI_MANAGER_MENUITEM)
1613         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator3", "View/---", GTK_UI_MANAGER_SEPARATOR)
1614
1615         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Goto", "View/Goto", GTK_UI_MANAGER_MENU)
1616         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Prev", "View/Goto/Prev", GTK_UI_MANAGER_MENUITEM)
1617         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Next", "View/Goto/Next", GTK_UI_MANAGER_MENUITEM)
1618         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator1", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1619         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevUnread", "View/Goto/PrevUnread", GTK_UI_MANAGER_MENUITEM)
1620         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnread", "View/Goto/NextUnread", GTK_UI_MANAGER_MENUITEM)
1621         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator2", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1622         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevNew", "View/Goto/PrevNew", GTK_UI_MANAGER_MENUITEM)
1623         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextNew", "View/Goto/NextNew", GTK_UI_MANAGER_MENUITEM)
1624         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator3", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1625         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevMarked", "View/Goto/PrevMarked", GTK_UI_MANAGER_MENUITEM)
1626         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextMarked", "View/Goto/NextMarked", GTK_UI_MANAGER_MENUITEM)
1627         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator4", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1628         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevLabeled", "View/Goto/PrevLabeled", GTK_UI_MANAGER_MENUITEM)
1629         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextLabeled", "View/Goto/NextLabeled", GTK_UI_MANAGER_MENUITEM)
1630         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator5", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1631         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevHistory", "View/Goto/PrevHistory", GTK_UI_MANAGER_MENUITEM)
1632         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextHistory", "View/Goto/NextHistory", GTK_UI_MANAGER_MENUITEM)
1633         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator6", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1634         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
1635         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1636         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
1637         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Folder", "View/Goto/Folder", GTK_UI_MANAGER_MENUITEM)
1638         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator8", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1639         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextPart", "View/Goto/NextPart", GTK_UI_MANAGER_MENUITEM)
1640         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevPart", "View/Goto/PrevPart", GTK_UI_MANAGER_MENUITEM)
1641         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Scroll", "View/Scroll", GTK_UI_MANAGER_MENU)
1642         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevLine", "View/Scroll/PrevLine", GTK_UI_MANAGER_MENUITEM)
1643         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextLine", "View/Scroll/NextLine", GTK_UI_MANAGER_MENUITEM)
1644         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevPage", "View/Scroll/PrevPage", GTK_UI_MANAGER_MENUITEM)
1645         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextPage", "View/Scroll/NextPage", GTK_UI_MANAGER_MENUITEM)
1646         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator4", "View/---", GTK_UI_MANAGER_SEPARATOR)
1647
1648         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Encoding", "View/Encoding", GTK_UI_MANAGER_MENU)
1649         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_AUTO, "View/Encoding/"CS_AUTO, GTK_UI_MANAGER_MENUITEM)
1650         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator1", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1651         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_US_ASCII, "View/Encoding/"CS_US_ASCII, GTK_UI_MANAGER_MENUITEM)
1652         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_UTF_8, "View/Encoding/"CS_UTF_8, GTK_UI_MANAGER_MENUITEM)
1653         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator2", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1654
1655         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Western", "View/Encoding/Western", GTK_UI_MANAGER_MENU)
1656         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_ISO_8859_1, "View/Encoding/Western/"CS_ISO_8859_1, GTK_UI_MANAGER_MENUITEM)
1657         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_ISO_8859_15, "View/Encoding/Western/"CS_ISO_8859_15, GTK_UI_MANAGER_MENUITEM)
1658         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_WINDOWS_1252, "View/Encoding/Western/"CS_WINDOWS_1252, GTK_UI_MANAGER_MENUITEM)
1659
1660         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_2, "View/Encoding/"CS_ISO_8859_2, GTK_UI_MANAGER_MENUITEM)
1661
1662         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Baltic", "View/Encoding/Baltic", GTK_UI_MANAGER_MENU)
1663         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Baltic", CS_ISO_8859_13, "View/Encoding/Baltic/"CS_ISO_8859_13, GTK_UI_MANAGER_MENUITEM)
1664         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Baltic", CS_ISO_8859_4, "View/Encoding/Baltic/"CS_ISO_8859_4, GTK_UI_MANAGER_MENUITEM)
1665
1666         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_7, "View/Encoding/"CS_ISO_8859_7, GTK_UI_MANAGER_MENUITEM)
1667
1668         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Hebrew", "View/Encoding/Hebrew", GTK_UI_MANAGER_MENU)
1669         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_ISO_8859_8, "View/Encoding/Hebrew/"CS_ISO_8859_8, GTK_UI_MANAGER_MENUITEM)
1670         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_WINDOWS_1255, "View/Encoding/Hebrew/"CS_WINDOWS_1255, GTK_UI_MANAGER_MENUITEM)
1671
1672         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Arabic", "View/Encoding/Arabic", GTK_UI_MANAGER_MENU)
1673         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_ISO_8859_6, "View/Encoding/Arabic/"CS_ISO_8859_6, GTK_UI_MANAGER_MENUITEM)
1674         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_WINDOWS_1256, "View/Encoding/Arabic/"CS_WINDOWS_1256, GTK_UI_MANAGER_MENUITEM)
1675
1676         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_9, "View/Encoding/"CS_ISO_8859_9, GTK_UI_MANAGER_MENUITEM)
1677
1678         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Cyrillic", "View/Encoding/Cyrillic", GTK_UI_MANAGER_MENU)
1679         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_ISO_8859_5, "View/Encoding/Cyrillic/"CS_ISO_8859_5, GTK_UI_MANAGER_MENUITEM)
1680         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_R, "View/Encoding/Cyrillic/"CS_KOI8_R, GTK_UI_MANAGER_MENUITEM)
1681         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_MACCYR, "View/Encoding/Cyrillic/"CS_MACCYR, GTK_UI_MANAGER_MENUITEM)
1682         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_U, "View/Encoding/Cyrillic/"CS_KOI8_U, GTK_UI_MANAGER_MENUITEM)
1683         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_WINDOWS_1251, "View/Encoding/Cyrillic/"CS_WINDOWS_1251, GTK_UI_MANAGER_MENUITEM)
1684
1685         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Japanese", "View/Encoding/Japanese", GTK_UI_MANAGER_MENU)
1686         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_ISO_2022_JP, "View/Encoding/Japanese/"CS_ISO_2022_JP, GTK_UI_MANAGER_MENUITEM)
1687         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_ISO_2022_JP_2, "View/Encoding/Japanese/"CS_ISO_2022_JP_2, GTK_UI_MANAGER_MENUITEM)
1688         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_EUC_JP, "View/Encoding/Japanese/"CS_EUC_JP, GTK_UI_MANAGER_MENUITEM)
1689         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_SHIFT_JIS, "View/Encoding/Japanese/"CS_SHIFT_JIS, GTK_UI_MANAGER_MENUITEM)
1690
1691         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Chinese", "View/Encoding/Chinese", GTK_UI_MANAGER_MENU)
1692         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB18030, "View/Encoding/Chinese/"CS_GB18030, GTK_UI_MANAGER_MENUITEM)
1693         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB2312, "View/Encoding/Chinese/"CS_GB2312, GTK_UI_MANAGER_MENUITEM)
1694         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GBK, "View/Encoding/Chinese/"CS_GBK, GTK_UI_MANAGER_MENUITEM)
1695         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_BIG5, "View/Encoding/Chinese/"CS_BIG5, GTK_UI_MANAGER_MENUITEM)
1696         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_EUC_TW, "View/Encoding/Chinese/"CS_EUC_TW, GTK_UI_MANAGER_MENUITEM)
1697
1698         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Korean", "View/Encoding/Korean", GTK_UI_MANAGER_MENU)
1699         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_EUC_KR, "View/Encoding/Korean/"CS_EUC_KR, GTK_UI_MANAGER_MENUITEM)
1700         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_ISO_2022_KR, "View/Encoding/Korean/"CS_ISO_2022_KR, GTK_UI_MANAGER_MENUITEM)
1701
1702         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Thai", "View/Encoding/Thai", GTK_UI_MANAGER_MENU)
1703         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_TIS_620, "View/Encoding/Thai/"CS_TIS_620, GTK_UI_MANAGER_MENUITEM)
1704         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_WINDOWS_874, "View/Encoding/Thai/"CS_WINDOWS_874, GTK_UI_MANAGER_MENUITEM)
1705
1706         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Decode", "View/Decode", GTK_UI_MANAGER_MENU)
1707         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "AutoDetect", "View/Decode/AutoDetect", GTK_UI_MANAGER_MENUITEM)
1708         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Separator1", "View/Decode/---", GTK_UI_MANAGER_SEPARATOR)
1709         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "8bit", "View/Decode/8bit", GTK_UI_MANAGER_MENUITEM)
1710         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "QP", "View/Decode/QP", GTK_UI_MANAGER_MENUITEM)
1711         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "B64", "View/Decode/B64", GTK_UI_MANAGER_MENUITEM)
1712         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Uuencode", "View/Decode/Uuencode", GTK_UI_MANAGER_MENUITEM)
1713         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator5", "View/---", GTK_UI_MANAGER_SEPARATOR)
1714
1715         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "OpenNewWindow", "View/OpenNewWindow", GTK_UI_MANAGER_MENUITEM)
1716         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "MessageSource", "View/MessageSource", GTK_UI_MANAGER_MENUITEM)
1717         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "AllHeaders", "View/AllHeaders", GTK_UI_MANAGER_MENUITEM)
1718         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Quotes", "View/Quotes", GTK_UI_MANAGER_MENU)
1719         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "CollapseAll", "View/Quotes/CollapseAll", GTK_UI_MANAGER_MENUITEM)
1720         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse2", "View/Quotes/Collapse2", GTK_UI_MANAGER_MENUITEM)
1721         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse3", "View/Quotes/Collapse3", GTK_UI_MANAGER_MENUITEM)
1722         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Part", "View/Part", GTK_UI_MANAGER_MENU)
1723         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "AsText", "View/Part/AsText", GTK_UI_MANAGER_MENUITEM)
1724         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "Open", "View/Part/Open", GTK_UI_MANAGER_MENUITEM)
1725 #ifndef G_OS_WIN32
1726         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "OpenWith", "View/Part/OpenWith", GTK_UI_MANAGER_MENUITEM)
1727 #endif
1728         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator8", "View/---", GTK_UI_MANAGER_SEPARATOR)
1729         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "UpdateSummary", "View/UpdateSummary", GTK_UI_MANAGER_MENUITEM)
1730
1731 /* Message menu */
1732         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Receive", "Message/Receive", GTK_UI_MANAGER_MENU)
1733         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CurrentAccount", "Message/Receive/CurrentAccount", GTK_UI_MANAGER_MENUITEM)
1734         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "AllAccounts", "Message/Receive/AllAccounts", GTK_UI_MANAGER_MENUITEM)
1735         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CancelReceiving", "Message/Receive/CancelReceiving", GTK_UI_MANAGER_MENUITEM)
1736         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "Separator1", "Message/Receive/---", GTK_UI_MANAGER_SEPARATOR)
1737         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "PlaceHolder", "Message/Receive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1738         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "SendQueue", "Message/SendQueue", GTK_UI_MANAGER_MENUITEM)
1739         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelSending", "Message/CancelSending", GTK_UI_MANAGER_MENUITEM)
1740         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator1", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1741
1742         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeEmail", "Message/ComposeEmail", GTK_UI_MANAGER_MENUITEM)
1743         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeNews", "Message/ComposeNews", GTK_UI_MANAGER_MENUITEM)
1744         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reply", "Message/Reply", GTK_UI_MANAGER_MENUITEM)
1745         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ReplyTo", "Message/ReplyTo", GTK_UI_MANAGER_MENU)
1746         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "All", "Message/ReplyTo/All", GTK_UI_MANAGER_MENUITEM)
1747         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "Sender", "Message/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM)
1748         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "List", "Message/ReplyTo/List", GTK_UI_MANAGER_MENUITEM)
1749         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "FollowupReply", "Message/FollowupReply", GTK_UI_MANAGER_MENUITEM)
1750         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1751
1752         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Forward", "Message/Forward", GTK_UI_MANAGER_MENUITEM)
1753         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ForwardAtt", "Message/ForwardAtt", GTK_UI_MANAGER_MENUITEM)
1754         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Redirect", "Message/Redirect", GTK_UI_MANAGER_MENUITEM)
1755         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "MailingList", "Message/MailingList", GTK_UI_MANAGER_MENU)
1756         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Post", "Message/MailingList/Post", GTK_UI_MANAGER_MENU)
1757         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Help", "Message/MailingList/Help", GTK_UI_MANAGER_MENU)
1758         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Subscribe", "Message/MailingList/Subscribe", GTK_UI_MANAGER_MENU)
1759         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Unsubscribe", "Message/MailingList/Unsubscribe", GTK_UI_MANAGER_MENU)
1760         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ViewArchive", "Message/MailingList/ViewArchive", GTK_UI_MANAGER_MENU)
1761         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ContactOwner", "Message/MailingList/ContactOwner", GTK_UI_MANAGER_MENU)
1762         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Post", "PlaceHolder", "Message/MailingList/Post/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1763         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Help", "PlaceHolder", "Message/MailingList/Help/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1764         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe", "PlaceHolder", "Message/MailingList/Subscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1765         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe", "PlaceHolder", "Message/MailingList/Unsubscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1766         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive", "PlaceHolder", "Message/MailingList/ViewArchive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1767         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner", "PlaceHolder", "Message/MailingList/ContactOwner/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1768         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator3", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1769
1770         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Move", "Message/Move", GTK_UI_MANAGER_MENUITEM)
1771         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Copy", "Message/Copy", GTK_UI_MANAGER_MENUITEM)
1772         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Trash", "Message/Trash", GTK_UI_MANAGER_MENUITEM)
1773         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Delete", "Message/Delete", GTK_UI_MANAGER_MENUITEM)
1774         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "TrashThread", "Message/TrashThread", GTK_UI_MANAGER_MENUITEM)
1775         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "DeleteThread", "Message/DeleteThread", GTK_UI_MANAGER_MENUITEM)
1776         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelNews", "Message/CancelNews", GTK_UI_MANAGER_MENUITEM)
1777         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator4", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1778
1779         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Mark", "Message/Mark", GTK_UI_MANAGER_MENU)
1780         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM)
1781         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unmark", "Message/Mark/Unmark", GTK_UI_MANAGER_MENUITEM)
1782         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator1", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1783         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkRead", "Message/Mark/MarkRead", GTK_UI_MANAGER_MENUITEM)
1784         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
1785         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator2", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1786         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllRead", "Message/Mark/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
1787         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllUnread", "Message/Mark/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
1788         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator3", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1789         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "IgnoreThread", "Message/Mark/IgnoreThread", GTK_UI_MANAGER_MENUITEM)
1790         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnignoreThread", "Message/Mark/UnignoreThread", GTK_UI_MANAGER_MENUITEM)
1791         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "WatchThread", "Message/Mark/WatchThread", GTK_UI_MANAGER_MENUITEM)
1792         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnwatchThread", "Message/Mark/UnwatchThread", GTK_UI_MANAGER_MENUITEM)
1793         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator4", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1794         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkSpam", "Message/Mark/MarkSpam", GTK_UI_MANAGER_MENUITEM)
1795         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkHam", "Message/Mark/MarkHam", GTK_UI_MANAGER_MENUITEM)
1796         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator5", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1797         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Lock", "Message/Mark/Lock", GTK_UI_MANAGER_MENUITEM)
1798         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unlock", "Message/Mark/Unlock", GTK_UI_MANAGER_MENUITEM)
1799         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ColorLabel", "Message/ColorLabel", GTK_UI_MANAGER_MENUITEM)
1800         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Tags", "Message/Tags", GTK_UI_MANAGER_MENUITEM)
1801         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator5", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1802
1803         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reedit", "Message/Reedit", GTK_UI_MANAGER_MENUITEM)
1804         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator6", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1805         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CheckSignature", "Message/CheckSignature", GTK_UI_MANAGER_MENUITEM)
1806
1807 /* Tools menu */
1808         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM)
1809         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddSenderToAB", "Tools/AddSenderToAB", GTK_UI_MANAGER_MENUITEM)
1810         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CollectAddresses", "Tools/CollectAddresses", GTK_UI_MANAGER_MENU)
1811         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromFolder", "Tools/CollectAddresses/FromFolder", GTK_UI_MANAGER_MENUITEM)
1812         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromSelected", "Tools/CollectAddresses/FromSelected", GTK_UI_MANAGER_MENUITEM)
1813         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator1", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1814
1815         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterFolder", "Tools/FilterFolder", GTK_UI_MANAGER_MENUITEM)
1816         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterSelected", "Tools/FilterSelected", GTK_UI_MANAGER_MENUITEM)
1817         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "RunProcessing", "Tools/RunProcessing", GTK_UI_MANAGER_MENUITEM)
1818         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateFilterRule", "Tools/CreateFilterRule", GTK_UI_MANAGER_MENU)
1819         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "Automatically", "Tools/CreateFilterRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1820         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByFrom", "Tools/CreateFilterRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1821         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByTo", "Tools/CreateFilterRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1822         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySubject", "Tools/CreateFilterRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1823
1824         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateProcessingRule", "Tools/CreateProcessingRule", GTK_UI_MANAGER_MENU)
1825         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "Automatically", "Tools/CreateProcessingRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1826         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByFrom", "Tools/CreateProcessingRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1827         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByTo", "Tools/CreateProcessingRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1828         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySubject", "Tools/CreateProcessingRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1829         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator2", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1830         
1831         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ListUrls", "Tools/ListUrls", GTK_UI_MANAGER_MENUITEM)
1832         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator3", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1833
1834         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Actions", "Tools/Actions", GTK_UI_MANAGER_MENU)
1835         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/Actions", "PlaceHolder", "Tools/Actions/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1836         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator4", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1837
1838         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CheckNewMessages", "Tools/CheckNewMessages", GTK_UI_MANAGER_MENUITEM)
1839         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DeleteDuplicates", "Tools/DeleteDuplicates", GTK_UI_MANAGER_MENU)
1840         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "SelFolder", "Tools/DeleteDuplicates/SelFolder", GTK_UI_MANAGER_MENUITEM)
1841         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "AllFolders", "Tools/DeleteDuplicates/AllFolders", GTK_UI_MANAGER_MENUITEM)
1842         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator5", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1843
1844         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Execute", "Tools/Execute", GTK_UI_MANAGER_MENUITEM)
1845         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Expunge", "Tools/Expunge", GTK_UI_MANAGER_MENUITEM)
1846 #ifdef USE_GNUTLS
1847         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator6", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1848         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "SSLCertificates", "Tools/SSLCertificates", GTK_UI_MANAGER_MENUITEM)
1849 #endif
1850         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator7", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1851         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilteringLog", "Tools/FilteringLog", GTK_UI_MANAGER_MENUITEM)
1852         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "NetworkLog", "Tools/NetworkLog", GTK_UI_MANAGER_MENUITEM)
1853 #ifdef G_OS_WIN32
1854         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DebugLog", "Tools/DebugLog", GTK_UI_MANAGER_MENUITEM)
1855 #endif
1856         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator8", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1857         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetSessionPasswords", "Tools/ForgetSessionPasswords", GTK_UI_MANAGER_MENUITEM)
1858 #ifndef PASSWORD_CRYPTO_OLD
1859         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetMasterPassphrase", "Tools/ForgetMasterPassphrase", GTK_UI_MANAGER_MENUITEM)
1860 #endif
1861         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator9", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1862
1863 /* Configuration menu */
1864         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "ChangeAccount", "Configuration/ChangeAccount", GTK_UI_MANAGER_MENU)
1865         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount", "PlaceHolder", "Configuration/ChangeAccount/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1866         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "AccountPrefs", "Configuration/AccountPrefs", GTK_UI_MANAGER_MENUITEM)
1867         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "CreateAccount", "Configuration/CreateAccount", GTK_UI_MANAGER_MENUITEM)
1868         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "EditAccounts", "Configuration/EditAccounts", GTK_UI_MANAGER_MENUITEM)
1869         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator1", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1870
1871         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Preferences", "Configuration/Preferences", GTK_UI_MANAGER_MENUITEM)
1872         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PreProcessing", "Configuration/PreProcessing", GTK_UI_MANAGER_MENUITEM)
1873         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PostProcessing", "Configuration/PostProcessing", GTK_UI_MANAGER_MENUITEM)
1874         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Filtering", "Configuration/Filtering", GTK_UI_MANAGER_MENUITEM)
1875         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Templates", "Configuration/Templates", GTK_UI_MANAGER_MENUITEM)
1876         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Actions", "Configuration/Actions", GTK_UI_MANAGER_MENUITEM)
1877         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Tags", "Configuration/Tags", GTK_UI_MANAGER_MENUITEM)
1878
1879         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator2", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1880         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Plugins", "Configuration/Plugins", GTK_UI_MANAGER_MENUITEM)
1881
1882 /* Help menu */
1883         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Manual", "Help/Manual", GTK_UI_MANAGER_MENUITEM)
1884         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "FAQ", "Help/FAQ", GTK_UI_MANAGER_MENUITEM)
1885         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "IconLegend", "Help/IconLegend", GTK_UI_MANAGER_MENUITEM)
1886 #ifdef G_OS_WIN32
1887         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator1", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1888         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "SetDefault", "Help/SetDefault", GTK_UI_MANAGER_MENUITEM)
1889 #endif
1890         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator2", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1891         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "About", "Help/About", GTK_UI_MANAGER_MENUITEM)
1892
1893
1894         menubar = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu");
1895         if (prefs_common.mainwin_menubar)
1896                 gtk_widget_show_all(menubar);
1897         else
1898                 gtk_widget_hide(menubar);
1899         gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1900
1901         /* Create a menu container for the different popup menus we
1902          * will be adding from other UI elements. */
1903         MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR)
1904
1905         gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
1906
1907         if (prefs_common.toolbar_detachable) {
1908                 handlebox = gtk_handle_box_new();
1909                 gtk_widget_show(handlebox);
1910                 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1911                 g_signal_connect(G_OBJECT(handlebox), "child_attached",
1912                                  G_CALLBACK(toolbar_child_attached), mainwin);
1913                 g_signal_connect(G_OBJECT(handlebox), "child_detached",
1914                                  G_CALLBACK(toolbar_child_detached), mainwin);
1915         } else {
1916                 handlebox = gtk_hbox_new(FALSE, 0);
1917                 gtk_widget_show(handlebox);
1918                 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1919         }
1920         /* link window to mainwin->window to avoid gdk warnings */
1921         mainwin->window       = window;
1922         mainwin_list = g_list_append(mainwin_list, mainwin);
1923         
1924         mainwin->toolbar = toolbar_create(TOOLBAR_MAIN, 
1925                                           handlebox, 
1926                                           (gpointer)mainwin);
1927         toolbar_set_learn_button
1928                 (mainwin->toolbar,
1929                  LEARN_SPAM);
1930
1931         /* vbox that contains body */
1932         vbox_body = gtk_vbox_new(FALSE, BORDER_WIDTH);
1933         gtk_widget_show(vbox_body);
1934         gtk_container_set_border_width(GTK_CONTAINER(vbox_body), BORDER_WIDTH);
1935         gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1936
1937 #ifndef GENERIC_UMPC
1938         hbox_stat = gtk_hbox_new(FALSE, 2);
1939         gtk_box_pack_end(GTK_BOX(vbox_body), hbox_stat, FALSE, FALSE, 0);
1940
1941         warning_icon = gtk_image_new_from_stock
1942                         (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
1943         warning_btn = gtk_event_box_new();
1944         gtk_event_box_set_visible_window(GTK_EVENT_BOX(warning_btn), FALSE);
1945         
1946         mainwin->warning_btn      = warning_btn;
1947         
1948         g_signal_connect(G_OBJECT(warning_btn), "button-press-event", 
1949                          G_CALLBACK(warning_icon_pressed),
1950                          (gpointer) mainwin);
1951         g_signal_connect(G_OBJECT(warning_btn), "motion-notify-event",
1952                          G_CALLBACK(warning_visi_notify), mainwin);
1953         g_signal_connect(G_OBJECT(warning_btn), "leave-notify-event",
1954                          G_CALLBACK(warning_leave_notify), mainwin);
1955         g_signal_connect(G_OBJECT(warning_btn), "enter-notify-event",
1956                          G_CALLBACK(warning_enter_notify), mainwin);
1957
1958         gtk_container_add (GTK_CONTAINER(warning_btn), warning_icon);
1959
1960         CLAWS_SET_TIP(warning_btn, 
1961                              _("Some error(s) happened. Click here to view log."));
1962         gtk_box_pack_start(GTK_BOX(hbox_stat), warning_btn, FALSE, FALSE, 0);
1963
1964         statusbar = statusbar_create();
1965         gtk_box_pack_start(GTK_BOX(hbox_stat), statusbar, TRUE, TRUE, 0);
1966
1967         progressbar = gtk_progress_bar_new();
1968         gtk_widget_set_size_request(progressbar, 120, 1);
1969         gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
1970
1971         online_pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
1972         offline_pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
1973         online_switch = gtk_button_new ();
1974         gtk_widget_set_can_focus(online_switch, FALSE);
1975         CLAWS_SET_TIP(online_switch, 
1976                              _("You are online. Click the icon to go offline"));
1977         offline_switch = gtk_button_new ();
1978         CLAWS_SET_TIP(offline_switch, 
1979                              _("You are offline. Click the icon to go online"));
1980         gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
1981         gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1982         g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1983         gtk_box_pack_start (GTK_BOX(hbox_stat), online_switch, FALSE, FALSE, 0);
1984         gtk_container_add (GTK_CONTAINER(offline_switch), offline_pixmap);
1985         gtk_button_set_relief (GTK_BUTTON(offline_switch), GTK_RELIEF_NONE);
1986         g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1987         gtk_box_pack_start (GTK_BOX(hbox_stat), offline_switch, FALSE, FALSE, 0);
1988         
1989         statuslabel = gtk_label_new("");
1990         gtk_box_pack_start(GTK_BOX(hbox_stat), statuslabel, FALSE, FALSE, 0);
1991
1992         ac_button = gtk_button_new();
1993         CLAWS_SET_TIP(ac_button, _("Select account"));
1994         gtk_widget_set_can_focus(ac_button, FALSE);
1995         gtk_widget_set_size_request(ac_button, -1, 0);
1996         gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
1997         g_signal_connect(G_OBJECT(ac_button), "button_press_event",
1998                          G_CALLBACK(ac_label_button_pressed), mainwin);
1999
2000         ac_label = gtk_label_new("");
2001         gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
2002
2003         gtk_widget_show_all(hbox_stat);
2004
2005         gtk_widget_hide(offline_switch);
2006         gtk_widget_hide(progressbar);
2007         gtk_widget_hide(warning_btn);
2008 #else
2009         online_switch = gtk_button_new ();
2010         offline_switch = gtk_button_new ();
2011         g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2012         g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2013 #endif
2014         /* create views */
2015         mainwin->folderview  = folderview  = folderview_create(mainwin);
2016         mainwin->summaryview = summaryview = summary_create(mainwin);
2017         mainwin->messageview = messageview = messageview_create(mainwin);
2018
2019         /* init log instances data before creating log views */
2020         set_log_title(LOG_PROTOCOL, _("Network log"));
2021         set_log_prefs(LOG_PROTOCOL,
2022                         &prefs_common.logwin_width,
2023                         &prefs_common.logwin_height);
2024         set_log_title(LOG_DEBUG_FILTERING, _("Filtering/Processing debug log"));
2025         set_log_prefs(LOG_DEBUG_FILTERING,
2026                         &prefs_common.filtering_debugwin_width,
2027                         &prefs_common.filtering_debugwin_height);
2028
2029         /* setup log windows */
2030         mainwin->logwin = log_window_create(LOG_PROTOCOL);
2031         log_window_init(mainwin->logwin);
2032
2033         mainwin->filtering_debugwin = log_window_create(LOG_DEBUG_FILTERING);
2034         log_window_set_clipping(mainwin->logwin,
2035                                 prefs_common.cliplog,
2036                                 prefs_common.loglength);
2037
2038         log_window_init(mainwin->filtering_debugwin);
2039         log_window_set_clipping(mainwin->filtering_debugwin,
2040                                 prefs_common.filtering_debug_cliplog,
2041                                 prefs_common.filtering_debug_loglength);
2042         if (prefs_common.enable_filtering_debug)
2043                 log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
2044         else
2045                 log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
2046
2047         folderview->mainwin      = mainwin;
2048         folderview->summaryview  = summaryview;
2049
2050         summaryview->mainwin     = mainwin;
2051         summaryview->folderview  = folderview;
2052         summaryview->messageview = messageview;
2053         summaryview->window      = window;
2054
2055         mainwin->vbox           = vbox;
2056         mainwin->menubar        = menubar;
2057         mainwin->handlebox      = handlebox;
2058         mainwin->vbox_body      = vbox_body;
2059         mainwin->online_switch  = online_switch;
2060         mainwin->offline_switch    = offline_switch;
2061 #ifndef GENERIC_UMPC
2062         messageview->statusbar  = statusbar;
2063         mainwin->statusbar      = statusbar;
2064         mainwin->hbox_stat      = hbox_stat;
2065         mainwin->progressbar    = progressbar;
2066         mainwin->statuslabel    = statuslabel;
2067         mainwin->online_pixmap  = online_pixmap;
2068         mainwin->offline_pixmap = offline_pixmap;
2069         mainwin->ac_button      = ac_button;
2070         mainwin->ac_label       = ac_label;
2071         /* set context IDs for status bar */
2072         mainwin->mainwin_cid = gtk_statusbar_get_context_id
2073                 (GTK_STATUSBAR(statusbar), "Main Window");
2074         mainwin->folderview_cid = gtk_statusbar_get_context_id
2075                 (GTK_STATUSBAR(statusbar), "Folder View");
2076         mainwin->summaryview_cid = gtk_statusbar_get_context_id
2077                 (GTK_STATUSBAR(statusbar), "Summary View");
2078         mainwin->messageview_cid = gtk_statusbar_get_context_id
2079                 (GTK_STATUSBAR(statusbar), "Message View");
2080         messageview->statusbar_cid = mainwin->messageview_cid;
2081
2082 #else
2083         messageview->statusbar  = NULL;
2084         mainwin->statusbar      = NULL;
2085         mainwin->hbox_stat      = NULL;
2086         /* mainwin->progressbar is set in toolbar.c */
2087         mainwin->statuslabel    = NULL;
2088         mainwin->online_pixmap  = NULL;
2089         mainwin->offline_pixmap = NULL;
2090         mainwin->ac_button      = NULL;
2091         mainwin->ac_label       = NULL;
2092 #endif
2093         
2094         /* allocate colors for summary view and folder view */
2095         summaryview->color_marked.red = summaryview->color_marked.green = 0;
2096         summaryview->color_marked.blue = (guint16)65535;
2097
2098         summaryview->color_dim.red = summaryview->color_dim.green =
2099                 summaryview->color_dim.blue = COLOR_DIM;
2100
2101         gtkut_convert_int_to_gdk_color(prefs_common.color[COL_NEW],
2102                                        &folderview->color_new);
2103
2104         gtkut_convert_int_to_gdk_color(prefs_common.color[COL_TGT_FOLDER],
2105                                        &folderview->color_op);
2106
2107         color[0] = summaryview->color_marked;
2108         color[1] = summaryview->color_dim;
2109         color[2] = folderview->color_new;
2110         color[3] = folderview->color_op;
2111
2112         colormap = gdk_drawable_get_colormap(gtk_widget_get_window(window));
2113         gdk_colormap_alloc_colors(colormap, color, 4, FALSE, TRUE, success);
2114         for (i = 0; i < 4; i++) {
2115                 if (success[i] == FALSE)
2116                         g_warning("MainWindow: color allocation %d failed", i);
2117         }
2118
2119         debug_print("done.\n");
2120
2121         messageview->visible = prefs_common.msgview_visible;
2122
2123         main_window_set_widgets(mainwin, prefs_common.layout_mode);
2124
2125         g_signal_connect(G_OBJECT(window), "size_allocate",
2126                          G_CALLBACK(main_window_size_allocate_cb),
2127                          mainwin);
2128
2129         /* set menu items */
2130         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Encoding/"CS_AUTO, TRUE);
2131
2132         menuitem = NULL;
2133         switch (prefs_common.toolbar_style) {
2134         case TOOLBAR_NONE:
2135                 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/Hide");
2136                 break;
2137         case TOOLBAR_ICON:
2138                 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/IconOnly");
2139                 break;
2140         case TOOLBAR_TEXT:
2141                 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextOnly");
2142                 break;
2143         case TOOLBAR_BOTH:
2144                 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBelowIcon");
2145                 break;
2146         case TOOLBAR_BOTH_HORIZ:
2147                 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBesideIcon");
2148         }
2149         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
2150
2151         toolbar_set_style(mainwin->toolbar->toolbar, 
2152                           mainwin->handlebox, 
2153                           prefs_common.toolbar_style);
2154 #ifndef GENERIC_UMPC
2155         gtk_widget_hide(mainwin->hbox_stat);
2156         menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/StatusBar");
2157         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2158                                        prefs_common.show_statusbar);
2159 #endif  
2160         menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/ColumnHeaders");
2161         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2162                                        prefs_common.show_col_headers);
2163         /* set account selection menu */
2164         ac_menu = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount");
2165         mainwin->ac_menu = ac_menu;
2166
2167         toolbar_main_set_sensitive(mainwin);
2168
2169         /* create actions menu */
2170         main_window_update_actions_menu(mainwin);
2171
2172         main_create_mailing_list_menu (mainwin, NULL);
2173
2174         /* attach accel groups to main window */
2175 #define ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win)                        \
2176         gtk_window_add_accel_group                                      \
2177                 (GTK_WINDOW(win),                                       \
2178                  gtk_ui_manager_get_accel_group(gtkut_ui_manager()));
2179
2180         ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
2181         
2182         g_signal_connect(G_OBJECT(window), "window_state_event",
2183                          G_CALLBACK(mainwindow_state_event_cb), mainwin);
2184         g_signal_connect(G_OBJECT(window), "visibility_notify_event",
2185                          G_CALLBACK(mainwindow_visibility_event_cb), mainwin);
2186         gtk_widget_add_events(GTK_WIDGET(window), GDK_VISIBILITY_NOTIFY_MASK);
2187
2188         if (prefs_common.layout_mode == VERTICAL_LAYOUT ||
2189             prefs_common.layout_mode == SMALL_LAYOUT) {
2190                 summary_relayout(mainwin->summaryview); 
2191         }
2192         summary_update_unread(mainwin->summaryview, NULL);
2193         
2194         /* initialize views */
2195         folderview_init(folderview);
2196         summary_init(summaryview);
2197         messageview_init(messageview);
2198 #ifdef USE_GNUTLS
2199         sslcertwindow_register_hook();
2200 #endif
2201         mainwin->lock_count = 0;
2202         mainwin->menu_lock_count = 0;
2203         mainwin->cursor_count = 0;
2204
2205         mainwin->progressindicator_hook =
2206                 hooks_register_hook(PROGRESSINDICATOR_HOOKLIST, mainwindow_progressindicator_hook, mainwin);
2207
2208         if (!watch_cursor)
2209                 watch_cursor = gdk_cursor_new(GDK_WATCH);
2210         if (!hand_cursor)
2211                 hand_cursor = gdk_cursor_new(GDK_HAND2);
2212
2213         /* init work_offline */
2214         if (prefs_common.work_offline)
2215                 online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
2216
2217         mainwindow_colorlabel_menu_create(mainwin, FALSE);
2218         mainwindow_tags_menu_create(mainwin, FALSE);
2219
2220         if (prefs_common.mainwin_fullscreen) {
2221                 cm_toggle_menu_set_active_full(mainwin->ui_manager, 
2222                         "Menu/View/FullScreen",
2223                         TRUE);
2224         }
2225         if (prefs_common.mainwin_menubar)
2226                 cm_toggle_menu_set_active_full(mainwin->ui_manager,"Menu/View/ShowHide/MenuBar", TRUE);
2227         
2228         return mainwin;
2229 }
2230
2231 void main_window_update_actions_menu(MainWindow *mainwin)
2232 {
2233         action_update_mainwin_menu(mainwin->ui_manager, "/Menu/Tools/Actions", mainwin);
2234 }
2235
2236 void main_window_cursor_wait(MainWindow *mainwin)
2237 {
2238
2239         if (mainwin->cursor_count == 0) {
2240                 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), watch_cursor);
2241                 textview_cursor_wait(mainwin->messageview->mimeview->textview);
2242         }
2243         
2244         mainwin->cursor_count++;
2245
2246         gdk_flush();
2247 }
2248
2249 void main_window_cursor_normal(MainWindow *mainwin)
2250 {
2251         if (mainwin->cursor_count)
2252                 mainwin->cursor_count--;
2253
2254         if (mainwin->cursor_count == 0) {
2255                 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), NULL);
2256                 textview_cursor_normal(mainwin->messageview->mimeview->textview);
2257         }
2258         gdk_flush();
2259 }
2260
2261 /* lock / unlock the user-interface */
2262 void main_window_lock(MainWindow *mainwin)
2263 {
2264         if (mainwin->lock_count == 0 && mainwin->ac_button)
2265                 gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
2266
2267         mainwin->lock_count++;
2268
2269         main_window_set_menu_sensitive(mainwin);
2270         toolbar_main_set_sensitive(mainwin);
2271 }
2272
2273 void main_window_unlock(MainWindow *mainwin)
2274 {
2275         if (mainwin->lock_count)
2276                 mainwin->lock_count--;
2277
2278         main_window_set_menu_sensitive(mainwin);
2279         toolbar_main_set_sensitive(mainwin);
2280
2281         if (mainwin->lock_count == 0 && mainwin->ac_button)
2282                 gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
2283 }
2284
2285 static void main_window_menu_callback_block(MainWindow *mainwin)
2286 {
2287         mainwin->menu_lock_count++;
2288 }
2289
2290 static void main_window_menu_callback_unblock(MainWindow *mainwin)
2291 {
2292         if (mainwin->menu_lock_count)
2293                 mainwin->menu_lock_count--;
2294 }
2295
2296 static guint prefs_tag = 0;
2297
2298 void main_window_reflect_prefs_all(void)
2299 {
2300         main_window_reflect_prefs_all_real(FALSE);
2301 }
2302
2303 static gboolean reflect_prefs_timeout_cb(gpointer data) 
2304 {
2305         gboolean pixmap_theme_changed = GPOINTER_TO_INT(data);
2306         GList *cur;
2307         MainWindow *mainwin;
2308 #ifndef GENERIC_UMPC
2309         GtkWidget *pixmap;
2310 #endif
2311         for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2312                 mainwin = (MainWindow *)cur->data;
2313
2314                 main_window_show_cur_account(mainwin);
2315                 main_window_set_menu_sensitive(mainwin);
2316                 toolbar_main_set_sensitive(mainwin);
2317
2318                 /* pixmap themes */
2319                 if (pixmap_theme_changed) {
2320                         toolbar_update(TOOLBAR_MAIN, mainwin);
2321                         messageview_reflect_prefs_pixmap_theme();
2322                         compose_reflect_prefs_pixmap_theme();
2323                         folderview_reinit_fonts(mainwin->folderview);
2324                         summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
2325                         foldersel_reflect_prefs_pixmap_theme();
2326 #ifndef USE_ALT_ADDRBOOK
2327                         addressbook_reflect_prefs_pixmap_theme();
2328 #endif
2329 #ifndef GENERIC_UMPC
2330                         pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
2331                         gtk_container_remove(GTK_CONTAINER(mainwin->online_switch), 
2332                                              mainwin->online_pixmap);
2333                         gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
2334                         gtk_widget_show(pixmap);
2335                         mainwin->online_pixmap = pixmap;
2336                         pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
2337                         gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch), 
2338                                              mainwin->offline_pixmap);
2339                         gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
2340                         gtk_widget_show(pixmap);
2341                         mainwin->offline_pixmap = pixmap;
2342 #endif
2343                         hooks_invoke(THEME_CHANGED_HOOKLIST, NULL);
2344                 }
2345                 
2346                 headerview_set_font(mainwin->messageview->headerview);
2347                 headerview_set_visibility(mainwin->messageview->headerview,
2348                                           prefs_common.display_header_pane);
2349                 textview_reflect_prefs(mainwin->messageview->mimeview->textview);
2350                 folderview_reflect_prefs();
2351                 summary_reflect_prefs();
2352 #ifndef GENERIC_UMPC
2353                 summary_redisplay_msg(mainwin->summaryview);
2354 #endif
2355                 if (prefs_common.layout_mode == SMALL_LAYOUT) {
2356                         if (mainwin->in_folder) {
2357                                 mainwindow_enter_folder(mainwin);
2358                         } else {
2359                                 mainwindow_exit_folder(mainwin);
2360                         }
2361                 }
2362         }
2363         prefs_tag = 0;
2364         return FALSE;
2365 }
2366
2367 void main_window_reflect_prefs_all_now(void)
2368 {
2369         reflect_prefs_timeout_cb(GINT_TO_POINTER(FALSE));
2370 }
2371
2372 void main_window_reflect_prefs_custom_colors(MainWindow *mainwin)
2373 {
2374         GtkMenuShell *menu;
2375         GList *children, *cur;
2376
2377         /* re-create colorlabel submenu */
2378         menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
2379         cm_return_if_fail(menu != NULL);
2380
2381         /* clear items. get item pointers. */
2382         children = gtk_container_get_children(GTK_CONTAINER(menu));
2383         for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2384                 g_signal_handlers_disconnect_matched
2385                          (gtk_ui_manager_get_accel_group(mainwin->ui_manager), 
2386                          G_SIGNAL_MATCH_DATA|G_SIGNAL_MATCH_FUNC,
2387                          0, 0, NULL, mainwin_accel_changed_cb, cur->data);
2388                 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2389         }
2390         g_list_free(children);
2391         mainwindow_colorlabel_menu_create(mainwin, TRUE);
2392         summary_reflect_prefs_custom_colors(mainwin->summaryview);
2393         folderview_reinit_fonts(mainwin->folderview);
2394 }
2395
2396 static gint tags_tag = 0;
2397 static gboolean main_window_reflect_tags_changes_real(gpointer data)
2398 {
2399         GtkMenuShell *menu;
2400         GList *children, *cur;
2401         MainWindow *mainwin = (MainWindow *)data;
2402
2403         if (summary_is_locked(mainwin->summaryview)) {
2404                 return TRUE;
2405         }
2406         /* re-create tags submenu */
2407         menu = GTK_MENU_SHELL(mainwin->tags_menu);
2408         cm_return_val_if_fail(menu != NULL, FALSE);
2409
2410         /* clear items. get item pointers. */
2411         children = gtk_container_get_children(GTK_CONTAINER(menu));
2412         for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2413                 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2414         }
2415         g_list_free(children);
2416         mainwindow_tags_menu_create(mainwin, TRUE);
2417         summary_reflect_tags_changes(mainwin->summaryview);
2418         
2419         tags_tag = 0;
2420         return FALSE;
2421 }
2422
2423 void main_window_reflect_tags_changes(MainWindow *mainwin)
2424 {
2425         if (tags_tag == 0) {
2426                 tags_tag = g_timeout_add(100, main_window_reflect_tags_changes_real, 
2427                                                 mainwin);
2428         }
2429 }
2430
2431 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
2432 {
2433         if (prefs_tag == 0) {
2434                 prefs_tag = g_timeout_add(100, reflect_prefs_timeout_cb, 
2435                                                 GINT_TO_POINTER(pixmap_theme_changed));
2436         }
2437 }
2438
2439 void main_window_set_summary_column(void)
2440 {
2441         GList *cur;
2442         MainWindow *mainwin;
2443
2444         for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2445                 mainwin = (MainWindow *)cur->data;
2446                 summary_set_column_order(mainwin->summaryview);
2447         }
2448 }
2449
2450 void main_window_set_folder_column(void)
2451 {
2452         GList *cur;
2453         MainWindow *mainwin;
2454
2455         for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2456                 mainwin = (MainWindow *)cur->data;
2457                 folderview_set_column_order(mainwin->folderview);
2458         }
2459 }
2460
2461 static void main_window_set_account_selector_menu(MainWindow *mainwin,
2462                                                   GList *account_list)
2463 {
2464         GList *cur_ac;
2465         GtkWidget *menuitem;
2466         PrefsAccount *ac_prefs;
2467         GtkWidget *menu;
2468         gchar *accel_path;
2469
2470         menu = gtk_menu_new();
2471         gtk_menu_set_accel_group (GTK_MENU (menu), 
2472                 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
2473
2474         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2475                 ac_prefs = (PrefsAccount *)cur_ac->data;
2476
2477                 menuitem = gtk_menu_item_new_with_label
2478                         (ac_prefs->account_name
2479                          ? ac_prefs->account_name : _("Untitled"));
2480                 gtk_widget_show(menuitem);
2481                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2482                 g_signal_connect(G_OBJECT(menuitem), "activate",
2483                                  G_CALLBACK(account_selector_menu_cb),
2484                                  ac_prefs);
2485                 accel_path = g_strconcat("<Actions>/Menu/Configuration/ChangeAccount/",(ac_prefs->account_name
2486                          ? ac_prefs->account_name : _("Untitled")), NULL );
2487                 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), accel_path);
2488                 g_free(accel_path);
2489         }
2490         gtk_menu_item_set_submenu(GTK_MENU_ITEM(mainwin->ac_menu), menu);
2491 }
2492
2493 static void main_window_set_account_receive_menu(MainWindow *mainwin,
2494                                                  GList *account_list)
2495 {
2496         GList *children, *child;
2497         GtkWidget *menu;
2498         GtkWidget *menuitem;
2499         PrefsAccount *ac_prefs;
2500
2501         menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
2502                 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
2503
2504         /* search for separator */
2505         children = gtk_container_get_children(GTK_CONTAINER(menu));
2506         for (child = children; child != NULL; child = child->next) {
2507                 if (child->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
2508                         child = child->next;
2509                         break;
2510                 }
2511         }
2512
2513         /* destroy all previous menu item */
2514         while (child != NULL) {
2515                 gtk_widget_destroy(GTK_WIDGET(child->data));
2516                 child = child->next;
2517         }
2518
2519         g_list_free(children);
2520
2521         for (child = account_list; child != NULL; child = child->next) {
2522                 ac_prefs = (PrefsAccount *)child->data;
2523
2524                 if (ac_prefs->protocol == A_NONE)
2525                         continue;
2526
2527                 menuitem = gtk_menu_item_new_with_label
2528                         (ac_prefs->account_name ? ac_prefs->account_name
2529                          : _("Untitled"));
2530                 gtk_widget_show(menuitem);
2531                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2532                 g_signal_connect(G_OBJECT(menuitem), "activate",
2533                                  G_CALLBACK(account_receive_menu_cb),
2534                                  ac_prefs);
2535         }
2536 }
2537
2538 static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
2539                                                        GList *account_list)
2540 {
2541         GList *cur_ac;
2542         GtkWidget *menuitem;
2543         PrefsAccount *ac_prefs;
2544         GtkWidget *menu = NULL;
2545
2546         if (mainwin->toolbar->getall_btn == NULL) /* button doesn't exist */
2547                 return;
2548
2549         menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn));
2550         if (menu)
2551                 gtk_widget_destroy(menu);
2552         menu = gtk_menu_new();
2553
2554         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2555                 ac_prefs = (PrefsAccount *)cur_ac->data;
2556
2557                 if (ac_prefs->protocol == A_NONE)
2558                         continue;
2559
2560                 menuitem = gtk_menu_item_new_with_label
2561                         (ac_prefs->account_name
2562                          ? ac_prefs->account_name : _("Untitled"));
2563                 gtk_widget_show(menuitem);
2564                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2565                 g_signal_connect(G_OBJECT(menuitem), "activate",
2566                                  G_CALLBACK(account_receive_menu_cb),
2567                                  ac_prefs);
2568         }
2569         gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn), menu);
2570 }
2571
2572 static void main_window_set_toolbar_combo_compose_menu(MainWindow *mainwin,
2573                                                        GList *account_list)
2574 {
2575 #ifndef GENERIC_UMPC
2576         GList *cur_ac;
2577         GtkWidget *menuitem;
2578         PrefsAccount *ac_prefs;
2579         GtkWidget *menu = NULL;
2580
2581         if (mainwin->toolbar->compose_mail_btn == NULL) /* button doesn't exist */
2582                 return;
2583
2584         menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn));
2585         if (menu)
2586                 gtk_widget_destroy(menu);
2587         menu = gtk_menu_new();
2588
2589         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2590                 ac_prefs = (PrefsAccount *)cur_ac->data;
2591
2592                 menuitem = gtk_menu_item_new_with_label
2593                         (ac_prefs->account_name
2594                          ? ac_prefs->account_name : _("Untitled"));
2595                 gtk_widget_show(menuitem);
2596                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2597                 g_signal_connect(G_OBJECT(menuitem), "activate",
2598                                  G_CALLBACK(account_compose_menu_cb),
2599                                  ac_prefs);
2600         }
2601         gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn), menu);
2602 #endif
2603 }
2604
2605 void main_window_set_account_menu(GList *account_list)
2606 {
2607         GList *cur;
2608         MainWindow *mainwin;
2609
2610         for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2611                 mainwin = (MainWindow *)cur->data;
2612                 main_window_set_account_selector_menu(mainwin, account_list);
2613                 main_window_set_account_receive_menu(mainwin, account_list);
2614                 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2615                 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2616         }
2617         hooks_invoke(ACCOUNT_LIST_CHANGED_HOOKLIST, NULL);
2618 }
2619
2620 void main_window_set_account_menu_only_toolbar(GList *account_list)
2621 {
2622         GList *cur;
2623         MainWindow *mainwin;
2624
2625         for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2626                 mainwin = (MainWindow *)cur->data;
2627                 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2628                 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2629         }
2630 }
2631
2632 static void main_window_show_cur_account(MainWindow *mainwin)
2633 {
2634         gchar *buf;
2635         gchar *ac_name;
2636
2637         ac_name = g_strdup(cur_account
2638                            ? (cur_account->account_name
2639                               ? cur_account->account_name : _("Untitled"))
2640                            : _("none"));
2641
2642         if (cur_account)
2643                 buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
2644         else
2645                 buf = g_strdup(PROG_VERSION);
2646         gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
2647         g_free(buf);
2648
2649         if (mainwin->ac_label)
2650                 gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
2651         if (mainwin->ac_button)
2652                 gtk_widget_queue_resize(mainwin->ac_button);
2653
2654         g_free(ac_name);
2655 }
2656 #ifndef GENERIC_UMPC
2657 static void main_window_separation_change(MainWindow *mainwin, LayoutType layout_mode)
2658 {
2659         GtkWidget *folder_wid  = GTK_WIDGET_PTR(mainwin->folderview);
2660         GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
2661         GtkWidget *message_wid = mainwin->messageview->vbox;
2662
2663         if (layout_mode == prefs_common.layout_mode) 
2664                 return;
2665
2666         debug_print("Changing window separation type from %d to %d\n",
2667                     prefs_common.layout_mode, layout_mode);
2668
2669         /* remove widgets from those containers */
2670         g_object_ref(folder_wid);
2671         g_object_ref(summary_wid);
2672         g_object_ref(message_wid);
2673         gtkut_container_remove
2674                 (GTK_CONTAINER(gtk_widget_get_parent(folder_wid)), folder_wid);
2675         gtkut_container_remove
2676                 (GTK_CONTAINER(gtk_widget_get_parent(summary_wid)), summary_wid);
2677         gtkut_container_remove
2678                 (GTK_CONTAINER(gtk_widget_get_parent(message_wid)), message_wid);
2679
2680         gtk_widget_hide(mainwin->window);
2681         main_window_set_widgets(mainwin, layout_mode);
2682         gtk_widget_show(mainwin->window);
2683
2684         g_object_unref(folder_wid);
2685         g_object_unref(summary_wid);
2686         g_object_unref(message_wid);
2687 }
2688 #endif
2689 void mainwindow_reset_paned(GtkPaned *paned)
2690 {
2691                 gint min, max, mid;
2692
2693                 if (gtk_paned_get_child1(GTK_PANED(paned)))
2694                         gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2695                 if (gtk_paned_get_child2(GTK_PANED(paned)))
2696                         gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2697
2698 GTK_EVENTS_FLUSH();
2699                 g_object_get (G_OBJECT(paned),
2700                                 "min-position",
2701                                 &min, NULL);
2702                 g_object_get (G_OBJECT(paned),
2703                                 "max-position",
2704                                 &max, NULL);
2705                 mid = (min+max)/2;
2706                 gtk_paned_set_position(GTK_PANED(paned), mid);
2707 }
2708
2709 static void mainwin_paned_show_first(GtkPaned *paned)
2710 {
2711                 gint max;
2712                 g_object_get (G_OBJECT(paned),
2713                                 "max-position",
2714                                 &max, NULL);
2715
2716                 if (gtk_paned_get_child1(GTK_PANED(paned)))
2717                         gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2718                 if (gtk_paned_get_child2(GTK_PANED(paned)))
2719                         gtk_widget_hide(gtk_paned_get_child2(GTK_PANED(paned)));
2720                 gtk_paned_set_position(GTK_PANED(paned), max);
2721 }
2722
2723 static void mainwin_paned_show_last(GtkPaned *paned)
2724 {
2725                 gint min;
2726                 g_object_get (G_OBJECT(paned),
2727                                 "min-position",
2728                                 &min, NULL);
2729
2730                 if (gtk_paned_get_child1(GTK_PANED(paned)))
2731                         gtk_widget_hide(gtk_paned_get_child1(GTK_PANED(paned)));
2732                 if (gtk_paned_get_child2(GTK_PANED(paned)))
2733                         gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2734                 gtk_paned_set_position(GTK_PANED(paned), min);
2735 }
2736
2737 void main_window_toggle_message_view(MainWindow *mainwin)
2738 {
2739         SummaryView *summaryview = mainwin->summaryview;
2740         GtkWidget *ppaned = NULL;
2741         GtkWidget *container = NULL;
2742
2743         switch (prefs_common.layout_mode) {
2744         case NORMAL_LAYOUT:
2745         case VERTICAL_LAYOUT:
2746         case SMALL_LAYOUT:
2747                 ppaned = mainwin->vpaned;
2748                 container = mainwin->hpaned;
2749                 if (gtk_widget_get_parent(ppaned) != NULL) {
2750                         mainwin->messageview->visible = FALSE;
2751                         summaryview->displayed = NULL;
2752                         g_object_ref(ppaned);
2753                         gtkut_container_remove(GTK_CONTAINER(container), ppaned);
2754                         gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
2755                 } else {
2756                         mainwin->messageview->visible = TRUE;
2757                         gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), ppaned);
2758                         gtk_container_add(GTK_CONTAINER(container), ppaned);
2759                         g_object_unref(ppaned);
2760                 }
2761                 break;
2762         case WIDE_LAYOUT:
2763                 container = mainwin->vpaned;
2764                 if (gtk_widget_get_parent(mainwin->messageview->vbox) != NULL) {
2765                         mainwin->messageview->visible = FALSE;
2766                         summaryview->displayed = NULL;
2767                         g_object_ref(mainwin->messageview->vbox);
2768                         gtkut_container_remove(GTK_CONTAINER(container), mainwin->messageview->vbox);
2769                 } else {
2770                         mainwin->messageview->visible = TRUE;
2771                         gtk_container_add(GTK_CONTAINER(container), mainwin->messageview->vbox);
2772                         g_object_unref(mainwin->messageview->vbox);
2773                 }
2774                 break;
2775         case WIDE_MSGLIST_LAYOUT:
2776                 g_warning("can't hide messageview in this wide msglist layout");
2777                 break;
2778         }
2779
2780         if (messageview_is_visible(mainwin->messageview))
2781                 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2782                               GTK_ARROW_DOWN, GTK_SHADOW_OUT);
2783         else
2784                 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2785                               GTK_ARROW_UP, GTK_SHADOW_OUT);
2786
2787         if (mainwin->messageview->visible == FALSE)
2788                 messageview_clear(mainwin->messageview);
2789
2790         main_window_set_menu_sensitive(mainwin);
2791
2792         prefs_common.msgview_visible = mainwin->messageview->visible;
2793
2794         if (messageview_is_visible(mainwin->messageview)) {
2795                 gtk_widget_queue_resize(mainwin->hpaned);
2796                 gtk_widget_queue_resize(mainwin->vpaned);
2797         }
2798         summary_grab_focus(summaryview);
2799         if (!summary_is_list(summaryview)) {
2800                 summary_show(summaryview, summaryview->folder_item);
2801         }
2802 }
2803
2804 void main_window_get_size(MainWindow *mainwin)
2805 {
2806         GtkAllocation allocation;
2807
2808         if (mainwin_list == NULL || mainwin->messageview == NULL) {
2809                 debug_print("called after messageview "
2810                             "has been deallocated!\n");
2811                 return;
2812         }
2813
2814         if (prefs_common.mainwin_fullscreen) {
2815                 debug_print("mainwin in full screen state. "
2816                             "Keeping original settings\n");
2817         }
2818
2819         gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2820         if (allocation.width > 1 && allocation.height > 1 && !prefs_common.mainwin_fullscreen) {
2821                 prefs_common.summaryview_width = allocation.width;
2822
2823                 if (messageview_is_visible(mainwin->messageview))
2824                         prefs_common.summaryview_height = allocation.height;
2825
2826                 prefs_common.mainview_width = allocation.width;
2827         }
2828
2829         gtk_widget_get_allocation(mainwin->window, &allocation);
2830         if (allocation.width > 1 && allocation.height > 1 &&
2831             !prefs_common.mainwin_maximised && !prefs_common.mainwin_fullscreen) {
2832                 prefs_common.mainview_height = allocation.height;
2833                 prefs_common.mainwin_width   = allocation.width;
2834                 prefs_common.mainwin_height  = allocation.height;
2835         }
2836
2837         gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2838         if (allocation.width > 1 && allocation.height > 1 &&
2839             !prefs_common.mainwin_fullscreen) {
2840                 prefs_common.folderview_width  = allocation.width;
2841                 prefs_common.folderview_height = allocation.height;
2842         }
2843         
2844         gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2845         if (allocation.width > 1 && allocation.height > 1 &&
2846             !prefs_common.mainwin_fullscreen) {
2847                 prefs_common.msgview_width = allocation.width;
2848                 prefs_common.msgview_height = allocation.height;
2849         }
2850
2851 /*      debug_print("summaryview size: %d x %d\n",
2852                     prefs_common.summaryview_width,
2853                     prefs_common.summaryview_height);
2854         debug_print("folderview size: %d x %d\n",
2855                     prefs_common.folderview_width,
2856                     prefs_common.folderview_height);
2857         debug_print("messageview size: %d x %d\n",
2858                     prefs_common.msgview_width,
2859                     prefs_common.msgview_height); */
2860 }
2861
2862 void main_window_get_position(MainWindow *mainwin)
2863 {
2864         gint x, y;
2865
2866         if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2867                 return;
2868
2869         gtkut_widget_get_uposition(mainwin->window, &x, &y);
2870
2871         prefs_common.mainview_x = x;
2872         prefs_common.mainview_y = y;
2873         prefs_common.mainwin_x = x;
2874         prefs_common.mainwin_y = y;
2875
2876         debug_print("main window position: %d, %d\n", x, y);
2877 }
2878
2879 void main_window_progress_on(MainWindow *mainwin)
2880 {
2881         gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2882 }
2883
2884 void main_window_progress_off(MainWindow *mainwin)
2885 {
2886         gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2887         gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2888 }
2889
2890 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2891 {
2892         if (confirm && procmsg_have_trashed_mails_fast()) {
2893                 AlertValue val;
2894                 
2895                 if (for_quit)
2896                         val = alertpanel(_("Empty trash"),
2897                                _("Delete all messages in trash folders?"),
2898                                GTK_STOCK_NO, GTK_STOCK_YES, _("Don't quit"),
2899                                                  ALERTFOCUS_SECOND);
2900                 else
2901                         val = alertpanel(_("Empty trash"),
2902                                _("Delete all messages in trash folders?"),
2903                                GTK_STOCK_NO, GTK_STOCK_YES, NULL,
2904                                                  ALERTFOCUS_SECOND);
2905                 if (val == G_ALERTALTERNATE) {
2906                         debug_print("will empty trash\n");
2907                 } else if (val == G_ALERTDEFAULT) {
2908                         debug_print("will not empty trash\n");
2909                         return TRUE;
2910                 } else {
2911                         return FALSE; /* cancel exit */
2912                 }
2913                 manage_window_focus_in(mainwin->window, NULL, NULL);
2914         }
2915
2916         procmsg_empty_all_trash();
2917
2918         if (mainwin->summaryview->folder_item &&
2919             mainwin->summaryview->folder_item->stype == F_TRASH)
2920                 folderview_grab_focus(mainwin->folderview);
2921         return TRUE;
2922 }
2923
2924 static void main_window_add_mailbox(MainWindow *mainwin)
2925 {
2926         gchar *path;
2927         Folder *folder;
2928
2929         path = input_dialog(_("Add mailbox"),
2930                             _("Input the location of the mailbox.\n"
2931                               "The location can be either the full path or relative to the \n"
2932                               "home directory.\n"
2933                               "If the location of an existing mailbox is specified, it will be\n"
2934                               "scanned automatically."),
2935                             "Mail");
2936         if (!path) return;
2937         if (folder_find_from_path(path)) {
2938                 alertpanel_error(_("The mailbox '%s' already exists."), path);
2939                 g_free(path);
2940                 return;
2941         }
2942         folder = folder_new(folder_get_class_from_string("mh"), 
2943                             !strcmp(path, "Mail") ? _("Mailbox") : 
2944                             g_path_get_basename(path), path);
2945         g_free(path);
2946
2947         if (folder->klass->create_tree(folder) < 0) {
2948                 alertpanel_error(_("Creation of the mailbox failed.\n"
2949                                    "Maybe some files already exist, or you don't have the permission to write there."));
2950                 folder_destroy(folder);
2951                 return;
2952         }
2953
2954         folder_add(folder);
2955         folder_set_ui_func(folder, scan_tree_func, mainwin);
2956         folder_scan_tree(folder, TRUE);
2957         folder_set_ui_func(folder, NULL, NULL);
2958 }
2959
2960 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2961 {
2962         SensitiveCondMask state = 0;
2963         SummarySelection selection;
2964         FolderItem *item = mainwin->summaryview->folder_item;
2965         GList *account_list = account_get_list();
2966         GSList *tmp;
2967         
2968         selection = summary_get_selection_type(mainwin->summaryview);
2969
2970 #define UPDATE_STATE(...) \
2971         do { \
2972                 state |= main_window_get_mask(__VA_ARGS__, -1); \
2973         } while (0)
2974
2975         if (mainwin->lock_count == 0 && !claws_is_starting())
2976                 UPDATE_STATE(M_UNLOCKED);
2977         if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2978                 UPDATE_STATE(M_MSG_EXIST);
2979         if (item && item->path && folder_item_parent(item) && !item->no_select) {
2980                 UPDATE_STATE(M_EXEC);
2981                 /*              if (item->folder->type != F_NEWS) */
2982                 UPDATE_STATE(M_ALLOW_DELETE);
2983
2984                 if (prefs_common.immediate_exec == 0
2985                     && mainwin->lock_count == 0)
2986                         UPDATE_STATE(M_DELAY_EXEC);
2987
2988                 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2989                     || selection != SUMMARY_NONE)
2990                         UPDATE_STATE(M_HIDE_READ_MSG);
2991
2992                 if ((selection == SUMMARY_NONE && item->hide_read_threads)
2993                     || selection != SUMMARY_NONE)
2994                         UPDATE_STATE(M_HIDE_READ_THREADS);
2995         }               
2996         if (mainwin->summaryview->threaded)
2997                 UPDATE_STATE(M_THREADED);
2998         else
2999                 UPDATE_STATE(M_UNTHREADED);
3000         if (selection == SUMMARY_SELECTED_SINGLE ||
3001             selection == SUMMARY_SELECTED_MULTIPLE)
3002                 UPDATE_STATE(M_TARGET_EXIST);
3003         if (selection == SUMMARY_SELECTED_SINGLE)
3004                 UPDATE_STATE(M_SINGLE_TARGET_EXIST);
3005         if (mainwin->summaryview->folder_item &&
3006             mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
3007                 UPDATE_STATE(M_NEWS);
3008         else
3009                 UPDATE_STATE(M_NOT_NEWS);
3010         if (mainwin->summaryview->folder_item &&
3011             (mainwin->summaryview->folder_item->stype != F_TRASH ||
3012              !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
3013                 UPDATE_STATE(M_NOT_TRASH);
3014
3015         if (mainwin->summaryview->folder_item
3016             && mainwin->summaryview->folder_item->stype != F_DRAFT)
3017                 UPDATE_STATE(M_NOT_DRAFT);
3018
3019         if (mainwin->summaryview->folder_item &&
3020             mainwin->summaryview->folder_item->stype == F_DRAFT)
3021                 UPDATE_STATE(M_DRAFT);
3022
3023         if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
3024                 UPDATE_STATE(M_ACTIONS_EXIST);
3025
3026         tmp = tags_get_list();
3027         if (tmp && g_slist_length(tmp))
3028                 UPDATE_STATE(M_TAGS_EXIST);
3029         g_slist_free(tmp);
3030
3031         if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
3032                 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
3033
3034         if (selection == SUMMARY_SELECTED_SINGLE &&
3035             (item &&
3036              (folder_has_parent_of_type(item, F_DRAFT) ||
3037               folder_has_parent_of_type(item, F_OUTBOX) ||
3038               folder_has_parent_of_type(item, F_QUEUE))))
3039                 UPDATE_STATE(M_ALLOW_REEDIT);
3040         if (cur_account)
3041                 UPDATE_STATE(M_HAVE_ACCOUNT);
3042         
3043         if (cur_account && cur_account->protocol != A_NONE)
3044                 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3045
3046         if (any_folder_want_synchronise())
3047                 UPDATE_STATE(M_WANT_SYNC);
3048
3049         if (item && item->prefs->processing && selection != SUMMARY_NONE)
3050                 UPDATE_STATE(M_HAVE_PROCESSING);
3051
3052         if (g_list_length(account_list) > 1)
3053                 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3054
3055         for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3056                 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3057                         UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3058                         break;
3059                 }
3060         }
3061
3062         for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3063                 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3064                         UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3065                         break;
3066                 }
3067         }
3068         
3069         if (procmsg_spam_can_learn() &&
3070             (mainwin->summaryview->folder_item &&
3071              mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3072              mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3073                 UPDATE_STATE(M_CAN_LEARN_SPAM);
3074         }
3075
3076         if (mainwin->summaryview->folder_item) {
3077                 UPDATE_STATE(M_FOLDER_SELECTED);
3078         }
3079
3080         if (inc_is_active())
3081                 UPDATE_STATE(M_INC_ACTIVE);
3082         if (imap_cancel_all_enabled())
3083                 UPDATE_STATE(M_INC_ACTIVE);
3084
3085         if (send_is_active() | procmsg_is_sending())
3086                 UPDATE_STATE(M_SEND_ACTIVE);
3087
3088         if (mainwin->summaryview->deleted > 0)
3089                 UPDATE_STATE(M_DELETED_EXISTS);
3090
3091         if (mainwin->summaryview->deleted > 0 ||
3092             mainwin->summaryview->moved > 0 ||
3093             mainwin->summaryview->copied > 0)
3094                 UPDATE_STATE(M_DELAY_EXEC);
3095
3096         if (summary_is_list(mainwin->summaryview))
3097                 UPDATE_STATE(M_SUMMARY_ISLIST);
3098
3099         if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3100                 UPDATE_STATE(M_IN_MSGLIST);
3101
3102         for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3103                 PrefsAccount *account = account_list->data;
3104                 if (account->session_passwd || account->session_smtp_passwd) {
3105                         UPDATE_STATE(M_SESSION_PASSWORDS);
3106                         break;
3107                 }
3108         }
3109
3110 #ifndef PASSWORD_CRYPTO_OLD
3111         if (master_passphrase_is_entered()) {
3112                 UPDATE_STATE(M_MASTER_PASSPHRASE);
3113         }
3114 #endif
3115
3116 #undef UPDATE_STATE
3117
3118         return state;
3119 }
3120
3121 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3122 {
3123         va_list args;
3124         gint i;
3125         SensitiveCondMask value;
3126         static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3127         static gboolean first_time = TRUE;
3128
3129         if (first_time) {
3130                 for (i = 0; i < M_MAX_RESERVED; i++)
3131                         SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3132                 first_time = FALSE;
3133         }
3134
3135         value = 0;
3136
3137         va_start(args, cond); 
3138         for (i = (gint) cond; i >= 0; i = va_arg(args, gint))
3139                 value |= SensitiveCond_table[i];
3140         va_end(args);
3141
3142         return value;
3143 }
3144
3145 void main_window_set_menu_sensitive(MainWindow *mainwin)
3146 {
3147         SensitiveCondMask state;
3148         gboolean sensitive;
3149         SummaryView *summaryview;
3150         gchar *menu_path;
3151         GtkWidget *menu;
3152         GList *children, *cur_item;
3153         gint i;
3154         gboolean mimepart_selected = FALSE;
3155
3156 #define N_ENTRIES 88
3157         static struct {
3158                 const gchar *entry;
3159                 SensitiveCondMask cond;
3160         } entry[N_ENTRIES];
3161
3162         i = 0;
3163 #define FILL_TABLE(entry_str, ...) \
3164 do { \
3165         entry[i].entry = (const gchar *) entry_str; entry[i++].cond = main_window_get_mask(__VA_ARGS__, -1); \
3166 } while (0)
3167
3168         FILL_TABLE("Menu/File/SaveAs", M_TARGET_EXIST);
3169         FILL_TABLE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3170         FILL_TABLE("Menu/File/Print", M_TARGET_EXIST);
3171         FILL_TABLE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3172         FILL_TABLE("Menu/File/Exit", M_UNLOCKED);
3173
3174         FILL_TABLE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3175         FILL_TABLE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3176         FILL_TABLE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3177         FILL_TABLE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3178
3179         FILL_TABLE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3180         FILL_TABLE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3181         FILL_TABLE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3182         FILL_TABLE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3183         FILL_TABLE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3184         FILL_TABLE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3185         FILL_TABLE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3186         FILL_TABLE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3187         FILL_TABLE("Menu/View/Goto/Prev", M_MSG_EXIST);
3188         FILL_TABLE("Menu/View/Goto/Next", M_MSG_EXIST);
3189         FILL_TABLE("Menu/View/Goto/PrevUnread", M_MSG_EXIST);
3190         FILL_TABLE("Menu/View/Goto/NextUnread", M_MSG_EXIST);
3191         FILL_TABLE("Menu/View/Goto/PrevNew", M_MSG_EXIST);
3192         FILL_TABLE("Menu/View/Goto/NextNew", M_MSG_EXIST);
3193         FILL_TABLE("Menu/View/Goto/PrevMarked", M_MSG_EXIST);
3194         FILL_TABLE("Menu/View/Goto/NextMarked", M_MSG_EXIST);
3195         FILL_TABLE("Menu/View/Goto/PrevLabeled", M_MSG_EXIST);
3196         FILL_TABLE("Menu/View/Goto/NextLabeled", M_MSG_EXIST);
3197         FILL_TABLE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3198         FILL_TABLE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3199         FILL_TABLE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3200         FILL_TABLE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3201         FILL_TABLE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3202         FILL_TABLE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3203         FILL_TABLE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3204         FILL_TABLE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3205
3206         FILL_TABLE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3207         FILL_TABLE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3208         FILL_TABLE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3209         FILL_TABLE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3210         FILL_TABLE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3211         FILL_TABLE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3212         FILL_TABLE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3213         FILL_TABLE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3214         FILL_TABLE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3215         FILL_TABLE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3216         FILL_TABLE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3217         FILL_TABLE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3218         FILL_TABLE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3219         FILL_TABLE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3220         FILL_TABLE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3221         FILL_TABLE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3222         FILL_TABLE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3223         FILL_TABLE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3224         FILL_TABLE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3225         FILL_TABLE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3226         FILL_TABLE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3227         FILL_TABLE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3228         FILL_TABLE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3229         FILL_TABLE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3230         FILL_TABLE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3231         FILL_TABLE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3232         FILL_TABLE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3233         FILL_TABLE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3234         FILL_TABLE("Menu/Message/Tags", M_TARGET_EXIST);
3235         FILL_TABLE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3236         FILL_TABLE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3237
3238         FILL_TABLE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3239         FILL_TABLE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3240         FILL_TABLE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3241         FILL_TABLE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3242         FILL_TABLE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3243         FILL_TABLE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3244         FILL_TABLE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3245         FILL_TABLE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3246         FILL_TABLE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3247         FILL_TABLE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3248         FILL_TABLE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3249         FILL_TABLE("Menu/Tools/Execute", M_DELAY_EXEC);
3250         FILL_TABLE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3251         FILL_TABLE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3252 #ifndef PASSWORD_CRYPTO_OLD
3253         FILL_TABLE("Menu/Tools/ForgetMasterPassphrase", M_MASTER_PASSPHRASE);
3254 #endif
3255         FILL_TABLE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3256
3257         FILL_TABLE("Menu/Configuration", M_UNLOCKED);
3258         FILL_TABLE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3259         FILL_TABLE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3260         FILL_TABLE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3261         FILL_TABLE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3262         FILL_TABLE(NULL, -1);
3263 #undef FILL_TABLE
3264         if (i > N_ENTRIES)
3265                 g_error("main window menu entry table overrun (%d/%d)", i, N_ENTRIES);
3266 #undef ENTRIES
3267
3268         state = main_window_get_current_state(mainwin);
3269
3270         for (i = 0; entry[i].entry != NULL; i++) {
3271                 sensitive = ((entry[i].cond & state) == entry[i].cond);
3272                 cm_menu_set_sensitive_full(mainwin->ui_manager, entry[i].entry, sensitive);
3273         }
3274
3275         menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3276                 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3277
3278         children = gtk_container_get_children(GTK_CONTAINER(menu));
3279         for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3280                 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3281                         cur_item = cur_item->next;
3282                         break;
3283                 }
3284         }
3285
3286         for (; cur_item != NULL; cur_item = cur_item->next) {
3287                 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3288                                          (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3289         }
3290
3291         g_list_free(children);
3292
3293         main_window_menu_callback_block(mainwin);
3294
3295         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3296                               messageview_is_visible(mainwin->messageview));
3297
3298         summaryview = mainwin->summaryview;
3299
3300         switch (summaryview->sort_key) {
3301         case SORT_BY_NUMBER:
3302                 menu_path = "Menu/View/Sort/Number"; break;
3303         case SORT_BY_SIZE:
3304                 menu_path = "Menu/View/Sort/Size"; break;
3305         case SORT_BY_DATE:
3306                 menu_path = "Menu/View/Sort/Date"; break;
3307         case SORT_BY_THREAD_DATE:
3308                 menu_path = "Menu/View/Sort/ThreadDate"; break;
3309         case SORT_BY_FROM:
3310                 menu_path = "Menu/View/Sort/From"; break;
3311         case SORT_BY_TO:
3312                 menu_path = "Menu/View/Sort/To"; break;
3313         case SORT_BY_SUBJECT:
3314                 menu_path = "Menu/View/Sort/Subject"; break;
3315         case SORT_BY_LABEL:
3316                 menu_path = "Menu/View/Sort/Color"; break;
3317         case SORT_BY_MARK:
3318                 menu_path = "Menu/View/Sort/Mark"; break;
3319         case SORT_BY_STATUS:
3320                 menu_path = "Menu/View/Sort/Status"; break;
3321         case SORT_BY_MIME:
3322                 menu_path = "Menu/View/Sort/Attachment"; break;
3323         case SORT_BY_SCORE:
3324                 menu_path = "Menu/View/Sort/Score"; break;
3325         case SORT_BY_LOCKED:
3326                 menu_path = "Menu/View/Sort/Locked"; break;
3327         case SORT_BY_TAGS:
3328                 menu_path = "Menu/View/Sort/Tag"; break;
3329         case SORT_BY_NONE:
3330         default:
3331                 menu_path = "Menu/View/Sort/DontSort"; break;
3332         }
3333         cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3334
3335         if (summaryview->sort_type == SORT_ASCENDING) {
3336                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3337         } else {
3338                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3339         }
3340
3341         if (summaryview->sort_key != SORT_BY_NONE) {
3342                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3343                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3344         } else {
3345                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3346                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3347         }
3348
3349         if (mainwin->messageview
3350         &&  mainwin->messageview->mimeview
3351         &&  mainwin->messageview->mimeview->textview)
3352                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3353                                                 prefs_common.show_all_headers);
3354         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3355         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3356         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3357         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0 && (state & main_window_get_mask(M_NOT_DRAFT, -1)) != 0);
3358         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3359         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3360         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3361
3362         if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3363                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3364         if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3365             quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3366                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3367         if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3368             quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3369                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3370         if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3371                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3372
3373         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3374                 messageview_nav_has_prev(mainwin->messageview));
3375         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3376                 messageview_nav_has_next(mainwin->messageview));
3377
3378         if (mainwin->messageview 
3379         &&  mainwin->messageview->mimeview)
3380                 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3381
3382         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3383         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3384         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3385         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3386         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature", 
3387                                    mimepart_selected && mainwin->messageview->mimeview->signed_part);
3388
3389         sensitive = TRUE;
3390         if (mimepart_selected) {
3391                 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3392
3393                 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3394                                  partinfo->type == MIMETYPE_IMAGE ||
3395                                  partinfo->type == MIMETYPE_MULTIPART)) {
3396                         sensitive = FALSE;
3397                 }
3398         }
3399         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3400
3401         main_window_menu_callback_unblock(mainwin);
3402 }
3403
3404 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3405 {
3406         gint is_menu = 0;
3407         
3408         if (msginfo) 
3409                 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3410         if (is_menu)
3411                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3412         else
3413                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3414 }
3415
3416 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3417 {
3418         gint menu_nb = 0;
3419         GtkWidget *menuitem;
3420         
3421         if (!msginfo || !msginfo->extradata) {
3422                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3423                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3424                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3425                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3426                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3427                 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3428                 return 0;
3429         }
3430                 
3431         /* Mailing list post */
3432         if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3433                 g_free(msginfo->extradata->list_post);
3434                 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3435         }
3436         menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3437                 
3438         menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3439  
3440         /* Mailing list help */
3441         menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3442         
3443         menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3444
3445         /* Mailing list subscribe */
3446         menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3447         
3448         menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3449                 
3450         /* Mailing list unsubscribe */
3451         menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3452         
3453         menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3454         
3455         /* Mailing list view archive */
3456         menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3457         
3458         menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3459         
3460         /* Mailing list contact owner */
3461         menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3462         
3463         menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3464         
3465         return menu_nb;
3466 }
3467
3468 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3469 {
3470         GtkWidget *item, *menu;
3471         const gchar *url_pt ;
3472         gchar url_decoded[BUFFSIZE];
3473         GList *children, *amenu;
3474         gint menu_nb = 0;
3475         
3476         menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3477         
3478         /* First delete old submenu */
3479         /* FIXME: we can optimize this, and only change/add/delete necessary items */
3480         children = gtk_container_get_children(GTK_CONTAINER(menu));
3481         for (amenu = children; amenu; amenu = amenu->next) {
3482                 item = GTK_WIDGET (amenu->data);
3483                 gtk_widget_destroy (item);
3484         }
3485         g_list_free(children);
3486         if (list_header) {
3487                 for (url_pt = list_header; url_pt && *url_pt;) {
3488                         get_url_part (&url_pt, url_decoded);
3489                         item = NULL;
3490                         if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3491                                 item = cm_menu_item_new_label_from_url ((url_decoded));
3492                                 g_signal_connect(G_OBJECT(item), "activate",
3493                                                  G_CALLBACK(mailing_list_compose),
3494                                                  NULL);
3495                         }
3496                         else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3497                                  !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3498
3499                                 item = cm_menu_item_new_label_from_url ((url_decoded));
3500                                 g_signal_connect(G_OBJECT(item), "activate",
3501                                                  G_CALLBACK(mailing_list_open_uri),
3502                                                  NULL);
3503                         } 
3504                         if (item) {
3505                                 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3506                                 gtk_widget_show (item);
3507                                 menu_nb++;
3508                         }
3509                 }
3510         }
3511         if (menu_nb)
3512                 gtk_widget_set_sensitive (menuitem, TRUE);
3513         else
3514                 gtk_widget_set_sensitive (menuitem, FALSE);
3515                 
3516
3517         return menu_nb;
3518 }
3519
3520 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3521 {
3522         gchar tmp[BUFFSIZE];
3523         const gchar *buf;
3524         gint i = 0;
3525         buf = *buffer;
3526         gboolean with_plus = TRUE;
3527
3528         if (buf == 0x00) {
3529                 *url_decoded = '\0';
3530                 *buffer = NULL;
3531                 return;
3532         }
3533         /* Ignore spaces, comments  and tabs () */
3534         for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3535                 if (*buf == '(')
3536                         for (;*buf != ')' && *buf != 0x00; buf++);
3537         
3538         /* First non space and non comment must be a < */
3539         if (*buf =='<' ) {
3540                 buf++;
3541                 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3542                         with_plus = FALSE;
3543                 for (i = 0;
3544                      *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3545                         tmp[i++] = *(buf++));
3546                 if (*buf == 0) {
3547                         *buffer = NULL;
3548                         *url_decoded = '\0';
3549                         return;
3550                 }
3551                 buf++;
3552         }
3553         else  {
3554                 *buffer = NULL;
3555                 *url_decoded = '\0';
3556                 return;
3557         }
3558         
3559         *url_decoded = '\0';
3560         *buffer = NULL;
3561         
3562         if (i == BUFFSIZE) {
3563                 return;
3564         }
3565         tmp[i] = 0x00;
3566         decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3567
3568         /* Prepare the work for the next url in the list */
3569         /* after the closing bracket >, ignore space, comments and tabs */
3570         for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3571                 if (*buf == '(')
3572                         for (;*buf != ')' && *buf != 0x00; buf++);
3573                         
3574         if (!buf || !*buf) {
3575                 *buffer = NULL;
3576                 return;
3577         }
3578
3579         /* now first non space, non comment must be a comma */
3580         if (*buf != ',')
3581                 for (;*buf != 0x00; buf++);
3582         else
3583                 buf++;
3584         *buffer = buf;
3585 }
3586         
3587 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3588 {
3589         const gchar *mailto;
3590         PrefsAccount *account = NULL;
3591         FolderItem   *folder_item = NULL;
3592
3593         mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3594         if (mainwindow_get_mainwindow()) {
3595                 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3596                 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3597                         account = account_find_from_id(folder_item->prefs->default_account);
3598                 if (folder_item && !account)
3599                         account = account_find_from_item(folder_item);
3600         }
3601         if (mailto)
3602                 compose_new_with_folderitem(account, folder_item, mailto+7);
3603 }
3604  
3605  static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3606 {
3607  
3608         const gchar *mailto;
3609  
3610         mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3611         if (mailto)
3612                 open_uri (mailto, prefs_common_get_uri_cmd());
3613
3614         
3615 static void fix_folderview_scroll(MainWindow *mainwin)
3616 {
3617         static gboolean fix_done = FALSE;
3618
3619         if (fix_done)
3620                 return;
3621
3622         gtk_widget_queue_resize(mainwin->folderview->ctree);
3623
3624         fix_done = TRUE;
3625 }
3626
3627 void main_window_popup(MainWindow *mainwin)
3628 {
3629         static gboolean first_start = TRUE;
3630
3631         if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3632                 main_window_show(mainwin);
3633
3634         if (prefs_common.mainwin_maximised)
3635                 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3636
3637         if (first_start) {
3638                 first_start = FALSE;
3639         } else {
3640                 gtkut_window_popup(mainwin->window);
3641         }
3642
3643         if (prefs_common.layout_mode == SMALL_LAYOUT) {
3644                 if (mainwin->in_folder) {
3645                         mainwindow_enter_folder(mainwin);
3646                 } else {
3647                         mainwindow_exit_folder(mainwin);
3648                 }
3649         }
3650         fix_folderview_scroll(mainwin);
3651 }
3652
3653 void main_window_show(MainWindow *mainwin)
3654 {
3655         gtk_widget_show(mainwin->window);
3656         gtk_widget_show(mainwin->vbox_body);
3657 #ifndef GENERIC_UMPC
3658         gtk_window_move(GTK_WINDOW(mainwin->window),
3659                                  prefs_common.mainwin_x,
3660                                  prefs_common.mainwin_y);
3661         
3662         gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3663                              prefs_common.folderview_width,
3664                              prefs_common.folderview_height);
3665         gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3666                              prefs_common.summaryview_width,
3667                              prefs_common.summaryview_height);
3668         gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3669                              prefs_common.msgview_width,
3670                              prefs_common.msgview_height);
3671 #endif
3672 }
3673
3674 void main_window_hide(MainWindow *mainwin)
3675 {
3676         main_window_get_size(mainwin);
3677         main_window_get_position(mainwin);
3678
3679         gtk_widget_hide(mainwin->window);
3680         gtk_widget_hide(mainwin->vbox_body);
3681 }
3682
3683 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3684 {
3685         GtkWidget *folderwin = NULL;
3686         GtkWidget *messagewin = NULL;
3687         GtkWidget *hpaned;
3688         GtkWidget *vpaned;
3689         GtkWidget *vbox_body = mainwin->vbox_body;
3690         gboolean first_set = (mainwin->hpaned == NULL);
3691         debug_print("Setting widgets...\n");
3692
3693 #ifndef GENERIC_UMPC
3694         mainwin->messageview->statusbar = mainwin->statusbar;
3695         mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3696 #endif
3697         /* clean top-most container */
3698         if (mainwin->hpaned) {
3699                 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3700                         gtk_widget_destroy(mainwin->vpaned);
3701                 else
3702                         gtk_widget_destroy(mainwin->hpaned);
3703         }
3704
3705         cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView", 
3706                 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3707         switch (layout_mode) {
3708         case VERTICAL_LAYOUT:
3709         case NORMAL_LAYOUT:
3710         case SMALL_LAYOUT:
3711                 hpaned = gtk_hpaned_new();
3712                 if (layout_mode == VERTICAL_LAYOUT)
3713                         vpaned = gtk_hpaned_new();
3714                 else
3715                         vpaned = gtk_vpaned_new();
3716                 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3717                 gtk_paned_add1(GTK_PANED(hpaned),
3718                                GTK_WIDGET_PTR(mainwin->folderview));
3719                 gtk_widget_show(hpaned);
3720                 gtk_widget_queue_resize(hpaned);
3721
3722                 if (messageview_is_visible(mainwin->messageview)) {
3723                         gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3724                         gtk_paned_pack1(GTK_PANED(vpaned),
3725                                        GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3726                 } else {
3727                         gtk_paned_add2(GTK_PANED(hpaned),
3728                                        GTK_WIDGET_PTR(mainwin->summaryview));
3729                         g_object_ref(vpaned);
3730                 }
3731                 gtk_paned_add2(GTK_PANED(vpaned),
3732                                GTK_WIDGET_PTR(mainwin->messageview));
3733                 gtk_widget_show(vpaned);
3734                 if (layout_mode == SMALL_LAYOUT && first_set) {
3735                         mainwin_paned_show_first(GTK_PANED(hpaned));
3736                 }
3737                 gtk_widget_queue_resize(vpaned);
3738                 break;
3739         case WIDE_LAYOUT:
3740                 vpaned = gtk_vpaned_new();
3741                 hpaned = gtk_hpaned_new();
3742                 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3743                 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3744
3745                 gtk_paned_add1(GTK_PANED(hpaned),
3746                                GTK_WIDGET_PTR(mainwin->folderview));
3747                 gtk_paned_add2(GTK_PANED(hpaned),
3748                                GTK_WIDGET_PTR(mainwin->summaryview));
3749
3750                 gtk_widget_show(hpaned);
3751                 gtk_widget_queue_resize(hpaned);
3752
3753                 if (messageview_is_visible(mainwin->messageview)) {
3754                         gtk_paned_add2(GTK_PANED(vpaned),
3755                                GTK_WIDGET_PTR(mainwin->messageview));   
3756                 } else {
3757                         g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3758                 }
3759                 gtk_widget_show(vpaned);
3760                 gtk_widget_queue_resize(vpaned);
3761                 break;
3762         case WIDE_MSGLIST_LAYOUT:
3763                 vpaned = gtk_vpaned_new();
3764                 hpaned = gtk_hpaned_new();
3765                 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3766
3767                 gtk_paned_add1(GTK_PANED(vpaned),
3768                                GTK_WIDGET_PTR(mainwin->summaryview));
3769                 gtk_paned_add1(GTK_PANED(hpaned),
3770                                GTK_WIDGET_PTR(mainwin->folderview));
3771
3772                 gtk_widget_show(hpaned);
3773                 gtk_widget_queue_resize(hpaned);
3774
3775                 if (messageview_is_visible(mainwin->messageview)) {
3776                         gtk_paned_add2(GTK_PANED(hpaned),
3777                                GTK_WIDGET_PTR(mainwin->messageview));   
3778                 } else {
3779                         g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3780                 }
3781                 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3782
3783                 gtk_widget_show(vpaned);
3784                 gtk_widget_queue_resize(vpaned);
3785                 break;
3786         default:
3787                 g_warning("Unknown layout");
3788                 return;
3789         }
3790
3791         mainwin->hpaned = hpaned;
3792         mainwin->vpaned = vpaned;
3793
3794         if (layout_mode == SMALL_LAYOUT) {
3795                 if (mainwin->messageview->visible)
3796                         main_window_toggle_message_view(mainwin);
3797         } 
3798
3799         if (layout_mode == SMALL_LAYOUT && first_set) {
3800                 gtk_widget_realize(mainwin->window);
3801                 gtk_widget_realize(mainwin->folderview->ctree);
3802                 gtk_widget_realize(mainwin->summaryview->hbox);
3803                 gtk_widget_realize(mainwin->summaryview->hbox_l);
3804                 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3805                                     prefs_common.folderview_width,
3806                                     prefs_common.folderview_height);
3807                 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3808                                     0,0);
3809                 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3810                                     0,0);
3811                 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3812                                 prefs_common.mainwin_width,
3813                                 prefs_common.mainwin_height);
3814                 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3815         } else {
3816                 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3817                                     prefs_common.folderview_width,
3818                                     prefs_common.folderview_height);
3819                 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3820                                     prefs_common.summaryview_width,
3821                                     prefs_common.summaryview_height);
3822                 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3823                                     prefs_common.msgview_width,
3824                                     prefs_common.msgview_height);
3825                 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3826                                     prefs_common.mainwin_width,
3827                                     prefs_common.mainwin_height);
3828         } 
3829         /* remove headerview if not in prefs */
3830         headerview_set_visibility(mainwin->messageview->headerview,
3831                                   prefs_common.display_header_pane);
3832
3833         if (messageview_is_visible(mainwin->messageview))
3834                 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3835                               GTK_ARROW_DOWN, GTK_SHADOW_OUT);
3836         else
3837                 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3838                               GTK_ARROW_UP, GTK_SHADOW_OUT);
3839
3840         gtk_window_move(GTK_WINDOW(mainwin->window),
3841                         prefs_common.mainwin_x,
3842                         prefs_common.mainwin_y);
3843
3844         gtk_widget_queue_resize(vbox_body);
3845         gtk_widget_queue_resize(mainwin->vbox);
3846         gtk_widget_queue_resize(mainwin->window);
3847         /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3848          * and mimeview icon list/ctree lose track of their visibility states */
3849         if (!noticeview_is_visible(mainwin->messageview->noticeview)) 
3850                 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3851         if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview)) 
3852                 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3853         if (mainwin->messageview->mimeview->ctree_mode)
3854                 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3855         else 
3856                 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3857
3858         prefs_common.layout_mode = layout_mode;
3859
3860         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView", 
3861                  messageview_is_visible(mainwin->messageview));
3862
3863 #ifndef GENERIC_UMPC
3864         switch (prefs_common.layout_mode) {
3865         case NORMAL_LAYOUT:
3866                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3867                 break;
3868         case VERTICAL_LAYOUT:
3869                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3870                 break;
3871         case WIDE_LAYOUT:
3872                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3873                 break;
3874         case WIDE_MSGLIST_LAYOUT:
3875                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3876                 break;
3877         case SMALL_LAYOUT:
3878                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3879                 break;
3880         }
3881 #endif
3882
3883         if (folderwin) {
3884                 g_signal_connect
3885                         (G_OBJECT(folderwin), "size_allocate",
3886                          G_CALLBACK(folder_window_size_allocate_cb),
3887                          mainwin);
3888         }
3889         if (messagewin) {
3890                 g_signal_connect
3891                         (G_OBJECT(messagewin), "size_allocate",
3892                          G_CALLBACK(message_window_size_allocate_cb),
3893                          mainwin);
3894         }
3895
3896         debug_print("Setting widgets done.\n");
3897 }
3898
3899 void main_window_destroy_all(void)
3900 {
3901         while (mainwin_list != NULL) {
3902                 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3903
3904                 /* free toolbar stuff */
3905                 toolbar_clear_list(TOOLBAR_MAIN);
3906                 toolbar_destroy(mainwin->toolbar);
3907
3908                 summaryview_destroy(mainwin->summaryview);
3909                 mainwin->folderview->mainwin = NULL;
3910                 mainwin->summaryview->mainwin = NULL;
3911                 mainwin->messageview->mainwin = NULL;
3912
3913                 g_free(mainwin->toolbar);
3914                 g_free(mainwin);
3915                 
3916                 mainwin_list = g_list_remove(mainwin_list, mainwin);
3917         }
3918         g_list_free(mainwin_list);
3919         mainwin_list = NULL;
3920 }
3921
3922 static void toolbar_child_attached(GtkWidget *widget, GtkWidget *child,
3923                                    gpointer data)
3924 {
3925         gtk_widget_set_size_request(child, 1, -1);
3926 }
3927
3928 static void toolbar_child_detached(GtkWidget *widget, GtkWidget *child,
3929                                    gpointer data)
3930 {
3931         gtk_widget_set_size_request(child, -1, -1);
3932 }
3933 #ifndef GENERIC_UMPC
3934 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3935                                     gpointer data)
3936 {
3937         MainWindow *mainwin = (MainWindow *)data;
3938         GtkWidget *menu = NULL;
3939         
3940         if (!event) return FALSE;
3941
3942         gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3943         
3944         menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3945
3946         gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
3947                        menu_button_position, widget,
3948                        event->button, event->time);
3949
3950         return TRUE;
3951 }
3952 #endif
3953 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3954                                  gpointer data)
3955 {
3956         MainWindow *mainwin = (MainWindow *)data;
3957         gboolean close_allowed = TRUE;
3958
3959         hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3960
3961         if (close_allowed && mainwin->lock_count == 0)
3962                 app_exit_cb(NULL, data);
3963
3964         return TRUE;
3965 }
3966
3967 static void main_window_size_allocate_cb(GtkWidget *widget,
3968                                          GtkAllocation *allocation,
3969                                          gpointer data)
3970 {
3971         MainWindow *mainwin = (MainWindow *)data;
3972         main_window_get_size(mainwin);
3973 }
3974
3975 static void folder_window_size_allocate_cb(GtkWidget *widget,
3976                                            GtkAllocation *allocation,
3977                                            gpointer data)
3978 {
3979         MainWindow *mainwin = (MainWindow *)data;
3980
3981         main_window_get_size(mainwin);
3982 }
3983
3984 static void message_window_size_allocate_cb(GtkWidget *widget,
3985                                             GtkAllocation *allocation,
3986                                             gpointer data)
3987 {
3988         MainWindow *mainwin = (MainWindow *)data;
3989
3990         main_window_get_size(mainwin);
3991 }
3992
3993 static void add_mailbox_cb(GtkAction *action, gpointer data)
3994 {
3995         MainWindow *mainwin = (MainWindow *)data;
3996         main_window_add_mailbox(mainwin);
3997 }
3998
3999 static void update_folderview_cb(GtkAction *action, gpointer data)
4000 {
4001         MainWindow *mainwin = (MainWindow *)data;
4002         summary_show(mainwin->summaryview, NULL);
4003         folderview_check_new_all();
4004 }
4005
4006 static void foldersort_cb(GtkAction *action, gpointer data)
4007 {
4008         foldersort_open();
4009 }
4010
4011 static void import_mbox_cb(GtkAction *action, gpointer data)
4012 {
4013         MainWindow *mainwin = (MainWindow *)data;
4014         /* only notify if import has failed */
4015         if (import_mbox(mainwin->summaryview->folder_item) == -1) {
4016                 alertpanel_error(_("Mbox import has failed."));
4017         }
4018 }
4019
4020 static void export_mbox_cb(GtkAction *action, gpointer data)
4021 {
4022         MainWindow *mainwin = (MainWindow *)data;
4023         /* only notify if export has failed */
4024         if (export_mbox(mainwin->summaryview->folder_item) == -1) {
4025                 alertpanel_error(_("Export to mbox has failed."));
4026         }
4027 }
4028
4029 static void export_list_mbox_cb(GtkAction *action, gpointer data)
4030 {
4031         MainWindow *mainwin = (MainWindow *)data;
4032         /* only notify if export has failed */
4033         if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
4034                 alertpanel_error(_("Export to mbox has failed."));
4035         }
4036 }
4037
4038 static void empty_trash_cb(GtkAction *action, gpointer data)
4039 {
4040         MainWindow *mainwin = (MainWindow *)data;
4041         main_window_empty_trash(mainwin, TRUE, FALSE);
4042 }
4043
4044 static void save_as_cb(GtkAction *action, gpointer data)
4045 {
4046         MainWindow *mainwin = (MainWindow *)data;
4047         summary_save_as(mainwin->summaryview);
4048 }
4049
4050 static void print_cb(GtkAction *action, gpointer data)
4051 {
4052         MainWindow *mainwin = (MainWindow *)data;
4053         summary_print(mainwin->summaryview);
4054 }
4055
4056 static void page_setup_cb(GtkAction *action, gpointer data)
4057 {
4058         MainWindow *mainwin = (MainWindow *)data;
4059         GtkWindow *win;
4060
4061         win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
4062
4063         printing_page_setup(win);
4064 }
4065
4066 static void app_exit_cb(GtkAction *action, gpointer data)
4067 {
4068         MainWindow *mainwin = (MainWindow *)data;
4069         if (prefs_common.clean_on_exit) {
4070                 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
4071                         return;
4072         }
4073
4074         if (prefs_common.confirm_on_exit) {
4075                 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4076                                GTK_STOCK_CANCEL, GTK_STOCK_QUIT,  NULL, ALERTFOCUS_FIRST)
4077                     != G_ALERTALTERNATE)
4078                         return;
4079                 manage_window_focus_in(mainwin->window, NULL, NULL);
4080         }
4081
4082         app_will_exit(NULL, mainwin);
4083 }
4084
4085 static void search_cb(GtkAction *action, gpointer data)
4086 {
4087         MainWindow *mainwin = (MainWindow *)data;
4088         message_search(mainwin->messageview);
4089 }
4090
4091 static void search_folder_cb(GtkAction *action, gpointer data)
4092 {
4093         MainWindow *mainwin = (MainWindow *)data;
4094         FolderItem *item = mainwin->summaryview->folder_item;
4095         cm_return_if_fail(item != NULL);
4096         summary_search(mainwin->summaryview);
4097 }
4098
4099 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4100 {
4101         MainWindow *mainwin = (MainWindow *)data;
4102         summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4103 }
4104
4105 static void toggle_message_cb(GtkAction *action, gpointer data)
4106 {
4107         MainWindow *mainwin = (MainWindow *)data;
4108         gboolean active;
4109
4110         active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4111
4112         if (active != messageview_is_visible(mainwin->messageview))
4113                 summary_toggle_view(mainwin->summaryview);
4114 }
4115
4116 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4117 {
4118         gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4119         MainWindow *mainwin = (MainWindow *)data;
4120         toolbar_toggle(value, mainwin);
4121 }
4122
4123 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4124 {
4125         MainWindow *mainwin = (MainWindow *)data;
4126         MessageView *msgview = (MessageView*)mainwin->messageview;
4127         GSList *msginfo_list = NULL;
4128         gint action = COMPOSE_REPLY;
4129         const gchar *a_name = gtk_action_get_name(gaction);
4130
4131         DO_ACTION("Message/Reply", COMPOSE_REPLY);
4132         DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4133         DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4134         DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4135         DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4136         DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4137         DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4138         DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4139
4140         cm_return_if_fail(msgview != NULL);
4141
4142         msginfo_list = summary_get_selection(mainwin->summaryview);
4143         cm_return_if_fail(msginfo_list != NULL);
4144
4145         if (!summary_has_opened_message(mainwin->summaryview)) {
4146                 compose_reply_from_messageview(NULL, msginfo_list, action);
4147         } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4148                 compose_reply_from_messageview(msgview, msginfo_list, action);
4149         } else {
4150                 compose_reply_from_messageview(msgview, NULL, action);
4151         }
4152
4153         g_slist_free(msginfo_list);
4154 }
4155
4156 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4157 {
4158         MainWindow *mainwin = (MainWindow *)data;
4159         FolderView *folderview = mainwin->folderview;
4160         SummaryView *summaryview = mainwin->summaryview;
4161         MimeView *mimeview = mainwin->messageview->mimeview;
4162
4163         if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4164                 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4165                 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4166                 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4167                 prefs_common.show_col_headers = TRUE;
4168         } else {
4169                 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4170                 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4171                 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);               
4172                 prefs_common.show_col_headers = FALSE;
4173         }
4174 }
4175
4176 #ifndef GENERIC_UMPC
4177 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4178 {
4179         MainWindow *mainwin = (MainWindow *)data;
4180         if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4181                 gtk_widget_show(mainwin->hbox_stat);
4182                 prefs_common.show_statusbar = TRUE;
4183         } else {
4184                 gtk_widget_hide(mainwin->hbox_stat);
4185                 prefs_common.show_statusbar = FALSE;
4186         }
4187 }
4188
4189 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4190 {
4191         MainWindow *mainwin = (MainWindow *)data;
4192         gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4193         LayoutType layout_mode = value;
4194         LayoutType old_layout_mode = prefs_common.layout_mode;
4195         if (mainwin->menu_lock_count) {
4196                 return;
4197         }
4198         if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4199                 return;
4200         }
4201         
4202         if (layout_mode == prefs_common.layout_mode) {
4203                 return;
4204         }
4205         
4206         if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4207                 main_window_toggle_message_view(mainwin);
4208         else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4209                 main_window_toggle_message_view(mainwin);
4210
4211         main_window_separation_change(mainwin, layout_mode);
4212         mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4213         if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4214                 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4215                 if (layout_mode == VERTICAL_LAYOUT)
4216                         mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4217         }
4218         if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4219                 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4220                 mainwindow_exit_folder(mainwin);
4221         }
4222         summary_relayout(mainwin->summaryview); 
4223         summary_update_unread(mainwin->summaryview, NULL);
4224 }
4225 #endif
4226
4227 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4228                                         gboolean ask_sync)
4229 {
4230         static gboolean switching = FALSE;
4231
4232         if (switching)
4233                 return;
4234
4235         switching = TRUE;
4236
4237         offline_ask_sync = ask_sync;
4238         if (offline)
4239                 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4240         else
4241                 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4242         offline_ask_sync = TRUE;
4243
4244         inc_reset_offline_override_timers();
4245
4246         switching = FALSE;
4247 }
4248
4249 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4250 {
4251         MainWindow *mainwin = (MainWindow *)data;
4252         main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4253 }
4254
4255 static gboolean any_folder_want_synchronise(void)
4256 {
4257         GList *folderlist = folder_get_list();
4258
4259         /* see if there are synchronised folders */
4260         for (; folderlist; folderlist = folderlist->next) {
4261                 Folder *folder = (Folder *)folderlist->data;
4262                 if (folder_want_synchronise(folder)) {
4263                         return TRUE;
4264                 }
4265         }
4266         
4267         return FALSE;
4268 }
4269
4270 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4271 {
4272         
4273         if (!any_folder_want_synchronise())
4274                 return;
4275
4276         if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4277                         _("Do you want to synchronise your folders now?"),
4278                         GTK_STOCK_CANCEL, _("_Synchronise"), NULL, ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4279                 return;
4280         
4281         if (offline_ask_sync)
4282                 folder_synchronise(NULL);
4283 }
4284
4285 static void online_switch_clicked (GtkButton *btn, gpointer data) 
4286 {
4287         MainWindow *mainwin;
4288         gboolean have_connectivity;
4289
4290 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4291         have_connectivity = networkmanager_is_online(NULL); 
4292 #else
4293         have_connectivity = TRUE;
4294 #endif
4295
4296         mainwin = (MainWindow *) data;
4297         
4298         cm_return_if_fail(mainwin != NULL);
4299         
4300         if (btn == GTK_BUTTON(mainwin->online_switch)) {
4301 #ifndef GENERIC_UMPC
4302                 gtk_widget_hide (mainwin->online_switch);
4303                 gtk_widget_show (mainwin->offline_switch);
4304 #endif
4305                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4306
4307                 inc_autocheck_timer_remove();
4308                         
4309                 /* go offline */
4310                 if (prefs_common.work_offline)
4311                         return;
4312
4313                 if(have_connectivity)
4314                         mainwindow_check_synchronise(mainwin, TRUE);
4315                 prefs_common.work_offline = TRUE;
4316                 imap_disconnect_all(have_connectivity);
4317                 nntp_disconnect_all(have_connectivity);
4318                 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4319         } else {
4320                 /*go online */
4321                 if (!prefs_common.work_offline)
4322                         return;
4323 #ifndef GENERIC_UMPC
4324                 gtk_widget_hide (mainwin->offline_switch);
4325                 gtk_widget_show (mainwin->online_switch);
4326 #endif
4327                 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4328                 prefs_common.work_offline = FALSE;
4329                 inc_autocheck_timer_set();
4330                 refresh_resolvers();
4331                 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4332         }
4333 }
4334
4335 static void addressbook_open_cb(GtkAction *action, gpointer data)
4336 {
4337 #ifndef USE_ALT_ADDRBOOK
4338         addressbook_open(NULL);
4339 #else
4340         GError* error = NULL;
4341         
4342         addressbook_dbus_open(FALSE, &error);
4343         if (error) {
4344                 g_warning("Failed to open address book: %s", error->message);
4345                 g_error_free(error);
4346         }
4347 #endif
4348 }
4349
4350 static void log_window_show_cb(GtkAction *action, gpointer data)
4351 {
4352         MainWindow *mainwin = (MainWindow *)data;
4353         log_window_show(mainwin->logwin);
4354 }
4355
4356 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4357 {
4358         MainWindow *mainwin = (MainWindow *)data;
4359         log_window_show(mainwin->filtering_debugwin);
4360 }
4361
4362 #ifdef G_OS_WIN32
4363 static void debug_log_show_cb(GtkAction *action, gpointer data)
4364 {
4365         GError *error = NULL;
4366         gchar *logpath8 = win32_debug_log_path();
4367         gunichar2 *logpath16;
4368
4369         debug_print("opening '%s'\n", logpath8);
4370
4371         logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4372
4373         if (error != NULL) {
4374                 g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4375                                 logpath8, error->message);
4376                 g_error_free(error);
4377                 g_free(logpath16);
4378                 return;
4379         }
4380
4381         HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4382                         NULL, NULL, SW_SHOW);
4383
4384         g_free(logpath8);
4385         g_free(logpath16);
4386         debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4387 }
4388 #endif
4389
4390 static void inc_cancel_cb(GtkAction *action, gpointer data)
4391 {
4392         inc_cancel_all();
4393         imap_cancel_all();
4394 }
4395
4396 static void send_cancel_cb(GtkAction *action, gpointer data)
4397 {
4398         send_cancel();
4399 }
4400
4401 static void move_to_cb(GtkAction *action, gpointer data)
4402 {
4403         MainWindow *mainwin = (MainWindow *)data;
4404         summary_move_to(mainwin->summaryview);
4405 }
4406
4407 static void copy_to_cb(GtkAction *action, gpointer data)
4408 {
4409         MainWindow *mainwin = (MainWindow *)data;
4410         summary_copy_to(mainwin->summaryview);
4411 }
4412
4413 static void delete_cb(GtkAction *action, gpointer data)
4414 {
4415         MainWindow *mainwin = (MainWindow *)data;
4416         summary_delete(mainwin->summaryview);
4417 }
4418
4419 static void delete_trash_cb(GtkAction *action, gpointer data)
4420 {
4421         MainWindow *mainwin = (MainWindow *)data;
4422         summary_delete_trash(mainwin->summaryview);
4423 }
4424
4425 static void cancel_cb(GtkAction *action, gpointer data)
4426 {
4427         MainWindow *mainwin = (MainWindow *)data;
4428         summary_cancel(mainwin->summaryview);
4429 }
4430
4431 static void open_msg_cb(GtkAction *action, gpointer data)
4432 {
4433         MainWindow *mainwin = (MainWindow *)data;
4434         summary_open_msg(mainwin->summaryview);
4435 }
4436
4437 static void view_source_cb(GtkAction *action, gpointer data)
4438 {
4439         MainWindow *mainwin = (MainWindow *)data;
4440         summary_view_source(mainwin->summaryview);
4441 }
4442
4443 static void show_all_header_cb(GtkAction *action, gpointer data)
4444 {
4445         MainWindow *mainwin = (MainWindow *)data;
4446         if (mainwin->menu_lock_count) return;
4447         prefs_common.show_all_headers = 
4448                         gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4449         summary_display_msg_selected(mainwin->summaryview,
4450                                      gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4451 }
4452
4453 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4454 {
4455         MainWindow *mainwin = (MainWindow *)data;
4456         if (mainwin->menu_lock_count) return;
4457         if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4458                 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4459                 prefs_common.mainwin_fullscreen = FALSE;
4460         }
4461         else {
4462                 prefs_common.mainwin_fullscreen = TRUE;
4463                 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4464         }
4465 }
4466
4467 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4468 {
4469         MainWindow *mainwin = (MainWindow *)data;
4470         if (mainwin->menu_lock_count) return;
4471         if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4472                 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4473                 prefs_common.mainwin_menubar = FALSE;
4474         } else {
4475                 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4476                 prefs_common.mainwin_menubar = TRUE;
4477         }
4478 }
4479
4480 static void hide_quotes_cb(GtkAction *action, gpointer data)
4481 {
4482         MainWindow *mainwin = (MainWindow *)data;
4483
4484         if (mainwin->menu_lock_count) return;
4485
4486         if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4487                 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4488                 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4489                 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4490                 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4491         } else
4492                 prefs_common.hide_quotes = 0;
4493
4494         mainwin->menu_lock_count++;
4495         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4496         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4497         cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4498         mainwin->menu_lock_count--;
4499
4500         summary_redisplay_msg(mainwin->summaryview);
4501 }
4502
4503 static void mark_cb(GtkAction *action, gpointer data)
4504 {
4505         MainWindow *mainwin = (MainWindow *)data;
4506         summary_mark(mainwin->summaryview);
4507 }
4508
4509 static void unmark_cb(GtkAction *action, gpointer data)
4510 {
4511         MainWindow *mainwin = (MainWindow *)data;
4512         summary_unmark(mainwin->summaryview);
4513 }
4514
4515 static void mark_as_read_cb(GtkAction *action, gpointer data)
4516 {
4517         MainWindow *mainwin = (MainWindow *)data;
4518         summary_mark_as_read(mainwin->summaryview);
4519 }
4520
4521 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4522 {
4523         MainWindow *mainwin = (MainWindow *)data;
4524         summary_mark_as_unread(mainwin->summaryview);
4525 }
4526
4527 static void mark_all_read_cb(GtkAction *action, gpointer data)
4528 {
4529         MainWindow *mainwin = (MainWindow *)data;
4530         summary_mark_all_read(mainwin->summaryview, TRUE);
4531 }
4532
4533 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4534 {
4535         MainWindow *mainwin = (MainWindow *)data;
4536         summary_mark_all_unread(mainwin->summaryview, TRUE);
4537 }
4538
4539 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4540 {
4541         MainWindow *mainwin = (MainWindow *)data;
4542         summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4543 }
4544
4545 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4546 {
4547         MainWindow *mainwin = (MainWindow *)data;
4548         summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4549 }
4550
4551 static void ignore_thread_cb(GtkAction *action, gpointer data)
4552 {
4553         MainWindow *mainwin = (MainWindow *)data;
4554         summary_ignore_thread(mainwin->summaryview);
4555 }
4556
4557 static void unignore_thread_cb(GtkAction *action, gpointer data)
4558 {
4559         MainWindow *mainwin = (MainWindow *)data;
4560         summary_unignore_thread(mainwin->summaryview);
4561 }
4562
4563 static void watch_thread_cb(GtkAction *action, gpointer data)
4564 {
4565         MainWindow *mainwin = (MainWindow *)data;
4566         summary_watch_thread(mainwin->summaryview);
4567 }
4568
4569 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4570 {
4571         MainWindow *mainwin = (MainWindow *)data;
4572         summary_unwatch_thread(mainwin->summaryview);
4573 }
4574
4575 static void lock_msgs_cb(GtkAction *action, gpointer data)
4576 {
4577         MainWindow *mainwin = (MainWindow *)data;
4578         summary_msgs_lock(mainwin->summaryview);
4579 }
4580
4581 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4582 {
4583         MainWindow *mainwin = (MainWindow *)data;
4584         summary_msgs_unlock(mainwin->summaryview);
4585 }
4586
4587
4588 static void reedit_cb(GtkAction *action, gpointer data)
4589 {
4590         MainWindow *mainwin = (MainWindow *)data;
4591         summary_reedit(mainwin->summaryview);
4592 }
4593
4594 static void open_urls_cb(GtkAction *action, gpointer data)
4595 {
4596         MainWindow *mainwin = (MainWindow *)data;
4597         if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4598                 summary_display_msg_selected(mainwin->summaryview, 
4599                                              prefs_common.show_all_headers);
4600         }
4601         messageview_list_urls(mainwin->messageview);
4602 }
4603
4604 static void add_address_cb(GtkAction *action, gpointer data)
4605 {
4606         MainWindow *mainwin = (MainWindow *)data;
4607         summary_add_address(mainwin->summaryview);
4608 }
4609
4610 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4611 {
4612         MainWindow *mainwin = (MainWindow *)data;
4613         gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4614         const gchar *str;
4615
4616         if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4617                 str = conv_get_charset_str((CharSet)value);
4618                 
4619                 g_free(mainwin->messageview->forced_charset);
4620                 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4621                 procmime_force_charset(str);
4622                 
4623                 summary_redisplay_msg(mainwin->summaryview);
4624                 
4625                 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4626         }
4627 }
4628
4629 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4630 {
4631         MainWindow *mainwin = (MainWindow *)data;
4632         gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4633         if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4634                 mainwin->messageview->forced_encoding = (EncodingType)value;
4635                 
4636                 summary_redisplay_msg(mainwin->summaryview);
4637                 
4638                 debug_print("forced encoding: %d\n", value);
4639         }
4640 }
4641
4642 static void hide_read_messages (GtkAction *action, gpointer data)
4643 {
4644         MainWindow *mainwin = (MainWindow *)data;
4645         GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4646         if (!mainwin->summaryview->folder_item
4647             || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4648                 return;
4649         summary_toggle_show_read_messages(mainwin->summaryview);
4650 }
4651
4652 static void hide_del_messages (GtkAction *action, gpointer data)
4653 {
4654         MainWindow *mainwin = (MainWindow *)data;
4655         GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4656         if (!mainwin->summaryview->folder_item
4657             || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4658                 return;
4659         summary_toggle_show_del_messages(mainwin->summaryview);
4660 }
4661
4662 static void hide_read_threads (GtkAction *action, gpointer data)
4663 {
4664         MainWindow *mainwin = (MainWindow *)data;
4665         GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4666         if (!mainwin->summaryview->folder_item
4667             || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4668                 return;
4669         summary_toggle_show_read_threads(mainwin->summaryview);
4670 }
4671
4672 static void thread_cb(GtkAction *action, gpointer data)
4673 {
4674         MainWindow *mainwin = (MainWindow *)data;
4675         gboolean threaded = FALSE;
4676         if (mainwin->menu_lock_count) return;
4677         if (!mainwin->summaryview->folder_item) return;
4678
4679         threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4680
4681         mainwin->summaryview->folder_item->threaded = threaded; 
4682
4683         mainwin->summaryview->threaded = threaded;
4684
4685         summary_show(mainwin->summaryview, 
4686                         mainwin->summaryview->folder_item);
4687 }
4688
4689 static void expand_threads_cb(GtkAction *action, gpointer data)
4690 {
4691         MainWindow *mainwin = (MainWindow *)data;
4692         summary_expand_threads(mainwin->summaryview);
4693 }
4694
4695 static void collapse_threads_cb(GtkAction *action, gpointer data)
4696 {
4697         MainWindow *mainwin = (MainWindow *)data;
4698         summary_collapse_threads(mainwin->summaryview);
4699 }
4700
4701 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4702 {
4703         prefs_summary_column_open();
4704 }
4705
4706 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4707 {
4708         prefs_folder_column_open();
4709 }
4710
4711 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4712 {
4713         MainWindow *mainwin = (MainWindow *)data;
4714         gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4715
4716         if (mainwin->menu_lock_count) return;
4717
4718         if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4719                 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4720                              mainwin->summaryview->sort_type);
4721         }
4722 }
4723
4724 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4725 {
4726         MainWindow *mainwin = (MainWindow *)data;
4727         gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4728
4729         if (mainwin->menu_lock_count) return;
4730
4731         if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4732                 summary_sort(mainwin->summaryview,
4733                              mainwin->summaryview->sort_key, (FolderSortType)value);
4734 }
4735
4736 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4737 {
4738         MainWindow *mainwin = (MainWindow *)data;
4739         summary_attract_by_subject(mainwin->summaryview);
4740 }
4741
4742 void mainwindow_delete_duplicated(MainWindow *mainwin)
4743 {
4744         FolderItem *item;
4745
4746         item = folderview_get_selected_item(mainwin->folderview);
4747         if (item) {
4748                 gint result;
4749
4750                 main_window_cursor_wait(mainwin);
4751                 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4752                 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4753                                               DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4754                 STATUSBAR_POP(mainwin);
4755                 main_window_cursor_normal(mainwin);
4756
4757                 switch (result) {
4758                 case -1:
4759                         break;
4760                 case 0:
4761                         alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4762                         break;
4763                 default: {
4764                                 gchar *msg;
4765
4766                                 if (prefs_common.immediate_exec) {
4767                                         msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4768                                                                "Deleted %d duplicate messages in selected folder.\n",
4769                                                            result);
4770                                 } else {
4771                                         msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4772                                                                "Marked %d duplicate messages for deletion in selected folder.\n",
4773                                                            result);
4774                                 }
4775                                 alertpanel_notice(msg, result);
4776                         }
4777                 }
4778         }
4779 }
4780
4781 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4782 {
4783         mainwindow_delete_duplicated((MainWindow *)data);
4784 }
4785
4786 struct DelDupsData
4787 {
4788         guint   dups;
4789         guint   folders;
4790 };
4791
4792 static void deldup_all(FolderItem *item, gpointer _data)
4793 {
4794         struct DelDupsData *data = _data;
4795         gint result;
4796         
4797         result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4798         if (result >= 0) {
4799                 data->dups += result;
4800                 data->folders += 1;
4801         }
4802 }
4803
4804 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4805 {
4806         struct DelDupsData data = {0, 0};
4807
4808         main_window_cursor_wait(mainwin);
4809         STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4810         folder_func_to_all_folders(deldup_all, &data);
4811         STATUSBAR_POP(mainwin);
4812         main_window_cursor_normal(mainwin);
4813
4814         if (data.dups > 0) {
4815                 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4816                                    "Deleted %d duplicate messages in %d folders.\n",
4817                                    data.dups),
4818                                    data.dups, data.folders);
4819         } else {
4820                 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4821         }
4822 }
4823
4824 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4825 {
4826         MainWindow *mainwin = (MainWindow *)mw;
4827
4828         mainwindow_delete_duplicated_all(mainwin);
4829 }
4830
4831 static void filter_cb(GtkAction *action, gpointer data)
4832 {
4833         MainWindow *mainwin = (MainWindow *)data;
4834         summary_filter(mainwin->summaryview, FALSE);
4835 }
4836
4837 static void filter_list_cb(GtkAction *action, gpointer data)
4838 {
4839         MainWindow *mainwin = (MainWindow *)data;
4840         summary_filter(mainwin->summaryview, TRUE);
4841 }
4842
4843 static void process_cb(GtkAction *action, gpointer data)
4844 {
4845         MainWindow *mainwin = (MainWindow *)data;
4846         FolderItem *item = mainwin->summaryview->folder_item;   
4847         cm_return_if_fail(item != NULL);
4848
4849         item->processing_pending = TRUE;
4850         folder_item_apply_processing(item);     
4851         item->processing_pending = FALSE;
4852 }
4853
4854 static void execute_summary_cb(GtkAction *action, gpointer data)
4855 {
4856         MainWindow *mainwin = (MainWindow *)data;
4857         summary_execute(mainwin->summaryview);
4858 }
4859
4860 static void expunge_summary_cb(GtkAction *action, gpointer data)
4861 {
4862         MainWindow *mainwin = (MainWindow *)data;
4863         summary_expunge(mainwin->summaryview);
4864 }
4865
4866 static void update_summary_cb(GtkAction *action, gpointer data)
4867 {
4868         MainWindow *mainwin = (MainWindow *)data;
4869         FolderItem *fitem;
4870         FolderView *folderview = mainwin->folderview;
4871
4872         if (!mainwin->summaryview->folder_item) return;
4873         if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4874
4875         folder_update_op_count();
4876         folder_item_scan(fitem);
4877         summary_show(mainwin->summaryview, fitem);
4878 }
4879
4880 static void prev_cb(GtkAction *action, gpointer data)
4881 {
4882         MainWindow *mainwin = (MainWindow *)data;
4883         summary_select_prev(mainwin->summaryview);
4884 }
4885
4886 static void next_cb(GtkAction *action, gpointer data)
4887 {
4888         MainWindow *mainwin = (MainWindow *)data;
4889         summary_select_next(mainwin->summaryview);
4890 }
4891
4892 static void prev_unread_cb(GtkAction *action, gpointer data)
4893 {
4894         MainWindow *mainwin = (MainWindow *)data;
4895         summary_select_prev_unread(mainwin->summaryview);
4896 }
4897
4898 static void next_unread_cb(GtkAction *action, gpointer data)
4899 {
4900         MainWindow *mainwin = (MainWindow *)data;
4901         summary_select_next_unread(mainwin->summaryview);
4902 }
4903
4904 static void prev_new_cb(GtkAction *action, gpointer data)
4905 {
4906         MainWindow *mainwin = (MainWindow *)data;
4907         summary_select_prev_new(mainwin->summaryview);
4908 }
4909
4910 static void next_new_cb(GtkAction *action, gpointer data)
4911 {
4912         MainWindow *mainwin = (MainWindow *)data;
4913         summary_select_next_new(mainwin->summaryview);
4914 }
4915
4916 static void prev_marked_cb(GtkAction *action, gpointer data)
4917 {
4918         MainWindow *mainwin = (MainWindow *)data;
4919         summary_select_prev_marked(mainwin->summaryview);
4920 }
4921
4922 static void next_marked_cb(GtkAction *action, gpointer data)
4923 {
4924         MainWindow *mainwin = (MainWindow *)data;
4925         summary_select_next_marked(mainwin->summaryview);
4926 }
4927
4928 static void prev_labeled_cb(GtkAction *action, gpointer data)
4929 {
4930         MainWindow *mainwin = (MainWindow *)data;
4931         summary_select_prev_labeled(mainwin->summaryview);
4932 }
4933
4934 static void next_labeled_cb(GtkAction *action, gpointer data)
4935 {
4936         MainWindow *mainwin = (MainWindow *)data;
4937         summary_select_next_labeled(mainwin->summaryview);
4938 }
4939
4940 static void prev_history_cb(GtkAction *action, gpointer data)
4941 {
4942         MainWindow *mainwin = (MainWindow *)data;
4943         MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4944         if (info) {
4945                 if (info->folder != mainwin->summaryview->folder_item)
4946                         folderview_select(mainwin->folderview, info->folder);
4947                 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4948                                 OPEN_SELECTED_ON_PREVNEXT);
4949                 procmsg_msginfo_free(&info);
4950                 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4951                 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4952         }
4953 }
4954
4955 static void next_history_cb(GtkAction *action, gpointer data)
4956 {
4957         MainWindow *mainwin = (MainWindow *)data;
4958         MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4959         if (info) {
4960                 if (info->folder != mainwin->summaryview->folder_item)
4961                         folderview_select(mainwin->folderview, info->folder);
4962                 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4963                                 OPEN_SELECTED_ON_PREVNEXT);
4964                 procmsg_msginfo_free(&info);
4965                 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4966                 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4967         }
4968 }
4969
4970 static void parent_cb(GtkAction *action, gpointer data)
4971 {
4972         MainWindow *mainwin = (MainWindow *)data;
4973         summary_select_parent(mainwin->summaryview);
4974 }
4975
4976 static void goto_folder_cb(GtkAction *action, gpointer data)
4977 {
4978         MainWindow *mainwin = (MainWindow *)data;
4979         FolderItem *to_folder;
4980
4981         to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4982                         _("Select folder to go to"));
4983
4984         if (to_folder)
4985                 folderview_select(mainwin->folderview, to_folder);
4986 }
4987
4988 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4989 {
4990         MainWindow *mainwin = (MainWindow *)data;
4991         folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4992 }
4993
4994 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4995 {
4996         MainWindow *mainwin = (MainWindow *)data;
4997         mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4998 }
4999
5000 static void scroll_next_line_cb(GtkAction *action, gpointer data)
5001 {
5002         MainWindow *mainwin = (MainWindow *)data;
5003         mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
5004 }
5005
5006 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
5007 {
5008         MainWindow *mainwin = (MainWindow *)data;
5009         mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
5010 }
5011
5012 static void scroll_next_page_cb(GtkAction *action, gpointer data)
5013 {
5014         MainWindow *mainwin = (MainWindow *)data;
5015         mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
5016 }
5017
5018 static void copy_cb(GtkAction *action, gpointer data)
5019 {
5020         MainWindow *mainwin = (MainWindow *)data;
5021         messageview_copy_clipboard(mainwin->messageview);
5022 }
5023
5024 static void allsel_cb(GtkAction *action, gpointer data)
5025 {
5026         MainWindow *mainwin = (MainWindow *)data;
5027         MessageView *msgview = mainwin->messageview;
5028
5029         if (messageview_is_visible(msgview) &&
5030                  (gtk_widget_has_focus(msgview->mimeview->textview->text)))
5031                 messageview_select_all(mainwin->messageview);
5032         else
5033                 summary_select_all(mainwin->summaryview);
5034 }
5035
5036 static void select_thread_cb(GtkAction *action, gpointer data)
5037 {
5038         MainWindow *mainwin = (MainWindow *)data;
5039         summary_select_thread(mainwin->summaryview, FALSE, FALSE);
5040 }
5041
5042 static void trash_thread_cb(GtkAction *action, gpointer data)
5043 {
5044         MainWindow *mainwin = (MainWindow *)data;
5045         summary_select_thread(mainwin->summaryview, FALSE, TRUE);
5046 }
5047
5048 static void delete_thread_cb(GtkAction *action, gpointer data)
5049 {
5050         MainWindow *mainwin = (MainWindow *)data;
5051         summary_select_thread(mainwin->summaryview, TRUE, FALSE);
5052 }
5053
5054 static void create_filter_cb(GtkAction *gaction, gpointer data)
5055 {
5056         MainWindow *mainwin = (MainWindow *)data;
5057         const gchar *a_name = gtk_action_get_name(gaction);
5058         gint action = -1;
5059
5060         DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
5061         DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
5062         DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5063         DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5064         summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5065 }
5066
5067 static void create_processing_cb(GtkAction *gaction, gpointer data)
5068 {
5069         MainWindow *mainwin = (MainWindow *)data;
5070         const gchar *a_name = gtk_action_get_name(gaction);
5071         gint action = -1;
5072
5073         DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5074         DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5075         DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5076         DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5077         summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5078 }
5079
5080 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5081 {
5082         prefs_filtering_open(&pre_global_processing,
5083                              _("Processing rules to apply before folder rules"),
5084                              MANUAL_ANCHOR_PROCESSING,
5085                              NULL, NULL, FALSE);
5086 }
5087
5088 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5089 {
5090         prefs_filtering_open(&post_global_processing,
5091                              _("Processing rules to apply after folder rules"),
5092                              MANUAL_ANCHOR_PROCESSING,
5093                              NULL, NULL, FALSE);
5094 }
5095
5096 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5097 {
5098         prefs_filtering_open(&filtering_rules,
5099                              _("Filtering configuration"),
5100                              MANUAL_ANCHOR_FILTERING,
5101                              NULL, NULL, TRUE);
5102 }
5103
5104 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5105 {
5106         prefs_template_open();
5107 }
5108
5109 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5110 {
5111         MainWindow *mainwin = (MainWindow *)data;
5112         prefs_actions_open(mainwin);
5113 }
5114
5115 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5116 {
5117         MainWindow *mainwin = (MainWindow *)data;
5118         GSList * list = summary_get_selected_msg_list(mainwin->summaryview);
5119         tag_apply_open(list);
5120 }
5121 #ifdef USE_GNUTLS
5122 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5123 {
5124         MainWindow *mainwin = (MainWindow *)data;
5125         ssl_manager_open(mainwin);
5126 }
5127 #endif
5128 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5129 {
5130         MainWindow *mainwin = (MainWindow *)data;
5131         if (!cur_account) {
5132                 new_account_cb(NULL, mainwin);
5133         } else {
5134                 account_open(cur_account, FALSE);
5135         }
5136 }
5137
5138 static void new_account_cb(GtkAction *action, gpointer data)
5139 {
5140         account_edit_open(NULL, NULL);
5141         if (!compose_get_compose_list()) account_add();
5142 }
5143
5144 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5145 {
5146         FolderItem *item = NULL;
5147         cur_account = (PrefsAccount *)data;
5148         
5149         if (!mainwindow_get_mainwindow())
5150                 return;
5151         main_window_show_cur_account(mainwindow_get_mainwindow());
5152         toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5153         main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5154         toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5155         item = folderview_get_selected_item(
5156                         mainwindow_get_mainwindow()->folderview);
5157         if (item) {
5158                 toolbar_set_compose_button
5159                         (mainwindow_get_mainwindow()->toolbar,
5160                          FOLDER_TYPE(item->folder) == F_NEWS ? 
5161                          COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5162         }
5163 }
5164
5165 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5166 {
5167         MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5168         PrefsAccount *account = (PrefsAccount *)data;
5169
5170         inc_account_mail(mainwin, account);
5171 }
5172 #ifndef GENERIC_UMPC
5173 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5174 {
5175         PrefsAccount *account = (PrefsAccount *)data;
5176
5177         compose_new_with_folderitem(account, NULL, NULL);
5178 }
5179 #endif
5180 static void prefs_open_cb(GtkAction *action, gpointer data)
5181 {
5182         prefs_gtk_open();
5183 }
5184
5185 static void plugins_open_cb(GtkAction *action, gpointer data)
5186 {
5187         pluginwindow_create();
5188 }
5189
5190 static void manual_open_cb(GtkAction *action, gpointer data)
5191 {
5192         manual_open(MANUAL_MANUAL_CLAWS, NULL);
5193 }
5194
5195 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5196 {
5197         manual_open(MANUAL_FAQ_CLAWS, NULL);
5198 }
5199
5200 static void legend_open_cb(GtkAction *action, gpointer data)
5201 {
5202         legend_show();
5203 }
5204
5205 #ifdef G_OS_WIN32
5206 static void set_default_client_cb(GtkAction *action, gpointer data)
5207 {
5208         char exename[MAX_PATH];
5209         gchar *binary_icon = NULL;
5210         gchar *binary_compose = NULL;
5211         gchar *binary_run = NULL;
5212         int r = 0;
5213         if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5214                 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5215                 return;
5216         }
5217         binary_icon = g_strconcat(exename, ",0", NULL);
5218         binary_compose = g_strconcat(exename, " --compose %1", NULL);
5219         binary_run = g_strconcat(exename, NULL);
5220
5221         /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5222         r = write_w32_registry_string("HKLM", "Software\\Clients\\Mail", 
5223                         "", "Claws Mail");
5224         
5225         r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail", 
5226                                 "", "Claws Mail");
5227         if (!r)
5228                 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail", 
5229                                 "DLLPath", "");
5230         if (!r)
5231                 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto", 
5232                                 "", "URL:MailTo-Protocol");
5233         if (!r)
5234                 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto", 
5235                                 "URL Protocol", "");
5236         if (!r)
5237                 r = write_w32_registry_dword ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto", 
5238                                 "EditFlags", 2);
5239         if (!r)
5240                 r = write_w32_registry_string ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto", 
5241                                 "FriendlyTypeName", "Claws-Mail URL");
5242         if (!r)
5243                 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon", 
5244                                 "", binary_icon);
5245         if (!r)
5246                 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command", 
5247                                 "", binary_compose);
5248         if (!r)
5249                 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command", 
5250                                 "", binary_run);
5251         
5252         if (!r)
5253                 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto", 
5254                                 "", "URL:MailTo-Protocol");
5255         if (!r)
5256                 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto", 
5257                                 "URL Protocol", "");
5258         if (!r)
5259                 r = write_w32_registry_dword ("HKCU", "Software\\Classes\\mailto", 
5260                                 "EditFlags", 2);
5261         if (!r)
5262                 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto", 
5263                                 "FriendlyTypeName", "Claws-Mail URL");
5264         if (!r)
5265                 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\DefaultIcon", 
5266                                 "", binary_icon);
5267         if (!r)
5268                 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\shell\\open\\command", 
5269                                 "", binary_compose);
5270         
5271         if (!r) {
5272                 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5273                 alertpanel_notice(_("Claws Mail has been registered as default client."));
5274         } else {
5275                 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5276         }
5277         g_free(binary_icon);
5278         g_free(binary_compose);
5279         g_free(binary_run);
5280 }
5281 #endif
5282
5283 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5284 {
5285         MainWindow *mainwin = (MainWindow *)data;
5286         gchar *str;
5287
5288         if (item->path)
5289                 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5290                                       LOCAL_FOLDER(folder)->rootpath,
5291                                       G_DIR_SEPARATOR,
5292                                       item->path);
5293         else
5294                 str = g_strdup_printf(_("Scanning folder %s..."),
5295                                       LOCAL_FOLDER(folder)->rootpath);
5296
5297         STATUSBAR_PUSH(mainwin, str);
5298         STATUSBAR_POP(mainwin);
5299         g_free(str);
5300 }
5301
5302 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5303                                           gpointer data)
5304 {
5305         SummaryView *summary;
5306
5307         cm_return_val_if_fail(data, FALSE);
5308         if (!g_list_find(mainwin_list, data))
5309                 return TRUE;
5310         summary = ((MainWindow *)data)->summaryview;
5311         cm_return_val_if_fail(summary, FALSE);
5312
5313         if (GTK_CMCLIST(summary->ctree)->selection && 
5314             g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5315                 return FALSE;
5316
5317         return FALSE;
5318 }
5319
5320 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5321                                           gpointer data)
5322 {
5323         is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5324         return FALSE;
5325 }
5326
5327 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5328                                           gpointer data)
5329 {
5330         if (!claws_is_starting()
5331                 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5332                 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5333
5334                 if (iconified_count > 0)
5335                         hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5336                 iconified_count++;
5337         } else if (!claws_is_starting()) {
5338                 prefs_common.mainwin_maximised = 
5339                         ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5340         }
5341         if (state->new_window_state == 0)
5342                 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5343         return FALSE;
5344 }
5345
5346 gboolean mainwindow_is_obscured(void)
5347 {
5348         return is_obscured;
5349 }
5350
5351 /*
5352  * Harvest addresses for selected folder.
5353  */
5354 static void addr_harvest_cb( GtkAction *action, gpointer data)
5355 {
5356         MainWindow *mainwin = (MainWindow *)data;
5357
5358         addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5359 }
5360
5361 /*
5362  * Harvest addresses for selected messages in summary view.
5363  */
5364 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5365 {
5366         MainWindow *mainwin = (MainWindow *)data;
5367         summary_harvest_address( mainwin->summaryview );
5368 }
5369
5370 /*!
5371  *\brief        get a MainWindow
5372  *
5373  *\return       MainWindow * The first mainwindow in the mainwin_list
5374  */
5375 MainWindow *mainwindow_get_mainwindow(void)
5376 {
5377         if (mainwin_list && mainwin_list->data)
5378                 return (MainWindow *)(mainwin_list->data);
5379         else
5380                 return NULL;
5381 }
5382
5383 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5384 {
5385         ProgressData *data = (ProgressData *) source;
5386         MainWindow *mainwin = (MainWindow *) userdata;
5387
5388         switch (data->cmd) {
5389         case PROGRESS_COMMAND_START:
5390         case PROGRESS_COMMAND_STOP:
5391                 gtk_progress_bar_set_fraction
5392                         (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5393                 break;
5394         case PROGRESS_COMMAND_SET_PERCENTAGE:
5395                 gtk_progress_bar_set_fraction
5396                         (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5397                 break;          
5398         }
5399         while (gtk_events_pending()) gtk_main_iteration ();
5400
5401         return FALSE;
5402 }
5403
5404 static void sync_cb(GtkAction *action, gpointer data)
5405 {
5406         MainWindow *mainwin = (MainWindow *)data;
5407         mainwindow_check_synchronise(mainwin, FALSE);
5408 }
5409
5410 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5411 {
5412         MainWindow *mainwin = (MainWindow *)data;
5413         GList *list = NULL;
5414         gint fgtn = 0;
5415         gint accs = 0;
5416
5417         main_window_lock(mainwin);
5418         for (list = account_get_list(); list != NULL; list = list->next) {
5419                 PrefsAccount *account = list->data;
5420                 if (account->session_passwd) {
5421                         g_free(account->session_passwd);
5422                         account->session_passwd = NULL;
5423                         ++fgtn;
5424                 }
5425                 if (account->session_smtp_passwd) {
5426                         g_free(account->session_smtp_passwd);
5427                         account->session_smtp_passwd = NULL;
5428                         ++fgtn;
5429                 }
5430                 ++accs;
5431         }
5432         main_window_unlock(mainwin);
5433         alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5434                                    "Forgotten %d passwords in %d accounts.\n",
5435                                    fgtn), fgtn, accs);  
5436 }
5437
5438 #ifndef PASSWORD_CRYPTO_OLD
5439 static void forget_master_passphrase_cb(GtkAction *action, gpointer data)
5440 {
5441         MainWindow *mainwin = (MainWindow *)data;
5442
5443         main_window_lock(mainwin);
5444         master_passphrase_forget();
5445         main_window_unlock(mainwin);
5446 }
5447 #endif
5448
5449 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5450 {
5451         summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5452 }
5453
5454 void mainwindow_jump_to(const gchar *target, gboolean popup)
5455 {
5456         gchar *tmp = NULL;
5457         gchar *p = NULL;
5458         FolderItem *item = NULL;
5459         gchar *msg = NULL;
5460         MainWindow *mainwin = mainwindow_get_mainwindow();
5461         gchar *from_uri = NULL;
5462         if (!target)
5463                 return;
5464                 
5465         if (!mainwin) {
5466                 g_print("not initialized\n");
5467                 return;
5468         }
5469
5470         if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5471                 tmp = from_uri;
5472         else
5473                 tmp = g_strdup(target);
5474         
5475         if ((p = strstr(tmp, "\r")) != NULL)
5476                 *p = '\0';
5477         if ((p = strstr(tmp, "\n")) != NULL)
5478                 *p = '\0';
5479
5480         if ((item = folder_find_item_from_identifier(tmp))) {
5481                 g_print("selecting folder '%s'\n", tmp);
5482                 folderview_select(mainwin->folderview, item);
5483                 if (popup)
5484                         main_window_popup(mainwin);
5485                 g_free(tmp);
5486                 return;
5487         }
5488         
5489         msg = strrchr(tmp, '/');
5490         if (msg) {
5491                 *msg++ = '\0';
5492                 if ((item = folder_find_item_from_identifier(tmp))) {
5493                         g_print("selecting folder '%s'\n", tmp);
5494                         folderview_select(mainwin->folderview, item);
5495                 } else if ((item = folder_find_item_from_real_path(tmp))) {
5496                         g_print("selecting folder '%s'\n", tmp);
5497                         folderview_select(mainwin->folderview, item);
5498                 } else {
5499                         g_print("'%s' not found\n", tmp);
5500                 }
5501                 if (item && msg && atoi(msg)) {
5502                         g_print("selecting message %d\n", atoi(msg));
5503                         summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5504                         if (popup)
5505                                 main_window_popup(mainwin);
5506                         g_free(tmp);
5507                         return;
5508                 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5509                         MsgInfo *msginfo = NULL;
5510                         msg++;
5511                         msg[strlen(msg)-1] = '\0';
5512                         msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5513                         if (msginfo) {
5514                                 g_print("selecting message %s\n", msg);
5515                                 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5516                                 if (popup)
5517                                         main_window_popup(mainwin);
5518                                 g_free(tmp);
5519                                 procmsg_msginfo_free(&msginfo);
5520                                 return;
5521                         } else {
5522                                 g_print("'%s' not found\n", msg);
5523                         }
5524                 } else {
5525                         g_print("'%s' not found\n", msg);
5526                 }
5527         } else {
5528                 g_print("'%s' not found\n", tmp);
5529         }
5530         
5531         g_free(tmp);
5532 }
5533
5534 void mainwindow_exit_folder(MainWindow *mainwin) {
5535         if (prefs_common.layout_mode == SMALL_LAYOUT) {
5536                 folderview_close_opened(mainwin->folderview, FALSE);
5537                 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5538                 folderview_grab_focus(mainwin->folderview);
5539         }
5540         mainwin->in_folder = FALSE;
5541         main_window_set_menu_sensitive(mainwin);
5542 }
5543
5544 void mainwindow_enter_folder(MainWindow *mainwin) {
5545         if (prefs_common.layout_mode == SMALL_LAYOUT) {
5546                 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5547         }
5548         mainwin->in_folder = TRUE;
5549         main_window_set_menu_sensitive(mainwin);
5550 }
5551
5552 static void save_part_as_cb(GtkAction *action, gpointer data)
5553 {
5554         MainWindow *mainwin = (MainWindow *)data;
5555
5556         if (mainwin->messageview 
5557         &&  mainwin->messageview->mimeview)
5558                 mimeview_save_as(mainwin->messageview->mimeview);
5559 }
5560
5561 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5562 {
5563         MainWindow *mainwin = (MainWindow *)data;
5564
5565         if (mainwin->messageview 
5566         &&  mainwin->messageview->mimeview)
5567                 mimeview_display_as_text(mainwin->messageview->mimeview);
5568 }
5569
5570 static void open_part_cb(GtkAction *action, gpointer data)
5571 {
5572         MainWindow *mainwin = (MainWindow *)data;
5573
5574         if (mainwin->messageview 
5575         &&  mainwin->messageview->mimeview)
5576                 mimeview_launch(mainwin->messageview->mimeview, NULL);
5577 }
5578 #ifndef G_OS_WIN32
5579 static void open_part_with_cb(GtkAction *action, gpointer data)
5580 {
5581         MainWindow *mainwin = (MainWindow *)data;
5582
5583         if (mainwin->messageview 
5584         &&  mainwin->messageview->mimeview)
5585                 mimeview_open_with(mainwin->messageview->mimeview);
5586 }
5587 #endif
5588 static void check_signature_cb(GtkAction *action, gpointer data)
5589 {
5590         MainWindow *mainwin = (MainWindow *)data;
5591
5592         if (mainwin->messageview 
5593         &&  mainwin->messageview->mimeview)
5594                 mimeview_check_signature(mainwin->messageview->mimeview);
5595 }
5596
5597 static void goto_next_part_cb(GtkAction *action, gpointer data)
5598 {
5599         MainWindow *mainwin = (MainWindow *)data;
5600
5601         if (mainwin->messageview 
5602         &&  mainwin->messageview->mimeview)
5603                 mimeview_select_next_part(mainwin->messageview->mimeview);
5604 }
5605
5606 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5607 {
5608         MainWindow *mainwin = (MainWindow *)data;
5609
5610         if (mainwin->messageview 
5611         &&  mainwin->messageview->mimeview)
5612                 mimeview_select_prev_part(mainwin->messageview->mimeview);
5613 }