Sync with hiro's cvs 10 to 17.
[claws.git] / src / folderview.c
index 4343f535979daa292b0542bac9ba79104eefe643..ba509842676fe25744356fe6beadfd0dbeafa547 100644 (file)
@@ -48,6 +48,7 @@
 #include "manage_window.h"
 #include "alertpanel.h"
 #include "menu.h"
+#include "stock_pixmap.h"
 #include "procmsg.h"
 #include "utils.h"
 #include "gtkutils.h"
 #include "folder.h"
 #include "inc.h"
 
-#include "pixmaps/inbox.xpm"
-#include "pixmaps/outbox.xpm"
-#include "pixmaps/dir-close.xpm"
-#include "pixmaps/dir-open.xpm"
-#include "pixmaps/dir-open-hrm.xpm"
-#include "pixmaps/trash.xpm"
-
 typedef enum
 {
        COL_FOLDER      = 0,
@@ -102,8 +96,12 @@ static GtkStyle *bold_tgtfold_style;
 
 static GdkPixmap *inboxxpm;
 static GdkBitmap *inboxxpmmask;
+static GdkPixmap *inboxhrmxpm;
+static GdkBitmap *inboxhrmxpmmask;
 static GdkPixmap *outboxxpm;
 static GdkBitmap *outboxxpmmask;
+static GdkPixmap *outboxhrmxpm;
+static GdkBitmap *outboxhrmxpmmask;
 static GdkPixmap *folderxpm;
 static GdkBitmap *folderxpmmask;
 static GdkPixmap *folderopenxpm;
@@ -112,6 +110,8 @@ static GdkPixmap *folderopenhrmxpm;
 static GdkBitmap *folderopenhrmxpmmask;
 static GdkPixmap *trashxpm;
 static GdkBitmap *trashxpmmask;
+static GdkPixmap *trashhrmxpm;
+static GdkBitmap *trashhrmxpmmask;
 
 static void folderview_select_node      (FolderView    *folderview,
                                          GtkCTreeNode  *node);
@@ -248,7 +248,8 @@ static GtkItemFactoryEntry folderview_mail_popup_entries[] =
        {N_("/_Rename folder..."),      NULL, folderview_rename_folder_cb, 0, NULL},
        {N_("/_Delete folder"),         NULL, folderview_delete_folder_cb, 0, NULL},
        {N_("/---"),                    NULL, NULL, 0, "<Separator>"},
-       {N_("/_Update folder tree"),    NULL, folderview_update_tree_cb, 0, NULL},
+       {N_("/_Check for new messages"),
+                                       NULL, folderview_update_tree_cb, 0, NULL},
        {N_("/R_escan folder tree"),    NULL, folderview_update_tree_cb, 1, NULL},
        {N_("/---"),                    NULL, NULL, 0, "<Separator>"},
        {N_("/Remove _mailbox"),        NULL, folderview_remove_mailbox_cb, 0, NULL},
@@ -265,7 +266,8 @@ static GtkItemFactoryEntry folderview_imap_popup_entries[] =
        {N_("/_Rename folder..."),      NULL, NULL, 0, NULL},
        {N_("/_Delete folder"),         NULL, folderview_rm_imap_folder_cb, 0, NULL},
        {N_("/---"),                    NULL, NULL, 0, "<Separator>"},
-       {N_("/_Update folder tree"),    NULL, folderview_update_tree_cb, 0, NULL},
+       {N_("/_Check for new messages"),
+                                       NULL, folderview_update_tree_cb, 0, NULL},
        {N_("/R_escan folder tree"),    NULL, folderview_update_tree_cb, 1, NULL},
        {N_("/---"),                    NULL, NULL, 0, "<Separator>"},
        {N_("/Remove _IMAP4 account"),  NULL, folderview_rm_imap_server_cb, 0, NULL},
@@ -413,7 +415,7 @@ FolderView *folderview_create(void)
        gtk_drag_dest_set(ctree, GTK_DEST_DEFAULT_ALL &
                          ~GTK_DEST_DEFAULT_HIGHLIGHT,
                          summary_drag_types, 1,
-                         GDK_ACTION_MOVE);
+                         GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_DEFAULT);
        gtk_signal_connect(GTK_OBJECT(ctree), "drag_motion",
                           GTK_SIGNAL_FUNC(folderview_drag_motion_cb),
                           folderview);
@@ -446,13 +448,24 @@ void folderview_init(FolderView *folderview)
 {
        GtkWidget *ctree = folderview->ctree;
 
-       PIXMAP_CREATE(ctree, inboxxpm, inboxxpmmask, inbox_xpm);
-       PIXMAP_CREATE(ctree, outboxxpm, outboxxpmmask, outbox_xpm);
-       PIXMAP_CREATE(ctree, folderxpm, folderxpmmask, dir_close_xpm);
-       PIXMAP_CREATE(ctree, folderopenxpm, folderopenxpmmask, dir_open_xpm);
-       PIXMAP_CREATE(ctree, folderopenhrmxpm, folderopenhrmxpmmask,
-                     dir_open_hrm_xpm);
-       PIXMAP_CREATE(ctree, trashxpm, trashxpmmask, trash_xpm);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_INBOX, &inboxxpm, &inboxxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_OUTBOX,
+                        &outboxxpm, &outboxxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_DIR_CLOSE,
+                        &folderxpm, &folderxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_DIR_OPEN,
+                        &folderopenxpm, &folderopenxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_TRASH, &trashxpm, &trashxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_INBOX_HRM, 
+                        &inboxhrmxpm, &inboxhrmxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_OUTBOX_HRM, 
+                        &outboxhrmxpm, &outboxhrmxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_DIR_OPEN_HRM, 
+                        &folderopenhrmxpm, &folderopenhrmxpmmask);
+       stock_pixmap_gdk(ctree, STOCK_PIXMAP_TRASH_HRM, 
+                        &trashhrmxpm, &trashhrmxpmmask);
+
+
 
        if (!normalfont)
                normalfont = gdk_fontset_load(NORMAL_FONT);
@@ -878,30 +891,63 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
 
        switch (item->stype) {
        case F_INBOX:
-               xpm = openxpm = inboxxpm;
-               mask = openmask = inboxxpmmask;
+               xpm = inboxxpm;
+               mask = inboxxpmmask;
+               if (item->hide_read_msgs) {
+                       openxpm = inboxhrmxpm;
+                       openmask = inboxhrmxpmmask;
+               } else {
+                       openxpm = inboxxpm;
+                       openmask = inboxxpmmask;
+               }
                name = g_strdup(_("Inbox"));
                break;
        case F_OUTBOX:
-               xpm = openxpm = outboxxpm;
-               mask = openmask = outboxxpmmask;
+               xpm = outboxxpm;
+               mask =outboxxpmmask;
+               if (item->hide_read_msgs) {
+                       openxpm = outboxhrmxpm;
+                       openmask = outboxhrmxpmmask;
+               } else {
+                       openxpm = outboxxpm;
+                       openmask = outboxxpmmask;
+               }
                name = g_strdup(_("Outbox"));
                break;
        case F_QUEUE:
-               xpm = openxpm = outboxxpm;
-               mask = openmask = outboxxpmmask;
+               xpm = outboxxpm;
+               mask =outboxxpmmask;
+               if (item->hide_read_msgs) {
+                       openxpm = outboxhrmxpm;
+                       openmask = outboxhrmxpmmask;
+               } else {
+                       openxpm = outboxxpm;
+                       openmask = outboxxpmmask;
+               }
                name = g_strdup(_("Queue"));
                break;
        case F_TRASH:
-               xpm = openxpm = trashxpm;
-               mask = openmask = trashxpmmask;
+               xpm = trashxpm;
+               mask = trashxpmmask;
+               if (item->hide_read_msgs) {
+                       openxpm = trashhrmxpm;
+                       openmask = trashhrmxpmmask;
+               } else {
+                       openxpm = trashxpm;
+                       openmask = trashxpmmask;
+               }
                name = g_strdup(_("Trash"));
                break;
        case F_DRAFT:
                xpm = folderxpm;
                mask = folderxpmmask;
-               openxpm = folderopenxpm;
-               openmask = folderopenxpmmask;
+               if (item->hide_read_msgs) {
+                       openxpm = folderopenhrmxpm;
+                       openmask = folderopenhrmxpmmask;
+               } else {
+                       openxpm = folderopenxpm;
+                       openmask = folderopenxpmmask;
+               }
                name = g_strdup(_("Draft"));
                break;
        default:
@@ -1310,32 +1356,35 @@ static void folderview_button_pressed(GtkWidget *ctree, GdkEventButton *event,
                SET_SENS(mail_factory, "/Create new folder...", new_folder);
                SET_SENS(mail_factory, "/Rename folder...", rename_folder);
                SET_SENS(mail_factory, "/Delete folder", delete_folder);
-               SET_SENS(mail_factory, "/Update folder tree", update_tree);
+               SET_SENS(mail_factory, "/Check for new messages", update_tree);
                SET_SENS(mail_factory, "/Rescan folder tree", rescan_tree);
                SET_SENS(mail_factory, "/Remove mailbox", remove_tree);
                SET_SENS(mail_factory, "/Property...", folder_property);
                SET_SENS(mail_factory, "/Processing...", folder_processing);
                SET_SENS(mail_factory, "/Scoring...", folder_scoring);
-               SET_SENS(mail_factory, "/Search messages...", search_folder);
+               SET_SENS(mail_factory, "/Search folder...", search_folder);
        } else if (FOLDER_TYPE(folder) == F_IMAP) {
                popup = folderview->imap_popup;
                menu_set_insensitive_all(GTK_MENU_SHELL(popup));
                SET_SENS(imap_factory, "/Create new folder...", new_folder);
                SET_SENS(imap_factory, "/Rename folder...", rename_folder);
                SET_SENS(imap_factory, "/Delete folder", delete_folder);
-               SET_SENS(imap_factory, "/Update folder tree", update_tree);
+               SET_SENS(imap_factory, "/Check for new messages", update_tree);
                SET_SENS(imap_factory, "/Rescan folder tree", rescan_tree);
                SET_SENS(imap_factory, "/Remove IMAP4 account", remove_tree);
                SET_SENS(imap_factory, "/Processing...", folder_processing);
                SET_SENS(imap_factory, "/Scoring...", folder_scoring);
-               SET_SENS(imap_factory, "/Search messages...", search_folder);
+               SET_SENS(imap_factory, "/Search folder...", search_folder);
        } else if (FOLDER_TYPE(folder) == F_NEWS) {
                popup = folderview->news_popup;
                menu_set_insensitive_all(GTK_MENU_SHELL(popup));
                SET_SENS(news_factory, "/Subscribe to newsgroup...", new_folder);
                SET_SENS(news_factory, "/Remove newsgroup", delete_folder);
+#if 0
+               SET_SENS(news_factory, "/Check for new messages", update_tree);
+#endif
                SET_SENS(news_factory, "/Remove news account", remove_tree);
-               SET_SENS(news_factory, "/Search messages...", search_folder);
+               SET_SENS(news_factory, "/Search folder...", search_folder);
                SET_SENS(news_factory, "/Processing...", folder_processing);
                SET_SENS(news_factory, "/Scoring...", folder_scoring);
        } else if (FOLDER_TYPE(folder) == F_MBOX) {
@@ -2221,8 +2270,12 @@ static gboolean folderview_drag_motion_cb(GtkWidget      *widget,
        }
 
        if (acceptable) {
+               gtk_signal_handler_block_by_func(GTK_OBJECT(widget),GTK_SIGNAL_FUNC(folderview_selected), folderview);
                gtk_ctree_select(GTK_CTREE(widget), node);
-               gdk_drag_status(context, context->suggested_action, time);
+               gtk_signal_handler_unblock_by_func(GTK_OBJECT(widget),GTK_SIGNAL_FUNC(folderview_selected), folderview);
+               gdk_drag_status(context, 
+                                       (context->actions == GDK_ACTION_COPY ?
+                                       GDK_ACTION_COPY : GDK_ACTION_MOVE) , time);
        } else {
                gtk_ctree_select(GTK_CTREE(widget), folderview->opened);
                gdk_drag_status(context, 0, time);
@@ -2259,8 +2312,18 @@ static void folderview_drag_received_cb(GtkWidget        *widget,
        node = gtk_ctree_node_nth(GTK_CTREE(widget), row);
        item = gtk_ctree_node_get_row_data(GTK_CTREE(widget), node);
        if (item != NULL) {
-               summary_move_selected_to(folderview->summaryview, item);
-               gtk_drag_finish(drag_context, TRUE, TRUE, time);
+               switch (drag_context->action) {
+                       case GDK_ACTION_COPY:
+                               summary_copy_selected_to(folderview->summaryview, item);
+                               gtk_drag_finish(drag_context, TRUE, FALSE, time);
+                               break;
+                       case GDK_ACTION_MOVE:
+                       case GDK_ACTION_DEFAULT:
+                       default:
+                               summary_move_selected_to(folderview->summaryview, item);
+                               gtk_drag_finish(drag_context, TRUE, TRUE, time);
+                               break;
+               }
        } else
                gtk_drag_finish(drag_context, FALSE, FALSE, time);
 }
@@ -2304,7 +2367,9 @@ static void folderview_processing_cb(FolderView *folderview, guint action,
        prefs_filtering_open(item);
 }
 
-static void folderview_property_cb(FolderView *folderview, guint action, GtkWidget *widget) {
+static void folderview_property_cb(FolderView *folderview, guint action, 
+                                  GtkWidget *widget) 
+{
        GtkCTree *ctree = GTK_CTREE(folderview->ctree);
        FolderItem *item;
 
@@ -2314,10 +2379,11 @@ static void folderview_property_cb(FolderView *folderview, guint action, GtkWidg
        g_return_if_fail(item != NULL);
        g_return_if_fail(item->folder != NULL);
 
-       prefs_folder_item_create(item);
+       prefs_folder_item_create(folderview, item);
 }
 
-void folderview_set_target_folder_color(gint color_op) {
+void folderview_set_target_folder_color(gint color_op) 
+{
        gint firstone = 1;
        GList *list;
        FolderView *folderview;