diff options
author | Federico Mena Quintero <federico@ximian.com> | 2001-08-02 07:33:40 +0800 |
---|---|---|
committer | Federico Mena Quintero <federico@src.gnome.org> | 2001-08-02 07:33:40 +0800 |
commit | ddcc505dbf7893735bb02d971a6df1a411cdb646 (patch) | |
tree | 6835d6c9ffeb66ae10cb0e2e4e97857df11ead33 /calendar/pcs | |
parent | 221856a80b5021398c6248f706b32e56c70c7ae6 (diff) | |
download | gsoc2013-evolution-ddcc505dbf7893735bb02d971a6df1a411cdb646.tar.gz 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.c | 104 | ||||
-rw-r--r-- | calendar/pcs/query.c | 37 |
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; |