add 'Sort by locked/score'
[claws.git] / src / mainwindow.c
index a5e5747466bc2776009511f4aef6cb21f7c001c4..36a7e4ffb50fa663fdf12a8475f880c5f3b5580e 100644 (file)
@@ -169,18 +169,26 @@ static void toolbar_prefs_cb              (GtkWidget      *widget,
 static void toolbar_account_cb         (GtkWidget      *widget,
                                         gpointer        data);
 
+#if 0
 static void toolbar_account_button_pressed     (GtkWidget      *widget,
                                                 GdkEventButton *event,
                                                 gpointer        data);
+#endif
 static void ac_label_button_pressed            (GtkWidget      *widget,
                                                 GdkEventButton *event,
                                                 gpointer        data);
 static void ac_menu_popup_closed               (GtkMenuShell   *menu_shell,
                                                 gpointer        data);
 
-static gint main_window_close_cb (GtkWidget    *widget,
-                                 GdkEventAny   *event,
-                                 gpointer       data);
+static gint main_window_close_cb       (GtkWidget      *widget,
+                                        GdkEventAny    *event,
+                                        gpointer        data);
+static gint folder_window_close_cb     (GtkWidget      *widget,
+                                        GdkEventAny    *event,
+                                        gpointer        data);
+static gint message_window_close_cb    (GtkWidget      *widget,
+                                        GdkEventAny    *event,
+                                        gpointer        data);
 
 static void add_mailbox_cb      (MainWindow    *mainwin,
                                  guint          action,
@@ -341,12 +349,22 @@ static void hide_read_messages   (MainWindow      *mainwin,
 static void thread_cb           (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void expand_threads_cb   (MainWindow    *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
+static void collapse_threads_cb         (MainWindow    *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
+
 static void set_display_item_cb         (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
 static void sort_summary_cb     (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void sort_summary_type_cb (MainWindow   *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
 static void attract_by_subject_cb(MainWindow   *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
@@ -523,21 +541,29 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_View/Ex_pand Message View"),     "<shift>V", toggle_expand_messageview_cb, 0, "<ToggleItem>"},
        {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_View/_Sort"),                    NULL, NULL, 0, "<Branch>"},
-       {N_("/_View/_Sort/Sort by _number"),    NULL, sort_summary_cb, SORT_BY_NUMBER, NULL},
-       {N_("/_View/_Sort/Sort by s_ize"),      NULL, sort_summary_cb, SORT_BY_SIZE, NULL},
-       {N_("/_View/_Sort/Sort by _date"),      NULL, sort_summary_cb, SORT_BY_DATE, NULL},
-       {N_("/_View/_Sort/Sort by _from"),      NULL, sort_summary_cb, SORT_BY_FROM, NULL},
-       {N_("/_View/_Sort/Sort by _subject"),   NULL, sort_summary_cb, SORT_BY_SUBJECT, NULL},
-       {N_("/_View/_Sort/Sort by _color label"),
-                                               NULL, sort_summary_cb, SORT_BY_LABEL, NULL},
-       {N_("/_View/_Sort/Sort by _mark"),      NULL, sort_summary_cb, SORT_BY_MARK, NULL},
-       {N_("/_View/_Sort/Sort by _unread"),    NULL, sort_summary_cb, SORT_BY_UNREAD, NULL},
-       {N_("/_View/_Sort/Sort by a_ttachment"),
-                                               NULL, sort_summary_cb, SORT_BY_MIME, NULL},
+       {N_("/_View/_Sort/by _number"),         NULL, sort_summary_cb, SORT_BY_NUMBER, "<RadioItem>"},
+       {N_("/_View/_Sort/by s_ize"),           NULL, sort_summary_cb, SORT_BY_SIZE, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by _date"),           NULL, sort_summary_cb, SORT_BY_DATE, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by _from"),           NULL, sort_summary_cb, SORT_BY_FROM, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by _subject"),        NULL, sort_summary_cb, SORT_BY_SUBJECT, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by _color label"),
+                                               NULL, sort_summary_cb, SORT_BY_LABEL, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by _mark"),           NULL, sort_summary_cb, SORT_BY_MARK, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by _unread"),         NULL, sort_summary_cb, SORT_BY_UNREAD, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by a_ttachment"),
+                                               NULL, sort_summary_cb, SORT_BY_MIME, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by score"),           NULL, sort_summary_cb, SORT_BY_SCORE, "/View/Sort/by number"},
+       {N_("/_View/_Sort/by locked"),          NULL, sort_summary_cb, SORT_BY_LOCKED, "/View/Sort/by number"},
+       {N_("/_View/_Sort/D_on't sort"),        NULL, sort_summary_cb, SORT_BY_NONE, "/View/Sort/by number"},
+       {N_("/_View/_Sort/---"),                NULL, NULL, 0, "<Separator>"},
+       {N_("/_View/_Sort/Ascending"),          NULL, sort_summary_type_cb, SORT_ASCENDING, "<RadioItem>"},
+       {N_("/_View/_Sort/Descending"),         NULL, sort_summary_type_cb, SORT_DESCENDING, "/View/Sort/Ascending"},
        {N_("/_View/_Sort/---"),                NULL, NULL, 0, "<Separator>"},
        {N_("/_View/_Sort/_Attract by subject"),
                                                NULL, attract_by_subject_cb, 0, NULL},
-       {N_("/_View/Th_read view"),             "<control>T",        thread_cb, 0, "<ToggleItem>"},
+       {N_("/_View/Th_read view"),             "<control>T", thread_cb, 0, "<ToggleItem>"},
+       {N_("/_View/E_xpand all threads"),      NULL, expand_threads_cb, 0, NULL},
+       {N_("/_View/Co_llapse all threads"),    NULL, collapse_threads_cb, 0, NULL},
        {N_("/_View/_Hide read messages"),      NULL, hide_read_messages, 0, "<ToggleItem>"},
        {N_("/_View/Set display _item..."),     NULL, set_display_item_cb, 0, NULL},
 
@@ -649,7 +675,7 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_View/Mess_age source"),          "<control>U", view_source_cb, 0, NULL},
        {N_("/_View/Show all _header"),         "<control>H", show_all_header_cb, 0, "<ToggleItem>"},
        {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
-       {N_("/_View/_Update"),                  "<control><alt>U", update_summary_cb,  0, NULL},
+       {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},
@@ -666,7 +692,7 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Message/Follow-up and reply to"), NULL, reply_cb, COMPOSE_FOLLOWUP_AND_REPLY_TO, NULL},
        {N_("/_Message/Reply to a_ll"),         "<shift><control>R", reply_cb, COMPOSE_REPLY_TO_ALL, NULL},
        {N_("/_Message/_Forward"),              "<control><alt>F", reply_cb, COMPOSE_FORWARD, NULL},
-       {N_("/_Message/Bounce"),                NULL, reply_cb, COMPOSE_BOUNCE, NULL},
+       {N_("/_Message/Redirect"),              NULL, 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>"},
@@ -849,6 +875,7 @@ MainWindow *main_window_create(SeparateType type)
                                 n_menu_entries, "<Main>", mainwin);
        gtk_widget_show(menubar);
        gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
+       ifactory = gtk_item_factory_from_widget(menubar);
 
        handlebox = gtk_handle_box_new();
        gtk_widget_show(handlebox);
@@ -1270,6 +1297,9 @@ void main_window_separation_change(MainWindow *mainwin, SeparateType type)
        GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
        GtkWidget *message_wid = GTK_WIDGET_PTR(mainwin->messageview);
 
+       debug_print(_("Changing window separation type from %d to %d\n"),
+                   mainwin->type, type);
+
        if (mainwin->type == type) return;
 
        /* remove widgets from those containers */
@@ -1549,39 +1579,41 @@ void main_window_set_toolbar_sensitive(MainWindow *mainwin)
 {
        SensitiveCond state;
        gboolean sensitive;
-       gint i;
+       gint i = 0;
 
        struct {
                GtkWidget *widget;
                SensitiveCond cond;
        } entry[11];
 
-       entry[0].widget  = mainwin->get_btn;
-       entry[0].cond    = M_HAVE_ACCOUNT|M_UNLOCKED;
-       entry[1].widget  = mainwin->getall_btn;
-       entry[1].cond    = M_HAVE_ACCOUNT|M_UNLOCKED;
-       entry[2].widget  = mainwin->compose_news_btn;
-       entry[2].cond    = M_HAVE_NEWS_ACCOUNT;
-       entry[3].widget  = mainwin->reply_btn;
-       entry[3].cond    = M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST;
-       entry[4].widget  = mainwin->replyall_btn;
-       entry[4].cond    = M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST;
-       entry[5].widget  = mainwin->replysender_btn;
-       entry[5].cond    = M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST;
-       entry[6].widget  = mainwin->fwd_btn;
-       entry[6].cond    = M_HAVE_ACCOUNT|M_TARGET_EXIST;
-/*     entry[6].widget  = mainwin->prefs_btn;
-       entry[6].cond    = M_UNLOCKED;
-       entry[7].widget  = mainwin->account_btn;
-       entry[7].cond    = M_UNLOCKED; */
-       entry[7].widget  = mainwin->next_btn;
-       entry[7].cond    = M_MSG_EXIST;
-       entry[8].widget  = mainwin->delete_btn;
-       entry[8].cond    = M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED;
-       entry[9].widget = mainwin->exec_btn;
-       entry[9].cond   = M_MSG_EXIST|M_EXEC|M_UNLOCKED;
-       entry[10].widget = NULL;
-       entry[10].cond   = 0;
+#define SET_WIDGET_COND(w, c)  \
+{                              \
+       entry[i].widget = w;    \
+       entry[i].cond = c;      \
+       i++;                    \
+}
+
+       SET_WIDGET_COND(mainwin->get_btn, M_HAVE_ACCOUNT|M_UNLOCKED);
+       SET_WIDGET_COND(mainwin->getall_btn, M_HAVE_ACCOUNT|M_UNLOCKED);
+       SET_WIDGET_COND(mainwin->compose_news_btn, M_HAVE_ACCOUNT);
+       SET_WIDGET_COND(mainwin->reply_btn,
+                       M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
+       SET_WIDGET_COND(mainwin->replyall_btn,
+                       M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
+       SET_WIDGET_COND(mainwin->replysender_btn,
+                       M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
+       SET_WIDGET_COND(mainwin->fwd_btn, M_HAVE_ACCOUNT|M_TARGET_EXIST);
+#if 0
+       SET_WIDGET_COND(mainwin->prefs_btn, M_UNLOCKED);
+       SET_WIDGET_COND(mainwin->account_btn, M_UNLOCKED);
+#endif
+       SET_WIDGET_COND(mainwin->next_btn, M_MSG_EXIST);
+       SET_WIDGET_COND(mainwin->delete_btn,
+                       M_TARGET_EXIST|M_ALLOW_DELETE|M_UNLOCKED);
+       SET_WIDGET_COND(mainwin->exec_btn, M_MSG_EXIST|M_EXEC|M_UNLOCKED);
+       SET_WIDGET_COND(NULL, 0);
+
+#undef SET_WIDGET_COND
 
        state = main_window_get_current_state(mainwin);
 
@@ -1601,6 +1633,8 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
        SensitiveCond state;
        gboolean sensitive;
        GtkWidget *menuitem;
+       FolderItem *item;
+       gchar *menu_path;
        gint i;
 
        static const struct {
@@ -1623,6 +1657,8 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"/Edit/Select thread"             , M_SINGLE_TARGET_EXIST},
                {"/View/Sort"                      , M_MSG_EXIST},
                {"/View/Thread view"               , M_EXEC},
+               {"/View/Expand all threads"        , M_MSG_EXIST},
+               {"/View/Collapse all threads"      , M_MSG_EXIST},
                {"/View/Hide read messages"        , M_HIDE_READ_MSG},
                {"/View/Go to/Prev message"        , M_MSG_EXIST},
                {"/View/Go to/Next message"        , M_MSG_EXIST},
@@ -1645,7 +1681,7 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"/Message/Reply to all"          , 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/Bounce"                , M_HAVE_ACCOUNT|M_SINGLE_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},
@@ -1675,13 +1711,66 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
        }
 
        main_window_menu_callback_block(mainwin);
-       menuitem = gtk_item_factory_get_widget(ifactory, "/View/Show all header");
-       gtk_check_menu_item_set_active
-               (GTK_CHECK_MENU_ITEM(menuitem),
-                mainwin->messageview->textview->show_all_headers);
-       menuitem = gtk_item_factory_get_widget(ifactory, "/View/Thread view");
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
-                                      (state & M_THREADED) != 0);
+
+#define SET_CHECK_MENU_ACTIVE(path, active) \
+{ \
+       menuitem = gtk_item_factory_get_widget(ifactory, path); \
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), active); \
+}
+
+       item = mainwin->summaryview->folder_item;
+       menu_path = "/View/Sort/Don't sort";
+       if (item) {
+               switch (item->sort_key) {
+               case SORT_BY_NUMBER:
+                       menu_path = "/View/Sort/by number"; break;
+               case SORT_BY_SIZE:
+                       menu_path = "/View/Sort/by size"; break;
+               case SORT_BY_DATE:
+                       menu_path = "/View/Sort/by date"; break;
+               case SORT_BY_FROM:
+                       menu_path = "/View/Sort/by from"; break;
+               case SORT_BY_SUBJECT:
+                       menu_path = "/View/Sort/by subject"; break;
+               case SORT_BY_LABEL:
+                       menu_path = "/View/Sort/by color label"; break;
+               case SORT_BY_MARK:
+                       menu_path = "/View/Sort/by mark"; break;
+               case SORT_BY_UNREAD:
+                       menu_path = "/View/Sort/by unread"; break;
+               case SORT_BY_MIME:
+                       menu_path = "/View/Sort/by attachment"; break;
+               case SORT_BY_SCORE:
+                       menu_path = "/View/Sort/by score"; break;
+               case SORT_BY_LOCKED:
+                       menu_path = "/View/Sort/by locked"; break;
+               case SORT_BY_NONE:
+               default:
+                       menu_path = "/View/Sort/Don't sort"; break;
+               }
+       }
+       SET_CHECK_MENU_ACTIVE(menu_path, TRUE);
+
+       if (!item || item->sort_type == SORT_ASCENDING) {
+               SET_CHECK_MENU_ACTIVE("/View/Sort/Ascending", TRUE);
+       } else {
+               SET_CHECK_MENU_ACTIVE("/View/Sort/Descending", TRUE);
+       }
+
+       if (item && item->sort_key != SORT_BY_NONE) {
+               menu_set_sensitive(ifactory, "/View/Sort/Ascending", TRUE);
+               menu_set_sensitive(ifactory, "/View/Sort/Descending", TRUE);
+       } else {
+               menu_set_sensitive(ifactory, "/View/Sort/Ascending", FALSE);
+               menu_set_sensitive(ifactory, "/View/Sort/Descending", FALSE);
+       }
+
+       SET_CHECK_MENU_ACTIVE("/View/Show all header",
+                             mainwin->messageview->textview->show_all_headers);
+       SET_CHECK_MENU_ACTIVE("/View/Thread view", (state & M_THREADED) != 0);
+
+#undef SET_CHECK_MENU_ACTIVE
+
        main_window_menu_callback_unblock(mainwin);
 }
 
@@ -1764,8 +1853,8 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                gtk_container_set_border_width(GTK_CONTAINER(folderwin),
                                               BORDER_WIDTH);
                gtk_signal_connect(GTK_OBJECT(folderwin), "delete_event",
-                                  GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
-                                  NULL);
+                                  GTK_SIGNAL_FUNC(folder_window_close_cb),
+                                  mainwin);
        }
        if (type & SEPARATE_MESSAGE) {
                messagewin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
@@ -1783,8 +1872,8 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
                gtk_container_set_border_width(GTK_CONTAINER(messagewin),
                                               BORDER_WIDTH);
                gtk_signal_connect(GTK_OBJECT(messagewin), "delete_event",
-                                  GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
-                                  NULL);
+                                  GTK_SIGNAL_FUNC(message_window_close_cb),
+                                  mainwin);
        }
 
        switch (type) {
@@ -1921,6 +2010,24 @@ static void main_window_set_widgets(MainWindow *mainwin, SeparateType type)
 
        mainwin->type = type;
 
+       ifactory = gtk_item_factory_from_widget(mainwin->menubar);
+
+       menuitem = gtk_item_factory_get_item
+               (ifactory, "/View/Show or hide/Folder tree");
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
+       menuitem = gtk_item_factory_get_item
+               (ifactory, "/View/Show or hide/Message view");
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
+
+       menuitem = gtk_item_factory_get_item
+               (ifactory, "/View/Separate folder tree");
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
+                                      ((type & SEPARATE_FOLDER) != 0));
+       menuitem = gtk_item_factory_get_item
+               (ifactory, "/View/Separate message view");
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
+                                      ((type & SEPARATE_MESSAGE) != 0));
+
        debug_print(_("done.\n"));
 }
 
@@ -1938,10 +2045,10 @@ static void main_window_toolbar_create(MainWindow *mainwin,
        GtkWidget *replysender_btn;
        GtkWidget *fwd_btn;
        GtkWidget *send_btn;
-       /*
+#if 0
        GtkWidget *prefs_btn;
        GtkWidget *account_btn;
-       */
+#endif
        GtkWidget *next_btn;
        GtkWidget *delete_btn;
        GtkWidget *exec_btn;
@@ -2075,13 +2182,13 @@ static void main_window_toolbar_create(MainWindow *mainwin,
                                           toolbar_next_unread_cb,
                                           mainwin);
 
-       /*
+#if 0
        gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
 
        icon_wid = stock_pixmap_widget(container, STOCK_PIXMAP_PREFERENCES);
        prefs_btn = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
                                            _("Prefs"),
-                                           _("Common preference"),
+                                           _("Common preferences"),
                                            "Prefs",
                                            icon_wid,
                                            toolbar_prefs_cb,
@@ -2097,7 +2204,7 @@ static void main_window_toolbar_create(MainWindow *mainwin,
        gtk_signal_connect(GTK_OBJECT(account_btn), "button_press_event",
                           GTK_SIGNAL_FUNC(toolbar_account_button_pressed),
                           mainwin);
-       */
+#endif
 
        gtk_signal_connect(GTK_OBJECT(reply_btn), "button_press_event",
                GTK_SIGNAL_FUNC(toolbar_reply_popup_cb),
@@ -2116,23 +2223,23 @@ static void main_window_toolbar_create(MainWindow *mainwin,
                mainwin);
        
 
-       mainwin->toolbar                         = toolbar;
-       mainwin->get_btn                         = get_btn;
-       mainwin->getall_btn                      = getall_btn;
-       mainwin->compose_mail_btn                = compose_mail_btn;
-       mainwin->compose_news_btn                = compose_news_btn;
-       mainwin->reply_btn                       = reply_btn;
-       mainwin->replyall_btn                    = replyall_btn;
-       mainwin->replysender_btn                 = replysender_btn;
-       mainwin->fwd_btn         = fwd_btn;
-       mainwin->send_btn        = send_btn;
-       /*
-       mainwin->prefs_btn       = prefs_btn;
-       mainwin->account_btn     = account_btn;
-       */
-       mainwin->next_btn        = next_btn;
-       mainwin->delete_btn      = delete_btn;
-       mainwin->exec_btn        = exec_btn;
+       mainwin->toolbar                = toolbar;
+       mainwin->get_btn                = get_btn;
+       mainwin->getall_btn             = getall_btn;
+       mainwin->compose_mail_btn       = compose_mail_btn;
+       mainwin->compose_news_btn       = compose_news_btn;
+       mainwin->reply_btn              = reply_btn;
+       mainwin->replyall_btn           = replyall_btn;
+       mainwin->replysender_btn        = replysender_btn;
+       mainwin->fwd_btn                = fwd_btn;
+       mainwin->send_btn               = send_btn;
+       #if 0
+       mainwin->prefs_btn              = prefs_btn;
+       mainwin->account_btn            = account_btn;
+       #endif
+       mainwin->next_btn               = next_btn;
+       mainwin->delete_btn             = delete_btn;
+       mainwin->exec_btn               = exec_btn;
 
        gtk_widget_show_all(toolbar);
 }
@@ -2358,6 +2465,7 @@ static void toolbar_account_cb    (GtkWidget      *widget,
        prefs_account_open_cb(mainwin, 0, NULL);
 }
 
+#if 0
 static void toolbar_account_button_pressed(GtkWidget *widget,
                                           GdkEventButton *event,
                                           gpointer data)
@@ -2375,6 +2483,7 @@ static void toolbar_account_button_pressed(GtkWidget *widget,
                       menu_button_position, widget,
                       event->button, event->time);
 }
+#endif
 
 static void ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
                                    gpointer data)
@@ -2415,6 +2524,36 @@ static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
        return TRUE;
 }
 
+static gint folder_window_close_cb(GtkWidget *widget, GdkEventAny *event,
+                                  gpointer data)
+{
+       MainWindow *mainwin = (MainWindow *)data;
+       GtkItemFactory *ifactory;
+       GtkWidget *menuitem;
+
+       ifactory = gtk_item_factory_from_widget(mainwin->menubar);
+       menuitem = gtk_item_factory_get_item
+               (ifactory, "/View/Expand Summary View");
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
+
+       return TRUE;
+}
+
+static gint message_window_close_cb(GtkWidget *widget, GdkEventAny *event,
+                                   gpointer data)
+{
+       MainWindow *mainwin = (MainWindow *)data;
+       GtkItemFactory *ifactory;
+       GtkWidget *menuitem;
+
+       ifactory = gtk_item_factory_from_widget(mainwin->menubar);
+       menuitem = gtk_item_factory_get_item
+               (ifactory, "/View/Expand Message View");
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
+
+       return TRUE;
+}
+
 static void add_mailbox_cb(MainWindow *mainwin, guint action,
                           GtkWidget *widget)
 {
@@ -2503,18 +2642,28 @@ static void search_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
 static void toggle_folder_cb(MainWindow *mainwin, guint action,
                             GtkWidget *widget)
 {
+       gboolean active;
+
+       active = GTK_CHECK_MENU_ITEM(widget)->active;
+
        switch (mainwin->type) {
        case SEPARATE_NONE:
        case SEPARATE_MESSAGE:
+#if 0
+               if (active)
+                       gtk_widget_show(GTK_WIDGET_PTR(mainwin->folderview));
+               else
+                       gtk_widget_hide(GTK_WIDGET_PTR(mainwin->folderview));
+#endif
                break;
        case SEPARATE_FOLDER:
-               if (GTK_CHECK_MENU_ITEM(widget)->active)
+               if (active)
                        gtk_widget_show(mainwin->win.sep_folder.folderwin);
                else
                        gtk_widget_hide(mainwin->win.sep_folder.folderwin);
                break;
        case SEPARATE_BOTH:
-               if (GTK_CHECK_MENU_ITEM(widget)->active)
+               if (active)
                        gtk_widget_show(mainwin->win.sep_both.folderwin);
                else
                        gtk_widget_hide(mainwin->win.sep_both.folderwin);
@@ -2525,18 +2674,22 @@ static void toggle_folder_cb(MainWindow *mainwin, guint action,
 static void toggle_message_cb(MainWindow *mainwin, guint action,
                              GtkWidget *widget)
 {
+       gboolean active;
+
+       active = GTK_CHECK_MENU_ITEM(widget)->active;
+
        switch (mainwin->type) {
        case SEPARATE_NONE:
        case SEPARATE_FOLDER:
                break;
        case SEPARATE_MESSAGE:
-               if (GTK_CHECK_MENU_ITEM(widget)->active)
+               if (active)
                        gtk_widget_show(mainwin->win.sep_message.messagewin);
                else
                        gtk_widget_hide(mainwin->win.sep_message.messagewin);
                break;
        case SEPARATE_BOTH:
-               if (GTK_CHECK_MENU_ITEM(widget)->active)
+               if (active)
                        gtk_widget_show(mainwin->win.sep_both.messagewin);
                else
                        gtk_widget_hide(mainwin->win.sep_both.messagewin);
@@ -2627,10 +2780,11 @@ static void separate_widget_cb(GtkCheckMenuItem *checkitem, guint action, GtkWid
        MainWindow *mainwin;
        SeparateType type;
 
-       mainwin = (MainWindow *) gtk_object_get_data(GTK_OBJECT(checkitem), "mainwindow");
-       g_return_if_fail(mainwin != NULL);
+       if (GTK_CHECK_MENU_ITEM(widget)->active)
+               type = mainwin->type | action;
+       else
+               type = mainwin->type & ~action;
 
-       type = mainwin->type ^ action;
        main_window_separation_change(mainwin, type);
 
        prefs_common.sep_folder = (type & SEPARATE_FOLDER)  != 0;
@@ -2883,6 +3037,18 @@ static void thread_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
        }
 }
 
+static void expand_threads_cb(MainWindow *mainwin, guint action,
+                             GtkWidget *widget)
+{
+       summary_expand_threads(mainwin->summaryview);
+}
+
+static void collapse_threads_cb(MainWindow *mainwin, guint action,
+                               GtkWidget *widget)
+{
+       summary_collapse_threads(mainwin->summaryview);
+}
+
 static void set_display_item_cb(MainWindow *mainwin, guint action,
                                GtkWidget *widget)
 {
@@ -2892,7 +3058,30 @@ static void set_display_item_cb(MainWindow *mainwin, guint action,
 static void sort_summary_cb(MainWindow *mainwin, guint action,
                            GtkWidget *widget)
 {
-       summary_sort(mainwin->summaryview, (SummarySortType)action);
+       FolderItem *item = mainwin->summaryview->folder_item;
+       GtkItemFactory *ifactory;
+       GtkWidget *menuitem;
+
+       if (mainwin->menu_lock_count) return;
+       if (item) {
+               ifactory = gtk_item_factory_from_widget(mainwin->menubar);
+               menuitem = gtk_item_factory_get_item
+                       (ifactory, "/View/Sort/Ascending");
+               summary_sort(mainwin->summaryview, (FolderSortKey)action,
+                            GTK_CHECK_MENU_ITEM(menuitem)->active
+                            ? SORT_ASCENDING : SORT_DESCENDING);
+       }
+}
+
+static void sort_summary_type_cb(MainWindow *mainwin, guint action,
+                                GtkWidget *widget)
+{
+       FolderItem *item = mainwin->summaryview->folder_item;
+
+       if (mainwin->menu_lock_count) return;
+       if (item)
+               summary_sort(mainwin->summaryview,
+                            item->sort_key, (FolderSortType)action);
 }
 
 static void attract_by_subject_cb(MainWindow *mainwin, guint action,
@@ -3002,8 +3191,11 @@ 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 (mainwin->summaryview->msg_is_toggled_on &&
-                GTK_WIDGET_HAS_FOCUS(mainwin->messageview->textview->text))
+       else if (mainwin->summaryview->msg_is_toggled_on && (
+                GTK_WIDGET_HAS_FOCUS(mainwin->messageview->textview->text) ||
+                GTK_WIDGET_HAS_FOCUS(mainwin->messageview->mimeview->ctree) ||
+                GTK_WIDGET_HAS_FOCUS(mainwin->messageview->mimeview->notebook) ||
+                GTK_WIDGET_HAS_FOCUS(mainwin->messageview->mimeview->textview->text)))
                messageview_select_all(mainwin->messageview);
 }