2005-01-21 [colin] 1.0.0cvs4
[claws.git] / src / gtk / quicksearch.c
index ce1b87dfcbf053fde2eec0d2237edcbd20e65274..d77a99447574522746028e6da783506b6d4020d3 100644 (file)
@@ -21,6 +21,8 @@
 #  include "config.h"
 #endif
 
+#include <ctype.h>
+
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
@@ -32,6 +34,8 @@
 #include "matcher.h"
 #include "matcher_parser.h"
 #include "quicksearch.h"
+#include "folderview.h"
+#include "folder.h"
 
 struct _QuickSearch
 {
@@ -48,9 +52,12 @@ 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)
 {
@@ -62,7 +69,7 @@ static void prepare_matcher(QuickSearch *quicksearch)
        }
 
        if (search_string == NULL || search_string[0] == '\0') {
-               quicksearch->active = FALSE;
+               quicksearch_set_active(quicksearch, FALSE);
                return;
        }
 
@@ -75,7 +82,7 @@ static void prepare_matcher(QuickSearch *quicksearch)
                        g_free(newstr);
                } else {
                        quicksearch->matcher_list = NULL;
-                       quicksearch->active = FALSE;
+                       quicksearch_set_active(quicksearch, FALSE);
 
                        return;
                }
@@ -85,7 +92,7 @@ static void prepare_matcher(QuickSearch *quicksearch)
                quicksearch->search_string = g_strdup(search_string);
        }
 
-       quicksearch->active = TRUE;
+       quicksearch_set_active(quicksearch, TRUE);
 }
 
 static gint searchbar_pressed(GtkWidget *widget, GdkEventKey *event,
@@ -164,7 +171,7 @@ static gchar *search_descr_strings[] = {
        "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"),
@@ -359,7 +366,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);
 }
 
@@ -385,6 +392,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)
@@ -417,10 +432,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;
@@ -458,7 +475,7 @@ gchar *expand_search_string(const gchar *search_string)
                { "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  },
@@ -614,3 +631,69 @@ gboolean quicksearch_is_running(QuickSearch *quicksearch)
        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;
+}