2004-11-08 [colin] 0.9.12cvs143.1
[claws.git] / src / summaryview.c
index c22da8a615d8acefd5b1c109e00c7e951a8a56f3..494d67fab5d002ae0dd0ed027564abfe81db15d1 100644 (file)
@@ -778,7 +778,7 @@ GtkCTreeNode * summary_find_prev_important_score(SummaryView *summaryview,
 
 #define CURRENTLY_DISPLAYED(m) \
 ( (m->msgnum == displayed_msgnum) \
-  && (!g_strcasecmp(m->folder->name,item->name)) )
+  && (!g_ascii_strcasecmp(m->folder->name,item->name)) )
 
 gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 {
@@ -816,6 +816,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
        if (summaryview->mainwin->lock_count == 0 &&
            (summaryview->moved > 0 || summaryview->copied > 0)) {
                AlertValue val;
+               gboolean changed = FALSE;
 
                val = alertpanel(_("Process mark"),
                                 _("Some marks are left. Process it?"),
@@ -824,6 +825,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        summary_unlock(summaryview);
                        summary_execute(summaryview);
                        summary_lock(summaryview);
+                       changed = TRUE;
                } else if (G_ALERTALTERNATE == val) {
                        /* DO NOTHING */
                } else {
@@ -831,7 +833,8 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        inc_unlock();
                        return FALSE;
                }
-               folder_update_op_count();
+               if (changed || !quicksearch_is_active(summaryview->quicksearch))
+                       folder_update_op_count();
        }
        
        gtk_clist_freeze(GTK_CLIST(ctree));
@@ -1241,9 +1244,16 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
 void summary_select_prev_unread(SummaryView *summaryview)
 {
        GtkCTreeNode *node;
+       gboolean skip_cur = FALSE;
+
+       if (summaryview->displayed 
+       &&  summaryview->selected == summaryview->displayed) {
+               debug_print("skipping current\n");
+               skip_cur = TRUE;
+       }
 
        node = summary_find_prev_flagged_msg
-               (summaryview, summaryview->selected, MSG_UNREAD, FALSE);
+               (summaryview, summaryview->selected, MSG_UNREAD, skip_cur);
 
        if (!node) {
                AlertValue val = 0;
@@ -1280,9 +1290,17 @@ void summary_select_next_unread(SummaryView *summaryview)
 {
        GtkCTreeNode *node = summaryview->selected;
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+       gboolean skip_cur = FALSE;
+       
+       if (summaryview->displayed 
+       &&  summaryview->selected == summaryview->displayed) {
+               debug_print("skipping cur\n");
+               skip_cur = TRUE;
+       }
+
 
        node = summary_find_next_flagged_msg
-               (summaryview, node, MSG_UNREAD, FALSE);
+               (summaryview, node, MSG_UNREAD, skip_cur);
        
        if (node)
                summary_select_node(summaryview, node, TRUE, FALSE);
@@ -2298,13 +2316,52 @@ static void summary_display_msg(SummaryView *summaryview, GtkCTreeNode *row)
        summary_display_msg_full(summaryview, row, FALSE, FALSE);
 }
 
+static void msginfo_mark_as_read (SummaryView *summaryview, MsgInfo *msginfo,
+                                     GtkCTreeNode *row)
+{
+       g_return_if_fail(summaryview != NULL);
+       g_return_if_fail(msginfo != NULL);
+       g_return_if_fail(row != NULL);
+
+       if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags) 
+       && procmsg_msg_has_marked_parent(msginfo))
+               summaryview->unreadmarked--;
+       if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
+               procmsg_msginfo_unset_flags
+                       (msginfo, MSG_NEW | MSG_UNREAD, 0);
+               summary_set_row_marks(summaryview, row);
+               gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+               summary_status_show(summaryview);
+       }
+}
+
+typedef struct  {
+       MsgInfo *msginfo;
+       SummaryView *summaryview;
+       GtkCTreeNode *row;
+} MarkAsReadData;
+
+static int msginfo_mark_as_read_timeout(void *data)
+{
+       MarkAsReadData *mdata = (MarkAsReadData *)data;
+       if (!mdata)
+               return FALSE;
+       
+       if (mdata->msginfo == summary_get_selected_msg(mdata->summaryview))
+               msginfo_mark_as_read(mdata->summaryview, mdata->msginfo,
+                                    mdata->row); 
+
+       g_free(mdata);
+
+       return FALSE;   
+}
+
 static void summary_display_msg_full(SummaryView *summaryview,
                                     GtkCTreeNode *row,
                                     gboolean new_window, gboolean all_headers)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        MsgInfo *msginfo;
-       MsgFlags flags;
        gint val;
 
        if (!new_window) {
@@ -2344,19 +2401,16 @@ static void summary_display_msg_full(SummaryView *summaryview,
                gtkut_ctree_node_move_if_on_the_edge(ctree, row);
        }
 
-       if (val == 0 &&
-           (new_window || !prefs_common.mark_as_read_on_new_window)) {
-               if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags) 
-               && procmsg_msg_has_marked_parent(msginfo))
-                       summaryview->unreadmarked--;
-               if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
-                       procmsg_msginfo_unset_flags
-                               (msginfo, MSG_NEW | MSG_UNREAD, 0);
-                       summary_set_row_marks(summaryview, row);
-                       gtk_clist_thaw(GTK_CLIST(ctree));
-                       summary_status_show(summaryview);
-                       
-                       flags = msginfo->flags;
+       if (val == 0) {
+               if (prefs_common.mark_as_read_delay) {
+                       MarkAsReadData *data = g_new0(MarkAsReadData, 1);
+                       data->summaryview = summaryview;
+                       data->msginfo = msginfo;
+                       data->row = row;
+                       gtk_timeout_add(prefs_common.mark_as_read_delay * 1000,
+                               msginfo_mark_as_read_timeout, data);
+               } else if (new_window || !prefs_common.mark_as_read_on_new_window) {
+                       msginfo_mark_as_read(summaryview, msginfo, row);
                }
        }
 
@@ -2860,7 +2914,7 @@ static gboolean check_permission(SummaryView *summaryview, MsgInfo * msginfo)
                                        g_strdup_printf("%s",
                                                        account->address);
                        
-                       if (g_strcasecmp(from_name, msginfo->from) == 0) {
+                       if (g_utf8_collate(from_name, msginfo->from) == 0) {
                                g_free(from_name);
                                found = TRUE;
                                break;
@@ -3593,7 +3647,6 @@ void summary_thread_build(SummaryView *summaryview)
 
                if (parent && parent != node) {
                        gtk_ctree_move(ctree, node, parent, NULL);
-                       gtk_ctree_expand(ctree, node);
                }
 
                node = next;
@@ -3603,8 +3656,6 @@ void summary_thread_build(SummaryView *summaryview)
 
        while (node) {
                next = GTK_CTREE_NODE_NEXT(node);
-               if (!summaryview->thread_collapsed)
-                       gtk_ctree_expand(ctree, node);
                if (prefs_common.bold_unread &&
                    GTK_CTREE_ROW(node)->children)
                        summary_set_row_marks(summaryview, node);
@@ -4343,9 +4394,12 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
        case GDK_Down:
                if ((node = summaryview->selected) != NULL) {
                        GtkCTreeNode *next = NULL;
-                       next = (event->keyval == GDK_Down)
-                                       ? gtkut_ctree_node_next(ctree, node)
-                                       : gtkut_ctree_node_prev(ctree, node);
+                       do {
+                               next = (event->keyval == GDK_Down)
+                                       ? gtkut_ctree_node_next(ctree, next ? next:node)
+                                       : gtkut_ctree_node_prev(ctree, next ? next:node);
+                       } while (next && !gtk_ctree_is_viewable(ctree, next));
+
                        if (next) {
                                gtk_sctree_select_with_state
                                        (GTK_SCTREE(ctree), next, event->state);
@@ -4721,7 +4775,7 @@ static void summary_drag_data_get(GtkWidget        *widget,
                                (ctree, GTK_CTREE_NODE(cur->data));
                        tmp2 = procmsg_get_message_file(msginfo);
                        if (!tmp2) continue;
-                       tmp1 = g_strconcat("file:/", tmp2, NULL);
+                       tmp1 = g_strconcat("file://", tmp2, NULL);
                        g_free(tmp2);
 
                        if (!mail_list) {
@@ -4793,7 +4847,7 @@ static gint func_name(GtkCList *clist,                                     \
        if (!msginfo2->var_name)                                         \
                return -1;                                               \
                                                                         \
-       return strcasecmp(msginfo1->var_name, msginfo2->var_name);       \
+       return g_utf8_collate(msginfo1->var_name, msginfo2->var_name);   \
 }
 
 CMP_FUNC_DEF(summary_cmp_by_to, to);
@@ -4835,7 +4889,7 @@ static gint summary_cmp_by_from(GtkCList *clist, gconstpointer ptr1,
        if (!str2)
                return -1;
  
-       return strcasecmp(str1, str2);
+       return g_utf8_collate(str1, str2);
 }
  
 static gint summary_cmp_by_simplified_subject