From a1d6678af2c9f8a075d9d7832c2a6da981afe216 Mon Sep 17 00:00:00 2001 From: Harish Krishnaswamy Date: Fri, 30 Jun 2006 09:46:32 +0000 Subject: Enhanced search functionality. patch submitted by Johnny Jacob Reviewed 2006-06-30 Harish Krishnaswamy Enhanced search functionality. patch submitted by Johnny Jacob Reviewed and committed by Harish. svn path=/trunk/; revision=32207 --- calendar/gui/cal-search-bar.c | 121 +++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 56 deletions(-) (limited to 'calendar/gui/cal-search-bar.c') diff --git a/calendar/gui/cal-search-bar.c b/calendar/gui/cal-search-bar.c index ba199049da..12c6f1018e 100644 --- a/calendar/gui/cal-search-bar.c +++ b/calendar/gui/cal-search-bar.c @@ -45,12 +45,11 @@ enum { /* Comments are disabled because they are kind of useless right now, see bug 33247 */ static ESearchBarItem search_option_items[] = { - { N_("Summary contains"), SEARCH_SUMMARY_CONTAINS, NULL }, - { N_("Description contains"), SEARCH_DESCRIPTION_CONTAINS, NULL }, - { N_("Category is"), SEARCH_CATEGORY_IS, NULL }, - { N_("Comment contains"), SEARCH_COMMENT_CONTAINS, NULL }, - { N_("Location contains"), SEARCH_LOCATION_CONTAINS, NULL }, - { N_("Any field contains"), SEARCH_ANY_FIELD_CONTAINS, NULL }, + { N_("Summary contains"), SEARCH_SUMMARY_CONTAINS, ESB_ITEMTYPE_RADIO }, + { N_("Description contains"), SEARCH_DESCRIPTION_CONTAINS, ESB_ITEMTYPE_RADIO }, + { N_("Comment contains"), SEARCH_COMMENT_CONTAINS, ESB_ITEMTYPE_RADIO }, + { N_("Location contains"), SEARCH_LOCATION_CONTAINS, ESB_ITEMTYPE_RADIO }, + { N_("Any field contains"), SEARCH_ANY_FIELD_CONTAINS, ESB_ITEMTYPE_RADIO }, }; /* IDs for the categories suboptions */ @@ -186,48 +185,28 @@ static const char * get_current_category (CalSearchBar *cal_search) { CalSearchBarPrivate *priv; - int id, subid; + gint viewid; priv = cal_search->priv; g_assert (priv->categories != NULL); - id = e_search_bar_get_item_id (E_SEARCH_BAR (cal_search)); - if (id != SEARCH_CATEGORY_IS) - return NULL; + viewid = e_search_bar_get_viewitem_id (E_SEARCH_BAR (cal_search)); - subid = e_search_bar_get_subitem_id (E_SEARCH_BAR (cal_search)); - if (subid == CATEGORIES_ALL) + if (viewid == CATEGORIES_ALL) return (const char *) 1; - else if (subid == CATEGORIES_UNMATCHED) + else if (viewid == CATEGORIES_UNMATCHED) return NULL; else { int i; - i = subid - CATEGORIES_OFFSET; + i = viewid - CATEGORIES_OFFSET; g_assert (i >= 0 && i < priv->categories->len); return priv->categories->pdata[i]; } } -/* Sets the query string to be (contains? "field" "text") */ -static void -notify_e_cal_view_contains (CalSearchBar *cal_search, const char *field) -{ - char *text; - char *sexp; - - text = e_search_bar_get_text (E_SEARCH_BAR (cal_search)); - if (!text) - return; /* This is an error in the UTF8 conversion, not an empty string! */ - - sexp = g_strdup_printf ("(contains? \"%s\" \"%s\")", field, text); - g_free (text); - - notify_sexp_changed (cal_search, sexp); - g_free (sexp); -} /* Returns a sexp for the selected category in the drop-down menu. The "All" * option is returned as (const char *) 1, and the "Unfiled" option is returned @@ -242,12 +221,42 @@ get_category_sexp (CalSearchBar *cal_search) if (category == NULL) return g_strdup ("(has-categories? #f)"); /* Unfiled items */ - else if (category == (const char *) 1) + else if (category == (const char *) 1) { return NULL; /* All items */ + } else return g_strdup_printf ("(has-categories? \"%s\")", category); /* Specific category */ } + +/* Sets the query string to be (contains? "field" "text") */ +static void +notify_e_cal_view_contains (CalSearchBar *cal_search, const char *field, const char *view) +{ + char *text = NULL; + char *sexp = " "; + + text = e_search_bar_get_text (E_SEARCH_BAR (cal_search)); + + if (!text) + return; /* This is an error in the UTF8 conversion, not an empty string! */ + + if (text && *text) { + sexp = g_strdup_printf ("(contains? \"%s\" \"%s\")", field, text); + g_free (text); + } else + sexp = g_strdup_printf ("(contains? \"summary\" \"\")", field, text); /* Show all */ + + + /* Apply the selected view on search */ + view = get_category_sexp (cal_search); + if (view && *view) + sexp = g_strconcat ("(and ",sexp, view, ")", NULL); + + notify_sexp_changed (cal_search, sexp); + g_free (sexp); +} + /* Sets the query string to the appropriate match for categories */ static void notify_category_is (CalSearchBar *cal_search) @@ -255,6 +264,7 @@ notify_category_is (CalSearchBar *cal_search) char *sexp; sexp = get_category_sexp (cal_search); + if (!sexp) notify_sexp_changed (cal_search, "#t"); /* Match all */ else @@ -269,41 +279,34 @@ static void regen_query (CalSearchBar *cal_search) { int id; - const char *category; + const char *category_sexp, *category; /* Fetch the data from the ESearchBar's entry widgets */ - id = e_search_bar_get_item_id (E_SEARCH_BAR (cal_search)); - /* Generate the different types of queries */ + /* Get the selected view */ + category_sexp = get_category_sexp (cal_search); + /* Generate the different types of queries */ switch (id) { case SEARCH_ANY_FIELD_CONTAINS: - notify_e_cal_view_contains (cal_search, "any"); + notify_e_cal_view_contains (cal_search, "any", category_sexp); break; case SEARCH_SUMMARY_CONTAINS: - notify_e_cal_view_contains (cal_search, "summary"); + notify_e_cal_view_contains (cal_search, "summary", category_sexp); break; case SEARCH_DESCRIPTION_CONTAINS: - notify_e_cal_view_contains (cal_search, "description"); + notify_e_cal_view_contains (cal_search, "description", category_sexp); break; case SEARCH_COMMENT_CONTAINS: - notify_e_cal_view_contains (cal_search, "comment"); + notify_e_cal_view_contains (cal_search, "comment", category_sexp); break; case SEARCH_LOCATION_CONTAINS: - notify_e_cal_view_contains (cal_search, "location"); - break; - - case SEARCH_CATEGORY_IS: - notify_category_is (cal_search); - - category = cal_search_bar_get_category (cal_search); - gtk_signal_emit (GTK_OBJECT (cal_search), cal_search_bar_signals[CATEGORY_CHANGED], - category); + notify_e_cal_view_contains (cal_search, "location", category_sexp); break; default: @@ -311,6 +314,16 @@ regen_query (CalSearchBar *cal_search) } } +static void +regen_view_query (CalSearchBar *cal_search) +{ + const char *category; + notify_category_is (cal_search); + + category = cal_search_bar_get_category (cal_search); + gtk_signal_emit (GTK_OBJECT (cal_search), cal_search_bar_signals[CATEGORY_CHANGED], + category); +} /* search_activated handler for the calendar search bar */ static void cal_search_bar_search_activated (ESearchBar *search) @@ -328,7 +341,7 @@ static void make_suboptions (CalSearchBar *cal_search) { CalSearchBarPrivate *priv; - ESearchBarSubitem *subitems; + ESearchBarItem *subitems; int i; priv = cal_search->priv; @@ -336,17 +349,15 @@ make_suboptions (CalSearchBar *cal_search) g_assert (priv->categories != NULL); /* Categories plus "all", "unmatched", separator, terminator */ - subitems = g_new (ESearchBarSubitem, priv->categories->len + 3 + 1); + subitems = g_new (ESearchBarItem, priv->categories->len + 3 + 1); /* All, unmatched, separator */ subitems[0].text = _("Any Category"); subitems[0].id = CATEGORIES_ALL; - subitems[0].translate = FALSE; subitems[1].text = _("Unmatched"); subitems[1].id = CATEGORIES_UNMATCHED; - subitems[1].translate = FALSE; /* All the other items */ @@ -363,14 +374,13 @@ make_suboptions (CalSearchBar *cal_search) subitems[i + CATEGORIES_OFFSET].text = str; subitems[i + CATEGORIES_OFFSET].id = i + CATEGORIES_OFFSET; - subitems[i + CATEGORIES_OFFSET].translate = FALSE; } subitems[i + CATEGORIES_OFFSET].id = -1; /* terminator */ } else subitems[2].id = -1; /* terminator */ - e_search_bar_set_suboption (E_SEARCH_BAR (cal_search), SEARCH_CATEGORY_IS, subitems); + e_search_bar_set_viewoption (E_SEARCH_BAR (cal_search), SEARCH_CATEGORY_IS, subitems); /* Free the strings */ for (i = 0; i < priv->categories->len; i++) @@ -402,14 +412,13 @@ cal_search_bar_construct (CalSearchBar *cal_search, guint32 flags) if ((flags & bit) != 0) { items[j].text = search_option_items[i].text; items[j].id = search_option_items[i].id; - items[j].subitems = search_option_items[i].subitems; + items[j].type = search_option_items[i].type; j++; } } items[j].text = NULL; items[j].id = -1; - items[j].subitems = NULL; e_search_bar_construct (E_SEARCH_BAR (cal_search), NULL, items); make_suboptions (cal_search); -- cgit v1.2.3