# include "config.h"
#endif
+#include <ctype.h>
+
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "matcher.h"
#include "matcher_parser.h"
#include "quicksearch.h"
+#include "folderview.h"
+#include "folder.h"
struct _QuickSearch
{
QuickSearchExecuteCallback callback;
gpointer callback_data;
gboolean running;
+ FolderItem *root_folder_item
};
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)
{
}
if (search_string == NULL || search_string[0] == '\0') {
- quicksearch->active = FALSE;
+ quicksearch_set_active(quicksearch, FALSE);
return;
}
g_free(newstr);
} else {
quicksearch->matcher_list = NULL;
- quicksearch->active = FALSE;
+ quicksearch_set_active(quicksearch, FALSE);
return;
}
quicksearch->search_string = g_strdup(search_string);
}
- quicksearch->active = TRUE;
+ quicksearch_set_active(quicksearch, TRUE);
}
static gint searchbar_pressed(GtkWidget *widget, GdkEventKey *event,
"f S", N_("messages originating from user S"),
"F", N_("forwarded messages"),
"h S", N_("messages which contain header S"),
- "i S", N_("messages which contain S in Message-Id header"),
+ "i S", N_("messages which contain S in Message-ID header"),
"I S", N_("messages which contain S in inreplyto header"),
"L", N_("locked messages"),
"n S", N_("messages which are in newsgroup S"),
void quicksearch_hide(QuickSearch *quicksearch)
{
- quicksearch->active = FALSE;
+ quicksearch_set_active(quicksearch, FALSE);
gtk_widget_hide(quicksearch->hbox_search);
}
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)
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;
{ "f", "from", 1, TRUE, TRUE },
{ "F", "forwarded", 0, FALSE, FALSE },
{ "h", "headers_part", 1, TRUE, TRUE },
- { "i", "header \"Message-Id\"", 1, TRUE, TRUE },
+ { "i", "header \"Message-ID\"", 1, TRUE, TRUE },
{ "I", "inreplyto", 1, TRUE, TRUE },
{ "L", "locked", 0, FALSE, FALSE },
{ "n", "newsgroups", 1, TRUE, TRUE },
return quicksearch->running;
}
+
+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;
+}