#include "statusbar.h"
#include "hooks.h"
#include "folderutils.h"
-#include "common/partial_download.h"
+#include "partial_download.h"
typedef enum
{
};
static GtkItemFactoryEntry folder_view_trash_popup_entries[] = {
- {N_("/---"), NULL, NULL, 0, "<Separator>"},
+ {N_("/------"), NULL, NULL, 0, "<Separator>"},
{N_("/Empty trash..."), NULL, folderview_empty_trash_cb, 0, NULL},
};
{
FolderItem *item;
- item = folderview_get_selected(folderview);
+ item = folderview_get_selected_item(folderview);
if (item == NULL)
return;
folderview_select_node(folderview, node);
}
+FolderItem *folderview_get_selected_item(FolderView *folderview)
+{
+ GtkCTree *ctree = GTK_CTREE(folderview->ctree);
+
+ if (!folderview->selected) return NULL;
+ return gtk_ctree_node_get_row_data(ctree, folderview->selected);
+}
+
void folderview_update_msg_num(FolderView *folderview, GtkCTreeNode *row)
{
GtkCTree *ctree = GTK_CTREE(folderview->ctree);
return FALSE;
}
+static gboolean folderview_search_matching_recursive(GtkCTree *ctree,
+ GtkCTreeNode *node)
+{
+ FolderItem *item;
+
+ if (node) {
+ item = gtk_ctree_node_get_row_data(ctree, node);
+ if (item) {
+ if (item->search_match)
+ return TRUE;
+ }
+ node = GTK_CTREE_ROW(node)->children;
+ } else
+ node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
+
+ while (node) {
+ if (folderview_search_matching_recursive(ctree, node) == TRUE)
+ return TRUE;
+ node = GTK_CTREE_ROW(node)->sibling;
+ }
+
+ return FALSE;
+}
+
+static gboolean folderview_have_matching_children(FolderView *folderview,
+ GtkCTreeNode *node)
+{
+ GtkCTree *ctree = GTK_CTREE(folderview->ctree);
+
+ if (!node)
+ node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
+ if (!node)
+ return FALSE;
+
+ node = GTK_CTREE_ROW(node)->children;
+
+ while (node) {
+ if (folderview_search_matching_recursive(ctree, node) == TRUE)
+ return TRUE;
+ node = GTK_CTREE_ROW(node)->sibling;
+ }
+
+ return FALSE;
+}
+
static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node)
{
GtkCTree *ctree = GTK_CTREE(folderview->ctree);
FolderItem *item;
GdkPixmap *xpm, *openxpm;
GdkBitmap *mask, *openmask;
+ static GdkPixmap *searchicon;
+ static GdkBitmap *searchmask;
+
gchar *name;
gchar *str;
gboolean add_unread_mark;
+ gboolean add_sub_match_mark;
gboolean use_bold, use_color;
item = gtk_ctree_node_get_row_data(ctree, node);
}
name = folder_item_get_name(item);
- if (!GTK_CTREE_ROW(node)->expanded &&
- folderview_have_unread_children(folderview, node))
- add_unread_mark = TRUE;
- else
+ if (!GTK_CTREE_ROW(node)->expanded) {
+ add_unread_mark = folderview_have_unread_children(
+ folderview, node);
+ add_sub_match_mark = folderview_have_matching_children(
+ folderview, node);
+ } else {
add_unread_mark = FALSE;
+ add_sub_match_mark = FALSE;
+ }
+
+ if (item->search_match) {
+ if (!searchicon) {
+ stock_pixmap_gdk(folderview->ctree, STOCK_PIXMAP_QUICKSEARCH,
+ &searchicon, &searchmask);
+ }
+ xpm = openxpm = searchicon;
+ mask = openmask = searchmask;
+ }
if (item->stype == F_QUEUE && item->total_msgs > 0 &&
prefs_common.display_folder_unread) {
xpm, mask, openxpm, openmask,
FALSE, GTK_CTREE_ROW(node)->expanded);
g_free(str);
- } else if ((item->unread_msgs > 0 || add_unread_mark) &&
- prefs_common.display_folder_unread) {
+ } else if (((item->unread_msgs > 0 || add_unread_mark) &&
+ prefs_common.display_folder_unread)
+ || add_sub_match_mark) {
if (item->unread_msgs > 0)
str = g_strdup_printf("%s (%d%s%s)", name, item->unread_msgs,
- add_unread_mark ? "+" : "",
+ add_unread_mark || add_sub_match_mark ? "+" : "",
item->unreadmarked_msgs > 0 ? "!":"");
else
str = g_strdup_printf("%s (+)", name);
}
#endif
+void folderview_update_search_icon(FolderItem *item, gboolean matches)
+{
+ GList *list;
+ FolderView *folderview;
+ GtkCTree *ctree;
+ GtkCTreeNode *node;
+
+ g_return_if_fail(item != NULL);
+
+ for (list = folderview_list; list != NULL; list = list->next) {
+ folderview = (FolderView *)list->data;
+ ctree = GTK_CTREE(folderview->ctree);
+
+ node = gtk_ctree_find_by_row_data(ctree, NULL, item);
+ if (node) {
+ item->search_match = matches;
+ folderview_update_node(folderview, node);
+ }
+ }
+}
+
gboolean folderview_update_item_claws(gpointer source, gpointer data)
{
FolderItemUpdateData *update_info = (FolderItemUpdateData *)source;
SET_SENS("/Mark all read", item->unread_msgs >= 1);
SET_SENS("/Search folder...", item->total_msgs >= 1 &&
folderview->selected == folderview->opened);
- SET_SENS("/Properties...", TRUE);
+ SET_SENS("/Properties...", item->node->parent != NULL);
SET_SENS("/Processing...", item->node->parent != NULL);
if (item == folder->trash)
SET_SENS("/Empty trash...", folder_item_get_msg_list(item) != NULL);
for (cur = mlist ; cur != NULL ; cur = cur->next) {
MsgInfo * msginfo = (MsgInfo *) cur->data;
- partial_mark_for_delete(msginfo);
- procmsg_msginfo_free(msginfo);
+ /* is it partially received? (partial_recv isn't cached) */
+ if (msginfo->total_size != 0 &&
+ msginfo->size != (off_t)msginfo->total_size)
+ partial_mark_for_delete(msginfo);
}
+ procmsg_msg_list_free(mlist);
folder_item_remove_all_msg(item);
}
g_return_if_fail(item != NULL);
g_return_if_fail(item->folder != NULL);
- if (folder_item_parent(item) == NULL && item->folder->account)
- account_open(item->folder->account);
- else {
- prefs_folder_item_open(item);
- }
+ if (folder_item_parent(item) == NULL)
+ return;
+
+ prefs_folder_item_open(item);
}
static void folderview_recollapse_nodes(FolderView *folderview, GtkCTreeNode *node)
if (!item2->name)
return -1;
- return g_strcasecmp(item1->name, item2->name);
+ return g_utf8_collate(item1->name, item2->name);
}
static void folderview_processing_cb(FolderView *folderview, guint action,
folderview->nodes_to_recollapse = NULL;
}
-FolderItem *folderview_get_selected(FolderView *folderview)
-{
- return (FolderItem *) gtk_ctree_node_get_row_data(
- GTK_CTREE(folderview->ctree), folderview->selected);
-}
-
void folderview_register_popup(FolderViewPopup *fpopup)
{
GList *folderviews;