2010-05-26 [holger] 3.7.6cvs9
[claws.git] / src / summaryview.c
index 41ea23a7c4becc6d0316e79735a735d69ae92fd1..a6edba4493fe0a7d76555947dca2881d479e5aa1 100644 (file)
@@ -71,7 +71,6 @@
 #include "partial_download.h"
 #include "tags.h"
 #include "timing.h"
-#include "gedit-print.h"
 #include "log.h"
 #include "edittags.h"
 #include "manual.h"
@@ -399,10 +398,11 @@ static void summary_set_colorlabel_color (GtkCMCTree              *ctree,
                                   guint                 labelcolor);
 static void summary_thread_build(SummaryView *summaryview);
 
-GtkTargetEntry summary_drag_types[2] =
+GtkTargetEntry summary_drag_types[3] =
 {
        {"text/uri-list", 0, TARGET_MAIL_URI_LIST},
-       {"claws-mail/internal", GTK_TARGET_SAME_APP, TARGET_DUMMY}
+       {"claws-mail/internal", GTK_TARGET_SAME_APP, TARGET_DUMMY},
+       {"claws-mail/msg-path-list", 0, TARGET_MAIL_CM_PATH_LIST},
 };
 
 #define DO_ACTION(name, act) {                                         \
@@ -759,7 +759,7 @@ SummaryView *summary_create(MainWindow *mainwin)
                                summary_update_folder_hook,
                                (gpointer) summaryview);
 
-       summaryview->target_list = gtk_target_list_new(summary_drag_types, 2);
+       summaryview->target_list = gtk_target_list_new(summary_drag_types, 3);
 
        summaryview->quicksearch = quicksearch;
 
@@ -2056,6 +2056,30 @@ void summary_select_by_msgnum(SummaryView *summaryview, guint msgnum)
        summary_select_node(summaryview, node, FALSE, TRUE);
 }
 
+void summary_select_by_msg_list(SummaryView    *summaryview, GSList *msginfos)
+{
+       GtkCMCTree *ctree;
+       GSList *msgnum_list, *walk;
+       gboolean froze = FALSE;
+
+       ctree = GTK_CMCTREE(summaryview->ctree);
+
+       msgnum_list = NULL;
+       for(walk = msginfos; walk; walk = walk->next) {
+               MsgInfo *msginfo;
+               msginfo = walk->data;
+               msgnum_list = g_slist_prepend(msgnum_list, GUINT_TO_POINTER(msginfo->msgnum));
+       }
+       START_LONG_OPERATION(summaryview, FALSE);
+       for(walk = msgnum_list; walk; walk = walk->next) {
+               GtkCMCTreeNode *node;
+               node = summary_find_msg_by_msgnum(summaryview, GPOINTER_TO_UINT(walk->data));
+               gtk_cmctree_select(ctree, node);
+       }
+       END_LONG_OPERATION(summaryview);
+       g_slist_free(msgnum_list);
+}
+
 typedef struct _PostponedSelectData
 {
        GtkCMCTree *ctree;
@@ -4675,12 +4699,6 @@ void summary_save_as(SummaryView *summaryview)
 void summary_print(SummaryView *summaryview)
 {
        GtkCMCList *clist = GTK_CMCLIST(summaryview->ctree);
-#if !defined(USE_GNOMEPRINT) && !GTK_CHECK_VERSION(2,10,0)
-       GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
-       MsgInfo *msginfo;
-       gchar *cmdline = NULL;
-       gchar *p;
-#endif
        GList *cur;
        gchar *msg = g_strdup_printf(_("You are about to print %d "
                                       "messages, one by one. Do you "
@@ -4695,30 +4713,6 @@ void summary_print(SummaryView *summaryview)
        g_free(msg);
 
        if (clist->selection == NULL) return;
-#if !defined(USE_GNOMEPRINT) && !GTK_CHECK_VERSION(2,10,0)
-       cmdline = input_dialog(_("Print"),
-                              _("Enter the print command-line:\n"
-                                "('%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'"),
-                                cmdline);
-               g_free(cmdline);
-               return;
-       }
-       for (cur = clist->selection; 
-            cur != NULL && cur->data != NULL; 
-            cur = cur->next) {
-               msginfo = gtk_cmctree_node_get_row_data
-                       (ctree, GTK_CMCTREE_NODE(cur->data));
-               if (msginfo) 
-                       procmsg_print_message(msginfo, cmdline);
-       }
-
-       g_free(cmdline);
-#else
        for (cur = clist->selection; 
             cur != NULL && cur->data != NULL; 
             cur = cur->next) {
@@ -4736,7 +4730,6 @@ void summary_print(SummaryView *summaryview)
                messageview_print(msginfo, summaryview->messageview->all_headers,
                        sel_start, sel_end, partnum);
        }
-#endif
 }
 
 gboolean summary_execute(SummaryView *summaryview)
@@ -5374,6 +5367,8 @@ void summary_collapse_threads(SummaryView *summaryview)
        GtkCMCTreeNode *node = NULL;
        GtkCMCTreeNode *focus_node = GTK_CMCTREE_NODE (g_list_nth (GTK_CMCLIST(ctree)->row_list, GTK_CMCLIST(ctree)->focus_row));
 
+       g_signal_handlers_block_by_func(G_OBJECT(ctree),
+                                      G_CALLBACK(summary_tree_collapsed), summaryview);
        summary_freeze(summaryview);
        GTK_SCTREE(ctree)->sorting = TRUE;
 
@@ -5384,8 +5379,10 @@ void summary_collapse_threads(SummaryView *summaryview)
        gtk_sctree_select(GTK_SCTREE(ctree), focus_node);
        node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list);
        while (node) {
-               if (GTK_CMCTREE_ROW(node)->children)
+               if (GTK_CMCTREE_ROW(node)->children) {
                        gtk_cmctree_collapse(ctree, node);
+                       summary_set_row_marks(summaryview, node);
+               }
                node = GTK_CMCTREE_ROW(node)->sibling;
        }
 
@@ -5396,6 +5393,8 @@ void summary_collapse_threads(SummaryView *summaryview)
        GTK_SCTREE(ctree)->anchor_row =
                        gtk_cmctree_node_nth(ctree, GTK_CMCLIST(ctree)->focus_row);
        summary_thaw(summaryview);
+       g_signal_handlers_unblock_by_func(G_OBJECT(ctree),
+                                        G_CALLBACK(summary_tree_collapsed), summaryview);
        
        summaryview->thread_collapsed = TRUE;
 
@@ -6402,7 +6401,7 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
                         summaryview);
 
        gtk_drag_dest_set(ctree, GTK_DEST_DEFAULT_ALL & ~GTK_DEST_DEFAULT_HIGHLIGHT,
-                         summary_drag_types, 2,
+                         summary_drag_types, 3,
                          GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_DEFAULT);
 
        g_signal_connect(G_OBJECT(ctree), "drag_data_received",
@@ -7103,7 +7102,40 @@ static void summary_drag_data_get(GtkWidget        *widget,
                                               selection_data->target, 8,
                                               "Dummy-Summaryview", 
                                               strlen("Dummy-Summaryview")+1);
-       }
+       } else if (info == TARGET_MAIL_CM_PATH_LIST) {
+               /* content: folder_item_identifier\nmsgid1\nmsgid2\nmsgid3 */
+
+               GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree);
+               GList *cur;
+               MsgInfo *msginfo;
+               gchar *path_list = NULL;
+
+               /* identifier */
+               if(GTK_CMCLIST(ctree)->selection != NULL) {
+                       msginfo = gtk_cmctree_node_get_row_data(ctree, GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->selection->data));
+            if(msginfo && msginfo->folder)
+              path_list = folder_item_get_identifier(msginfo->folder);
+               }
+
+               for (cur = GTK_CMCLIST(ctree)->selection;
+                    cur != NULL && cur->data != NULL; cur = cur->next) {
+                       gchar *tmp;
+
+                       msginfo = gtk_cmctree_node_get_row_data(ctree, GTK_CMCTREE_NODE(cur->data));
+            if(!msginfo)
+              continue;
+                       tmp = path_list;
+                       path_list = g_strconcat(path_list, "\n", (msginfo->msgid ? msginfo->msgid : "unknown"), NULL);
+                       g_free(tmp);
+               }
+
+               if (path_list != NULL) {
+                       gtk_selection_data_set(selection_data,
+                                              selection_data->target, 8,
+                                              path_list, strlen(path_list));
+                       g_free(path_list);
+               }
+    }
 }
 
 static gboolean summary_drag_motion_cb(GtkWidget      *widget,