From: Colin Leroy Date: Fri, 21 Jan 2005 10:25:14 +0000 (+0000) Subject: 2005-01-21 [colin] 1.0.0cvs4.1 X-Git-Tag: rel_1_9_6~93 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=471aec1951017e8593d97aabc60c9ee7bd5078b9 2005-01-21 [colin] 1.0.0cvs4.1 * src/folder.h * src/folderview.c * src/folderview.h * src/summaryview.c * src/gtk/quicksearch.c * src/gtk/quicksearch.h Sync with HEAD (recursive quicksearch) --- diff --git a/ChangeLog-gtk2.claws b/ChangeLog-gtk2.claws index 13b41154f..5ff04376b 100644 --- a/ChangeLog-gtk2.claws +++ b/ChangeLog-gtk2.claws @@ -1,3 +1,13 @@ +2005-01-21 [colin] 1.0.0cvs4.1 + + * src/folder.h + * src/folderview.c + * src/folderview.h + * src/summaryview.c + * src/gtk/quicksearch.c + * src/gtk/quicksearch.h + Sync with HEAD (recursive quicksearch) + 2005-01-20 [colin] 1.0.0cvs3.4 * src/ssl_manager.c diff --git a/PATCHSETS b/PATCHSETS index 844c1cde9..9baa82ba3 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -332,3 +332,4 @@ ( cvs diff -u -r 1.3.2.4 -r 1.3.2.5 src/ssl_manager.c; ) > 1.0.0cvs3.2.patchset ( cvs diff -u -r 1.3.2.5 -r 1.3.2.6 src/ssl_manager.c; ) > 1.0.0cvs3.3.patchset ( cvs diff -u -r 1.3.2.6 -r 1.3.2.7 src/ssl_manager.c; ) > 1.0.0cvs3.4.patchset +( cvs diff -u -r 1.87.2.9 -r 1.87.2.10 src/folder.h; cvs diff -u -r 1.207.2.24 -r 1.207.2.25 src/folderview.c; cvs diff -u -r 1.20.2.3 -r 1.20.2.4 src/folderview.h; cvs diff -u -r 1.395.2.42 -r 1.395.2.43 src/summaryview.c; cvs diff -u -r 1.1.2.13 -r 1.1.2.14 src/gtk/quicksearch.c; cvs diff -u -r 1.1.2.4 -r 1.1.2.5 src/gtk/quicksearch.h; ) > 1.0.0cvs4.1.patchset diff --git a/configure.ac b/configure.ac index 899c92c48..3375b81c1 100644 --- a/configure.ac +++ b/configure.ac @@ -11,9 +11,9 @@ MINOR_VERSION=0 MICRO_VERSION=0 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=3 +EXTRA_VERSION=4 EXTRA_RELEASE= -EXTRA_GTK2_VERSION=.4 +EXTRA_GTK2_VERSION=.1 if test \( $EXTRA_VERSION -eq 0 \) -o \( "x$EXTRA_RELEASE" != "x" \); then VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}${EXTRA_RELEASE}${EXTRA_GTK2_VERSION} diff --git a/src/folder.h b/src/folder.h index 64649e489..0ce563046 100644 --- a/src/folder.h +++ b/src/folder.h @@ -587,6 +587,7 @@ struct _FolderItem guint threaded : 1; /* threaded folder view */ guint hide_read_msgs : 1; /* hide read messages */ guint ret_rcpt : 1; /* return receipt */ + guint search_match : 1; gint op_count; guint opened : 1; /* opened by summary view */ diff --git a/src/folderview.c b/src/folderview.c index 5b2d3b2a3..0e133132d 100644 --- a/src/folderview.c +++ b/src/folderview.c @@ -999,6 +999,9 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node) FolderItem *item; GdkPixmap *xpm, *openxpm; GdkBitmap *mask, *openmask; + static GdkPixmap *searchicon; + static GdkBitmap *searchmask; + gchar *name; gchar *str; gboolean add_unread_mark; @@ -1081,6 +1084,15 @@ static void folderview_update_node(FolderView *folderview, GtkCTreeNode *node) } name = folder_item_get_name(item); + if (item->search_match) { + if (!searchicon) { + stock_pixmap_gdk(folderview->ctree, STOCK_PIXMAP_QUICKSEARCH, + &searchicon, &searchmask); + } + xpm = openxpm = searchicon; + mask = openmask = searchmask; + } + if (!GTK_CTREE_ROW(node)->expanded && folderview_have_unread_children(folderview, node)) add_unread_mark = TRUE; @@ -1210,6 +1222,27 @@ void folderview_update_item(FolderItem *item, gboolean update_summary) } #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; diff --git a/src/folderview.h b/src/folderview.h index 79e5fb45b..ffe4a0599 100644 --- a/src/folderview.h +++ b/src/folderview.h @@ -107,5 +107,7 @@ void folderview_reflect_prefs_pixmap_theme (FolderView *folderview); void folderview_register_popup (FolderViewPopup *fpopup); void folderview_unregister_popup (FolderViewPopup *fpopup); +void folderview_update_search_icon (FolderItem *item, + gboolean matches); #endif /* __FOLDERVIEW_H__ */ diff --git a/src/gtk/quicksearch.c b/src/gtk/quicksearch.c index 382ac04f3..f903ca567 100644 --- a/src/gtk/quicksearch.c +++ b/src/gtk/quicksearch.c @@ -34,6 +34,8 @@ #include "matcher.h" #include "matcher_parser.h" #include "quicksearch.h" +#include "folderview.h" +#include "folder.h" struct _QuickSearch { @@ -51,9 +53,12 @@ struct _QuickSearch gpointer callback_data; gboolean running; gboolean has_focus; + FolderItem *root_folder_item; }; static void quicksearch_set_running(QuickSearch *quicksearch, gboolean run); +static void quicksearch_set_active(QuickSearch *quicksearch, gboolean active); +static void quicksearch_reset_folder_items(QuickSearch *quicksearch, FolderItem *folder_item); static void prepare_matcher(QuickSearch *quicksearch) { @@ -65,7 +70,7 @@ static void prepare_matcher(QuickSearch *quicksearch) } if (search_string == NULL || search_string[0] == '\0') { - quicksearch->active = FALSE; + quicksearch_set_active(quicksearch, FALSE); return; } @@ -78,7 +83,7 @@ static void prepare_matcher(QuickSearch *quicksearch) g_free(newstr); } else { quicksearch->matcher_list = NULL; - quicksearch->active = FALSE; + quicksearch_set_active(quicksearch, FALSE); return; } @@ -88,7 +93,7 @@ static void prepare_matcher(QuickSearch *quicksearch) quicksearch->search_string = g_strdup(search_string); } - quicksearch->active = TRUE; + quicksearch_set_active(quicksearch, TRUE); } static void update_extended_button (QuickSearch *quicksearch) @@ -376,7 +381,7 @@ void quicksearch_show(QuickSearch *quicksearch) void quicksearch_hide(QuickSearch *quicksearch) { - quicksearch->active = FALSE; + quicksearch_set_active(quicksearch, FALSE); gtk_widget_hide(quicksearch->hbox_search); } @@ -402,6 +407,14 @@ gboolean quicksearch_is_active(QuickSearch *quicksearch) return quicksearch->active; } +static void quicksearch_set_active(QuickSearch *quicksearch, gboolean active) +{ + quicksearch->active = active; + if (!active) { + quicksearch_reset_cur_folder_item(quicksearch); + } +} + void quicksearch_set_execute_callback(QuickSearch *quicksearch, QuickSearchExecuteCallback callback, gpointer data) @@ -434,10 +447,12 @@ gboolean quicksearch_match(QuickSearch *quicksearch, MsgInfo *msginfo) break; } - if (prefs_common.summary_quicksearch_type != QUICK_SEARCH_EXTENDED && quicksearch->search_string && + if (prefs_common.summary_quicksearch_type != QUICK_SEARCH_EXTENDED && + quicksearch->search_string && searched_header && strcasestr(searched_header, quicksearch->search_string) != NULL) return TRUE; - else if ((quicksearch->matcher_list != NULL) && matcherlist_match(quicksearch->matcher_list, msginfo)) + else if ((quicksearch->matcher_list != NULL) && + matcherlist_match(quicksearch->matcher_list, msginfo)) return TRUE; return FALSE; @@ -658,3 +673,69 @@ void quicksearch_pass_key(QuickSearch *quicksearch, guint val, GdkModifierType m gtk_editable_set_position(GTK_EDITABLE(entry), curpos+1); } + +static gboolean quicksearch_match_subfolder(QuickSearch *quicksearch, + FolderItem *src) +{ + GSList *msglist = folder_item_get_msg_list(src); + GSList *cur; + gboolean result = FALSE; + + for (cur = msglist; cur != NULL; cur = cur->next) { + MsgInfo *msg = (MsgInfo *)cur->data; + if (quicksearch_match(quicksearch, msg)) { + procmsg_msginfo_free(msg); + result = TRUE; + break; + } + procmsg_msginfo_free(msg); + } + + g_slist_free(msglist); + return result; +} + +void quicksearch_search_subfolders(QuickSearch *quicksearch, + FolderView *folderview, + FolderItem *folder_item) +{ + FolderItem *cur = NULL; + GNode *node = folder_item->node->children; + + for (; node != NULL; node = node->next) { + cur = FOLDER_ITEM(node->data); + if (quicksearch_match_subfolder(quicksearch, cur)) { + folderview_update_search_icon(cur, TRUE); + } else { + folderview_update_search_icon(cur, FALSE); + } + if (cur->node->children) + quicksearch_search_subfolders(quicksearch, + folderview, + cur); + } + quicksearch->root_folder_item = folder_item; +} + +static void quicksearch_reset_folder_items(QuickSearch *quicksearch, + FolderItem *folder_item) +{ + FolderItem *cur = NULL; + GNode *node = folder_item->node->children; + + for (; node != NULL; node = node->next) { + cur = FOLDER_ITEM(node->data); + folderview_update_search_icon(cur, FALSE); + if (cur->node->children) + quicksearch_reset_folder_items(quicksearch, + cur); + } +} + +void quicksearch_reset_cur_folder_item(QuickSearch *quicksearch) +{ + if (quicksearch->root_folder_item) + quicksearch_reset_folder_items(quicksearch, quicksearch->root_folder_item); + + quicksearch->root_folder_item = NULL; +} diff --git a/src/gtk/quicksearch.h b/src/gtk/quicksearch.h index 5aa55439d..ac27cf336 100644 --- a/src/gtk/quicksearch.h +++ b/src/gtk/quicksearch.h @@ -47,5 +47,9 @@ gchar *expand_search_string(const gchar *str); gboolean quicksearch_is_running(QuickSearch *quicksearch); gboolean quicksearch_has_focus(QuickSearch *quicksearch); void quicksearch_pass_key(QuickSearch *quicksearch, guint val, GdkModifierType mod); +void quicksearch_reset_cur_folder_item(QuickSearch *quicksearch); +void quicksearch_search_subfolders(QuickSearch *quicksearch, + FolderView *folderview, + FolderItem *folder_item); #endif /* QUICKSEARCH_H */ diff --git a/src/summaryview.c b/src/summaryview.c index 8e34478cc..6d157278c 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -791,6 +791,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) guint displayed_msgnum = 0; GSList *cur; GSList *not_killed; + gboolean quicksearch_changed = FALSE; if (summary_is_locked(summaryview)) return FALSE; @@ -802,6 +803,9 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) quicksearch_set(summaryview->quicksearch, prefs_common.summary_quicksearch_type, ""); } + if (quicksearch_is_running(summaryview->quicksearch)) + quicksearch_changed = TRUE; + /* STATUSBAR_POP(summaryview->mainwin); */ is_refresh = (item == summaryview->folder_item) ? TRUE : FALSE; @@ -913,7 +917,16 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item) else procmsg_msginfo_free(msginfo); } - + + if (quicksearch_changed) { + /* only scan subfolders when quicksearch changed, + * not when search is the same and folder changed */ + quicksearch_reset_cur_folder_item(summaryview->quicksearch); + quicksearch_search_subfolders(summaryview->quicksearch, + summaryview->folderview, + summaryview->folder_item); + } + g_slist_free(mlist); mlist = not_killed; }