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