replace deprecated gtk_progress*
[claws.git] / src / mainwindow.c
index a9c4bf783859ee2545a040e5ac65e1238dbec6c0..4aad56ca4c7da0080b2a7f455145ef65705d8ff1 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 gboolean 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 gboolean ac_label_button_pressed                (GtkWidget      *widget,
                                                 GdkEventButton *event,
                                                 gpointer        data);
@@ -133,24 +145,15 @@ 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);
@@ -214,10 +217,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 +247,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);
@@ -286,6 +290,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 +352,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 +368,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 +389,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 +433,18 @@ 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/Change folder order"),      NULL, foldersort_cb,  0, NULL},
        {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/---"),                      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 +573,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,
@@ -609,11 +622,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 +645,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 +658,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 +671,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 +684,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
@@ -692,8 +726,10 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {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/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},
@@ -714,6 +750,24 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Help/_About"),                   NULL, about_show, 0, NULL}
 };
 
+static gboolean main_window_accel_activate (GtkAccelGroup *accelgroup,
+                                            GObject *arg1,
+                                            guint value,
+                                            GdkModifierType mod,
+                                            gpointer user_data) 
+{
+       MainWindow *mainwin = (MainWindow *)user_data;
+
+       if (mainwin->summaryview &&
+           mainwin->summaryview->quicksearch &&
+           quicksearch_has_focus(mainwin->summaryview->quicksearch) &&
+           (mod == 0 || mod == GDK_SHIFT_MASK)) {
+               quicksearch_pass_key(mainwin->summaryview->quicksearch, value, mod);
+               return TRUE;
+       }
+       return FALSE;
+}
+
 MainWindow *main_window_create(SeparateType type)
 {
        MainWindow *mainwin;
@@ -756,8 +810,7 @@ MainWindow *main_window_create(SeparateType type)
        /* main window */
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
-       gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
-       gtk_window_set_wmclass(GTK_WINDOW(window), "main_window", "Sylpheed");
+       gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
 
        if (!geometry.min_height) {
                geometry.min_width = 320;
@@ -799,6 +852,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);
+       g_signal_connect(G_OBJECT(handlebox), "child_attached",
+                        G_CALLBACK(toolbar_child_attached), mainwin);
+       g_signal_connect(G_OBJECT(handlebox), "child_detached",
+                        G_CALLBACK(toolbar_child_detached), mainwin);
 
        /* link window to mainwin->window to avoid gdk warnings */
        mainwin->window       = window;
@@ -824,16 +881,17 @@ MainWindow *main_window_create(SeparateType type)
        gtk_widget_set_size_request(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);
        g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
@@ -852,7 +910,7 @@ MainWindow *main_window_create(SeparateType type)
                             ac_button, _("Select account"), NULL);
        gtk_button_set_relief(GTK_BUTTON(ac_button), GTK_RELIEF_NONE);
        GTK_WIDGET_UNSET_FLAGS(ac_button, GTK_CAN_FOCUS);
-       gtk_widget_set_size_request(ac_button, -1, 1);
+       gtk_widget_set_size_request(ac_button, -1, 0);
        gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
        g_signal_connect(G_OBJECT(ac_button), "button_press_event",
                         G_CALLBACK(ac_label_button_pressed), mainwin);
@@ -877,22 +935,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 +959,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;
@@ -971,14 +1033,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,15 +1043,19 @@ 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)        \
-       gtk_window_add_accel_group                      \
-               (GTK_WINDOW(win),                       \
-                gtk_item_factory_from_widget(menu)->accel_group)                
+#define        ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win)                        \
+       gtk_window_add_accel_group                                      \
+               (GTK_WINDOW(win),                                       \
+                gtk_item_factory_from_widget(menu)->accel_group);      \
+       g_signal_connect(G_OBJECT(gtk_item_factory_from_widget(menu)->accel_group), \
+                       "accel_activate",                               \
+                       G_CALLBACK(main_window_accel_activate), mainwin);
+                        
        
-       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 +1071,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
@@ -1035,6 +1095,20 @@ MainWindow *main_window_create(SeparateType type)
        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 +1192,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,39 +1223,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);
+               g_signal_connect(G_OBJECT(menuitem), "activate",
+                                G_CALLBACK(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_shell_append(GTK_MENU_SHELL(mainwin->ac_menu),
-                                             menuitem);
-                       g_signal_connect(G_OBJECT(menuitem), "activate",
-                                        G_CALLBACK(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);
+               g_signal_connect(G_OBJECT(menuitem), "activate",
+                                G_CALLBACK(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)
@@ -1333,6 +1454,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;
@@ -1376,7 +1500,7 @@ void main_window_get_size(MainWindow *mainwin)
                prefs_common.msgview_height = allocation->height;
        }
 
-       debug_print("summaryview size: %d x %d\n",
+/*     debug_print("summaryview size: %d x %d\n",
                    prefs_common.summaryview_width,
                    prefs_common.summaryview_height);
        debug_print("folderview size: %d x %d\n",
@@ -1384,7 +1508,7 @@ void main_window_get_size(MainWindow *mainwin)
                    prefs_common.folderview_height);
        debug_print("messageview size: %d x %d\n",
                    prefs_common.msgview_width,
-                   prefs_common.msgview_height);
+                   prefs_common.msgview_height); */
 }
 
 void main_window_get_position(MainWindow *mainwin)
@@ -1417,6 +1541,28 @@ void main_window_get_position(MainWindow *mainwin)
        }
 }
 
+void main_window_progress_on(MainWindow *mainwin)
+{
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
+}
+
+void main_window_progress_off(MainWindow *mainwin)
+{
+       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(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_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), buf);
+       gtk_progress_bar_set_fraction(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;
@@ -1478,41 +1624,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)
@@ -1528,7 +1639,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;
@@ -1583,20 +1694,21 @@ 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/Work offline"                         , M_UNLOCKED},
@@ -1625,29 +1737,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},
 
@@ -1661,6 +1778,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) \
@@ -1721,7 +1854,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
@@ -1822,10 +1955,7 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                folderwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
                gtk_window_set_title(GTK_WINDOW(folderwin),
                                     _("Sylpheed - Folder View"));
-               gtk_window_set_wmclass(GTK_WINDOW(folderwin),
-                                      "folder_view", "Sylpheed");
-               gtk_window_set_policy(GTK_WINDOW(folderwin),
-                                     TRUE, TRUE, FALSE);
+               gtk_window_set_resizable(GTK_WINDOW(folderwin), TRUE);
                gtk_window_move(GTK_WINDOW(folderwin), prefs_common.folderwin_x,
                                prefs_common.folderwin_y);
                gtk_container_set_border_width(GTK_CONTAINER(folderwin),
@@ -1843,20 +1973,18 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                messagewin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
                gtk_window_set_title(GTK_WINDOW(messagewin),
                                     _("Sylpheed - Message View"));
-               gtk_window_set_wmclass(GTK_WINDOW(messagewin),
-                                      "message_view", "Sylpheed");
-               gtk_window_set_policy(GTK_WINDOW(messagewin),
-                                     TRUE, TRUE, FALSE);
-               gtk_window_move(GTK_WINDOW(messagewin), prefs_common.main_msgwin_x,
+               gtk_window_set_resizable(GTK_WINDOW(messagewin), TRUE);
+               gtk_window_move(GTK_WINDOW(messagewin), 
+                               prefs_common.main_msgwin_x,
                                prefs_common.main_msgwin_y);
+               gtk_widget_set_size_request(messagewin, 
+                                           prefs_common.msgwin_width,
+                                           prefs_common.msgwin_height);
                gtk_container_set_border_width(GTK_CONTAINER(messagewin),
                                               BORDER_WIDTH);
                g_signal_connect(G_OBJECT(messagewin), "delete_event",
                                 G_CALLBACK(message_window_close_cb),
                                 mainwin);
-               gtk_container_add(GTK_CONTAINER(messagewin),
-                                 GTK_WIDGET_PTR(mainwin->messageview));
-               gtk_widget_realize(messagewin);
                if (messageview_is_visible(mainwin->messageview))
                        gtk_widget_show(messagewin);
        }
@@ -1944,14 +2072,32 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                mainwin->win.sep_message.messagewin = messagewin;
                mainwin->win.sep_message.hpaned     = hpaned;
 
+               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;
        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;
        }
@@ -1967,15 +2113,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;
 
 
@@ -2057,8 +2201,20 @@ static gboolean 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 gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
-                                       gpointer data)
+                                   gpointer data)
 {
        MainWindow *mainwin = (MainWindow *)data;
 
@@ -2157,12 +2313,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)
 {
@@ -2170,22 +2320,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,
@@ -2435,11 +2573,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);
@@ -2468,6 +2601,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)
 {
@@ -2545,6 +2683,7 @@ static void sort_summary_cb(MainWindow *mainwin, guint action,
                summary_sort(mainwin->summaryview, (FolderSortKey)action,
                             GTK_CHECK_MENU_ITEM(menuitem)->active
                             ? SORT_ASCENDING : SORT_DESCENDING);
+               item->sort_key = action;
        }
 }
 
@@ -2569,12 +2708,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(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,
@@ -2681,8 +2860,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);
 }
 
@@ -2695,7 +2873,13 @@ 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,
@@ -2704,16 +2888,28 @@ static void prefs_common_open_cb(MainWindow *mainwin, guint action,
        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,
@@ -2751,12 +2947,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();
@@ -2800,6 +3004,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;
@@ -2808,19 +3017,23 @@ static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focu
 #define BREAK_ON_MODIFIER_KEY() \
        if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
 
-void mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
+gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
                                    gpointer data)
 {
        MainWindow *mainwin = (MainWindow*) data;
        
-       if (!mainwin || !event) return;
-               
+       if (!mainwin || !event) 
+               return FALSE;
+
+       if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
+               return FALSE;
+
        switch (event->keyval) {
        case GDK_Q:             /* Quit */
                BREAK_ON_MODIFIER_KEY();
 
                app_exit_cb(mainwin, 0, NULL);
-               return;
+               return FALSE;
        case GDK_space:
                if (mainwin->folderview && mainwin->summaryview
                    && !mainwin->summaryview->displayed) {
@@ -2832,6 +3045,7 @@ void mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
        default:
                break;
        }
+       return FALSE;
 }
 
 #undef BREAK_ON_MODIFIER_KEY
@@ -2877,10 +3091,10 @@ gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
        switch (data->cmd) {
        case PROGRESS_COMMAND_START:
        case PROGRESS_COMMAND_STOP:
-               gtk_progress_set_percentage(GTK_PROGRESS(mainwin->progressbar), 0.0);
-               break;
+/*             gtk_progress_set_percentage(GTK_PROGRESS(mainwin->progressbar), 0.0);
+               break; */
        case PROGRESS_COMMAND_SET_PERCENTAGE:
-               gtk_progress_set_percentage(GTK_PROGRESS(mainwin->progressbar), data->value);
+/*             gtk_progress_set_percentage(GTK_PROGRESS(mainwin->progressbar), data->value); */
                break;          
        }
        while (gtk_events_pending()) gtk_main_iteration ();