2012-02-02 [pawel] 3.8.0cvs22
[claws.git] / src / mainwindow.c
index 1ee266b085ce5eef22f1e2228f27a08a766147c9..0d16119e6f31939fa16e5c223d01cec6bab1b584 100644 (file)
@@ -6,12 +6,12 @@
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
@@ -247,6 +247,8 @@ static void set_decode_cb           (GtkAction *action, GtkRadioAction *current, gpointer
 
 static void hide_read_messages   (GtkAction    *action,
                                  gpointer       data);
+static void hide_read_threads   (GtkAction     *action,
+                                 gpointer       data);
 static void hide_del_messages   (GtkAction     *action,
                                  gpointer       data);
 
@@ -562,7 +564,7 @@ static GtkActionEntry mainwin_entries[] =
        {"View/Goto/OtherFolder",               NULL, N_("_Other folder..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
 
         /* {"View/Scroll/---",                  NULL, "---", NULL, NULL, NULL }, */
-        {"View/Scroll",                         NULL, N_("Message Scroll") },
+        {"View/Scroll",                         NULL, N_("Message scroll") },
         {"View/Scroll/PrevLine",                NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
         {"View/Scroll/NextLine",                NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
         {"View/Scroll/PrevPage",                NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
@@ -763,6 +765,7 @@ static GtkToggleActionEntry mainwin_toggle_entries[] = {
 #endif
        {"View/ShowHide/ColumnHeaders",         NULL, N_("Column headers"), NULL, NULL, G_CALLBACK(toggle_col_headers_cb) }, /* toggle */
        {"View/ThreadView",                     NULL, N_("Th_read view"), "<control>T", NULL, G_CALLBACK(thread_cb) }, /* toggle */
+       {"View/HideReadThreads",                NULL, N_("Hide read threads"), NULL, NULL, G_CALLBACK(hide_read_threads) }, /* toggle */
        {"View/HideReadMessages",               NULL, N_("_Hide read messages"), NULL, NULL, G_CALLBACK(hide_read_messages) }, /* toggle */
        {"View/HideDelMessages",                NULL, N_("Hide deleted messages"), NULL, NULL, G_CALLBACK(hide_del_messages) }, /* toggle */
 #ifndef MAEMO
@@ -1091,13 +1094,9 @@ void mainwin_accel_changed_cb (GtkAccelGroup *accelgroup, guint keyval, GdkModif
                        GtkLabel *label = g_object_get_data(G_OBJECT(item), "accel_label");
                        gchar *new_accel;
                        
-                       if (keyval == GDK_BackSpace) {
+                       if (keyval == GDK_KEY_BackSpace) {
                                const gchar *accel_path;
-#if GTK_CHECK_VERSION(2,14,0)
                                accel_path = gtk_menu_item_get_accel_path(item);
-#else
-                               accel_path = GTK_MENU_ITEM(item)->accel_path;
-#endif
                                keyval = 0; modifier = 0;
                                gtk_accel_map_change_entry (accel_path, keyval, modifier, TRUE);
                        }
@@ -1338,7 +1337,7 @@ static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
        }
 
        switch (event->keyval) {
-       case GDK_Q:             /* Quit */
+       case GDK_KEY_Q:             /* Quit */
 #ifndef MAEMO
                BREAK_ON_MODIFIER_KEY();
 
@@ -1347,7 +1346,7 @@ static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
                }
 #endif
                return FALSE;
-       case GDK_space:
+       case GDK_KEY_space:
                BREAK_ON_MODIFIER_KEY();
                if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
                        if (mainwin->folderview != NULL && mainwin->summaryview != NULL
@@ -1363,14 +1362,14 @@ static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
                break;
 
 #ifdef MAEMO
-       case GDK_F6:
+       case GDK_KEY_F6:
                if (maemo_mainwindow_is_fullscreen(widget)) {
                        gtk_window_unfullscreen(GTK_WINDOW(widget));
                 } else {
                        gtk_window_fullscreen(GTK_WINDOW(widget));
                 }
                break;
-       case GDK_F7:
+       case GDK_KEY_F7:
                {
                        PangoFontDescription *font_desc;
                        int size;
@@ -1394,7 +1393,7 @@ static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
                        pango_font_description_free(font_desc);
                }
                break;
-       case GDK_F8:
+       case GDK_KEY_F8:
                {
                        PangoFontDescription *font_desc;
                        int size;
@@ -1418,7 +1417,7 @@ static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
                        pango_font_description_free(font_desc);
                }
                break;
-       case GDK_Escape:
+       case GDK_KEY_Escape:
                if (mainwin->summaryview && 
                    mainwin->summaryview->ext_messageview && 
                    mainwin->summaryview->ext_messageview->window && 
@@ -1546,16 +1545,17 @@ MainWindow *main_window_create()
        GtkWidget *offline_pixmap;
        GtkWidget *warning_icon;
        GtkWidget *warning_btn;
-       CLAWS_TIP_DECL();
 #endif
        GtkWidget *online_switch;
        GtkWidget *offline_switch;
        FolderView *folderview;
        SummaryView *summaryview;
        MessageView *messageview;
+#if !GTK_CHECK_VERSION(3, 0, 0)
        GdkColormap *colormap;
-       GdkColor color[4];
        gboolean success[4];
+#endif
+       GdkColor color[4];
        GtkWidget *ac_menu;
        gint i;
 
@@ -1721,6 +1721,7 @@ MainWindow *main_window_create()
        MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ThreadView", "View/ThreadView", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ExpandThreads", "View/ExpandThreads", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "CollapseThreads", "View/CollapseThreads", GTK_UI_MANAGER_MENUITEM)
+       MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadThreads", "View/HideReadThreads", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadMessages", "View/HideReadMessages", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideDelMessages", "View/HideDelMessages", GTK_UI_MANAGER_MENUITEM)
        MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator3", "View/---", GTK_UI_MANAGER_SEPARATOR)
@@ -2206,12 +2207,14 @@ MainWindow *main_window_create()
        color[2] = folderview->color_new;
        color[3] = folderview->color_op;
 
+#if !GTK_CHECK_VERSION(3, 0, 0)
        colormap = gdk_drawable_get_colormap(gtk_widget_get_window(window));
        gdk_colormap_alloc_colors(colormap, color, 4, FALSE, TRUE, success);
        for (i = 0; i < 4; i++) {
                if (success[i] == FALSE)
                        g_warning("MainWindow: color allocation %d failed\n", i);
        }
+#endif
 
        debug_print("done.\n");
 
@@ -2279,12 +2282,6 @@ MainWindow *main_window_create()
 
        ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
        
-#ifndef GENERIC_UMPC
-#ifdef G_OS_UNIX
-       gtk_window_iconify(GTK_WINDOW(mainwin->window));
-#endif
-#endif
-
        g_signal_connect(G_OBJECT(window), "window_state_event",
                         G_CALLBACK(mainwindow_state_event_cb), mainwin);
        g_signal_connect(G_OBJECT(window), "visibility_notify_event",
@@ -2297,8 +2294,6 @@ MainWindow *main_window_create()
        }
        summary_update_unread(mainwin->summaryview, NULL);
        
-       gtk_widget_show(mainwin->window);
-
        /* initialize views */
        folderview_init(folderview);
        summary_init(summaryview);
@@ -2950,7 +2945,7 @@ void main_window_get_size(MainWindow *mainwin)
                prefs_common.folderview_width  = allocation.width;
                prefs_common.folderview_height = allocation.height;
        }
-
+       
        gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
        if (allocation.width > 1 && allocation.height > 1 &&
            !prefs_common.mainwin_fullscreen) {
@@ -3089,6 +3084,10 @@ SensitiveCond main_window_get_current_state(MainWindow *mainwin)
                if ((selection == SUMMARY_NONE && item->hide_read_msgs)
                    || selection != SUMMARY_NONE)
                        state |= M_HIDE_READ_MSG;
+
+               if ((selection == SUMMARY_NONE && item->hide_read_threads)
+                   || selection != SUMMARY_NONE)
+                       state |= M_HIDE_READ_THREADS;
        }               
        if (mainwin->summaryview->threaded)
                state |= M_THREADED;
@@ -3129,6 +3128,9 @@ SensitiveCond main_window_get_current_state(MainWindow *mainwin)
        if (cur_account)
                state |= M_HAVE_ACCOUNT;
        
+       if (cur_account && cur_account->protocol != A_NONE)
+               state |= M_HAVE_RETRIEVABLE_ACCOUNT;
+
        if (any_folder_want_synchronise())
                state |= M_WANT_SYNC;
 
@@ -3138,6 +3140,13 @@ SensitiveCond main_window_get_current_state(MainWindow *mainwin)
        if (g_list_length(account_list) > 1)
                state |= M_HAVE_MULTI_ACCOUNT;
 
+       for ( ; account_list != NULL; account_list = account_list->next) {
+               if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
+                       state |= M_HAVE_ANY_RETRIEVABLE_ACCOUNT;
+                       break;
+               }
+       }
+
        for ( ; account_list != NULL; account_list = account_list->next) {
                if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
                        state |= M_HAVE_NEWS_ACCOUNT;
@@ -3217,6 +3226,7 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"Menu/View/ThreadView"               , M_EXEC|M_SUMMARY_ISLIST},
                {"Menu/View/ExpandThreads"        , M_MSG_EXIST|M_SUMMARY_ISLIST},
                {"Menu/View/CollapseThreads"      , M_MSG_EXIST|M_SUMMARY_ISLIST},
+               {"Menu/View/HideReadThreads"       , M_HIDE_READ_THREADS|M_SUMMARY_ISLIST},
                {"Menu/View/HideReadMessages"      , M_HIDE_READ_MSG|M_SUMMARY_ISLIST},
                {"Menu/View/HideDelMessages"       , M_SUMMARY_ISLIST},
                {"Menu/View/Goto/Prev"        , M_MSG_EXIST},
@@ -3234,9 +3244,9 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"Menu/View/Quotes"                    , M_SINGLE_TARGET_EXIST},
 
                {"Menu/Message/Receive/CurrentAccount"
-                                                , M_HAVE_ACCOUNT|M_UNLOCKED},
+                                                , M_HAVE_ACCOUNT|M_UNLOCKED|M_HAVE_RETRIEVABLE_ACCOUNT},
                {"Menu/Message/Receive/AllAccounts"
-                                                , M_HAVE_ACCOUNT|M_UNLOCKED},
+                                                , M_HAVE_ACCOUNT|M_UNLOCKED|M_HAVE_ANY_RETRIEVABLE_ACCOUNT},
                {"Menu/Message/Receive/CancelReceiving"
                                                 , M_INC_ACTIVE},
                {"Menu/Message/SendQueue"  , M_HAVE_ACCOUNT|M_HAVE_QUEUED_MAILS},
@@ -3377,12 +3387,20 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
        &&  mainwin->messageview->mimeview
        &&  mainwin->messageview->mimeview->textview)
                cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
-                             mainwin->messageview->mimeview->textview->show_all_headers);
+                                               prefs_common.show_all_headers);
        cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & M_THREADED) != 0);
+       cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & M_THREADED) != 0);
+       cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & M_THREADED) != 0);
+       cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", (state & M_THREADED) != 0);
        cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
        cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
        cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
 
+       if (mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs)
+               cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
+       if (mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads)
+               cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
+               
        main_window_menu_callback_unblock(mainwin);
 }
 
@@ -3606,20 +3624,18 @@ void main_window_popup(MainWindow *mainwin)
 {
        static gboolean first_start = TRUE;
 
-       if (!gtkut_widget_get_visible(GTK_WIDGET(mainwin->window)))
+       if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
                main_window_show(mainwin);
 
        if (prefs_common.mainwin_maximised)
                gtk_window_maximize(GTK_WINDOW(mainwin->window));
 
        if (first_start) {
-#ifdef G_OS_UNIX
-               gtk_window_deiconify(GTK_WINDOW(mainwin->window));
-#endif
                first_start = FALSE;
        } else {
                gtkut_window_popup(mainwin->window);
        }
+
        if (prefs_common.layout_mode == SMALL_LAYOUT) {
                if (mainwin->in_folder) {
                        mainwindow_enter_folder(mainwin);
@@ -3638,7 +3654,7 @@ void main_window_show(MainWindow *mainwin)
         gtk_window_move(GTK_WINDOW(mainwin->window),
                                  prefs_common.mainwin_x,
                                  prefs_common.mainwin_y);
-
+       
        gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
                             prefs_common.folderview_width,
                             prefs_common.folderview_height);
@@ -3670,26 +3686,6 @@ static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
        gboolean first_set = (mainwin->hpaned == NULL);
        debug_print("Setting widgets... ");
 
-       if (layout_mode == SMALL_LAYOUT && first_set) {
-               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
-                                   prefs_common.folderview_width,
-                                   prefs_common.folderview_height);
-               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
-                                   0,0);
-               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
-                                   0,0);
-       } else {
-               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
-                                   prefs_common.folderview_width,
-                                   prefs_common.folderview_height);
-               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
-                                   prefs_common.summaryview_width,
-                                   prefs_common.summaryview_height);
-               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
-                                   prefs_common.msgview_width,
-                                   prefs_common.msgview_height);
-       }
-
 #ifndef GENERIC_UMPC
        mainwin->messageview->statusbar = mainwin->statusbar;
        mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
@@ -3721,8 +3717,8 @@ static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
 
                if (messageview_is_visible(mainwin->messageview)) {
                        gtk_paned_add2(GTK_PANED(hpaned), vpaned);
-                       gtk_paned_add1(GTK_PANED(vpaned),
-                                      GTK_WIDGET_PTR(mainwin->summaryview));
+                       gtk_paned_pack1(GTK_PANED(vpaned),
+                                      GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
                } else {
                        gtk_paned_add2(GTK_PANED(hpaned),
                                       GTK_WIDGET_PTR(mainwin->summaryview));
@@ -3812,6 +3808,19 @@ static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
                                prefs_common.mainwin_width,
                                prefs_common.mainwin_height);
                gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
+       } else {
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
+                                   prefs_common.folderview_width,
+                                   prefs_common.folderview_height);
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
+                                   prefs_common.summaryview_width,
+                                   prefs_common.summaryview_height);
+               gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
+                                   prefs_common.msgview_width,
+                                   prefs_common.msgview_height);
+               gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
+                                   prefs_common.mainwin_width,
+                                   prefs_common.mainwin_height);
        } 
        /* remove headerview if not in prefs */
        headerview_set_visibility(mainwin->messageview->headerview,
@@ -4141,12 +4150,12 @@ static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
        if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
                gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
                gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
-               gtk_cmclist_column_titles_show(GTK_CMCLIST(mimeview->ctree));
+               gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
                prefs_common.show_col_headers = TRUE;
        } else {
                gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
                gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
-               gtk_cmclist_column_titles_hide(GTK_CMCLIST(mimeview->ctree));           
+               gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);               
                prefs_common.show_col_headers = FALSE;
        }
 }
@@ -4365,7 +4374,7 @@ static void show_all_header_cb(GtkAction *action, gpointer data)
 {
        MainWindow *mainwin = (MainWindow *)data;
        if (mainwin->menu_lock_count) return;
-       mainwin->summaryview->messageview->all_headers = 
+       prefs_common.show_all_headers = 
                        gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        summary_display_msg_selected(mainwin->summaryview,
                                     gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
@@ -4498,7 +4507,7 @@ static void open_urls_cb(GtkAction *action, gpointer data)
        MainWindow *mainwin = (MainWindow *)data;
        if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
                summary_display_msg_selected(mainwin->summaryview, 
-                       mainwin->messageview->mimeview->textview->show_all_headers);
+                                            prefs_common.show_all_headers);
        }
        messageview_list_urls(mainwin->messageview);
 }
@@ -4561,6 +4570,16 @@ static void hide_del_messages (GtkAction *action, gpointer data)
        summary_toggle_show_del_messages(mainwin->summaryview);
 }
 
+static void hide_read_threads (GtkAction *action, gpointer data)
+{
+       MainWindow *mainwin = (MainWindow *)data;
+       GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
+       if (!mainwin->summaryview->folder_item
+           || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
+               return;
+       summary_toggle_show_read_threads(mainwin->summaryview);
+}
+
 static void thread_cb(GtkAction *action, gpointer data)
 {
        MainWindow *mainwin = (MainWindow *)data;
@@ -4864,7 +4883,7 @@ static void allsel_cb(GtkAction *action, gpointer data)
        MessageView *msgview = mainwin->messageview;
 
        if (messageview_is_visible(msgview) &&
-                (gtkut_widget_has_focus(msgview->mimeview->textview->text)))
+                (gtk_widget_has_focus(msgview->mimeview->textview->text)))
                messageview_select_all(mainwin->messageview);
        else
                summary_select_all(mainwin->summaryview);