remove icons that will never be displayed
[claws.git] / src / folderview.c
index a433d90fd962dd9279d00c702933836a36ed0685..83dc21936fb14e894204cc787ccca5d07d1832ab 100644 (file)
@@ -58,6 +58,7 @@
 #include "manual.h"
 #include "timing.h"
 #include "log.h"
+#include "gtkcmctree.h"
 
 #define COL_FOLDER_WIDTH       150
 #define COL_NUM_WIDTH          32
@@ -92,7 +93,10 @@ static GdkPixbuf *queueopenxpm;
 static GdkPixbuf *queueopenhrmxpm;
 static GdkPixbuf *draftsxpm;
 static GdkPixbuf *draftsopenxpm;
-static GdkPixbuf *noselectxpm;
+static GdkPixbuf *foldersubsxpm;
+static GdkPixbuf *foldersubsopenxpm;
+static GdkPixbuf *foldernoselectxpm;
+static GdkPixbuf *foldernoselectopenxpm;
 
 static GdkPixbuf *m_inboxxpm;
 static GdkPixbuf *m_inboxhrmxpm;
@@ -116,6 +120,8 @@ static GdkPixbuf *m_queueopenxpm;
 static GdkPixbuf *m_queueopenhrmxpm;
 static GdkPixbuf *m_draftsxpm;
 static GdkPixbuf *m_draftsopenxpm;
+static GdkPixbuf *m_foldersubsxpm;
+static GdkPixbuf *m_foldernoselectxpm;
 
 static GdkPixbuf *newxpm;
 static GdkPixbuf *unreadxpm;
@@ -335,12 +341,9 @@ static void folderview_column_set_titles(FolderView *folderview)
        
        /* CLAWS: titles for "New" and "Unread" show new & unread pixmaps
         * instead text (text overflows making them unreadable and ugly) */
-        stock_pixbuf_gdk(ctree, STOCK_PIXMAP_NEW,
-                        &newxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_UNREAD,
-                        &unreadxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_READ,
-                        &readxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_NEW, &newxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_UNREAD, &unreadxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_READ, &readxpm);
        
        label_folder = gtk_label_new(_("Folder"));
        label_new = gtk_image_new_from_pixbuf(newxpm);
@@ -629,52 +632,57 @@ void folderview_init(FolderView *folderview)
        GdkColor gdk_color;
        PangoFontDescription *normal_font;
 
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_INBOX_CLOSE, &inboxxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_INBOX_CLOSE_HRM, &inboxhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_INBOX_OPEN, &inboxopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_INBOX_OPEN_HRM, &inboxopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_OUTBOX_CLOSE, &outboxxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_OUTBOX_CLOSE_HRM, &outboxhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_OUTBOX_OPEN, &outboxopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_OUTBOX_OPEN_HRM, &outboxopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_CLOSE, &folderxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_CLOSE_HRM, &folderhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_OPEN, &folderopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_OPEN_HRM, &folderopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_TRASH_OPEN, &trashopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_TRASH_OPEN_HRM, &trashopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_TRASH_CLOSE, &trashxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_TRASH_CLOSE_HRM, &trashhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_QUEUE_CLOSE, &queuexpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_QUEUE_CLOSE_HRM, &queuehrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_QUEUE_OPEN, &queueopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_QUEUE_OPEN_HRM, &queueopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DRAFTS_CLOSE, &draftsxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DRAFTS_OPEN, &draftsopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_NOSELECT, &noselectxpm);
-
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_INBOX_CLOSE_MARK, &m_inboxxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_INBOX_CLOSE_HRM_MARK, &m_inboxhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_INBOX_OPEN_MARK, &m_inboxopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_INBOX_OPEN_HRM_MARK, &m_inboxopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_OUTBOX_CLOSE_MARK, &m_outboxxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_OUTBOX_CLOSE_HRM_MARK, &m_outboxhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_OUTBOX_OPEN_MARK, &m_outboxopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_OUTBOX_OPEN_HRM_MARK, &m_outboxopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_CLOSE_MARK, &m_folderxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_CLOSE_HRM_MARK, &m_folderhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_OPEN_MARK, &m_folderopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DIR_OPEN_HRM_MARK, &m_folderopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_TRASH_OPEN_MARK, &m_trashopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_TRASH_OPEN_HRM_MARK, &m_trashopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_TRASH_CLOSE_MARK, &m_trashxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_TRASH_CLOSE_HRM_MARK, &m_trashhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_QUEUE_CLOSE_MARK, &m_queuexpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_QUEUE_CLOSE_HRM_MARK, &m_queuehrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_QUEUE_OPEN_MARK, &m_queueopenxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_QUEUE_OPEN_HRM_MARK, &m_queueopenhrmxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DRAFTS_CLOSE_MARK, &m_draftsxpm);
-       stock_pixbuf_gdk(ctree, STOCK_PIXMAP_DRAFTS_OPEN_MARK, &m_draftsopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_CLOSE, &inboxxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_CLOSE_HRM, &inboxhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_OPEN, &inboxopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_OPEN_HRM, &inboxopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_OUTBOX_CLOSE, &outboxxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_OUTBOX_CLOSE_HRM, &outboxhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_OUTBOX_OPEN, &outboxopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_OUTBOX_OPEN_HRM, &outboxopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_CLOSE, &folderxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_CLOSE_HRM, &folderhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_OPEN, &folderopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_OPEN_HRM, &folderopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_TRASH_OPEN, &trashopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_TRASH_OPEN_HRM, &trashopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_TRASH_CLOSE, &trashxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_TRASH_CLOSE_HRM, &trashhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_QUEUE_CLOSE, &queuexpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_QUEUE_CLOSE_HRM, &queuehrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_QUEUE_OPEN, &queueopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_QUEUE_OPEN_HRM, &queueopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DRAFTS_CLOSE, &draftsxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DRAFTS_OPEN, &draftsopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_SUBS_OPEN, &foldersubsopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_SUBS_CLOSE, &foldersubsxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_NOSELECT_OPEN, &foldernoselectopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_NOSELECT_CLOSE, &foldernoselectxpm);
+
+       stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_CLOSE_MARK, &m_inboxxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_CLOSE_HRM_MARK, &m_inboxhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_OPEN_MARK, &m_inboxopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_OPEN_HRM_MARK, &m_inboxopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_OUTBOX_CLOSE_MARK, &m_outboxxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_OUTBOX_CLOSE_HRM_MARK, &m_outboxhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_OUTBOX_OPEN_MARK, &m_outboxopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_OUTBOX_OPEN_HRM_MARK, &m_outboxopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_CLOSE_MARK, &m_folderxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_CLOSE_HRM_MARK, &m_folderhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_OPEN_MARK, &m_folderopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_OPEN_HRM_MARK, &m_folderopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_TRASH_OPEN_MARK, &m_trashopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_TRASH_OPEN_HRM_MARK, &m_trashopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_TRASH_CLOSE_MARK, &m_trashxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_TRASH_CLOSE_HRM_MARK, &m_trashhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_QUEUE_CLOSE_MARK, &m_queuexpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_QUEUE_CLOSE_HRM_MARK, &m_queuehrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_QUEUE_OPEN_MARK, &m_queueopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_QUEUE_OPEN_HRM_MARK, &m_queueopenhrmxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DRAFTS_CLOSE_MARK, &m_draftsxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DRAFTS_OPEN_MARK, &m_draftsopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_SUBS_CLOSE_MARK, &m_foldersubsxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_NOSELECT_CLOSE_MARK, &m_foldernoselectxpm);
 
        normal_font = pango_font_description_from_string(NORMAL_FONT);
        if (normal_font) {
@@ -985,6 +993,9 @@ out:
 
 FolderItem *folderview_get_selected_item(FolderView *folderview)
 {
+       g_return_val_if_fail(folderview != NULL, NULL);
+       g_return_val_if_fail(folderview->ctree != NULL, NULL);
+
        GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
 
        if (!folderview->selected) return NULL;
@@ -993,6 +1004,9 @@ FolderItem *folderview_get_selected_item(FolderView *folderview)
 
 FolderItem *folderview_get_opened_item(FolderView *folderview)
 {
+       g_return_val_if_fail(folderview != NULL, NULL);
+       g_return_val_if_fail(folderview->ctree != NULL, NULL);
+
        GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
 
        if (!folderview->opened) return NULL;
@@ -1012,9 +1026,8 @@ static void folderview_set_folders(FolderView *folderview)
 static gchar *get_scan_str(FolderItem *item)
 {
        if (item->path)
-               return g_strdup_printf(_("Scanning folder %s%c%s..."),
-                                     item->folder->name, G_DIR_SEPARATOR,
-                                     item->path);
+               return g_strdup_printf(_("Scanning folder %s/%s..."),
+                                     item->folder->name, item->path);
        else
                return g_strdup_printf(_("Scanning folder %s..."),
                                      item->folder->name);      
@@ -1491,7 +1504,15 @@ static void folderview_update_node(FolderView *folderview, GtkCMCTreeNode *node)
                openxpm = mark?m_draftsopenxpm:draftsopenxpm;
                break;
        default:
-               if (item->hide_read_msgs || item->hide_read_threads) {
+               if (!item->path &&
+                   FOLDER_TYPE(item->folder) == F_IMAP &&
+                   item->folder->account->imap_subsonly) {
+                       xpm = mark?m_foldersubsxpm:foldersubsxpm;
+                       openxpm = foldersubsopenxpm;
+               } else if (item->no_select) {
+                       xpm = mark?m_foldernoselectxpm:foldernoselectxpm;
+                       openxpm = foldernoselectopenxpm;
+               } else if (item->hide_read_msgs || item->hide_read_threads) {
                        xpm = mark?m_folderhrmxpm:folderhrmxpm;
                        openxpm = mark?m_folderopenhrmxpm:folderopenhrmxpm;
                } else {
@@ -1499,10 +1520,6 @@ static void folderview_update_node(FolderView *folderview, GtkCMCTreeNode *node)
                        openxpm = mark?m_folderopenxpm:folderopenxpm;
                }
        }
-       
-       if (item->no_select) {
-               xpm = openxpm = noselectxpm;
-       }
 
        name = folder_item_get_name(item);
 
@@ -1518,7 +1535,7 @@ static void folderview_update_node(FolderView *folderview, GtkCMCTreeNode *node)
 
        if (item->search_match) {
                if (!searchicon) {
-                       stock_pixbuf_gdk(folderview->ctree, STOCK_PIXMAP_QUICKSEARCH,
+                       stock_pixbuf_gdk(STOCK_PIXMAP_QUICKSEARCH,
                         &searchicon);
                }
                xpm = openxpm = searchicon;
@@ -2113,12 +2130,16 @@ static gboolean postpone_select(void *data)
        return FALSE;
 }
 
-void folderview_close_opened(FolderView *folderview)
+void folderview_close_opened(FolderView *folderview, gboolean dirty)
 {
        if (folderview->opened) {
-               FolderItem *olditem;
-               
-               olditem = gtk_cmctree_node_get_row_data(GTK_CMCTREE(folderview->ctree), 
+               if (dirty) {
+                       folderview->opened = NULL;
+                       return;
+               }
+
+               FolderItem *olditem =
+                       gtk_cmctree_node_get_row_data(GTK_CMCTREE(folderview->ctree), 
                                                      folderview->opened);
                if (olditem) {
                        gchar *buf = g_strdup_printf(_("Closing folder %s..."), 
@@ -2191,7 +2212,7 @@ static void folderview_selected(GtkCMCTree *ctree, GtkCMCTreeNode *row,
        /* Save cache for old folder */
        /* We don't want to lose all caches if sylpheed crashed */
        /* resets folderview->opened to NULL */
-       folderview_close_opened(folderview);
+       folderview_close_opened(folderview, FALSE);
        
        /* CLAWS: set compose button type: news folder items 
         * always have a news folder as parent */
@@ -2685,6 +2706,9 @@ void folderview_reflect_prefs(void)
                        last_derive != prefs_common.derive_from_normal_font)
                update_font = TRUE;
 
+       if (!update_font)
+               return;
+
        g_free(last_smallfont);
        last_smallfont = g_strdup(SMALL_FONT);
        g_free(last_normalfont);
@@ -2693,12 +2717,10 @@ void folderview_reflect_prefs(void)
        last_boldfont = g_strdup(BOLD_FONT);
        last_derive = prefs_common.derive_from_normal_font;
 
-       if (update_font) {              
-               normal_style = normal_color_style = bold_style = 
-                       bold_color_style = bold_tgtfold_style = NULL;
+       normal_style = normal_color_style = bold_style =
+               bold_color_style = bold_tgtfold_style = NULL;
 
-               folderview_init(folderview);
-       }
+       folderview_init(folderview);
        gtk_cmclist_freeze(GTK_CMCLIST(folderview->ctree));
        folderview_column_set_titles(folderview);
        folderview_set_all();
@@ -3175,3 +3197,36 @@ void folderview_unregister_popup(FolderViewPopup *fpopup)
        }       
        g_hash_table_remove(folderview_popups, fpopup->klass);
 }
+
+void folderview_remove_item(FolderView *folderview, FolderItem *item)
+{
+       g_return_if_fail(folderview != NULL);
+       g_return_if_fail(item != NULL);
+
+       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
+       g_return_if_fail(ctree != NULL);
+
+       GtkCMCTreeNode *node =
+               gtk_cmctree_find_by_row_data(ctree, NULL, item);
+       g_return_if_fail(node != NULL);
+
+       gtk_cmctree_remove_node(ctree, node);
+}
+
+void folderview_freeze(FolderView *folderview)
+{
+       if (folderview)
+               gtk_cmclist_freeze(GTK_CMCLIST(folderview->ctree));
+}
+
+void folderview_thaw(FolderView *folderview)
+{
+       if (folderview)
+               gtk_cmclist_thaw(GTK_CMCLIST(folderview->ctree));
+}
+
+void folderview_grab_focus(FolderView *folderview)
+{
+        if (folderview)
+                gtk_widget_grab_focus(folderview->ctree);
+}