/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2011 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2013 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "manual.h"
#include "timing.h"
#include "log.h"
+#include "gtkcmctree.h"
#define COL_FOLDER_WIDTH 150
#define COL_NUM_WIDTH 32
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;
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;
gint width,
FolderView *folderview);
+static void mark_all_read_unread_handler (GtkAction *action,
+ gpointer data,
+ gboolean recursive,
+ gboolean read);
+
static void mark_all_read_cb (GtkAction *action,
gpointer data);
+static void mark_all_unread_cb (GtkAction *action,
+ gpointer data);
+static void mark_all_read_recursive_cb (GtkAction *action,
+ gpointer data);
+static void mark_all_unread_recursive_cb (GtkAction *action,
+ gpointer data);
static void folderview_empty_trash_cb (GtkAction *action,
gpointer data);
{
{"FolderViewPopup", NULL, "FolderViewPopup" },
{"FolderViewPopup/MarkAllRead", NULL, N_("Mark all re_ad"), NULL, NULL, G_CALLBACK(mark_all_read_cb) },
+ {"FolderViewPopup/MarkAllUnread", NULL, N_("Mark all u_nread"), NULL, NULL, G_CALLBACK(mark_all_unread_cb) },
+ {"FolderViewPopup/MarkAllReadRec", NULL, N_("Mark all read recursi_vely"), NULL, NULL, G_CALLBACK(mark_all_read_recursive_cb) },
+ {"FolderViewPopup/MarkAllUnreadRec", NULL, N_("Mark all unread recursi_vely"), NULL, NULL, G_CALLBACK(mark_all_unread_recursive_cb) },
{"FolderViewPopup/---", NULL, "---" },
{"FolderViewPopup/RunProcessing", NULL, N_("R_un processing rules"), NULL, NULL, G_CALLBACK(folderview_run_processing_cb) },
{"FolderViewPopup/SearchFolder", NULL, N_("_Search folder..."), NULL, NULL, G_CALLBACK(folderview_search_cb) },
/* 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);
gtk_cmclist_set_column_justification(GTK_CMCLIST(ctree),
col_pos[F_COL_TOTAL],
GTK_JUSTIFY_RIGHT);
- if (prefs_common.enable_dotted_lines) {
- gtk_cmctree_set_line_style(GTK_CMCTREE(ctree), GTK_CMCTREE_LINES_DOTTED);
- gtk_cmctree_set_expander_style(GTK_CMCTREE(ctree),
- GTK_CMCTREE_EXPANDER_SQUARE);
- } else {
- gtk_cmctree_set_line_style(GTK_CMCTREE(ctree), GTK_CMCTREE_LINES_NONE);
- gtk_cmctree_set_expander_style(GTK_CMCTREE(ctree),
- GTK_CMCTREE_EXPANDER_TRIANGLE);
- }
+ gtk_cmctree_set_line_style(GTK_CMCTREE(ctree), GTK_CMCTREE_LINES_NONE);
+ gtk_cmctree_set_expander_style(GTK_CMCTREE(ctree),
+ GTK_CMCTREE_EXPANDER_TRIANGLE);
gtk_sctree_set_stripes(GTK_SCTREE(ctree), prefs_common.use_stripes_in_summaries);
gtk_sctree_set_recursive_expand(GTK_SCTREE(ctree), FALSE);
g_signal_connect(G_OBJECT(ctree), "button_press_event",
G_CALLBACK(folderview_button_pressed),
folderview);
-#ifndef MAEMO
g_signal_connect(G_OBJECT(ctree), "popup-menu",
G_CALLBACK(folderview_popup_menu), folderview);
-#else
- gtk_widget_tap_and_hold_setup(GTK_WIDGET(ctree), NULL, NULL,
- GTK_TAP_AND_HOLD_NONE | GTK_TAP_AND_HOLD_NO_INTERNALS);
- g_signal_connect(G_OBJECT(ctree), "tap-and-hold",
- G_CALLBACK(folderview_popup_menu), folderview);
-#endif
g_signal_connect(G_OBJECT(ctree), "button_release_event",
G_CALLBACK(folderview_button_released),
folderview);
FolderItem *sel_item = NULL, *op_item = NULL;
GtkWidget *scrolledwin = folderview->scrolledwin;
+ if (folderview->drag_timer_id != 0) {
+ g_source_remove(folderview->drag_timer_id);
+ folderview->drag_timer_id = 0;
+ }
+ if (folderview->deferred_refresh_id != 0) {
+ g_source_remove(folderview->deferred_refresh_id);
+ folderview->deferred_refresh_id = 0;
+ }
+ if (folderview->scroll_timeout_id != 0) {
+ g_source_remove(folderview->scroll_timeout_id);
+ folderview->scroll_timeout_id = 0;
+ }
+ if (folderview->postpone_select_id != 0) {
+ g_source_remove(folderview->postpone_select_id);
+ folderview->postpone_select_id = 0;
+ }
+
if (folderview->selected)
- sel_item = gtk_cmctree_node_get_row_data(GTK_CMCTREE(ctree), folderview->selected);
+ sel_item = folderview_get_selected_item(folderview);
if (folderview->opened)
- op_item = gtk_cmctree_node_get_row_data(GTK_CMCTREE(ctree), folderview->opened);
+ op_item = folderview_get_opened_item(folderview);
debug_print("recreating tree...\n");
gtk_widget_destroy(folderview->ctree);
folderview->target_list = gtk_target_list_new(folderview_drag_types, 2);
folderview_list = g_list_append(folderview_list, folderview);
- folderview->deferred_refresh_id = -1;
- folderview->scroll_timeout_id = -1;
+
+ folderview->drag_timer_id = 0;
+ folderview->deferred_refresh_id = 0;
+ folderview->scroll_timeout_id = 0;
+ folderview->postpone_select_id = 0;
+
return folderview;
}
{
GtkWidget *ctree = folderview->ctree;
GdkColor gdk_color;
+ PangoFontDescription *normal_font;
+
+ 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) {
+ gtk_widget_modify_font(ctree, normal_font);
+ pango_font_description_free(normal_font);
+ }
+ gtk_cmclist_set_row_height(GTK_CMCLIST(ctree), 0);
- 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);
-
if (!normal_style) {
PangoFontDescription *font_desc;
normal_style = gtk_style_copy(gtk_widget_get_style(ctree));
gtkut_convert_int_to_gdk_color(prefs_common.color_new, &gdk_color);
normal_color_style = gtk_style_copy(normal_style);
normal_color_style->fg[GTK_STATE_NORMAL] = gdk_color;
-
- gtk_widget_set_style(ctree, normal_style);
}
if (!bold_style) {
gtkut_convert_int_to_gdk_color(prefs_common.color_new, &gdk_color);
bold_style = gtk_style_copy(gtk_widget_get_style(ctree));
if (prefs_common.derive_from_normal_font || !BOLD_FONT) {
+ PangoFontDescription *font_desc;
+ font_desc = pango_font_description_from_string(NORMAL_FONT);
+ if (font_desc) {
+ pango_font_description_free(bold_style->font_desc);
+ bold_style->font_desc = font_desc;
+ }
pango_font_description_set_weight
(bold_style->font_desc, PANGO_WEIGHT_BOLD);
} else {
debug_print("doing deferred folderview_set now\n");
folderview_set(folderview);
- folderview->deferred_refresh_id = -1;
+ folderview->deferred_refresh_id = 0;
return FALSE;
}
return;
if (mainwin->lock_count) {
- if (folderview->deferred_refresh_id == -1)
+ if (folderview->deferred_refresh_id == 0)
folderview->deferred_refresh_id =
g_timeout_add(500, folderview_defer_set, folderview);
debug_print("deferred folderview_set\n");
main_window_cursor_wait(mainwin);
if (folderview->selected)
- sel_item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ sel_item = folderview_get_selected_item(folderview);
if (folderview->opened)
- op_item = gtk_cmctree_node_get_row_data(ctree, folderview->opened);
+ op_item = folderview_get_opened_item(folderview);
folderview->selected = NULL;
folderview->opened = NULL;
}
static void mark_all_read_cb(GtkAction *action, gpointer data)
+{
+ mark_all_read_unread_handler(action, data, FALSE, TRUE);
+}
+
+static void mark_all_unread_cb(GtkAction *action, gpointer data)
+{
+ mark_all_read_unread_handler(action, data, FALSE, FALSE);
+}
+
+static void mark_all_read_recursive_cb(GtkAction *action, gpointer data)
+{
+ mark_all_read_unread_handler(action, data, TRUE, TRUE);
+}
+
+static void mark_all_unread_recursive_cb(GtkAction *action, gpointer data)
+{
+ mark_all_read_unread_handler(action, data, TRUE, FALSE);
+}
+
+static void mark_all_read_unread_handler(GtkAction *action, gpointer data,
+ gboolean recursive, gboolean read)
{
FolderView *folderview = (FolderView *)data;
FolderItem *item;
AlertValue val;
+ gchar *message;
+ gchar *title;
item = folderview_get_selected_item(folderview);
if (item == NULL)
return;
- if (folderview->summaryview->folder_item != item
- && prefs_common.ask_mark_all_read) {
- val = alertpanel_full(_("Mark all as read"),
- _("Do you really want to mark all mails in this "
- "folder as read ?"), GTK_STOCK_NO, GTK_STOCK_YES, NULL,
+ if (read) {
+ title = _("Mark all as read");
+ message = recursive? _("Do you really want to mark all mails in this "
+ "folder and its sub-folders as read?") :
+ _("Do you really want to mark all mails in this "
+ "folder as read?");
+ } else {
+ title = _("Mark all as unread");
+ message = recursive? _("Do you really want to mark all mails in this "
+ "folder and its sub-folders as unread?") :
+ _("Do you really want to mark all mails in this "
+ "folder as unread?");
+ }
+ if (folderview->summaryview->folder_item != item &&
+ prefs_common.ask_mark_all_read) {
+ val = alertpanel_full(title, message,
+ GTK_STOCK_NO, GTK_STOCK_YES, NULL,
TRUE, NULL, ALERT_QUESTION, G_ALERTDEFAULT);
if ((val & ~G_ALERTDISABLE) != G_ALERTALTERNATE)
else if (val & G_ALERTDISABLE)
prefs_common.ask_mark_all_read = FALSE;
}
-
folder_item_update_freeze();
- if (folderview->summaryview->folder_item != item)
+ if (folderview->summaryview->folder_item != item && !recursive)
summary_lock(folderview->summaryview);
else
summary_freeze(folderview->summaryview);
- folderutils_mark_all_read(item);
-
- if (folderview->summaryview->folder_item != item)
+ if (read) {
+ if (recursive)
+ folderutils_mark_all_read_recursive(item);
+ else
+ folderutils_mark_all_read(item);
+ } else {
+ if (recursive)
+ folderutils_mark_all_unread_recursive(item);
+ else
+ folderutils_mark_all_unread(item);
+ }
+ if (folderview->summaryview->folder_item != item && !recursive)
summary_unlock(folderview->summaryview);
else
summary_thaw(folderview->summaryview);
return;
}
+ gtk_cmclist_freeze(GTK_CMCLIST(ctree));
+ gtkut_ctree_expand_parent_all(ctree, node);
+
folderview->open_folder = TRUE;
gtkut_ctree_set_focus_row(ctree, node);
gtk_cmctree_select(ctree, node);
+ gtk_cmclist_thaw(GTK_CMCLIST(ctree));
if ((folderview->summaryview->folder_item &&
folderview->summaryview->folder_item->total_msgs > 0) ||
prefs_common.layout_mode == SMALL_LAYOUT)
- summary_grab_focus(folderview->summaryview);
+ summary_select_node(folderview->summaryview,
+ folderview->summaryview->selected, -1);
else
gtk_widget_grab_focus(folderview->ctree);
-
- gtkut_ctree_expand_parent_all(ctree, node);
}
void folderview_unselect(FolderView *folderview)
folderview->selected = folderview->opened = NULL;
}
-static GtkCMCTreeNode *folderview_find_next_marked(GtkCMCTree *ctree,
- GtkCMCTreeNode *node)
+static GtkCMCTreeNode *folderview_find_next_with_flag(GtkCMCTree *ctree,
+ GtkCMCTreeNode *node,
+ MsgPermFlags flag)
{
FolderItem *item;
for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
item = gtk_cmctree_node_get_row_data(ctree, node);
- if (item && item->marked_msgs > 0 && item->stype != F_TRASH)
- return node;
+ if (!item)
+ continue;
+ if (item->stype == F_TRASH || item->stype == F_DRAFT)
+ continue;
+ switch (flag) {
+ case MSG_UNREAD:
+ if(item->unread_msgs > 0)
+ return node;
+ break;
+ case MSG_NEW:
+ if(item->new_msgs > 0)
+ return node;
+ break;
+ case MSG_MARKED:
+ if(item->marked_msgs > 0)
+ return node;
+ break;
+ default:
+ if(item->total_msgs > 0)
+ return node;
+ break;
+ }
}
return NULL;
}
-void folderview_select_next_marked(FolderView *folderview)
+void folderview_select_next_with_flag(FolderView *folderview,
+ MsgPermFlags flag)
{
GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
GtkCMCTreeNode *node = NULL;
EntryAction last_summary_select_prio = prefs_common.summary_select_prio[0];
- gboolean last_open = prefs_common.always_show_msg;
- prefs_common.summary_select_prio[0] = ACTION_MARKED;
- prefs_common.always_show_msg = OPENMSG_ALWAYS;
-
- if ((node = folderview_find_next_marked(ctree, folderview->opened))
- != NULL) {
- folderview_select_node(folderview, node);
- goto out;
- }
-
- if (!folderview->opened ||
- folderview->opened == GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list)) {
- goto out;
- }
- /* search again from the first node */
- if ((node = folderview_find_next_marked(ctree, NULL)) != NULL)
- folderview_select_node(folderview, node);
-
-out:
- prefs_common.summary_select_prio[0] = last_summary_select_prio;
- prefs_common.always_show_msg = last_open;
-}
-
-static GtkCMCTreeNode *folderview_find_next_unread(GtkCMCTree *ctree,
- GtkCMCTreeNode *node)
-{
- FolderItem *item;
-
- if (node)
- node = gtkut_ctree_node_next(ctree, node);
- else
- node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list);
-
- for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
- item = gtk_cmctree_node_get_row_data(ctree, node);
- if (item && item->unread_msgs > 0 && item->stype != F_TRASH)
- return node;
+ switch (flag) {
+ case MSG_UNREAD:
+ prefs_common.summary_select_prio[0] = ACTION_UNREAD;
+ break;
+ case MSG_NEW:
+ prefs_common.summary_select_prio[0] = ACTION_NEW;
+ break;
+ case MSG_MARKED:
+ prefs_common.summary_select_prio[0] = ACTION_MARKED;
+ break;
+ default:
+ prefs_common.summary_select_prio[0] = ACTION_FIRST_LIST;
+ break;
}
- return NULL;
-}
-
-void folderview_select_next_unread(FolderView *folderview, gboolean force_open)
-{
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
- GtkCMCTreeNode *node = NULL;
- EntryAction last_summary_select_prio = prefs_common.summary_select_prio[0];
- gboolean last_open = prefs_common.always_show_msg;
-
- prefs_common.summary_select_prio[0] = ACTION_UNREAD;
- prefs_common.always_show_msg = force_open ? OPENMSG_ALWAYS : last_open;
-
- if ((node = folderview_find_next_unread(ctree, folderview->opened))
- != NULL) {
+ node = folderview_find_next_with_flag(ctree, folderview->opened, flag);
+ if (node != NULL) {
folderview_select_node(folderview, node);
goto out;
}
folderview->opened == GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list)) {
goto out;
}
+
/* search again from the first node */
- if ((node = folderview_find_next_unread(ctree, NULL)) != NULL)
+ node = folderview_find_next_with_flag(ctree, NULL, flag);
+ if (node != NULL)
folderview_select_node(folderview, node);
out:
prefs_common.summary_select_prio[0] = last_summary_select_prio;
- prefs_common.always_show_msg = last_open;
}
-static GtkCMCTreeNode *folderview_find_next_new(GtkCMCTree *ctree,
- GtkCMCTreeNode *node)
+FolderItem *folderview_get_selected_item(FolderView *folderview)
{
- FolderItem *item;
-
- if (node)
- node = gtkut_ctree_node_next(ctree, node);
- else
- node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list);
-
- for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
- item = gtk_cmctree_node_get_row_data(ctree, node);
- if (item && item->new_msgs > 0 && item->stype != F_TRASH)
- return node;
- }
+ g_return_val_if_fail(folderview != NULL, NULL);
+ g_return_val_if_fail(folderview->ctree != NULL, NULL);
- return NULL;
-}
-
-void folderview_select_next_new(FolderView *folderview)
-{
GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
- GtkCMCTreeNode *node = NULL;
- EntryAction last_summary_select_prio = prefs_common.summary_select_prio[0];
- gboolean last_open = prefs_common.always_show_msg;
-
- prefs_common.summary_select_prio[0] = ACTION_NEW;
- prefs_common.always_show_msg = OPENMSG_ALWAYS;
-
- if ((node = folderview_find_next_new(ctree, folderview->opened))
- != NULL) {
- folderview_select_node(folderview, node);
- goto out;
- }
- if (!folderview->opened ||
- folderview->opened == GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list)) {
- goto out;
- }
- /* search again from the first node */
- if ((node = folderview_find_next_new(ctree, NULL)) != NULL)
- folderview_select_node(folderview, node);
-
-out:
- prefs_common.summary_select_prio[0] = last_summary_select_prio;
- prefs_common.always_show_msg = last_open;
+ if (!folderview->selected) return NULL;
+ return gtk_cmctree_node_get_row_data(ctree, folderview->selected);
}
-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->selected) return NULL;
- return gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ if (!folderview->opened) return NULL;
+ return gtk_cmctree_node_get_row_data(ctree, folderview->opened);
}
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 ..."),
+ return g_strdup_printf(_("Scanning folder %s..."),
item->folder->name);
}
static void folderview_scan_tree_func(Folder *folder, FolderItem *item,
inc_unlock();
}
-void folderview_fast_rescan_tree(Folder *folder)
-{
- GtkWidget *window;
- MainWindow *mainwin = mainwindow_get_mainwindow();
- FolderView *folderview = NULL;
- GtkAdjustment *pos = NULL;
- gint height = 0;
-
- cm_return_if_fail(folder != NULL);
-
- if (!folder->klass->scan_tree) return;
-
- inc_lock();
-
- window = label_window_create(_("Scanning folder tree..."));
-
- if (mainwin)
- folderview = mainwin->folderview;
-
- if (folderview) {
- pos = gtk_scrolled_window_get_vadjustment(
- GTK_SCROLLED_WINDOW(folderview->scrolledwin));
- height = gtk_adjustment_get_value(pos);
- }
-
- folder_set_ui_func(folder, folderview_scan_tree_func, NULL);
- folder_fast_scan_tree(folder);
- folder_set_ui_func(folder, NULL, NULL);
-
- folderview_set_all();
-
- if (folderview) {
- pos = gtk_scrolled_window_get_vadjustment(
- GTK_SCROLLED_WINDOW(folderview->scrolledwin));
- gtk_adjustment_set_value(pos, height);
- gtk_adjustment_changed(pos);
- }
- label_window_destroy(window);
- inc_unlock();
-}
-
/** folderview_check_new()
* Scan and update the folder and return the
* count the number of new messages since last check.
inc_unlock();
}
+static gboolean folderview_have_children_sub(FolderView *folderview,
+ FolderItem *item,
+ gboolean in_sub)
+{
+ GNode *node = NULL;
+
+ if (!item || !item->folder || !item->folder->node)
+ return FALSE;
+
+ node = item->folder->node;
+
+ node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, item);
+ node = node->children;
+
+ if (in_sub && item->total_msgs > 0) {
+ return TRUE;
+ }
+
+ while (node != NULL) {
+ if (node && node->data) {
+ FolderItem *next_item = (FolderItem*) node->data;
+ node = node->next;
+ if (folderview_have_children_sub(folderview,
+ next_item, TRUE))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static gboolean folderview_have_children(FolderView *folderview,
+ FolderItem *item)
+{
+ return folderview_have_children_sub(folderview, item, FALSE);
+}
+
static gboolean folderview_have_new_children_sub(FolderView *folderview,
FolderItem *item,
gboolean in_sub)
return folderview_have_unread_children_sub(folderview, item, FALSE);
}
+static gboolean folderview_have_read_children_sub(FolderView *folderview,
+ FolderItem *item,
+ gboolean in_sub)
+{
+ GNode *node = NULL;
+
+ if (!item || !item->folder || !item->folder->node) {
+ return FALSE;
+ }
+
+ node = item->folder->node;
+
+ node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, item);
+ node = node->children;
+
+ if (in_sub &&
+ (((item->total_msgs > 0) &&
+ (item->unread_msgs != (item->total_msgs - item->ignored_msgs))))) {
+ return TRUE;
+ }
+
+ while (node != NULL) {
+ if (node && node->data) {
+ FolderItem *next_item = (FolderItem*) node->data;
+ node = node->next;
+ if (folderview_have_read_children_sub(folderview,
+ next_item,
+ TRUE)) {
+ return TRUE;
+ }
+ }
+ }
+
+debug_print("-> false 2 %s\n", item->name);
+ return FALSE;
+}
+
+static gboolean folderview_have_read_children(FolderView *folderview,
+ FolderItem *item)
+{
+gboolean ret;
+ ret = folderview_have_read_children_sub(folderview, item, FALSE);
+debug_print("-> %s 0 (%d)\n", ret?"true":"false", ret);
+ return ret;
+}
+
static gboolean folderview_have_matching_children_sub(FolderView *folderview,
FolderItem *item,
gboolean in_sub)
}
switch (stype) {
case F_INBOX:
- if (item->hide_read_msgs) {
+ if (item->hide_read_msgs || item->hide_read_threads) {
xpm = mark?m_inboxhrmxpm:inboxhrmxpm;
openxpm = mark?m_inboxopenhrmxpm:inboxopenhrmxpm;
} else {
}
break;
case F_OUTBOX:
- if (item->hide_read_msgs) {
+ if (item->hide_read_msgs || item->hide_read_threads) {
xpm = mark?m_outboxhrmxpm:outboxhrmxpm;
openxpm = mark?m_outboxopenhrmxpm:outboxopenhrmxpm;
} else {
}
break;
case F_QUEUE:
- if (item->hide_read_msgs) {
+ if (item->hide_read_msgs || item->hide_read_threads) {
xpm = mark?m_queuehrmxpm:queuehrmxpm;
openxpm = mark?m_queueopenhrmxpm:queueopenhrmxpm;
} else {
}
break;
case F_TRASH:
- if (item->hide_read_msgs) {
+ if (item->hide_read_msgs || item->hide_read_threads) {
xpm = mark?m_trashhrmxpm:trashhrmxpm;
openxpm = mark?m_trashopenhrmxpm:trashopenhrmxpm;
} else {
openxpm = mark?m_draftsopenxpm:draftsopenxpm;
break;
default:
- if (item->hide_read_msgs) {
+ 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 {
openxpm = mark?m_folderopenxpm:folderopenxpm;
}
}
-
- if (item->no_select) {
- xpm = openxpm = noselectxpm;
- }
name = folder_item_get_name(item);
if (item->search_match) {
if (!searchicon) {
- stock_pixbuf_gdk(folderview->ctree, STOCK_PIXMAP_QUICKSEARCH,
+ stock_pixbuf_gdk(STOCK_PIXMAP_QUICKSEARCH,
&searchicon);
}
xpm = openxpm = searchicon;
str = g_strdup_printf("%s", name);
}
}
- gtk_sctree_set_node_info(ctree, node, str, FOLDER_SPACING,
+ gtk_cmctree_set_node_info(ctree, node, str, FOLDER_SPACING,
xpm, openxpm,
FALSE, GTK_CMCTREE_ROW(node)->expanded);
g_free(str);
}
if (folder_has_parent_of_type(item, F_OUTBOX) ||
- folder_has_parent_of_type(item, F_DRAFT) ||
folder_has_parent_of_type(item, F_TRASH)) {
use_bold = use_color = FALSE;
} else if (folder_has_parent_of_type(item, F_QUEUE)) {
break;
}
}
+ if (!GTK_CMCTREE_ROW(node)->expanded &&
+ use_bold == FALSE &&
+ folderview_have_children(folderview, item))
+ use_bold = use_color = TRUE;
+ procmsg_msg_list_free(list);
} else {
/* if unread messages exist, print with bold font */
use_bold = (item->unread_msgs > 0|| item->new_msgs > 0)
ctree = GTK_CMCTREE(folderview->ctree);
node = gtk_cmctree_find_by_row_data(ctree, NULL, item);
- if (node) {
+ if (node && item->search_match != matches) {
item->search_match = matches;
folderview_update_node(folderview, node);
}
if ((update_info->update_flags & F_ITEM_UPDATE_CONTENT) &&
update_info->item == folderview->summaryview->folder_item &&
update_info->item != NULL)
- if (!quicksearch_is_active(folderview->summaryview->quicksearch))
+ if (!quicksearch_has_sat_predicate(folderview->summaryview->quicksearch))
summary_show(folderview->summaryview, update_info->item);
}
node = gtk_cmctree_find_by_row_data(ctree, root, item);
if (!node)
- g_warning("%s not found.\n", item->path);
+ g_warning("%s not found.", item->path);
else {
parent = GTK_CMCTREE_ROW(node)->parent;
if (*prev && parent == GTK_CMCTREE_ROW(*prev)->parent)
tmp = gtk_cmctree_node_get_row_data
(ctree, sibling);
- if (tmp->stype != F_NORMAL)
+ if (tmp && tmp->stype != F_NORMAL)
sibling = GTK_CMCTREE_ROW(sibling)->sibling;
else
break;
fpopup->add_menuitems(ui_manager, item);
MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "MarkAllRead", "FolderViewPopup/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
+ MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "MarkAllUnread", "FolderViewPopup/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
+ MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "MarkAllReadRec", "FolderViewPopup/MarkAllReadRec", GTK_UI_MANAGER_MENUITEM)
+ MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "MarkAllUnreadRec", "FolderViewPopup/MarkAllUnreadRec", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Separator1", "FolderViewPopup/---", GTK_UI_MANAGER_SEPARATOR)
MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "RunProcessing", "FolderViewPopup/RunProcessing", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "SearchFolder", "FolderViewPopup/SearchFolder", GTK_UI_MANAGER_MENUITEM)
#define SET_SENS(name, sens) \
cm_menu_set_sensitive_full(ui_manager, "Popup/"name, sens)
- SET_SENS("FolderViewPopup/MarkAllRead", item->unread_msgs >= 1);
- SET_SENS("FolderViewPopup/SearchFolder", item->total_msgs >= 1 &&
+ SET_SENS("FolderViewPopup/MarkAllRead", item->unread_msgs > 0);
+ SET_SENS("FolderViewPopup/MarkAllUnread", (item->total_msgs > 0) &&
+ (item->unread_msgs != (item->total_msgs - item->ignored_msgs)));
+ SET_SENS("FolderViewPopup/MarkAllReadRec", folderview_have_unread_children(folderview,item));
+ SET_SENS("FolderViewPopup/MarkAllUnreadRec", folderview_have_read_children(folderview,item));
+ SET_SENS("FolderViewPopup/SearchFolder", item->total_msgs > 0 &&
folderview->selected == folderview->opened);
SET_SENS("FolderViewPopup/Properties", TRUE);
static gboolean folderview_key_pressed(GtkWidget *widget, GdkEventKey *event,
FolderView *folderview)
{
+ GtkCMCTreeNode *node;
+ FolderItem *item;
+
if (!event) return FALSE;
if (quicksearch_has_focus(folderview->summaryview->quicksearch))
return FALSE;
switch (event->keyval) {
- case GDK_Right:
-#ifndef GENERIC_UMPC
- case GDK_Return:
- case GDK_KP_Enter:
-#endif
+ case GDK_KEY_Right:
if (folderview->selected) {
- folderview_select_node(folderview,
- folderview->selected);
+ if (GTK_CMCTREE_ROW(folderview->selected)->children != NULL
+ && !GTK_CMCTREE_ROW(folderview->selected)->expanded)
+ gtk_cmctree_expand(GTK_CMCTREE(folderview->ctree),
+ folderview->selected);
+ else
+ folderview_select_node(folderview,
+ folderview->selected);
}
break;
#ifdef GENERIC_UMPC
- case GDK_Return:
+ case GDK_KEY_Return:
if (folderview->selected && GTK_CMCTREE_ROW(folderview->selected)->children) {
gtk_cmctree_toggle_expansion(
GTK_CMCTREE(folderview->ctree),
folderview->selected);
}
break;
+#else
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter:
+ if (folderview->selected)
+ folderview_select_node(folderview, folderview->selected);
+ break;
#endif
- case GDK_space:
+ case GDK_KEY_space:
BREAK_ON_MODIFIER_KEY();
if (folderview->selected) {
if (folderview->opened == folderview->selected &&
(!folderview->summaryview->folder_item ||
folderview->summaryview->folder_item->total_msgs == 0))
- folderview_select_next_unread(folderview, TRUE);
+ folderview_select_next_with_flag(folderview, MSG_UNREAD);
else
folderview_select_node(folderview,
folderview->selected);
}
break;
+ case GDK_KEY_Left:
+ if (folderview->selected) {
+ if (GTK_CMCTREE_ROW(folderview->selected)->expanded) {
+ gtk_cmctree_collapse(GTK_CMCTREE(folderview->ctree),
+ folderview->selected);
+ } else {
+ if ((item = gtk_cmctree_node_get_row_data(GTK_CMCTREE(folderview->ctree),
+ folderview->selected))) {
+ if ((node = gtk_cmctree_find_by_row_data(GTK_CMCTREE(folderview->ctree),
+ NULL, folder_item_parent(item)))) {
+ gtk_sctree_select(GTK_SCTREE(folderview->ctree), node);
+ if (!gtk_cmctree_node_is_visible(GTK_CMCTREE(folderview->ctree), node))
+ gtk_cmctree_node_moveto(GTK_CMCTREE(folderview->ctree),
+ node, -1, 0, 0);
+ }
+ }
+ }
+ }
+ break;
+ case GDK_KEY_Home:
+ case GDK_KEY_End:
+ if (event->keyval == GDK_KEY_Home)
+ node = gtk_cmctree_node_nth(GTK_CMCTREE(folderview->ctree), 0);
+ else
+ node = gtk_cmctree_last(GTK_CMCTREE(folderview->ctree),
+ gtk_cmctree_node_nth(GTK_CMCTREE(folderview->ctree), 0));
+
+ gtk_sctree_select(GTK_SCTREE(folderview->ctree), node);
+
+ if (!gtk_cmctree_node_is_visible(GTK_CMCTREE(folderview->ctree), node))
+ gtk_cmctree_node_moveto(GTK_CMCTREE(folderview->ctree),
+ node, -1, 0, 0);
+ break;
default:
break;
}
{
PostponedSelectData *psdata = (PostponedSelectData *)data;
debug_print("trying again\n");
+
+ psdata->folderview->postpone_select_id = 0;
psdata->folderview->open_folder = TRUE;
main_window_cursor_normal(psdata->folderview->mainwin);
STATUSBAR_POP(psdata->folderview->mainwin);
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..."),
+ gchar *buf = g_strdup_printf(_("Closing folder %s..."),
olditem->path ? olditem->path:olditem->name);
/* will be null if we just moved the previously opened folder */
STATUSBAR_PUSH(folderview->mainwin, buf);
/* 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 */
gtk_cmctree_expand(ctree, row);
/* ungrab the mouse event */
- if (gtkut_widget_has_grab(GTK_WIDGET(ctree))) {
+ if (gtk_widget_has_grab(GTK_WIDGET(ctree))) {
gtk_grab_remove(GTK_WIDGET(ctree));
if (gdk_pointer_is_grabbed())
gdk_pointer_ungrab(GDK_CURRENT_TIME);
/* Open Folder */
/* TODO: wwp: avoid displaying (null) in the status bar */
- buf = g_strdup_printf(_("Opening Folder %s..."), item->path ?
+ buf = g_strdup_printf(_("Opening folder %s..."), item->path ?
item->path : "(null)");
debug_print("%s\n", buf);
STATUSBAR_PUSH(folderview->mainwin, buf);
item->path ? item->path:item->name);
folderview->open_folder = FALSE;
can_select = TRUE;
- g_timeout_add(500, postpone_select, data);
+ if (folderview->postpone_select_id != 0)
+ g_source_remove(folderview->postpone_select_id);
+ folderview->postpone_select_id = g_timeout_add(500, postpone_select, data);
END_TIMING();
return;
}
static void folderview_empty_trash_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
FolderItem *item;
GSList *mlist = NULL;
GSList *cur = NULL;
PrefsAccount *ac;
if (!folderview->selected) return;
- item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ item = folderview_get_selected_item(folderview);
cm_return_if_fail(item != NULL);
cm_return_if_fail(item->folder != NULL);
if (prefs_common.ask_on_clean) {
if (alertpanel(_("Empty trash"),
_("Delete all messages in trash?"),
- GTK_STOCK_CANCEL, _("+_Empty trash"), NULL) != G_ALERTALTERNATE)
+ GTK_STOCK_CANCEL, g_strconcat("+", _("_Empty trash"), NULL), NULL) != G_ALERTALTERNATE)
return;
}
static void folderview_send_queue_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
FolderItem *item;
FolderItem *special_queue = NULL;
PrefsAccount *ac;
gchar *errstr = NULL;
if (!folderview->selected) return;
- item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ item = folderview_get_selected_item(folderview);
cm_return_if_fail(item != NULL);
cm_return_if_fail(item->folder != NULL);
static void folderview_run_processing_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
FolderItem *item;
if (!folderview->selected) return;
- item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ item = folderview_get_selected_item(folderview);
cm_return_if_fail(item != NULL);
cm_return_if_fail(item->folder != NULL);
static void folderview_property_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
FolderItem *item;
if (!folderview->selected) return;
- item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ item = folderview_get_selected_item(folderview);
cm_return_if_fail(item != NULL);
cm_return_if_fail(item->folder != NULL);
void folderview_move_folder(FolderView *folderview, FolderItem *from_folder,
FolderItem *to_folder, gboolean copy)
{
- FolderItem *from_parent = NULL;
FolderItem *new_folder = NULL;
- GtkCMCTreeNode *src_node = NULL;
gchar *buf;
gint status;
cm_return_if_fail(from_folder != NULL);
cm_return_if_fail(to_folder != NULL);
- src_node = gtk_cmctree_find_by_row_data(GTK_CMCTREE(folderview->ctree), NULL, from_folder);
- from_parent = folder_item_parent(from_folder);
-
if (prefs_common.warn_dnd) {
- buf = g_strdup_printf(copy ? _("Do you really want to copy folder '%s' in '%s' ?"):
- _("Do you really want to make folder '%s' a subfolder of '%s' ?"),
+ buf = g_strdup_printf(copy ? _("Do you really want to copy folder '%s' in '%s'?"):
+ _("Do you really want to make folder '%s' a subfolder of '%s'?"),
from_folder->name, to_folder->name);
status = alertpanel_full(copy ? _("Copy folder"):_("Move folder"), buf,
GTK_STOCK_NO, GTK_STOCK_YES, NULL, TRUE,
statusbar_verbosity_set(FALSE);
folder_item_update_freeze();
+ gtk_cmclist_freeze(GTK_CMCLIST(folderview->ctree));
if ((status = folder_item_move_to(from_folder, to_folder, &new_folder, copy)) == F_MOVE_OK) {
statusbar_verbosity_set(FALSE);
main_window_cursor_normal(folderview->mainwin);
gtk_cmctree_find_by_row_data(GTK_CMCTREE(folderview->ctree),
NULL, to_folder), new_folder->folder);
folderview_select(folderview, new_folder);
+ gtk_cmclist_thaw(GTK_CMCLIST(folderview->ctree));
} else {
statusbar_verbosity_set(FALSE);
main_window_cursor_normal(folderview->mainwin);
STATUSBAR_POP(folderview->mainwin);
+ gtk_cmclist_thaw(GTK_CMCLIST(folderview->ctree));
folder_item_update_thaw();
switch (status) {
case F_MOVE_FAILED_DEST_IS_PARENT:
static void folderview_processing_cb(GtkAction *action, gpointer data)
{
FolderView *folderview = (FolderView *)data;
- GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
FolderItem *item;
gchar *id, *title;
if (!folderview->selected) return;
- item = gtk_cmctree_node_get_row_data(ctree, folderview->selected);
+ item = folderview_get_selected_item(folderview);
cm_return_if_fail(item != NULL);
cm_return_if_fail(item->folder != NULL);
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);
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;
-
- folderview_init(folderview);
+#define STYLE_FREE(s) \
+ if (s != NULL) { \
+ g_object_unref(s); \
+ s = NULL; \
}
+
+ STYLE_FREE(normal_style);
+ STYLE_FREE(normal_color_style);
+ STYLE_FREE(bold_style);
+ STYLE_FREE(bold_color_style);
+ STYLE_FREE(bold_tgtfold_style);
+
+#undef STYLE_FREE
+
+ folderview_init(folderview);
gtk_cmclist_freeze(GTK_CMCLIST(folderview->ctree));
folderview_column_set_titles(folderview);
folderview_set_all();
static void drag_state_stop(FolderView *folderview)
{
- if (folderview->drag_timer)
- g_source_remove(folderview->drag_timer);
- folderview->drag_timer = 0;
+ if (folderview->drag_timer_id)
+ g_source_remove(folderview->drag_timer_id);
+ folderview->drag_timer_id = 0;
folderview->drag_node = NULL;
}
}
}
folderview->drag_item = NULL;
- folderview->drag_timer = 0;
+ folderview->drag_timer_id = 0;
return FALSE;
}
* we need to call drag_state_stop() */
drag_state_stop(folderview);
/* request expansion */
- if (0 != (folderview->drag_timer = g_timeout_add
+ if (0 != (folderview->drag_timer_id = g_timeout_add
(prefs_common.hover_timeout,
(GSourceFunc)folderview_defer_expand,
folderview))) {
FolderView *folderview)
{
FolderItem *item;
- GList *cur;
+ GList *sel;
gchar *source = NULL;
if (info == TARGET_DUMMY) {
- for (cur = GTK_CMCLIST(folderview->ctree)->selection;
- cur != NULL; cur = cur->next) {
- item = gtk_cmctree_node_get_row_data
- (GTK_CMCTREE(folderview->ctree),
- GTK_CMCTREE_NODE(cur->data));
- if (item) {
- source = g_strdup_printf ("FROM_OTHER_FOLDER%s", folder_item_get_identifier(item));
- gtk_selection_data_set(selection_data,
- gtk_selection_data_get_target(selection_data), 8,
- source, strlen(source));
- break;
- } else
- return;
+ sel = GTK_CMCLIST(folderview->ctree)->selection;
+ if (!sel)
+ return;
+
+ item = gtk_cmctree_node_get_row_data
+ (GTK_CMCTREE(folderview->ctree),
+ GTK_CMCTREE_NODE(sel->data));
+ if (item) {
+ source = g_strdup_printf ("FROM_OTHER_FOLDER%s", folder_item_get_identifier(item));
+ gtk_selection_data_set(selection_data,
+ gtk_selection_data_get_target(selection_data), 8,
+ source, strlen(source));
}
} else {
- g_warning("unknown info %d\n", info);
+ g_warning("unknown info %d", info);
}
}
if (folderview->opened == node)
folderview->opened = NULL;
}
+ } else if (hookdata->update_flags & FOLDER_MOVE_FOLDERITEM) {
+ /* do nothing, it's done by the ADD and REMOVE) */
} else if (hookdata->update_flags & (FOLDER_TREE_CHANGED | FOLDER_ADD_FOLDER | FOLDER_REMOVE_FOLDER))
folderview_set(folderview);
(int)gtk_adjustment_get_page_size(pos);
if (folderview->scroll_value == 0) {
- folderview->scroll_timeout_id = -1;
+ folderview->scroll_timeout_id = 0;
return FALSE;
}
} else {
folderview->scroll_value = 0;
}
- if (folderview->scroll_value != 0 && folderview->scroll_timeout_id == -1) {
+ if (folderview->scroll_value != 0 && folderview->scroll_timeout_id == 0) {
folderview->scroll_timeout_id =
g_timeout_add(30, folderview_dnd_scroll_cb,
folderview);
}
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);
+}