aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/pcs
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@ximian.com>2001-08-02 07:33:40 +0800
committerFederico Mena Quintero <federico@src.gnome.org>2001-08-02 07:33:40 +0800
commitddcc505dbf7893735bb02d971a6df1a411cdb646 (patch)
tree6835d6c9ffeb66ae10cb0e2e4e97857df11ead33 /calendar/pcs
parent221856a80b5021398c6248f706b32e56c70c7ae6 (diff)
downloadgsoc2013-evolution-ddcc505dbf7893735bb02d971a6df1a411cdb646.tar
gsoc2013-evolution-ddcc505dbf7893735bb02d971a6df1a411cdb646.tar.gz
gsoc2013-evolution-ddcc505dbf7893735bb02d971a6df1a411cdb646.tar.bz2
gsoc2013-evolution-ddcc505dbf7893735bb02d971a6df1a411cdb646.tar.lz
gsoc2013-evolution-ddcc505dbf7893735bb02d971a6df1a411cdb646.tar.xz
gsoc2013-evolution-ddcc505dbf7893735bb02d971a6df1a411cdb646.tar.zst
gsoc2013-evolution-ddcc505dbf7893735bb02d971a6df1a411cdb646.zip
The calendar search bar widget now includes a drop-down menu of available
2001-08-01 Federico Mena Quintero <federico@ximian.com> The calendar search bar widget now includes a drop-down menu of available categories. * pcs/query.c (func_has_categories): Handle one and only one #f value as meaning "unfiled", for components that have no categories at all. * pcs/cal-backend-file.c (open_cal): Duh, do not notify here about changed categories since at this point we don't have any clients bound to us yet. (create_cal): Likewise. (cal_backend_file_add_cal): Notify here. * gui/cal-search-bar.h (CalSearchBarClass): New signal "category_changed". * gui/cal-search-bar.c (cal_search_bar_construct): Add a drop-down menu for the list of categories. (search_option_items): Removed the "Has category" option, since we now have the drop-down menu instad and it would be confusing to have both options. (regen_query): Likewise. Also, this function is now the old cal_search_bar_query_changed() and is shared by that very function and by the callback from the drop-down menu. (notify_query_contains): Include the sub-sexp for the categories. (cal_search_bar_set_categories): New function. (cal_search_bar_get_category): New function. (categories_selection_done_cb): Emit the "category_changed" signal. * gui/e-tasks.c (obj_updated_cb): Removed function since it did not do anything; all updates are handled by the CalendarModel. (obj_removed_cb): Likewise. (ETasksPrivate): Removed the fields for the categories option menu, since now it is in the ESearchBar. (search_bar_sexp_changed_cb): Use calendar_model_set_query() directly here, as we do not need to frob the sexp anymore. (update_query): Removed. (client_categories_changed_cb): New callback. (search_bar_category_changed_cb): New callback. (e_tasks_new_task): Set the default category on the component to the one that is selected in the search bar. (e_tasks_on_filter_selected): Removed. (e_tasks_on_categories_changed): Removed. (e_tasks_rebuild_categories_menu): Removed. (e_tasks_add_menu_item): Removed. (e_tasks_setup_view_menus): Sanitized not to sink objects wildly. (e_tasks_discard_view_menus): New function. * gui/calendar-model.h (CalendarModelClass): Removed the "categories_changed" signal since this is handled in the Wombat now. * gui/calendar-model.c (calendar_model_get_categories): Removed. (calendar_model_set_value_at): Do not collect the categories. (query_obj_updated_cb): Likewise. (calendar_model_collect_categories): Removed. (calendar_model_set_default_category): Constify. * gui/tasks-control.c (tasks_control_deactivate): Call e_tasks_discard_view_menus(). * gui/gnome-cal.c (search_bar_category_changed_cb): Set the default category for the task pad's model. svn path=/trunk/; revision=11559
Diffstat (limited to 'calendar/pcs')
-rw-r--r--calendar/pcs/cal-backend-file.c104
-rw-r--r--calendar/pcs/query.c37
2 files changed, 83 insertions, 58 deletions
diff --git a/calendar/pcs/cal-backend-file.c b/calendar/pcs/cal-backend-file.c
index 0c87760204..58879c8c3c 100644
--- a/calendar/pcs/cal-backend-file.c
+++ b/calendar/pcs/cal-backend-file.c
@@ -406,6 +406,53 @@ cal_destroy_cb (GtkObject *object, gpointer data)
cal_backend_last_client_gone (CAL_BACKEND (cbfile));
}
+/* Used from g_hash_table_foreach(), adds a category name to the sequence */
+static void
+add_category_cb (gpointer key, gpointer value, gpointer data)
+{
+ Category *c;
+ GNOME_Evolution_Calendar_StringSeq *seq;
+
+ c = value;
+ seq = data;
+
+ seq->_buffer[seq->_length] = CORBA_string_dup (c->name);
+ seq->_length++;
+}
+
+/* Notifies the clients with the current list of categories */
+static void
+notify_categories_changed (CalBackendFile *cbfile)
+{
+ CalBackendFilePrivate *priv;
+ GNOME_Evolution_Calendar_StringSeq *seq;
+ GList *l;
+
+ priv = cbfile->priv;
+
+ /* Build the sequence of category names */
+
+ seq = GNOME_Evolution_Calendar_StringSeq__alloc ();
+ seq->_length = 0;
+ seq->_maximum = g_hash_table_size (priv->categories);
+ seq->_buffer = CORBA_sequence_CORBA_string_allocbuf (seq->_maximum);
+ CORBA_sequence_set_release (seq, TRUE);
+
+ g_hash_table_foreach (priv->categories, add_category_cb, seq);
+ g_assert (seq->_length == seq->_maximum);
+
+ /* Notify the clients */
+
+ for (l = priv->clients; l; l = l->next) {
+ Cal *cal;
+
+ cal = CAL (l->data);
+ cal_notify_categories_changed (cal, seq);
+ }
+
+ CORBA_free (seq);
+}
+
/* Add_cal handler for the file backend */
static void
cal_backend_file_add_cal (CalBackend *backend, Cal *cal)
@@ -429,6 +476,12 @@ cal_backend_file_add_cal (CalBackend *backend, Cal *cal)
backend);
priv->clients = g_list_prepend (priv->clients, cal);
+
+ /* Notify the client about changed categories so that it can populate
+ * its lists.
+ */
+
+ notify_categories_changed (cbfile);
}
/* Idle handler; we save the calendar since it is dirty */
@@ -693,53 +746,6 @@ scan_vcalendar (CalBackendFile *cbfile)
}
}
-/* Used from g_hash_table_foreach(), adds a category name to the sequence */
-static void
-add_category_cb (gpointer key, gpointer value, gpointer data)
-{
- Category *c;
- GNOME_Evolution_Calendar_StringSeq *seq;
-
- c = value;
- seq = data;
-
- seq->_buffer[seq->_length] = CORBA_string_dup (c->name);
- seq->_length++;
-}
-
-/* Notifies the clients with the current list of categories */
-static void
-notify_categories_changed (CalBackendFile *cbfile)
-{
- CalBackendFilePrivate *priv;
- GNOME_Evolution_Calendar_StringSeq *seq;
- GList *l;
-
- priv = cbfile->priv;
-
- /* Build the sequence of category names */
-
- seq = GNOME_Evolution_Calendar_StringSeq__alloc ();
- seq->_length = 0;
- seq->_maximum = g_hash_table_size (priv->categories);
- seq->_buffer = CORBA_sequence_CORBA_string_allocbuf (seq->_maximum);
- CORBA_sequence_set_release (seq, TRUE);
-
- g_hash_table_foreach (priv->categories, add_category_cb, seq);
- g_assert (seq->_length == seq->_maximum);
-
- /* Notify the clients */
-
- for (l = priv->clients; l; l = l->next) {
- Cal *cal;
-
- cal = CAL (l->data);
- cal_notify_categories_changed (cal, seq);
- }
-
- CORBA_free (seq);
-}
-
/* Callback used from icalparser_parse() */
static char *
get_line_fn (char *s, size_t size, void *data)
@@ -804,8 +810,6 @@ open_cal (CalBackendFile *cbfile, GnomeVFSURI *uri, FILE *file)
gnome_vfs_uri_ref (uri);
priv->uri = uri;
- notify_categories_changed (cbfile);
-
return CAL_BACKEND_OPEN_SUCCESS;
}
@@ -827,8 +831,6 @@ create_cal (CalBackendFile *cbfile, GnomeVFSURI *uri)
mark_dirty (cbfile);
- notify_categories_changed (cbfile);
-
return CAL_BACKEND_OPEN_SUCCESS;
}
diff --git a/calendar/pcs/query.c b/calendar/pcs/query.c
index f96b74b88e..94a998aa44 100644
--- a/calendar/pcs/query.c
+++ b/calendar/pcs/query.c
@@ -672,8 +672,11 @@ func_contains (ESExp *esexp, int argc, ESExpResult **argv, void *data)
}
/* (has-categories? STR+)
+ * (has-categories? #f)
*
* STR - At least one string specifying a category
+ * Or you can specify a single #f (boolean false) value for components
+ * that have no categories assigned to them ("unfiled").
*
* Returns a boolean indicating whether the component has all the specified
* categories.
@@ -684,6 +687,7 @@ func_has_categories (ESExp *esexp, int argc, ESExpResult **argv, void *data)
Query *query;
QueryPrivate *priv;
CalComponent *comp;
+ gboolean unfiled;
int i;
GSList *categories;
gboolean matches;
@@ -702,18 +706,37 @@ func_has_categories (ESExp *esexp, int argc, ESExpResult **argv, void *data)
return NULL;
}
- for (i = 0; i < argc; i++)
- if (argv[i]->type != ESEXP_RES_STRING) {
- e_sexp_fatal_error (esexp, _("has-categories? expects all arguments "
- "to be strings"));
- return NULL;
- }
+ if (argc == 1 && argv[0]->type == ESEXP_RES_BOOL)
+ unfiled = TRUE;
+ else
+ unfiled = FALSE;
+
+ if (!unfiled)
+ for (i = 0; i < argc; i++)
+ if (argv[i]->type != ESEXP_RES_STRING) {
+ e_sexp_fatal_error (esexp, _("has-categories? expects all arguments "
+ "to be strings or one and only one "
+ "argument to be a boolean false (#f)"));
+ return NULL;
+ }
- /* Search categories */
+ /* Search categories. First, if there are no categories we return
+ * whether unfiled components are supposed to match.
+ */
cal_component_get_categories_list (comp, &categories);
if (!categories) {
result = e_sexp_result_new (esexp, ESEXP_RES_BOOL);
+ result->value.bool = unfiled;
+
+ return result;
+ }
+
+ /* Otherwise, we *do* have categories but unfiled components were
+ * requested, so this component does not match.
+ */
+ if (unfiled) {
+ result = e_sexp_result_new (esexp, ESEXP_RES_BOOL);
result->value.bool = FALSE;
return result;