From f231743ff15a88a11d8a9140b357ecef4ca5985b Mon Sep 17 00:00:00 2001 From: JP Rosevear Date: Fri, 26 Mar 2004 20:38:03 +0000 Subject: Fixes #55648 2004-03-26 JP Rosevear Fixes #55648 * gui/print.c (print_todo_details): get the default from the model * gui/gnome-cal.h: remove and update protos * gui/gnome-cal.c (update_query): the clients and client_list members are now arrays of source types (setup_widgets): default the query to everything for tasks, cast the config items (gnome_calendar_init): init all the client hashs (gnome_calendar_destroy): clean them up, clean up all categories (client_cal_opened_cb): handle based on source type (append_category_cb): don't track the size in the closure (client_categories_changed_cb): do all the merging here (backend_died_cb): handle based on source type (gnome_calendar_construct): we don't special case the task stuff any more (gnome_calendar_get_default_client): return the default of the current view (gnome_calendar_add_source): take a source type argument and append accordingly (gnome_calendar_remove_source): similar, but remove accordingly (gnome_calendar_set_default_source): take a source type argument and set the default accordingly (gnome_calendar_new_task): use the default of the task model * gui/e-calendar-view.c (e_calendar_view_add_event): kill warning * gui/calendar-component.c (update_uris_for_selection): pass source type when adding/removing (update_uri_for_primary_selection): ditto (update_task_selection): make sure we show the correct list of tasks (update_primary_task_selection): make sure we track the primary task correctly (delete_calendar_cb): pass source type when removing (config_primary_selection_changed_cb): config listener callback for tasks (config_tasks_selection_changed_cb): ditto (impl_createControls): load the initial task selection, listen for changes (calendar_component_init): get the source lists * gui/calendar-commands.c (sensitize_taskpad_commands): get the task pad and then the default client from that svn path=/trunk/; revision=25201 --- calendar/gui/calendar-component.c | 98 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 6 deletions(-) (limited to 'calendar/gui/calendar-component.c') diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c index cac131ed6d..0f6b0393ef 100644 --- a/calendar/gui/calendar-component.c +++ b/calendar/gui/calendar-component.c @@ -76,8 +76,12 @@ struct _CalendarComponentPrivate { GConfClient *gconf_client; int gconf_notify_id; + ESourceList *source_list; GSList *source_selection; + + ESourceList *task_source_list; + GSList *task_source_selection; GnomeCalendar *calendar; GtkWidget *source_selector; @@ -140,13 +144,13 @@ update_uris_for_selection (CalendarComponent *calendar_component) ESource *old_selected_source = l->data; if (!is_in_selection (selection, old_selected_source)) - gnome_calendar_remove_event_source (priv->calendar, old_selected_source); + gnome_calendar_remove_source (priv->calendar, E_CAL_SOURCE_TYPE_EVENT, old_selected_source); } for (l = selection; l; l = l->next) { ESource *selected_source = l->data; - if (gnome_calendar_add_event_source (priv->calendar, selected_source)) + if (gnome_calendar_add_source (priv->calendar, E_CAL_SOURCE_TYPE_EVENT, selected_source)) uids_selected = g_slist_append (uids_selected, (char *) e_source_peek_uid (selected_source)); } @@ -171,7 +175,7 @@ update_uri_for_primary_selection (CalendarComponent *calendar_component) return; /* Set the default */ - gnome_calendar_set_default_source (priv->calendar, source); + gnome_calendar_set_default_source (priv->calendar, E_CAL_SOURCE_TYPE_EVENT, source); /* Make sure we are embedded first */ calendar_control_sensitize_calendar_commands (priv->view_control, priv->calendar, TRUE); @@ -217,6 +221,43 @@ update_selection (CalendarComponent *calendar_component) g_slist_free (uids_selected); } +static void +update_task_selection (CalendarComponent *calendar_component) +{ + CalendarComponentPrivate *priv; + GSList *uids_selected, *l; + + priv = calendar_component->priv; + + /* Get the selection in gconf */ + uids_selected = calendar_config_get_tasks_selected (); + + /* Remove any that aren't there any more */ + for (l = priv->task_source_selection; l; l = l->next) { + char *uid = l->data; + ESource *source; + + source = e_source_list_peek_source_by_uid (priv->task_source_list, uid); + if (!is_in_uids (uids_selected, source)) + gnome_calendar_remove_source (priv->calendar, E_CAL_SOURCE_TYPE_TODO, source); + + g_free (uid); + } + g_slist_free (priv->task_source_selection); + + /* Make sure the whole selection is there */ + for (l = uids_selected; l; l = l->next) { + char *uid = l->data; + ESource *source; + + source = e_source_list_peek_source_by_uid (priv->task_source_list, uid); + if (!gnome_calendar_add_source (priv->calendar, E_CAL_SOURCE_TYPE_TODO, source)) + /* FIXME do something */; + } + + priv->task_source_selection = uids_selected; +} + static void update_primary_selection (CalendarComponent *calendar_component) { @@ -242,6 +283,25 @@ update_primary_selection (CalendarComponent *calendar_component) } } +static void +update_primary_task_selection (CalendarComponent *calendar_component) +{ + CalendarComponentPrivate *priv; + ESource *source = NULL; + char *uid; + + priv = calendar_component->priv; + + uid = calendar_config_get_primary_tasks (); + if (uid) { + source = e_source_list_peek_source_by_uid (priv->source_list, uid); + g_free (uid); + } + + if (source) + gnome_calendar_set_default_source (priv->calendar, E_CAL_SOURCE_TYPE_TODO, source); +} + /* Callbacks. */ static void add_popup_menu_item (GtkMenu *menu, const char *label, const char *pixmap, @@ -324,7 +384,7 @@ delete_calendar_cb (GtkWidget *widget, CalendarComponent *comp) if (e_cal_remove (cal, NULL)) { if (e_source_selector_source_is_selected (E_SOURCE_SELECTOR (priv->source_selector), selected_source)) { - gnome_calendar_remove_event_source (priv->calendar, selected_source); + gnome_calendar_remove_source (priv->calendar, E_CAL_SOURCE_TYPE_EVENT, selected_source); e_source_selector_unselect_source (E_SOURCE_SELECTOR (priv->source_selector), selected_source); } @@ -409,6 +469,19 @@ config_primary_selection_changed_cb (GConfClient *client, guint id, GConfEntry * update_primary_selection (data); } +static void +config_tasks_selection_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) +{ + update_task_selection (data); +} + + +static void +config_primary_tasks_selection_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) +{ + update_primary_task_selection (data); +} + static gboolean init_calendar_publishing_cb (gpointer data) { @@ -810,8 +883,10 @@ impl_createControls (PortableServer_Servant servant, /* Load the selection from the last run */ update_selection (calendar_component); update_primary_selection (calendar_component); - - /* If it gets fiddled with update */ + update_task_selection (calendar_component); + update_primary_task_selection (calendar_component); + + /* If the selection changes elsewhere, update it */ not = calendar_config_add_notification_calendars_selected (config_selection_changed_cb, calendar_component); priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); @@ -820,6 +895,14 @@ impl_createControls (PortableServer_Servant servant, calendar_component); priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); + not = calendar_config_add_notification_tasks_selected (config_tasks_selection_changed_cb, + calendar_component); + priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); + + not = calendar_config_add_notification_primary_tasks (config_primary_tasks_selection_changed_cb, + calendar_component); + priv->notifications = g_list_prepend (priv->notifications, GUINT_TO_POINTER (not)); + /* Return the controls */ *corba_sidebar_control = CORBA_Object_duplicate (BONOBO_OBJREF (sidebar_control), ev); *corba_view_control = CORBA_Object_duplicate (BONOBO_OBJREF (priv->view_control), ev); @@ -1046,8 +1129,11 @@ calendar_component_init (CalendarComponent *component) * calendar_component_peek_gconf_client(). */ priv->gconf_client = gconf_client_get_default (); + /* FIXME Use ecal convenience functions */ priv->source_list = e_source_list_new_for_gconf (priv->gconf_client, "/apps/evolution/calendar/sources"); + priv->task_source_list = e_source_list_new_for_gconf (priv->gconf_client, + "/apps/evolution/tasks/sources"); priv->activity_handler = e_activity_handler_new (); -- cgit v1.2.3