sync with sylpheed 0.5.0pre1 release
[claws.git] / src / summaryview.c
index f5479dde1e9870789e9ca9ac397c56b4d1e2ff95..19516e7b588796051eb11daee1a2a34926137209 100644 (file)
@@ -781,7 +781,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item,
                           GTK_SIGNAL_FUNC (summary_drag_data_get),
                           summaryview);
 
-       gtk_clist_thaw(GTK_CLIST(ctree));
+        gtk_clist_thaw(GTK_CLIST(ctree));
 
        /* sort before */
        sort_mode = prefs_folder_item_get_sort_mode(item);
@@ -1067,11 +1067,16 @@ void summary_select_by_msgnum(SummaryView *summaryview, guint msgnum)
        node = summary_find_msg_by_msgnum(summaryview, msgnum);
 
        if (node) {
+               GTK_EVENTS_FLUSH();
+               gtk_ctree_node_moveto(ctree, node, -1, 0.5, 0);
+               gtk_widget_grab_focus(GTK_WIDGET(ctree));
                gtk_sctree_unselect_all(GTK_SCTREE(ctree));
                gtk_sctree_select(GTK_SCTREE(ctree), node);
-               if (summaryview->displayed == node)
-                       summaryview->displayed = NULL;
-               summary_display_msg(summaryview, node, FALSE);
+               if (summaryview->msg_is_toggled_on) {
+                       if (summaryview->displayed == node)
+                               summaryview->displayed = NULL;
+                       summary_display_msg(summaryview, node, FALSE);
+               }
        }
 }
 
@@ -1558,6 +1563,8 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
                        msginfo = (MsgInfo *)mlist->data;
                        parent = NULL;
 
+                       summary_set_header(text, msginfo);
+
                        /* search parent node for threading */
                        if (msginfo->inreplyto && *msginfo->inreplyto) {
                                parent = g_hash_table_lookup
@@ -1568,8 +1575,6 @@ static void summary_set_ctree_from_list(SummaryView *summaryview,
                                        (subject_table, msginfo->subject);
                        }
 
-                       summary_set_header(text, msginfo);
-
                        node = gtk_ctree_insert_node
                                (ctree, parent, NULL, text, 2,
                                 NULL, NULL, NULL, NULL, FALSE, TRUE);
@@ -1766,7 +1771,7 @@ static void summary_set_header(gchar *text[], MsgInfo *msginfo)
 
        text[S_COL_MARK]   = NULL;
        text[S_COL_UNREAD] = NULL;
-       text[S_COL_MIME] = NULL;
+       text[S_COL_MIME]   = NULL;
        text[S_COL_NUMBER] = itos_buf(col_number, msginfo->msgnum);
        text[S_COL_SIZE]   = to_human_readable(msginfo->size);
 #if 0
@@ -1857,6 +1862,21 @@ static void summary_display_msg(SummaryView *summaryview, GtkCTreeNode *row,
        }
        g_free(filename);
 
+       if (MSG_IS_NEW(msginfo->flags))
+               summaryview->newmsgs--;
+       if (MSG_IS_UNREAD(msginfo->flags))
+               summaryview->unread--;
+       if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
+               MSG_UNSET_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
+
+               CHANGE_FLAGS(msginfo);
+
+               summary_set_row_marks(summaryview, row);
+               gtk_clist_thaw(GTK_CLIST(ctree));
+               summary_status_show(summaryview);
+       }
+
+       if (GTK_WIDGET_VISIBLE(summaryview->headerwin->window))
        if (new_window) {
                MessageView *msgview;
 
@@ -1879,21 +1899,6 @@ static void summary_display_msg(SummaryView *summaryview, GtkCTreeNode *row,
                gtkut_ctree_node_move_if_on_the_edge(ctree, row);
        }
 
-       if (MSG_IS_NEW(msginfo->flags))
-               summaryview->newmsgs--;
-       if (MSG_IS_UNREAD(msginfo->flags))
-               summaryview->unread--;
-       if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
-               MSG_UNSET_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
-
-               CHANGE_FLAGS(msginfo);
-               
-               summary_set_row_marks(summaryview, row);
-               gtk_clist_thaw(GTK_CLIST(ctree));
-               summary_status_show(summaryview);
-       }
-
-       if (GTK_WIDGET_VISIBLE(summaryview->headerwin->window))
                header_window_show(summaryview->headerwin, msginfo);
 
        lock = FALSE;
@@ -2800,7 +2805,7 @@ static void summary_thread_func(GtkCTree *ctree, GtkCTreeNode *node,
                                gpointer data)
 {
        MsgInfo *msginfo;
-       GtkCTreeNode *parent;
+       GtkCTreeNode *parent = NULL;
        
        SummaryView * summaryview = (SummaryView *) data;
        GHashTable *msgid_table = summaryview->msgid_table;
@@ -2808,9 +2813,11 @@ static void summary_thread_func(GtkCTree *ctree, GtkCTreeNode *node,
 
        msginfo = GTKUT_CTREE_NODE_GET_ROW_DATA(node);
 
-       if (!msginfo || !msginfo->inreplyto) return;
+       if (!msginfo) return;
 
-       parent = g_hash_table_lookup(msgid_table, msginfo->inreplyto);
+       if(msginfo->inreplyto) {
+           parent = g_hash_table_lookup(msgid_table, msginfo->inreplyto);
+       }
        if (parent == NULL && msginfo->subject) {
                parent = subject_table_lookup(subject_table, msginfo->subject);
        }
@@ -2985,6 +2992,13 @@ void summary_pass_key_press_event(SummaryView *summaryview, GdkEventKey *event)
 #define BREAK_ON_MODIFIER_KEY() \
        if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
 
+#define KEY_PRESS_EVENT_STOP() \
+       if (gtk_signal_n_emissions_by_name \
+               (GTK_OBJECT(ctree), "key_press_event") > 0) { \
+               gtk_signal_emit_stop_by_name(GTK_OBJECT(ctree), \
+                                            "key_press_event"); \
+       }
+
 static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                SummaryView *summaryview)
 {
@@ -2998,12 +3012,7 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
        case GDK_g:             /* Go */
        case GDK_G:
                BREAK_ON_MODIFIER_KEY();
-
-               if (gtk_signal_n_emissions_by_name
-                       (GTK_OBJECT(ctree), "key_press_event") > 0)
-                       gtk_signal_emit_stop_by_name(GTK_OBJECT(ctree),
-                                                    "key_press_event");
-
+               KEY_PRESS_EVENT_STOP();
                to_folder = foldersel_folder_sel(NULL);
                if (to_folder) {
                        debug_print(_("Go to %s\n"), to_folder->path);
@@ -3012,17 +3021,20 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                return;
        case GDK_w:             /* Write new message */
                BREAK_ON_MODIFIER_KEY();
-               if (summaryview->folder_item)
-                       compose_new(summaryview->folder_item->folder->account);
-               else
+               if (summaryview->folder_item) {
+                       PrefsAccount *ac;
+                       ac = summaryview->folder_item->folder->account;
+                       if (ac && ac->protocol == A_NNTP)
+                               compose_new_with_recipient
+                                       (ac, summaryview->folder_item->path);
+                       else
+                               compose_new(ac);
+               } else
                        compose_new(NULL);
                return;
        case GDK_D:             /* Empty trash */
                BREAK_ON_MODIFIER_KEY();
-               if (gtk_signal_n_emissions_by_name
-                       (GTK_OBJECT(ctree), "key_press_event") > 0)
-                       gtk_signal_emit_stop_by_name(GTK_OBJECT(ctree),
-                                                    "key_press_event");
+               KEY_PRESS_EVENT_STOP();
                main_window_empty_trash(summaryview->mainwin, TRUE);
                return;
        case GDK_Q:             /* Quit */
@@ -3124,6 +3136,7 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
        case GDK_x:             /* Execute */
        case GDK_X:
                BREAK_ON_MODIFIER_KEY();
+               KEY_PRESS_EVENT_STOP();
                summary_execute(summaryview);
                break;
        case GDK_a:             /* Reply to the message */
@@ -3152,6 +3165,9 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
        }
 }
 
+#undef BREAK_ON_MODIFIER_KEY
+#undef KEY_PRESS_EVENT_STOP
+
 static void summary_open_row(GtkSCTree *sctree, SummaryView *summaryview)
 {
        if (summaryview->folder_item->stype == F_DRAFT)