From 739a5cd252b834e7a00ba23aebb2c33771d8a0bc Mon Sep 17 00:00:00 2001 From: Colin Leroy Date: Tue, 20 Aug 2002 19:14:30 +0000 Subject: [PATCH] * src/summaryview.[ch] Added a quick search box * src/mainwindow.c * src/prefs_common.[ch] Added a show/hide option for the quick search --- ChangeLog.claws | 8 +++ configure.in | 2 +- src/mainwindow.c | 23 +++++++ src/prefs_common.c | 2 + src/prefs_common.h | 1 + src/summaryview.c | 150 +++++++++++++++++++++++++++++++++++++++------ src/summaryview.h | 11 ++++ 7 files changed, 176 insertions(+), 21 deletions(-) diff --git a/ChangeLog.claws b/ChangeLog.claws index aad32b067..6a5facd69 100644 --- a/ChangeLog.claws +++ b/ChangeLog.claws @@ -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 diff --git a/configure.in b/configure.in index ee11cd925..2b3590142 100644 --- a/configure.in +++ b/configure.in @@ -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 diff --git a/src/mainwindow.c b/src/mainwindow.c index 39b6ae2cb..3183d9df1 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -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, ""}, + {N_("/_View/Show or hi_de/Quick _search"), + NULL, toggle_searchbar_cb, 0, ""}, {N_("/_View/---"), NULL, NULL, 0, ""}, {N_("/_View/Separate f_older tree"), NULL, separate_widget_cb, SEPARATE_FOLDER, ""}, {N_("/_View/Separate m_essage view"), NULL, separate_widget_cb, SEPARATE_MESSAGE, ""}, @@ -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) { diff --git a/src/prefs_common.c b/src/prefs_common.c index 3a429f645..71bfee350 100644 --- a/src/prefs_common.c +++ b/src/prefs_common.c @@ -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, diff --git a/src/prefs_common.h b/src/prefs_common.h index da841e24c..12cc1f5b1 100644 --- a/src/prefs_common.h +++ b/src/prefs_common.h @@ -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; diff --git a/src/summaryview.c b/src/summaryview.c index ad415ffa1..04ec83121 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -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 || diff --git a/src/summaryview.h b/src/summaryview.h index 4f96bc843..fceaf9eac 100644 --- a/src/summaryview.h +++ b/src/summaryview.h @@ -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; -- 2.25.1