2005-08-05 [paul] 1.9.13cvs14
[claws.git] / src / summaryview.c
index a78d04b5e9abde3565911e9595558edf4f28962a..994622c44e475fb37f10ff58fed5dc623d8e0587 100644 (file)
@@ -86,6 +86,7 @@
 #include "quicksearch.h"
 #include "partial_download.h"
 #include "timing.h"
+#include "gedit-print.h"
 
 #define SUMMARY_COL_MARK_WIDTH         10
 #define SUMMARY_COL_STATUS_WIDTH       13
@@ -629,40 +630,11 @@ SummaryView *summary_create(void)
        return summaryview;
 }
 
-void summary_init(SummaryView *summaryview)
+static void summary_set_fonts(SummaryView *summaryview)
 {
-       GtkWidget *pixmap;
        PangoFontDescription *font_desc;
        gint size;
 
-       gtk_widget_realize(summaryview->ctree);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_MARK,
-                        &markxpm, &markxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_DELETED,
-                        &deletedxpm, &deletedxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_NEW,
-                        &newxpm, &newxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_UNREAD,
-                        &unreadxpm, &unreadxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_REPLIED,
-                        &repliedxpm, &repliedxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_FORWARDED,
-                        &forwardedxpm, &forwardedxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_CLIP,
-                        &clipxpm, &clipxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_LOCKED,
-                        &lockedxpm, &lockedxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_IGNORETHREAD,
-                        &ignorethreadxpm, &ignorethreadxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_CLIP_KEY,
-                        &clipkeyxpm, &clipkeyxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_KEY,
-                        &keyxpm, &keyxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_GPG_SIGNED,
-                        &gpgsignedxpm, &gpgsignedxpmmask);
-       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_CLIP_GPG_SIGNED,
-                        &clipgpgsignedxpm, &clipgpgsignedxpmmask);
-
        font_desc = pango_font_description_from_string(NORMAL_FONT);
        gtk_widget_modify_font(summaryview->ctree, font_desc);
        pango_font_description_free(font_desc);
@@ -688,12 +660,47 @@ void summary_init(SummaryView *summaryview)
 
        font_desc = pango_font_description_new();
        size = pango_font_description_get_size
-               (summaryview->statlabel_folder->style->font_desc);
+               (summaryview->ctree->style->font_desc);
        pango_font_description_set_size(font_desc, size * PANGO_SCALE_SMALL);
        gtk_widget_modify_font(summaryview->statlabel_folder, font_desc);
        gtk_widget_modify_font(summaryview->statlabel_select, font_desc);
        gtk_widget_modify_font(summaryview->statlabel_msgs, font_desc);
        pango_font_description_free(font_desc);
+}
+
+void summary_init(SummaryView *summaryview)
+{
+       GtkWidget *pixmap;
+
+       gtk_widget_realize(summaryview->ctree);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_MARK,
+                        &markxpm, &markxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_DELETED,
+                        &deletedxpm, &deletedxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_NEW,
+                        &newxpm, &newxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_UNREAD,
+                        &unreadxpm, &unreadxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_REPLIED,
+                        &repliedxpm, &repliedxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_FORWARDED,
+                        &forwardedxpm, &forwardedxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_CLIP,
+                        &clipxpm, &clipxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_LOCKED,
+                        &lockedxpm, &lockedxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_IGNORETHREAD,
+                        &ignorethreadxpm, &ignorethreadxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_CLIP_KEY,
+                        &clipkeyxpm, &clipkeyxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_KEY,
+                        &keyxpm, &keyxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_GPG_SIGNED,
+                        &gpgsignedxpm, &gpgsignedxpmmask);
+       stock_pixmap_gdk(summaryview->ctree, STOCK_PIXMAP_CLIP_GPG_SIGNED,
+                        &clipgpgsignedxpm, &clipgpgsignedxpmmask);
+
+       summary_set_fonts(summaryview);
 
        pixmap = stock_pixmap_widget(summaryview->hbox_l, STOCK_PIXMAP_DIR_OPEN);
        gtk_box_pack_start(GTK_BOX(summaryview->hbox_l), pixmap, FALSE, FALSE, 4);
@@ -887,13 +894,6 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
        main_window_cursor_wait(summaryview->mainwin);
 
-/*
-       mlist = item->folder->get_msg_list(item->folder, item, !update_cache);
-
-       !!! NEW !!!
-       USE LIST FROM CACHE, WILL NOT DISPLAY ANY MESSAGES DROPED
-       BY OTHER PROGRAMS TO THE FOLDER
-*/
        mlist = folder_item_get_msg_list(item);
 
        if (summaryview->folder_item->hide_read_msgs) {
@@ -1014,24 +1014,31 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        summary_lock(summaryview);
                }
        } else {
-               /* select first unread message */
-               node = summary_find_next_flagged_msg(summaryview, NULL,
-                                                    MSG_UNREAD, FALSE);
+               switch (prefs_common.select_on_entry) {
+                       case SELECTONENTRY_UNREAD:
+                               node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_UNREAD, FALSE);
+                               break;
+                       case SELECTONENTRY_NEW:
+                               node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    MSG_NEW, FALSE);
+                               break;
+                       default:
+                               node = summary_find_next_flagged_msg(summaryview, NULL,
+                                                                    0, FALSE);
+               }
+
                if (node == NULL && GTK_CLIST(ctree)->row_list != NULL) {
                        node = gtk_ctree_node_nth
                                (ctree,
                                 item->sort_type == SORT_DESCENDING
                                 ? 0 : GTK_CLIST(ctree)->rows - 1);
                }
-               if (prefs_common.open_unread_on_enter) {
-                       summary_unlock(summaryview);
-                       summary_select_node(summaryview, node, 
-                                           messageview_is_visible(summaryview->messageview), 
-                                           TRUE);
-                       summary_lock(summaryview);
-               } else {
-                       summary_select_node(summaryview, node, FALSE, TRUE);
-               }
+               summary_unlock(summaryview);
+               summary_select_node(summaryview, node,
+                                   prefs_common.always_show_msg,
+                                   TRUE);
+               summary_lock(summaryview);
        }
 
        summary_set_column_titles(summaryview);
@@ -1051,6 +1058,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 
 #undef CURRENTLY_DISPLAYED
 
+
 void summary_clear_list(SummaryView *summaryview)
 {
        GtkCList *clist = GTK_CLIST(summaryview->ctree);
@@ -1405,7 +1413,7 @@ void summary_select_next_new(SummaryView *summaryview)
                val = alertpanel(_("No more new messages"),
                                 _("No new message found. "
                                   "Go to next folder?"),
-                                GTK_STOCK_YES, _("Search again"),
+                                GTK_STOCK_YES, _("_Search again"),
                                 GTK_STOCK_NO);
                if (val == G_ALERTDEFAULT) {
                        g_signal_stop_emission_by_name(G_OBJECT(ctree),"key_press_event");
@@ -2021,6 +2029,16 @@ static void summary_set_column_titles(SummaryView *summaryview)
        }
 }
 
+void summary_reflect_prefs(void)
+{
+       SummaryView *summaryview = mainwindow_get_mainwindow()->summaryview;
+       bold_style = bold_marked_style = bold_deleted_style = 
+               small_style = small_marked_style = small_deleted_style = NULL;
+       summary_set_fonts(summaryview);
+       summary_set_column_titles(summaryview);
+       summary_show(summaryview, summaryview->folder_item);
+}
+
 void summary_sort(SummaryView *summaryview,
                  FolderSortKey sort_key, FolderSortType sort_type)
 {
@@ -2540,7 +2558,6 @@ gboolean summary_step(SummaryView *summaryview, GtkScrollType type)
        GtkCTreeNode *node;
 
        if (summary_is_locked(summaryview)) return FALSE;
-
        if (type == GTK_SCROLL_STEP_FORWARD) {
                node = gtkut_ctree_node_next(ctree, summaryview->selected);
                if (node)
@@ -2761,7 +2778,6 @@ static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
                summaryview->moved--;
        if (MSG_IS_COPY(msginfo->flags))
                summaryview->copied--;
-       procmsg_update_unread_children (msginfo, TRUE);
 
        procmsg_msginfo_set_to_folder(msginfo, NULL);
        procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE | MSG_COPY);
@@ -3017,7 +3033,6 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
                summaryview->moved--;
        if (MSG_IS_COPY(msginfo->flags))
                summaryview->copied--;
-       procmsg_update_unread_children (msginfo, FALSE);
 
        procmsg_msginfo_set_to_folder(msginfo, NULL);
        procmsg_msginfo_unset_flags(msginfo, MSG_MARKED, MSG_MOVE | MSG_COPY);
@@ -3110,7 +3125,7 @@ void summary_delete(SummaryView *summaryview)
        if (!node)
                node = summary_find_prev_msg(summaryview, sel_last);
 
-       summary_select_node(summaryview, node, FALSE, FALSE);
+       summary_select_node(summaryview, node, prefs_common.always_show_msg, TRUE);
        
        if (prefs_common.immediate_exec || item->stype == F_TRASH) {
                summary_execute(summaryview);
@@ -3151,7 +3166,6 @@ static void summary_unmark_row(SummaryView *summaryview, GtkCTreeNode *row)
                summaryview->moved--;
        if (MSG_IS_COPY(msginfo->flags))
                summaryview->copied--;
-       procmsg_update_unread_children (msginfo, FALSE);
 
        procmsg_msginfo_set_to_folder(msginfo, NULL);
        procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_MOVE | MSG_COPY);
@@ -3232,7 +3246,6 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
        END_LONG_OPERATION(summaryview);
 
        if (prefs_common.immediate_exec) {
-               summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
                summary_execute(summaryview);
        } else {
                summary_status_show(summaryview);
@@ -3242,7 +3255,7 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
                GtkCTreeNode *node = gtk_ctree_node_nth (GTK_CTREE(summaryview->ctree), 
                                                         GTK_CLIST(summaryview->ctree)->rows - 1);
                if (node)
-                       summary_select_node(summaryview, node, TRUE, TRUE);
+                       summary_select_node(summaryview, node, prefs_common.always_show_msg, TRUE);
        }
 
 }
@@ -3311,8 +3324,6 @@ void summary_copy_selected_to(SummaryView *summaryview, FolderItem *to_folder)
 
        END_LONG_OPERATION(summaryview);
 
-       summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
-
        if (prefs_common.immediate_exec)
                summary_execute(summaryview);
        else {
@@ -3433,10 +3444,10 @@ void summary_save_as(SummaryView *summaryview)
 
        if ( aval==0 ) { /* append */
                if (append_file(src, dest, TRUE) < 0) 
-                       alertpanel_error(_("Can't save the file `%s'."), tmp);
+                       alertpanel_error(_("Can't save the file '%s'."), tmp);
        } else { /* overwrite */
                if (copy_file(src, dest, TRUE) < 0)
-                       alertpanel_error(_("Can't save the file `%s'."), tmp);
+                       alertpanel_error(_("Can't save the file '%s'."), tmp);
        }
        g_free(src);
        
@@ -3451,7 +3462,7 @@ void summary_save_as(SummaryView *summaryview)
                        if (!msginfo) break;
                        src = procmsg_get_message_file(msginfo);
                        if (append_file(src, dest, TRUE) < 0)
-                               alertpanel_error(_("Can't save the file `%s'."), tmp);
+                               alertpanel_error(_("Can't save the file '%s'."), tmp);
                }
                g_free(src);
        }
@@ -3461,28 +3472,32 @@ void summary_save_as(SummaryView *summaryview)
 
 void summary_print(SummaryView *summaryview)
 {
-       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GtkCList *clist = GTK_CLIST(summaryview->ctree);
+#ifndef USE_GNOMEPRINT
+       GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        MsgInfo *msginfo;
-       GList *cur;
-       gchar *cmdline;
+       gchar *cmdline = NULL;
        gchar *p;
+#else
+       gboolean first = TRUE;
+       GList *tmplist;
+#endif
+       GList *cur;
 
        if (clist->selection == NULL) return;
-
+#ifndef USE_GNOMEPRINT
        cmdline = input_dialog(_("Print"),
                               _("Enter the print command line:\n"
-                                "(`%s' will be replaced with file name)"),
+                                "('%s' will be replaced with file name)"),
                               prefs_common.print_cmd);
        if (!cmdline) return;
        if (!(p = strchr(cmdline, '%')) || *(p + 1) != 's' ||
            strchr(p + 2, '%')) {
-               alertpanel_error(_("Print command line is invalid:\n`%s'"),
+               alertpanel_error(_("Print command line is invalid:\n'%s'"),
                                 cmdline);
                g_free(cmdline);
                return;
        }
-
        for (cur = clist->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
                msginfo = gtk_ctree_node_get_row_data
                        (ctree, GTK_CTREE_NODE(cur->data));
@@ -3490,6 +3505,30 @@ void summary_print(SummaryView *summaryview)
        }
 
        g_free(cmdline);
+       
+#else
+       tmplist = g_list_copy(clist->selection);
+       summary_unselect_all(summaryview);
+       for (cur = tmplist; cur != NULL && cur->data != NULL; cur = cur->next) {
+               GtkCTreeNode *node = GTK_CTREE_NODE(cur->data);
+               summary_select_node(summaryview, node, TRUE, TRUE);
+               if (!summaryview->messageview->mimeview 
+               ||  !summaryview->messageview->mimeview->textview
+               ||  !summaryview->messageview->mimeview->textview->text)
+                       alertpanel_warning(_("Cannot print: the message doesn't "
+                                            "contain text."));
+               gedit_print(
+                       GTK_TEXT_VIEW(summaryview->messageview->mimeview
+                                       ->textview->text));
+       }
+       for (cur = tmplist; cur != NULL && cur->data != NULL; cur = cur->next) {
+               GtkCTreeNode *node = GTK_CTREE_NODE(cur->data);
+               gtk_sctree_select_with_state(
+                       GTK_SCTREE(clist), node, first ? 0:GDK_CONTROL_MASK);
+               first = FALSE;
+       }
+       g_list_free(tmplist);
+#endif
 }
 
 gboolean summary_execute(SummaryView *summaryview)
@@ -3510,12 +3549,9 @@ gboolean summary_execute(SummaryView *summaryview)
                summary_unthread_for_exec(summaryview);
 
        folder_item_update_freeze();
-       gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
        summary_execute_move(summaryview);
        summary_execute_copy(summaryview);
        summary_execute_delete(summaryview);
-       folder_item_update_thaw();
-       gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
        
        node = GTK_CTREE_NODE(clist->row_list);
        for (; node != NULL; node = next) {
@@ -3543,15 +3579,24 @@ gboolean summary_execute(SummaryView *summaryview)
                gtk_ctree_remove_node(ctree, node);
        }
 
+       folder_item_update_thaw();
+       gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+
        if (new_selected) {
+               summary_unlock(summaryview);
                gtk_sctree_select
                        (GTK_SCTREE(ctree),
                         summaryview->displayed ? summaryview->displayed
                         : new_selected);
+               summary_lock(summaryview);
        }
 
-       if (summaryview->threaded)
+       if (summaryview->threaded) {
+               gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
                summary_thread_build(summaryview);
+               summary_thread_init(summaryview);
+               gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+       }
 
        summaryview->selected = clist->selection ?
                GTK_CTREE_NODE(clist->selection->data) : NULL;
@@ -3568,8 +3613,6 @@ gboolean summary_execute(SummaryView *summaryview)
 
        gtk_ctree_node_moveto(ctree, summaryview->selected, -1, 0.5, 0);
 
-       gtk_clist_thaw(clist);
-
        summary_unlock(summaryview);
        return TRUE;
 }
@@ -4600,8 +4643,9 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
        MsgInfo *msginfo;
        gboolean marked_unread = FALSE;
 
-       if (summary_is_locked(summaryview))
+       if (summary_is_locked(summaryview)) {
                return;
+       }
 
        summary_status_show(summaryview);
 
@@ -5191,10 +5235,6 @@ static gboolean processing_apply_func(GNode *node, gpointer data)
                STATUSBAR_PUSH(summaryview->mainwin, buf);
                g_free(buf);
 
-/*
-               mlist = item->folder->get_msg_list(item->folder, item,
-                                                  TRUE);
-*/             
                mlist = folder_item_get_msg_list(item);
                for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = cur->next) {
                        MsgInfo * msginfo;