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