aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2009-07-28 01:26:13 +0800
committerMatthew Barnes <mbarnes@redhat.com>2009-07-28 01:26:13 +0800
commitb4c93f77e655cfd0a2a740502d7b67bc60df4523 (patch)
tree52102ff28062c32127b058b3ae79cb88a523120d
parentad465a7c1fbea59767741ae5e56a94b5f5f7c6a1 (diff)
downloadgsoc2013-evolution-b4c93f77e655cfd0a2a740502d7b67bc60df4523.tar.gz
gsoc2013-evolution-b4c93f77e655cfd0a2a740502d7b67bc60df4523.tar.zst
gsoc2013-evolution-b4c93f77e655cfd0a2a740502d7b67bc60df4523.zip
Kill CalSearchBar.
Move calendar search logic to ECalShellView.
-rw-r--r--calendar/gui/Makefile.am4
-rw-r--r--calendar/gui/cal-search-bar.c920
-rw-r--r--calendar/gui/cal-search-bar.h91
-rw-r--r--calendar/gui/ea-gnome-calendar.c14
-rw-r--r--calendar/gui/gnome-cal.c112
-rw-r--r--calendar/gui/gnome-cal.h6
-rw-r--r--modules/addressbook/e-book-shell-view-private.c6
-rw-r--r--modules/calendar/e-cal-shell-view-private.c151
-rw-r--r--modules/calendar/e-memo-shell-view-private.c6
-rw-r--r--modules/calendar/e-task-shell-view-private.c6
10 files changed, 178 insertions, 1138 deletions
diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am
index 30a0c33c05..ff748aea14 100644
--- a/calendar/gui/Makefile.am
+++ b/calendar/gui/Makefile.am
@@ -46,10 +46,6 @@ etspec_DATA = \
noinst_LTLIBRARIES = libcal-gui.la
-# Removed from SOURCES
-# cal-search-bar.c
-# cal-search-bar.h
-
libcal_gui_la_SOURCES = \
e-attachment-handler-calendar.c \
e-attachment-handler-calendar.h \
diff --git a/calendar/gui/cal-search-bar.c b/calendar/gui/cal-search-bar.c
deleted file mode 100644
index 672c921852..0000000000
--- a/calendar/gui/cal-search-bar.c
+++ /dev/null
@@ -1,920 +0,0 @@
-/*
- * Evolution calendar - Search bar widget for calendar views
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) version 3.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the program; if not, see <http://www.gnu.org/licenses/>
- *
- *
- * Authors:
- * Federico Mena-Quintero <federico@ximian.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include <libedataserver/e-categories.h>
-#include <libecal/e-cal-time-util.h>
-#include <libedataserver/e-categories.h>
-#include <filter/rule-editor.h>
-
-#include "cal-search-bar.h"
-#include "calendar-component.h"
-#include "memos-component.h"
-#include "tasks-component.h"
-
-#include "e-util/e-util.h"
-#include "e-util/e-error.h"
-#include "e-util/e-util-private.h"
-
-typedef struct CALSearchBarItem {
- ESearchBarItem search;
- const gchar *image;
-} CALSearchBarItem;
-
-static ESearchBarItem calendar_search_items[] = {
- E_FILTERBAR_ADVANCED,
- {NULL, 0, 0},
- E_FILTERBAR_SAVE,
- E_FILTERBAR_EDIT,
- {NULL, -1, 0}
-};
-
-/* IDs and option items for the ESearchBar */
-enum {
- SEARCH_SUMMARY_CONTAINS,
- SEARCH_DESCRIPTION_CONTAINS,
- SEARCH_ANY_FIELD_CONTAINS,
- SEARCH_CATEGORY_IS,
- SEARCH_COMMENT_CONTAINS,
- SEARCH_LOCATION_CONTAINS,
- SEARCH_ATTENDEE_CONTAINS
-
-};
-
-/* 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 },
- { N_("Description contains"), SEARCH_DESCRIPTION_CONTAINS },
- { N_("Category is"), SEARCH_CATEGORY_IS },
- { N_("Comment contains"), SEARCH_COMMENT_CONTAINS },
- { N_("Location contains"), SEARCH_LOCATION_CONTAINS },
- { N_("Any field contains"), SEARCH_ANY_FIELD_CONTAINS },
-};
-
-/* IDs for the categories suboptions */
-
-typedef enum {
- CATEGORIES_ALL,
- CATEGORIES_UNMATCHED,
- LAST_FIELD
-} common_search_options;
-
-typedef enum {
- N_DAY_TASK = LAST_FIELD,
- ACTIVE_TASK,
- OVERDUE_TASK,
- COMPLETED_TASK,
- TASK_WITH_ATTACHMENT,
- TASK_LAST_FIELD
-} task_search_options;
-
-typedef enum {
- ACTIVE_APPONTMENT = LAST_FIELD,
- N_DAY_APPOINTMENT,
- CAL_LAST_FIELD
-} cal_search_options;
-
-/* We add 2 to the offset to include the separators used to differenciate the quick search queries. */
-#define CATEGORIES_TASKS_OFFSET (TASK_LAST_FIELD + 2)
-#define CATEGORIES_MEMOS_OFFSET (LAST_FIELD + 1)
-#define CATEGORIES_CALENDAR_OFFSET (CAL_LAST_FIELD + 2)
-
-/* Private part of the CalSearchBar structure */
-struct CalSearchBarPrivate {
- /* Array of categories */
- GPtrArray *categories;
-
- RuleContext *search_context;
- FilterRule *search_rule;
- guint32 view_flag;
-
- time_t start;
- time_t end;
-};
-
-static void cal_search_bar_destroy (GtkObject *object);
-
-static void cal_search_bar_search_activated (ESearchBar *search);
-
-/* Signal IDs */
-enum {
- SEXP_CHANGED,
- CATEGORY_CHANGED,
- LAST_SIGNAL
-};
-
-static guint cal_search_bar_signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE (CalSearchBar, cal_search_bar, E_FILTER_BAR_TYPE)
-
-/* Class initialization function for the calendar search bar */
-static void
-cal_search_bar_class_init (CalSearchBarClass *klass)
-{
-
- GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
- ESearchBarClass *search_bar_class = E_SEARCH_BAR_CLASS (klass);
-
- cal_search_bar_signals[SEXP_CHANGED] =
- g_signal_new ("sexp_changed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CalSearchBarClass, sexp_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-
- cal_search_bar_signals[CATEGORY_CHANGED] =
- g_signal_new ("category_changed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (CalSearchBarClass, category_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-
- klass->sexp_changed = NULL;
- klass->category_changed = NULL;
-
- search_bar_class->search_activated = cal_search_bar_search_activated;
- object_class->destroy = cal_search_bar_destroy;
-}
-
-/* Object initialization function for the calendar search bar */
-static void
-cal_search_bar_init (CalSearchBar *cal_search)
-{
- CalSearchBarPrivate *priv;
-
- priv = g_new (CalSearchBarPrivate, 1);
- cal_search->priv = priv;
-
- priv->categories = g_ptr_array_new ();
- g_ptr_array_set_size (priv->categories, 0);
-
- priv->start = -1;
- priv->end = -1;
-}
-
-/* Frees an array of categories */
-static void
-free_categories (GPtrArray *categories)
-{
- gint i;
-
- for (i = 0; i < categories->len; i++) {
- if (categories->pdata[i] == NULL)
- continue;
- g_free (categories->pdata[i]);
- }
-
- g_ptr_array_free (categories, TRUE);
-}
-
-/* Destroy handler for the calendar search bar */
-static void
-cal_search_bar_destroy (GtkObject *object)
-{
- CalSearchBar *cal_search;
- CalSearchBarPrivate *priv;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (IS_CAL_SEARCH_BAR (object));
-
- cal_search = CAL_SEARCH_BAR (object);
- priv = cal_search->priv;
-
- if (priv) {
- if (priv->categories) {
- free_categories (priv->categories);
- priv->categories = NULL;
- }
-
- if (priv->search_rule) {
- g_object_unref (priv->search_rule);
- priv->search_rule = NULL;
- }
-
- /* FIXME
- if (priv->search_context) {
- g_object_unref (priv->search_context);
- priv->search_context = NULL;
- }*/
-
- g_free (priv);
- cal_search->priv = NULL;
- }
-
- if (GTK_OBJECT_CLASS (cal_search_bar_parent_class)->destroy)
- (* GTK_OBJECT_CLASS (cal_search_bar_parent_class)->destroy) (object);
-}
-
-
-
-/* Emits the "sexp_changed" signal for the calendar search bar */
-static void
-notify_sexp_changed (CalSearchBar *cal_search, const gchar *sexp)
-{
- g_signal_emit (GTK_OBJECT (cal_search), cal_search_bar_signals[SEXP_CHANGED], 0, sexp);
-}
-
-/* Returns the string of the currently selected category, NULL for "Unmatched" and "All
-*/
-static const gchar *
-get_current_category (CalSearchBar *cal_search)
-{
- CalSearchBarPrivate *priv;
- gint viewid, i = -1;
-
- priv = cal_search->priv;
-
- g_return_val_if_fail (priv->categories != NULL, NULL);
-
- viewid = e_search_bar_get_viewitem_id (E_SEARCH_BAR (cal_search));
-
- if (viewid == CATEGORIES_ALL || viewid == CATEGORIES_UNMATCHED)
- return NULL;
-
- if (priv->view_flag == CAL_SEARCH_TASKS_DEFAULT)
- i = viewid - CATEGORIES_TASKS_OFFSET;
- else if (priv->view_flag == CAL_SEARCH_MEMOS_DEFAULT)
- i = viewid - CATEGORIES_MEMOS_OFFSET;
- else if (priv->view_flag == CAL_SEARCH_CALENDAR_DEFAULT)
- i = viewid - CATEGORIES_CALENDAR_OFFSET;
-
- if (i >= 0 && i < priv->categories->len)
- return priv->categories->pdata[i];
- else
- return NULL;
-}
-
-/* Returns a sexp for the selected category in the drop-down menu. The "All"
- * option is returned as (const gchar *) 1, and the "Unfiled" option is returned
- * as NULL.
- */
-static gchar *
-get_show_option_sexp (CalSearchBar *cal_search)
-{
- CalSearchBarPrivate *priv;
- gint viewid;
- gchar *start, *end, *due, *ret = NULL;
- const gchar *category = NULL;
- time_t start_range, end_range;
-
- priv = cal_search->priv;
- viewid = e_search_bar_get_viewitem_id (E_SEARCH_BAR (cal_search));
-
- if (viewid == CATEGORIES_UNMATCHED)
- return g_strdup ("(has-categories? #f)"); /* Unfiled items */
- else if (viewid == CATEGORIES_ALL)
- return NULL; /* All items */
-
- switch (priv->view_flag) {
- case CAL_SEARCH_TASKS_DEFAULT:
- if (viewid == N_DAY_TASK) {
- start_range = time(NULL);
- end_range = time_add_day(start_range, 7);
- start = isodate_from_time_t (start_range);
- due = isodate_from_time_t (end_range);
-
- ret = g_strdup_printf ("(due-in-time-range? (make-time \"%s\")"
- " (make-time \"%s\"))",
- start, due);
-
- g_free (start);
- g_free (due);
-
- return ret;
- } else if (viewid == ACTIVE_TASK) {
- /* Shows the tasks due for an year from now which are not completed yet*/
- start_range = time(NULL);
- end_range = time_add_day(start_range, 365);
- start = isodate_from_time_t (start_range);
- due = isodate_from_time_t (end_range);
-
- ret = g_strdup_printf ("(and (due-in-time-range? (make-time \"%s\")"
- " (make-time \"%s\")) (not (is-completed?)))",
- start, due);
-
- g_free (start);
- g_free (due);
-
- return ret;
- } else if (viewid == OVERDUE_TASK) {
- /* Shows the tasks which are overdue from lower limit 1970 to the current time */
- start_range = 0;
- end_range = time (NULL);
- start = isodate_from_time_t (start_range);
- due = isodate_from_time_t (end_range);
-
- ret = g_strdup_printf ("(and (due-in-time-range? (make-time \"%s\")"
- " (make-time \"%s\")) (not (is-completed?)))",
- start, due);
-
- g_free (start);
- g_free (due);
-
- return ret;
- } else if (viewid == COMPLETED_TASK)
- return g_strdup ("(is-completed?)");
- else if (viewid == TASK_WITH_ATTACHMENT)
- return g_strdup ("(has-attachments?)");
- break;
- case CAL_SEARCH_CALENDAR_DEFAULT:
- if (viewid == ACTIVE_APPONTMENT) {
- /* Shows next one year's Appointments */
- start_range = time (NULL);
- end_range = time_add_day (start_range, 365);
- start = isodate_from_time_t (start_range);
- end = isodate_from_time_t (end_range);
-
- ret = g_strdup_printf ("(occur-in-time-range? (make-time \"%s\")"
- " (make-time \"%s\"))",
- start, end);
-
- cal_search->priv->start = start_range;
- cal_search->priv->end = end_range;
-
- g_free (start);
- g_free (end);
-
- return ret;
- } else if (viewid == N_DAY_APPOINTMENT) {
- start_range = time (NULL);
- end_range = time_add_day (start_range, 7);
- start = isodate_from_time_t (start_range);
- end = isodate_from_time_t (end_range);
-
- ret = g_strdup_printf ("(occur-in-time-range? (make-time \"%s\")"
- " (make-time \"%s\"))",
- start, end);
-
- cal_search->priv->start = start_range;
- cal_search->priv->end = end_range;
-
- g_free (start);
- g_free (end);
-
- return ret;
- }
- break;
- default:
- break;
- }
-
- category = get_current_category (cal_search);
-
- if (category != NULL)
- return g_strdup_printf ("(has-categories? \"%s\")", category);
- else
- return NULL;
-}
-
-/* Sets the query string to be (contains? "field" "text") */
-static void
-notify_e_cal_view_contains (CalSearchBar *cal_search, const gchar *field, const gchar *view)
-{
- gchar *text = NULL;
- gchar *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);
- else
- sexp = g_strdup ("(contains? \"summary\" \"\")"); /* Show all */
-
- g_free (text);
-
- /* Apply the selected view on search */
- if (view && *view) {
- sexp = g_strconcat ("(and ",sexp, view, ")", NULL);
- }
-
- notify_sexp_changed (cal_search, sexp);
-
- g_free (sexp);
-}
-
-#if 0
-/* Sets the query string to the appropriate match for categories */
-static void
-notify_category_is (CalSearchBar *cal_search)
-{
- gchar *sexp;
-
- sexp = get_show_option_sexp (cal_search);
-
- if (!sexp)
- notify_sexp_changed (cal_search, "#t"); /* Match all */
- else
- notify_sexp_changed (cal_search, sexp);
-
- if (sexp)
- g_free (sexp);
-}
-#endif
-
-/* Creates a new query from the values in the widgets and notifies upstream */
-static void
-regen_query (CalSearchBar *cal_search)
-{
- gint id;
- gchar *show_option_sexp = NULL;
- gchar *sexp = NULL;
- GString *out = NULL;
- EFilterBar *efb = (EFilterBar *) cal_search;
-
- /* Fetch the data from the ESearchBar's entry widgets */
- id = e_search_bar_get_item_id (E_SEARCH_BAR (cal_search));
-
- cal_search->priv->start = -1;
- cal_search->priv->end = -1;
-
- /* Get the selected view */
- show_option_sexp = get_show_option_sexp (cal_search);
-
- /* Generate the different types of queries */
- switch (id) {
- case SEARCH_ANY_FIELD_CONTAINS:
- notify_e_cal_view_contains (cal_search, "any", show_option_sexp);
- break;
-
- case SEARCH_SUMMARY_CONTAINS:
- notify_e_cal_view_contains (cal_search, "summary", show_option_sexp);
- break;
-
- case SEARCH_DESCRIPTION_CONTAINS:
- notify_e_cal_view_contains (cal_search, "description", show_option_sexp);
- break;
-
- case SEARCH_COMMENT_CONTAINS:
- notify_e_cal_view_contains (cal_search, "comment", show_option_sexp);
- break;
-
- case SEARCH_LOCATION_CONTAINS:
- notify_e_cal_view_contains (cal_search, "location", show_option_sexp);
- break;
- case SEARCH_ATTENDEE_CONTAINS:
- notify_e_cal_view_contains (cal_search, "attendee", show_option_sexp);
- break;
- case E_FILTERBAR_ADVANCED_ID:
- out = g_string_new ("");
- filter_rule_build_code (efb->current_query, out);
-
- if (show_option_sexp && *show_option_sexp)
- sexp = g_strconcat ("(and ", out->str, show_option_sexp, ")", NULL);
-
- notify_sexp_changed (cal_search, sexp ? sexp : out->str);
-
- g_string_free (out, TRUE);
- g_free(sexp);
- break;
-
- default:
- g_return_if_reached ();
- }
-
- g_free (show_option_sexp);
-}
-
-#if 0
-static void
-regen_view_query (CalSearchBar *cal_search)
-{
- const gchar *category;
- notify_category_is (cal_search);
-
- category = cal_search_bar_get_category (cal_search);
- g_signal_emit (GTK_OBJECT (cal_search), cal_search_bar_signals[CATEGORY_CHANGED], 0, category);
-}
-#endif
-
-/* search_activated handler for the calendar search bar */
-static void
-cal_search_bar_search_activated (ESearchBar *search)
-{
- CalSearchBar *cal_search;
-
- cal_search = CAL_SEARCH_BAR (search);
- regen_query (cal_search);
-}
-
-static GtkWidget *
-generate_viewoption_menu (CALSearchBarItem *subitems)
-{
- GtkWidget *menu, *menu_item;
- gint i = 0;
-
- menu = gtk_menu_new ();
-
- for (i = 0; subitems[i].search.id != -1; ++i) {
- if (subitems[i].search.text) {
- gchar *str = NULL;
- str = e_str_without_underscores (subitems[i].search.text);
- menu_item = gtk_image_menu_item_new_with_label (str);
- if (subitems[i].image) {
- GtkWidget *image;
-
- image = gtk_image_new_from_file (
- subitems[i].image);
- gtk_image_menu_item_set_image (
- GTK_IMAGE_MENU_ITEM (menu_item),
- image);
- }
- g_free (str);
- } else {
- menu_item = gtk_menu_item_new ();
- gtk_widget_set_sensitive (menu_item, FALSE);
- }
-
- g_object_set_data (G_OBJECT (menu_item), "EsbItemId",
- GINT_TO_POINTER (subitems[i].search.id));
-
- gtk_widget_show (menu_item);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
- }
-
- return menu;
-}
-
-static void
-setup_category_options (CalSearchBar *cal_search, CALSearchBarItem *subitems, gint index, gint offset)
-{
- CalSearchBarPrivate *priv;
- gint i;
-
- priv = cal_search->priv;
-
- if (priv->categories->len > 0) {
- subitems[index].search.text = NULL; /* separator */
- subitems[index].search.id = 0;
- subitems[index].image = NULL;
-
- for (i = 0; i < priv->categories->len; i++) {
- const gchar *category;
-
- category = priv->categories->pdata[i] ? priv->categories->pdata [i] : "";
-
- /* The search.text field should not be free'd */
- subitems[i + offset].search.text = (gchar *) category;
- subitems[i + offset].search.id = i + offset;
- subitems[i + offset].image = e_categories_get_icon_file_for (category);
- }
- index = i + offset;
- }
-
- subitems[index].search.id = -1; /* terminator */
- subitems[index].search.text = NULL;
- subitems[index].image = NULL;
-}
-
-/* Creates the suboptions menu for the ESearchBar with the list of categories */
-static void
-make_suboptions (CalSearchBar *cal_search)
-{
- CalSearchBarPrivate *priv;
- CALSearchBarItem *subitems = NULL;
- GtkWidget *menu;
-
- priv = cal_search->priv;
-
- g_return_if_fail (priv->categories != NULL);
-
- /* Categories plus "all", "unmatched", separator, terminator */
-
- /* All, unmatched, separator */
-
- if (priv->view_flag == CAL_SEARCH_TASKS_DEFAULT) {
- subitems = g_new (CALSearchBarItem, priv->categories->len + CATEGORIES_TASKS_OFFSET + 1);
-
- subitems[0].search.text = _("Any Category");
- subitems[0].search.id = CATEGORIES_ALL;
- subitems[0].image = NULL;
-
- subitems[1].search.text = _("Unmatched");
- subitems[1].search.id = CATEGORIES_UNMATCHED;
- subitems[1].image = NULL;
-
- subitems[2].search.text = NULL;
- subitems[2].search.id = 0;
- subitems[2].image = NULL;
-
- subitems[3].search.text = _("Next 7 Days' Tasks");
- subitems[3].search.id = N_DAY_TASK;
- subitems[3].image = NULL;
-
- subitems[4].search.text = _("Active Tasks");
- subitems[4].search.id = ACTIVE_TASK;
- subitems[4].image = NULL;
-
- subitems[5].search.text = _("Overdue Tasks");
- subitems[5].search.id = OVERDUE_TASK;
- subitems[5].image = NULL;
-
- subitems[6].search.text = _("Completed Tasks");
- subitems[6].search.id = COMPLETED_TASK;
- subitems[6].image = NULL;
-
- subitems[7].search.text = _("Tasks with Attachments");
- subitems[7].search.id = TASK_WITH_ATTACHMENT;
- subitems[7].image = NULL;
-
- /* All the other items */
- setup_category_options (cal_search, subitems, 8, CATEGORIES_TASKS_OFFSET);
-
- menu = generate_viewoption_menu (subitems);
- e_search_bar_set_viewoption_menu ((ESearchBar *)cal_search, menu);
-
- } else if (priv->view_flag == CAL_SEARCH_MEMOS_DEFAULT) {
- subitems = g_new (CALSearchBarItem, priv->categories->len + CATEGORIES_MEMOS_OFFSET + 1);
-
- /* All, unmatched, separator */
-
- subitems[0].search.text = _("Any Category");
- subitems[0].search.id = CATEGORIES_ALL;
- subitems[0].image = NULL;
-
- subitems[1].search.text = _("Unmatched");
- subitems[1].search.id = CATEGORIES_UNMATCHED;
- subitems[1].image = NULL;
-
- /* All the other items */
- setup_category_options (cal_search, subitems, 2, CATEGORIES_MEMOS_OFFSET);
-
- menu = generate_viewoption_menu (subitems);
- e_search_bar_set_viewoption_menu ((ESearchBar *)cal_search, menu);
-
- } else if (priv->view_flag == CAL_SEARCH_CALENDAR_DEFAULT) {
- subitems = g_new (CALSearchBarItem, priv->categories->len + CATEGORIES_CALENDAR_OFFSET + 1);
-
- /* All, unmatched, separator */
-
- subitems[0].search.text = _("Any Category");
- subitems[0].search.id = CATEGORIES_ALL;
- subitems[0].image = NULL;
-
- subitems[1].search.text = _("Unmatched");
- subitems[1].search.id = CATEGORIES_UNMATCHED;
- subitems[1].image = NULL;
-
- subitems[2].search.text = NULL;
- subitems[2].search.id = 0;
- subitems[2].image = NULL;
-
- subitems[3].search.text = _("Active Appointments");
- subitems[3].search.id = ACTIVE_APPONTMENT;
- subitems[3].image = NULL;
-
- subitems[4].search.text = _("Next 7 Days' Appointments");
- subitems[4].search.id = N_DAY_APPOINTMENT;
- subitems[4].image = NULL;
-
- /* All the other items */
- setup_category_options (cal_search, subitems, 5, CATEGORIES_CALENDAR_OFFSET);
-
- menu = generate_viewoption_menu (subitems);
- e_search_bar_set_viewoption_menu ((ESearchBar *)cal_search, menu);
- }
-
- if (subitems != NULL)
- g_free (subitems);
-}
-
-static void
-search_menu_activated (ESearchBar *esb, gint id)
-{
- if (id == E_FILTERBAR_ADVANCED_ID)
- e_search_bar_set_item_id (esb, id);
-}
-
-/**
- * cal_search_bar_construct:
- * @cal_search: A calendar search bar.
- * @flags: bitfield of items to appear in the search menu
- *
- * Constructs a calendar search bar by binding its menu and option items.
- *
- * Return value: The same value as @cal_search.
- **/
-CalSearchBar *
-cal_search_bar_construct (CalSearchBar *cal_search, guint32 flags)
-{
- ESearchBarItem *items;
- guint32 bit = 0x1;
- gint i, j;
- gchar *xmlfile = NULL;
- gchar *userfile = NULL;
- FilterPart *part;
- RuleContext *search_context;
- FilterRule *search_rule;
- const gchar *base_dir;
-
- g_return_val_if_fail (IS_CAL_SEARCH_BAR (cal_search), NULL);
-
- items = g_alloca ((G_N_ELEMENTS (search_option_items) + 1) * sizeof (ESearchBarItem));
- for (i = 0, j = 0; i < G_N_ELEMENTS (search_option_items); i++, bit <<= 1) {
- if ((flags & bit) != 0) {
- items[j].text = search_option_items[i].text;
- items[j].id = search_option_items[i].id;
- items[j].type = search_option_items[i].type;
- j++;
- }
- }
-
- items[j].text = NULL;
- items[j].id = -1;
- search_context = rule_context_new ();
- cal_search->priv->view_flag = flags;
-
- rule_context_add_part_set (search_context, "partset", filter_part_get_type (),
- rule_context_add_part, rule_context_next_part);
- rule_context_add_rule_set (search_context, "ruleset", filter_rule_get_type (),
- rule_context_add_rule, rule_context_next_rule);
-
- if (flags == CAL_SEARCH_MEMOS_DEFAULT) {
- base_dir = memos_component_peek_base_directory (memos_component_peek ());
- xmlfile = g_build_filename (SEARCH_RULE_DIR, "memotypes.xml", NULL);
- } else if (flags == CAL_SEARCH_TASKS_DEFAULT) {
- base_dir = tasks_component_peek_base_directory (tasks_component_peek ());
- xmlfile = g_build_filename (SEARCH_RULE_DIR, "tasktypes.xml", NULL);
- } else {
- base_dir = calendar_component_peek_base_directory (calendar_component_peek ());
- xmlfile = g_build_filename (SEARCH_RULE_DIR, "caltypes.xml", NULL);
- }
-
- userfile = g_build_filename (base_dir, "searches.xml", NULL);
-
- g_object_set_data_full (G_OBJECT (search_context), "user", userfile, g_free);
- g_object_set_data_full (G_OBJECT (search_context), "system", xmlfile, g_free);
-
- rule_context_load (search_context, xmlfile, userfile);
- search_rule = filter_rule_new ();
- part = rule_context_next_part (search_context, NULL);
-
- if (part == NULL)
- g_warning ("Could not load calendar search; no parts.");
- else
- filter_rule_add_part (search_rule, filter_part_clone (part));
-
- e_filter_bar_new_construct (search_context, xmlfile, userfile, NULL, cal_search,
- (EFilterBar*) cal_search );
- e_search_bar_set_menu ((ESearchBar *) cal_search, calendar_search_items);
-
- g_signal_connect ((ESearchBar *) cal_search, "menu_activated", G_CALLBACK (search_menu_activated), cal_search);
-
- make_suboptions (cal_search);
-
- cal_search->priv->search_rule = search_rule;
- cal_search->priv->search_context = search_context;
-
- g_free (xmlfile);
- g_free (userfile);
-
- return cal_search;
-}
-
-/**
- * cal_search_bar_new:
- * flags: bitfield of items to appear in the search menu
- *
- * creates a new calendar search bar.
- *
- * return value: a newly-created calendar search bar. you should connect to the
- * "sexp_changed" signal to monitor changes in the generated sexps.
- **/
-GtkWidget *
-cal_search_bar_new (guint32 flags)
-{
- CalSearchBar *cal_search;
-
- cal_search = g_object_new (TYPE_CAL_SEARCH_BAR, NULL);
- return GTK_WIDGET (cal_search_bar_construct (cal_search, flags));
-}
-
-/* Used from qsort() */
-static gint
-compare_categories_cb (gconstpointer a, gconstpointer b)
-{
- const gchar **ca, **cb;
-
- ca = (const gchar **) a;
- cb = (const gchar **) b;
-
- /* FIXME: should use some utf8 strcoll() thingy */
- return strcmp (*ca, *cb);
-}
-
-/* Creates a sorted array of categories based on the original one; copies the
- * string values.
- */
-static GPtrArray *
-sort_categories (GPtrArray *categories)
-{
- GPtrArray *c;
- gint i;
-
- c = g_ptr_array_new ();
- g_ptr_array_set_size (c, categories->len);
-
- for (i = 0; i < categories->len; i++)
- c->pdata[i] = g_strdup (categories->pdata[i]);
-
- qsort (c->pdata, c->len, sizeof (gpointer), compare_categories_cb);
-
- return c;
-}
-
-/**
- * cal_search_bar_set_categories:
- * @cal_search: A calendar search bar.
- * @categories: Array of pointers to strings for the category names.
- *
- * Sets the list of categories that are to be shown in the drop-down list
- * of a calendar search bar. The search bar will automatically add an item
- * for "unfiled" components, that is, those that have no categories assigned
- * to them.
- **/
-void
-cal_search_bar_set_categories (CalSearchBar *cal_search, GPtrArray *categories)
-{
- CalSearchBarPrivate *priv;
-
- g_return_if_fail (IS_CAL_SEARCH_BAR (cal_search));
- g_return_if_fail (categories != NULL);
-
- priv = cal_search->priv;
-
- g_return_if_fail (priv->categories != NULL);
- free_categories (priv->categories);
-
- priv->categories = sort_categories (categories);
- make_suboptions (cal_search);
-}
-
-/**
- * cal_search_bar_get_category:
- * @cal_search: A calendar search bar.
- *
- * Queries the currently selected category name in a calendar search bar.
- * If "All" or "Unfiled" are selected, this function will return NULL.
- *
- * Return value: Name of the selected category, or NULL if there is no
- * selected category.
- **/
-const gchar *
-cal_search_bar_get_category (CalSearchBar *cal_search)
-{
- const gchar *category;
-
- category = get_current_category (cal_search);
-
- return category;
-}
-
-void
-cal_search_bar_get_time_range (CalSearchBar *cal_search, time_t *start, time_t *end)
-{
- CalSearchBarPrivate *priv;
-
- g_return_if_fail (IS_CAL_SEARCH_BAR (cal_search));
-
- priv = cal_search->priv;
-
- *start = priv->start;
- *end = priv->end;
-}
-
diff --git a/calendar/gui/cal-search-bar.h b/calendar/gui/cal-search-bar.h
deleted file mode 100644
index 3c7304f136..0000000000
--- a/calendar/gui/cal-search-bar.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *
- * Evolution calendar - Search bar widget for calendar views
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) version 3.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with the program; if not, see <http://www.gnu.org/licenses/>
- *
- *
- * Authors:
- * Federico Mena-Quintero <federico@ximian.com>
- *
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
- *
- */
-
-#ifndef CAL_SEARCH_BAR_H
-#define CAL_SEARCH_BAR_H
-
-#include "misc/e-search-bar.h"
-#include "misc/e-filter-bar.h"
-
-G_BEGIN_DECLS
-
-
-
-#define TYPE_CAL_SEARCH_BAR (cal_search_bar_get_type ())
-#define CAL_SEARCH_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CAL_SEARCH_BAR, CalSearchBar))
-#define CAL_SEARCH_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CAL_SEARCH_BAR, \
- CalSearchBarClass))
-#define IS_CAL_SEARCH_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CAL_SEARCH_BAR))
-#define IS_CAL_SEARCH_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CAL_SEARCH_BAR))
-
-typedef struct CalSearchBarPrivate CalSearchBarPrivate;
-
-enum {
- CAL_SEARCH_SUMMARY_CONTAINS = (1 << 0),
- CAL_SEARCH_DESCRIPTION_CONTAINS = (1 << 1),
- CAL_SEARCH_CATEGORY_IS = (1 << 2),
- CAL_SEARCH_COMMENT_CONTAINS = (1 << 3),
- CAL_SEARCH_LOCATION_CONTAINS = (1 << 4),
- CAL_SEARCH_ANY_FIELD_CONTAINS = (1 << 5)
-};
-
-#define CAL_SEARCH_ALL (0xff)
-#define CAL_SEARCH_CALENDAR_DEFAULT (0x33)
-#define CAL_SEARCH_TASKS_DEFAULT (0xE3)
-#define CAL_SEARCH_MEMOS_DEFAULT (0x23)
-
-typedef struct {
- EFilterBar search_bar;
-
- /* Private data */
- CalSearchBarPrivate *priv;
-} CalSearchBar;
-
-typedef struct {
- EFilterBarClass parent_class;
-
- /* Notification signals */
-
- void (* sexp_changed) (CalSearchBar *cal_search, const gchar *sexp);
- void (* category_changed) (CalSearchBar *cal_search, const gchar *category);
-} CalSearchBarClass;
-
-GType cal_search_bar_get_type (void);
-
-CalSearchBar *cal_search_bar_construct (CalSearchBar *cal_search, guint32 flags);
-
-GtkWidget *cal_search_bar_new (guint32 flags);
-
-void cal_search_bar_set_categories (CalSearchBar *cal_search, GPtrArray *categories);
-
-const gchar *cal_search_bar_get_category (CalSearchBar *cal_search);
-
-void cal_search_bar_get_time_range (CalSearchBar *cal_search, time_t *start, time_t *end);
-
-
-
-G_END_DECLS
-
-#endif
diff --git a/calendar/gui/ea-gnome-calendar.c b/calendar/gui/ea-gnome-calendar.c
index 1cc75e5538..78fd50fc69 100644
--- a/calendar/gui/ea-gnome-calendar.c
+++ b/calendar/gui/ea-gnome-calendar.c
@@ -260,7 +260,7 @@ ea_gnome_calendar_get_n_children (AtkObject* obj)
if (!GTK_ACCESSIBLE (obj)->widget)
return -1;
- return 4;
+ return 3;
}
static AtkObject *
@@ -283,14 +283,6 @@ ea_gnome_calendar_ref_child (AtkObject *obj, gint i)
switch (i) {
case 0:
- /* for the search bar */
- childWidget = gnome_calendar_get_search_bar_widget (calendarWidget);
- child = gtk_widget_get_accessible (childWidget);
- atk_object_set_parent (child, obj);
- atk_object_set_name (child, _("search bar"));
- atk_object_set_description (child, _("evolution calendar search bar"));
- break;
- case 1:
/* for the day/week view */
view_type = gnome_calendar_get_view (calendarWidget);
view = gnome_calendar_get_calendar_view (calendarWidget, view_type);
@@ -298,12 +290,12 @@ ea_gnome_calendar_ref_child (AtkObject *obj, gint i)
child = gtk_widget_get_accessible (childWidget);
atk_object_set_parent (child, obj);
break;
- case 2:
+ case 1:
/* for calendar */
childWidget = gnome_calendar_get_e_calendar_widget (calendarWidget);
child = gtk_widget_get_accessible (childWidget);
break;
- case 3:
+ case 2:
/* for todo list */
childWidget = GTK_WIDGET (gnome_calendar_get_task_pad (calendarWidget));
child = gtk_widget_get_accessible (childWidget);
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index b848d8b4bf..f0b20d3f51 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -96,8 +96,6 @@ struct _GnomeCalendarPrivate {
/* Widgets */
- GtkWidget *search_bar;
-
GtkWidget *hpane;
GtkWidget *notebook;
GtkWidget *vpane;
@@ -800,14 +798,17 @@ update_query (GnomeCalendar *gcal)
message_push ((Message *) msg);
}
-static void
-set_search_query (GnomeCalendar *gcal, const gchar *sexp)
+void
+gnome_calendar_set_search_query (GnomeCalendar *gcal,
+ const gchar *sexp,
+ gboolean range_search,
+ time_t start_range,
+ time_t end_range)
{
GnomeCalendarPrivate *priv;
gint i;
time_t start, end;
- g_return_if_fail (gcal != NULL);
g_return_if_fail (GNOME_IS_CALENDAR (gcal));
g_return_if_fail (sexp != NULL);
@@ -815,11 +816,13 @@ set_search_query (GnomeCalendar *gcal, const gchar *sexp)
/* Set the query on the date navigator */
- if (priv->sexp)
- g_free (priv->sexp);
-
+ g_free (priv->sexp);
priv->sexp = g_strdup (sexp);
+ priv->lview_select_daten_range = range_search;
+ start = start_range;
+ end = end_range;
+
d(g_print ("Changing the queries %s \n", sexp));
update_query (gcal);
@@ -829,7 +832,6 @@ set_search_query (GnomeCalendar *gcal, const gchar *sexp)
/* Set the query on the views */
if (i == GNOME_CAL_LIST_VIEW) {
if (!priv->lview_select_daten_range) {
- cal_search_bar_get_time_range ((CalSearchBar *)priv->search_bar, &start, &end);
e_cal_model_set_search_query_with_time_range (e_calendar_view_get_model (priv->views [i]), sexp, start, end);
} else {
start = priv->base_view_time;
@@ -867,50 +869,6 @@ get_current_time (ECalendarItem *calitem, gpointer data)
return tmp_tm;
}
-/* Callback used when the sexp changes in the calendar search bar */
-static void
-search_bar_sexp_changed_cb (CalSearchBar *cal_search, const gchar *sexp, gpointer data)
-{
- GnomeCalendar *gcal;
- const gchar *d_sexp = "occur-in-time-range?";
-
- gcal = GNOME_CALENDAR (data);
-
- /* Choose List view if the search made in the search bar is based on date */
- if (sexp != NULL && strstr (sexp, d_sexp ) != NULL) {
- gcal->priv->lview_select_daten_range = FALSE;
- gtk_widget_hide (GTK_WIDGET (gcal->priv->date_navigator));
- gnome_calendar_set_view (gcal, GNOME_CAL_LIST_VIEW);
- } else {
- gcal->priv->lview_select_daten_range = TRUE;
- gtk_widget_show (GTK_WIDGET (gcal->priv->date_navigator));
- }
-
- set_search_query (gcal, sexp);
-}
-
-/* Callback used when the selected category in the search bar changes */
-static void
-search_bar_category_changed_cb (CalSearchBar *cal_search, const gchar *category, gpointer data)
-{
- GnomeCalendar *gcal;
- GnomeCalendarPrivate *priv;
- ECalModel *model;
- gint i;
-
- gcal = GNOME_CALENDAR (data);
- priv = gcal->priv;
-
- for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
- e_calendar_view_set_default_category (E_CALENDAR_VIEW (priv->views[i]),
- category);
- }
-
- /* [KILL-BONOBO] Delete this when moved to ECalShellView.
- model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo));
- e_cal_model_set_default_category (model, category); */
-}
-
static void
view_selection_changed_cb (GtkWidget *view, GnomeCalendar *gcal)
{
@@ -1248,29 +1206,6 @@ month_view_adjustment_changed_cb (GtkAdjustment *adjustment, GnomeCalendar *gcal
}
static void
-categories_changed_cb (gpointer object, gpointer user_data)
-{
- GList *cat_list;
- GPtrArray *cat_array;
- GnomeCalendarPrivate *priv;
- GnomeCalendar *gcal = user_data;
-
- priv = gcal->priv;
-
- cat_array = g_ptr_array_new ();
- cat_list = e_categories_get_list ();
- while (cat_list != NULL) {
- if (e_categories_is_searchable ((const gchar *) cat_list->data))
- g_ptr_array_add (cat_array, cat_list->data);
- cat_list = g_list_remove (cat_list, cat_list->data);
- }
-
- cal_search_bar_set_categories ((CalSearchBar *)priv->search_bar, cat_array);
-
- g_ptr_array_free (cat_array, TRUE);
-}
-
-static void
view_progress_cb (ECalModel *model, const gchar *message, gint percent, ECalSourceType type, GnomeCalendar *gcal)
{
if (type == E_CAL_SOURCE_TYPE_EVENT)
@@ -1321,16 +1256,6 @@ setup_widgets (GnomeCalendar *gcal)
priv = gcal->priv;
- priv->search_bar = cal_search_bar_new (CAL_SEARCH_CALENDAR_DEFAULT);
- g_signal_connect (priv->search_bar, "sexp_changed",
- G_CALLBACK (search_bar_sexp_changed_cb), gcal);
- g_signal_connect (priv->search_bar, "category_changed",
- G_CALLBACK (search_bar_category_changed_cb), gcal);
- categories_changed_cb (NULL, gcal);
-
- gtk_widget_show (priv->search_bar);
- gtk_box_pack_start (GTK_BOX (gcal), priv->search_bar, FALSE, FALSE, 6);
-
/* The main HPaned, with the notebook of calendar views on the left
and the ECalendar and ToDo list on the right. */
priv->hpane = gtk_hpaned_new ();
@@ -1485,8 +1410,6 @@ gnome_calendar_init (GnomeCalendar *gcal)
if (non_intrusive_error_table == NULL)
non_intrusive_error_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
- e_categories_register_change_listener (G_CALLBACK (categories_changed_cb), gcal);
-
priv->todo_update_lock = g_mutex_new ();
priv->current_view_type = GNOME_CAL_DAY_VIEW;
@@ -1528,8 +1451,6 @@ gnome_calendar_destroy (GtkObject *object)
GList *l;
gint i;
- e_categories_unregister_change_listener (G_CALLBACK (categories_changed_cb), gcal);
-
/* Clean up the clients */
for (l = priv->clients_list; l != NULL; l = l->next) {
g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA,
@@ -2658,9 +2579,6 @@ gnome_calendar_new_task (GnomeCalendar *gcal, time_t *dtstart, time_t *dtend)
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomp);
- category = cal_search_bar_get_category (CAL_SEARCH_BAR (priv->search_bar));
- e_cal_component_set_categories (comp, category);
-
dt.value = &itt;
dt.tzid = icaltimezone_get_tzid (e_cal_model_get_timezone (model));
@@ -3145,14 +3063,6 @@ gnome_calendar_get_e_calendar_widget (GnomeCalendar *gcal)
return GTK_WIDGET(gcal->priv->date_navigator);
}
-GtkWidget *
-gnome_calendar_get_search_bar_widget (GnomeCalendar *gcal)
-{
- g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
-
- return GTK_WIDGET(gcal->priv->search_bar);
-}
-
ECalMenu *gnome_calendar_get_calendar_menu (GnomeCalendar *gcal)
{
g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL);
diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h
index 7955aedb6c..2560a04215 100644
--- a/calendar/gui/gnome-cal.h
+++ b/calendar/gui/gnome-cal.h
@@ -112,6 +112,11 @@ gboolean gnome_calendar_add_source (GnomeCalendar *gcal, ESource *source)
gboolean gnome_calendar_remove_source (GnomeCalendar *gcal, ESource *source);
gboolean gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, const gchar *uid);
gboolean gnome_calendar_set_default_source (GnomeCalendar *gcal, ESource *source);
+void gnome_calendar_set_search_query (GnomeCalendar *gcal,
+ const gchar *sexp,
+ gboolean range_search,
+ time_t start_range,
+ time_t end_range);
void gnome_calendar_next (GnomeCalendar *gcal);
void gnome_calendar_previous (GnomeCalendar *gcal);
@@ -129,7 +134,6 @@ struct _ECalendarView *gnome_calendar_get_calendar_view (GnomeCalendar *gcal,
GnomeCalendarViewType view_type);
GtkWidget *gnome_calendar_get_e_calendar_widget (GnomeCalendar *gcal);
-GtkWidget *gnome_calendar_get_search_bar_widget (GnomeCalendar *gcal);
GtkWidget *gnome_calendar_get_tag (GnomeCalendar *gcal);
ECalMenu *gnome_calendar_get_calendar_menu (GnomeCalendar *gcal);
diff --git a/modules/addressbook/e-book-shell-view-private.c b/modules/addressbook/e-book-shell-view-private.c
index f930e6d478..6770800dbd 100644
--- a/modules/addressbook/e-book-shell-view-private.c
+++ b/modules/addressbook/e-book-shell-view-private.c
@@ -522,7 +522,7 @@ e_book_shell_view_execute_search (EBookShellView *book_shell_view)
EShellView *shell_view;
EShellWindow *shell_window;
EShellContent *shell_content;
- GtkAction *action;
+ GtkRadioAction *action;
GString *string;
EAddressbookView *view;
EAddressbookModel *model;
@@ -541,8 +541,8 @@ e_book_shell_view_execute_search (EBookShellView *book_shell_view)
text = e_shell_content_get_search_text (shell_content);
shell_window = e_shell_view_get_shell_window (shell_view);
- action = ACTION (CONTACT_SEARCH_ANY_FIELD_CONTAINS);
- value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
+ action = GTK_RADIO_ACTION (ACTION (CONTACT_SEARCH_ANY_FIELD_CONTAINS));
+ value = gtk_radio_action_get_current_value (action);
if (text == NULL || *text == '\0') {
text = "";
diff --git a/modules/calendar/e-cal-shell-view-private.c b/modules/calendar/e-cal-shell-view-private.c
index 9af8e98740..19d29a05fb 100644
--- a/modules/calendar/e-cal-shell-view-private.c
+++ b/modules/calendar/e-cal-shell-view-private.c
@@ -417,7 +417,156 @@ e_cal_shell_view_private_finalize (ECalShellView *cal_shell_view)
void
e_cal_shell_view_execute_search (ECalShellView *cal_shell_view)
{
- /* FIXME */
+ ECalShellContent *cal_shell_content;
+ ECalShellSidebar *cal_shell_sidebar;
+ EShellView *shell_view;
+ EShellWindow *shell_window;
+ EShellContent *shell_content;
+ GnomeCalendar *calendar;
+ ECalendar *mini_calendar;
+ GtkRadioAction *action;
+ GString *string;
+ FilterRule *rule;
+ const gchar *format;
+ const gchar *text;
+ time_t start_range;
+ time_t end_range;
+ gboolean range_search;
+ gchar *start, *end;
+ gchar *query;
+ gchar *temp;
+ gint value;
+
+ shell_view = E_SHELL_VIEW (cal_shell_view);
+ shell_content = e_shell_view_get_shell_content (shell_view);
+ text = e_shell_content_get_search_text (shell_content);
+
+ shell_window = e_shell_view_get_shell_window (shell_view);
+ action = GTK_RADIO_ACTION (ACTION (CAL_SEARCH_ANY_FIELD_CONTAINS));
+ value = gtk_radio_action_get_current_value (action);
+
+ if (text == NULL || *text == '\0') {
+ text = "";
+ value = CALENDAR_SEARCH_SUMMARY_CONTAINS;
+ }
+
+ switch (value) {
+ default:
+ text = "";
+ /* fall through */
+
+ case CALENDAR_SEARCH_SUMMARY_CONTAINS:
+ format = "(contains? \"summary\" %s)";
+ break;
+
+ case CALENDAR_SEARCH_DESCRIPTION_CONTAINS:
+ format = "(contains? \"description\" %s)";
+ break;
+
+ case CALENDAR_SEARCH_ANY_FIELD_CONTAINS:
+ format = "(contains? \"any\" %s)";
+ break;
+ }
+
+ /* Build the query. */
+ string = g_string_new ("");
+ e_sexp_encode_string (string, text);
+ query = g_strdup_printf (format, string->str);
+ g_string_free (string, TRUE);
+
+ range_search = FALSE;
+ range_start = range_end = 0;
+
+ /* Apply selected filter. */
+ value = e_shell_content_get_filter_value (shell_content);
+ switch (value) {
+ case CALENDAR_FILTER_ANY_CATEGORY:
+ break;
+
+ case CALENDAR_FILTER_UNMATCHED:
+ temp = g_strdup_printf (
+ "(and (has-categories? #f) %s)", query);
+ g_free (query);
+ query = temp;
+ break;
+
+ case CALENDAR_FILTER_ACTIVE_APPOINTMENTS:
+ /* Show a year's worth of appointments. */
+ start_range = time (NULL);
+ end_range = time_add_day (start_range, 365);
+ start = isodate_from_time_t (start_range);
+ end = isodate_from_time_t (end_range);
+
+ temp = g_strdup_printf (
+ "(and %s (occur-in-time-range? "
+ "(make-time \"%s\") (make-time \"%s\")))",
+ query, start, end);
+ g_free (query);
+ query = temp;
+
+ range_search = TRUE;
+ break;
+
+ case CALENDAR_FILTER_NEXT_7_DAYS_APPOINTMENTS:
+ start_range = time (NULL);
+ end_range = time_add_day (start_range, 7);
+ start = isodate_from_time_t (start_range);
+ end = isodate_from_time_t (end_range);
+
+ temp = g_strdup_printf (
+ "(and %s (occur-in-time-range? "
+ "(make-time \"%s\") (make-time \"%s\")))",
+ query, start, end);
+ g_free (query);
+ query = temp;
+
+ range_search = TRUE;
+ break;
+
+ default:
+ {
+ GList *categories;
+ const gchar *category_name;
+
+ categories = e_categories_get_list ();
+ category_name = g_list_nth_data (categories, value);
+ g_list_free (categories);
+
+ temp = g_strdup_printf (
+ "(and (has-categories? \"%s\") %s)",
+ category_name, query);
+ g_free (query);
+ query = temp;
+ break;
+ }
+ }
+
+ /* XXX This is wrong. We need to programmatically construct a
+ * FilterRule, tell it to build code, and pass the resulting
+ * expressing string to ECalModel. */
+ rule = filter_rule_new ();
+ e_shell_content_set_search_rule (shell_content, rule);
+ g_object_unref (rule);
+
+ cal_shell_sidebar = cal_shell_view->priv->cal_shell_sidebar;
+ mini_calendar = e_cal_shell_sidebar_get_mini_calendar (cal_shell_sidebar);
+
+ if (range_search) {
+ /* Switch to list view and hide the mini calendar. */
+ action = GTK_RADIO_ACTION (ACTION (CALENDAR_VIEW_LIST));
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+ gtk_widget_hide (GTK_WIDGET (mini_calendar));
+ } else {
+ /* Ensure the mini calendar is visible. */
+ gtk_widget_show (GTK_WIDGET (mini_calendar));
+ }
+
+ /* Submit the query. */
+ cal_shell_content = cal_shell_view->priv->cal_shell_content;
+ calendar = e_cal_shell_content_get_calendar (cal_shell_content);
+ gnome_calendar_set_search_query (
+ calendar, query, range_search, start_range, end_range);
+ g_free (query);
}
void
diff --git a/modules/calendar/e-memo-shell-view-private.c b/modules/calendar/e-memo-shell-view-private.c
index 69d6c0afe2..4953a388d3 100644
--- a/modules/calendar/e-memo-shell-view-private.c
+++ b/modules/calendar/e-memo-shell-view-private.c
@@ -303,7 +303,7 @@ e_memo_shell_view_execute_search (EMemoShellView *memo_shell_view)
EShellView *shell_view;
EShellWindow *shell_window;
EShellContent *shell_content;
- GtkAction *action;
+ GtkRadioAction *action;
GString *string;
ECalComponentPreview *memo_preview;
EMemoTable *memo_table;
@@ -320,8 +320,8 @@ e_memo_shell_view_execute_search (EMemoShellView *memo_shell_view)
text = e_shell_content_get_search_text (shell_content);
shell_window = e_shell_view_get_shell_window (shell_view);
- action = ACTION (MEMO_SEARCH_ANY_FIELD_CONTAINS);
- value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
+ action = GTK_RADIO_ACTION (ACTION (MEMO_SEARCH_ANY_FIELD_CONTAINS));
+ value = gtk_radio_action_get_current_value (action);
if (text == NULL || *text == '\0') {
text = "";
diff --git a/modules/calendar/e-task-shell-view-private.c b/modules/calendar/e-task-shell-view-private.c
index d6fd8e35aa..be281f1c6e 100644
--- a/modules/calendar/e-task-shell-view-private.c
+++ b/modules/calendar/e-task-shell-view-private.c
@@ -412,7 +412,7 @@ e_task_shell_view_execute_search (ETaskShellView *task_shell_view)
EShellView *shell_view;
EShellWindow *shell_window;
EShellContent *shell_content;
- GtkAction *action;
+ GtkRadioAction *action;
GString *string;
ECalComponentPreview *task_preview;
ECalendarTable *task_table;
@@ -432,8 +432,8 @@ e_task_shell_view_execute_search (ETaskShellView *task_shell_view)
text = e_shell_content_get_search_text (shell_content);
shell_window = e_shell_view_get_shell_window (shell_view);
- action = ACTION (TASK_SEARCH_ANY_FIELD_CONTAINS);
- value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
+ action = GTK_RADIO_ACTION (ACTION (TASK_SEARCH_ANY_FIELD_CONTAINS));
+ value = gtk_radio_action_get_current_value (action);
if (text == NULL || *text == '\0') {
text = "";