2004-09-28 [colin] 0.9.12cvs110
[claws.git] / src / mainwindow.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2004 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 2 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, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19
20 #include "defs.h"
21
22 #include <glib.h>
23 #include <gdk/gdkkeysyms.h>
24 #include <gtk/gtkmain.h>
25 #include <gtk/gtkwindow.h>
26 #include <gtk/gtkwidget.h>
27 #include <gtk/gtksignal.h>
28 #include <gtk/gtkvbox.h>
29 #include <gtk/gtkcontainer.h>
30 #include <gtk/gtkstatusbar.h>
31 #include <gtk/gtkprogressbar.h>
32 #include <gtk/gtkhpaned.h>
33 #include <gtk/gtkvpaned.h>
34 #include <gtk/gtkcheckmenuitem.h>
35 #include <gtk/gtkitemfactory.h>
36 #include <gtk/gtkeditable.h>
37 #include <gtk/gtkmenu.h>
38 #include <gtk/gtkmenuitem.h>
39 #include <gtk/gtkhandlebox.h>
40 #include <gtk/gtktoolbar.h>
41 #include <gtk/gtkbutton.h>
42 #include <gtk/gtktooltips.h>
43 #include <string.h>
44
45 #include "intl.h"
46 #include "main.h"
47 #include "mainwindow.h"
48 #include "folderview.h"
49 #include "foldersel.h"
50 #include "summaryview.h"
51 #include "summary_search.h"
52 #include "messageview.h"
53 #include "message_search.h"
54 #include "headerview.h"
55 #include "menu.h"
56 #include "stock_pixmap.h"
57 #include "folder.h"
58 #include "inc.h"
59 #include "compose.h"
60 #include "procmsg.h"
61 #include "import.h"
62 #include "export.h"
63 #include "prefs_common.h"
64 #include "prefs_actions.h"
65 #include "prefs_filtering.h"
66 #include "prefs_account.h"
67 #include "prefs_summary_column.h"
68 #include "prefs_template.h"
69 #include "action.h"
70 #include "account.h"
71 #include "addressbook.h"
72 #include "logwindow.h"
73 #include "manage_window.h"
74 #include "alertpanel.h"
75 #include "statusbar.h"
76 #include "inputdialog.h"
77 #include "utils.h"
78 #include "gtkutils.h"
79 #include "codeconv.h"
80 #include "about.h"
81 #include "manual.h"
82 #include "version.h"
83 #include "ssl_manager.h"
84 #include "sslcertwindow.h"
85 #include "prefs_gtk.h"
86 #include "pluginwindow.h"
87 #include "hooks.h"
88 #include "progressindicator.h"
89 #include "localfolder.h"
90 #include "filtering.h"
91 #include "folderutils.h"
92 #include "foldersort.h"
93
94 #define AC_LABEL_WIDTH  240
95
96 /* list of all instantiated MainWindow */
97 static GList *mainwin_list = NULL;
98
99 static GdkCursor *watch_cursor;
100
101 static void main_window_menu_callback_block     (MainWindow     *mainwin);
102 static void main_window_menu_callback_unblock   (MainWindow     *mainwin);
103
104 static void main_window_show_cur_account        (MainWindow     *mainwin);
105
106 static void main_window_set_widgets             (MainWindow     *mainwin,
107                                                  SeparateType    type);
108
109 #if 0
110 static void toolbar_account_button_pressed      (GtkWidget      *widget,
111                                                  GdkEventButton *event,
112                                                  gpointer        data);
113 #endif
114
115 static void toolbar_child_attached              (GtkWidget      *widget,
116                                                  GtkWidget      *child,
117                                                  gpointer        data);
118 static void toolbar_child_detached              (GtkWidget      *widget,
119                                                  GtkWidget      *child,
120                                                  gpointer        data);
121
122 static void ac_label_button_pressed             (GtkWidget      *widget,
123                                                  GdkEventButton *event,
124                                                  gpointer        data);
125 static void ac_menu_popup_closed                (GtkMenuShell   *menu_shell,
126                                                  gpointer        data);
127
128 static gint main_window_close_cb                (GtkWidget      *widget,
129                                                  GdkEventAny    *event,
130                                                  gpointer        data);
131 static gint folder_window_close_cb              (GtkWidget      *widget,
132                                                  GdkEventAny    *event,
133                                                  gpointer        data);
134 static gint message_window_close_cb             (GtkWidget      *widget,
135                                                  GdkEventAny    *event,
136                                                  gpointer        data);
137
138 static void main_window_size_allocate_cb        (GtkWidget      *widget,
139                                                  GtkAllocation  *allocation,
140                                                  gpointer        data);
141 static void folder_window_size_allocate_cb      (GtkWidget      *widget,
142                                                  GtkAllocation  *allocation,
143                                                  gpointer        data);
144 static void message_window_size_allocate_cb     (GtkWidget      *widget,
145                                                  GtkAllocation  *allocation,
146                                                  gpointer        data);
147
148 static void update_folderview_cb (MainWindow    *mainwin,
149                                   guint          action,
150                                   GtkWidget     *widget);
151 static void add_mailbox_cb       (MainWindow    *mainwin,
152                                   guint          action,
153                                   GtkWidget     *widget);
154 static void foldersort_cb        (MainWindow    *mainwin,
155                                   guint          action,
156                                   GtkWidget     *widget);
157 static void import_mbox_cb       (MainWindow    *mainwin,
158                                   guint          action,
159                                   GtkWidget     *widget);
160 static void export_mbox_cb       (MainWindow    *mainwin,
161                                   guint          action,
162                                   GtkWidget     *widget);
163 static void empty_trash_cb       (MainWindow    *mainwin,
164                                   guint          action,
165                                   GtkWidget     *widget);
166
167 static void save_as_cb           (MainWindow    *mainwin,
168                                   guint          action,
169                                   GtkWidget     *widget);
170 static void print_cb             (MainWindow    *mainwin,
171                                   guint          action,
172                                   GtkWidget     *widget);
173 static void app_exit_cb          (MainWindow    *mainwin,
174                                   guint          action,
175                                   GtkWidget     *widget);
176
177 static void search_cb            (MainWindow    *mainwin,
178                                   guint          action,
179                                   GtkWidget     *widget);
180
181 static void toggle_folder_cb     (MainWindow    *mainwin,
182                                   guint          action,
183                                   GtkWidget     *widget);
184 static void toggle_message_cb    (MainWindow    *mainwin,
185                                   guint          action,
186                                   GtkWidget     *widget);
187 static void toggle_toolbar_cb    (MainWindow    *mainwin,
188                                   guint          action,
189                                   GtkWidget     *widget);
190 static void toggle_statusbar_cb  (MainWindow    *mainwin,
191                                   guint          action,
192                                   GtkWidget     *widget);
193 static void separate_widget_cb   (MainWindow    *mainwin,
194                                   guint          action,
195                                   GtkWidget     *widget);
196
197 static void addressbook_open_cb (MainWindow     *mainwin,
198                                  guint           action,
199                                  GtkWidget      *widget);
200 static void log_window_show_cb  (MainWindow     *mainwin,
201                                  guint           action,
202                                  GtkWidget      *widget);
203
204 static void inc_cancel_cb               (MainWindow     *mainwin,
205                                          guint           action,
206                                          GtkWidget      *widget);
207
208 static void open_msg_cb                 (MainWindow     *mainwin,
209                                          guint           action,
210                                          GtkWidget      *widget);
211
212 static void view_source_cb              (MainWindow     *mainwin,
213                                          guint           action,
214                                          GtkWidget      *widget);
215
216 static void show_all_header_cb          (MainWindow     *mainwin,
217                                          guint           action,
218                                          GtkWidget      *widget);
219
220 static void move_to_cb                  (MainWindow     *mainwin,
221                                          guint           action,
222                                          GtkWidget      *widget);
223 static void copy_to_cb                  (MainWindow     *mainwin,
224                                          guint           action,
225                                          GtkWidget      *widget);
226 static void delete_cb                   (MainWindow     *mainwin,
227                                          guint           action,
228                                          GtkWidget      *widget);
229
230 static void cancel_cb                   (MainWindow     *mainwin,
231                                          guint           action,
232                                          GtkWidget      *widget);
233
234 static void mark_cb                     (MainWindow     *mainwin,
235                                          guint           action,
236                                          GtkWidget      *widget);
237 static void unmark_cb                   (MainWindow     *mainwin,
238                                          guint           action,
239                                          GtkWidget      *widget);
240
241 static void mark_as_unread_cb           (MainWindow     *mainwin,
242                                          guint           action,
243                                          GtkWidget      *widget);
244 static void mark_as_read_cb             (MainWindow     *mainwin,
245                                          guint           action,
246                                          GtkWidget      *widget);
247 static void mark_all_read_cb            (MainWindow     *mainwin,
248                                          guint           action,
249                                          GtkWidget      *widget);
250
251 static void reedit_cb                   (MainWindow     *mainwin,
252                                          guint           action,
253                                          GtkWidget      *widget);
254
255 static void add_address_cb              (MainWindow     *mainwin,
256                                          guint           action,
257                                          GtkWidget      *widget);
258
259 static void set_charset_cb              (MainWindow     *mainwin,
260                                          guint           action,
261                                          GtkWidget      *widget);
262
263 static void hide_read_messages   (MainWindow    *mainwin,
264                                   guint          action,
265                                   GtkWidget     *widget);
266
267 static void thread_cb            (MainWindow    *mainwin,
268                                   guint          action,
269                                   GtkWidget     *widget);
270 static void expand_threads_cb    (MainWindow    *mainwin,
271                                   guint          action,
272                                   GtkWidget     *widget);
273 static void collapse_threads_cb  (MainWindow    *mainwin,
274                                   guint          action,
275                                   GtkWidget     *widget);
276
277 static void set_display_item_cb  (MainWindow    *mainwin,
278                                   guint          action,
279                                   GtkWidget     *widget);
280 static void sort_summary_cb      (MainWindow    *mainwin,
281                                   guint          action,
282                                   GtkWidget     *widget);
283 static void sort_summary_type_cb (MainWindow    *mainwin,
284                                   guint          action,
285                                   GtkWidget     *widget);
286 static void attract_by_subject_cb(MainWindow    *mainwin,
287                                   guint          action,
288                                   GtkWidget     *widget);
289
290 static void delete_duplicated_cb (MainWindow    *mainwin,
291                                   guint          action,
292                                   GtkWidget     *widget);
293 static void delete_duplicated_all_cb (MainWindow        *mainwin,
294                                   guint          action,
295                                   GtkWidget     *widget);
296 static void filter_cb            (MainWindow    *mainwin,
297                                   guint          action,
298                                   GtkWidget     *widget);
299 static void execute_summary_cb   (MainWindow    *mainwin,
300                                   guint          action,
301                                   GtkWidget     *widget);
302 static void update_summary_cb    (MainWindow    *mainwin,
303                                   guint          action,
304                                   GtkWidget     *widget);
305
306 static void prev_cb              (MainWindow    *mainwin,
307                                   guint          action,
308                                   GtkWidget     *widget);
309 static void next_cb              (MainWindow    *mainwin,
310                                   guint          action,
311                                   GtkWidget     *widget);
312 static void next_unread_cb       (MainWindow    *mainwin,
313                                   guint          action,
314                                   GtkWidget     *widget);
315 static void prev_unread_cb       (MainWindow    *mainwin,
316                                   guint          action,
317                                   GtkWidget     *widget);
318
319 static void prev_new_cb          (MainWindow    *mainwin,
320                                   guint          action,
321                                   GtkWidget     *widget);
322 static void next_new_cb          (MainWindow    *mainwin,
323                                   guint          action,
324                                   GtkWidget     *widget);
325 static void prev_marked_cb       (MainWindow    *mainwin,
326                                   guint          action,
327                                   GtkWidget     *widget);
328 static void next_marked_cb       (MainWindow    *mainwin,
329                                   guint          action,
330                                   GtkWidget     *widget);
331 static void prev_labeled_cb      (MainWindow    *mainwin,
332                                   guint          action,
333                                   GtkWidget     *widget);
334 static void next_labeled_cb      (MainWindow    *mainwin,
335                                   guint          action,
336                                   GtkWidget     *widget);
337
338 static void goto_folder_cb       (MainWindow    *mainwin,
339                                   guint          action,
340                                   GtkWidget     *widget);
341
342 static void copy_cb              (MainWindow    *mainwin,
343                                   guint          action,
344                                   GtkWidget     *widget);
345 static void allsel_cb            (MainWindow    *mainwin,
346                                   guint          action,
347                                   GtkWidget     *widget);
348 static void select_thread_cb     (MainWindow    *mainwin,
349                                   guint          action,
350                                   GtkWidget     *widget);
351
352 static void create_filter_cb     (MainWindow    *mainwin,
353                                   guint          action,
354                                   GtkWidget     *widget);
355 static void create_processing_cb (MainWindow    *mainwin,
356                                   guint          action,
357                                   GtkWidget     *widget);
358
359 static void prefs_common_open_cb        (MainWindow     *mainwin,
360                                          guint           action,
361                                          GtkWidget      *widget);
362 static void prefs_template_open_cb      (MainWindow     *mainwin,
363                                          guint           action,
364                                          GtkWidget      *widget);
365 static void prefs_actions_open_cb       (MainWindow     *mainwin,
366                                          guint           action,
367                                          GtkWidget      *widget);
368 static void prefs_account_open_cb       (MainWindow     *mainwin,
369                                          guint           action,
370                                          GtkWidget      *widget);
371
372 static void prefs_pre_processing_open_cb  (MainWindow   *mainwin,
373                                            guint         action,
374                                            GtkWidget    *widget);
375
376 static void prefs_post_processing_open_cb (MainWindow   *mainwin,
377                                            guint         action,
378                                            GtkWidget    *widget);
379
380 static void prefs_filtering_open_cb     (MainWindow     *mainwin,
381                                          guint           action,
382                                          GtkWidget      *widget);
383 #ifdef USE_OPENSSL
384 static void ssl_manager_open_cb         (MainWindow     *mainwin,
385                                          guint           action,
386                                          GtkWidget      *widget);
387 #endif
388 static void new_account_cb       (MainWindow    *mainwin,
389                                   guint          action,
390                                   GtkWidget     *widget);
391
392 static void account_selector_menu_cb     (GtkMenuItem   *menuitem,
393                                           gpointer       data);
394 static void account_receive_menu_cb      (GtkMenuItem   *menuitem,
395                                           gpointer       data);
396
397 static void prefs_open_cb       (GtkMenuItem    *menuitem,
398                                  gpointer        data);
399 static void plugins_open_cb     (GtkMenuItem    *menuitem,
400                                  gpointer        data);
401
402 static void online_switch_clicked(GtkButton     *btn, 
403                                   gpointer data);
404
405 static void manual_open_cb       (MainWindow    *mainwin,
406                                   guint          action,
407                                   GtkWidget     *widget);
408
409 static void scan_tree_func       (Folder        *folder,
410                                   FolderItem    *item,
411                                   gpointer       data);
412                                   
413 static void toggle_work_offline_cb(MainWindow *mainwin, guint action, GtkWidget *widget);
414
415 static void addr_harvest_cb      ( MainWindow  *mainwin,
416                                    guint       action,
417                                    GtkWidget   *widget );
418
419 static void addr_harvest_msg_cb  ( MainWindow  *mainwin,
420                                    guint       action,
421                                    GtkWidget   *widget );
422
423 static gboolean mainwindow_focus_in_event       (GtkWidget      *widget, 
424                                                  GdkEventFocus  *focus,
425                                                  gpointer        data);
426 void main_window_reply_cb                       (MainWindow     *mainwin, 
427                                                  guint           action,
428                                                  GtkWidget      *widget);
429 gboolean mainwindow_progressindicator_hook      (gpointer        source,
430                                                  gpointer        userdata);
431 #define  SEPARATE_ACTION 500 
432
433 static GtkItemFactoryEntry mainwin_entries[] =
434 {
435         {N_("/_File"),                          NULL, NULL, 0, "<Branch>"},
436         {N_("/_File/_Add mailbox"),             NULL, NULL, 0, "<Branch>"},
437         {N_("/_File/_Add mailbox/MH..."),       NULL, add_mailbox_cb, 0, NULL},
438         {N_("/_File/Change folder order"),      NULL, foldersort_cb,  0, NULL},
439         {N_("/_File/_Import mbox file..."),     NULL, import_mbox_cb, 0, NULL},
440         {N_("/_File/_Export to mbox file..."),  NULL, export_mbox_cb, 0, NULL},
441         {N_("/_File/Empty _trash"),             "<shift>D", empty_trash_cb, 0, NULL},
442         {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
443         {N_("/_File/_Save as..."),              "<control>S", save_as_cb, 0, NULL},
444         {N_("/_File/_Print..."),                NULL, print_cb, 0, NULL},
445         {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
446         {N_("/_File/_Work offline"),            "<control>W", toggle_work_offline_cb, 0, "<ToggleItem>"},
447         {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
448         /* {N_("/_File/_Close"),                "<alt>W", app_exit_cb, 0, NULL}, */
449         {N_("/_File/E_xit"),                    "<control>Q", app_exit_cb, 0, NULL},
450
451         {N_("/_Edit"),                          NULL, NULL, 0, "<Branch>"},
452         {N_("/_Edit/_Copy"),                    "<control>C", copy_cb, 0, NULL},
453         {N_("/_Edit/Select _all"),              "<control>A", allsel_cb, 0, NULL},
454         {N_("/_Edit/Select _thread"),           NULL, select_thread_cb, 0, NULL},
455         {N_("/_Edit/---"),                      NULL, NULL, 0, "<Separator>"},
456         {N_("/_Edit/_Find in current message..."),
457                                                 "<control>F", search_cb, 0, NULL},
458         {N_("/_Edit/_Search folder..."),        "<shift><control>F", search_cb, 1, NULL},
459         {N_("/_View"),                          NULL, NULL, 0, "<Branch>"},
460         {N_("/_View/Show or hi_de"),            NULL, NULL, 0, "<Branch>"},
461         {N_("/_View/Show or hi_de/_Folder tree"),
462                                                 NULL, toggle_folder_cb, 0, "<ToggleItem>"},
463         {N_("/_View/Show or hi_de/_Message view"),
464                                                 "V", toggle_message_cb, 0, "<ToggleItem>"},
465         {N_("/_View/Show or hi_de/_Toolbar"),
466                                                 NULL, NULL, 0, "<Branch>"},
467         {N_("/_View/Show or hi_de/_Toolbar/Icon _and text"),
468                                                 NULL, toggle_toolbar_cb, TOOLBAR_BOTH, "<RadioItem>"},
469         {N_("/_View/Show or hi_de/_Toolbar/_Icon"),
470                                                 NULL, toggle_toolbar_cb, TOOLBAR_ICON, "/View/Show or hide/Toolbar/Icon and text"},
471         {N_("/_View/Show or hi_de/_Toolbar/_Text"),
472                                                 NULL, toggle_toolbar_cb, TOOLBAR_TEXT, "/View/Show or hide/Toolbar/Icon and text"},
473         {N_("/_View/Show or hi_de/_Toolbar/_None"),
474                                                 NULL, toggle_toolbar_cb, TOOLBAR_NONE, "/View/Show or hide/Toolbar/Icon and text"},
475         {N_("/_View/Show or hi_de/Status _bar"),
476                                                 NULL, toggle_statusbar_cb, 0, "<ToggleItem>"},
477         {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
478         {N_("/_View/Separate f_older tree"),    NULL, separate_widget_cb, SEPARATE_FOLDER, "<ToggleItem>"},
479         {N_("/_View/Separate m_essage view"),   NULL, separate_widget_cb, SEPARATE_MESSAGE, "<ToggleItem>"},
480         {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
481         {N_("/_View/_Sort"),                    NULL, NULL, 0, "<Branch>"},
482         {N_("/_View/_Sort/by _number"),         NULL, sort_summary_cb, SORT_BY_NUMBER, "<RadioItem>"},
483         {N_("/_View/_Sort/by s_ize"),           NULL, sort_summary_cb, SORT_BY_SIZE, "/View/Sort/by number"},
484         {N_("/_View/_Sort/by _date"),           NULL, sort_summary_cb, SORT_BY_DATE, "/View/Sort/by number"},
485         {N_("/_View/_Sort/by _from"),           NULL, sort_summary_cb, SORT_BY_FROM, "/View/Sort/by number"},
486         {N_("/_View/_Sort/by _recipient"),      NULL, sort_summary_cb, SORT_BY_TO, "/View/Sort/by number"},
487         {N_("/_View/_Sort/by _subject"),        NULL, sort_summary_cb, SORT_BY_SUBJECT, "/View/Sort/by number"},
488         {N_("/_View/_Sort/by _color label"),
489                                                 NULL, sort_summary_cb, SORT_BY_LABEL, "/View/Sort/by number"},
490         {N_("/_View/_Sort/by _mark"),           NULL, sort_summary_cb, SORT_BY_MARK, "/View/Sort/by number"},
491         {N_("/_View/_Sort/by _status"),         NULL, sort_summary_cb, SORT_BY_STATUS, "/View/Sort/by number"},
492         {N_("/_View/_Sort/by a_ttachment"),
493                                                 NULL, sort_summary_cb, SORT_BY_MIME, "/View/Sort/by number"},
494         {N_("/_View/_Sort/by score"),           NULL, sort_summary_cb, SORT_BY_SCORE, "/View/Sort/by number"},
495         {N_("/_View/_Sort/by locked"),          NULL, sort_summary_cb, SORT_BY_LOCKED, "/View/Sort/by number"},
496         {N_("/_View/_Sort/D_on't sort"),        NULL, sort_summary_cb, SORT_BY_NONE, "/View/Sort/by number"},
497         {N_("/_View/_Sort/---"),                NULL, NULL, 0, "<Separator>"},
498         {N_("/_View/_Sort/Ascending"),          NULL, sort_summary_type_cb, SORT_ASCENDING, "<RadioItem>"},
499         {N_("/_View/_Sort/Descending"),         NULL, sort_summary_type_cb, SORT_DESCENDING, "/View/Sort/Ascending"},
500         {N_("/_View/_Sort/---"),                NULL, NULL, 0, "<Separator>"},
501         {N_("/_View/_Sort/_Attract by subject"),
502                                                 NULL, attract_by_subject_cb, 0, NULL},
503         {N_("/_View/Th_read view"),             "<control>T", thread_cb, 0, "<ToggleItem>"},
504         {N_("/_View/E_xpand all threads"),      NULL, expand_threads_cb, 0, NULL},
505         {N_("/_View/Co_llapse all threads"),    NULL, collapse_threads_cb, 0, NULL},
506         {N_("/_View/_Hide read messages"),      NULL, hide_read_messages, 0, "<ToggleItem>"},
507         {N_("/_View/Set displayed _items..."),  NULL, set_display_item_cb, 0, NULL},
508
509         {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
510         {N_("/_View/_Go to"),                   NULL, NULL, 0, "<Branch>"},
511         {N_("/_View/_Go to/_Prev message"),     "P", prev_cb, 0, NULL},
512         {N_("/_View/_Go to/_Next message"),     "N", next_cb, 0, NULL},
513         {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
514         {N_("/_View/_Go to/P_rev unread message"),
515                                                 "<shift>P", prev_unread_cb, 0, NULL},
516         {N_("/_View/_Go to/N_ext unread message"),
517                                                 "<shift>N", next_unread_cb, 0, NULL},
518         {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
519         {N_("/_View/_Go to/Prev ne_w message"), NULL, prev_new_cb, 0, NULL},
520         {N_("/_View/_Go to/Ne_xt new message"), NULL, next_new_cb, 0, NULL},
521         {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
522         {N_("/_View/_Go to/Prev _marked message"),
523                                                 NULL, prev_marked_cb, 0, NULL},
524         {N_("/_View/_Go to/Next m_arked message"),
525                                                 NULL, next_marked_cb, 0, NULL},
526         {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
527         {N_("/_View/_Go to/Prev _labeled message"),
528                                                 NULL, prev_labeled_cb, 0, NULL},
529         {N_("/_View/_Go to/Next la_beled message"),
530                                                 NULL, next_labeled_cb, 0, NULL},
531         {N_("/_View/_Go to/---"),               NULL, NULL, 0, "<Separator>"},
532         {N_("/_View/_Go to/Other _folder..."),  "G", goto_folder_cb, 0, NULL},
533         {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
534
535 #define CODESET_SEPARATOR \
536         {N_("/_View/_Code set/---"),            NULL, NULL, 0, "<Separator>"}
537 #define CODESET_ACTION(action) \
538          NULL, set_charset_cb, action, "/View/Code set/Auto detect"
539
540         {N_("/_View/_Code set"),                NULL, NULL, 0, "<Branch>"},
541         {N_("/_View/_Code set/_Auto detect"),
542          NULL, set_charset_cb, C_AUTO, "<RadioItem>"},
543         {N_("/_View/_Code set/---"),            NULL, NULL, 0, "<Separator>"},
544         {N_("/_View/_Code set/7bit ascii (US-ASC_II)"),
545          CODESET_ACTION(C_US_ASCII)},
546
547 #if HAVE_ICONV
548         {N_("/_View/_Code set/Unicode (_UTF-8)"),
549          CODESET_ACTION(C_UTF_8)},
550         CODESET_SEPARATOR,
551 #endif
552         {N_("/_View/_Code set/Western European (ISO-8859-_1)"),
553          CODESET_ACTION(C_ISO_8859_1)},
554         {N_("/_View/_Code set/Western European (ISO-8859-15)"),
555          CODESET_ACTION(C_ISO_8859_15)},
556         CODESET_SEPARATOR,
557 #if HAVE_ICONV
558         {N_("/_View/_Code set/Central European (ISO-8859-_2)"),
559          CODESET_ACTION(C_ISO_8859_2)},
560         CODESET_SEPARATOR,
561         {N_("/_View/_Code set/_Baltic (ISO-8859-13)"),
562          CODESET_ACTION(C_ISO_8859_13)},
563         {N_("/_View/_Code set/Baltic (ISO-8859-_4)"),
564          CODESET_ACTION(C_ISO_8859_4)},
565         CODESET_SEPARATOR,
566         {N_("/_View/_Code set/Greek (ISO-8859-_7)"),
567          CODESET_ACTION(C_ISO_8859_7)},
568         CODESET_SEPARATOR,
569         {N_("/_View/_Code set/Turkish (ISO-8859-_9)"),
570          CODESET_ACTION(C_ISO_8859_9)},
571         CODESET_SEPARATOR,
572         {N_("/_View/_Code set/Cyrillic (ISO-8859-_5)"),
573          CODESET_ACTION(C_ISO_8859_5)},
574         {N_("/_View/_Code set/Cyrillic (KOI8-_R)"),
575          CODESET_ACTION(C_KOI8_R)},
576         {N_("/_View/_Code set/Cyrillic (KOI8-U)"),
577          CODESET_ACTION(C_KOI8_U)},
578         {N_("/_View/_Code set/Cyrillic (Windows-1251)"),
579          CODESET_ACTION(C_WINDOWS_1251)},
580         CODESET_SEPARATOR,
581 #endif
582         {N_("/_View/_Code set/Japanese (ISO-2022-_JP)"),
583          CODESET_ACTION(C_ISO_2022_JP)},
584 #if HAVE_ICONV
585         {N_("/_View/_Code set/Japanese (ISO-2022-JP-2)"),
586          CODESET_ACTION(C_ISO_2022_JP_2)},
587 #endif
588         {N_("/_View/_Code set/Japanese (_EUC-JP)"),
589          CODESET_ACTION(C_EUC_JP)},
590         {N_("/_View/_Code set/Japanese (_Shift__JIS)"),
591          CODESET_ACTION(C_SHIFT_JIS)},
592 #if HAVE_ICONV
593         CODESET_SEPARATOR,
594         {N_("/_View/_Code set/Simplified Chinese (_GB2312)"),
595          CODESET_ACTION(C_GB2312)},
596         {N_("/_View/_Code set/Traditional Chinese (_Big5)"),
597          CODESET_ACTION(C_BIG5)},
598         {N_("/_View/_Code set/Traditional Chinese (EUC-_TW)"),
599          CODESET_ACTION(C_EUC_TW)},
600         {N_("/_View/_Code set/Chinese (ISO-2022-_CN)"),
601          CODESET_ACTION(C_ISO_2022_CN)},
602         CODESET_SEPARATOR,
603         {N_("/_View/_Code set/Korean (EUC-_KR)"),
604          CODESET_ACTION(C_EUC_KR)},
605         {N_("/_View/_Code set/Korean (ISO-2022-KR)"),
606          CODESET_ACTION(C_ISO_2022_KR)},
607         CODESET_SEPARATOR,
608         {N_("/_View/_Code set/Thai (TIS-620)"),
609          CODESET_ACTION(C_TIS_620)},
610         {N_("/_View/_Code set/Thai (Windows-874)"),
611          CODESET_ACTION(C_WINDOWS_874)},
612 #endif
613
614 #undef CODESET_SEPARATOR
615 #undef CODESET_ACTION
616
617         {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
618         {N_("/_View/Open in new _window"),      "<control><alt>N", open_msg_cb, 0, NULL},
619         {N_("/_View/Mess_age source"),          "<control>U", view_source_cb, 0, NULL},
620         {N_("/_View/Show all _headers"),        "<control>H", show_all_header_cb, 0, "<ToggleItem>"},
621         {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
622         {N_("/_View/_Update summary"),          "<control><alt>U", update_summary_cb,  0, NULL},
623
624         {N_("/_Message"),                       NULL, NULL, 0, "<Branch>"},
625         {N_("/_Message/Recei_ve"),              NULL, NULL, 0, "<Branch>"},
626         {N_("/_Message/Recei_ve/Get from _current account"),
627                                                 "<control>I",   inc_mail_cb, 0, NULL},
628         {N_("/_Message/Recei_ve/Get from _all accounts"),
629                                                 "<shift><control>I", inc_all_account_mail_cb, 0, NULL},
630         {N_("/_Message/Recei_ve/Cancel receivin_g"),
631                                                 NULL, inc_cancel_cb, 0, NULL},
632         {N_("/_Message/Recei_ve/---"),          NULL, NULL, 0, "<Separator>"},
633         {N_("/_Message/_Send queued messages"), NULL, send_queue_cb, 0, NULL},
634         {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
635         {N_("/_Message/Compose a_n email message"),     "<control>M", compose_mail_cb, 0, NULL},
636         {N_("/_Message/Compose a news message"),        NULL,   compose_news_cb, 0, NULL},
637         {N_("/_Message/_Reply"),                "<control>R",   main_window_reply_cb, COMPOSE_REPLY, NULL},
638         {N_("/_Message/Repl_y to"),             NULL, NULL, 0, "<Branch>"},
639         {N_("/_Message/Repl_y to/_all"),        "<shift><control>R", main_window_reply_cb, COMPOSE_REPLY_TO_ALL, NULL},
640         {N_("/_Message/Repl_y to/_sender"),     NULL, main_window_reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
641         {N_("/_Message/Repl_y to/mailing _list"),
642                                                 "<control>L", main_window_reply_cb, COMPOSE_REPLY_TO_LIST, NULL},
643         {N_("/_Message/Follow-up and reply to"),NULL, main_window_reply_cb, COMPOSE_FOLLOWUP_AND_REPLY_TO, NULL},
644         {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
645         {N_("/_Message/_Forward"),              "<control><alt>F", main_window_reply_cb, COMPOSE_FORWARD, NULL},
646         {N_("/_Message/Redirect"),              NULL, main_window_reply_cb, COMPOSE_REDIRECT, NULL},
647         {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
648         {N_("/_Message/M_ove..."),              "<control>O", move_to_cb, 0, NULL},
649         {N_("/_Message/_Copy..."),              "<shift><control>O", copy_to_cb, 0, NULL},
650         {N_("/_Message/_Delete"),               "<control>D", delete_cb,  0, NULL},
651         {N_("/_Message/Cancel a news message"), "", cancel_cb,  0, NULL},
652         {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
653         {N_("/_Message/_Mark"),                 NULL, NULL, 0, "<Branch>"},
654         {N_("/_Message/_Mark/_Mark"),           "<shift>asterisk", mark_cb, 0, NULL},
655         {N_("/_Message/_Mark/_Unmark"),         "U", unmark_cb, 0, NULL},
656         {N_("/_Message/_Mark/---"),             NULL, NULL, 0, "<Separator>"},
657         {N_("/_Message/_Mark/Mark as unr_ead"), "<shift>exclam", mark_as_unread_cb, 0, NULL},
658         {N_("/_Message/_Mark/Mark as rea_d"),
659                                                 NULL, mark_as_read_cb, 0, NULL},
660         {N_("/_Message/_Mark/Mark all _read"),  NULL, mark_all_read_cb, 0, NULL},
661         {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
662         {N_("/_Message/Re-_edit"),              NULL, reedit_cb, 0, NULL},
663
664         {N_("/_Tools"),                         NULL, NULL, 0, "<Branch>"},
665         {N_("/_Tools/_Address book..."),        "<shift><control>A", addressbook_open_cb, 0, NULL},
666         {N_("/_Tools/Add sender to address boo_k"),
667                                                 NULL, add_address_cb, 0, NULL},
668         {N_("/_Tools/_Harvest addresses"),      NULL, NULL, 0, "<Branch>"},
669         {N_("/_Tools/_Harvest addresses/from _Folder..."),
670                                                 NULL, addr_harvest_cb, 0, NULL},
671         {N_("/_Tools/_Harvest addresses/from _Messages..."),
672                                                 NULL, addr_harvest_msg_cb, 0, NULL},
673         {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
674         {N_("/_Tools/_Filter all messages in folder"),
675                                                 NULL, filter_cb, 0, NULL},
676         {N_("/_Tools/Filter _selected messages"),
677                                                 NULL, filter_cb, 1, NULL},
678         {N_("/_Tools/_Create filter rule"),     NULL, NULL, 0, "<Branch>"},
679         {N_("/_Tools/_Create filter rule/_Automatically"),
680                                                 NULL, create_filter_cb, FILTER_BY_AUTO, NULL},
681         {N_("/_Tools/_Create filter rule/by _From"),
682                                                 NULL, create_filter_cb, FILTER_BY_FROM, NULL},
683         {N_("/_Tools/_Create filter rule/by _To"),
684                                                 NULL, create_filter_cb, FILTER_BY_TO, NULL},
685         {N_("/_Tools/_Create filter rule/by _Subject"),
686                                                 NULL, create_filter_cb, FILTER_BY_SUBJECT, NULL},
687         {N_("/_Tools/_Create processing rule"), NULL, NULL, 0, "<Branch>"},
688         {N_("/_Tools/_Create processing rule/_Automatically"),
689                                                 NULL, create_processing_cb, FILTER_BY_AUTO, NULL},
690         {N_("/_Tools/_Create processing rule/by _From"),
691                                                 NULL, create_processing_cb, FILTER_BY_FROM, NULL},
692         {N_("/_Tools/_Create processing rule/by _To"),
693                                                 NULL, create_processing_cb, FILTER_BY_TO, NULL},
694         {N_("/_Tools/_Create processing rule/by _Subject"),
695                                                 NULL, create_processing_cb, FILTER_BY_SUBJECT, NULL},
696         {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
697         {N_("/_Tools/Actio_ns"),                NULL, NULL, 0, "<Branch>"},
698         {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
699         {N_("/_Tools/_Check for new messages in all folders"),
700                                                 NULL, update_folderview_cb, 0, NULL},
701         {N_("/_Tools/Delete du_plicated messages"),
702                                                 NULL, NULL, 0, "<Branch>"},
703         {N_("/_Tools/Delete du_plicated messages/In selected folder"),
704                                                 NULL, delete_duplicated_cb,   0, NULL},
705         {N_("/_Tools/Delete du_plicated messages/In all folders"),
706                                                 NULL, delete_duplicated_all_cb,   0, NULL},
707         {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
708         {N_("/_Tools/E_xecute"),                "X", execute_summary_cb, 0, NULL},
709 #ifdef USE_OPENSSL
710         {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
711         {N_("/_Tools/SSL certi_ficates..."),    
712                                                 NULL, ssl_manager_open_cb, 0, NULL},
713 #endif
714         {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
715         {N_("/_Tools/_Log window"),             "<shift><control>L", log_window_show_cb, 0, NULL},
716
717         {N_("/_Configuration"),                 NULL, NULL, 0, "<Branch>"},
718         {N_("/_Configuration/C_hange current account"),
719                                                 NULL, NULL, 0, "<Branch>"},
720         {N_("/_Configuration/_Preferences for current account..."),
721                                                 NULL, prefs_account_open_cb, 0, NULL},
722         {N_("/_Configuration/Create _new account..."),
723                                                 NULL, new_account_cb, 0, NULL},
724         {N_("/_Configuration/_Edit accounts..."),
725                                                 NULL, account_edit_open, 0, NULL},
726         {N_("/_Configuration/---"),             NULL, NULL, 0, "<Separator>"},
727         {N_("/_Configuration/_Common preferences..."),
728                                                 NULL, prefs_common_open_cb, 0, NULL},
729         {N_("/_Configuration/Pre-processing..."),
730                                                 NULL, prefs_pre_processing_open_cb, 0, NULL},
731         {N_("/_Configuration/Post-processing..."),
732                                                 NULL, prefs_post_processing_open_cb, 0, NULL},
733         {N_("/_Configuration/_Filtering..."),
734                                                 NULL, prefs_filtering_open_cb, 0, NULL},
735         {N_("/_Configuration/_Templates..."),   NULL, prefs_template_open_cb, 0, NULL},
736         {N_("/_Configuration/_Actions..."),     NULL, prefs_actions_open_cb, 0, NULL},
737         {N_("/_Configuration/_Other Preferences..."),  NULL, prefs_open_cb, 0, NULL},
738         {N_("/_Configuration/Plugins..."),      NULL, plugins_open_cb, 0, NULL},
739
740         {N_("/_Help"),                          NULL, NULL, 0, "<Branch>"},
741         {N_("/_Help/_Manual (Local)"),          NULL, manual_open_cb, MANUAL_MANUAL_LOCAL, NULL},
742         {N_("/_Help/_Manual (Sylpheed Doc Homepage)"),
743                                                 NULL, manual_open_cb, MANUAL_MANUAL_SYLDOC, NULL},
744         {N_("/_Help/_FAQ (Local)"),             NULL, manual_open_cb, MANUAL_FAQ_LOCAL, NULL},
745         {N_("/_Help/_FAQ (Sylpheed Doc Homepage)"),
746                                                 NULL, manual_open_cb, MANUAL_FAQ_SYLDOC, NULL},
747         {N_("/_Help/_Claws FAQ (Claws Documentation)"),
748                                                 NULL, manual_open_cb, MANUAL_FAQ_CLAWS, NULL},
749         {N_("/_Help/---"),                      NULL, NULL, 0, "<Separator>"},
750         {N_("/_Help/_About"),                   NULL, about_show, 0, NULL}
751 };
752
753 MainWindow *main_window_create(SeparateType type)
754 {
755         MainWindow *mainwin;
756         GtkWidget *window;
757         GtkWidget *vbox;
758         GtkWidget *menubar;
759         GtkWidget *handlebox;
760         GtkWidget *vbox_body;
761         GtkWidget *hbox_stat;
762         GtkWidget *statusbar;
763         GtkWidget *progressbar;
764         GtkWidget *statuslabel;
765         GtkWidget *ac_button;
766         GtkWidget *ac_label;
767         GtkWidget *online_pixmap;
768         GtkWidget *offline_pixmap;
769         GtkWidget *online_switch;
770         GtkWidget *offline_switch;
771         GtkTooltips *offline_tip;
772         GtkTooltips *online_tip;
773         GtkTooltips *sel_ac_tip;
774
775         FolderView *folderview;
776         SummaryView *summaryview;
777         MessageView *messageview;
778         GdkColormap *colormap;
779         GdkColor color[4];
780         gboolean success[4];
781         GtkItemFactory *ifactory;
782         GtkWidget *ac_menu;
783         GtkWidget *menuitem;
784         gint i;
785         guint n_menu_entries;
786         gboolean hide_messageview = FALSE;
787
788         static GdkGeometry geometry;
789
790         debug_print("Creating main window...\n");
791         mainwin = g_new0(MainWindow, 1);
792
793         /* main window */
794         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
795         gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
796         gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
797         gtk_window_set_wmclass(GTK_WINDOW(window), "main_window", "Sylpheed");
798
799         if (!geometry.min_height) {
800                 geometry.min_width = 320;
801                 geometry.min_height = 200;
802         }
803         gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
804                                       GDK_HINT_MIN_SIZE);
805
806         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
807                            GTK_SIGNAL_FUNC(main_window_close_cb), mainwin);
808         MANAGE_WINDOW_SIGNALS_CONNECT(window);
809         gtk_signal_connect(GTK_OBJECT(window), "focus_in_event",
810                            GTK_SIGNAL_FUNC(mainwindow_focus_in_event),
811                            mainwin);
812         gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
813                                 GTK_SIGNAL_FUNC(mainwindow_key_pressed), mainwin);
814
815         gtk_widget_realize(window);
816         gtk_widget_add_events(window, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
817         
818
819         gtkut_widget_set_app_icon(window);
820
821         vbox = gtk_vbox_new(FALSE, 0);
822         gtk_widget_show(vbox);
823         gtk_container_add(GTK_CONTAINER(window), vbox);
824
825         /* menu bar */
826         n_menu_entries = sizeof(mainwin_entries) / sizeof(mainwin_entries[0]);
827         menubar = menubar_create(window, mainwin_entries, 
828                                  n_menu_entries, "<Main>", mainwin);
829         gtk_widget_show(menubar);
830         gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
831         ifactory = gtk_item_factory_from_widget(menubar);
832
833         menu_set_sensitive(ifactory, "/Help/Manual (Local)", manual_available(MANUAL_MANUAL_LOCAL));
834         menu_set_sensitive(ifactory, "/Help/FAQ (Local)", manual_available(MANUAL_FAQ_LOCAL));
835
836         handlebox = gtk_handle_box_new();
837         gtk_widget_show(handlebox);
838         gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
839         gtk_signal_connect(GTK_OBJECT(handlebox), "child_attached",
840                            GTK_SIGNAL_FUNC(toolbar_child_attached), mainwin);
841         gtk_signal_connect(GTK_OBJECT(handlebox), "child_detached",
842                            GTK_SIGNAL_FUNC(toolbar_child_detached), mainwin);
843
844         /* link window to mainwin->window to avoid gdk warnings */
845         mainwin->window       = window;
846         
847         /* create toolbar */
848         mainwin->toolbar = toolbar_create(TOOLBAR_MAIN, 
849                                           handlebox, 
850                                           (gpointer)mainwin);
851
852         /* vbox that contains body */
853         vbox_body = gtk_vbox_new(FALSE, BORDER_WIDTH);
854         gtk_widget_show(vbox_body);
855         gtk_container_set_border_width(GTK_CONTAINER(vbox_body), BORDER_WIDTH);
856         gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
857
858         hbox_stat = gtk_hbox_new(FALSE, 2);
859         gtk_box_pack_end(GTK_BOX(vbox_body), hbox_stat, FALSE, FALSE, 0);
860
861         statusbar = statusbar_create();
862         gtk_box_pack_start(GTK_BOX(hbox_stat), statusbar, TRUE, TRUE, 0);
863
864         progressbar = gtk_progress_bar_new();
865         gtk_widget_set_usize(progressbar, 120, 1);
866         gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
867
868         online_pixmap = stock_pixmap_widget(hbox_stat, STOCK_PIXMAP_ONLINE);
869         offline_pixmap = stock_pixmap_widget(hbox_stat, STOCK_PIXMAP_OFFLINE);
870         online_tip = gtk_tooltips_new();
871         online_switch = gtk_button_new ();
872         gtk_tooltips_set_tip(GTK_TOOLTIPS(online_tip),online_switch, 
873                              _("You are online. Click the icon to go offline"), NULL);
874         offline_tip = gtk_tooltips_new();
875         offline_switch = gtk_button_new ();
876         gtk_tooltips_set_tip(GTK_TOOLTIPS(offline_tip),offline_switch, 
877                              _("You are offline. Click the icon to go online"),
878                              NULL);
879         gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
880         gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
881         gtk_signal_connect (GTK_OBJECT(online_switch), "clicked", (GtkSignalFunc)online_switch_clicked, mainwin);
882         gtk_box_pack_start (GTK_BOX(hbox_stat), online_switch, FALSE, FALSE, 0);
883         gtk_container_add (GTK_CONTAINER(offline_switch), offline_pixmap);
884         gtk_button_set_relief (GTK_BUTTON(offline_switch), GTK_RELIEF_NONE);
885         gtk_signal_connect (GTK_OBJECT(offline_switch), "clicked", (GtkSignalFunc)online_switch_clicked, mainwin);
886         gtk_box_pack_start (GTK_BOX(hbox_stat), offline_switch, FALSE, FALSE, 0);
887         
888         statuslabel = gtk_label_new("");
889         gtk_box_pack_start(GTK_BOX(hbox_stat), statuslabel, FALSE, FALSE, 0);
890
891         sel_ac_tip = gtk_tooltips_new();
892         ac_button = gtk_button_new();
893         gtk_tooltips_set_tip(GTK_TOOLTIPS(sel_ac_tip),
894                              ac_button, _("Select account"), NULL);
895         gtk_button_set_relief(GTK_BUTTON(ac_button), GTK_RELIEF_NONE);
896         GTK_WIDGET_UNSET_FLAGS(ac_button, GTK_CAN_FOCUS);
897         gtk_widget_set_usize(ac_button, -1, 1);
898         gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
899         gtk_signal_connect(GTK_OBJECT(ac_button), "button_press_event",
900                            GTK_SIGNAL_FUNC(ac_label_button_pressed), mainwin);
901
902         ac_label = gtk_label_new("");
903         gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
904
905         gtk_widget_show_all(hbox_stat);
906
907         gtk_widget_hide(offline_switch);
908         /* create views */
909         mainwin->folderview  = folderview  = folderview_create();
910         mainwin->summaryview = summaryview = summary_create();
911         mainwin->messageview = messageview = messageview_create(mainwin);
912         mainwin->logwin      = log_window_create();
913
914         folderview->mainwin      = mainwin;
915         folderview->summaryview  = summaryview;
916
917         summaryview->mainwin     = mainwin;
918         summaryview->folderview  = folderview;
919         summaryview->messageview = messageview;
920         summaryview->window      = window;
921
922         messageview->statusbar   = statusbar;
923         mainwin->vbox           = vbox;
924         mainwin->menubar        = menubar;
925         mainwin->menu_factory   = ifactory;
926         mainwin->handlebox      = handlebox;
927         mainwin->vbox_body      = vbox_body;
928         mainwin->hbox_stat      = hbox_stat;
929         mainwin->statusbar      = statusbar;
930         mainwin->progressbar    = progressbar;
931         mainwin->statuslabel    = statuslabel;
932         mainwin->online_switch  = online_switch;
933         mainwin->online_pixmap  = online_pixmap;
934         mainwin->offline_pixmap = offline_pixmap;
935         mainwin->ac_button      = ac_button;
936         mainwin->ac_label       = ac_label;
937         mainwin->offline_switch    = offline_switch;
938         
939         /* set context IDs for status bar */
940         mainwin->mainwin_cid = gtk_statusbar_get_context_id
941                 (GTK_STATUSBAR(statusbar), "Main Window");
942         mainwin->folderview_cid = gtk_statusbar_get_context_id
943                 (GTK_STATUSBAR(statusbar), "Folder View");
944         mainwin->summaryview_cid = gtk_statusbar_get_context_id
945                 (GTK_STATUSBAR(statusbar), "Summary View");
946         mainwin->messageview_cid = gtk_statusbar_get_context_id
947                 (GTK_STATUSBAR(statusbar), "Message View");
948
949         messageview->statusbar_cid = mainwin->messageview_cid;
950
951         /* allocate colors for summary view and folder view */
952         summaryview->color_marked.red = summaryview->color_marked.green = 0;
953         summaryview->color_marked.blue = (guint16)65535;
954
955         summaryview->color_dim.red = summaryview->color_dim.green =
956                 summaryview->color_dim.blue = COLOR_DIM;
957
958         gtkut_convert_int_to_gdk_color(prefs_common.color_new,
959                                        &folderview->color_new);
960
961         gtkut_convert_int_to_gdk_color(prefs_common.tgt_folder_col,
962                                        &folderview->color_op);
963
964         summaryview->color_important.red = 0;
965         summaryview->color_important.green = 0;
966         summaryview->color_important.blue = (guint16)65535;
967
968         color[0] = summaryview->color_marked;
969         color[1] = summaryview->color_dim;
970         color[2] = folderview->color_new;
971         color[3] = folderview->color_op;
972
973         colormap = gdk_window_get_colormap(window->window);
974         gdk_colormap_alloc_colors(colormap, color, 4, FALSE, TRUE, success);
975         for (i = 0; i < 4; i++) {
976                 if (success[i] == FALSE)
977                         g_warning("MainWindow: color allocation %d failed\n", i);
978         }
979
980         debug_print("done.\n");
981
982         messageview->visible = prefs_common.msgview_visible;
983         hide_messageview = !messageview->visible;
984         
985         main_window_set_widgets(mainwin, type);
986
987         gtk_signal_connect(GTK_OBJECT(window), "size_allocate",
988                            GTK_SIGNAL_FUNC(main_window_size_allocate_cb),
989                            mainwin);
990
991         /* set menu items */
992         menuitem = gtk_item_factory_get_item
993                 (ifactory, "/View/Code set/Auto detect");
994         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
995
996         switch (prefs_common.toolbar_style) {
997         case TOOLBAR_NONE:
998                 menuitem = gtk_item_factory_get_item
999                         (ifactory, "/View/Show or hide/Toolbar/None");
1000                 break;
1001         case TOOLBAR_ICON:
1002                 menuitem = gtk_item_factory_get_item
1003                         (ifactory, "/View/Show or hide/Toolbar/Icon");
1004                 break;
1005         case TOOLBAR_TEXT:
1006                 menuitem = gtk_item_factory_get_item
1007                         (ifactory, "/View/Show or hide/Toolbar/Text");
1008                 break;
1009         case TOOLBAR_BOTH:
1010                 menuitem = gtk_item_factory_get_item
1011                         (ifactory, "/View/Show or hide/Toolbar/Icon and text");
1012         }
1013         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
1014
1015         gtk_widget_hide(mainwin->hbox_stat);
1016         menuitem = gtk_item_factory_get_item
1017                 (ifactory, "/View/Show or hide/Status bar");
1018         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
1019                                        prefs_common.show_statusbar);
1020         
1021         /* set account selection menu */
1022         ac_menu = gtk_item_factory_get_widget
1023                 (ifactory, "/Configuration/Change current account");
1024         gtk_signal_connect(GTK_OBJECT(ac_menu), "selection_done",
1025                            GTK_SIGNAL_FUNC(ac_menu_popup_closed), mainwin);
1026         mainwin->ac_menu = ac_menu;
1027
1028         toolbar_main_set_sensitive(mainwin);
1029
1030         /* create actions menu */
1031         main_window_update_actions_menu(mainwin);
1032
1033         /* attach accel groups to main window */
1034 #define ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win)        \
1035         gtk_window_add_accel_group                      \
1036                 (GTK_WINDOW(win),                       \
1037                  gtk_item_factory_from_widget(menu)->accel_group)                
1038         
1039         ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
1040         
1041         /* connect the accelerators for equivalent 
1042            menu items in different menus             */
1043         menu_connect_identical_items();
1044
1045
1046         
1047         /* show main window */
1048         gtk_widget_show(mainwin->window);
1049
1050         /* initialize views */
1051         folderview_init(folderview);
1052         summary_init(summaryview);
1053         messageview_init(messageview);
1054         log_window_init(mainwin->logwin);
1055         log_window_set_clipping(mainwin->logwin, prefs_common.cliplog,
1056                                 prefs_common.loglength);
1057 #ifdef USE_OPENSSL
1058         sslcertwindow_register_hook();
1059 #endif
1060         mainwin->lock_count = 0;
1061         mainwin->menu_lock_count = 0;
1062         mainwin->cursor_count = 0;
1063
1064         mainwin->progressindicator_hook =
1065                 hooks_register_hook(PROGRESSINDICATOR_HOOKLIST, mainwindow_progressindicator_hook, mainwin);
1066
1067         if (!watch_cursor)
1068                 watch_cursor = gdk_cursor_new(GDK_WATCH);
1069
1070         mainwin_list = g_list_append(mainwin_list, mainwin);
1071
1072         /* init work_offline */
1073         if (prefs_common.work_offline)
1074                 online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
1075
1076         if (mainwin->type == SEPARATE_NONE && hide_messageview)
1077                 main_window_toggle_message_view(mainwin);
1078
1079         return mainwin;
1080 }
1081
1082 void main_window_destroy(MainWindow *mainwin)
1083 {
1084         /* TODO : destroy other component */
1085         messageview_destroy(mainwin->messageview);
1086 }
1087
1088 void main_window_update_actions_menu(MainWindow *mainwin)
1089 {
1090         GtkItemFactory *ifactory;
1091
1092         ifactory = gtk_item_factory_from_widget(mainwin->menubar);
1093         action_update_mainwin_menu(ifactory, "/Tools/Actions", mainwin);
1094 }
1095
1096 void main_window_cursor_wait(MainWindow *mainwin)
1097 {
1098
1099         if (mainwin->cursor_count == 0)
1100                 gdk_window_set_cursor(mainwin->window->window, watch_cursor);
1101
1102         mainwin->cursor_count++;
1103
1104         gdk_flush();
1105 }
1106
1107 void main_window_cursor_normal(MainWindow *mainwin)
1108 {
1109         if (mainwin->cursor_count)
1110                 mainwin->cursor_count--;
1111
1112         if (mainwin->cursor_count == 0)
1113                 gdk_window_set_cursor(mainwin->window->window, NULL);
1114
1115         gdk_flush();
1116 }
1117
1118 /* lock / unlock the user-interface */
1119 void main_window_lock(MainWindow *mainwin)
1120 {
1121         if (mainwin->lock_count == 0)
1122                 gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
1123
1124         mainwin->lock_count++;
1125
1126         main_window_set_menu_sensitive(mainwin);
1127         toolbar_main_set_sensitive(mainwin);
1128 }
1129
1130 void main_window_unlock(MainWindow *mainwin)
1131 {
1132         if (mainwin->lock_count)
1133                 mainwin->lock_count--;
1134
1135         main_window_set_menu_sensitive(mainwin);
1136         toolbar_main_set_sensitive(mainwin);
1137
1138         if (mainwin->lock_count == 0)
1139                 gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
1140 }
1141
1142 static void main_window_menu_callback_block(MainWindow *mainwin)
1143 {
1144         mainwin->menu_lock_count++;
1145 }
1146
1147 static void main_window_menu_callback_unblock(MainWindow *mainwin)
1148 {
1149         if (mainwin->menu_lock_count)
1150                 mainwin->menu_lock_count--;
1151 }
1152
1153 void main_window_reflect_prefs_all(void)
1154 {
1155         main_window_reflect_prefs_all_real(FALSE);
1156 }
1157
1158 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
1159 {
1160         GList *cur;
1161         MainWindow *mainwin;
1162         GtkWidget *pixmap;
1163
1164         for (cur = mainwin_list; cur != NULL; cur = cur->next) {
1165                 mainwin = (MainWindow *)cur->data;
1166
1167                 main_window_show_cur_account(mainwin);
1168                 main_window_set_menu_sensitive(mainwin);
1169                 toolbar_main_set_sensitive(mainwin);
1170
1171                 /* pixmap themes */
1172                 if (pixmap_theme_changed) {
1173                         toolbar_update(TOOLBAR_MAIN, mainwin);
1174                         messageview_reflect_prefs_pixmap_theme();
1175                         compose_reflect_prefs_pixmap_theme();
1176                         folderview_reflect_prefs_pixmap_theme(mainwin->folderview);
1177                         summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
1178
1179                         pixmap = stock_pixmap_widget(mainwin->hbox_stat, STOCK_PIXMAP_ONLINE);
1180                         gtk_container_remove(GTK_CONTAINER(mainwin->online_switch), 
1181                                              mainwin->online_pixmap);
1182                         gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
1183                         gtk_widget_show(pixmap);
1184                         mainwin->online_pixmap = pixmap;
1185                         pixmap = stock_pixmap_widget(mainwin->hbox_stat, STOCK_PIXMAP_OFFLINE);
1186                         gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch), 
1187                                              mainwin->offline_pixmap);
1188                         gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
1189                         gtk_widget_show(pixmap);
1190                         mainwin->offline_pixmap = pixmap;
1191                 }
1192                 
1193                 summary_redisplay_msg(mainwin->summaryview);
1194                 headerview_set_visibility(mainwin->messageview->headerview,
1195                                           prefs_common.display_header_pane);
1196         }
1197 }
1198
1199 void main_window_set_summary_column(void)
1200 {
1201         GList *cur;
1202         MainWindow *mainwin;
1203
1204         for (cur = mainwin_list; cur != NULL; cur = cur->next) {
1205                 mainwin = (MainWindow *)cur->data;
1206                 summary_set_column_order(mainwin->summaryview);
1207         }
1208 }
1209
1210 static void main_window_set_account_selector_menu(MainWindow *mainwin,
1211                                                   GList *account_list)
1212 {
1213         GList *cur_ac, *cur_item;
1214         GtkWidget *menuitem;
1215         PrefsAccount *ac_prefs;
1216
1217         /* destroy all previous menu item */
1218         cur_item = GTK_MENU_SHELL(mainwin->ac_menu)->children;
1219         while (cur_item != NULL) {
1220                 GList *next = cur_item->next;
1221                 gtk_widget_destroy(GTK_WIDGET(cur_item->data));
1222                 cur_item = next;
1223         }
1224
1225         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
1226                 ac_prefs = (PrefsAccount *)cur_ac->data;
1227
1228                 menuitem = gtk_menu_item_new_with_label
1229                         (ac_prefs->account_name
1230                          ? ac_prefs->account_name : _("Untitled"));
1231                 gtk_widget_show(menuitem);
1232                 gtk_menu_append(GTK_MENU(mainwin->ac_menu), menuitem);
1233                 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
1234                                    GTK_SIGNAL_FUNC(account_selector_menu_cb),
1235                                    ac_prefs);
1236         }
1237 }
1238
1239 static void main_window_set_account_receive_menu(MainWindow *mainwin,
1240                                                  GList *account_list)
1241 {
1242         GList *cur_ac, *cur_item;
1243         GtkWidget *menu;
1244         GtkWidget *menuitem;
1245         PrefsAccount *ac_prefs;
1246
1247         menu = gtk_item_factory_get_widget(mainwin->menu_factory,
1248                                            "/Message/Receive");
1249
1250         /* search for separator */
1251         for (cur_item = GTK_MENU_SHELL(menu)->children; cur_item != NULL;
1252              cur_item = cur_item->next) {
1253                 if (GTK_BIN(cur_item->data)->child == NULL) {
1254                         cur_item = cur_item->next;
1255                         break;
1256                 }
1257         }
1258
1259         /* destroy all previous menu item */
1260         while (cur_item != NULL) {
1261                 GList *next = cur_item->next;
1262                 gtk_widget_destroy(GTK_WIDGET(cur_item->data));
1263                 cur_item = next;
1264         }
1265
1266         for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
1267                 ac_prefs = (PrefsAccount *)cur_ac->data;
1268
1269                 menuitem = gtk_menu_item_new_with_label
1270                         (ac_prefs->account_name ? ac_prefs->account_name
1271                          : _("Untitled"));
1272                 gtk_widget_show(menuitem);
1273                 gtk_menu_append(GTK_MENU(menu), menuitem);
1274                 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
1275                                    GTK_SIGNAL_FUNC(account_receive_menu_cb),
1276                                    ac_prefs);
1277         }
1278 }
1279
1280 void main_window_set_account_menu(GList *account_list)
1281 {
1282         GList *cur;
1283         MainWindow *mainwin;
1284
1285         for (cur = mainwin_list; cur != NULL; cur = cur->next) {
1286                 mainwin = (MainWindow *)cur->data;
1287                 main_window_set_account_selector_menu(mainwin, account_list);
1288                 main_window_set_account_receive_menu(mainwin, account_list);
1289         }
1290 }
1291
1292 static void main_window_show_cur_account(MainWindow *mainwin)
1293 {
1294         gchar *buf;
1295         gchar *ac_name;
1296
1297         ac_name = g_strdup(cur_account
1298                            ? (cur_account->account_name
1299                               ? cur_account->account_name : _("Untitled"))
1300                            : _("none"));
1301
1302         if (cur_account)
1303                 buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
1304         else
1305                 buf = g_strdup(PROG_VERSION);
1306         gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
1307         g_free(buf);
1308
1309         gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
1310         gtk_widget_queue_resize(mainwin->ac_button);
1311
1312         g_free(ac_name);
1313 }
1314
1315 GtkWidget *main_window_get_folder_window(MainWindow *mainwin)
1316 {
1317         switch (mainwin->type) {
1318         case SEPARATE_FOLDER:
1319                 return mainwin->win.sep_folder.folderwin;
1320         case SEPARATE_BOTH:
1321                 return mainwin->win.sep_both.folderwin;
1322         default:
1323                 return NULL;
1324         }
1325 }
1326
1327 GtkWidget *main_window_get_message_window(MainWindow *mainwin)
1328 {
1329         switch (mainwin->type) {
1330         case SEPARATE_MESSAGE:
1331                 return mainwin->win.sep_message.messagewin;
1332         case SEPARATE_BOTH:
1333                 return mainwin->win.sep_both.messagewin;
1334         default:
1335                 return NULL;
1336         }
1337 }
1338
1339 void main_window_separation_change(MainWindow *mainwin, SeparateType type)
1340 {
1341         GtkWidget *folder_wid  = GTK_WIDGET_PTR(mainwin->folderview);
1342         GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
1343         /* GtkWidget *message_wid = GTK_WIDGET_PTR(mainwin->messageview); */
1344         GtkWidget *message_wid = mainwin->messageview->vbox;
1345
1346         debug_print("Changing window separation type from %d to %d\n",
1347                     mainwin->type, type);
1348
1349         if (mainwin->type == type) return;
1350
1351         /* remove widgets from those containers */
1352         gtk_widget_ref(folder_wid);
1353         gtk_widget_ref(summary_wid);
1354         gtk_widget_ref(message_wid);
1355         gtkut_container_remove
1356                 (GTK_CONTAINER(folder_wid->parent), folder_wid);
1357         gtkut_container_remove
1358                 (GTK_CONTAINER(summary_wid->parent), summary_wid);
1359         gtkut_container_remove
1360                 (GTK_CONTAINER(message_wid->parent), message_wid);
1361
1362         /* clean containers */
1363         switch (mainwin->type) {
1364         case SEPARATE_NONE:
1365                 gtk_widget_destroy(mainwin->win.sep_none.hpaned);
1366                 break;
1367         case SEPARATE_FOLDER:
1368                 gtk_widget_destroy(mainwin->win.sep_folder.vpaned);
1369                 gtk_widget_destroy(mainwin->win.sep_folder.folderwin);
1370                 break;
1371         case SEPARATE_MESSAGE:
1372                 gtk_widget_destroy(mainwin->win.sep_message.hpaned);
1373                 gtk_widget_destroy(mainwin->win.sep_message.messagewin);
1374                 break;
1375         case SEPARATE_BOTH:
1376                 gtk_widget_destroy(mainwin->win.sep_both.messagewin);
1377                 gtk_widget_destroy(mainwin->win.sep_both.folderwin);
1378                 break;
1379         }
1380
1381         gtk_widget_hide(mainwin->window);
1382         main_window_set_widgets(mainwin, type);
1383         gtk_widget_show(mainwin->window);
1384
1385         gtk_widget_unref(folder_wid);
1386         gtk_widget_unref(summary_wid);
1387         gtk_widget_unref(message_wid);
1388 }
1389
1390 void main_window_toggle_message_view(MainWindow *mainwin)
1391 {
1392         SummaryView *summaryview = mainwin->summaryview;
1393         union CompositeWin *cwin = &mainwin->win;
1394         GtkWidget *vpaned = NULL;
1395         GtkWidget *container = NULL;
1396         GtkWidget *msgwin = NULL;
1397
1398         switch (mainwin->type) {
1399         case SEPARATE_NONE:
1400                 vpaned = cwin->sep_none.vpaned;
1401                 container = cwin->sep_none.hpaned;
1402                 break;
1403         case SEPARATE_FOLDER:
1404                 vpaned = cwin->sep_folder.vpaned;
1405                 container = mainwin->vbox_body;
1406                 break;
1407         case SEPARATE_MESSAGE:
1408                 msgwin = mainwin->win.sep_message.messagewin;
1409                 break;
1410         case SEPARATE_BOTH:
1411                 msgwin = mainwin->win.sep_both.messagewin;
1412                 break;
1413         }
1414
1415         if (msgwin) {
1416                 if (GTK_WIDGET_VISIBLE(msgwin)) {
1417                         gtk_widget_hide(msgwin);
1418                         mainwin->messageview->visible = FALSE;
1419                         summaryview->displayed = NULL;
1420                 } else {
1421                         gtk_widget_show(msgwin);
1422                         mainwin->messageview->visible = TRUE;
1423                 }
1424         } else if (vpaned->parent != NULL) {
1425                 mainwin->messageview->visible = FALSE;
1426                 summaryview->displayed = NULL;
1427                 gtk_widget_ref(vpaned);
1428                 gtkut_container_remove(GTK_CONTAINER(container), vpaned);
1429                 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
1430                 gtk_arrow_set(GTK_ARROW(summaryview->toggle_arrow),
1431                               GTK_ARROW_UP, GTK_SHADOW_OUT);
1432         } else {
1433                 mainwin->messageview->visible = TRUE;
1434                 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), vpaned);
1435                 gtk_container_add(GTK_CONTAINER(container), vpaned);
1436                 gtk_widget_unref(vpaned);
1437                 gtk_arrow_set(GTK_ARROW(summaryview->toggle_arrow),
1438                               GTK_ARROW_DOWN, GTK_SHADOW_OUT);
1439         }
1440
1441         if (mainwin->messageview->visible == FALSE)
1442                 messageview_clear(mainwin->messageview);
1443
1444         main_window_set_menu_sensitive(mainwin);
1445
1446         prefs_common.msgview_visible = mainwin->messageview->visible;
1447
1448         gtk_widget_grab_focus(summaryview->ctree);
1449 }
1450
1451 void main_window_get_size(MainWindow *mainwin)
1452 {
1453         GtkAllocation *allocation;
1454
1455         allocation = &(GTK_WIDGET_PTR(mainwin->summaryview)->allocation);
1456
1457         if (allocation->width > 1 && allocation->height > 1) {
1458                 prefs_common.summaryview_width = allocation->width;
1459
1460                 if ((mainwin->type == SEPARATE_NONE ||
1461                      mainwin->type == SEPARATE_FOLDER) &&
1462                     messageview_is_visible(mainwin->messageview))
1463                         prefs_common.summaryview_height = allocation->height;
1464
1465                 prefs_common.mainview_width = allocation->width;
1466         }
1467
1468         allocation = &mainwin->window->allocation;
1469         if (allocation->width > 1 && allocation->height > 1) {
1470                 prefs_common.mainview_height = allocation->height;
1471                 prefs_common.mainwin_width   = allocation->width;
1472                 prefs_common.mainwin_height  = allocation->height;
1473         }
1474
1475         allocation = &(GTK_WIDGET_PTR(mainwin->folderview)->allocation);
1476         if (allocation->width > 1 && allocation->height > 1) {
1477                 prefs_common.folderview_width  = allocation->width;
1478                 prefs_common.folderview_height = allocation->height;
1479         }
1480
1481         allocation = &(GTK_WIDGET_PTR(mainwin->messageview)->allocation);
1482         if (allocation->width > 1 && allocation->height > 1) {
1483                 prefs_common.msgview_width = allocation->width;
1484                 prefs_common.msgview_height = allocation->height;
1485         }
1486
1487         debug_print("summaryview size: %d x %d\n",
1488                     prefs_common.summaryview_width,
1489                     prefs_common.summaryview_height);
1490         debug_print("folderview size: %d x %d\n",
1491                     prefs_common.folderview_width,
1492                     prefs_common.folderview_height);
1493         debug_print("messageview size: %d x %d\n",
1494                     prefs_common.msgview_width,
1495                     prefs_common.msgview_height);
1496 }
1497
1498 void main_window_get_position(MainWindow *mainwin)
1499 {
1500         gint x, y;
1501         GtkWidget *window;
1502
1503         gtkut_widget_get_uposition(mainwin->window, &x, &y);
1504
1505         prefs_common.mainview_x = x;
1506         prefs_common.mainview_y = y;
1507         prefs_common.mainwin_x = x;
1508         prefs_common.mainwin_y = y;
1509
1510         debug_print("main window position: %d, %d\n", x, y);
1511
1512         window = main_window_get_folder_window(mainwin);
1513         if (window) {
1514                 gtkut_widget_get_uposition(window, &x, &y);
1515                 prefs_common.folderwin_x = x;
1516                 prefs_common.folderwin_y = y;
1517                 debug_print("folder window position: %d, %d\n", x, y);
1518         }
1519         window = main_window_get_message_window(mainwin);
1520         if (window) {
1521                 gtkut_widget_get_uposition(window, &x, &y);
1522                 prefs_common.main_msgwin_x = x;
1523                 prefs_common.main_msgwin_y = y;
1524                 debug_print("message window position: %d, %d\n", x, y);
1525         }
1526 }
1527
1528 void main_window_progress_on(MainWindow *mainwin)
1529 {
1530         gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar), TRUE);
1531         gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), "");
1532 }
1533
1534 void main_window_progress_off(MainWindow *mainwin)
1535 {
1536         gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar), FALSE);
1537         gtk_progress_bar_update(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
1538         gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), "");
1539 }
1540
1541 void main_window_progress_set(MainWindow *mainwin, gint cur, gint total)
1542 {
1543         gchar buf[32];
1544
1545         g_snprintf(buf, sizeof(buf), "%d / %d", cur, total);
1546         gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), buf);
1547         gtk_progress_bar_update(GTK_PROGRESS_BAR(mainwin->progressbar),
1548                                 (cur == 0 && total == 0) ? 0 :
1549                                 (gfloat)cur / (gfloat)total);
1550 }
1551
1552 void main_window_empty_trash(MainWindow *mainwin, gboolean confirm)
1553 {
1554         GList *list;
1555         guint has_trash;
1556         Folder *folder;
1557
1558         for (has_trash = 0, list = folder_get_list(); list != NULL; list = list->next) {
1559                 folder = FOLDER(list->data);
1560                 if (folder && folder->trash && folder->trash->total_msgs > 0)
1561                         has_trash++;
1562         }
1563
1564         if (!has_trash) return;
1565         
1566         if (confirm) {
1567                 if (alertpanel(_("Empty trash"),
1568                                _("Empty all messages in trash?"),
1569                                _("Yes"), _("No"), NULL) != G_ALERTDEFAULT)
1570                         return;
1571                 manage_window_focus_in(mainwin->window, NULL, NULL);
1572         }
1573
1574         procmsg_empty_trash();
1575
1576         if (mainwin->summaryview->folder_item &&
1577             mainwin->summaryview->folder_item->stype == F_TRASH)
1578                 gtk_widget_grab_focus(mainwin->folderview->ctree);
1579 }
1580
1581 void main_window_add_mailbox(MainWindow *mainwin)
1582 {
1583         gchar *path;
1584         Folder *folder;
1585
1586         path = input_dialog(_("Add mailbox"),
1587                             _("Input the location of mailbox.\n"
1588                               "If the existing mailbox is specified, it will be\n"
1589                               "scanned automatically."),
1590                             "Mail");
1591         if (!path) return;
1592         if (folder_find_from_path(path)) {
1593                 alertpanel_error(_("The mailbox `%s' already exists."), path);
1594                 g_free(path);
1595                 return;
1596         }
1597         folder = folder_new(folder_get_class_from_string("mh"), 
1598                             !strcmp(path, "Mail") ? _("Mailbox") : g_basename(path),
1599                             path);
1600         g_free(path);
1601
1602         if (folder->klass->create_tree(folder) < 0) {
1603                 alertpanel_error(_("Creation of the mailbox failed.\n"
1604                                    "Maybe some files already exist, or you don't have the permission to write there."));
1605                 folder_destroy(folder);
1606                 return;
1607         }
1608
1609         folder_add(folder);
1610         folder_set_ui_func(folder, scan_tree_func, mainwin);
1611         folder_scan_tree(folder);
1612         folder_set_ui_func(folder, NULL, NULL);
1613 }
1614
1615 SensitiveCond main_window_get_current_state(MainWindow *mainwin)
1616 {
1617         SensitiveCond state = 0;
1618         SummarySelection selection;
1619         FolderItem *item = mainwin->summaryview->folder_item;
1620         GList *account_list = account_get_list();
1621         
1622         selection = summary_get_selection_type(mainwin->summaryview);
1623
1624         if (mainwin->lock_count == 0)
1625                 state |= M_UNLOCKED;
1626         if (selection != SUMMARY_NONE)
1627                 state |= M_MSG_EXIST;
1628         if (item && item->path && folder_item_parent(item) && !item->no_select) {
1629                 state |= M_EXEC;
1630                 /*              if (item->folder->type != F_NEWS) */
1631                 state |= M_ALLOW_DELETE;
1632
1633                 if (prefs_common.immediate_exec == 0
1634                     && mainwin->lock_count == 0)
1635                         state |= M_DELAY_EXEC;
1636
1637                 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
1638                     || selection != SUMMARY_NONE)
1639                         state |= M_HIDE_READ_MSG;       
1640         }               
1641         if (mainwin->summaryview->threaded)
1642                 state |= M_THREADED;
1643         else
1644                 state |= M_UNTHREADED;  
1645         if (selection == SUMMARY_SELECTED_SINGLE ||
1646             selection == SUMMARY_SELECTED_MULTIPLE)
1647                 state |= M_TARGET_EXIST;
1648         if (selection == SUMMARY_SELECTED_SINGLE)
1649                 state |= M_SINGLE_TARGET_EXIST;
1650         if (mainwin->summaryview->folder_item &&
1651             mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
1652                 state |= M_NEWS;
1653         else
1654                 state |= M_NOT_NEWS;
1655         if (selection == SUMMARY_SELECTED_SINGLE &&
1656             (item &&
1657              (item->stype == F_OUTBOX || item->stype == F_DRAFT ||
1658               item->stype == F_QUEUE)))
1659                 state |= M_ALLOW_REEDIT;
1660         if (cur_account)
1661                 state |= M_HAVE_ACCOUNT;
1662         
1663         for ( ; account_list != NULL; account_list = account_list->next) {
1664                 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
1665                         state |= M_HAVE_NEWS_ACCOUNT;
1666                         break;
1667                 }
1668         }
1669
1670         if (inc_is_active())
1671                 state |= M_INC_ACTIVE;
1672
1673         return state;
1674 }
1675
1676
1677
1678 void main_window_set_menu_sensitive(MainWindow *mainwin)
1679 {
1680         GtkItemFactory *ifactory = mainwin->menu_factory;
1681         SensitiveCond state;
1682         gboolean sensitive;
1683         GtkWidget *menu;
1684         GtkWidget *menuitem;
1685         SummaryView *summaryview;
1686         gchar *menu_path;
1687         gint i;
1688         GList *cur_item;
1689
1690         static const struct {
1691                 gchar *const entry;
1692                 SensitiveCond cond;
1693         } entry[] = {
1694                 {"/File/Add mailbox"                          , M_UNLOCKED},
1695
1696                 {"/File/Add mailbox/MH..."                    , M_UNLOCKED},
1697                 {"/File/Change folder order"                  , M_UNLOCKED},
1698                 {"/File/Export to mbox file..."               , M_UNLOCKED},
1699                 {"/File/Empty trash"                          , M_UNLOCKED},
1700                 {"/File/Work offline"                         , M_UNLOCKED},
1701
1702                 {"/File/Save as...", M_TARGET_EXIST|M_UNLOCKED},
1703                 {"/File/Print..."  , M_TARGET_EXIST|M_UNLOCKED},
1704                 /* {"/File/Close"  , M_UNLOCKED}, */
1705                 {"/File/Exit"      , M_UNLOCKED},
1706
1707                 {"/Edit/Select thread"             , M_SINGLE_TARGET_EXIST},
1708
1709                 {"/View/Sort"                      , M_EXEC},
1710                 {"/View/Thread view"               , M_EXEC},
1711                 {"/View/Expand all threads"        , M_MSG_EXIST},
1712                 {"/View/Collapse all threads"      , M_MSG_EXIST},
1713                 {"/View/Hide read messages"        , M_HIDE_READ_MSG},
1714                 {"/View/Go to/Prev message"        , M_MSG_EXIST},
1715                 {"/View/Go to/Next message"        , M_MSG_EXIST},
1716                 {"/View/Go to/Prev unread message" , M_MSG_EXIST},
1717                 {"/View/Go to/Prev new message"    , M_MSG_EXIST},
1718                 {"/View/Go to/Prev marked message" , M_MSG_EXIST},
1719                 {"/View/Go to/Next marked message" , M_MSG_EXIST},
1720                 {"/View/Go to/Prev labeled message", M_MSG_EXIST},
1721                 {"/View/Go to/Next labeled message", M_MSG_EXIST},
1722                 {"/View/Open in new window"        , M_SINGLE_TARGET_EXIST},
1723                 {"/View/Show all headers"          , M_SINGLE_TARGET_EXIST},
1724                 {"/View/Message source"            , M_SINGLE_TARGET_EXIST},
1725
1726                 {"/Message/Receive/Get from current account"
1727                                                  , M_HAVE_ACCOUNT|M_UNLOCKED},
1728                 {"/Message/Receive/Get from all accounts"
1729                                                  , M_HAVE_ACCOUNT|M_UNLOCKED},
1730                 {"/Message/Receive/Cancel receiving"
1731                                                  , M_INC_ACTIVE},
1732
1733                 {"/Message/Compose a news message", M_HAVE_NEWS_ACCOUNT},
1734                 {"/Message/Reply"                 , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
1735                 {"/Message/Reply to"             , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
1736                 {"/Message/Follow-up and reply to", M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST|M_NEWS},
1737                 {"/Message/Forward"               , M_HAVE_ACCOUNT|M_TARGET_EXIST},
1738                 {"/Message/Redirect"              , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
1739                 {"/Message/Move..."               , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
1740                 {"/Message/Copy..."               , M_TARGET_EXIST|M_EXEC|M_UNLOCKED},
1741                 {"/Message/Delete"                , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NOT_NEWS},
1742                 {"/Message/Cancel a news message" , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NEWS},
1743                 {"/Message/Mark"                  , M_TARGET_EXIST},
1744                 {"/Message/Re-edit"              , M_HAVE_ACCOUNT|M_ALLOW_REEDIT},
1745
1746                 {"/Tools/Add sender to address book"   , M_SINGLE_TARGET_EXIST},
1747                 {"/Tools/Harvest addresses"            , M_UNLOCKED},
1748                 {"/Tools/Filter all messages in folder", M_MSG_EXIST|M_EXEC|M_UNLOCKED},
1749                 {"/Tools/Filter selected messages"     , M_TARGET_EXIST|M_EXEC|M_UNLOCKED},
1750                 {"/Tools/Create filter rule"           , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
1751                 {"/Tools/Actions"                      , M_TARGET_EXIST|M_UNLOCKED},
1752                 {"/Tools/Execute"                      , M_DELAY_EXEC},
1753                 {"/Tools/Delete duplicated messages/In selected folder"   , M_MSG_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
1754
1755                 {"/Configuration", M_UNLOCKED},
1756
1757                 {NULL, 0}
1758         };
1759
1760         state = main_window_get_current_state(mainwin);
1761
1762         for (i = 0; entry[i].entry != NULL; i++) {
1763                 sensitive = ((entry[i].cond & state) == entry[i].cond);
1764                 menu_set_sensitive(ifactory, entry[i].entry, sensitive);
1765         }
1766
1767         menu = gtk_item_factory_get_widget(ifactory, "/Message/Receive");
1768
1769         /* search for separator */
1770         for (cur_item = GTK_MENU_SHELL(menu)->children; cur_item != NULL;
1771              cur_item = cur_item->next) {
1772                 if (GTK_BIN(cur_item->data)->child == NULL) {
1773                         cur_item = cur_item->next;
1774                         break;
1775                 }
1776         }
1777
1778         for (; cur_item != NULL; cur_item = cur_item->next) {
1779                 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
1780                                          (M_UNLOCKED & state) != 0);
1781         }
1782
1783         main_window_menu_callback_block(mainwin);
1784
1785 #define SET_CHECK_MENU_ACTIVE(path, active) \
1786 { \
1787         menuitem = gtk_item_factory_get_widget(ifactory, path); \
1788         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), active); \
1789 }
1790
1791         SET_CHECK_MENU_ACTIVE("/View/Show or hide/Message view",
1792                               messageview_is_visible(mainwin->messageview));
1793
1794         summaryview = mainwin->summaryview;
1795         menu_path = "/View/Sort/Don't sort";
1796
1797         switch (summaryview->sort_key) {
1798         case SORT_BY_NUMBER:
1799                 menu_path = "/View/Sort/by number"; break;
1800         case SORT_BY_SIZE:
1801                 menu_path = "/View/Sort/by size"; break;
1802         case SORT_BY_DATE:
1803                 menu_path = "/View/Sort/by date"; break;
1804         case SORT_BY_FROM:
1805                 menu_path = "/View/Sort/by from"; break;
1806         case SORT_BY_TO:
1807                 menu_path = "/View/Sort/by recipient"; break;
1808         case SORT_BY_SUBJECT:
1809                 menu_path = "/View/Sort/by subject"; break;
1810         case SORT_BY_LABEL:
1811                 menu_path = "/View/Sort/by color label"; break;
1812         case SORT_BY_MARK:
1813                 menu_path = "/View/Sort/by mark"; break;
1814         case SORT_BY_STATUS:
1815                 menu_path = "/View/Sort/by status"; break;
1816         case SORT_BY_MIME:
1817                 menu_path = "/View/Sort/by attachment"; break;
1818         case SORT_BY_SCORE:
1819                 menu_path = "/View/Sort/by score"; break;
1820         case SORT_BY_LOCKED:
1821                 menu_path = "/View/Sort/by locked"; break;
1822         case SORT_BY_NONE:
1823         default:
1824                 menu_path = "/View/Sort/Don't sort"; break;
1825         }
1826         SET_CHECK_MENU_ACTIVE(menu_path, TRUE);
1827
1828         if (summaryview->sort_type == SORT_ASCENDING) {
1829                 SET_CHECK_MENU_ACTIVE("/View/Sort/Ascending", TRUE);
1830         } else {
1831                 SET_CHECK_MENU_ACTIVE("/View/Sort/Descending", TRUE);
1832         }
1833
1834         if (summaryview->sort_key != SORT_BY_NONE) {
1835                 menu_set_sensitive(ifactory, "/View/Sort/Ascending", TRUE);
1836                 menu_set_sensitive(ifactory, "/View/Sort/Descending", TRUE);
1837         } else {
1838                 menu_set_sensitive(ifactory, "/View/Sort/Ascending", FALSE);
1839                 menu_set_sensitive(ifactory, "/View/Sort/Descending", FALSE);
1840         }
1841
1842         SET_CHECK_MENU_ACTIVE("/View/Show all headers",
1843                               mainwin->messageview->mimeview->textview->show_all_headers);
1844         SET_CHECK_MENU_ACTIVE("/View/Thread view", (state & M_THREADED) != 0);
1845
1846 #undef SET_CHECK_MENU_ACTIVE
1847
1848         main_window_menu_callback_unblock(mainwin);
1849 }
1850
1851 void main_window_popup(MainWindow *mainwin)
1852 {
1853         gtkut_window_popup(mainwin->window);
1854
1855         switch (mainwin->type) {
1856         case SEPARATE_FOLDER:
1857                 gtkut_window_popup(mainwin->win.sep_folder.folderwin);
1858                 break;
1859         case SEPARATE_MESSAGE:
1860                 gtkut_window_popup(mainwin->win.sep_message.messagewin);
1861                 break;
1862         case SEPARATE_BOTH:
1863                 gtkut_window_popup(mainwin->win.sep_both.folderwin);
1864                 gtkut_window_popup(mainwin->win.sep_both.messagewin);
1865                 break;
1866         default:
1867                 break;
1868         }
1869 }
1870
1871 void main_window_show(MainWindow *mainwin)
1872 {
1873         gtk_widget_show(mainwin->window);
1874         gtk_widget_show(mainwin->vbox_body);
1875
1876         gtk_widget_set_uposition(mainwin->window,
1877                                  prefs_common.mainwin_x,
1878                                  prefs_common.mainwin_y);
1879
1880         gtk_widget_set_usize(GTK_WIDGET_PTR(mainwin->folderview),
1881                              prefs_common.folderview_width,
1882                              prefs_common.folderview_height);
1883         gtk_widget_set_usize(GTK_WIDGET_PTR(mainwin->summaryview),
1884                              prefs_common.summaryview_width,
1885                              prefs_common.summaryview_height);
1886         gtk_widget_set_usize(GTK_WIDGET_PTR(mainwin->messageview),
1887                              prefs_common.msgview_width,
1888                              prefs_common.msgview_height);
1889
1890         if (mainwin->type & SEPARATE_FOLDER) {
1891                 GtkWidget *folderwin;
1892
1893                 folderwin = main_window_get_folder_window(mainwin);
1894                 gtk_widget_show(folderwin);
1895                 gtk_widget_set_uposition(folderwin, prefs_common.folderwin_x,
1896                                          prefs_common.folderwin_y);
1897         }
1898
1899         if (mainwin->type & SEPARATE_MESSAGE) {
1900                 GtkWidget *messagewin;
1901
1902                 messagewin = main_window_get_message_window(mainwin);
1903                 gtk_widget_show(messagewin);
1904                 gtk_widget_set_uposition(messagewin, prefs_common.main_msgwin_x,
1905                                          prefs_common.main_msgwin_y);
1906         }
1907 }
1908
1909 void main_window_hide(MainWindow *mainwin)
1910 {
1911         main_window_get_size(mainwin);
1912         main_window_get_position(mainwin);
1913
1914         gtk_widget_hide(mainwin->window);
1915         gtk_widget_hide(mainwin->vbox_body);
1916
1917         if (mainwin->type & SEPARATE_FOLDER) {
1918                 gtk_widget_hide(mainwin->win.sep_folder.folderwin);
1919         }
1920
1921         if (mainwin->type & SEPARATE_MESSAGE) {
1922                 gtk_widget_hide(mainwin->win.sep_message.messagewin);
1923         }
1924 }
1925
1926 static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
1927 {
1928         GtkWidget *folderwin = NULL;
1929         GtkWidget *messagewin = NULL;
1930         GtkWidget *hpaned;
1931         GtkWidget *vpaned;
1932         GtkWidget *vbox_body = mainwin->vbox_body;
1933         GtkItemFactory *ifactory = mainwin->menu_factory;
1934         GtkWidget *menuitem;
1935         GtkItemFactory *msgview_ifactory;
1936
1937         debug_print("Setting widgets... ");
1938
1939         /* create separated window(s) if needed */
1940         if (type & SEPARATE_FOLDER) {
1941                 folderwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1942                 gtk_window_set_title(GTK_WINDOW(folderwin),
1943                                      _("Sylpheed - Folder View"));
1944                 gtk_window_set_wmclass(GTK_WINDOW(folderwin),
1945                                        "folder_view", "Sylpheed");
1946                 gtk_window_set_policy(GTK_WINDOW(folderwin),
1947                                       TRUE, TRUE, FALSE);
1948                 gtk_widget_set_uposition(folderwin, prefs_common.folderwin_x,
1949                                          prefs_common.folderwin_y);
1950                 gtk_container_set_border_width(GTK_CONTAINER(folderwin),
1951                                                BORDER_WIDTH);
1952                 gtk_signal_connect(GTK_OBJECT(folderwin), "delete_event",
1953                                    GTK_SIGNAL_FUNC(folder_window_close_cb),
1954                                    mainwin);
1955                 gtk_container_add(GTK_CONTAINER(folderwin),
1956                                   GTK_WIDGET_PTR(mainwin->folderview));
1957                 gtk_widget_realize(folderwin);
1958                 if (prefs_common.folderview_visible)
1959                         gtk_widget_show(folderwin);
1960         }
1961         if (type & SEPARATE_MESSAGE) {
1962                 messagewin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1963                 gtk_window_set_title(GTK_WINDOW(messagewin),
1964                                      _("Sylpheed - Message View"));
1965                 gtk_window_set_wmclass(GTK_WINDOW(messagewin),
1966                                        "message_view", "Sylpheed");
1967                 gtk_window_set_policy(GTK_WINDOW(messagewin),
1968                                       TRUE, TRUE, FALSE);
1969                 gtk_widget_set_uposition(messagewin, prefs_common.main_msgwin_x,
1970                                          prefs_common.main_msgwin_y);
1971                 gtk_container_set_border_width(GTK_CONTAINER(messagewin),
1972                                                BORDER_WIDTH);
1973                 gtk_signal_connect(GTK_OBJECT(messagewin), "delete_event",
1974                                    GTK_SIGNAL_FUNC(message_window_close_cb),
1975                                    mainwin);
1976                 if (messageview_is_visible(mainwin->messageview))
1977                         gtk_widget_show(messagewin);
1978         }
1979
1980         gtk_widget_set_usize(GTK_WIDGET_PTR(mainwin->folderview),
1981                              prefs_common.folderview_width,
1982                              prefs_common.folderview_height);
1983         gtk_widget_set_usize(GTK_WIDGET_PTR(mainwin->summaryview),
1984                              prefs_common.summaryview_width,
1985                              prefs_common.summaryview_height);
1986         gtk_widget_set_usize(GTK_WIDGET_PTR(mainwin->messageview),
1987                              prefs_common.msgview_width,
1988                              prefs_common.msgview_height);
1989
1990         switch (type) {
1991         case SEPARATE_NONE:
1992                 hpaned = gtk_hpaned_new();
1993                 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
1994                 gtk_paned_add1(GTK_PANED(hpaned),
1995                                GTK_WIDGET_PTR(mainwin->folderview));
1996                 gtk_widget_show(hpaned);
1997                 gtk_widget_queue_resize(hpaned);
1998
1999                 vpaned = gtk_vpaned_new();
2000                 if (messageview_is_visible(mainwin->messageview)) {
2001                         gtk_paned_add2(GTK_PANED(hpaned), vpaned);
2002                         gtk_paned_add1(GTK_PANED(vpaned),
2003                                        GTK_WIDGET_PTR(mainwin->summaryview));
2004                 } else {
2005                         gtk_paned_add2(GTK_PANED(hpaned),
2006                                        GTK_WIDGET_PTR(mainwin->summaryview));
2007                         gtk_widget_ref(vpaned);
2008                 }
2009                 gtk_paned_add2(GTK_PANED(vpaned),
2010                                GTK_WIDGET_PTR(mainwin->messageview));
2011                 gtk_widget_show(vpaned);
2012                 gtk_widget_queue_resize(vpaned);
2013
2014                 mainwin->win.sep_none.hpaned = hpaned;
2015                 mainwin->win.sep_none.vpaned = vpaned;
2016                 
2017                 /* remove headerview if not in prefs */
2018                 headerview_set_visibility(mainwin->messageview->headerview,
2019                                           prefs_common.display_header_pane);
2020                 break;
2021         case SEPARATE_FOLDER:
2022                 vpaned = gtk_vpaned_new();
2023                 if (messageview_is_visible(mainwin->messageview)) {
2024                         gtk_box_pack_start(GTK_BOX(vbox_body), vpaned,
2025                                            TRUE, TRUE, 0);
2026                         gtk_paned_add1(GTK_PANED(vpaned),
2027                                        GTK_WIDGET_PTR(mainwin->summaryview));
2028                 } else {
2029                         gtk_box_pack_start(GTK_BOX(vbox_body),
2030                                            GTK_WIDGET_PTR(mainwin->summaryview),
2031                                            TRUE, TRUE, 0);
2032                         gtk_widget_ref(vpaned);
2033                 }
2034                 gtk_paned_add2(GTK_PANED(vpaned),
2035                                GTK_WIDGET_PTR(mainwin->messageview));
2036                 gtk_widget_show(vpaned);
2037                 gtk_widget_queue_resize(vpaned);
2038
2039                 mainwin->win.sep_folder.folderwin = folderwin;
2040                 mainwin->win.sep_folder.vpaned    = vpaned;
2041
2042                 /* remove headerview if not in prefs */
2043                 headerview_set_visibility(mainwin->messageview->headerview,
2044                                           prefs_common.display_header_pane);
2045                 
2046                 break;
2047         case SEPARATE_MESSAGE:
2048                 hpaned = gtk_hpaned_new();
2049                 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
2050                 gtk_paned_add1(GTK_PANED(hpaned),
2051                                GTK_WIDGET_PTR(mainwin->folderview));
2052                 gtk_paned_add2(GTK_PANED(hpaned),
2053                                GTK_WIDGET_PTR(mainwin->summaryview));
2054                 gtk_widget_show(hpaned);
2055                 gtk_widget_queue_resize(hpaned);
2056                 messageview_add_toolbar(mainwin->messageview, messagewin);
2057                 msgview_ifactory = gtk_item_factory_from_widget(mainwin->messageview->menubar);
2058                 menu_set_sensitive(msgview_ifactory, "/File/Close", FALSE);
2059
2060                 mainwin->win.sep_message.messagewin = messagewin;
2061                 mainwin->win.sep_message.hpaned     = hpaned;
2062
2063                 gtk_widget_realize(messagewin);
2064                 gtk_widget_show_all(GTK_WIDGET_PTR(mainwin->messageview));
2065                 gtk_widget_show_all(messagewin);
2066                 toolbar_set_style(mainwin->messageview->toolbar->toolbar, 
2067                                   mainwin->messageview->handlebox, 
2068                                   prefs_common.toolbar_style);
2069
2070                 break;
2071         case SEPARATE_BOTH:
2072                 messageview_add_toolbar(mainwin->messageview, messagewin);
2073                 msgview_ifactory = gtk_item_factory_from_widget(mainwin->messageview->menubar);
2074                 menu_set_sensitive(msgview_ifactory, "/File/Close", FALSE);
2075
2076                 gtk_box_pack_start(GTK_BOX(vbox_body),
2077                                    GTK_WIDGET_PTR(mainwin->summaryview),
2078                                    TRUE, TRUE, 0);
2079                 
2080                 mainwin->win.sep_both.folderwin = folderwin;
2081                 mainwin->win.sep_both.messagewin = messagewin;
2082                 
2083                 gtk_widget_realize(messagewin);
2084                 gtk_widget_show_all(GTK_WIDGET_PTR(mainwin->messageview));
2085                 gtk_widget_show_all(messagewin);
2086                 toolbar_set_style(mainwin->messageview->toolbar->toolbar, 
2087                                   mainwin->messageview->handlebox, 
2088                                   prefs_common.toolbar_style);          
2089
2090                 break;
2091         }
2092
2093         gtk_widget_set_uposition(mainwin->window,
2094                                  prefs_common.mainwin_x,
2095                                  prefs_common.mainwin_y);
2096
2097         gtk_widget_queue_resize(vbox_body);
2098         gtk_widget_queue_resize(mainwin->vbox);
2099         gtk_widget_queue_resize(mainwin->window);
2100         /* CLAWS: previous "gtk_widget_show_all" makes noticeview
2101          * and mimeview icon list/ctree lose track of their visibility states */
2102         if (!noticeview_is_visible(mainwin->messageview->noticeview)) 
2103                 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
2104         if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview)) 
2105                 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
2106         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mainwin->messageview->mimeview->mime_toggle)))
2107                 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
2108         else 
2109                 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
2110
2111         mainwin->type = type;
2112
2113
2114         /* toggle menu state */
2115         menuitem = gtk_item_factory_get_item
2116                 (ifactory, "/View/Show or hide/Folder tree");
2117         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2118                                        (type & SEPARATE_FOLDER) == 0 ? TRUE :
2119                                        prefs_common.folderview_visible);
2120         gtk_widget_set_sensitive(menuitem, ((type & SEPARATE_FOLDER) != 0));
2121         menuitem = gtk_item_factory_get_item
2122                 (ifactory, "/View/Show or hide/Message view");
2123         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2124                                        (type & SEPARATE_MESSAGE) == 0 ? TRUE :
2125                                        prefs_common.msgview_visible);
2126
2127         menuitem = gtk_item_factory_get_item
2128                 (ifactory, "/View/Separate folder tree");
2129         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2130                                        ((type & SEPARATE_FOLDER) != 0));
2131         menuitem = gtk_item_factory_get_item
2132                 (ifactory, "/View/Separate message view");
2133         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2134                                        ((type & SEPARATE_MESSAGE) != 0));
2135
2136         if (folderwin) {
2137                 gtk_signal_connect
2138                         (GTK_OBJECT(folderwin), "size_allocate",
2139                          GTK_SIGNAL_FUNC(folder_window_size_allocate_cb),
2140                          mainwin);
2141         }
2142         if (messagewin) {
2143                 gtk_signal_connect
2144                         (GTK_OBJECT(messagewin), "size_allocate",
2145                          GTK_SIGNAL_FUNC(message_window_size_allocate_cb),
2146                          mainwin);
2147         }
2148
2149         debug_print("done.\n");
2150 }
2151
2152 void main_window_destroy_all(void)
2153 {
2154         while (mainwin_list != NULL) {
2155                 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
2156                 
2157                 /* free toolbar stuff */
2158                 toolbar_clear_list(TOOLBAR_MAIN);
2159                 TOOLBAR_DESTROY_ACTIONS(mainwin->toolbar->action_list);
2160                 TOOLBAR_DESTROY_ITEMS(mainwin->toolbar->item_list);
2161
2162                 g_free(mainwin->toolbar);
2163                 g_free(mainwin);
2164                 
2165                 mainwin_list = g_list_remove(mainwin_list, mainwin);
2166         }
2167         g_list_free(mainwin_list);
2168 }
2169
2170 #if 0
2171 static void toolbar_account_button_pressed(GtkWidget *widget,
2172                                            GdkEventButton *event,
2173                                            gpointer data)
2174 {
2175         MainWindow *mainwin = (MainWindow *)data;
2176
2177         if (!event) return;
2178         if (event->button != 3) return;
2179
2180         gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
2181         gtk_object_set_data(GTK_OBJECT(mainwin->ac_menu), "menu_button",
2182                             widget);
2183
2184         gtk_menu_popup(GTK_MENU(mainwin->ac_menu), NULL, NULL,
2185                        menu_button_position, widget,
2186                        event->button, event->time);
2187 }
2188 #endif
2189
2190 static void toolbar_child_attached(GtkWidget *widget, GtkWidget *child,
2191                                    gpointer data)
2192 {
2193         gtk_widget_set_usize(child, 1, -1);
2194 }
2195
2196 static void toolbar_child_detached(GtkWidget *widget, GtkWidget *child,
2197                                    gpointer data)
2198 {
2199         gtk_widget_set_usize(child, -1, -1);
2200 }
2201
2202 static void ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
2203                                     gpointer data)
2204 {
2205         MainWindow *mainwin = (MainWindow *)data;
2206
2207         if (!event) return;
2208
2209         gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
2210         gtk_object_set_data(GTK_OBJECT(mainwin->ac_menu), "menu_button",
2211                             widget);
2212
2213         gtk_menu_popup(GTK_MENU(mainwin->ac_menu), NULL, NULL,
2214                        menu_button_position, widget,
2215                        event->button, event->time);
2216 }
2217
2218 static void ac_menu_popup_closed(GtkMenuShell *menu_shell, gpointer data)
2219 {
2220         MainWindow *mainwin = (MainWindow *)data;
2221         GtkWidget *button;
2222
2223         button = gtk_object_get_data(GTK_OBJECT(menu_shell), "menu_button");
2224         if (!button) return;
2225         gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
2226         gtk_object_remove_data(GTK_OBJECT(mainwin->ac_menu), "menu_button");
2227         manage_window_focus_in(mainwin->window, NULL, NULL);
2228 }
2229
2230 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
2231                                  gpointer data)
2232 {
2233         MainWindow *mainwin = (MainWindow *)data;
2234
2235         if (mainwin->lock_count == 0)
2236                 app_exit_cb(data, 0, widget);
2237
2238         return TRUE;
2239 }
2240
2241 static gint folder_window_close_cb(GtkWidget *widget, GdkEventAny *event,
2242                                    gpointer data)
2243 {
2244         MainWindow *mainwin = (MainWindow *)data;
2245         GtkWidget *menuitem;
2246
2247         menuitem = gtk_item_factory_get_item
2248                 (mainwin->menu_factory, "/View/Show or hide/Folder tree");
2249         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
2250
2251         return TRUE;
2252 }
2253
2254 static gint message_window_close_cb(GtkWidget *widget, GdkEventAny *event,
2255                                     gpointer data)
2256 {
2257         MainWindow *mainwin = (MainWindow *)data;
2258         GtkWidget *menuitem;
2259
2260         menuitem = gtk_item_factory_get_item
2261                 (mainwin->menu_factory, "/View/Show or hide/Message view");
2262         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
2263
2264         return TRUE;
2265 }
2266
2267 static void main_window_size_allocate_cb(GtkWidget *widget,
2268                                          GtkAllocation *allocation,
2269                                          gpointer data)
2270 {
2271         MainWindow *mainwin = (MainWindow *)data;
2272
2273         main_window_get_size(mainwin);
2274 }
2275
2276 static void folder_window_size_allocate_cb(GtkWidget *widget,
2277                                            GtkAllocation *allocation,
2278                                            gpointer data)
2279 {
2280         MainWindow *mainwin = (MainWindow *)data;
2281
2282         main_window_get_size(mainwin);
2283 }
2284
2285 static void message_window_size_allocate_cb(GtkWidget *widget,
2286                                             GtkAllocation *allocation,
2287                                             gpointer data)
2288 {
2289         MainWindow *mainwin = (MainWindow *)data;
2290
2291         main_window_get_size(mainwin);
2292 }
2293
2294 static void add_mailbox_cb(MainWindow *mainwin, guint action,
2295                            GtkWidget *widget)
2296 {
2297         main_window_add_mailbox(mainwin);
2298 }
2299
2300 static void update_folderview_cb(MainWindow *mainwin, guint action,
2301                                  GtkWidget *widget)
2302 {
2303         summary_show(mainwin->summaryview, NULL);
2304         folderview_check_new_all();
2305 }
2306
2307 static void foldersort_cb(MainWindow *mainwin, guint action,
2308                            GtkWidget *widget)
2309 {
2310         foldersort_open();
2311 }
2312
2313 static void import_mbox_cb(MainWindow *mainwin, guint action,
2314                            GtkWidget *widget)
2315 {
2316         import_mbox(mainwin->summaryview->folder_item);
2317 }
2318
2319 static void export_mbox_cb(MainWindow *mainwin, guint action,
2320                            GtkWidget *widget)
2321 {
2322         export_mbox(mainwin->summaryview->folder_item);
2323 }
2324
2325 static void empty_trash_cb(MainWindow *mainwin, guint action,
2326                            GtkWidget *widget)
2327 {
2328         main_window_empty_trash(mainwin, TRUE);
2329 }
2330
2331 static void save_as_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2332 {
2333         summary_save_as(mainwin->summaryview);
2334 }
2335
2336 static void print_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2337 {
2338         summary_print(mainwin->summaryview);
2339 }
2340
2341 static void app_exit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2342 {
2343         if (prefs_common.confirm_on_exit) {
2344                 if (alertpanel(_("Exit"), _("Exit this program?"),
2345                                _("OK"), _("Cancel"), NULL) != G_ALERTDEFAULT)
2346                         return;
2347                 manage_window_focus_in(mainwin->window, NULL, NULL);
2348         }
2349
2350         app_will_exit(widget, mainwin);
2351 }
2352
2353 static void search_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2354 {
2355         if (action == 1)
2356                 summary_search(mainwin->summaryview);
2357         else
2358                 message_search(mainwin->messageview);
2359 }
2360
2361 static void toggle_folder_cb(MainWindow *mainwin, guint action,
2362                              GtkWidget *widget)
2363 {
2364         gboolean active;
2365
2366         active = GTK_CHECK_MENU_ITEM(widget)->active;
2367
2368         switch (mainwin->type) {
2369         case SEPARATE_NONE:
2370         case SEPARATE_MESSAGE:
2371 #if 0
2372                 if (active)
2373                         gtk_widget_show(GTK_WIDGET_PTR(mainwin->folderview));
2374                 else
2375                         gtk_widget_hide(GTK_WIDGET_PTR(mainwin->folderview));
2376 #endif
2377                 break;
2378         case SEPARATE_FOLDER:
2379                 debug_print("separate folder\n");
2380                 if (active)
2381                         gtk_widget_show(mainwin->win.sep_folder.folderwin);
2382                 else
2383                         gtk_widget_hide(mainwin->win.sep_folder.folderwin);
2384                 break;
2385         case SEPARATE_BOTH:
2386                 if (active)
2387                         gtk_widget_show(mainwin->win.sep_both.folderwin);
2388                 else
2389                         gtk_widget_hide(mainwin->win.sep_both.folderwin);
2390                 break;
2391         }
2392
2393         prefs_common.folderview_visible = active;
2394 }
2395
2396 static void toggle_message_cb(MainWindow *mainwin, guint action,
2397                               GtkWidget *widget)
2398 {
2399         gboolean active;
2400
2401         active = GTK_CHECK_MENU_ITEM(widget)->active;
2402
2403         if (active != messageview_is_visible(mainwin->messageview))
2404                 summary_toggle_view(mainwin->summaryview);
2405 }
2406
2407 static void toggle_toolbar_cb(MainWindow *mainwin, guint action,
2408                               GtkWidget *widget)
2409 {
2410         toolbar_toggle(action, mainwin);
2411 }
2412
2413 void main_window_reply_cb(MainWindow *mainwin, guint action,
2414                           GtkWidget *widget)
2415 {
2416         MessageView *msgview = (MessageView*)mainwin->messageview;
2417         GSList *msginfo_list = NULL;
2418         gchar *body;
2419
2420         g_return_if_fail(msgview != NULL);
2421
2422         msginfo_list = summary_get_selection(mainwin->summaryview);
2423         g_return_if_fail(msginfo_list != NULL);
2424         
2425         body = messageview_get_selection(msgview);
2426         compose_reply_mode((ComposeMode)action, msginfo_list, body);
2427         g_free(body);
2428         g_slist_free(msginfo_list);
2429 }
2430
2431
2432 static void toggle_statusbar_cb(MainWindow *mainwin, guint action,
2433                                 GtkWidget *widget)
2434 {
2435         if (GTK_CHECK_MENU_ITEM(widget)->active) {
2436                 gtk_widget_show(mainwin->hbox_stat);
2437                 prefs_common.show_statusbar = TRUE;
2438         } else {
2439                 gtk_widget_hide(mainwin->hbox_stat);
2440                 prefs_common.show_statusbar = FALSE;
2441         }
2442 }
2443
2444 static void separate_widget_cb(MainWindow *mainwin, guint action,
2445                                GtkWidget *widget)
2446 {
2447         SeparateType type;
2448
2449         if (GTK_CHECK_MENU_ITEM(widget)->active)
2450                 type = mainwin->type | action;
2451         else
2452                 type = mainwin->type & ~action;
2453
2454         main_window_separation_change(mainwin, type);
2455
2456         prefs_common.sep_folder = (type & SEPARATE_FOLDER)  != 0;
2457         prefs_common.sep_msg    = (type & SEPARATE_MESSAGE) != 0;
2458 }
2459
2460 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline)
2461 {
2462         if (offline)
2463                 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
2464         else
2465                 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
2466 }
2467
2468 static void toggle_work_offline_cb (MainWindow *mainwin, guint action, GtkWidget *widget)
2469 {
2470         main_window_toggle_work_offline(mainwin, GTK_CHECK_MENU_ITEM(widget)->active);
2471 }
2472
2473 static void online_switch_clicked (GtkButton *btn, gpointer data) 
2474 {
2475         MainWindow *mainwin;
2476         GtkItemFactory *ifactory;
2477         GtkCheckMenuItem *menuitem;
2478
2479         mainwin = (MainWindow *) data;
2480         
2481         ifactory = gtk_item_factory_from_widget(mainwin->menubar);
2482         menuitem = GTK_CHECK_MENU_ITEM (gtk_item_factory_get_widget(ifactory, "/File/Work offline"));
2483         
2484         g_return_if_fail(mainwin != NULL);
2485         g_return_if_fail(menuitem != NULL);
2486         
2487         if (btn == GTK_BUTTON(mainwin->online_switch)) {
2488                 /* go offline */
2489                 gtk_widget_hide (mainwin->online_switch);
2490                 gtk_widget_show (mainwin->offline_switch);
2491                 menuitem->active = TRUE;
2492                 prefs_common.work_offline = TRUE;
2493                 inc_autocheck_timer_remove();           
2494         } else {
2495                 /*go online */
2496                 gtk_widget_hide (mainwin->offline_switch);
2497                 gtk_widget_show (mainwin->online_switch);
2498                 menuitem->active = FALSE;
2499                 prefs_common.work_offline = FALSE;
2500                 inc_autocheck_timer_set();
2501         }
2502 }
2503
2504 static void addressbook_open_cb(MainWindow *mainwin, guint action,
2505                                 GtkWidget *widget)
2506 {
2507         addressbook_open(NULL);
2508 }
2509
2510 static void log_window_show_cb(MainWindow *mainwin, guint action,
2511                                GtkWidget *widget)
2512 {
2513         log_window_show(mainwin->logwin);
2514 }
2515
2516 static void inc_cancel_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2517 {
2518         inc_cancel_all();
2519 }
2520
2521 static void move_to_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2522 {
2523         summary_move_to(mainwin->summaryview);
2524 }
2525
2526 static void copy_to_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2527 {
2528         summary_copy_to(mainwin->summaryview);
2529 }
2530
2531 static void delete_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2532 {
2533         summary_delete(mainwin->summaryview);
2534 }
2535
2536 static void cancel_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2537 {
2538         summary_cancel(mainwin->summaryview);
2539 }
2540
2541 static void open_msg_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2542 {
2543         summary_open_msg(mainwin->summaryview);
2544 }
2545
2546 static void view_source_cb(MainWindow *mainwin, guint action,
2547                            GtkWidget *widget)
2548 {
2549         summary_view_source(mainwin->summaryview);
2550 }
2551
2552 static void show_all_header_cb(MainWindow *mainwin, guint action,
2553                                GtkWidget *widget)
2554 {
2555         if (mainwin->menu_lock_count) return;
2556         summary_display_msg_selected(mainwin->summaryview,
2557                                      GTK_CHECK_MENU_ITEM(widget)->active);
2558 }
2559
2560 static void mark_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2561 {
2562         summary_mark(mainwin->summaryview);
2563 }
2564
2565 static void unmark_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2566 {
2567         summary_unmark(mainwin->summaryview);
2568 }
2569
2570 static void mark_as_unread_cb(MainWindow *mainwin, guint action,
2571                               GtkWidget *widget)
2572 {
2573         summary_mark_as_unread(mainwin->summaryview);
2574 }
2575
2576 static void mark_as_read_cb(MainWindow *mainwin, guint action,
2577                             GtkWidget *widget)
2578 {
2579         summary_mark_as_read(mainwin->summaryview);
2580 }
2581
2582 static void mark_all_read_cb(MainWindow *mainwin, guint action,
2583                              GtkWidget *widget)
2584 {
2585         summary_mark_all_read(mainwin->summaryview);
2586 }
2587
2588 static void reedit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2589 {
2590         summary_reedit(mainwin->summaryview);
2591 }
2592
2593 static void add_address_cb(MainWindow *mainwin, guint action,
2594                            GtkWidget *widget)
2595 {
2596         summary_add_address(mainwin->summaryview);
2597 }
2598
2599 static void set_charset_cb(MainWindow *mainwin, guint action,
2600                            GtkWidget *widget)
2601 {
2602         const gchar *str;
2603
2604         if (GTK_CHECK_MENU_ITEM(widget)->active) {
2605                 str = conv_get_charset_str((CharSet)action);
2606                 g_free(prefs_common.force_charset);
2607                 prefs_common.force_charset = str ? g_strdup(str) : NULL;
2608
2609                 summary_redisplay_msg(mainwin->summaryview);
2610                 
2611                 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
2612         }
2613 }
2614
2615 static void hide_read_messages (MainWindow *mainwin, guint action,
2616                                 GtkWidget *widget)
2617 {
2618         if (!mainwin->summaryview->folder_item
2619             || gtk_object_get_data(GTK_OBJECT(widget), "dont_toggle"))
2620                 return;
2621         summary_toggle_show_read_messages(mainwin->summaryview);
2622 }
2623
2624 static void thread_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2625 {
2626         if (mainwin->menu_lock_count) return;
2627         if (!mainwin->summaryview->folder_item) return;
2628
2629         if (GTK_CHECK_MENU_ITEM(widget)->active) {
2630                 summary_thread_build(mainwin->summaryview);
2631 /*              mainwin->summaryview->folder_item->threaded = TRUE; */
2632         } else {
2633                 summary_unthread(mainwin->summaryview);
2634 /*              mainwin->summaryview->folder_item->threaded = FALSE; */
2635         }
2636 }
2637
2638 static void expand_threads_cb(MainWindow *mainwin, guint action,
2639                               GtkWidget *widget)
2640 {
2641         summary_expand_threads(mainwin->summaryview);
2642 }
2643
2644 static void collapse_threads_cb(MainWindow *mainwin, guint action,
2645                                 GtkWidget *widget)
2646 {
2647         summary_collapse_threads(mainwin->summaryview);
2648 }
2649
2650 static void set_display_item_cb(MainWindow *mainwin, guint action,
2651                                 GtkWidget *widget)
2652 {
2653         prefs_summary_column_open();
2654 }
2655
2656 static void sort_summary_cb(MainWindow *mainwin, guint action,
2657                             GtkWidget *widget)
2658 {
2659         FolderItem *item = mainwin->summaryview->folder_item;
2660         GtkWidget *menuitem;
2661
2662         if (mainwin->menu_lock_count) return;
2663
2664         if (GTK_CHECK_MENU_ITEM(widget)->active && item) {
2665                 menuitem = gtk_item_factory_get_item
2666                         (mainwin->menu_factory, "/View/Sort/Ascending");
2667                 summary_sort(mainwin->summaryview, (FolderSortKey)action,
2668                              GTK_CHECK_MENU_ITEM(menuitem)->active
2669                              ? SORT_ASCENDING : SORT_DESCENDING);
2670         }
2671 }
2672
2673 static void sort_summary_type_cb(MainWindow *mainwin, guint action,
2674                                  GtkWidget *widget)
2675 {
2676         FolderItem *item = mainwin->summaryview->folder_item;
2677
2678         if (mainwin->menu_lock_count) return;
2679
2680         if (GTK_CHECK_MENU_ITEM(widget)->active && item)
2681                 summary_sort(mainwin->summaryview,
2682                              item->sort_key, (FolderSortType)action);
2683 }
2684
2685 static void attract_by_subject_cb(MainWindow *mainwin, guint action,
2686                                   GtkWidget *widget)
2687 {
2688         summary_attract_by_subject(mainwin->summaryview);
2689 }
2690
2691 static void delete_duplicated_cb(MainWindow *mainwin, guint action,
2692                                  GtkWidget *widget)
2693 {
2694         FolderItem *item;
2695
2696         item = folderview_get_selected(mainwin->folderview);
2697         if (item) {
2698                 main_window_cursor_wait(mainwin);
2699                 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
2700
2701                 folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
2702                                               DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
2703
2704                 STATUSBAR_POP(mainwin);
2705                 main_window_cursor_normal(mainwin);
2706         }
2707 }
2708
2709 struct DelDupsData
2710 {
2711         guint   dups;
2712         guint   folders;
2713 };
2714
2715 static void deldup_all(FolderItem *item, gpointer _data)
2716 {
2717         struct DelDupsData *data = _data;
2718         gint result;
2719         
2720         result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
2721         if (result >= 0) {
2722                 data->dups += result;
2723                 data->folders += 1;
2724         }
2725 }
2726
2727 static void delete_duplicated_all_cb(MainWindow *mainwin, guint action,
2728                                  GtkWidget *widget)
2729 {
2730         struct DelDupsData data = {0, 0};
2731
2732         folder_func_to_all_folders(deldup_all, &data);
2733         alertpanel_notice(_("Deleted %d duplicate message(s) in %d folders.\n"),
2734                           data.dups, data.folders);
2735 }
2736
2737 static void filter_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2738 {
2739         summary_filter(mainwin->summaryview, (gboolean)action);
2740 }
2741
2742 static void execute_summary_cb(MainWindow *mainwin, guint action,
2743                                GtkWidget *widget)
2744 {
2745         summary_execute(mainwin->summaryview);
2746 }
2747
2748 static void update_summary_cb(MainWindow *mainwin, guint action,
2749                               GtkWidget *widget)
2750 {
2751         FolderItem *fitem;
2752         FolderView *folderview = mainwin->folderview;
2753
2754         if (!mainwin->summaryview->folder_item) return;
2755         if (!folderview->opened) return;
2756
2757         folder_update_op_count();
2758
2759         fitem = gtk_ctree_node_get_row_data(GTK_CTREE(folderview->ctree),
2760                                             folderview->opened);
2761         if (!fitem) return;
2762
2763         folder_item_scan(fitem);
2764         summary_show(mainwin->summaryview, fitem);
2765 }
2766
2767 static void prev_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2768 {
2769         summary_step(mainwin->summaryview, GTK_SCROLL_STEP_BACKWARD);
2770 }
2771
2772 static void next_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2773 {
2774         summary_step(mainwin->summaryview, GTK_SCROLL_STEP_FORWARD);
2775 }
2776
2777 static void prev_unread_cb(MainWindow *mainwin, guint action,
2778                            GtkWidget *widget)
2779 {
2780         summary_select_prev_unread(mainwin->summaryview);
2781 }
2782
2783 static void next_unread_cb(MainWindow *mainwin, guint action,
2784                            GtkWidget *widget)
2785 {
2786         summary_select_next_unread(mainwin->summaryview);
2787 }
2788
2789 static void prev_new_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2790 {
2791         summary_select_prev_new(mainwin->summaryview);
2792 }
2793
2794 static void next_new_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2795 {
2796         summary_select_next_new(mainwin->summaryview);
2797 }
2798
2799 static void prev_marked_cb(MainWindow *mainwin, guint action,
2800                            GtkWidget *widget)
2801 {
2802         summary_select_prev_marked(mainwin->summaryview);
2803 }
2804
2805 static void next_marked_cb(MainWindow *mainwin, guint action,
2806                            GtkWidget *widget)
2807 {
2808         summary_select_next_marked(mainwin->summaryview);
2809 }
2810
2811 static void prev_labeled_cb(MainWindow *mainwin, guint action,
2812                             GtkWidget *widget)
2813 {
2814         summary_select_prev_labeled(mainwin->summaryview);
2815 }
2816
2817 static void next_labeled_cb(MainWindow *mainwin, guint action,
2818                             GtkWidget *widget)
2819 {
2820         summary_select_next_labeled(mainwin->summaryview);
2821 }
2822
2823 static void goto_folder_cb(MainWindow *mainwin, guint action,
2824                            GtkWidget *widget)
2825 {
2826         FolderItem *to_folder;
2827
2828         to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL);
2829
2830         if (to_folder)
2831                 folderview_select(mainwin->folderview, to_folder);
2832 }
2833
2834 static void copy_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2835 {
2836         messageview_copy_clipboard(mainwin->messageview);
2837 }
2838
2839 static void allsel_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
2840 {
2841         MessageView *msgview = mainwin->messageview;
2842
2843         if (GTK_WIDGET_HAS_FOCUS(mainwin->summaryview->ctree))
2844                 summary_select_all(mainwin->summaryview);
2845         else if (messageview_is_visible(msgview) &&
2846                  (GTK_WIDGET_HAS_FOCUS(msgview->mimeview->textview->text)))
2847                 messageview_select_all(mainwin->messageview);
2848 }
2849
2850 static void select_thread_cb(MainWindow *mainwin, guint action,
2851                              GtkWidget *widget)
2852 {
2853         summary_select_thread(mainwin->summaryview);
2854 }
2855
2856 static void create_filter_cb(MainWindow *mainwin, guint action,
2857                              GtkWidget *widget)
2858 {
2859         summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
2860 }
2861
2862 static void create_processing_cb(MainWindow *mainwin, guint action,
2863                              GtkWidget *widget)
2864 {
2865         summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
2866 }
2867
2868 static void prefs_common_open_cb(MainWindow *mainwin, guint action,
2869                                  GtkWidget *widget)
2870 {
2871         prefs_common_open();
2872 }
2873
2874 static void prefs_pre_processing_open_cb(MainWindow *mainwin, guint action,
2875                                          GtkWidget *widget)
2876 {
2877         prefs_filtering_open(&pre_global_processing,
2878                              _("Processing rules to apply before folder rules"),
2879                              NULL, NULL);
2880 }
2881
2882 static void prefs_post_processing_open_cb(MainWindow *mainwin, guint action,
2883                                           GtkWidget *widget)
2884 {
2885         prefs_filtering_open(&post_global_processing,
2886                              _("Processing rules to apply after folder rules"),
2887                              NULL, NULL);
2888 }
2889
2890 static void prefs_filtering_open_cb(MainWindow *mainwin, guint action,
2891                                     GtkWidget *widget)
2892 {
2893         prefs_filtering_open(&filtering_rules,
2894                              _("Filtering configuration"),
2895                              NULL, NULL);
2896 }
2897
2898 static void prefs_template_open_cb(MainWindow *mainwin, guint action,
2899                                    GtkWidget *widget)
2900 {
2901         prefs_template_open();
2902 }
2903
2904 static void prefs_actions_open_cb(MainWindow *mainwin, guint action,
2905                                   GtkWidget *widget)
2906 {
2907         prefs_actions_open(mainwin);
2908 }
2909 #ifdef USE_OPENSSL
2910 static void ssl_manager_open_cb(MainWindow *mainwin, guint action,
2911                                   GtkWidget *widget)
2912 {
2913         ssl_manager_open(mainwin);
2914 }
2915 #endif
2916 static void prefs_account_open_cb(MainWindow *mainwin, guint action,
2917                                   GtkWidget *widget)
2918 {
2919         if (!cur_account) {
2920                 new_account_cb(mainwin, 0, widget);
2921         } else {
2922                 account_open(cur_account);
2923         }
2924 }
2925
2926 static void new_account_cb(MainWindow *mainwin, guint action,
2927                            GtkWidget *widget)
2928 {
2929         account_edit_open();
2930         if (!compose_get_compose_list()) account_add();
2931 }
2932
2933 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
2934 {
2935         cur_account = (PrefsAccount *)data;
2936         main_window_reflect_prefs_all();
2937 }
2938
2939 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
2940 {
2941         MainWindow *mainwin = (MainWindow *)mainwin_list->data;
2942         PrefsAccount *account = (PrefsAccount *)data;
2943
2944         inc_account_mail(mainwin, account);
2945 }
2946
2947 static void prefs_open_cb(GtkMenuItem *menuitem, gpointer data)
2948 {
2949         prefs_gtk_open();
2950 }
2951
2952 static void plugins_open_cb(GtkMenuItem *menuitem, gpointer data)
2953 {
2954         pluginwindow_create();
2955 }
2956
2957 static void manual_open_cb(MainWindow *mainwin, guint action,
2958                            GtkWidget *widget)
2959 {
2960         manual_open((ManualType)action);
2961 }
2962
2963 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
2964 {
2965         MainWindow *mainwin = (MainWindow *)data;
2966         gchar *str;
2967
2968         if (item->path)
2969                 str = g_strdup_printf(_("Scanning folder %s%c%s ..."),
2970                                       LOCAL_FOLDER(folder)->rootpath,
2971                                       G_DIR_SEPARATOR,
2972                                       item->path);
2973         else
2974                 str = g_strdup_printf(_("Scanning folder %s ..."),
2975                                       LOCAL_FOLDER(folder)->rootpath);
2976
2977         STATUSBAR_PUSH(mainwin, str);
2978         STATUSBAR_POP(mainwin);
2979         g_free(str);
2980 }
2981
2982 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
2983                                           gpointer data)
2984 {
2985         SummaryView *summary;
2986
2987         g_return_val_if_fail(data, FALSE);
2988         summary = ((MainWindow *)data)->summaryview;
2989         g_return_val_if_fail(summary, FALSE);
2990
2991         if (GTK_CLIST(summary->ctree)->selection && 
2992             g_list_length(GTK_CLIST(summary->ctree)->selection) > 1)
2993                 return FALSE;
2994
2995         if (summary->selected != summary->displayed)
2996                 summary_select_node(summary, summary->displayed, FALSE, TRUE);
2997         return FALSE;
2998 }
2999
3000 #define BREAK_ON_MODIFIER_KEY() \
3001         if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
3002
3003 void mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
3004                                     gpointer data)
3005 {
3006         MainWindow *mainwin = (MainWindow*) data;
3007         
3008         if (!mainwin || !event) return;
3009                 
3010         switch (event->keyval) {
3011         case GDK_Q:             /* Quit */
3012                 BREAK_ON_MODIFIER_KEY();
3013
3014                 app_exit_cb(mainwin, 0, NULL);
3015                 return;
3016         case GDK_space:
3017                 if (mainwin->folderview && mainwin->summaryview
3018                     && !mainwin->summaryview->displayed) {
3019                         summary_lock(mainwin->summaryview);
3020                         folderview_select_next_unread(mainwin->folderview);
3021                         summary_unlock(mainwin->summaryview);
3022                 }
3023                 break;
3024         default:
3025                 break;
3026         }
3027 }
3028
3029 #undef BREAK_ON_MODIFIER_KEY
3030
3031 /*
3032  * Harvest addresses for selected folder.
3033  */
3034 static void addr_harvest_cb( MainWindow *mainwin,
3035                             guint action,
3036                             GtkWidget *widget )
3037 {
3038         addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
3039 }
3040
3041 /*
3042  * Harvest addresses for selected messages in summary view.
3043  */
3044 static void addr_harvest_msg_cb( MainWindow *mainwin,
3045                             guint action,
3046                             GtkWidget *widget )
3047 {
3048         summary_harvest_address( mainwin->summaryview );
3049 }
3050
3051 /*!
3052  *\brief        get a MainWindow
3053  *
3054  *\return       MainWindow * The first mainwindow in the mainwin_list
3055  */
3056 MainWindow *mainwindow_get_mainwindow(void)
3057 {
3058         if (mainwin_list && mainwin_list->data)
3059                 return (MainWindow *)(mainwin_list->data);
3060         else
3061                 return NULL;
3062 }
3063
3064 gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
3065 {
3066         ProgressData *data = (ProgressData *) source;
3067         MainWindow *mainwin = (MainWindow *) userdata;
3068
3069         switch (data->cmd) {
3070         case PROGRESS_COMMAND_START:
3071         case PROGRESS_COMMAND_STOP:
3072                 gtk_progress_set_percentage(GTK_PROGRESS(mainwin->progressbar), 0.0);
3073                 break;
3074         case PROGRESS_COMMAND_SET_PERCENTAGE:
3075                 gtk_progress_set_percentage(GTK_PROGRESS(mainwin->progressbar), data->value);
3076                 break;          
3077         }
3078         while (gtk_events_pending()) gtk_main_iteration ();
3079
3080         return FALSE;
3081 }
3082
3083 /*
3084 * End of Source.
3085 */