2006-09-04 [colin] 2.4.0cvs143
[claws.git] / src / summaryview.c
index 45f55235610a7dc0c3985153612dd8e12ce98e95..ccbb6aec033f26dfee33914a7b882a51cf3a87ce 100644 (file)
@@ -494,10 +494,10 @@ static const gchar *const col_label[N_SUMMARY_COLS] = {
        "",             /* S_COL_LOCKED  */
 };
 
-#define START_LONG_OPERATION(summaryview) {                    \
+#define START_LONG_OPERATION(summaryview,force_freeze) {       \
        summary_lock(summaryview);                              \
        main_window_cursor_wait(summaryview->mainwin);          \
-       if (sc_g_list_bigger(GTK_CLIST(summaryview->ctree)->selection, 1)) {\
+       if (force_freeze || sc_g_list_bigger(GTK_CLIST(summaryview->ctree)->selection, 1)) {\
                froze = TRUE;                                           \
                gtk_clist_freeze(GTK_CLIST(summaryview->ctree));        \
        }                                                       \
@@ -849,6 +849,7 @@ static gboolean summaryview_quicksearch_recurse(gpointer data)
        main_window_cursor_normal(summaryview->mainwin);
        return FALSE;
 }
+
 gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
@@ -1377,8 +1378,8 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
 
                {"/View"                        , M_SINGLE_TARGET_EXIST},
                {"/View/Open in new window"     , M_SINGLE_TARGET_EXIST},
-               {"/View/Source"                 , M_SINGLE_TARGET_EXIST},
-               {"/View/All header            , M_SINGLE_TARGET_EXIST},
+               {"/View/Message source"         , M_SINGLE_TARGET_EXIST},
+               {"/View/All headers"            , M_SINGLE_TARGET_EXIST},
                {"/Save as..."                  , M_TARGET_EXIST},
                {"/Print..."                    , M_TARGET_EXIST},
                {NULL, 0}
@@ -1395,7 +1396,7 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
 
 
        summary_lock(summaryview);
-       menuitem = gtk_item_factory_get_widget(ifactory, "/View/All header");
+       menuitem = gtk_item_factory_get_widget(ifactory, "/View/All headers");
        if (summaryview->messageview 
        &&  summaryview->messageview->mimeview
        &&  summaryview->messageview->mimeview->textview)
@@ -3211,7 +3212,7 @@ void summary_mark(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_mark_row(summaryview, GTK_CTREE_NODE(cur->data));
@@ -3246,7 +3247,7 @@ void summary_mark_as_read
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_mark_row_as_read(summaryview,
@@ -3263,7 +3264,7 @@ void summary_msgs_lock(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_lock_row(summaryview,
                                         GTK_CTREE_NODE(cur->data));
@@ -3278,7 +3279,7 @@ void summary_msgs_unlock(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_unlock_row(summaryview,
                                   GTK_CTREE_NODE(cur->data));
@@ -3306,7 +3307,7 @@ void summary_mark_all_read(SummaryView *summaryview)
                        prefs_common.ask_mark_all_read = FALSE;
        }
        
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, TRUE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list); node != NULL;
             node = gtkut_ctree_node_next(ctree, node))
@@ -3334,7 +3335,7 @@ void summary_mark_as_spam(SummaryView *summaryview, guint action, GtkWidget *wid
 
        prefs_common.immediate_exec = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
 
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
                GtkCTreeNode *row = GTK_CTREE_NODE(cur->data);
@@ -3411,7 +3412,7 @@ void summary_mark_as_unread(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; 
                cur = cur->next)
@@ -3567,7 +3568,7 @@ void summary_delete(SummaryView *summaryview)
 
        /* next code sets current row focus right. We need to find a row
         * that is not deleted. */
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
                sel_last = GTK_CTREE_NODE(cur->data);
@@ -3644,7 +3645,7 @@ void summary_unmark(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_unmark_row(summaryview, GTK_CTREE_NODE(cur->data));
@@ -3706,7 +3707,7 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
                return;
        }
 
-       START_LONG_OPERATION(summaryview); 
+       START_LONG_OPERATION(summaryview, FALSE); 
 
        for (cur = GTK_CLIST(summaryview->ctree)->selection;
             cur != NULL && cur->data != NULL; cur = cur->next) {
@@ -3797,7 +3798,7 @@ void summary_copy_selected_to(SummaryView *summaryview, FolderItem *to_folder)
                return;
        }
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
 
        for (cur = GTK_CLIST(summaryview->ctree)->selection;
             cur != NULL && cur->data != NULL; cur = cur->next)
@@ -4376,8 +4377,7 @@ static void summary_unthread_for_exec(SummaryView *summaryview)
 
        debug_print("Unthreading for execution...");
 
-       START_LONG_OPERATION(summaryview);
-
+       START_LONG_OPERATION(summaryview, TRUE);
        for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
             node != NULL; node = GTK_CTREE_NODE_NEXT(node)) {
                summary_unthread_for_exec_func(ctree, node, summaryview);
@@ -4759,8 +4759,7 @@ void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor,
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
-
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_set_row_colorlabel(summaryview,
                                           GTK_CTREE_NODE(cur->data), labelcolor);
@@ -5309,12 +5308,46 @@ static void summary_unselected(GtkCTree *ctree, GtkCTreeNode *row,
        summary_status_show(summaryview);
 }
 
+typedef struct _PostponedSelectData
+{
+       GtkCTree *ctree;
+       GtkCTreeNode *row;
+       gint column;
+       SummaryView *summaryview;
+} PostponedSelectData;
+
+static gboolean summary_select_retry(void *data)
+{
+       PostponedSelectData *psdata = (PostponedSelectData *)data;
+       debug_print("trying again\n");
+       summary_selected(psdata->ctree, psdata->row,
+                           psdata->column, psdata->summaryview);
+       g_free(psdata);
+       return FALSE;
+}
+
 static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
                             gint column, SummaryView *summaryview)
 {
        MsgInfo *msginfo;
        gboolean marked_unread = FALSE;
 
+       if (summary_is_locked(summaryview)
+       && !GTK_SCTREE(ctree)->selecting_range
+       && summaryview->messageview->mimeview
+       && summaryview->messageview->mimeview->type == MIMEVIEW_TEXT
+       && summaryview->messageview->mimeview->textview->loading) {
+               PostponedSelectData *data = g_new0(PostponedSelectData, 1);
+               summaryview->messageview->mimeview->textview->stop_loading = TRUE;
+               
+               data->ctree = ctree;
+               data->row = row;
+               data->column = column;
+               data->summaryview = summaryview;
+               debug_print("postponing open of message till end of load\n");
+               g_timeout_add(100, summary_select_retry, data);
+               return;
+       }
        if (summary_is_locked(summaryview)
        ||  GTK_SCTREE(ctree)->selecting_range) {
                return;
@@ -5860,7 +5893,7 @@ static void summary_ignore_thread(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                gtk_ctree_pre_recursive(ctree, GTK_CTREE_NODE(cur->data), 
                                        GTK_CTREE_FUNC(summary_ignore_thread_func), 
@@ -5892,7 +5925,7 @@ static void summary_unignore_thread(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                gtk_ctree_pre_recursive(ctree, GTK_CTREE_NODE(cur->data), 
                                        GTK_CTREE_FUNC(summary_unignore_thread_func),