2005-01-27 [colin] 1.0.0cvs16
[claws.git] / src / mainwindow.c
index 17be476a2304ac800156e5bce3fe7919e587daf5..498f824ed19d6607b6266112cf35d6b72eb9e086 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2003 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2004 Hiroyuki Yamamoto
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,6 +39,7 @@
 #include <gtk/gtkhandlebox.h>
 #include <gtk/gtktoolbar.h>
 #include <gtk/gtkbutton.h>
+#include <gtk/gtktooltips.h>
 #include <string.h>
 
 #include "intl.h"
@@ -62,7 +63,6 @@
 #include "prefs_common.h"
 #include "prefs_actions.h"
 #include "prefs_filtering.h"
-#include "prefs_scoring.h"
 #include "prefs_account.h"
 #include "prefs_summary_column.h"
 #include "prefs_template.h"
 #include "pluginwindow.h"
 #include "hooks.h"
 #include "progressindicator.h"
+#include "localfolder.h"
+#include "filtering.h"
+#include "folderutils.h"
+#include "foldersort.h"
 
 #define AC_LABEL_WIDTH 240
 
@@ -107,6 +111,14 @@ static void toolbar_account_button_pressed (GtkWidget      *widget,
                                                 GdkEventButton *event,
                                                 gpointer        data);
 #endif
+
+static void toolbar_child_attached             (GtkWidget      *widget,
+                                                GtkWidget      *child,
+                                                gpointer        data);
+static void toolbar_child_detached             (GtkWidget      *widget,
+                                                GtkWidget      *child,
+                                                gpointer        data);
+
 static void ac_label_button_pressed            (GtkWidget      *widget,
                                                 GdkEventButton *event,
                                                 gpointer        data);
@@ -133,30 +145,24 @@ static void message_window_size_allocate_cb       (GtkWidget      *widget,
                                                 GtkAllocation  *allocation,
                                                 gpointer        data);
 
-static void new_folder_cb       (MainWindow    *mainwin,
-                                 guint          action,
-                                 GtkWidget     *widget);
-static void add_mbox_cb         (MainWindow    *mainwin,
-                                 guint          action,
-                                 GtkWidget     *widget);
-static void rename_folder_cb    (MainWindow    *mainwin,
-                                 guint          action,
-                                 GtkWidget     *widget);
-static void delete_folder_cb    (MainWindow    *mainwin,
-                                 guint          action,
-                                 GtkWidget     *widget);
 static void update_folderview_cb (MainWindow   *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
 static void add_mailbox_cb      (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void foldersort_cb       (MainWindow    *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
 static void import_mbox_cb      (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
 static void export_mbox_cb      (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void export_list_mbox_cb  (MainWindow   *mainwin, 
+                                 guint          action,
+                                 GtkWidget     *widget);
 static void empty_trash_cb      (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
@@ -214,10 +220,6 @@ static void show_all_header_cb             (MainWindow     *mainwin,
                                         guint           action,
                                         GtkWidget      *widget);
 
-static void reedit_cb                  (MainWindow     *mainwin,
-                                        guint           action,
-                                        GtkWidget      *widget);
-
 static void move_to_cb                 (MainWindow     *mainwin,
                                         guint           action,
                                         GtkWidget      *widget);
@@ -248,6 +250,11 @@ static void mark_as_read_cb                (MainWindow     *mainwin,
 static void mark_all_read_cb           (MainWindow     *mainwin,
                                         guint           action,
                                         GtkWidget      *widget);
+
+static void reedit_cb                  (MainWindow     *mainwin,
+                                        guint           action,
+                                        GtkWidget      *widget);
+
 static void add_address_cb             (MainWindow     *mainwin,
                                         guint           action,
                                         GtkWidget      *widget);
@@ -256,6 +263,10 @@ static void set_charset_cb         (MainWindow     *mainwin,
                                         guint           action,
                                         GtkWidget      *widget);
 
+static void set_decode_cb              (MainWindow     *mainwin,
+                                        guint           action,
+                                        GtkWidget      *widget);
+
 static void hide_read_messages   (MainWindow   *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
@@ -286,6 +297,9 @@ static void attract_by_subject_cb(MainWindow        *mainwin,
 static void delete_duplicated_cb (MainWindow   *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void delete_duplicated_all_cb (MainWindow       *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
 static void filter_cb           (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
@@ -345,6 +359,9 @@ static void select_thread_cb         (MainWindow    *mainwin,
 static void create_filter_cb    (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void create_processing_cb (MainWindow   *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
 
 static void prefs_common_open_cb       (MainWindow     *mainwin,
                                         guint           action,
@@ -358,9 +375,15 @@ static void prefs_actions_open_cb  (MainWindow     *mainwin,
 static void prefs_account_open_cb      (MainWindow     *mainwin,
                                         guint           action,
                                         GtkWidget      *widget);
-static void prefs_scoring_open_cb      (MainWindow     *mainwin,
-                                        guint           action,
-                                        GtkWidget      *widget);
+
+static void prefs_pre_processing_open_cb  (MainWindow  *mainwin,
+                                          guint         action,
+                                          GtkWidget    *widget);
+
+static void prefs_post_processing_open_cb (MainWindow  *mainwin,
+                                          guint         action,
+                                          GtkWidget    *widget);
+
 static void prefs_filtering_open_cb    (MainWindow     *mainwin,
                                         guint           action,
                                         GtkWidget      *widget);
@@ -373,8 +396,10 @@ static void new_account_cb  (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
 
-static void account_menu_cb     (GtkMenuItem   *menuitem,
-                                 gpointer       data);
+static void account_selector_menu_cb    (GtkMenuItem   *menuitem,
+                                         gpointer       data);
+static void account_receive_menu_cb     (GtkMenuItem   *menuitem,
+                                         gpointer       data);
 
 static void prefs_open_cb      (GtkMenuItem    *menuitem,
                                 gpointer        data);
@@ -415,25 +440,23 @@ gboolean mainwindow_progressindicator_hook        (gpointer        source,
 static GtkItemFactoryEntry mainwin_entries[] =
 {
        {N_("/_File"),                          NULL, NULL, 0, "<Branch>"},
-       {N_("/_File/_Folder"),                  NULL, NULL, 0, "<Branch>"},
-       {N_("/_File/_Folder/Create _new folder..."),
-                                               NULL, new_folder_cb, 0, NULL},
-       {N_("/_File/_Folder/_Rename folder..."),NULL, rename_folder_cb, 0, NULL},
-       {N_("/_File/_Folder/_Delete folder"),   NULL, delete_folder_cb, 0, NULL},
-       {N_("/_File/_Folder/---"),                      NULL, NULL, 0, "<Separator>"},
-       {N_("/_File/_Folder/_Check for new messages in all folders"),
-                                               NULL, update_folderview_cb, 0, NULL},
        {N_("/_File/_Add mailbox"),             NULL, NULL, 0, "<Branch>"},
        {N_("/_File/_Add mailbox/MH..."),       NULL, add_mailbox_cb, 0, NULL},
-       {N_("/_File/_Add mailbox/mbox..."),     NULL, add_mbox_cb, 0, NULL},
+       {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
+       {N_("/_File/Change folder order"),      NULL, foldersort_cb,  0, NULL},
+       {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_File/_Import mbox file..."),     NULL, import_mbox_cb, 0, NULL},
        {N_("/_File/_Export to mbox file..."),  NULL, export_mbox_cb, 0, NULL},
-       {N_("/_File/Empty _trash"),             "<shift>D", empty_trash_cb, 0, NULL},
-       {N_("/_File/_Work offline"),            "<control>W", toggle_work_offline_cb, 0, "<ToggleItem>"},                                               
+       {N_("/_File/_Export selected to mbox file..."), 
+                                               NULL, export_list_mbox_cb, 0, NULL},
+       {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
+       {N_("/_File/Empty all _Trash folders"), "<shift>D", empty_trash_cb, 0, NULL},
        {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_File/_Save as..."),              "<control>S", save_as_cb, 0, NULL},
        {N_("/_File/_Print..."),                NULL, print_cb, 0, NULL},
        {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
+       {N_("/_File/_Work offline"),            "<control>W", toggle_work_offline_cb, 0, "<ToggleItem>"},
+       {N_("/_File/---"),                      NULL, NULL, 0, "<Separator>"},
        /* {N_("/_File/_Close"),                "<alt>W", app_exit_cb, 0, NULL}, */
        {N_("/_File/E_xit"),                    "<control>Q", app_exit_cb, 0, NULL},
 
@@ -562,6 +585,8 @@ static GtkItemFactoryEntry mainwin_entries[] =
         CODESET_ACTION(C_ISO_8859_5)},
        {N_("/_View/_Code set/Cyrillic (KOI8-_R)"),
         CODESET_ACTION(C_KOI8_R)},
+       {N_("/_View/_Code set/Cyrillic (KOI8-U)"),
+        CODESET_ACTION(C_KOI8_U)},
        {N_("/_View/_Code set/Cyrillic (Windows-1251)"),
         CODESET_ACTION(C_WINDOWS_1251)},
        CODESET_SEPARATOR,
@@ -601,6 +626,22 @@ static GtkItemFactoryEntry mainwin_entries[] =
 #undef CODESET_SEPARATOR
 #undef CODESET_ACTION
 
+#define DECODE_SEPARATOR \
+       {N_("/_View/Decode/---"),               NULL, NULL, 0, "<Separator>"}
+#define DECODE_ACTION(action) \
+        NULL, set_decode_cb, action, "/View/Decode/Auto detect"
+       {N_("/_View/Decode"),           NULL, NULL, 0, "<Branch>"},
+       {N_("/_View/Decode/_Auto detect"),
+        NULL, set_decode_cb, 0, "<RadioItem>"},
+       {N_("/_View/Decode/---"),               NULL, NULL, 0, "<Separator>"},
+       {N_("/_View/Decode/_8bit"),             DECODE_ACTION(ENC_8BIT)},
+       {N_("/_View/Decode/_Quoted printable"), DECODE_ACTION(ENC_QUOTED_PRINTABLE)},
+       {N_("/_View/Decode/_Base64"),           DECODE_ACTION(ENC_BASE64)},
+       {N_("/_View/Decode/_Uuencode"),         DECODE_ACTION(ENC_X_UUENCODE)},
+
+#undef DECODE_SEPARATOR
+#undef DECODE_ACTION
+
        {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_View/Open in new _window"),      "<control><alt>N", open_msg_cb, 0, NULL},
        {N_("/_View/Mess_age source"),          "<control>U", view_source_cb, 0, NULL},
@@ -609,11 +650,14 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_View/_Update summary"),          "<control><alt>U", update_summary_cb,  0, NULL},
 
        {N_("/_Message"),                       NULL, NULL, 0, "<Branch>"},
-       {N_("/_Message/Get new ma_il"),         "<control>I",   inc_mail_cb, 0, NULL},
-       {N_("/_Message/Get from _all accounts"),
+       {N_("/_Message/Recei_ve"),              NULL, NULL, 0, "<Branch>"},
+       {N_("/_Message/Recei_ve/Get from _current account"),
+                                               "<control>I",   inc_mail_cb, 0, NULL},
+       {N_("/_Message/Recei_ve/Get from _all accounts"),
                                                "<shift><control>I", inc_all_account_mail_cb, 0, NULL},
-       {N_("/_Message/Cancel receivin_g"),     NULL, inc_cancel_cb, 0, NULL},
-       {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
+       {N_("/_Message/Recei_ve/Cancel receivin_g"),
+                                               NULL, inc_cancel_cb, 0, NULL},
+       {N_("/_Message/Recei_ve/---"),          NULL, NULL, 0, "<Separator>"},
        {N_("/_Message/_Send queued messages"), NULL, send_queue_cb, 0, NULL},
        {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
        {N_("/_Message/Compose a_n email message"),     "<control>M", compose_mail_cb, 0, NULL},
@@ -629,8 +673,6 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Message/_Forward"),              "<control><alt>F", main_window_reply_cb, COMPOSE_FORWARD, NULL},
        {N_("/_Message/Redirect"),              NULL, main_window_reply_cb, COMPOSE_REDIRECT, NULL},
        {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
-       {N_("/_Message/Re-_edit"),              NULL, reedit_cb, 0, NULL},
-       {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
        {N_("/_Message/M_ove..."),              "<control>O", move_to_cb, 0, NULL},
        {N_("/_Message/_Copy..."),              "<shift><control>O", copy_to_cb, 0, NULL},
        {N_("/_Message/_Delete"),               "<control>D", delete_cb,  0, NULL},
@@ -644,6 +686,8 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Message/_Mark/Mark as rea_d"),
                                                NULL, mark_as_read_cb, 0, NULL},
        {N_("/_Message/_Mark/Mark all _read"),  NULL, mark_all_read_cb, 0, NULL},
+       {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
+       {N_("/_Message/Re-_edit"),              NULL, reedit_cb, 0, NULL},
 
        {N_("/_Tools"),                         NULL, NULL, 0, "<Branch>"},
        {N_("/_Tools/_Address book..."),        "<shift><control>A", addressbook_open_cb, 0, NULL},
@@ -655,7 +699,10 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Tools/_Harvest addresses/from _Messages..."),
                                                NULL, addr_harvest_msg_cb, 0, NULL},
        {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
-       {N_("/_Tools/_Filter messages"),                NULL, filter_cb, 0, NULL},
+       {N_("/_Tools/_Filter all messages in folder"),
+                                               NULL, filter_cb, 0, NULL},
+       {N_("/_Tools/Filter _selected messages"),
+                                               NULL, filter_cb, 1, NULL},
        {N_("/_Tools/_Create filter rule"),     NULL, NULL, 0, "<Branch>"},
        {N_("/_Tools/_Create filter rule/_Automatically"),
                                                NULL, create_filter_cb, FILTER_BY_AUTO, NULL},
@@ -665,11 +712,26 @@ static GtkItemFactoryEntry mainwin_entries[] =
                                                NULL, create_filter_cb, FILTER_BY_TO, NULL},
        {N_("/_Tools/_Create filter rule/by _Subject"),
                                                NULL, create_filter_cb, FILTER_BY_SUBJECT, NULL},
+       {N_("/_Tools/_Create processing rule"), NULL, NULL, 0, "<Branch>"},
+       {N_("/_Tools/_Create processing rule/_Automatically"),
+                                               NULL, create_processing_cb, FILTER_BY_AUTO, NULL},
+       {N_("/_Tools/_Create processing rule/by _From"),
+                                               NULL, create_processing_cb, FILTER_BY_FROM, NULL},
+       {N_("/_Tools/_Create processing rule/by _To"),
+                                               NULL, create_processing_cb, FILTER_BY_TO, NULL},
+       {N_("/_Tools/_Create processing rule/by _Subject"),
+                                               NULL, create_processing_cb, FILTER_BY_SUBJECT, NULL},
        {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
        {N_("/_Tools/Actio_ns"),                NULL, NULL, 0, "<Branch>"},
        {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
+       {N_("/_Tools/_Check for new messages in all folders"),
+                                               NULL, update_folderview_cb, 0, NULL},
        {N_("/_Tools/Delete du_plicated messages"),
+                                               NULL, NULL, 0, "<Branch>"},
+       {N_("/_Tools/Delete du_plicated messages/In selected folder"),
                                                NULL, delete_duplicated_cb,   0, NULL},
+       {N_("/_Tools/Delete du_plicated messages/In all folders"),
+                                               NULL, delete_duplicated_all_cb,   0, NULL},
        {N_("/_Tools/---"),                     NULL, NULL, 0, "<Separator>"},
        {N_("/_Tools/E_xecute"),                "X", execute_summary_cb, 0, NULL},
 #ifdef USE_OPENSSL
@@ -690,15 +752,16 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Configuration/_Edit accounts..."),
                                                NULL, account_edit_open, 0, NULL},
        {N_("/_Configuration/---"),             NULL, NULL, 0, "<Separator>"},
-       {N_("/_Configuration/_Common preferences..."),
-                                               NULL, prefs_common_open_cb, 0, NULL},
-       {N_("/_Configuration/_Scoring..."),
-                                               NULL, prefs_scoring_open_cb, 0, NULL},
+       {N_("/_Configuration/_Preferences..."),
+                                               NULL, prefs_open_cb, 0, NULL},
+       {N_("/_Configuration/Pre-processing..."),
+                                               NULL, prefs_pre_processing_open_cb, 0, NULL},
+       {N_("/_Configuration/Post-processing..."),
+                                               NULL, prefs_post_processing_open_cb, 0, NULL},
        {N_("/_Configuration/_Filtering..."),
                                                NULL, prefs_filtering_open_cb, 0, NULL},
        {N_("/_Configuration/_Templates..."),   NULL, prefs_template_open_cb, 0, NULL},
        {N_("/_Configuration/_Actions..."),     NULL, prefs_actions_open_cb, 0, NULL},
-       {N_("/_Configuration/_Other Preferences..."),  NULL, prefs_open_cb, 0, NULL},
        {N_("/_Configuration/Plugins..."),      NULL, plugins_open_cb, 0, NULL},
 
        {N_("/_Help"),                          NULL, NULL, 0, "<Branch>"},
@@ -747,6 +810,7 @@ MainWindow *main_window_create(SeparateType type)
        GtkWidget *menuitem;
        gint i;
        guint n_menu_entries;
+       gboolean hide_messageview = FALSE;
 
        static GdkGeometry geometry;
 
@@ -799,6 +863,10 @@ MainWindow *main_window_create(SeparateType type)
        handlebox = gtk_handle_box_new();
        gtk_widget_show(handlebox);
        gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
+       gtk_signal_connect(GTK_OBJECT(handlebox), "child_attached",
+                          GTK_SIGNAL_FUNC(toolbar_child_attached), mainwin);
+       gtk_signal_connect(GTK_OBJECT(handlebox), "child_detached",
+                          GTK_SIGNAL_FUNC(toolbar_child_detached), mainwin);
 
        /* link window to mainwin->window to avoid gdk warnings */
        mainwin->window       = window;
@@ -824,16 +892,17 @@ MainWindow *main_window_create(SeparateType type)
        gtk_widget_set_usize(progressbar, 120, 1);
        gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
 
-       online_pixmap = stock_pixmap_widget(hbox_stat, STOCK_PIXMAP_WORK_ONLINE);
-       offline_pixmap = stock_pixmap_widget(hbox_stat, STOCK_PIXMAP_WORK_OFFLINE);
+       online_pixmap = stock_pixmap_widget(hbox_stat, STOCK_PIXMAP_ONLINE);
+       offline_pixmap = stock_pixmap_widget(hbox_stat, STOCK_PIXMAP_OFFLINE);
        online_tip = gtk_tooltips_new();
        online_switch = gtk_button_new ();
-       gtk_tooltips_set_tip(GTK_TOOLTIPS(online_tip),
-                            online_switch, _("Go offline"), NULL);
+       gtk_tooltips_set_tip(GTK_TOOLTIPS(online_tip),online_switch, 
+                            _("You are online. Click the icon to go offline"), NULL);
        offline_tip = gtk_tooltips_new();
        offline_switch = gtk_button_new ();
-       gtk_tooltips_set_tip(GTK_TOOLTIPS(offline_tip),
-                            offline_switch, _("Go online"), NULL);
+       gtk_tooltips_set_tip(GTK_TOOLTIPS(offline_tip),offline_switch, 
+                            _("You are offline. Click the icon to go online"),
+                            NULL);
        gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
        gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
        gtk_signal_connect (GTK_OBJECT(online_switch), "clicked", (GtkSignalFunc)online_switch_clicked, mainwin);
@@ -877,22 +946,22 @@ MainWindow *main_window_create(SeparateType type)
        summaryview->messageview = messageview;
        summaryview->window      = window;
 
-       mainwin->vbox         = vbox;
-       mainwin->menubar      = menubar;
-       mainwin->menu_factory = ifactory;
-       mainwin->handlebox    = handlebox;
-       mainwin->vbox_body    = vbox_body;
-       mainwin->hbox_stat    = hbox_stat;
-       mainwin->statusbar    = statusbar;
-       mainwin->progressbar  = progressbar;
-       mainwin->statuslabel  = statuslabel;
-       mainwin->ac_button    = ac_button;
-       mainwin->ac_label     = ac_label;
-       
-       mainwin->online_switch     = online_switch;
+       messageview->statusbar   = statusbar;
+       mainwin->vbox           = vbox;
+       mainwin->menubar        = menubar;
+       mainwin->menu_factory   = ifactory;
+       mainwin->handlebox      = handlebox;
+       mainwin->vbox_body      = vbox_body;
+       mainwin->hbox_stat      = hbox_stat;
+       mainwin->statusbar      = statusbar;
+       mainwin->progressbar    = progressbar;
+       mainwin->statuslabel    = statuslabel;
+       mainwin->online_switch  = online_switch;
+       mainwin->online_pixmap  = online_pixmap;
+       mainwin->offline_pixmap = offline_pixmap;
+       mainwin->ac_button      = ac_button;
+       mainwin->ac_label       = ac_label;
        mainwin->offline_switch    = offline_switch;
-       mainwin->online_pixmap     = online_pixmap;
-       mainwin->offline_pixmap    = offline_pixmap;
        
        /* set context IDs for status bar */
        mainwin->mainwin_cid = gtk_statusbar_get_context_id
@@ -901,6 +970,10 @@ MainWindow *main_window_create(SeparateType type)
                (GTK_STATUSBAR(statusbar), "Folder View");
        mainwin->summaryview_cid = gtk_statusbar_get_context_id
                (GTK_STATUSBAR(statusbar), "Summary View");
+       mainwin->messageview_cid = gtk_statusbar_get_context_id
+               (GTK_STATUSBAR(statusbar), "Message View");
+
+       messageview->statusbar_cid = mainwin->messageview_cid;
 
        /* allocate colors for summary view and folder view */
        summaryview->color_marked.red = summaryview->color_marked.green = 0;
@@ -934,7 +1007,8 @@ MainWindow *main_window_create(SeparateType type)
        debug_print("done.\n");
 
        messageview->visible = prefs_common.msgview_visible;
-
+       hide_messageview = !messageview->visible;
+       
        main_window_set_widgets(mainwin, type);
 
        gtk_signal_connect(GTK_OBJECT(window), "size_allocate",
@@ -971,14 +1045,6 @@ MainWindow *main_window_create(SeparateType type)
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
                                       prefs_common.show_statusbar);
        
-       gtk_widget_hide(GTK_WIDGET(mainwin->summaryview->hbox_search));
-       
-       if (prefs_common.show_searchbar) {
-               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mainwin->summaryview->toggle_search), TRUE);
-               if (prefs_common.summary_quicksearch_type != S_SEARCH_EXTENDED)
-                       gtk_widget_hide(summaryview->search_description);
-       }
-
        /* set account selection menu */
        ac_menu = gtk_item_factory_get_widget
                (ifactory, "/Configuration/Change current account");
@@ -989,7 +1055,7 @@ MainWindow *main_window_create(SeparateType type)
        toolbar_main_set_sensitive(mainwin);
 
        /* create actions menu */
-       action_update_mainwin_menu(ifactory, mainwin);
+       main_window_update_actions_menu(mainwin);
 
        /* attach accel groups to main window */
 #define        ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win)        \
@@ -997,7 +1063,7 @@ MainWindow *main_window_create(SeparateType type)
                (GTK_WINDOW(win),                       \
                 gtk_item_factory_from_widget(menu)->accel_group)                
        
-       ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu,mainwin->window);
+       ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
        
        /* connect the accelerators for equivalent 
           menu items in different menus             */
@@ -1013,6 +1079,8 @@ MainWindow *main_window_create(SeparateType type)
        summary_init(summaryview);
        messageview_init(messageview);
        log_window_init(mainwin->logwin);
+       log_window_set_clipping(mainwin->logwin, prefs_common.cliplog,
+                               prefs_common.loglength);
 #ifdef USE_OPENSSL
        sslcertwindow_register_hook();
 #endif
@@ -1032,9 +1100,26 @@ MainWindow *main_window_create(SeparateType type)
        if (prefs_common.work_offline)
                online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
 
+       if (mainwin->type == SEPARATE_NONE && hide_messageview)
+               main_window_toggle_message_view(mainwin);
+
        return mainwin;
 }
 
+void main_window_destroy(MainWindow *mainwin)
+{
+       /* TODO : destroy other component */
+       messageview_destroy(mainwin->messageview);
+}
+
+void main_window_update_actions_menu(MainWindow *mainwin)
+{
+       GtkItemFactory *ifactory;
+
+       ifactory = gtk_item_factory_from_widget(mainwin->menubar);
+       action_update_mainwin_menu(ifactory, "/Tools/Actions", mainwin);
+}
+
 void main_window_cursor_wait(MainWindow *mainwin)
 {
 
@@ -1118,13 +1203,13 @@ void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
                        folderview_reflect_prefs_pixmap_theme(mainwin->folderview);
                        summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
 
-                       pixmap = stock_pixmap_widget(mainwin->hbox_stat, STOCK_PIXMAP_WORK_ONLINE);
+                       pixmap = stock_pixmap_widget(mainwin->hbox_stat, STOCK_PIXMAP_ONLINE);
                        gtk_container_remove(GTK_CONTAINER(mainwin->online_switch), 
                                             mainwin->online_pixmap);
                        gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
                        gtk_widget_show(pixmap);
                        mainwin->online_pixmap = pixmap;
-                       pixmap = stock_pixmap_widget(mainwin->hbox_stat, STOCK_PIXMAP_WORK_OFFLINE);
+                       pixmap = stock_pixmap_widget(mainwin->hbox_stat, STOCK_PIXMAP_OFFLINE);
                        gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch), 
                                             mainwin->offline_pixmap);
                        gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
@@ -1149,38 +1234,86 @@ void main_window_set_summary_column(void)
        }
 }
 
-void main_window_set_account_menu(GList *account_list)
+static void main_window_set_account_selector_menu(MainWindow *mainwin,
+                                                 GList *account_list)
 {
-       GList *cur, *cur_ac, *cur_item;
+       GList *cur_ac, *cur_item;
        GtkWidget *menuitem;
-       MainWindow *mainwin;
        PrefsAccount *ac_prefs;
 
-       for (cur = mainwin_list; cur != NULL; cur = cur->next) {
-               mainwin = (MainWindow *)cur->data;
+       /* destroy all previous menu item */
+       cur_item = GTK_MENU_SHELL(mainwin->ac_menu)->children;
+       while (cur_item != NULL) {
+               GList *next = cur_item->next;
+               gtk_widget_destroy(GTK_WIDGET(cur_item->data));
+               cur_item = next;
+       }
 
-               /* destroy all previous menu item */
-               cur_item = GTK_MENU_SHELL(mainwin->ac_menu)->children;
-               while (cur_item != NULL) {
-                       GList *next = cur_item->next;
-                       gtk_widget_destroy(GTK_WIDGET(cur_item->data));
-                       cur_item = next;
-               }
+       for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
+               ac_prefs = (PrefsAccount *)cur_ac->data;
+
+               menuitem = gtk_menu_item_new_with_label
+                       (ac_prefs->account_name
+                        ? ac_prefs->account_name : _("Untitled"));
+               gtk_widget_show(menuitem);
+               gtk_menu_append(GTK_MENU(mainwin->ac_menu), menuitem);
+               gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                                  GTK_SIGNAL_FUNC(account_selector_menu_cb),
+                                  ac_prefs);
+       }
+}
 
-               for (cur_ac = account_list; cur_ac != NULL;
-                    cur_ac = cur_ac->next) {
-                       ac_prefs = (PrefsAccount *)cur_ac->data;
-
-                       menuitem = gtk_menu_item_new_with_label
-                               (ac_prefs->account_name
-                                ? ac_prefs->account_name : _("Untitled"));
-                       gtk_widget_show(menuitem);
-                       gtk_menu_append(GTK_MENU(mainwin->ac_menu), menuitem);
-                       gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                                          GTK_SIGNAL_FUNC(account_menu_cb),
-                                          ac_prefs);
+static void main_window_set_account_receive_menu(MainWindow *mainwin,
+                                                GList *account_list)
+{
+       GList *cur_ac, *cur_item;
+       GtkWidget *menu;
+       GtkWidget *menuitem;
+       PrefsAccount *ac_prefs;
+
+       menu = gtk_item_factory_get_widget(mainwin->menu_factory,
+                                          "/Message/Receive");
+
+       /* search for separator */
+       for (cur_item = GTK_MENU_SHELL(menu)->children; cur_item != NULL;
+            cur_item = cur_item->next) {
+               if (GTK_BIN(cur_item->data)->child == NULL) {
+                       cur_item = cur_item->next;
+                       break;
                }
        }
+
+       /* destroy all previous menu item */
+       while (cur_item != NULL) {
+               GList *next = cur_item->next;
+               gtk_widget_destroy(GTK_WIDGET(cur_item->data));
+               cur_item = next;
+       }
+
+       for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
+               ac_prefs = (PrefsAccount *)cur_ac->data;
+
+               menuitem = gtk_menu_item_new_with_label
+                       (ac_prefs->account_name ? ac_prefs->account_name
+                        : _("Untitled"));
+               gtk_widget_show(menuitem);
+               gtk_menu_append(GTK_MENU(menu), menuitem);
+               gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                                  GTK_SIGNAL_FUNC(account_receive_menu_cb),
+                                  ac_prefs);
+       }
+}
+
+void main_window_set_account_menu(GList *account_list)
+{
+       GList *cur;
+       MainWindow *mainwin;
+
+       for (cur = mainwin_list; cur != NULL; cur = cur->next) {
+               mainwin = (MainWindow *)cur->data;
+               main_window_set_account_selector_menu(mainwin, account_list);
+               main_window_set_account_receive_menu(mainwin, account_list);
+       }
 }
 
 static void main_window_show_cur_account(MainWindow *mainwin)
@@ -1332,6 +1465,9 @@ void main_window_toggle_message_view(MainWindow *mainwin)
                              GTK_ARROW_DOWN, GTK_SHADOW_OUT);
        }
 
+       if (mainwin->messageview->visible == FALSE)
+               messageview_clear(mainwin->messageview);
+
        main_window_set_menu_sensitive(mainwin);
 
        prefs_common.msgview_visible = mainwin->messageview->visible;
@@ -1416,6 +1552,30 @@ void main_window_get_position(MainWindow *mainwin)
        }
 }
 
+void main_window_progress_on(MainWindow *mainwin)
+{
+       gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar), TRUE);
+       gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), "");
+}
+
+void main_window_progress_off(MainWindow *mainwin)
+{
+       gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar), FALSE);
+       gtk_progress_bar_update(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
+       gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), "");
+}
+
+void main_window_progress_set(MainWindow *mainwin, gint cur, gint total)
+{
+       gchar buf[32];
+
+       g_snprintf(buf, sizeof(buf), "%d / %d", cur, total);
+       gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), buf);
+       gtk_progress_bar_update(GTK_PROGRESS_BAR(mainwin->progressbar),
+                               (cur == 0 && total == 0) ? 0 :
+                               (gfloat)cur / (gfloat)total);
+}
+
 void main_window_empty_trash(MainWindow *mainwin, gboolean confirm)
 {
        GList *list;
@@ -1438,7 +1598,7 @@ void main_window_empty_trash(MainWindow *mainwin, gboolean confirm)
                manage_window_focus_in(mainwin->window, NULL, NULL);
        }
 
-       procmsg_empty_trash();
+       procmsg_empty_all_trash();
 
        if (mainwin->summaryview->folder_item &&
            mainwin->summaryview->folder_item->stype == F_TRASH)
@@ -1477,41 +1637,6 @@ void main_window_add_mailbox(MainWindow *mainwin)
        folder_set_ui_func(folder, scan_tree_func, mainwin);
        folder_scan_tree(folder);
        folder_set_ui_func(folder, NULL, NULL);
-
-       folderview_set(mainwin->folderview);
-}
-
-void main_window_add_mbox(MainWindow *mainwin)
-{
-       gchar *path;
-       Folder *folder;
-       FolderItem * item;
-
-       path = input_dialog(_("Add mbox mailbox"),
-                           _("Input the location of mailbox."),
-                           "mail");
-
-       if (!path) return;
-
-       if (folder_find_from_path(path)) {
-               alertpanel_error(_("The mailbox `%s' already exists."), path);
-               g_free(path);
-               return;
-       }
-
-       folder = folder_new(folder_get_class_from_string("mbox"), 
-                           g_basename(path), path);
-       g_free(path);
-
-       if (folder->klass->create_tree(folder) < 0) {
-               alertpanel_error(_("Creation of the mailbox failed."));
-               folder_destroy(folder);
-               return;
-       }
-
-       folder_add(folder);
-
-       folderview_set(mainwin->folderview);
 }
 
 SensitiveCond main_window_get_current_state(MainWindow *mainwin)
@@ -1527,7 +1652,7 @@ SensitiveCond main_window_get_current_state(MainWindow *mainwin)
                state |= M_UNLOCKED;
        if (selection != SUMMARY_NONE)
                state |= M_MSG_EXIST;
-       if (item && item->path && item->parent && !item->no_select) {
+       if (item && item->path && folder_item_parent(item) && !item->no_select) {
                state |= M_EXEC;
                /*              if (item->folder->type != F_NEWS) */
                state |= M_ALLOW_DELETE;
@@ -1582,22 +1707,23 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
        GtkItemFactory *ifactory = mainwin->menu_factory;
        SensitiveCond state;
        gboolean sensitive;
+       GtkWidget *menu;
        GtkWidget *menuitem;
        SummaryView *summaryview;
        gchar *menu_path;
        gint i;
+       GList *cur_item;
 
        static const struct {
                gchar *const entry;
                SensitiveCond cond;
        } entry[] = {
-               {"/File/Folder"                               , M_UNLOCKED},
                {"/File/Add mailbox"                          , M_UNLOCKED},
 
                 {"/File/Add mailbox/MH..."                   , M_UNLOCKED},
-               {"/File/Add mailbox/mbox..."                  , M_UNLOCKED},
+               {"/File/Change folder order"                  , M_UNLOCKED},
                {"/File/Export to mbox file..."               , M_UNLOCKED},
-               {"/File/Empty trash"                          , M_UNLOCKED},
+               {"/File/Empty all Trash folders"              , M_UNLOCKED},
                {"/File/Work offline"                         , M_UNLOCKED},
 
                {"/File/Save as...", M_TARGET_EXIST|M_UNLOCKED},
@@ -1624,29 +1750,34 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"/View/Show all headers"          , M_SINGLE_TARGET_EXIST},
                {"/View/Message source"            , M_SINGLE_TARGET_EXIST},
 
-               {"/Message/Get new mail"          , M_HAVE_ACCOUNT|M_UNLOCKED},
-               {"/Message/Get from all accounts" , M_HAVE_ACCOUNT|M_UNLOCKED},
-               {"/Message/Cancel receiving"      , M_INC_ACTIVE},
+               {"/Message/Receive/Get from current account"
+                                                , M_HAVE_ACCOUNT|M_UNLOCKED},
+               {"/Message/Receive/Get from all accounts"
+                                                , M_HAVE_ACCOUNT|M_UNLOCKED},
+               {"/Message/Receive/Cancel receiving"
+                                                , M_INC_ACTIVE},
+
                {"/Message/Compose a news message", M_HAVE_NEWS_ACCOUNT},
                {"/Message/Reply"                 , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
                {"/Message/Reply to"             , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
                {"/Message/Follow-up and reply to", M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST|M_NEWS},
                {"/Message/Forward"               , M_HAVE_ACCOUNT|M_TARGET_EXIST},
                {"/Message/Redirect"              , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
-               {"/Message/Re-edit"               , M_HAVE_ACCOUNT|M_ALLOW_REEDIT},
                {"/Message/Move..."               , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
                {"/Message/Copy..."               , M_TARGET_EXIST|M_EXEC|M_UNLOCKED},
                {"/Message/Delete"                , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NOT_NEWS},
                {"/Message/Cancel a news message" , M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED|M_NEWS},
                {"/Message/Mark"                  , M_TARGET_EXIST},
+               {"/Message/Re-edit"              , M_HAVE_ACCOUNT|M_ALLOW_REEDIT},
 
-               {"/Tools/Add sender to address book", M_SINGLE_TARGET_EXIST},
-               {"/Tools/Harvest addresses"         , M_UNLOCKED},
-               {"/Tools/Filter messages"           , M_MSG_EXIST|M_EXEC|M_UNLOCKED},
-               {"/Tools/Create filter rule"        , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
-               {"/Tools/Actions"                   , M_TARGET_EXIST|M_UNLOCKED},
-               {"/Tools/Execute"                   , M_DELAY_EXEC},
-               {"/Tools/Delete duplicated messages", M_MSG_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
+               {"/Tools/Add sender to address book"   , M_SINGLE_TARGET_EXIST},
+               {"/Tools/Harvest addresses"            , M_UNLOCKED},
+               {"/Tools/Filter all messages in folder", M_MSG_EXIST|M_EXEC|M_UNLOCKED},
+               {"/Tools/Filter selected messages"     , M_TARGET_EXIST|M_EXEC|M_UNLOCKED},
+               {"/Tools/Create filter rule"           , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
+               {"/Tools/Actions"                      , M_TARGET_EXIST|M_UNLOCKED},
+               {"/Tools/Execute"                      , M_DELAY_EXEC},
+               {"/Tools/Delete duplicated messages/In selected folder"   , M_MSG_EXIST|M_ALLOW_DELETE|M_UNLOCKED},
 
                {"/Configuration", M_UNLOCKED},
 
@@ -1660,6 +1791,22 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                menu_set_sensitive(ifactory, entry[i].entry, sensitive);
        }
 
+       menu = gtk_item_factory_get_widget(ifactory, "/Message/Receive");
+
+       /* search for separator */
+       for (cur_item = GTK_MENU_SHELL(menu)->children; cur_item != NULL;
+            cur_item = cur_item->next) {
+               if (GTK_BIN(cur_item->data)->child == NULL) {
+                       cur_item = cur_item->next;
+                       break;
+               }
+       }
+
+       for (; cur_item != NULL; cur_item = cur_item->next) {
+               gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
+                                        (M_UNLOCKED & state) != 0);
+       }
+
        main_window_menu_callback_block(mainwin);
 
 #define SET_CHECK_MENU_ACTIVE(path, active) \
@@ -1720,7 +1867,7 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
        }
 
        SET_CHECK_MENU_ACTIVE("/View/Show all headers",
-                             mainwin->messageview->textview->show_all_headers);
+                             mainwin->messageview->mimeview->textview->show_all_headers);
        SET_CHECK_MENU_ACTIVE("/View/Thread view", (state & M_THREADED) != 0);
 
 #undef SET_CHECK_MENU_ACTIVE
@@ -1838,6 +1985,7 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                if (prefs_common.folderview_visible)
                        gtk_widget_show(folderwin);
        }
+
        if (type & SEPARATE_MESSAGE) {
                messagewin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
                gtk_window_set_title(GTK_WINDOW(messagewin),
@@ -1855,6 +2003,9 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                                   mainwin);
                if (messageview_is_visible(mainwin->messageview))
                        gtk_widget_show(messagewin);
+       } else {
+               mainwin->messageview->statusbar = mainwin->statusbar;
+               mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
        }
 
        gtk_widget_set_usize(GTK_WIDGET_PTR(mainwin->folderview),
@@ -1949,12 +2100,23 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
 
                break;
        case SEPARATE_BOTH:
+               messageview_add_toolbar(mainwin->messageview, messagewin);
+               msgview_ifactory = gtk_item_factory_from_widget(mainwin->messageview->menubar);
+               menu_set_sensitive(msgview_ifactory, "/File/Close", FALSE);
+
                gtk_box_pack_start(GTK_BOX(vbox_body),
                                   GTK_WIDGET_PTR(mainwin->summaryview),
                                   TRUE, TRUE, 0);
-
+               
                mainwin->win.sep_both.folderwin = folderwin;
                mainwin->win.sep_both.messagewin = messagewin;
+               
+               gtk_widget_realize(messagewin);
+               gtk_widget_show_all(GTK_WIDGET_PTR(mainwin->messageview));
+               gtk_widget_show_all(messagewin);
+               toolbar_set_style(mainwin->messageview->toolbar->toolbar, 
+                                 mainwin->messageview->handlebox, 
+                                 prefs_common.toolbar_style);          
 
                break;
        }
@@ -1970,15 +2132,13 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
         * and mimeview icon list/ctree lose track of their visibility states */
        if (!noticeview_is_visible(mainwin->messageview->noticeview)) 
                gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
+       if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview)) 
+               gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
        if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mainwin->messageview->mimeview->mime_toggle)))
                gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
        else 
                gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
 
-       /* rehide quick search if necessary */
-       if (!prefs_common.show_searchbar)
-               gtk_widget_hide(mainwin->summaryview->hbox_search);
-       
        mainwin->type = type;
 
 
@@ -2058,6 +2218,18 @@ static void toolbar_account_button_pressed(GtkWidget *widget,
 }
 #endif
 
+static void toolbar_child_attached(GtkWidget *widget, GtkWidget *child,
+                                  gpointer data)
+{
+       gtk_widget_set_usize(child, 1, -1);
+}
+
+static void toolbar_child_detached(GtkWidget *widget, GtkWidget *child,
+                                  gpointer data)
+{
+       gtk_widget_set_usize(child, -1, -1);
+}
+
 static void ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
                                    gpointer data)
 {
@@ -2120,6 +2292,9 @@ static gint message_window_close_cb(GtkWidget *widget, GdkEventAny *event,
                (mainwin->menu_factory, "/View/Show or hide/Message view");
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
 
+       mainwin->messageview->statusbar = mainwin->statusbar;
+       mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
+
        return TRUE;
 }
 
@@ -2156,12 +2331,6 @@ static void add_mailbox_cb(MainWindow *mainwin, guint action,
        main_window_add_mailbox(mainwin);
 }
 
-static void add_mbox_cb(MainWindow *mainwin, guint action,
-                       GtkWidget *widget)
-{
-       main_window_add_mbox(mainwin);
-}
-
 static void update_folderview_cb(MainWindow *mainwin, guint action,
                                 GtkWidget *widget)
 {
@@ -2169,22 +2338,10 @@ static void update_folderview_cb(MainWindow *mainwin, guint action,
        folderview_check_new_all();
 }
 
-static void new_folder_cb(MainWindow *mainwin, guint action,
-                         GtkWidget *widget)
-{
-       folderview_new_folder(mainwin->folderview);
-}
-
-static void rename_folder_cb(MainWindow *mainwin, guint action,
-                            GtkWidget *widget)
+static void foldersort_cb(MainWindow *mainwin, guint action,
+                           GtkWidget *widget)
 {
-       folderview_rename_folder(mainwin->folderview);
-}
-
-static void delete_folder_cb(MainWindow *mainwin, guint action,
-                            GtkWidget *widget)
-{
-       folderview_delete_folder(mainwin->folderview);
+       foldersort_open();
 }
 
 static void import_mbox_cb(MainWindow *mainwin, guint action,
@@ -2199,6 +2356,12 @@ static void export_mbox_cb(MainWindow *mainwin, guint action,
        export_mbox(mainwin->summaryview->folder_item);
 }
 
+static void export_list_mbox_cb(MainWindow *mainwin, guint action,
+                               GtkWidget *widget)
+{
+       summaryview_export_mbox_list(mainwin->summaryview);
+}
+
 static void empty_trash_cb(MainWindow *mainwin, guint action,
                           GtkWidget *widget)
 {
@@ -2292,16 +2455,12 @@ void main_window_reply_cb(MainWindow *mainwin, guint action,
 {
        MessageView *msgview = (MessageView*)mainwin->messageview;
        GSList *msginfo_list = NULL;
-       gchar *body;
 
        g_return_if_fail(msgview != NULL);
 
        msginfo_list = summary_get_selection(mainwin->summaryview);
        g_return_if_fail(msginfo_list != NULL);
-       
-       body = messageview_get_selection(msgview);
-       compose_reply_mode((ComposeMode)action, msginfo_list, body);
-       g_free(body);
+       compose_reply_from_messageview(msgview, msginfo_list, action);
        g_slist_free(msginfo_list);
 }
 
@@ -2434,11 +2593,6 @@ static void show_all_header_cb(MainWindow *mainwin, guint action,
                                     GTK_CHECK_MENU_ITEM(widget)->active);
 }
 
-static void reedit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
-{
-       summary_reedit(mainwin->summaryview);
-}
-
 static void mark_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
 {
        summary_mark(mainwin->summaryview);
@@ -2467,6 +2621,11 @@ static void mark_all_read_cb(MainWindow *mainwin, guint action,
        summary_mark_all_read(mainwin->summaryview);
 }
 
+static void reedit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
+{
+       summary_reedit(mainwin->summaryview);
+}
+
 static void add_address_cb(MainWindow *mainwin, guint action,
                           GtkWidget *widget)
 {
@@ -2480,15 +2639,29 @@ static void set_charset_cb(MainWindow *mainwin, guint action,
 
        if (GTK_CHECK_MENU_ITEM(widget)->active) {
                str = conv_get_charset_str((CharSet)action);
-               g_free(prefs_common.force_charset);
-               prefs_common.force_charset = str ? g_strdup(str) : NULL;
-
+               
+               g_free(mainwin->messageview->forced_charset);
+               mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
+               procmime_force_charset(str);
+               
                summary_redisplay_msg(mainwin->summaryview);
                
                debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
        }
 }
 
+static void set_decode_cb(MainWindow *mainwin, guint action,
+                          GtkWidget *widget)
+{
+       if (GTK_CHECK_MENU_ITEM(widget)->active) {
+               mainwin->messageview->forced_encoding = (EncodingType)action;
+               
+               summary_redisplay_msg(mainwin->summaryview);
+               
+               debug_print("forced encoding: %d\n", action);
+       }
+}
+
 static void hide_read_messages (MainWindow *mainwin, guint action,
                                GtkWidget *widget)
 {
@@ -2568,12 +2741,52 @@ static void attract_by_subject_cb(MainWindow *mainwin, guint action,
 static void delete_duplicated_cb(MainWindow *mainwin, guint action,
                                 GtkWidget *widget)
 {
-       summary_delete_duplicated(mainwin->summaryview);
+       FolderItem *item;
+
+       item = folderview_get_selected_item(mainwin->folderview);
+       if (item) {
+               main_window_cursor_wait(mainwin);
+               STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
+
+               folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
+                                             DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
+
+               STATUSBAR_POP(mainwin);
+               main_window_cursor_normal(mainwin);
+       }
+}
+
+struct DelDupsData
+{
+       guint   dups;
+       guint   folders;
+};
+
+static void deldup_all(FolderItem *item, gpointer _data)
+{
+       struct DelDupsData *data = _data;
+       gint result;
+       
+       result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
+       if (result >= 0) {
+               data->dups += result;
+               data->folders += 1;
+       }
+}
+
+static void delete_duplicated_all_cb(MainWindow *mainwin, guint action,
+                                GtkWidget *widget)
+{
+       struct DelDupsData data = {0, 0};
+
+       folder_func_to_all_folders(deldup_all, &data);
+       alertpanel_notice(_("Deleted %d duplicate message(s) in %d folders.\n"),
+                         data.dups, data.folders);
 }
 
 static void filter_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
 {
-       summary_filter(mainwin->summaryview);
+       summary_filter(mainwin->summaryview, (gboolean)action);
 }
 
 static void execute_summary_cb(MainWindow *mainwin, guint action,
@@ -2680,8 +2893,7 @@ static void allsel_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
        if (GTK_WIDGET_HAS_FOCUS(mainwin->summaryview->ctree))
                summary_select_all(mainwin->summaryview);
        else if (messageview_is_visible(msgview) &&
-                (GTK_WIDGET_HAS_FOCUS(msgview->textview->text) ||
-                 GTK_WIDGET_HAS_FOCUS(msgview->mimeview->textview->text)))
+                (GTK_WIDGET_HAS_FOCUS(msgview->mimeview->textview->text)))
                messageview_select_all(mainwin->messageview);
 }
 
@@ -2694,25 +2906,43 @@ static void select_thread_cb(MainWindow *mainwin, guint action,
 static void create_filter_cb(MainWindow *mainwin, guint action,
                             GtkWidget *widget)
 {
-       summary_filter_open(mainwin->summaryview, (PrefsFilterType)action);
+       summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
+}
+
+static void create_processing_cb(MainWindow *mainwin, guint action,
+                            GtkWidget *widget)
+{
+       summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
 }
 
 static void prefs_common_open_cb(MainWindow *mainwin, guint action,
                                 GtkWidget *widget)
 {
-       prefs_common_open();
+       /* prefs_common_open(); */
 }
 
-static void prefs_scoring_open_cb(MainWindow *mainwin, guint action,
-                                 GtkWidget *widget)
+static void prefs_pre_processing_open_cb(MainWindow *mainwin, guint action,
+                                        GtkWidget *widget)
+{
+       prefs_filtering_open(&pre_global_processing,
+                            _("Processing rules to apply before folder rules"),
+                            NULL, NULL);
+}
+
+static void prefs_post_processing_open_cb(MainWindow *mainwin, guint action,
+                                         GtkWidget *widget)
 {
-       prefs_scoring_open(NULL);
+       prefs_filtering_open(&post_global_processing,
+                            _("Processing rules to apply after folder rules"),
+                            NULL, NULL);
 }
 
 static void prefs_filtering_open_cb(MainWindow *mainwin, guint action,
                                    GtkWidget *widget)
 {
-       prefs_filtering_open(NULL, NULL, NULL);
+       prefs_filtering_open(&filtering_rules,
+                            _("Filtering configuration"),
+                            NULL, NULL);
 }
 
 static void prefs_template_open_cb(MainWindow *mainwin, guint action,
@@ -2750,12 +2980,20 @@ static void new_account_cb(MainWindow *mainwin, guint action,
        if (!compose_get_compose_list()) account_add();
 }
 
-static void account_menu_cb(GtkMenuItem        *menuitem, gpointer data)
+static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
 {
        cur_account = (PrefsAccount *)data;
        main_window_reflect_prefs_all();
 }
 
+static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
+{
+       MainWindow *mainwin = (MainWindow *)mainwin_list->data;
+       PrefsAccount *account = (PrefsAccount *)data;
+
+       inc_account_mail(mainwin, account);
+}
+
 static void prefs_open_cb(GtkMenuItem *menuitem, gpointer data)
 {
        prefs_gtk_open();
@@ -2799,6 +3037,11 @@ static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focu
        g_return_val_if_fail(data, FALSE);
        summary = ((MainWindow *)data)->summaryview;
        g_return_val_if_fail(summary, FALSE);
+
+       if (GTK_CLIST(summary->ctree)->selection && 
+           g_list_length(GTK_CLIST(summary->ctree)->selection) > 1)
+               return FALSE;
+
        if (summary->selected != summary->displayed)
                summary_select_node(summary, summary->displayed, FALSE, TRUE);
        return FALSE;
@@ -2890,4 +3133,3 @@ gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
 /*
 * End of Source.
 */
-