* src/summaryview.[ch]
authorColin Leroy <colin@colino.net>
Tue, 20 Aug 2002 19:14:30 +0000 (19:14 +0000)
committerColin Leroy <colin@colino.net>
Tue, 20 Aug 2002 19:14:30 +0000 (19:14 +0000)
                Added a quick search box
        * src/mainwindow.c
        * src/prefs_common.[ch]
                Added a show/hide option for the quick search

ChangeLog.claws
configure.in
src/mainwindow.c
src/prefs_common.c
src/prefs_common.h
src/summaryview.c
src/summaryview.h

index aad32b067050f60e47ea2ffa1e7c83369fffa515..6a5facd6952edffa39129b93d1a43e2b3efe87d6 100644 (file)
@@ -1,3 +1,11 @@
+2002-08-20 [colin]     0.8.1claws85
+
+        * src/summaryview.[ch]
+                Added a quick search box
+        * src/mainwindow.c
+        * src/prefs_common.[ch]
+                Added a show/hide option for the quick search
+
 2002-08-20 [oliver]    0.8.1claws84
        
        * src/mainwindow.c
index ee11cd925f53ae488bf61fdba18ddc1c93799b32..2b35901429c3dc62ab6c33c1a8c0fcaf70583f42 100644 (file)
@@ -8,7 +8,7 @@ MINOR_VERSION=8
 MICRO_VERSION=1
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=claws84
+EXTRA_VERSION=claws85
 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
 
 dnl set $target
index 39b6ae2cb0d932f7ec52f3a22832bd3f636e0272..3183d9df164c8b746d1c685de83d34e24d4346d2 100644 (file)
@@ -175,6 +175,9 @@ static void toggle_toolbar_cb        (MainWindow    *mainwin,
 static void toggle_statusbar_cb         (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void toggle_searchbar_cb         (MainWindow    *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
 static void separate_widget_cb  (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
@@ -444,6 +447,8 @@ static GtkItemFactoryEntry mainwin_entries[] =
                                                NULL, toggle_toolbar_cb, TOOLBAR_NONE, "/View/Show or hide/Toolbar/Icon and text"},
        {N_("/_View/Show or hi_de/Status _bar"),
                                                NULL, toggle_statusbar_cb, 0, "<ToggleItem>"},
+       {N_("/_View/Show or hi_de/Quick _search"),
+                                               NULL, toggle_searchbar_cb, 0, "<ToggleItem>"},
        {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_View/Separate f_older tree"),    NULL, separate_widget_cb, SEPARATE_FOLDER, "<ToggleItem>"},
        {N_("/_View/Separate m_essage view"),   NULL, separate_widget_cb, SEPARATE_MESSAGE, "<ToggleItem>"},
@@ -923,6 +928,12 @@ MainWindow *main_window_create(SeparateType type)
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
                                       prefs_common.show_statusbar);
 
+       gtk_widget_hide(mainwin->summaryview->hbox_search);
+       menuitem = gtk_item_factory_get_item
+               (ifactory, "/View/Show or hide/Quick search");
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
+                                      prefs_common.show_searchbar);
+
        /* set account selection menu */
        ac_menu = gtk_item_factory_get_widget
                (ifactory, "/Configuration/Change current account");
@@ -2118,6 +2129,18 @@ static void toggle_statusbar_cb(MainWindow *mainwin, guint action,
        }
 }
 
+static void toggle_searchbar_cb(MainWindow *mainwin, guint action,
+                               GtkWidget *widget)
+{
+       if (GTK_CHECK_MENU_ITEM(widget)->active) {
+               gtk_widget_show(mainwin->summaryview->hbox_search);
+               prefs_common.show_searchbar = TRUE;
+       } else {
+               gtk_widget_hide(mainwin->summaryview->hbox_search);
+               prefs_common.show_searchbar = FALSE;
+       }
+}
+
 static void separate_widget_cb(MainWindow *mainwin, guint action,
                               GtkWidget *widget)
 {
index 3a429f6454c3afa71a6f1999f985605e46752867..71bfee3507250c1f6b56b827eab5c9e6d5c2827e 100644 (file)
@@ -505,6 +505,8 @@ static PrefParam param[] = {
         NULL, NULL, NULL},
        {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
         NULL, NULL, NULL},
+       {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
+        NULL, NULL, NULL},
 
        {"folderview_vscrollbar_policy", "0",
         &prefs_common.folderview_vscrollbar_policy, P_ENUM,
index da841e24c0c0662d1e8424e3ee2c21382a63eef0..12cc1f5b149bd231e8cd6cfaea2fdd70aee68922 100644 (file)
@@ -117,6 +117,7 @@ struct _PrefsCommon
        gint ng_abbrev_len;
        ToolbarStyle toolbar_style;
        gboolean show_statusbar;
+       gboolean show_searchbar;
        gboolean trans_hdr;
        gboolean enable_thread;
        gboolean enable_hscrollbar;
index ad415ffa17ac13354888a9ad43f942a95e76eba4..04ec831211c23891aedac7278962cfe4c59b7854 100644 (file)
@@ -261,6 +261,12 @@ static void summary_button_released        (GtkWidget              *ctree,
 static void summary_key_pressed                (GtkWidget              *ctree,
                                         GdkEventKey            *event,
                                         SummaryView            *summaryview);
+static void summary_searchbar_pressed  (GtkWidget              *ctree,
+                                        GdkEventKey            *event,
+                                        SummaryView            *summaryview);
+static void summary_searchtype_changed (GtkWidget              *ctree,
+                                        GdkEventAny            *event,
+                                        SummaryView            *summaryview);
 static void summary_open_row           (GtkSCTree              *sctree,
                                         SummaryView            *summaryview);
 static void summary_tree_expanded      (GtkCTree               *ctree,
@@ -446,6 +452,7 @@ SummaryView *summary_create(void)
        GtkWidget *ctree;
        GtkWidget *hbox;
        GtkWidget *hbox_l;
+       GtkWidget *hbox_search;
        GtkWidget *statlabel_folder;
        GtkWidget *statlabel_select;
        GtkWidget *statlabel_msgs;
@@ -453,34 +460,20 @@ SummaryView *summary_create(void)
        GtkWidget *toggle_eventbox;
        GtkWidget *toggle_arrow;
        GtkWidget *popupmenu;
+       GtkWidget *search_type_opt;
+       GtkWidget *search_type;
+       GtkWidget *search_string;
+       GtkWidget *menuitem;
        GtkItemFactory *popupfactory;
        gint n_entries;
 
        debug_print("Creating summary view...\n");
        summaryview = g_new0(SummaryView, 1);
 
-       vbox = gtk_vbox_new(FALSE, 2);
-
-       scrolledwin = gtk_scrolled_window_new(NULL, NULL);
-       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
-                                      GTK_POLICY_AUTOMATIC,
-                                      GTK_POLICY_ALWAYS);
-       gtk_box_pack_start(GTK_BOX(vbox), scrolledwin, TRUE, TRUE, 0);
-       gtk_widget_set_usize(vbox,
-                            prefs_common.summaryview_width,
-                            prefs_common.summaryview_height);
-
-       ctree = summary_ctree_create(summaryview);
-
-       gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(scrolledwin),
-                                           GTK_CLIST(ctree)->hadjustment);
-       gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(scrolledwin),
-                                           GTK_CLIST(ctree)->vadjustment);
-       gtk_container_add(GTK_CONTAINER(scrolledwin), ctree);
-
+       vbox = gtk_vbox_new(FALSE, 3);
+       
        /* create status label */
        hbox = gtk_hbox_new(FALSE, 0);
-       gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
        hbox_l = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(hbox), hbox_l, TRUE, TRUE, 0);
@@ -505,6 +498,62 @@ SummaryView *summary_create(void)
        hbox_spc = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_end(GTK_BOX(hbox), hbox_spc, FALSE, FALSE, 6);
 
+       scrolledwin = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
+                                      GTK_POLICY_AUTOMATIC,
+                                      GTK_POLICY_ALWAYS);
+       gtk_box_pack_start(GTK_BOX(vbox), scrolledwin, TRUE, TRUE, 0);
+       gtk_widget_set_usize(vbox,
+                            prefs_common.summaryview_width,
+                            prefs_common.summaryview_height);
+
+       ctree = summary_ctree_create(summaryview);
+
+       gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(scrolledwin),
+                                           GTK_CLIST(ctree)->hadjustment);
+       gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(scrolledwin),
+                                           GTK_CLIST(ctree)->vadjustment);
+       gtk_container_add(GTK_CONTAINER(scrolledwin), ctree);
+
+       /* status label */
+       gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+       /* quick search */
+       hbox_search = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox), hbox_search, FALSE, FALSE, 0);
+
+       search_type_opt = gtk_option_menu_new();
+       gtk_widget_show(search_type_opt);
+       gtk_box_pack_start(GTK_BOX(hbox_search), search_type_opt, FALSE, FALSE, 0);
+
+       search_type = gtk_menu_new();
+       MENUITEM_ADD (search_type, menuitem, _("Subject"), S_SEARCH_SUBJECT);
+       gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                          GTK_SIGNAL_FUNC(summary_searchtype_changed),
+                          summaryview);
+       MENUITEM_ADD (search_type, menuitem, _("From"), S_SEARCH_FROM);
+       gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                          GTK_SIGNAL_FUNC(summary_searchtype_changed),
+                          summaryview);
+       MENUITEM_ADD (search_type, menuitem, _("To"), S_SEARCH_TO);
+       gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                          GTK_SIGNAL_FUNC(summary_searchtype_changed),
+                          summaryview);
+
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(search_type_opt), search_type);
+       gtk_widget_show(search_type);
+       
+       search_string = gtk_entry_new();
+       
+       gtk_box_pack_start(GTK_BOX(hbox_search), search_string, FALSE, FALSE, 2);
+       
+       gtk_widget_show(search_string);
+       gtk_widget_show(hbox_search);
+
+       gtk_signal_connect(GTK_OBJECT(search_string), "key_press_event",
+                          GTK_SIGNAL_FUNC(summary_searchbar_pressed),
+                          summaryview);
+
        /* create popup menu */
        n_entries = sizeof(summary_popup_entries) /
                sizeof(summary_popup_entries[0]);
@@ -517,6 +566,7 @@ SummaryView *summary_create(void)
        summaryview->ctree = ctree;
        summaryview->hbox = hbox;
        summaryview->hbox_l = hbox_l;
+       summaryview->hbox_search = hbox_search;
        summaryview->statlabel_folder = statlabel_folder;
        summaryview->statlabel_select = statlabel_select;
        summaryview->statlabel_msgs = statlabel_msgs;
@@ -525,6 +575,9 @@ SummaryView *summary_create(void)
        summaryview->popupmenu = popupmenu;
        summaryview->popupfactory = popupfactory;
        summaryview->lock_count = 0;
+       summaryview->search_type_opt = search_type_opt;
+       summaryview->search_type = search_type;
+       summaryview->search_string = search_string;
 
        /* CLAWS: need this to get the SummaryView * from
         * the CList */
@@ -691,6 +744,11 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
        inc_lock();
        summary_lock(summaryview);
 
+       if (item != summaryview->folder_item) {
+               /* changing folder, reset search */
+               gtk_entry_set_text(GTK_ENTRY(summaryview->search_string), "");
+       }
+       
        STATUSBAR_POP(summaryview->mainwin);
 
        is_refresh = (!prefs_common.open_inbox_on_inc &&
@@ -806,6 +864,44 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                summary_set_hide_read_msgs_menu(summaryview, FALSE);
        }
 
+       if (strlen(gtk_entry_get_text(GTK_ENTRY(summaryview->search_string))) > 0) {
+               GSList *not_killed;
+               gint search_type = GPOINTER_TO_INT(gtk_object_get_user_data(
+                                  GTK_OBJECT(GTK_MENU_ITEM(gtk_menu_get_active(
+                                  GTK_MENU(summaryview->search_type))))));
+               gchar *search_string = g_strdup(gtk_entry_get_text(
+                                      GTK_ENTRY(summaryview->search_string)));
+               gchar *searched_header = NULL;
+               
+               not_killed = NULL;
+               for(cur = mlist ; cur != NULL ; cur = g_slist_next(cur)) {
+                       MsgInfo * msginfo = (MsgInfo *) cur->data;
+                       switch (search_type) {
+                               case S_SEARCH_SUBJECT:
+                                       searched_header = g_strdup(msginfo->subject);
+                                       break;
+                               case S_SEARCH_FROM:
+                                       searched_header = g_strdup(msginfo->from);
+                                       break;
+                               case S_SEARCH_TO:
+                                       searched_header = g_strdup(msginfo->to);
+                                       break;
+                               default:
+                                       printf("bug in search_type (=%d)\n",search_type);
+                       }
+                       
+                       if (searched_header != NULL
+                           && strstr(searched_header, search_string) != NULL)
+                               not_killed = g_slist_append(not_killed, msginfo);
+                       else
+                               procmsg_msginfo_free(msginfo);
+               }
+               g_slist_free(mlist);
+               g_free(search_string);
+               g_free(searched_header);
+               mlist = not_killed;
+       }
+       
        if ((global_scoring || item->prefs->scoring)) {
                GSList *not_killed;
                gint kill_score;
@@ -4358,6 +4454,20 @@ static void summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
        }
 }
 
+static void summary_searchbar_pressed(GtkWidget *widget, GdkEventKey *event,
+                               SummaryView *summaryview)
+{
+       if (event != NULL && event->keyval == GDK_Return)
+               summary_show(summaryview, summaryview->folder_item);
+}
+
+static void summary_searchtype_changed(GtkWidget *widget, GdkEventAny *event,
+                               SummaryView *summaryview)
+{
+       if (strlen(gtk_entry_get_text(GTK_ENTRY(summaryview->search_string))) > 0)
+               summary_show(summaryview, summaryview->folder_item);
+}
+
 static void summary_open_row(GtkSCTree *sctree, SummaryView *summaryview)
 {
        if (summaryview->folder_item->stype == F_OUTBOX ||
index 4f96bc843161df82974a36ec3c435dfe80eee739..fceaf9eacf732aa78338b91d581e71c326f2c619 100644 (file)
@@ -71,6 +71,13 @@ typedef enum
        TARGET_DUMMY
 } TargetInfo;
 
+typedef enum
+{
+       S_SEARCH_SUBJECT,
+       S_SEARCH_FROM,
+       S_SEARCH_TO
+} SummarySearchType;
+
 extern GtkTargetEntry summary_drag_types[1];
 
 struct _SummaryColumnState
@@ -86,6 +93,7 @@ struct _SummaryView
        GtkWidget *ctree;
        GtkWidget *hbox;
        GtkWidget *hbox_l;
+       GtkWidget *hbox_search;
        GtkWidget *folder_pixmap;
        GtkWidget *statlabel_folder;
        GtkWidget *statlabel_select;
@@ -94,6 +102,9 @@ struct _SummaryView
        GtkWidget *toggle_arrow;
        GtkWidget *popupmenu;
        GtkWidget *colorlabel_menu;
+       GtkWidget *search_type_opt;
+       GtkWidget *search_type;
+       GtkWidget *search_string;
 
        GtkItemFactory *popupfactory;