online, offline and quicksearch pixmaps follow theme changes
[claws.git] / src / summaryview.c
index cab3fb0778b27cc102d4e8d5e181859f5cba71e4..753b3bdc7ff1a25d5ec9ba48eea315add6236b70 100644 (file)
@@ -84,6 +84,7 @@
 #include "filtering.h"
 #include "string_match.h"
 #include "toolbar.h"
+#include "news.h"
 
 #define SUMMARY_COL_MARK_WIDTH         10
 #define SUMMARY_COL_UNREAD_WIDTH       13
@@ -387,17 +388,18 @@ GtkTargetEntry summary_drag_types[1] =
 static GtkItemFactoryEntry summary_popup_entries[] =
 {
        {N_("/_Reply"),                 NULL, summary_reply_cb, COMPOSE_REPLY, NULL},
-       {N_("/Repl_y to sender"),       NULL, summary_reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
+       {N_("/Repl_y to"),              NULL, NULL,             0, "<Branch>"},
+       {N_("/Repl_y to/_all"),         NULL, summary_reply_cb, COMPOSE_REPLY_TO_ALL, NULL},
+       {N_("/Repl_y to/_sender"),      NULL, summary_reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
+       {N_("/Repl_y to/mailing _list"),
+                                       NULL, summary_reply_cb, COMPOSE_REPLY_TO_LIST, NULL},
        {N_("/Follow-up and reply to"), NULL, summary_reply_cb, COMPOSE_FOLLOWUP_AND_REPLY_TO, NULL},
-       {N_("/Reply to a_ll"),          NULL, summary_reply_cb, COMPOSE_REPLY_TO_ALL, NULL},
+       {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/_Forward"),               NULL, summary_reply_cb, COMPOSE_FORWARD, NULL},
        {N_("/Redirect"),               NULL, summary_reply_cb, COMPOSE_REDIRECT, NULL},
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/Re-_edit"),               NULL, summary_reedit,   0, NULL},
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
-       {N_("/Select _thread"),         NULL, summary_select_thread, 0, NULL},
-       {N_("/Select _all"),            NULL, summary_select_all, 0, NULL},
-       {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/M_ove..."),               NULL, summary_move_to,  0, NULL},
        {N_("/_Copy..."),               NULL, summary_copy_to,  0, NULL},
        {N_("/_Delete"),                NULL, summary_delete,   0, NULL},
@@ -436,6 +438,9 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/_Save as..."),            NULL, summary_save_as,  0, NULL},
        {N_("/_Print..."),              NULL, summary_print,    0, NULL},
+       {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
+       {N_("/Select _all"),            NULL, summary_select_all, 0, NULL},
+       {N_("/Select t_hread"),         NULL, summary_select_thread, 0, NULL}
 };
 
 static const gchar *const col_label[N_SUMMARY_COLS] = {
@@ -682,6 +687,7 @@ void summary_init(SummaryView *summaryview)
        pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_QUICKSEARCH);
        gtk_container_add (GTK_CONTAINER(summaryview->toggle_search), pixmap);
        gtk_widget_show(pixmap);
+       summaryview->quick_search_pixmap = pixmap;
        
        /* Init summaryview prefs */
        summaryview->sort_key = SORT_BY_NONE;
@@ -782,8 +788,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
        
        STATUSBAR_POP(summaryview->mainwin);
 
-       is_refresh = (!prefs_common.open_inbox_on_inc &&
-                     item == summaryview->folder_item) ? TRUE : FALSE;
+       is_refresh = (item == summaryview->folder_item) ? TRUE : FALSE;
        if (is_refresh) {
                selected_msgnum = summary_get_msgnum(summaryview,
                                                     summaryview->selected);
@@ -1139,7 +1144,6 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
 #if 0
        menu_set_sensitive(ifactory, "/Delete", TRUE);
 #endif
-       menu_set_sensitive(ifactory, "/Select all", TRUE);
        menu_set_sensitive(ifactory, "/Copy...", TRUE);
        menu_set_sensitive(ifactory, "/Execute", TRUE);
 
@@ -1157,8 +1161,10 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
 
        sens = (selection == SUMMARY_SELECTED_MULTIPLE) ? FALSE : TRUE;
        menu_set_sensitive(ifactory, "/Reply",                    sens);
-       menu_set_sensitive(ifactory, "/Reply to sender",          sens);
-       menu_set_sensitive(ifactory, "/Reply to all",             sens);
+       menu_set_sensitive(ifactory, "/Reply to",                 sens);
+       menu_set_sensitive(ifactory, "/Reply to/all",             sens);
+       menu_set_sensitive(ifactory, "/Reply to/sender",          sens);
+       menu_set_sensitive(ifactory, "/Reply to/mailing list",    sens);
        menu_set_sensitive(ifactory, "/Forward",                  TRUE);
        menu_set_sensitive(ifactory, "/Redirect",                 sens);
 
@@ -1176,10 +1182,11 @@ static void summary_set_menu_sensitive(SummaryView *summaryview)
        else
                menu_set_sensitive(ifactory, "/Re-edit", FALSE);
 
-       menu_set_sensitive(ifactory, "/Select thread", sens);
-       menu_set_sensitive(ifactory, "/Save as...", sens);
+       menu_set_sensitive(ifactory, "/Save as...", TRUE);
        menu_set_sensitive(ifactory, "/Print...",   TRUE);
 
+       menu_set_sensitive(ifactory, "/Select all", TRUE);
+       menu_set_sensitive(ifactory, "/Select thread", sens);
        if (summaryview->folder_item->folder->account)
                sens = summaryview->folder_item->folder->account->protocol
                        == A_NNTP;
@@ -1979,9 +1986,10 @@ void summary_sort(SummaryView *summaryview,
                cmp_func = (GtkCListCompareFunc)summary_cmp_by_date;
                break;
        case SORT_BY_FROM:
-               cmp_func = summaryview->folder_item->stype != F_OUTBOX ? 
-                       (GtkCListCompareFunc) summary_cmp_by_from :
-                       (GtkCListCompareFunc) summary_cmp_by_to;
+               if (summaryview->folder_item && summaryview->folder_item->stype != F_OUTBOX)
+                       cmp_func = (GtkCListCompareFunc) summary_cmp_by_from;
+               else                    
+                       cmp_func = (GtkCListCompareFunc) summary_cmp_by_to;
                break;
        case SORT_BY_SUBJECT:
                if (summaryview->simplify_subject_preg)
@@ -2310,17 +2318,21 @@ static void summary_display_msg_full(SummaryView *summaryview,
        }
        g_free(filename);
 
-       if (MSG_IS_NEW(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
-               summaryview->newmsgs--;
-       if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
-               summaryview->unread--;
-
-       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 (new_window || !prefs_common.mark_as_read_on_new_window) {
+               if (MSG_IS_NEW(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
+                       summaryview->newmsgs--;
+               if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
+                       summaryview->unread--;
+               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 (new_window) {
                MessageView *msgview;
@@ -3239,6 +3251,27 @@ void summary_unselect_all(SummaryView *summaryview)
        gtk_sctree_unselect_all(GTK_SCTREE(summaryview->ctree));
 }
 
+void summary_select_thread(SummaryView *summaryview)
+{
+       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+       GtkCTreeNode *node = summaryview->selected;
+
+       if (!node) return;
+
+       while (GTK_CTREE_ROW(node)->parent != NULL)
+               node = GTK_CTREE_ROW(node)->parent;
+
+       if (node != summaryview->selected)
+               summary_select_node
+                       (summaryview, node,
+                        messageview_is_visible(summaryview->messageview),
+                        FALSE);
+
+       gtk_ctree_select_recursive(ctree, node);
+
+       summary_status_show(summaryview);
+}
+
 void summary_save_as(SummaryView *summaryview)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
@@ -3246,6 +3279,8 @@ void summary_save_as(SummaryView *summaryview)
        gchar *filename = NULL;
        gchar *src, *dest;
 
+       AlertValue aval;
+
        if (!summaryview->selected) return;
        msginfo = gtk_ctree_node_get_row_data(ctree, summaryview->selected);
        if (!msginfo) return;
@@ -3257,20 +3292,41 @@ void summary_save_as(SummaryView *summaryview)
        dest = filesel_select_file(_("Save as"), filename);
        if (!dest) return;
        if (is_file_exist(dest)) {
-               AlertValue aval;
-
-               aval = alertpanel(_("Overwrite"),
-                                 _("Overwrite existing file?"),
-                                 _("OK"), _("Cancel"), NULL);
-               if (G_ALERTDEFAULT != aval) return;
+               aval = alertpanel(_("Append or Overwrite"),
+                                 _("Append or overwrite existing file?"),
+                                 _("Append"), _("Overwrite"), _("Cancel"));
+               if (aval!=0 && aval!=1) return;
        }
 
        src = procmsg_get_message_file(msginfo);
-       if (copy_file(src, dest, TRUE) < 0) {
-               alertpanel_error(_("Can't save the file `%s'."),
-                                g_basename(dest));
+       if ( aval==0 ) { /* append */
+               if (append_file(src, dest, TRUE) < 0) 
+                       alertpanel_error(_("Can't save the file `%s'."),
+                                        g_basename(dest));
+       } else { /* overwrite */
+               if (copy_file(src, dest, TRUE) < 0)
+                       alertpanel_error(_("Can't save the file `%s'."),
+                                        g_basename(dest));
        }
        g_free(src);
+
+       
+       /*
+        * If two or more msgs are selected,
+        * append them to the output file.
+        */
+       if (GTK_CLIST(ctree)->selection->next) {
+               GList *item;
+               for (item = GTK_CLIST(ctree)->selection->next; item != NULL; item=item->next) {
+                       msginfo = gtk_ctree_node_get_row_data(ctree, (GtkCTreeNode*)item->data);
+                       if (!msginfo) break;
+                       src = procmsg_get_message_file(msginfo);
+                       if (append_file(src, dest, TRUE) < 0)
+                               alertpanel_error(_("Can't save the file `%s'."),
+                                                g_basename(dest));
+               }
+               g_free(src);
+       }
 }
 
 void summary_print(SummaryView *summaryview)
@@ -3987,17 +4043,17 @@ void summary_reply(SummaryView *summaryview, ComposeMode mode)
        switch (mode) {
        case COMPOSE_REPLY:
                compose_reply(msginfo, prefs_common.reply_with_quote,
-                             FALSE, FALSE, text);
+                             FALSE, FALSE, FALSE, text);
                break;
        case COMPOSE_REPLY_WITH_QUOTE:
-               compose_reply(msginfo, TRUE, FALSE, FALSE, text);
+               compose_reply(msginfo, TRUE, FALSE, FALSE, FALSE, text);
                break;
        case COMPOSE_REPLY_WITHOUT_QUOTE:
-               compose_reply(msginfo, FALSE, FALSE, FALSE, NULL);
+               compose_reply(msginfo, FALSE, FALSE, FALSE, FALSE, NULL);
                break;
        case COMPOSE_REPLY_TO_SENDER:
                compose_reply(msginfo, prefs_common.reply_with_quote,
-                             FALSE, TRUE, text);
+                             FALSE, FALSE, TRUE, text);
                break;
        case COMPOSE_FOLLOWUP_AND_REPLY_TO:
                compose_followup_and_reply_to(msginfo,
@@ -4005,20 +4061,30 @@ void summary_reply(SummaryView *summaryview, ComposeMode mode)
                                              FALSE, TRUE, text);
                break;
        case COMPOSE_REPLY_TO_SENDER_WITH_QUOTE:
-               compose_reply(msginfo, TRUE, FALSE, TRUE, text);
+               compose_reply(msginfo, TRUE, FALSE, FALSE, TRUE, text);
                break;
        case COMPOSE_REPLY_TO_SENDER_WITHOUT_QUOTE:
-               compose_reply(msginfo, FALSE, FALSE, TRUE, NULL);
+               compose_reply(msginfo, FALSE, FALSE, FALSE, TRUE, NULL);
                break;
        case COMPOSE_REPLY_TO_ALL:
                compose_reply(msginfo, prefs_common.reply_with_quote,
-                             TRUE, FALSE, text);
+                             TRUE, FALSE, FALSE, text);
                break;
        case COMPOSE_REPLY_TO_ALL_WITH_QUOTE:
-               compose_reply(msginfo, TRUE, TRUE, FALSE, text);
+               compose_reply(msginfo, TRUE, TRUE, FALSE, FALSE, text);
                break;
        case COMPOSE_REPLY_TO_ALL_WITHOUT_QUOTE:
-               compose_reply(msginfo, FALSE, TRUE, FALSE, NULL);
+               compose_reply(msginfo, FALSE, TRUE, FALSE, FALSE, NULL);
+               break;
+       case COMPOSE_REPLY_TO_LIST:
+               compose_reply(msginfo, prefs_common.reply_with_quote,
+                             FALSE, TRUE, FALSE, text);
+               break;
+       case COMPOSE_REPLY_TO_LIST_WITH_QUOTE:
+               compose_reply(msginfo, TRUE, FALSE, TRUE, FALSE, text);
+               break;
+       case COMPOSE_REPLY_TO_LIST_WITHOUT_QUOTE:
+               compose_reply(msginfo, FALSE, FALSE, TRUE, FALSE, NULL);
                break;
        case COMPOSE_FORWARD:
                if (prefs_common.forward_as_attachment) {
@@ -4456,6 +4522,8 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
 {
        GtkCTree *ctree = GTK_CTREE(widget);
        GtkCTreeNode *node;
+       MessageView *messageview;
+       TextView *textview;
 
        if (summary_is_locked(summaryview)) return;
        if (!event) return;
@@ -4477,6 +4545,14 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                        return;
        }
 
+       messageview = summaryview->messageview;
+       if (messageview->type == MVIEW_MIME &&
+           gtk_notebook_get_current_page
+               (GTK_NOTEBOOK(messageview->mimeview->notebook)) == 1)
+               textview = messageview->mimeview->textview;
+       else
+               textview = messageview->textview;
+
        switch (event->keyval) {
        case GDK_space:         /* Page down or go to the next */
                if (summaryview->displayed != summaryview->selected) {
@@ -4484,12 +4560,11 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                            summaryview->selected);
                        break;
                }
-               if (!textview_scroll_page(summaryview->messageview->textview,
-                                         FALSE))
+               if (!textview_scroll_page(textview, FALSE))
                        summary_select_next_unread(summaryview);
                break;
        case GDK_BackSpace:     /* Page up */
-               textview_scroll_page(summaryview->messageview->textview, TRUE);
+               textview_scroll_page(textview, TRUE);
                break;
        case GDK_Return:        /* Scroll up/down one line */
                if (summaryview->displayed != summaryview->selected) {
@@ -4497,8 +4572,8 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                            summaryview->selected);
                        break;
                }
-               textview_scroll_one_line(summaryview->messageview->textview,
-                                        (event->state & GDK_MOD1_MASK) != 0);
+               textview_scroll_one_line
+                       (textview, (event->state & GDK_MOD1_MASK) != 0);
                break;
        case GDK_asterisk:      /* Mark */
                summary_mark(summaryview);
@@ -4997,35 +5072,6 @@ static gint summary_cmp_by_locked(GtkCList *clist,
        return MSG_IS_LOCKED(msginfo1->flags) - MSG_IS_LOCKED(msginfo2->flags);
 }
 
-static void summary_select_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpointer data)
-{
-       MsgInfo *msginfo;
-
-       msginfo = gtk_ctree_node_get_row_data(ctree, row);
-       gtk_ctree_select(GTK_CTREE(ctree), row);        
-       debug_print("Message %d selected\n", msginfo->msgnum);
-}
-
-/* select current thread */
-void summary_select_thread(SummaryView *summaryview)
-{
-       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
-       GtkCTreeNode *node = summaryview->selected;
-       GList *cur;
-
-       while (GTK_CTREE_ROW(node)->parent != NULL)
-               node = GTK_CTREE_ROW(node)->parent;
-
-       if (node && node != summaryview->selected)
-               summary_select_node(summaryview, node, TRUE, FALSE);
-
-       for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next) {
-               gtk_ctree_pre_recursive(ctree, GTK_CTREE_NODE(cur->data), GTK_CTREE_FUNC(summary_select_thread_func), summaryview);
-       }
-       
-       summary_status_show(summaryview);
-}
-
 static void summary_ignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpointer data)
 {
        SummaryView *summaryview = (SummaryView *) data;
@@ -5192,6 +5238,7 @@ void summary_reflect_prefs_pixmap_theme(SummaryView *summaryview)
        stock_pixmap_gdk(ctree, STOCK_PIXMAP_IGNORETHREAD, &ignorethreadxpm, &ignorethreadxpmmask);
        stock_pixmap_gdk(ctree, STOCK_PIXMAP_CLIP_KEY, &clipkeyxpm, &clipkeyxpmmask);
        stock_pixmap_gdk(ctree, STOCK_PIXMAP_KEY, &keyxpm, &keyxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_KEY, &keyxpm, &keyxpmmask);
 
        pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_DIR_OPEN);
        gtk_box_pack_start(GTK_BOX(summaryview->hbox), pixmap, FALSE, FALSE, 4);
@@ -5199,6 +5246,13 @@ void summary_reflect_prefs_pixmap_theme(SummaryView *summaryview)
        gtk_widget_show(pixmap);
        summaryview->folder_pixmap = pixmap; 
 
+       pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_QUICKSEARCH);
+       gtk_container_remove (GTK_CONTAINER(summaryview->toggle_search), 
+                             summaryview->quick_search_pixmap);
+       gtk_container_add(GTK_CONTAINER(summaryview->toggle_search), pixmap);
+       gtk_widget_show(pixmap);
+       summaryview->quick_search_pixmap = pixmap;
+
        folderview_unselect(summaryview->folderview);
        folderview_select(summaryview->folderview, summaryview->folder_item);
 }