indicate IMAP mailboxes which show subs only with a green folder
[claws.git] / src / folderview.c
index 055ca5baad9dff4ac03af2ace2d7d3702ede350b..f8c7565f9f299a28d001ec60d6999c8d503566d6 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
@@ -93,6 +94,8 @@ static GdkPixbuf *queueopenhrmxpm;
 static GdkPixbuf *draftsxpm;
 static GdkPixbuf *draftsopenxpm;
 static GdkPixbuf *noselectxpm;
+static GdkPixbuf *foldersubsxpm;
+static GdkPixbuf *foldersubsopenxpm;
 
 static GdkPixbuf *m_inboxxpm;
 static GdkPixbuf *m_inboxhrmxpm;
@@ -116,6 +119,8 @@ static GdkPixbuf *m_queueopenxpm;
 static GdkPixbuf *m_queueopenhrmxpm;
 static GdkPixbuf *m_draftsxpm;
 static GdkPixbuf *m_draftsopenxpm;
+static GdkPixbuf *m_foldersubsxpm;
+static GdkPixbuf *m_foldersubsopenxpm;
 
 static GdkPixbuf *newxpm;
 static GdkPixbuf *unreadxpm;
@@ -649,6 +654,8 @@ void folderview_init(FolderView *folderview)
        stock_pixbuf_gdk(STOCK_PIXMAP_DRAFTS_CLOSE, &draftsxpm);
        stock_pixbuf_gdk(STOCK_PIXMAP_DRAFTS_OPEN, &draftsopenxpm);
        stock_pixbuf_gdk(STOCK_PIXMAP_DIR_NOSELECT, &noselectxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_SUBS_OPEN, &foldersubsopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_SUBS_CLOSE, &foldersubsxpm);
 
        stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_CLOSE_MARK, &m_inboxxpm);
        stock_pixbuf_gdk(STOCK_PIXMAP_INBOX_CLOSE_HRM_MARK, &m_inboxhrmxpm);
@@ -672,6 +679,8 @@ void folderview_init(FolderView *folderview)
        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_OPEN_MARK, &m_foldersubsopenxpm);
+       stock_pixbuf_gdk(STOCK_PIXMAP_DIR_SUBS_CLOSE_MARK, &m_foldersubsxpm);
 
        normal_font = pango_font_description_from_string(NORMAL_FONT);
        if (normal_font) {
@@ -982,6 +991,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;
@@ -990,6 +1002,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;
@@ -1487,7 +1502,12 @@ 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 = mark?m_foldersubsopenxpm:foldersubsopenxpm;
+               } else if (item->hide_read_msgs || item->hide_read_threads) {
                        xpm = mark?m_folderhrmxpm:folderhrmxpm;
                        openxpm = mark?m_folderopenhrmxpm:folderopenhrmxpm;
                } else {
@@ -2109,12 +2129,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..."), 
@@ -2187,7 +2211,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 */
@@ -3173,6 +3197,21 @@ 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)
@@ -3184,3 +3223,9 @@ 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);
+}