diff options
-rw-r--r-- | calendar/ChangeLog | 115 | ||||
-rw-r--r-- | calendar/cal-client/cal-client.c | 19 | ||||
-rw-r--r-- | calendar/cal-client/cal-client.h | 3 | ||||
-rw-r--r-- | calendar/cal-util/cal-util.c | 14 | ||||
-rw-r--r-- | calendar/cal-util/cal-util.h | 2 | ||||
-rw-r--r-- | calendar/gui/Makefile.am | 2 | ||||
-rw-r--r-- | calendar/gui/calendar-config.c | 10 | ||||
-rw-r--r-- | calendar/gui/calendar-model.c | 2476 | ||||
-rw-r--r-- | calendar/gui/calendar-model.h | 99 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor.c | 3 | ||||
-rw-r--r-- | calendar/gui/e-cal-view.c | 5 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.c | 275 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.etspec | 35 | ||||
-rw-r--r-- | calendar/gui/e-calendar-table.h | 36 | ||||
-rw-r--r-- | calendar/gui/e-calendar-view.c | 5 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 2 | ||||
-rw-r--r-- | calendar/gui/e-tasks.c | 28 | ||||
-rw-r--r-- | calendar/gui/gnome-cal.c | 38 | ||||
-rw-r--r-- | calendar/gui/print.c | 17 | ||||
-rw-r--r-- | libical/ChangeLog | 5 | ||||
-rw-r--r-- | libical/src/libical/icalcomponent.c | 13 |
21 files changed, 385 insertions, 2817 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 6d3099d53a..11b06bd2dd 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,107 @@ +2003-08-08 Rodrigo Moya <rodrigo@ximian.com> + + * gui/e-cal-model-calendar.c (ecmc_fill_component_from_model): + implemented new virtual method. + (ecmc_class_init): initialize new virtual method. + +2003-08-08 Rodrigo Moya <rodrigo@ximian.com> + + * cal-client/cal-client.c (cal_client_update_object_with_mod): + cal_client_get_component_as_string_internal expects now a + icalcomponent, not a CalComponent. + + * gui/e-cal-model.h: added fill_component_from_model virtual method. + + * gui/e-cal-model.c (e_cal_model_get_default_client): return + the default URI as per the configuration if we've got that + client loaded. If not, return the first client. + (get_dtstart): retrieve the value from the icalproperty. + (set_summary): implemented correctly. + (set_categories, set_classification, set_description): changed + to really get an ECalModelComponent. + (ecm_append_row): pass the correct arguments to the set_ functions + and call the class' fill_component_from_model method to fill in the + created icalcomponent. + + * gui/e-cal-model-tasks.c (set_due): added missing function. + (ecmt_set_value_at): implemented case for DUE field. + (ecmt_fill_component_from_model): implemented new virtual method. + (ecmt_append_row): removed. + + * gui/e-cal-model-calendar.c (ecmc_append_row): removed. + + * gui/e-calendar-table.c (e_calendar_table_init): initialize + missing fields. Disabled call to g_object_unref on the 'extras' + object, since it causes GLib warnings. Something is wrong here. + +2003-08-08 Rodrigo Moya <rodrigo@ximian.com> + + * gui/e-cal-model.c (cal_opened_cb): don't call remove_client, + since the client, at this point, hasn't been added anywhere. + (ecm_finalize): don't call e_cal_model_remove_all_clients, since + that function triggers notifications on the model. + (query_obj_updated_cb): free all the date fields. + +2003-08-07 Rodrigo Moya <rodrigo@ximian.com> + + * gui/e-cal-model.c (ecm_value_at): don't convert to an integer + the return value from get_color. + (ecm_get_color_for_component): use correct GTK 2.x color values. + + * gui/e-calendar-table.c: replace all CAL_COMPONENT_FIELD... + with the correct E_CAL_MODEL_*_FIELD... + +2003-08-07 Rodrigo Moya <rodrigo@ximian.com> + + * gui/e-cal-model-tasks.c (get_completed, get_due): added + missing implementation. + (ecmt_class_init): initialize missing virtual method. + + * gui/gnome-cal.c (gnome_calendar_construct): fixed typo. + +2003-08-07 Rodrigo Moya <rodrigo@ximian.com> + + * cal-client/cal-client.[ch] (cal_client_get_component_as_string): + * cal-util/cal-util.[ch] (cal_util_add_timezone_from_component): + use icalcomponent's instead of CalComponent's. + + * gui/Makefile.am: + * gui/calendar-model.[ch]: removed old model class. + + * gui/e-calendar-table.[ch]: use ECalModelTasks class instead + of CalendarModel. + (e_calendar_table_set_status_message): new function. + (get_selected_comp): return an ECalModelComponent. + (get_selected_objects): return a list of ECalModelComponent's. + (delete_selected_components): use the CalClient associated + with each component. + (copy_row_cb): adapted to changes in get_selected_comp. + + * gui/e-tasks.c: + * gui/print.c: + * gui/dialogs/comp-editor.c (save_as_cmd): + * gui/e-day-view.c (e_day_view_on_drag_data_get): + * gui/e-cal-view.c (e_cal_view_copy_clipboard, on_save_as): pass + an icalcomponent to cal_util_add_timezones_from_component and + cal_client_get_component_as_string. + + * gui/e-cal-model.[ch] (e_cal_model_set_use_24_hour_format): + (e_cal_model_get_default_client): + (e_cal_model_set_default_category): new functions. + + * gui/e-cal-model-tasks.[ch] (e_cal_model_tasks_mark_task_complete): + new function. + (ecmt_get_color_for_component): chain the call to the parent class + so that it assigns the per-client color to 'normal' tasks. + + * gui/calendar-config.c (calendar_config_configure_e_calendar_table): + call e_cal_model_set_use_24_hour_format. + +2003-08-07 Rodrigo Moya <rodrigo@ximian.com> + + * gui/e-cal-model.c (ecm_get_color_for_component): use the color + palette from Tuomas. + 2003-08-06 Rodrigo Moya <rodrigo@ximian.com> * gui/e-cal-model.[ch]: removed 'create_component_with_defaults' @@ -45,11 +149,6 @@ * gui/e-cal-model-tasks.c (ecmt_get_color_for_component): implemented new class' virtual method. -2003-08-05 Jack Jia <jack.jia@sun.com> - - * gui/dialogs/event-page.glade: changed one of the "Con_fidential" to - "Co_nfidential" since we already have "File" using the same 'F' key. - 2003-08-05 Rodrigo Moya <rodrigo@ximian.com> * cal-client_/cal-client.c (cal_client_get_default_object): use @@ -103,11 +202,6 @@ * gui/e-cal-model-tasks.[ch]: new class for the tasks model. -2003-08-01 Lorenzo Gil <lgs@sicem.biz> - - * gui/e-alarm-list.c: added the include <config.h> line at the - beginning to enable gettext. - 2003-07-31 Rodrigo Moya <rodrigo@ximian.com> * gui/e-cal-model.[ch]: new class, based on CalendarModel to be @@ -120,6 +214,7 @@ * cal-client/cal-client-multi.[ch]: * cal-client/Makefile.am: removed obsolete code. +>>>>>>> 1.1841.2.20 2003-07-29 Rodrigo Moya <rodrigo@ximian.com> Fixes all "alarm daemon doesn't start with session" diff --git a/calendar/cal-client/cal-client.c b/calendar/cal-client/cal-client.c index 740d8f4062..762e2c7e4a 100644 --- a/calendar/cal-client/cal-client.c +++ b/calendar/cal-client/cal-client.c @@ -2562,7 +2562,7 @@ free_timezone_string (gpointer key, gpointer value, gpointer data) as before. */ static char* cal_client_get_component_as_string_internal (CalClient *client, - CalComponent *comp, + icalcomponent *icalcomp, gboolean include_all_timezones) { GHashTable *timezone_hash; @@ -2570,7 +2570,6 @@ cal_client_get_component_as_string_internal (CalClient *client, int initial_vcal_string_len; ForeachTZIDCallbackData cbdata; char *obj_string; - CalClientPrivate *priv; priv = client->priv; @@ -2583,8 +2582,7 @@ cal_client_get_component_as_string_internal (CalClient *client, cbdata.timezone_hash = timezone_hash; cbdata.include_all_timezones = include_all_timezones; cbdata.success = TRUE; - icalcomponent_foreach_tzid (cal_component_get_icalcomponent (comp), - foreach_tzid_callback, &cbdata); + icalcomponent_foreach_tzid (icalcomp, foreach_tzid_callback, &cbdata); if (!cbdata.success) { g_hash_table_foreach (timezone_hash, free_timezone_string, NULL); @@ -2607,7 +2605,7 @@ cal_client_get_component_as_string_internal (CalClient *client, vcal_string); /* Get the string for the VEVENT/VTODO. */ - obj_string = cal_component_get_as_string (comp); + obj_string = g_strdup (icalcomponent_as_ical_string (icalcomp)); /* If there were any timezones to send, create a complete VCALENDAR, else just send the VEVENT/VTODO string. */ @@ -2630,7 +2628,7 @@ cal_client_get_component_as_string_internal (CalClient *client, /** * cal_client_get_component_as_string: * @client: A calendar client. - * @comp: A calendar component object. + * @icalcomp: A calendar component object. * * Gets a calendar component as an iCalendar string, with a toplevel * VCALENDAR component and all VTIMEZONEs needed for the component. @@ -2639,11 +2637,9 @@ cal_client_get_component_as_string_internal (CalClient *client, * failure. The string should be freed after use. **/ char* -cal_client_get_component_as_string (CalClient *client, - CalComponent *comp) +cal_client_get_component_as_string (CalClient *client, icalcomponent *icalcomp) { - return cal_client_get_component_as_string_internal (client, comp, - TRUE); + return cal_client_get_component_as_string_internal (client, icalcomp, TRUE); } CalClientResult @@ -2665,7 +2661,8 @@ cal_client_update_object_with_mod (CalClient *client, CalComponent *comp, CalObj cal_component_commit_sequence (comp); obj_string = cal_client_get_component_as_string_internal (client, - comp, FALSE); + cal_component_get_icalcomponent (comp), + FALSE); if (obj_string == NULL) return CAL_CLIENT_RESULT_INVALID_OBJECT; diff --git a/calendar/cal-client/cal-client.h b/calendar/cal-client/cal-client.h index baf2072868..376c674c58 100644 --- a/calendar/cal-client/cal-client.h +++ b/calendar/cal-client/cal-client.h @@ -223,8 +223,7 @@ icaltimezone *cal_client_resolve_tzid_cb (const char *tzid, gpointer data); /* Returns a complete VCALENDAR for a VEVENT/VTODO including all VTIMEZONEs used by the component. It also includes a 'METHOD:PUBLISH' property. */ -char* cal_client_get_component_as_string (CalClient *client, - CalComponent *comp); +char* cal_client_get_component_as_string (CalClient *client, icalcomponent *icalcomp); diff --git a/calendar/cal-util/cal-util.c b/calendar/cal-util/cal-util.c index ad495bca77..9bedf7d53c 100644 --- a/calendar/cal-util/cal-util.c +++ b/calendar/cal-util/cal-util.c @@ -612,7 +612,7 @@ cal_util_expand_uri (char *uri, gboolean tasks) /* callback for icalcomponent_foreach_tzid */ typedef struct { icalcomponent *vcal_comp; - CalComponent *comp; + icalcomponent *icalcomp; } ForeachTzidData; static void @@ -631,8 +631,7 @@ add_timezone_cb (icalparameter *param, void *data) if (tz) return; - tz = icalcomponent_get_timezone (cal_component_get_icalcomponent (f_data->comp), - tzid); + tz = icalcomponent_get_timezone (f_data->icalcomp, tzid); if (!tz) { tz = icaltimezone_get_builtin_timezone_from_tzid (tzid); if (!tz) @@ -651,15 +650,14 @@ add_timezone_cb (icalparameter *param, void *data) * in the given CalComponent. */ void cal_util_add_timezones_from_component (icalcomponent *vcal_comp, - CalComponent *comp) + icalcomponent *icalcomp) { ForeachTzidData f_data; g_return_if_fail (vcal_comp != NULL); - g_return_if_fail (IS_CAL_COMPONENT (comp)); + g_return_if_fail (icalcomp != NULL);; f_data.vcal_comp = vcal_comp; - f_data.comp = comp; - icalcomponent_foreach_tzid (cal_component_get_icalcomponent (comp), - add_timezone_cb, &f_data); + f_data.icalcomp = icalcomp; + icalcomponent_foreach_tzid (icalcomp, add_timezone_cb, &f_data); } diff --git a/calendar/cal-util/cal-util.h b/calendar/cal-util/cal-util.h index 3bf2a0d3ab..19c73270b3 100644 --- a/calendar/cal-util/cal-util.h +++ b/calendar/cal-util/cal-util.h @@ -97,7 +97,7 @@ int cal_util_priority_from_string (const char *string); char *cal_util_expand_uri (char *uri, gboolean tasks); void cal_util_add_timezones_from_component (icalcomponent *vcal_comp, - CalComponent *comp); + icalcomponent *icalcomp); /* The static capabilities to be supported by backends */ #define CAL_STATIC_CAPABILITY_NO_ALARM_REPEAT "no-alarm-repeat" diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am index d40c2da78c..eef7821858 100644 --- a/calendar/gui/Makefile.am +++ b/calendar/gui/Makefile.am @@ -98,8 +98,6 @@ libevolution_calendar_la_SOURCES = \ calendar-commands.h \ calendar-component.c \ calendar-component.h \ - calendar-model.c \ - calendar-model.h \ calendar-offline-handler.c \ calendar-offline-handler.h \ calendar-view.c \ diff --git a/calendar/gui/calendar-config.c b/calendar/gui/calendar-config.c index 84f334beff..2ac2a4062b 100644 --- a/calendar/gui/calendar-config.c +++ b/calendar/gui/calendar-config.c @@ -631,7 +631,7 @@ calendar_config_configure_e_cell_date_edit (ECellDateEdit *ecde) void calendar_config_configure_e_calendar_table (ECalendarTable *cal_table) { - CalendarModel *model; + ECalModel *model; gboolean use_24_hour; char *location; icaltimezone *zone; @@ -641,17 +641,13 @@ calendar_config_configure_e_calendar_table (ECalendarTable *cal_table) use_24_hour = calendar_config_get_24_hour_format (); model = e_calendar_table_get_model (cal_table); - calendar_model_set_use_24_hour_format (model, use_24_hour); + e_cal_model_set_use_24_hour_format (model, use_24_hour); location = calendar_config_get_timezone (); zone = icaltimezone_get_builtin_timezone (location); - calendar_model_set_timezone (model, zone); + e_cal_model_set_timezone (model, zone); calendar_config_configure_e_cell_date_edit (cal_table->dates_cell); - - /* Reload the event/tasks, since the 'Hide Completed Tasks' option - may have been changed, so the query needs to be updated. */ - calendar_model_refresh (model); } diff --git a/calendar/gui/calendar-model.c b/calendar/gui/calendar-model.c deleted file mode 100644 index b5d0738729..0000000000 --- a/calendar/gui/calendar-model.c +++ /dev/null @@ -1,2476 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* Evolution calendar - Data model for ETable - * - * Copyright (C) 2000 Ximian, Inc. - * Copyright (C) 2000 Ximian, Inc. - * - * Authors: Federico Mena-Quintero <federico@ximian.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include <math.h> -#include <sys/types.h> - -#include <ctype.h> - -#include <libgnomeui/gnome-messagebox.h> -#include <libgnomeui/gnome-stock-icons.h> -#include <libgnome/gnome-i18n.h> -#include <gal/widgets/e-unicode.h> -#include <gal/util/e-util.h> -#include <e-util/e-time-utils.h> -#include <cal-util/timeutil.h> -#include "calendar-commands.h" -#include "calendar-config.h" -#include "comp-util.h" -#include "itip-utils.h" -#include "calendar-model.h" -#include "evolution-activity-client.h" -#include "e-cell-date-edit-text.h" -#include "misc.h" - -/* This specifies how often we refresh the list, so that completed tasks are - hidden according to the config setting, and overdue tasks change color etc. - It is in milliseconds, so this is 10 minutes. - Note that if the user is editing an item in the list, they will probably - lose their edit, so this isn't ideal. */ -#define CALENDAR_MODEL_REFRESH_TIMEOUT 1000 * 60 * 10 - -/* These hold the date values of the objects, so we can free the values when - we no longer need them. */ -typedef struct _CalendarModelObjectData CalendarModelObjectData; -struct _CalendarModelObjectData { - ECellDateEditValue *dtstart; - ECellDateEditValue *dtend; - ECellDateEditValue *due; - ECellDateEditValue *completed; -}; - -/* We use a pointer to this value to indicate that the property is not set. */ -static ECellDateEditValue unset_date_edit_value; - -/* Private part of the ECalendarModel structure */ -struct _CalendarModelPrivate { - /* Calendar client we are using */ - CalClient *client; - - /* Types of objects we are dealing with */ - CalObjType type; - - /* S-expression for query and the query object */ - char *sexp; - CalQuery *query; - - /* Array of pointers to calendar objects */ - GArray *objects; - - /* Array of CalendarModelObjectData* holding data for each of the - objects in the objects array above. */ - GArray *objects_data; - - /* UID -> array index hash */ - GHashTable *uid_index_hash; - - /* Type of components to create when using click-to-add in the table */ - CalComponentVType new_comp_vtype; - - /* Whether we display dates in 24-hour format. */ - gboolean use_24_hour_format; - - /* The default category to use when creating new tasks, e.g. when the - filter is set to a certain category we use that category when - creating a new task. */ - gchar *default_category; - - /* Addresses for determining icons */ - EAccountList *accounts; - - /* The current timezone. */ - icaltimezone *zone; - - /* The id of our timeout function for refreshing the list. */ - gint timeout_id; - - /* The activity client used to show messages on the status bar. */ - EvolutionActivityClient *activity; -}; - - - -static void calendar_model_class_init (CalendarModelClass *class); -static void calendar_model_init (CalendarModel *model); -static void calendar_model_finalize (GObject *object); - -static int calendar_model_column_count (ETableModel *etm); -static int calendar_model_row_count (ETableModel *etm); -static void *calendar_model_value_at (ETableModel *etm, int col, int row); -static void calendar_model_set_value_at (ETableModel *etm, int col, int row, const void *value); -static gboolean calendar_model_is_cell_editable (ETableModel *etm, int col, int row); -static void calendar_model_append_row (ETableModel *etm, ETableModel *source, gint row); -static void *calendar_model_duplicate_value (ETableModel *etm, int col, const void *value); -static void calendar_model_free_value (ETableModel *etm, int col, void *value); -static void *calendar_model_initialize_value (ETableModel *etm, int col); -static gboolean calendar_model_value_is_empty (ETableModel *etm, int col, const void *value); -static char * calendar_model_value_to_string (ETableModel *etm, int col, const void *value); -static int remove_object (CalendarModel *model, const char *uid); -static void ensure_task_complete (CalComponent *comp, - time_t completed_date); -static void ensure_task_not_complete (CalComponent *comp); - -static ETableModelClass *parent_class; - - - -/** - * calendar_model_get_type: - * @void: - * - * Registers the #CalendarModel class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the #CalendarModel class. - **/ - -E_MAKE_TYPE (calendar_model, "CalendarModel", CalendarModel, calendar_model_class_init, - calendar_model_init, E_TABLE_MODEL_TYPE); - -/* Class initialization function for the calendar table model */ -static void -calendar_model_class_init (CalendarModelClass *class) -{ - GObjectClass *object_class; - ETableModelClass *etm_class; - - object_class = (GObjectClass *) class; - etm_class = (ETableModelClass *) class; - - parent_class = g_type_class_peek_parent (class); - - object_class->finalize = calendar_model_finalize; - - etm_class->column_count = calendar_model_column_count; - etm_class->row_count = calendar_model_row_count; - etm_class->value_at = calendar_model_value_at; - etm_class->set_value_at = calendar_model_set_value_at; - etm_class->is_cell_editable = calendar_model_is_cell_editable; - etm_class->append_row = calendar_model_append_row; - etm_class->duplicate_value = calendar_model_duplicate_value; - etm_class->free_value = calendar_model_free_value; - etm_class->initialize_value = calendar_model_initialize_value; - etm_class->value_is_empty = calendar_model_value_is_empty; - etm_class->value_to_string = calendar_model_value_to_string; -} - - -static gboolean -calendar_model_timeout_cb (gpointer data) -{ - CalendarModel *model; - - g_return_val_if_fail (IS_CALENDAR_MODEL (data), FALSE); - - model = CALENDAR_MODEL (data); - - GDK_THREADS_ENTER (); - - calendar_model_refresh (model); - - GDK_THREADS_LEAVE (); - return TRUE; -} - - -/* Object initialization function for the calendar table model */ -static void -calendar_model_init (CalendarModel *model) -{ - CalendarModelPrivate *priv; - - priv = g_new0 (CalendarModelPrivate, 1); - model->priv = priv; - - priv->sexp = g_strdup ("#t"); /* match all by default */ - priv->query = NULL; - - priv->objects = g_array_new (FALSE, TRUE, sizeof (CalComponent *)); - priv->objects_data = g_array_new (FALSE, FALSE, sizeof (CalendarModelObjectData)); - priv->uid_index_hash = g_hash_table_new (g_str_hash, g_str_equal); - priv->new_comp_vtype = CAL_COMPONENT_EVENT; - priv->use_24_hour_format = TRUE; - - priv->timeout_id = g_timeout_add (CALENDAR_MODEL_REFRESH_TIMEOUT, - calendar_model_timeout_cb, model); - - priv->accounts = itip_addresses_get (); - - priv->zone = NULL; - - priv->activity = NULL; - - /* Preload here, to avoid corba calls later */ - /* Gross hack because gnome-canvas is not re-entrant */ - calendar_config_get_tasks_due_today_color (); - calendar_config_get_tasks_overdue_color (); - g_free (calendar_config_get_hide_completed_tasks_sexp ()); -} - -static void -calendar_model_free_object_data (CalendarModel *model, - CalendarModelObjectData *object_data) -{ - if (object_data->dtstart != &unset_date_edit_value) - g_free (object_data->dtstart); - - if (object_data->dtend != &unset_date_edit_value) - g_free (object_data->dtend); - - if (object_data->due != &unset_date_edit_value) - g_free (object_data->due); - - if (object_data->completed != &unset_date_edit_value) - g_free (object_data->completed); -} - -/* Called from g_hash_table_foreach_remove(), frees a stored UID->index - * mapping. - */ -static gboolean -free_uid_index (gpointer key, gpointer value, gpointer data) -{ - int *idx; - - idx = value; - g_free (idx); - - return TRUE; -} - -/* Frees the objects stored in the calendar model */ -static void -free_objects (CalendarModel *model) -{ - CalendarModelPrivate *priv; - int i; - - priv = model->priv; - - g_hash_table_foreach_remove (priv->uid_index_hash, free_uid_index, NULL); - - for (i = 0; i < priv->objects->len; i++) { - CalComponent *comp; - CalendarModelObjectData *object_data; - - comp = g_array_index (priv->objects, CalComponent *, i); - g_assert (comp != NULL); - g_object_unref (comp); - - object_data = &g_array_index (priv->objects_data, - CalendarModelObjectData, i); - calendar_model_free_object_data (model, object_data); - } - - g_array_set_size (priv->objects, 0); - g_array_set_size (priv->objects_data, 0); -} - -/* Destroy handler for the calendar table model */ -static void -calendar_model_finalize (GObject *object) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_CALENDAR_MODEL (object)); - - model = CALENDAR_MODEL (object); - priv = model->priv; - - if (priv->timeout_id) { - g_source_remove (priv->timeout_id); - priv->timeout_id = 0; - } - - /* Free the calendar client interface object */ - - if (priv->client) { - g_signal_handlers_disconnect_matched (priv->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model); - g_object_unref (priv->client); - priv->client = NULL; - } - - if (priv->sexp) { - g_free (priv->sexp); - priv->sexp = NULL; - } - - if (priv->query) { - g_signal_handlers_disconnect_matched (priv->query, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, model); - g_object_unref (priv->query); - priv->query = NULL; - } - - /* Free the uid->index hash data and the array of UIDs */ - - free_objects (model); - - g_hash_table_destroy (priv->uid_index_hash); - priv->uid_index_hash = NULL; - - g_array_free (priv->objects, TRUE); - priv->objects = NULL; - - g_array_free (priv->objects_data, TRUE); - priv->objects_data = NULL; - - g_free (priv->default_category); - - if (priv->activity) { - g_object_unref (priv->activity); - priv->activity = NULL; - } - - /* Free the private structure */ - - g_free (priv); - model->priv = NULL; - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - - -/* ETableModel methods */ - -/* column_count handler for the calendar table model */ -static int -calendar_model_column_count (ETableModel *etm) -{ - return CAL_COMPONENT_FIELD_NUM_FIELDS; -} - -/* row_count handler for the calendar table model */ -static int -calendar_model_row_count (ETableModel *etm) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - - model = CALENDAR_MODEL (etm); - priv = model->priv; - - return priv->objects->len; -} - -/* Builds a string based on the list of CATEGORIES properties of a calendar - * component. - */ -static char * -get_categories (CalComponent *comp) -{ - const char *categories; - - cal_component_get_categories (comp, &categories); - - return categories ? (char*) categories : ""; -} - -/* Returns a string based on the CLASSIFICATION property of a calendar component */ -static char * -get_classification (CalComponent *comp) -{ - CalComponentClassification classif; - - cal_component_get_classification (comp, &classif); - - switch (classif) { - case CAL_COMPONENT_CLASS_PRIVATE: - return _("Private"); - - case CAL_COMPONENT_CLASS_CONFIDENTIAL: - return _("Confidential"); - - default: - return _("Public"); - } -} - -/* Returns an ECellDateEditValue* for a COMPLETED property of a - calendar component. Note that we cache these in the objects_data array so - we can free them eventually. */ -static ECellDateEditValue* -get_completed (CalendarModel *model, - CalComponent *comp, - int row) -{ - CalendarModelPrivate *priv; - CalendarModelObjectData *object_data; - struct icaltimetype *completed; - - priv = model->priv; - - object_data = &g_array_index (priv->objects_data, - CalendarModelObjectData, row); - - if (!object_data->completed) { - cal_component_get_completed (comp, &completed); - - if (completed) { - object_data->completed = g_new (ECellDateEditValue, 1); - object_data->completed->tt = *completed; - object_data->completed->zone = icaltimezone_get_utc_timezone (); - cal_component_free_icaltimetype (completed); - } else { - object_data->completed = &unset_date_edit_value; - } - } - - return (object_data->completed == &unset_date_edit_value) - ? NULL : object_data->completed; -} - -/* Returns an ECellDateEditValue* for a DTSTART, DTEND or DUE property of a - calendar component. Note that we cache these in the objects_data array so - we can free them eventually. */ -static ECellDateEditValue* -get_date_edit_value (CalendarModel *model, CalComponent *comp, - int col, int row) -{ - CalendarModelPrivate *priv; - CalComponentDateTime dt; - CalendarModelObjectData *object_data; - ECellDateEditValue **value; - - priv = model->priv; - - object_data = &g_array_index (priv->objects_data, - CalendarModelObjectData, row); - - if (col == CAL_COMPONENT_FIELD_DTSTART) - value = &object_data->dtstart; - else if (col == CAL_COMPONENT_FIELD_DTEND) - value = &object_data->dtend; - else - value = &object_data->due; - - if (!(*value)) { - if (col == CAL_COMPONENT_FIELD_DTSTART) - cal_component_get_dtstart (comp, &dt); - else if (col == CAL_COMPONENT_FIELD_DTEND) - cal_component_get_dtend (comp, &dt); - else - cal_component_get_due (comp, &dt); - - if (dt.value) { - CalClientGetStatus status; - icaltimezone *zone; - - /* For a DTEND with a DATE value, we subtract 1 from - the day to display it. */ - if (col == CAL_COMPONENT_FIELD_DTEND - && dt.value->is_date) { - icaltime_adjust (dt.value, -1, 0, 0, 0); - } - - *value = g_new (ECellDateEditValue, 1); - (*value)->tt = *dt.value; - - /* FIXME: TIMEZONES: Handle error. */ - status = cal_client_get_timezone (model->priv->client, - dt.tzid, &zone); - (*value)->zone = zone; - } else { - *value = &unset_date_edit_value; - } - - cal_component_free_datetime (&dt); - } - - return (*value == &unset_date_edit_value) ? NULL : *value; -} - -/* Builds a string for the GEO property of a calendar component */ -static char* -get_geo (CalComponent *comp) -{ - struct icalgeotype *geo; - static gchar buf[32]; - - cal_component_get_geo (comp, &geo); - - if (!geo) - buf[0] = '\0'; - else { - g_snprintf (buf, sizeof (buf), "%g %s, %g %s", - fabs (geo->lat), - geo->lat >= 0.0 ? _("N") : _("S"), - fabs (geo->lon), - geo->lon >= 0.0 ? _("E") : _("W")); - cal_component_free_geo (geo); - } - - return buf; -} - -/* Builds a string for the PERCENT property of a calendar component */ -static int -get_percent (CalComponent *comp) -{ - int *percent, retval; - - cal_component_get_percent (comp, &percent); - - if (percent) { - retval = *percent; - cal_component_free_percent (percent); - } else { - retval = -1; - } - - return retval; -} - -/* Builds a string for the PRIORITY property of a calendar component */ -static char * -get_priority (CalComponent *comp) -{ - int *priority; - char *retval = ""; - - cal_component_get_priority (comp, &priority); - - if (priority) { - retval = cal_util_priority_to_string (*priority); - cal_component_free_priority (priority); - } - - return retval; -} - -/* Builds a string for the SUMMARY property of a calendar component */ -static char * -get_summary (CalComponent *comp) -{ - CalComponentText summary; - - cal_component_get_summary (comp, &summary); - - if (summary.value) - return (char *) summary.value; - else - return ""; -} - -/* Builds a string for the TRANSPARENCY property of a calendar component */ -static char * -get_transparency (CalComponent *comp) -{ - CalComponentTransparency transp; - - cal_component_get_transparency (comp, &transp); - - if (transp == CAL_COMPONENT_TRANSP_TRANSPARENT) - return _("Free"); - else - return _("Busy"); -} - -/* Builds a string for the URL property of a calendar component */ -static char * -get_url (CalComponent *comp) -{ - const char *url; - - cal_component_get_url (comp, &url); - - if (url) - return (char *) url; - else - return ""; -} - -/* Returns whether the completion date has been set on a component */ -static gboolean -is_complete (CalComponent *comp) -{ - struct icaltimetype *t; - gboolean retval; - - cal_component_get_completed (comp, &t); - retval = (t != NULL); - - if (retval) - cal_component_free_icaltimetype (t); - - return retval; -} - -typedef enum { - CALENDAR_MODEL_DUE_NEVER, - CALENDAR_MODEL_DUE_FUTURE, - CALENDAR_MODEL_DUE_TODAY, - CALENDAR_MODEL_DUE_OVERDUE, - CALENDAR_MODEL_DUE_COMPLETE -} CalendarModelDueStatus; - - -static CalendarModelDueStatus -get_due_status (CalendarModel *model, CalComponent *comp) -{ - CalendarModelPrivate *priv; - CalComponentDateTime dt; - CalendarModelDueStatus retval; - - priv = model->priv; - - cal_component_get_due (comp, &dt); - - /* First, do we have a due date? */ - - if (!dt.value) - retval = CALENDAR_MODEL_DUE_NEVER; - else { - struct icaltimetype now_tt; - CalClientGetStatus status; - icaltimezone *zone; - - /* Second, is it already completed? */ - - if (is_complete (comp)) { - retval = CALENDAR_MODEL_DUE_COMPLETE; - goto out; - } - - /* Third, are we overdue as of right now? */ - - if (dt.value->is_date) { - int cmp; - - now_tt = icaltime_current_time_with_zone (priv->zone); - cmp = icaltime_compare_date_only (*dt.value, now_tt); - - if (cmp < 0) - retval = CALENDAR_MODEL_DUE_OVERDUE; - else if (cmp == 0) - retval = CALENDAR_MODEL_DUE_TODAY; - else - retval = CALENDAR_MODEL_DUE_FUTURE; - } else { - /* Get the current time in the same timezone as the DUE date.*/ - status = cal_client_get_timezone (model->priv->client, dt.tzid, - &zone); - if (status != CAL_CLIENT_GET_SUCCESS) { - retval = CALENDAR_MODEL_DUE_FUTURE; - goto out; - } - - now_tt = icaltime_current_time_with_zone (zone); - - if (icaltime_compare (*dt.value, now_tt) <= 0) - retval = CALENDAR_MODEL_DUE_OVERDUE; - else - if (icaltime_compare_date_only (*dt.value, now_tt) == 0) - retval = CALENDAR_MODEL_DUE_TODAY; - else - retval = CALENDAR_MODEL_DUE_FUTURE; - } - } - - out: - - cal_component_free_datetime (&dt); - - return retval; -} - -/* Returns whether a component is overdue. */ -static gboolean -is_overdue (CalendarModel *model, CalComponent *comp) -{ - switch (get_due_status (model, comp)) { - case CALENDAR_MODEL_DUE_NEVER: - case CALENDAR_MODEL_DUE_FUTURE: - case CALENDAR_MODEL_DUE_COMPLETE: - return FALSE; - case CALENDAR_MODEL_DUE_TODAY: - case CALENDAR_MODEL_DUE_OVERDUE: - return TRUE; - } - - return FALSE; -} - -/* Computes the color to be used to display a component */ -static const char * -get_color (CalendarModel *model, CalComponent *comp) -{ - switch (get_due_status (model, comp)) { - case CALENDAR_MODEL_DUE_NEVER: - case CALENDAR_MODEL_DUE_FUTURE: - case CALENDAR_MODEL_DUE_COMPLETE: - return NULL; - case CALENDAR_MODEL_DUE_TODAY: - return calendar_config_get_tasks_due_today_color (); - case CALENDAR_MODEL_DUE_OVERDUE: - return calendar_config_get_tasks_overdue_color (); - } - - return NULL; -} - -static void * -get_status (CalComponent *comp) -{ - icalproperty_status status; - - cal_component_get_status (comp, &status); - - switch (status) { - case ICAL_STATUS_NONE: - return ""; - - case ICAL_STATUS_NEEDSACTION: - return _("Not Started"); - - case ICAL_STATUS_INPROCESS: - return _("In Progress"); - - case ICAL_STATUS_COMPLETED: - return _("Completed"); - - case ICAL_STATUS_CANCELLED: - return _("Cancelled"); - - default: - g_assert_not_reached (); - return NULL; - } -} - -#if 0 -static void * -get_location (CalComponent *comp) -{ - const char *location; - - cal_component_get_location (comp, &location); - return (void*) location; -} -#endif - -/* value_at handler for the calendar table model */ -static void * -calendar_model_value_at (ETableModel *etm, int col, int row) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - CalComponent *comp; - - model = CALENDAR_MODEL (etm); - priv = model->priv; - - g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, NULL); - g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL); - - comp = g_array_index (priv->objects, CalComponent *, row); - g_assert (comp != NULL); - -#if 0 - g_print ("In calendar_model_value_at: %i\n", col); -#endif - - switch (col) { - case CAL_COMPONENT_FIELD_CATEGORIES: - return get_categories (comp); - - case CAL_COMPONENT_FIELD_CLASSIFICATION: - return get_classification (comp); - - case CAL_COMPONENT_FIELD_COMPLETED: - return get_completed (model, comp, row); - - case CAL_COMPONENT_FIELD_DTEND: - case CAL_COMPONENT_FIELD_DTSTART: - case CAL_COMPONENT_FIELD_DUE: - return get_date_edit_value (model, comp, col, row); - - case CAL_COMPONENT_FIELD_GEO: - return get_geo (comp); - - case CAL_COMPONENT_FIELD_PERCENT: - return GINT_TO_POINTER (get_percent (comp)); - - case CAL_COMPONENT_FIELD_PRIORITY: - return get_priority (comp); - - case CAL_COMPONENT_FIELD_SUMMARY: - return get_summary (comp); - - case CAL_COMPONENT_FIELD_TRANSPARENCY: - return get_transparency (comp); - - case CAL_COMPONENT_FIELD_URL: - return get_url (comp); - - case CAL_COMPONENT_FIELD_HAS_ALARMS: - return GINT_TO_POINTER (cal_component_has_alarms (comp)); - - case CAL_COMPONENT_FIELD_ICON: - { - GSList *attendees = NULL, *sl; - gint retval = 0; - - if (cal_component_has_recurrences (comp)) - return GINT_TO_POINTER (1); - - if (itip_organizer_is_user (comp, priv->client)) - return GINT_TO_POINTER (3); - - cal_component_get_attendee_list (comp, &attendees); - for (sl = attendees; sl != NULL; sl = sl->next) { - CalComponentAttendee *ca = sl->data; - const char *text; - - text = itip_strip_mailto (ca->value); - if (e_account_list_find(priv->accounts, E_ACCOUNT_FIND_ID_ADDRESS, text) != NULL) { - if (ca->delto != NULL) - retval = 3; - else - retval = 2; - break; - } - } - - cal_component_free_attendee_list (attendees); - return GINT_TO_POINTER (retval); - break; - } - case CAL_COMPONENT_FIELD_COMPLETE: - return GINT_TO_POINTER (is_complete (comp)); - - case CAL_COMPONENT_FIELD_RECURRING: - return GINT_TO_POINTER (cal_component_has_recurrences (comp)); - - case CAL_COMPONENT_FIELD_OVERDUE: - return GINT_TO_POINTER (is_overdue (model, comp)); - - case CAL_COMPONENT_FIELD_COLOR: - return (void *) get_color (model, comp); - - case CAL_COMPONENT_FIELD_STATUS: - return get_status (comp); - - case CAL_COMPONENT_FIELD_COMPONENT: - return comp; - -#if 0 - case CAL_COMPONENT_FIELD_LOCATION : - return get_location (comp); -#endif - - default: - g_message ("calendar_model_value_at(): Requested invalid column %d", col); - g_assert_not_reached (); - return NULL; - } -} - -/* Builds a list of categories from a comma-delimited string */ -static GSList * -categories_from_string (const char *value) -{ - GSList *list; - const char *categ_start; - const char *categ_end; - const char *p; - - if (!value) - return NULL; - - list = NULL; - - categ_start = categ_end = NULL; - - for (p = value; *p; p++) { - if (categ_start) { - if (*p == ',') { - char *c; - - c = g_strndup (categ_start, categ_end - categ_start + 1); - list = g_slist_prepend (list, c); - - categ_start = categ_end = NULL; - } else if (!isspace (*p)) - categ_end = p; - } else if (!isspace (*p) && *p != ',') - categ_start = categ_end = p; - } - - if (categ_start) { - char *c; - - c = g_strndup (categ_start, categ_end - categ_start + 1); - list = g_slist_prepend (list, c); - } - - return g_slist_reverse (list); -} - -/* Sets the list of categories from a comma-delimited string */ -static void -set_categories (CalComponent *comp, const char *value) -{ - GSList *list; - GSList *l; - - list = categories_from_string (value); - - cal_component_set_categories_list (comp, list); - - for (l = list; l; l = l->next) { - char *s; - - s = l->data; - g_free (s); - } - - g_slist_free (list); -} - - -static void -set_classification (CalComponent *comp, - const char *value) -{ - CalComponentClassification classif; - - if (!g_strcasecmp (value, _("Private"))) - classif = CAL_COMPONENT_CLASS_PRIVATE; - else if (!g_strcasecmp (value, _("Confidential"))) - classif = CAL_COMPONENT_CLASS_CONFIDENTIAL; - else - classif = CAL_COMPONENT_CLASS_PUBLIC; - - cal_component_set_classification (comp, classif); -} - - -/* Called to set the "Date Completed" field. We also need to update the - Status and Percent fields to make sure they match. */ -static void -set_completed (CalendarModel *model, CalComponent *comp, const void *value) -{ - CalendarModelPrivate *priv = model->priv; - ECellDateEditValue *dv = (ECellDateEditValue*) value; - - if (!dv) { - ensure_task_not_complete (comp); - } else { - time_t t; - - if (dv->tt.is_date) { - /* If its a date, it will be floating, - but completed needs a date time value */ - dv->tt.is_date = FALSE; - t = icaltime_as_timet_with_zone (dv->tt, priv->zone); - } else { - /* We assume that COMPLETED is entered in the current timezone, - even though it gets stored in UTC. */ - t = icaltime_as_timet_with_zone (dv->tt, dv->zone); - } - - ensure_task_complete (comp, t); - } -} - -/* Sets a CalComponentDateTime value */ -static void -set_datetime (CalendarModel *model, CalComponent *comp, const void *value, - void (* set_func) (CalComponent *comp, CalComponentDateTime *dt), - gboolean is_dtend) -{ - ECellDateEditValue *dv = (ECellDateEditValue*) value; - - if (!dv) { - (* set_func) (comp, NULL); - } else { - CalComponentDateTime dt; - - dt.value = &dv->tt; - dt.tzid = icaltimezone_get_tzid (dv->zone); - - /* For a DTEND with a DATE value, we add 1 day to it. */ - if (is_dtend && dt.value->is_date) { - icaltime_adjust (dt.value, 1, 0, 0, 0); - } - - (* set_func) (comp, &dt); - } -} - -/* FIXME: We need to set the "transient_for" property for the dialog, but the - * model doesn't know anything about the windows. - */ -static void -show_geo_warning (void) -{ - GtkWidget *dialog; - - dialog = gnome_message_box_new (_("The geographical position must be entered " - "in the format: \n\n45.436845,125.862501"), - GNOME_MESSAGE_BOX_ERROR, - GNOME_STOCK_BUTTON_OK, NULL); - gtk_widget_show (dialog); -} - -/* Sets the geographical position value of a component */ -static void -set_geo (CalComponent *comp, const char *value) -{ - double latitude, longitude; - int matched; - struct icalgeotype geo; - - if (string_is_empty (value)) { - cal_component_set_geo (comp, NULL); - return; - } - - matched = sscanf (value, "%lg , %lg", &latitude, &longitude); - - if (matched != 2) { - show_geo_warning (); - return; - } - - geo.lat = latitude; - geo.lon = longitude; - cal_component_set_geo (comp, &geo); -} - -/* Sets the percent value of a calendar component */ -static void -set_percent (CalComponent *comp, const void *value) -{ - gint percent = GPOINTER_TO_INT (value); - - g_return_if_fail (percent >= -1); - g_return_if_fail (percent <= 100); - - /* A value of -1 means it isn't set. */ - if (percent == -1) { - cal_component_set_percent (comp, NULL); - ensure_task_not_complete (comp); - } else { - cal_component_set_percent (comp, &percent); - - if (percent == 100) - ensure_task_complete (comp, -1); - else { - ensure_task_not_complete (comp); - if (percent > 0) - cal_component_set_status (comp, ICAL_STATUS_INPROCESS); - } - } -} - -/* Sets the priority of a calendar component */ -static void -set_priority (CalComponent *comp, const char *value) -{ - int priority; - - priority = cal_util_priority_from_string (value); - /* If the priority is invalid (which should never happen) output a - warning and set it to undefined. */ - if (priority == -1) { - g_warning ("Invalid priority"); - priority = 0; - } - - cal_component_set_priority (comp, &priority); -} - -/* Sets the summary of a calendar component */ -static void -set_summary (CalComponent *comp, const char *value) -{ - CalComponentText text; - - if (string_is_empty (value)) { - cal_component_set_summary (comp, NULL); - return; - } - - text.value = value; - text.altrep = NULL; /* FIXME: should we preserve the old ALTREP? */ - - cal_component_set_summary (comp, &text); -} - -/* Sets the transparency of a calendar component */ -static void -set_transparency (CalComponent *comp, const char *value) -{ - CalComponentTransparency transp; - - if (!g_strcasecmp (value, _("Free"))) - transp = CAL_COMPONENT_TRANSP_TRANSPARENT; - else - transp = CAL_COMPONENT_TRANSP_OPAQUE; - - cal_component_set_transparency (comp, transp); -} - -/* Sets the URI of a calendar component */ -static void -set_url (CalComponent *comp, const char *value) -{ - if (string_is_empty (value)) { - cal_component_set_url (comp, NULL); - return; - } - - cal_component_set_url (comp, value); -} - -/* Called to set the checkbutton field which indicates whether a task is - complete. */ -static void -set_complete (CalComponent *comp, const void *value) -{ - gint state = GPOINTER_TO_INT (value); - - if (state) { - ensure_task_complete (comp, -1); - } else { - ensure_task_not_complete (comp); - } -} - -/* Sets the status of a calendar component. */ -static void -set_status (CalComponent *comp, const char *value) -{ - icalproperty_status status; - int percent; - - /* An empty string is the same as 'None'. */ - if (!value[0] || !g_strcasecmp (value, _("None"))) - status = ICAL_STATUS_NONE; - else if (!g_strcasecmp (value, _("Not Started"))) - status = ICAL_STATUS_NEEDSACTION; - else if (!g_strcasecmp (value, _("In Progress"))) - status = ICAL_STATUS_INPROCESS; - else if (!g_strcasecmp (value, _("Completed"))) - status = ICAL_STATUS_COMPLETED; - else if (!g_strcasecmp (value, _("Cancelled"))) - status = ICAL_STATUS_CANCELLED; - else { - g_warning ("Invalid status: %s\n", value); - return; - } - - cal_component_set_status (comp, status); - - if (status == ICAL_STATUS_NEEDSACTION) { - percent = 0; - cal_component_set_percent (comp, &percent); - cal_component_set_completed (comp, NULL); - } else if (status == ICAL_STATUS_INPROCESS) { - ensure_task_not_complete (comp); - percent = 50; - cal_component_set_percent (comp, &percent); - } else if (status == ICAL_STATUS_COMPLETED) { - ensure_task_complete (comp, -1); - } -} - -#if 0 -static void -set_location (CalComponent *comp, const char *value) -{ - if (string_is_empty (value)) { - cal_component_set_location (comp, NULL); - return; - } - - cal_component_set_location (comp, value); -} -#endif - -/* set_value_at handler for the calendar table model */ -static void -calendar_model_set_value_at (ETableModel *etm, int col, int row, const void *value) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - CalComponent *comp; - - model = CALENDAR_MODEL (etm); - priv = model->priv; - - g_return_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS); - g_return_if_fail (row >= 0 && row < priv->objects->len); - - comp = g_array_index (priv->objects, CalComponent *, row); - g_assert (comp != NULL); - -#if 0 - g_print ("In calendar_model_set_value_at: %i\n", col); -#endif - - switch (col) { - case CAL_COMPONENT_FIELD_CATEGORIES: - set_categories (comp, value); - break; - - case CAL_COMPONENT_FIELD_CLASSIFICATION: - set_classification (comp, value); - break; - - case CAL_COMPONENT_FIELD_COMPLETED: - set_completed (model, comp, value); - break; - - case CAL_COMPONENT_FIELD_DTEND: - /* FIXME: Need to reset dtstart if dtend happens before it */ - set_datetime (model, comp, value, cal_component_set_dtend, - TRUE); - break; - - case CAL_COMPONENT_FIELD_DTSTART: - /* FIXME: Need to reset dtend if dtstart happens after it */ - set_datetime (model, comp, value, cal_component_set_dtstart, - FALSE); - break; - - case CAL_COMPONENT_FIELD_DUE: - set_datetime (model, comp, value, cal_component_set_due, - FALSE); - break; - - case CAL_COMPONENT_FIELD_GEO: - set_geo (comp, value); - break; - - case CAL_COMPONENT_FIELD_PERCENT: - set_percent (comp, value); - break; - - case CAL_COMPONENT_FIELD_PRIORITY: - set_priority (comp, value); - break; - - case CAL_COMPONENT_FIELD_SUMMARY: - set_summary (comp, value); - break; - - case CAL_COMPONENT_FIELD_TRANSPARENCY: - set_transparency (comp, value); - break; - - case CAL_COMPONENT_FIELD_URL: - set_url (comp, value); - break; - - case CAL_COMPONENT_FIELD_COMPLETE: - set_complete (comp, value); - break; - - case CAL_COMPONENT_FIELD_STATUS: - set_status (comp, value); - break; - -#if 0 - case CAL_COMPONENT_FIELD_LOCATION : - set_location (comp, value); - break; -#endif - - default: - g_message ("calendar_model_set_value_at(): Requested invalid column %d", col); - g_assert_not_reached (); - return; - } - - if (cal_client_update_object (priv->client, comp) != CAL_CLIENT_RESULT_SUCCESS) - g_message ("calendar_model_set_value_at(): Could not update the object!"); -} - -/* is_cell_editable handler for the calendar table model */ -static gboolean -calendar_model_is_cell_editable (ETableModel *etm, int col, int row) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - - model = CALENDAR_MODEL (etm); - priv = model->priv; - - g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, FALSE); - - /* FIXME: We can't check this as 'click-to-add' passes row 0. */ - /*g_return_val_if_fail (row >= 0 && row < priv->objects->len, FALSE);*/ - - switch (col) { - case CAL_COMPONENT_FIELD_CATEGORIES: - case CAL_COMPONENT_FIELD_CLASSIFICATION: - case CAL_COMPONENT_FIELD_COMPLETED: - case CAL_COMPONENT_FIELD_DTEND: - case CAL_COMPONENT_FIELD_DTSTART: - case CAL_COMPONENT_FIELD_DUE: - case CAL_COMPONENT_FIELD_GEO: - case CAL_COMPONENT_FIELD_PERCENT: - case CAL_COMPONENT_FIELD_PRIORITY: - case CAL_COMPONENT_FIELD_SUMMARY: - case CAL_COMPONENT_FIELD_TRANSPARENCY: - case CAL_COMPONENT_FIELD_URL: - case CAL_COMPONENT_FIELD_COMPLETE: - case CAL_COMPONENT_FIELD_STATUS: - return TRUE; - - default: - return FALSE; - } -} - -/* append_row handler for the calendar model */ -static void -calendar_model_append_row (ETableModel *etm, ETableModel *source, gint row) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - CalComponent *comp; - - model = CALENDAR_MODEL (etm); - priv = model->priv; - - /* Guard against saving before the calendar is open */ - if (!(priv->client && cal_client_get_load_state (priv->client) == CAL_CLIENT_LOAD_LOADED)) - return; - - /* FIXME: This should also support journal components */ - switch (priv->new_comp_vtype) { - case CAL_COMPONENT_EVENT: - comp = cal_comp_event_new_with_defaults (priv->client); - break; - case CAL_COMPONENT_TODO: - comp = cal_comp_task_new_with_defaults (priv->client); - break; - default: - comp = cal_component_new (); - cal_component_set_new_vtype (comp, priv->new_comp_vtype); - } - - set_categories (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_CATEGORIES, row)); - set_classification (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_CLASSIFICATION, row)); - set_completed (model, comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_COMPLETED, row)); - /* FIXME: Need to reset dtstart if dtend happens before it */ - set_datetime (model, comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_DTEND, row), cal_component_set_dtend, TRUE); - /* FIXME: Need to reset dtend if dtstart happens after it */ - set_datetime (model, comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_DTSTART, row), cal_component_set_dtstart, FALSE); - set_datetime (model, comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_DUE, row), cal_component_set_due, FALSE); - set_geo (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_GEO, row)); - set_percent (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_PERCENT, row)); - set_priority (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_PRIORITY, row)); - set_summary (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_SUMMARY, row)); - set_transparency (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_TRANSPARENCY, row)); - set_url (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_URL, row)); - set_complete (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_COMPLETE, row)); - set_status (comp, e_table_model_value_at(source, CAL_COMPONENT_FIELD_STATUS, row)); - - if (cal_client_update_object (priv->client, comp) != CAL_CLIENT_RESULT_SUCCESS) { - /* FIXME: Show error dialog. */ - g_message ("calendar_model_append_row(): Could not add new object!"); - } - - g_object_unref (comp); -} - -/* Duplicates a string value */ -static char * -dup_string (const char *value) -{ - return g_strdup (value); -} - -static void* -dup_date_edit_value (const void *value) -{ - ECellDateEditValue *dv, *orig_dv; - - if (value == NULL) - return NULL; - - orig_dv = (ECellDateEditValue*) value; - - dv = g_new (ECellDateEditValue, 1); - *dv = *orig_dv; - - return dv; -} - -/* duplicate_value handler for the calendar table model */ -static void * -calendar_model_duplicate_value (ETableModel *etm, int col, const void *value) -{ - g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, NULL); - - /* They are almost all dup_string()s for now, but we'll have real fields - * later. - */ - - switch (col) { - case CAL_COMPONENT_FIELD_CATEGORIES: - case CAL_COMPONENT_FIELD_CLASSIFICATION: - case CAL_COMPONENT_FIELD_GEO: - case CAL_COMPONENT_FIELD_PRIORITY: - case CAL_COMPONENT_FIELD_SUMMARY: - case CAL_COMPONENT_FIELD_TRANSPARENCY: - case CAL_COMPONENT_FIELD_URL: - case CAL_COMPONENT_FIELD_STATUS: - return dup_string (value); - - case CAL_COMPONENT_FIELD_COMPLETED: - case CAL_COMPONENT_FIELD_DTEND: - case CAL_COMPONENT_FIELD_DTSTART: - case CAL_COMPONENT_FIELD_DUE: - return dup_date_edit_value (value); - - case CAL_COMPONENT_FIELD_HAS_ALARMS: - case CAL_COMPONENT_FIELD_ICON: - case CAL_COMPONENT_FIELD_COMPLETE: - case CAL_COMPONENT_FIELD_PERCENT: - case CAL_COMPONENT_FIELD_RECURRING: - case CAL_COMPONENT_FIELD_OVERDUE: - case CAL_COMPONENT_FIELD_COLOR: - return (void *) value; - - case CAL_COMPONENT_FIELD_COMPONENT: { - CalComponent *comp; - - comp = CAL_COMPONENT (value); - g_object_ref (comp); - return comp; - } - - default: - g_message ("calendar_model_duplicate_value(): Requested invalid column %d", col); - return NULL; - } -} - -/* free_value handler for the calendar table model */ -static void -calendar_model_free_value (ETableModel *etm, int col, void *value) -{ - g_return_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS); - - switch (col) { - case CAL_COMPONENT_FIELD_CATEGORIES: - if (value) - g_free (value); - break; - - case CAL_COMPONENT_FIELD_CLASSIFICATION: - break; - - case CAL_COMPONENT_FIELD_COMPLETED: - case CAL_COMPONENT_FIELD_DTEND: - case CAL_COMPONENT_FIELD_DTSTART: - case CAL_COMPONENT_FIELD_DUE: - case CAL_COMPONENT_FIELD_GEO: - case CAL_COMPONENT_FIELD_PRIORITY: - case CAL_COMPONENT_FIELD_SUMMARY: - case CAL_COMPONENT_FIELD_STATUS: - if (value) - g_free (value); - break; - - case CAL_COMPONENT_FIELD_TRANSPARENCY: - break; - - case CAL_COMPONENT_FIELD_URL: - if (value) - g_free (value); - break; - - case CAL_COMPONENT_FIELD_PERCENT: - case CAL_COMPONENT_FIELD_HAS_ALARMS: - case CAL_COMPONENT_FIELD_ICON: - case CAL_COMPONENT_FIELD_COMPLETE: - case CAL_COMPONENT_FIELD_RECURRING: - case CAL_COMPONENT_FIELD_OVERDUE: - case CAL_COMPONENT_FIELD_COLOR: - break; - - case CAL_COMPONENT_FIELD_COMPONENT: - if (value) - g_object_unref (value); - break; - - default: - g_message ("calendar_model_free_value(): Requested invalid column %d", col); - } -} - -/* Initializes a string value */ -static char * -init_string (void) -{ - return g_strdup (""); -} - -/* initialize_value handler for the calendar table model */ -static void * -calendar_model_initialize_value (ETableModel *etm, int col) -{ - CalendarModel *model; - - g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, NULL); - - model = CALENDAR_MODEL (etm); - - switch (col) { - case CAL_COMPONENT_FIELD_CATEGORIES: - return g_strdup (model->priv->default_category ? model->priv->default_category : ""); - - case CAL_COMPONENT_FIELD_CLASSIFICATION: - case CAL_COMPONENT_FIELD_GEO: - case CAL_COMPONENT_FIELD_PRIORITY: - case CAL_COMPONENT_FIELD_SUMMARY: - case CAL_COMPONENT_FIELD_TRANSPARENCY: - case CAL_COMPONENT_FIELD_URL: - case CAL_COMPONENT_FIELD_STATUS: - return init_string (); - - case CAL_COMPONENT_FIELD_COMPLETED: - case CAL_COMPONENT_FIELD_DTEND: - case CAL_COMPONENT_FIELD_DTSTART: - case CAL_COMPONENT_FIELD_DUE: - case CAL_COMPONENT_FIELD_HAS_ALARMS: - case CAL_COMPONENT_FIELD_ICON: - case CAL_COMPONENT_FIELD_COMPLETE: - case CAL_COMPONENT_FIELD_RECURRING: - case CAL_COMPONENT_FIELD_OVERDUE: - case CAL_COMPONENT_FIELD_COLOR: - case CAL_COMPONENT_FIELD_COMPONENT: - return NULL; - - case CAL_COMPONENT_FIELD_PERCENT: - return GINT_TO_POINTER (-1); - - default: - g_message ("calendar_model_initialize_value(): Requested invalid column %d", col); - return NULL; - } -} - -/* value_is_empty handler for the calendar model. This should return TRUE - unless a significant value has been set. The 'click-to-add' feature - checks all fields to see if any are not empty and if so it adds a new - row, so we only want to return FALSE if we have a useful object. */ -static gboolean -calendar_model_value_is_empty (ETableModel *etm, int col, const void *value) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - - g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, TRUE); - - model = CALENDAR_MODEL (etm); - priv = model->priv; - - switch (col) { - case CAL_COMPONENT_FIELD_CATEGORIES: - /* This could be a hack or not. If the categories field only - * contains the default category, then it possibly means that - * the user has not entered anything at all in the click-to-add; - * the category is in the value because we put it there in - * calendar_model_initialize_value(). - */ - if (priv->default_category && value && strcmp (priv->default_category, value) == 0) - return TRUE; - else - return string_is_empty (value); - - case CAL_COMPONENT_FIELD_CLASSIFICATION: /* actually goes here, not by itself */ - case CAL_COMPONENT_FIELD_GEO: - case CAL_COMPONENT_FIELD_PRIORITY: - case CAL_COMPONENT_FIELD_SUMMARY: - case CAL_COMPONENT_FIELD_TRANSPARENCY: - case CAL_COMPONENT_FIELD_URL: - case CAL_COMPONENT_FIELD_STATUS: - return string_is_empty (value); - - case CAL_COMPONENT_FIELD_COMPLETED: - case CAL_COMPONENT_FIELD_DTEND: - case CAL_COMPONENT_FIELD_DTSTART: - case CAL_COMPONENT_FIELD_DUE: - return value ? FALSE : TRUE; - - case CAL_COMPONENT_FIELD_PERCENT: - return (GPOINTER_TO_INT (value) < 0) ? TRUE : FALSE; - - case CAL_COMPONENT_FIELD_HAS_ALARMS: - case CAL_COMPONENT_FIELD_ICON: - case CAL_COMPONENT_FIELD_COMPLETE: - case CAL_COMPONENT_FIELD_RECURRING: - case CAL_COMPONENT_FIELD_OVERDUE: - case CAL_COMPONENT_FIELD_COLOR: - case CAL_COMPONENT_FIELD_COMPONENT: - return TRUE; - - default: - g_message ("calendar_model_value_is_empty(): Requested invalid column %d", col); - return TRUE; - } -} - -static char* -date_value_to_string (ETableModel *etm, const void *value) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - ECellDateEditValue *dv = (ECellDateEditValue *) value; - struct icaltimetype tt; - struct tm tmp_tm; - char buffer[64]; - - model = CALENDAR_MODEL (etm); - priv = model->priv; - - if (!dv) - return g_strdup (""); - - /* We currently convert all the dates to the current timezone. */ - tt = dv->tt; - icaltimezone_convert_time (&tt, dv->zone, priv->zone); - - tmp_tm.tm_year = tt.year - 1900; - tmp_tm.tm_mon = tt.month - 1; - tmp_tm.tm_mday = tt.day; - tmp_tm.tm_hour = tt.hour; - tmp_tm.tm_min = tt.minute; - tmp_tm.tm_sec = tt.second; - tmp_tm.tm_isdst = -1; - - tmp_tm.tm_wday = time_day_of_week (tt.day, tt.month - 1, tt.year); - - e_time_format_date_and_time (&tmp_tm, priv->use_24_hour_format, - TRUE, FALSE, - buffer, sizeof (buffer)); - return g_strdup (buffer); -} - - -static char * -calendar_model_value_to_string (ETableModel *etm, int col, const void *value) -{ - g_return_val_if_fail (col >= 0 && col < CAL_COMPONENT_FIELD_NUM_FIELDS, NULL); - - switch (col) { - case CAL_COMPONENT_FIELD_CATEGORIES: - case CAL_COMPONENT_FIELD_CLASSIFICATION: - case CAL_COMPONENT_FIELD_GEO: - case CAL_COMPONENT_FIELD_PRIORITY: - case CAL_COMPONENT_FIELD_SUMMARY: - case CAL_COMPONENT_FIELD_TRANSPARENCY: - case CAL_COMPONENT_FIELD_URL: - case CAL_COMPONENT_FIELD_STATUS: - return g_strdup (value); - - case CAL_COMPONENT_FIELD_COMPLETED: - case CAL_COMPONENT_FIELD_DTEND: - case CAL_COMPONENT_FIELD_DTSTART: - case CAL_COMPONENT_FIELD_DUE: - return date_value_to_string (etm, value); - - case CAL_COMPONENT_FIELD_ICON: - if (GPOINTER_TO_INT (value) == 0) - return _("Normal"); - else if (GPOINTER_TO_INT (value) == 1) - return _("Recurring"); - else - return _("Assigned"); - - case CAL_COMPONENT_FIELD_HAS_ALARMS: - case CAL_COMPONENT_FIELD_COMPLETE: - case CAL_COMPONENT_FIELD_RECURRING: - case CAL_COMPONENT_FIELD_OVERDUE: - return value ? _("Yes") : _("No"); - - case CAL_COMPONENT_FIELD_COLOR: - return NULL; - - case CAL_COMPONENT_FIELD_COMPONENT: - return NULL; - - case CAL_COMPONENT_FIELD_PERCENT: - if (GPOINTER_TO_INT (value) < 0) - return g_strdup ("N/A"); - else - return g_strdup_printf ("%i%%", GPOINTER_TO_INT (value)); - - default: - g_message ("calendar_model_value_as_string(): Requested invalid column %d", col); - return NULL; - } -} - - - -/** - * calendar_model_new: - * - * Creates a new calendar model. It must be told about the calendar client - * interface object it will monitor with calendar_model_set_cal_client(). - * - * Return value: A newly-created calendar model. - **/ -CalendarModel * -calendar_model_new (void) -{ - return CALENDAR_MODEL (g_object_new (TYPE_CALENDAR_MODEL, NULL)); -} - - -/* Callback used when a component is updated in the live query */ -static void -query_obj_updated_cb (CalQuery *query, const char *uid, - gboolean query_in_progress, int n_scanned, int total, - gpointer data) -{ - CalendarModel *model; - CalendarModelPrivate *priv; - int orig_idx; - CalComponent *new_comp; - icalcomponent *icalcomp; - const char *new_comp_uid; - int *new_idx; - CalClientGetStatus status; - CalendarModelObjectData new_object_data = { NULL, NULL, NULL, NULL }; - - model = CALENDAR_MODEL (data); - priv = model->priv; - - e_table_model_pre_change (E_TABLE_MODEL (model)); - - orig_idx = remove_object (model, uid); - - status = cal_client_get_object (priv->client, uid, &icalcomp); - - switch (status) { - case CAL_CLIENT_GET_SUCCESS: - new_comp = cal_component_new (); - if (!cal_component_set_icalcomponent (new_comp, icalcomp)) { - g_object_unref (new_comp); - icalcomponent_free (icalcomp); - - if (orig_idx != -1) - e_table_model_row_deleted (E_TABLE_MODEL (model), orig_idx); - else - e_table_model_no_change (E_TABLE_MODEL (model)); - break; - } - - /* Insert the object into the model */ - - cal_component_get_uid (new_comp, &new_comp_uid); - - if (orig_idx == -1) { - /* The object not in the model originally, so we just append it */ - - g_array_append_val (priv->objects, new_comp); - g_array_append_val (priv->objects_data, new_object_data); - - new_idx = g_new (int, 1); - *new_idx = priv->objects->len - 1; - - g_hash_table_insert (priv->uid_index_hash, (char *) new_comp_uid, new_idx); - e_table_model_row_inserted (E_TABLE_MODEL (model), *new_idx); - } else { - int i; - - /* Insert the new version of the object in its old position */ - - g_array_insert_val (priv->objects, orig_idx, new_comp); - g_array_insert_val (priv->objects_data, orig_idx, - new_object_data); - - new_idx = g_new (int, 1); - *new_idx = orig_idx; - g_hash_table_insert (priv->uid_index_hash, (char *) new_comp_uid, new_idx); - - /* Increase the indices of all subsequent objects */ - - for (i = orig_idx + 1; i < priv->objects->len; i++) { - CalComponent *comp; - int *comp_idx; - const char *comp_uid; - - comp = g_array_index (priv->objects, CalComponent *, i); - g_assert (comp != NULL); - - cal_component_get_uid (comp, &comp_uid); - - comp_idx = g_hash_table_lookup (priv->uid_index_hash, comp_uid); - g_assert (comp_idx != NULL); - - (*comp_idx)++; - } - - e_table_model_row_changed (E_TABLE_MODEL (model), *new_idx); - } - - break; - - case CAL_CLIENT_GET_NOT_FOUND: - /* Nothing; the object may have been removed from the server. We just - * notify that the old object was deleted. - */ - if (orig_idx != -1) - e_table_model_row_deleted (E_TABLE_MODEL (model), orig_idx); - else - e_table_model_no_change (E_TABLE_MODEL (model)); - - break; - - case CAL_CLIENT_GET_SYNTAX_ERROR: - g_message ("obj_updated_cb(): Syntax error when getting object `%s'", uid); - - /* Same notification as above */ - if (orig_idx != -1) - e_table_model_row_deleted (E_TABLE_MODEL (model), orig_idx); - else - e_table_model_no_change (E_TABLE_MODEL (model)); - - break; - - default: - g_assert_not_reached (); - } -} - -/* Callback used when a component is removed from the live query */ -static void -query_obj_removed_cb (CalQuery *query, const char *uid, gpointer data) -{ - CalendarModel *model; - int idx; - - model = CALENDAR_MODEL (data); - - e_table_model_pre_change (E_TABLE_MODEL (model)); - - idx = remove_object (model, uid); - - if (idx != -1) - e_table_model_row_deleted (E_TABLE_MODEL (model), idx); - else - e_table_model_no_change (E_TABLE_MODEL (model)); -} - -/* Callback used when a query ends */ -static void -query_query_done_cb (CalQuery *query, CalQueryDoneStatus status, const char *error_str, gpointer data) -{ - CalendarModel *model; - - model = CALENDAR_MODEL (data); - - /* FIXME */ - - calendar_model_set_status_message (model, NULL); - - if (status != CAL_QUERY_DONE_SUCCESS) - g_warning ("query done: %s\n", error_str); -} - -/* Callback used when an evaluation error occurs when running a query */ -static void -query_eval_error_cb (CalQuery *query, const char *error_str, gpointer data) -{ - CalendarModel *model; - - model = CALENDAR_MODEL (data); - - /* FIXME */ - - calendar_model_set_status_message (model, NULL); - - g_warning ("eval error: %s\n", error_str); -} - -/* Builds a complete query sexp for the calendar model by adding the predicates - * to filter only for the type of objects that the model supports, and - * whether we want completed tasks. - */ -static char * -adjust_query_sexp (CalendarModel *model, const char *sexp) -{ - CalendarModelPrivate *priv; - CalObjType type; - char *type_sexp; - char *completed_sexp; - char *new_sexp; - - priv = model->priv; - - type = priv->type; - - if (!(type & CALOBJ_TYPE_ANY)) - type_sexp = g_strdup ("#t"); - else - type_sexp = g_strdup_printf ( - "(or %s %s %s)", - (type & CALOBJ_TYPE_EVENT) ? "(= (get-vtype) \"VEVENT\")" : "", - (type & CALOBJ_TYPE_TODO) ? "(= (get-vtype) \"VTODO\")" : "", - (type & CALOBJ_TYPE_JOURNAL) ? "(= (get-vtype) \"VJOURNAL\")" : ""); - - /* Create a sub-expression for filtering out completed tasks, based on - the config settings. */ - completed_sexp = calendar_config_get_hide_completed_tasks_sexp (); - - new_sexp = g_strdup_printf ("(and %s %s %s)", type_sexp, - completed_sexp ? completed_sexp : "", - sexp); - g_free (type_sexp); - g_free (completed_sexp); - -#if 0 - g_print ("Calendar model sexp:\n%s\n", new_sexp); -#endif - - return new_sexp; -} - -/* Restarts a query */ -static void -update_query (CalendarModel *model) -{ - CalendarModelPrivate *priv; - CalQuery *old_query; - char *real_sexp; - - priv = model->priv; - - e_table_model_pre_change (E_TABLE_MODEL (model)); - free_objects (model); - e_table_model_changed (E_TABLE_MODEL (model)); - - if (!(priv->client - && cal_client_get_load_state (priv->client) == CAL_CLIENT_LOAD_LOADED)) - return; - - old_query = priv->query; - priv->query = NULL; - - if (old_query) { - g_signal_handlers_disconnect_matched (old_query, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, model); - g_object_unref (old_query); - } - - g_assert (priv->sexp != NULL); - real_sexp = adjust_query_sexp (model, priv->sexp); - - calendar_model_set_status_message (model, _("Searching")); - priv->query = cal_client_get_query (priv->client, real_sexp); - g_free (real_sexp); - - if (!priv->query) { - g_message ("update_query(): Could not create the query"); - calendar_model_set_status_message (model, NULL); - return; - } - - g_signal_connect (priv->query, "obj_updated", - G_CALLBACK (query_obj_updated_cb), model); - g_signal_connect (priv->query, "obj_removed", - G_CALLBACK (query_obj_removed_cb), model); - g_signal_connect (priv->query, "query_done", - G_CALLBACK (query_query_done_cb), model); - g_signal_connect (priv->query, "eval_error", - G_CALLBACK (query_eval_error_cb), model); -} - -/* Callback used when a calendar is opened into the server */ -static void -cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer data) -{ - CalendarModel *model; - - model = CALENDAR_MODEL (data); - - if (status != CAL_CLIENT_OPEN_SUCCESS) - return; - - update_query (model); -} - - -/* Removes an object from the model and updates all the indices that follow. - * Returns the index of the object that was removed, or -1 if no object with - * such UID was found. - */ -static int -remove_object (CalendarModel *model, const char *uid) -{ - CalendarModelPrivate *priv; - int *idx; - CalComponent *orig_comp; - int i; - int n; - CalendarModelObjectData *object_data; - - priv = model->priv; - - /* Find the index of the object to be removed */ - - idx = g_hash_table_lookup (priv->uid_index_hash, uid); - if (!idx) - return -1; - - orig_comp = g_array_index (priv->objects, CalComponent *, *idx); - g_assert (orig_comp != NULL); - - /* Decrease the indices of all the objects that follow in the array */ - - for (i = *idx + 1; i < priv->objects->len; i++) { - CalComponent *comp; - int *comp_idx; - const char *comp_uid; - - comp = g_array_index (priv->objects, CalComponent *, i); - g_assert (comp != NULL); - - cal_component_get_uid (comp, &comp_uid); - - comp_idx = g_hash_table_lookup (priv->uid_index_hash, comp_uid); - g_assert (comp_idx != NULL); - - (*comp_idx)--; - g_assert (*comp_idx >= 0); - } - - /* Remove this object from the array and hash */ - - g_hash_table_remove (priv->uid_index_hash, uid); - g_array_remove_index (priv->objects, *idx); - - object_data = &g_array_index (priv->objects_data, - CalendarModelObjectData, *idx); - calendar_model_free_object_data (model, object_data); - g_array_remove_index (priv->objects_data, *idx); - - g_object_unref (orig_comp); - - n = *idx; - g_free (idx); - - return n; -} - -/* Displays messages on the status bar */ -#define EVOLUTION_TASKS_PROGRESS_IMAGE "evolution-tasks-mini.png" -static GdkPixbuf *progress_icon[2] = { NULL, NULL }; - -void -calendar_model_set_status_message (CalendarModel *model, const char *message) -{ - extern EvolutionShellClient *global_shell_client; /* ugly */ - CalendarModelPrivate *priv; - - g_return_if_fail (IS_CALENDAR_MODEL (model)); - - priv = model->priv; - - if (!message || !*message) { - if (priv->activity) { - g_object_unref (priv->activity); - priv->activity = NULL; - } - } - else if (!priv->activity) { - int display; - char *client_id = g_strdup_printf ("%p", model); - - if (progress_icon[0] == NULL) - progress_icon[0] = gdk_pixbuf_new_from_file (EVOLUTION_IMAGESDIR "/" EVOLUTION_TASKS_PROGRESS_IMAGE, NULL); - priv->activity = evolution_activity_client_new ( - global_shell_client, client_id, - progress_icon, message, TRUE, &display); - - g_free (client_id); - } - else - evolution_activity_client_update (priv->activity, message, -1.0); -} - -/** - * calendar_model_get_cal_client: - * @model: A calendar model. - * - * Queries the calendar client interface object that a calendar model is using. - * - * Return value: A calendar client interface object. - **/ -CalClient * -calendar_model_get_cal_client (CalendarModel *model) -{ - CalendarModelPrivate *priv; - - g_return_val_if_fail (model != NULL, NULL); - g_return_val_if_fail (IS_CALENDAR_MODEL (model), NULL); - - priv = model->priv; - - return priv->client; -} - - -/** - * calendar_model_set_cal_client: - * @model: A calendar model. - * @client: A calendar client interface object. - * @type: Type of objects to present. - * - * Sets the calendar client interface object that a calendar model will monitor. - * It also sets the types of objects this model will present to an #ETable. - **/ -void -calendar_model_set_cal_client (CalendarModel *model, CalClient *client, CalObjType type) -{ - CalendarModelPrivate *priv; - - g_return_if_fail (model != NULL); - g_return_if_fail (IS_CALENDAR_MODEL (model)); - - if (client) - g_return_if_fail (IS_CAL_CLIENT (client)); - - priv = model->priv; - - if (priv->client == client && priv->type == type) - return; - - if (client) - g_object_ref (client); - - if (priv->client) { - g_signal_handlers_disconnect_matched (priv->client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model); - g_object_unref (priv->client); - } - - priv->client = client; - priv->type = type; - - if (priv->client) { - if (cal_client_get_load_state (priv->client) == CAL_CLIENT_LOAD_LOADED) - update_query (model); - else - g_signal_connect (priv->client, "cal_opened", G_CALLBACK (cal_opened_cb), model); - } -} - -/** - * calendar_model_set_query: - * @model: A calendar model. - * @sexp: Sexp that defines the query. - * - * Sets the query sexp that a calendar model will use to filter its contents. - **/ -void -calendar_model_set_query (CalendarModel *model, const char *sexp) -{ - CalendarModelPrivate *priv; - - g_return_if_fail (model != NULL); - g_return_if_fail (IS_CALENDAR_MODEL (model)); - g_return_if_fail (sexp != NULL); - - priv = model->priv; - - if (priv->sexp) - g_free (priv->sexp); - - priv->sexp = g_strdup (sexp); - - update_query (model); -} - - -/** - * calendar_model_set_new_comp_vtype: - * @model: A calendar model. - * @vtype: Type of calendar components to create. - * - * Sets the type of calendar components that will be created by a calendar table - * model when the click-to-add functionality of the table is used. - **/ -void -calendar_model_set_new_comp_vtype (CalendarModel *model, CalComponentVType vtype) -{ - CalendarModelPrivate *priv; - - g_return_if_fail (model != NULL); - g_return_if_fail (IS_CALENDAR_MODEL (model)); - g_return_if_fail (vtype != CAL_COMPONENT_NO_TYPE); - - priv = model->priv; - priv->new_comp_vtype = vtype; -} - -/** - * calendar_model_get_new_comp_vtype: - * @model: A calendar model. - * - * Queries the type of calendar components that are created by a calendar table - * model when using the click-to-add functionality in a table. - * - * Return value: Type of components that are created. - **/ -CalComponentVType -calendar_model_get_new_comp_vtype (CalendarModel *model) -{ - CalendarModelPrivate *priv; - - g_return_val_if_fail (model != NULL, CAL_COMPONENT_NO_TYPE); - g_return_val_if_fail (IS_CALENDAR_MODEL (model), CAL_COMPONENT_NO_TYPE); - - priv = model->priv; - return priv->new_comp_vtype; -} - - -void -calendar_model_mark_task_complete (CalendarModel *model, - gint row) -{ - CalendarModelPrivate *priv; - CalComponent *comp; - - g_return_if_fail (model != NULL); - g_return_if_fail (IS_CALENDAR_MODEL (model)); - - priv = model->priv; - - g_return_if_fail (row >= 0 && row < priv->objects->len); - - comp = g_array_index (priv->objects, CalComponent *, row); - g_assert (comp != NULL); - - ensure_task_complete (comp, -1); - - if (cal_client_update_object (priv->client, comp) != CAL_CLIENT_RESULT_SUCCESS) - g_message ("calendar_model_mark_task_complete(): Could not update the object!"); -} - - -/** - * calendar_model_get_component: - * @model: A calendar model. - * @row: Row number of sought calendar component. - * - * Queries a calendar component from a calendar model based on its row number. - * - * Return value: The sought calendar component. - **/ -CalComponent * -calendar_model_get_component (CalendarModel *model, - gint row) -{ - CalendarModelPrivate *priv; - - g_return_val_if_fail (model != NULL, NULL); - g_return_val_if_fail (IS_CALENDAR_MODEL (model), NULL); - - priv = model->priv; - - g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL); - - return g_array_index (priv->objects, CalComponent *, row); -} - - -/* This makes sure a task is marked as complete. - It makes sure the "Date Completed" property is set. If the completed_date - is not -1, then that is used, otherwise if the "Date Completed" property - is not already set it is set to the current time. - It makes sure the percent is set to 100, and that the status is "Completed". - Note that this doesn't update the component on the server. */ -static void -ensure_task_complete (CalComponent *comp, - time_t completed_date) -{ - struct icaltimetype *old_completed = NULL; - int *old_percent, new_percent; - icalproperty_status status; - gboolean set_completed = TRUE; - - /* Date Completed. */ - if (completed_date == -1) { - cal_component_get_completed (comp, &old_completed); - - if (old_completed) { - cal_component_free_icaltimetype (old_completed); - set_completed = FALSE; - } else { - completed_date = time (NULL); - } - } - - if (set_completed) { - icaltimezone *utc_zone; - struct icaltimetype new_completed; - - /* COMPLETED is stored in UTC. */ - utc_zone = icaltimezone_get_utc_timezone (); - new_completed = icaltime_from_timet_with_zone (completed_date, - FALSE, - utc_zone); - cal_component_set_completed (comp, &new_completed); - } - - /* Percent. */ - cal_component_get_percent (comp, &old_percent); - if (!old_percent || *old_percent != 100) { - new_percent = 100; - cal_component_set_percent (comp, &new_percent); - } - if (old_percent) - cal_component_free_percent (old_percent); - - /* Status. */ - cal_component_get_status (comp, &status); - if (status != ICAL_STATUS_COMPLETED) { - cal_component_set_status (comp, ICAL_STATUS_COMPLETED); - } -} - - -/* This makes sure a task is marked as incomplete. It clears the - "Date Completed" property. If the percent is set to 100 it removes it, - and if the status is "Completed" it sets it to "Needs Action". - Note that this doesn't update the component on the client. */ -static void -ensure_task_not_complete (CalComponent *comp) -{ - icalproperty_status old_status; - int *old_percent; - - /* Date Completed. */ - cal_component_set_completed (comp, NULL); - - /* Percent. */ - cal_component_get_percent (comp, &old_percent); - if (old_percent && *old_percent == 100) - cal_component_set_percent (comp, NULL); - if (old_percent) - cal_component_free_percent (old_percent); - - /* Status. */ - cal_component_get_status (comp, &old_status); - if (old_status == ICAL_STATUS_COMPLETED) - cal_component_set_status (comp, ICAL_STATUS_NEEDSACTION); -} - - -/* Whether we use 24 hour format to display the times. */ -gboolean -calendar_model_get_use_24_hour_format (CalendarModel *model) -{ - g_return_val_if_fail (IS_CALENDAR_MODEL (model), TRUE); - - return model->priv->use_24_hour_format; -} - - -void -calendar_model_set_use_24_hour_format (CalendarModel *model, - gboolean use_24_hour_format) -{ - g_return_if_fail (IS_CALENDAR_MODEL (model)); - - if (model->priv->use_24_hour_format != use_24_hour_format) { - e_table_model_pre_change (E_TABLE_MODEL (model)); - model->priv->use_24_hour_format = use_24_hour_format; - /* Get the views to redraw themselves. */ - e_table_model_changed (E_TABLE_MODEL (model)); - } -} - - -void -calendar_model_set_default_category (CalendarModel *model, - const char *default_category) -{ - g_return_if_fail (IS_CALENDAR_MODEL (model)); - - g_free (model->priv->default_category); - model->priv->default_category = g_strdup (default_category); -} - - - -/* The current timezone. */ -icaltimezone* -calendar_model_get_timezone (CalendarModel *model) -{ - g_return_val_if_fail (IS_CALENDAR_MODEL (model), NULL); - - return model->priv->zone; -} - - -void -calendar_model_set_timezone (CalendarModel *model, - icaltimezone *zone) -{ - g_return_if_fail (IS_CALENDAR_MODEL (model)); - - if (model->priv->zone != zone) { - e_table_model_pre_change (E_TABLE_MODEL (model)); - model->priv->zone = zone; - - /* The timezone affects the times shown for COMPLETED and - maybe other fields, so we need to redisplay everything. */ - e_table_model_changed (E_TABLE_MODEL (model)); - } -} - - -/** - * calendar_model_refresh: - * @model: A calendar model. - * - * Refreshes the calendar model, reloading the events/tasks from the server. - * Be careful about doing this when the user is editing an event/task. - **/ -void -calendar_model_refresh (CalendarModel *model) -{ - g_return_if_fail (model != NULL); - g_return_if_fail (IS_CALENDAR_MODEL (model)); - - update_query (model); -} diff --git a/calendar/gui/calendar-model.h b/calendar/gui/calendar-model.h deleted file mode 100644 index 15936367ef..0000000000 --- a/calendar/gui/calendar-model.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Evolution calendar - Data model for ETable - * - * Copyright (C) 2000 Ximian, Inc. - * Copyright (C) 2000 Ximian, Inc. - * - * Authors: Federico Mena-Quintero <federico@ximian.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef CALENDAR_MODEL_H -#define CALENDAR_MODEL_H - -#include <gal/e-table/e-table-model.h> -#include <cal-client/cal-client.h> - -G_BEGIN_DECLS - - - -#define TYPE_CALENDAR_MODEL (calendar_model_get_type ()) -#define CALENDAR_MODEL(obj) (GTK_CHECK_CAST ((obj), TYPE_CALENDAR_MODEL, CalendarModel)) -#define CALENDAR_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_CALENDAR_MODEL, \ - CalendarModelClass)) -#define IS_CALENDAR_MODEL(obj) (GTK_CHECK_TYPE ((obj), TYPE_CALENDAR_MODEL)) -#define IS_CALENDAR_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_CALENDAR_MODEL)) - -typedef struct _CalendarModel CalendarModel; -typedef struct _CalendarModelClass CalendarModelClass; - -typedef struct _CalendarModelPrivate CalendarModelPrivate; - -struct _CalendarModel { - ETableModel model; - - /* Private data */ - CalendarModelPrivate *priv; -}; - -struct _CalendarModelClass { - ETableModelClass parent_class; -}; - -GtkType calendar_model_get_type (void); - -CalendarModel* calendar_model_new (void); - -CalClient* calendar_model_get_cal_client (CalendarModel *model); -void calendar_model_set_cal_client (CalendarModel *model, - CalClient *client, - CalObjType type); - -void calendar_model_set_query (CalendarModel *model, - const char *sexp); - -void calendar_model_refresh (CalendarModel *model); - -void calendar_model_set_new_comp_vtype (CalendarModel *model, - CalComponentVType vtype); -CalComponentVType calendar_model_get_new_comp_vtype (CalendarModel *model); - -void calendar_model_mark_task_complete (CalendarModel *model, - gint row); - -CalComponent* calendar_model_get_component (CalendarModel *model, - gint row); - -/* Whether we use 24 hour format to display the times. */ -gboolean calendar_model_get_use_24_hour_format (CalendarModel *model); -void calendar_model_set_use_24_hour_format (CalendarModel *model, - gboolean use_24_hour_format); - -/* The current timezone. */ -icaltimezone* calendar_model_get_timezone (CalendarModel *model); -void calendar_model_set_timezone (CalendarModel *model, - icaltimezone *zone); - -void calendar_model_set_default_category (CalendarModel *model, - const char *default_category); - -void calendar_model_set_status_message (CalendarModel *model, - const char *message); - - - -G_END_DECLS - -#endif diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index 1b3afd118b..f9c9919338 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -1282,7 +1282,8 @@ save_as_cmd (GtkWidget *widget, gpointer data) if (filename == NULL) return; - ical_string = cal_client_get_component_as_string (priv->client, priv->comp); + ical_string = cal_client_get_component_as_string (priv->client, + cal_component_get_icalcomponent (priv->comp)); if (ical_string == NULL) { g_warning ("Couldn't convert item to a string"); return; diff --git a/calendar/gui/e-cal-view.c b/calendar/gui/e-cal-view.c index 1895de2e61..24ff9ab570 100644 --- a/calendar/gui/e-cal-view.c +++ b/calendar/gui/e-cal-view.c @@ -587,7 +587,7 @@ e_cal_view_copy_clipboard (ECalView *cal_view) event = (ECalViewEvent *) l->data; if (event) - cal_util_add_timezones_from_component (vcal_comp, event->comp); + cal_util_add_timezones_from_component (vcal_comp, cal_component_get_icalcomponent (event->comp)); } for (l = selected; l != NULL; l = l->next) { @@ -846,7 +846,8 @@ on_save_as (GtkWidget *widget, gpointer user_data) return; event = (ECalViewEvent *) selected->data; - ical_string = cal_client_get_component_as_string (cal_view->priv->client, event->comp); + ical_string = cal_client_get_component_as_string (cal_view->priv->client, + cal_component_get_icalcomponent (event->comp)); if (ical_string == NULL) { g_warning ("Couldn't convert item to a string"); return; diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index 96cba831d8..09c371b9f9 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -46,7 +46,7 @@ #include "e-calendar-table.h" #include "e-cell-date-edit-text.h" #include "calendar-config.h" -#include "calendar-model.h" +#include "e-cal-model-tasks.h" #include "print.h" #include "dialogs/delete-comp.h" #include "dialogs/delete-error.h" @@ -316,9 +316,11 @@ e_calendar_table_init (ECalendarTable *cal_table) GdkPixbuf *pixbuf; GList *strings; + cal_table->activity = NULL; + /* Create the model */ - cal_table->model = calendar_model_new (); + cal_table->model = (ECalModel *) e_cal_model_tasks_new (); /* Create the header columns */ @@ -329,9 +331,9 @@ e_calendar_table_init (ECalendarTable *cal_table) */ cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); g_object_set (G_OBJECT (cell), - "strikeout_column", CAL_COMPONENT_FIELD_COMPLETE, - "bold_column", CAL_COMPONENT_FIELD_OVERDUE, - "color_column", CAL_COMPONENT_FIELD_COLOR, + "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE, + "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE, + "color_column", E_CAL_MODEL_FIELD_COLOR, NULL); e_table_extras_add_cell (extras, "calstring", cell); @@ -342,9 +344,9 @@ e_calendar_table_init (ECalendarTable *cal_table) */ cell = e_cell_date_edit_text_new (NULL, GTK_JUSTIFY_LEFT); g_object_set (G_OBJECT (cell), - "strikeout_column", CAL_COMPONENT_FIELD_COMPLETE, - "bold_column", CAL_COMPONENT_FIELD_OVERDUE, - "color_column", CAL_COMPONENT_FIELD_COLOR, + "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE, + "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE, + "color_column", E_CAL_MODEL_FIELD_COLOR, NULL); popup_cell = e_cell_date_edit_new (); @@ -365,9 +367,9 @@ e_calendar_table_init (ECalendarTable *cal_table) /* Classification field. */ cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); g_object_set (G_OBJECT (cell), - "strikeout_column", CAL_COMPONENT_FIELD_COMPLETE, - "bold_column", CAL_COMPONENT_FIELD_OVERDUE, - "color_column", CAL_COMPONENT_FIELD_COLOR, + "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE, + "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE, + "color_column", E_CAL_MODEL_FIELD_COLOR, "editable", FALSE, NULL); @@ -387,9 +389,9 @@ e_calendar_table_init (ECalendarTable *cal_table) /* Priority field. */ cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); g_object_set (G_OBJECT (cell), - "strikeout_column", CAL_COMPONENT_FIELD_COMPLETE, - "bold_column", CAL_COMPONENT_FIELD_OVERDUE, - "color_column", CAL_COMPONENT_FIELD_COLOR, + "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE, + "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE, + "color_column", E_CAL_MODEL_FIELD_COLOR, "editable", FALSE, NULL); @@ -410,9 +412,9 @@ e_calendar_table_init (ECalendarTable *cal_table) /* Percent field. */ cell = e_cell_percent_new (NULL, GTK_JUSTIFY_LEFT); g_object_set (G_OBJECT (cell), - "strikeout_column", CAL_COMPONENT_FIELD_COMPLETE, - "bold_column", CAL_COMPONENT_FIELD_OVERDUE, - "color_column", CAL_COMPONENT_FIELD_COLOR, + "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE, + "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE, + "color_column", E_CAL_MODEL_FIELD_COLOR, NULL); popup_cell = e_cell_combo_new (); @@ -439,9 +441,9 @@ e_calendar_table_init (ECalendarTable *cal_table) /* Transparency field. */ cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); g_object_set (G_OBJECT (cell), - "strikeout_column", CAL_COMPONENT_FIELD_COMPLETE, - "bold_column", CAL_COMPONENT_FIELD_OVERDUE, - "color_column", CAL_COMPONENT_FIELD_COLOR, + "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE, + "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE, + "color_column", E_CAL_MODEL_FIELD_COLOR, "editable", FALSE, NULL); @@ -460,9 +462,9 @@ e_calendar_table_init (ECalendarTable *cal_table) /* Status field. */ cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); g_object_set (G_OBJECT (cell), - "strikeout_column", CAL_COMPONENT_FIELD_COMPLETE, - "bold_column", CAL_COMPONENT_FIELD_OVERDUE, - "color_column", CAL_COMPONENT_FIELD_COLOR, + "strikeout_column", E_CAL_MODEL_TASKS_FIELD_COMPLETE, + "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE, + "color_column", E_CAL_MODEL_FIELD_COLOR, "editable", FALSE, NULL); @@ -515,7 +517,9 @@ e_calendar_table_init (ECalendarTable *cal_table) extras, EVOLUTION_ETSPECDIR "/e-calendar-table.etspec", NULL); - g_object_unref (extras); + /* FIXME: this causes a message from GLib about 'extras' having only a floating + reference */ + /* g_object_unref (extras); */ cal_table->etable = table; gtk_table_attach (GTK_TABLE (cal_table), table, 0, 1, 0, 1, @@ -571,7 +575,7 @@ e_calendar_table_new (void) * * Return value: A calendar model. **/ -CalendarModel * +ECalModel * e_calendar_table_get_model (ECalendarTable *cal_table) { g_return_val_if_fail (cal_table != NULL, NULL); @@ -656,7 +660,7 @@ get_selected_row_cb (int model_row, gpointer data) /* Returns the component that is selected in the table; only works if there is * one and only one selected row. */ -static CalComponent * +static ECalModelComponent * get_selected_comp (ECalendarTable *cal_table) { ETable *etable; @@ -672,12 +676,12 @@ get_selected_comp (ECalendarTable *cal_table) &row); g_assert (row != -1); - return calendar_model_get_component (cal_table->model, row); + return e_cal_model_get_component_at (cal_table->model, row); } struct get_selected_uids_closure { ECalendarTable *cal_table; - GSList *uids; + GSList *objects; }; /* Used from e_table_selected_row_foreach(), builds a list of the selected UIDs */ @@ -685,57 +689,51 @@ static void add_uid_cb (int model_row, gpointer data) { struct get_selected_uids_closure *closure; - CalComponent *comp; - const char *uid; + ECalModelComponent *comp_data; closure = data; - comp = calendar_model_get_component (closure->cal_table->model, model_row); - cal_component_get_uid (comp, &uid); + comp_data = e_cal_model_get_component_at (closure->cal_table->model, model_row); - closure->uids = g_slist_prepend (closure->uids, (char *) uid); + closure->objects = g_slist_prepend (closure->objects, comp_data); } static GSList * -get_selected_uids (ECalendarTable *cal_table) +get_selected_objects (ECalendarTable *cal_table) { struct get_selected_uids_closure closure; ETable *etable; closure.cal_table = cal_table; - closure.uids = NULL; + closure.objects = NULL; etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable)); e_table_selected_row_foreach (etable, add_uid_cb, &closure); - return closure.uids; + return closure.objects; } /* Deletes all of the selected components in the table */ static void delete_selected_components (ECalendarTable *cal_table) { - CalClient *client; - GSList *uids, *l; + GSList *objs, *l; - uids = get_selected_uids (cal_table); + objs = get_selected_objects (cal_table); - client = calendar_model_get_cal_client (cal_table->model); + e_calendar_table_set_status_message (cal_table, _("Deleting selected objects")); - calendar_model_set_status_message (e_calendar_table_get_model (cal_table), - _("Deleting selected objects")); - - for (l = uids; l; l = l->next) { - const char *uid; - - uid = l->data; + for (l = objs; l; l = l->next) { + ECalModelComponent *comp_data = (ECalModelComponent *) l->data; - delete_error_dialog (cal_client_remove_object (client, uid), CAL_COMPONENT_TODO); + delete_error_dialog (cal_client_remove_object (comp_data->client, + icalcomponent_get_uid (comp_data->icalcomp)), + CAL_COMPONENT_TODO); } - calendar_model_set_status_message (e_calendar_table_get_model (cal_table), NULL); + e_calendar_table_set_status_message (cal_table, NULL); - g_slist_free (uids); + g_slist_free (objs); } /** @@ -749,6 +747,7 @@ e_calendar_table_delete_selected (ECalendarTable *cal_table) { ETable *etable; int n_selected; + ECalModelComponent *comp_data; CalComponent *comp; g_return_if_fail (cal_table != NULL); @@ -761,15 +760,22 @@ e_calendar_table_delete_selected (ECalendarTable *cal_table) return; if (n_selected == 1) - comp = get_selected_comp (cal_table); + comp_data = get_selected_comp (cal_table); else - comp = NULL; + comp_data = NULL; /* FIXME: this may be something other than a TODO component */ + comp = cal_component_new (); + if (comp_data) + cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); + if (delete_component_dialog (comp, FALSE, n_selected, CAL_COMPONENT_TODO, GTK_WIDGET (cal_table))) delete_selected_components (cal_table); + + /* free memory */ + g_object_unref (comp); } /** @@ -792,7 +798,7 @@ static void copy_row_cb (int model_row, gpointer data) { ECalendarTable *cal_table; - CalComponent *comp; + ECalModelComponent *comp_data; gchar *comp_str; icalcomponent *child; @@ -800,23 +806,21 @@ copy_row_cb (int model_row, gpointer data) g_return_if_fail (cal_table->tmp_vcal != NULL); - comp = calendar_model_get_component (cal_table->model, model_row); - if (!comp) + comp_data = e_cal_model_get_component_at (cal_table->model, model_row); + if (!comp_data) return; /* add timezones to the VCALENDAR component */ - cal_util_add_timezones_from_component (cal_table->tmp_vcal, comp); + cal_util_add_timezones_from_component (cal_table->tmp_vcal, comp_data->icalcomp); /* add the new component to the VCALENDAR component */ - comp_str = cal_component_get_as_string (comp); + comp_str = icalcomponent_as_ical_string (comp_data->icalcomp); child = icalparser_parse_string (comp_str); if (child) { icalcomponent_add_component (cal_table->tmp_vcal, icalcomponent_new_clone (child)); icalcomponent_free (child); } - - g_free (comp_str); } /** @@ -871,17 +875,21 @@ e_calendar_table_paste_clipboard (ECalendarTable *cal_table) /* Opens a task in the task editor */ static void -open_task (ECalendarTable *cal_table, CalComponent *comp, gboolean assign) +open_task (ECalendarTable *cal_table, ECalModelComponent *comp_data, gboolean assign) { CompEditor *tedit; const char *uid; - cal_component_get_uid (comp, &uid); + uid = icalcomponent_get_uid (comp_data->icalcomp); tedit = e_comp_editor_registry_find (comp_editor_registry, uid); if (tedit == NULL) { - tedit = COMP_EDITOR (task_editor_new (calendar_model_get_cal_client (cal_table->model))); + CalComponent *comp; + + tedit = COMP_EDITOR (task_editor_new (comp_data->client)); + comp = cal_component_new (); + cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); comp_editor_edit_comp (tedit, comp); if (assign) task_editor_show_assignment (TASK_EDITOR (tedit)); @@ -896,10 +904,10 @@ open_task (ECalendarTable *cal_table, CalComponent *comp, gboolean assign) static void open_task_by_row (ECalendarTable *cal_table, int row) { - CalComponent *comp; + ECalModelComponent *comp_data; - comp = calendar_model_get_component (cal_table->model, row); - open_task (cal_table, comp, FALSE); + comp_data = e_cal_model_get_component_at (cal_table->model, row); + open_task (cal_table, comp_data, FALSE); } static void @@ -919,7 +927,7 @@ mark_row_complete_cb (int model_row, gpointer data) ECalendarTable *cal_table; cal_table = E_CALENDAR_TABLE (data); - calendar_model_mark_task_complete (cal_table->model, model_row); + e_cal_model_tasks_mark_task_complete (E_CAL_MODEL_TASKS (cal_table->model), model_row); } /* Callback used for the "mark tasks as complete" menu item */ @@ -940,20 +948,20 @@ static void open_url_cb (GtkWidget *menuitem, gpointer data) { ECalendarTable *cal_table; - CalComponent *comp; - const char *url; + ECalModelComponent *comp_data; + icalproperty *prop; cal_table = E_CALENDAR_TABLE (data); - comp = get_selected_comp (cal_table); - if (!comp) + comp_data = get_selected_comp (cal_table); + if (!comp_data) return; - cal_component_get_url (comp, &url); - if (!url) + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_URL_PROPERTY); + if (!prop) return; - gnome_url_show (url, NULL); + gnome_url_show (icalproperty_get_url (prop), NULL); } /* Callback for the "delete tasks" menu item */ @@ -1012,33 +1020,31 @@ e_calendar_table_show_popup_menu (ETable *table, int hide_mask = 0; int disable_mask = 0; GtkMenu *gtk_menu; + icalproperty *prop; + ECalModelComponent *comp_data; n_selected = e_table_selected_count (table); if (n_selected <= 0) return TRUE; - if (n_selected == 1) { - CalComponent *comp; - const char *url; + comp_data = get_selected_comp (cal_table); + g_assert (comp_data != NULL); + if (n_selected == 1) { hide_mask = MASK_MULTIPLE; /* See if the task has the URL property set */ - comp = get_selected_comp (cal_table); - g_assert (comp != NULL); - - cal_component_get_url (comp, &url); - if (!url) + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_URL_PROPERTY); + if (!prop) disable_mask |= MASK_LACKS_URL; } else hide_mask = MASK_SINGLE; - if (cal_client_is_read_only (calendar_model_get_cal_client (e_calendar_table_get_model (cal_table)))) + if (cal_client_is_read_only (comp_data->client)) disable_mask |= MASK_EDITABLE; - if (cal_client_get_static_capability (calendar_model_get_cal_client (e_calendar_table_get_model (cal_table)), - CAL_STATIC_CAPABILITY_NO_TASK_ASSIGNMENT)) + if (cal_client_get_static_capability (comp_data->client, CAL_STATIC_CAPABILITY_NO_TASK_ASSIGNMENT)) disable_mask |= MASK_ASSIGNABLE; gtk_menu = e_popup_menu_create (tasks_popup_menu, disable_mask, @@ -1074,37 +1080,35 @@ e_calendar_table_on_open_task (GtkWidget *menuitem, gpointer data) { ECalendarTable *cal_table; - CalComponent *comp; + ECalModelComponent *comp_data; cal_table = E_CALENDAR_TABLE (data); - comp = get_selected_comp (cal_table); - if (comp) - open_task (cal_table, comp, FALSE); + comp_data = get_selected_comp (cal_table); + if (comp_data) + open_task (cal_table, comp_data, FALSE); } static void e_calendar_table_on_save_as (GtkWidget *widget, gpointer data) { ECalendarTable *cal_table; - CalClient *client; - CalComponent *comp; + ECalModelComponent *comp_data; char *filename; char *ical_string; FILE *file; cal_table = E_CALENDAR_TABLE (data); - client = calendar_model_get_cal_client (cal_table->model); - comp = get_selected_comp (cal_table); - if (comp == NULL) + comp_data = get_selected_comp (cal_table); + if (comp_data == NULL) return; filename = e_file_dialog_save (_("Save as...")); if (filename == NULL) return; - ical_string = cal_client_get_component_as_string (client, comp); + ical_string = cal_client_get_component_as_string (comp_data->client, comp_data->icalcomp); if (ical_string == NULL) { g_warning ("Couldn't convert item to a string"); return; @@ -1125,17 +1129,20 @@ static void e_calendar_table_on_print_task (GtkWidget *widget, gpointer data) { ECalendarTable *cal_table; - CalClient *client; + ECalModelComponent *comp_data; CalComponent *comp; cal_table = E_CALENDAR_TABLE (data); - client = calendar_model_get_cal_client (cal_table->model); - comp = get_selected_comp (cal_table); - if (comp == NULL) + comp_data = get_selected_comp (cal_table); + if (comp_data == NULL) return; - print_comp (comp, client, FALSE); + comp = cal_component_new (); + cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); + print_comp (comp, comp_data->client, FALSE); + + g_object_unref (comp); } static void @@ -1169,29 +1176,33 @@ static void e_calendar_table_on_assign (GtkWidget *widget, gpointer data) { ECalendarTable *cal_table; - CalComponent *comp; + ECalModelComponent *comp_data; cal_table = E_CALENDAR_TABLE (data); - comp = get_selected_comp (cal_table); - if (comp) - open_task (cal_table, comp, TRUE); + comp_data = get_selected_comp (cal_table); + if (comp_data) + open_task (cal_table, comp_data, TRUE); } static void e_calendar_table_on_forward (GtkWidget *widget, gpointer data) { ECalendarTable *cal_table; - CalClient *client; - CalComponent *comp; + ECalModelComponent *comp_data; cal_table = E_CALENDAR_TABLE (data); - client = calendar_model_get_cal_client (cal_table->model); - comp = get_selected_comp (cal_table); - if (comp) - itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, comp, - client, NULL); + comp_data = get_selected_comp (cal_table); + if (comp_data) { + CalComponent *comp; + + comp = cal_component_new (); + cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); + itip_send_comp (CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL); + + g_object_unref (comp); + } } static gint @@ -1220,7 +1231,7 @@ e_calendar_table_load_state (ECalendarTable *cal_table, if (stat (filename, &st) == 0 && st.st_size > 0 && S_ISREG (st.st_mode)) { - e_table_load_state (e_table_scrolled_get_table(E_TABLE_SCROLLED (cal_table->etable)), filename); + e_table_load_state (e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable)), filename); } } @@ -1232,7 +1243,7 @@ e_calendar_table_save_state (ECalendarTable *cal_table, { g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table)); - e_table_save_state (e_table_scrolled_get_table(E_TABLE_SCROLLED (cal_table->etable)), + e_table_save_state (e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable)), filename); } @@ -1296,8 +1307,7 @@ selection_received (GtkWidget *invisible, return; } - calendar_model_set_status_message (e_calendar_table_get_model (cal_table), - _("Updating objects")); + e_calendar_table_set_status_message (cal_table, _("Updating objects")); if (kind == ICAL_VCALENDAR_COMPONENT) { icalcomponent_kind child_kind; @@ -1321,7 +1331,7 @@ selection_received (GtkWidget *invisible, cal_component_set_uid (tmp_comp, uid); cal_client_update_object ( - calendar_model_get_cal_client (cal_table->model), + e_cal_model_get_default_client (cal_table->model), tmp_comp); free (uid); g_object_unref (tmp_comp); @@ -1338,12 +1348,12 @@ selection_received (GtkWidget *invisible, free (uid); cal_client_update_object ( - calendar_model_get_cal_client (cal_table->model), + e_cal_model_get_default_client (cal_table->model), comp); g_object_unref (comp); } - calendar_model_set_status_message (e_calendar_table_get_model (cal_table), NULL); + e_calendar_table_set_status_message (cal_table, NULL); } @@ -1384,3 +1394,34 @@ static char *test[] = { }; #endif + +/* Displays messages on the status bar */ +#define EVOLUTION_TASKS_PROGRESS_IMAGE "evolution-tasks-mini.png" +static GdkPixbuf *progress_icon[2] = { NULL, NULL }; + +void +e_calendar_table_set_status_message (ECalendarTable *cal_table, const gchar *message) +{ + extern EvolutionShellClient *global_shell_client; /* ugly */ + + g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table)); + + if (!message || !*message) { + if (cal_table->activity) { + g_object_unref (cal_table->activity); + cal_table->activity = NULL; + } + } else if (!cal_table->activity) { + int display; + char *client_id = g_strdup_printf ("%p", cal_table); + + if (progress_icon[0] == NULL) + progress_icon[0] = gdk_pixbuf_new_from_file (EVOLUTION_IMAGESDIR "/" EVOLUTION_TASKS_PROGRESS_IMAGE, NULL); + cal_table->activity = evolution_activity_client_new ( + global_shell_client, client_id, + progress_icon, message, TRUE, &display); + + g_free (client_id); + } else + evolution_activity_client_update (cal_table->activity, message, -1.0); +} diff --git a/calendar/gui/e-calendar-table.etspec b/calendar/gui/e-calendar-table.etspec index 2e47b817d2..2021ab0037 100644 --- a/calendar/gui/e-calendar-table.etspec +++ b/calendar/gui/e-calendar-table.etspec @@ -1,26 +1,27 @@ <ETableSpecification click-to-add="true" _click-to-add-message="Click to add a task" draw-grid="true"> <ETableColumn model_col= "0" _title="Categories" expansion="1.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> <ETableColumn model_col= "1" _title="Classification" expansion="1.0" minimum_width="10" resizable="true" cell="classification" compare="string" priority="-1"/> - <ETableColumn model_col= "2" _title="Completion Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/> - <ETableColumn model_col= "3" _title="End Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2" disabled="true"/> - <ETableColumn model_col= "4" _title="Start Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/> - <ETableColumn model_col= "5" _title="Due Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/> - <ETableColumn model_col= "6" _title="Geographical Position" expansion="1.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> - <ETableColumn model_col= "7" _title="% Complete" expansion="1.0" minimum_width="10" resizable="true" cell="percent" compare="percent-compare" priority="-3"/> - <ETableColumn model_col= "8" _title="Priority" expansion="1.0" minimum_width="10" resizable="true" cell="priority" compare="priority-compare" priority="-3"/> - <ETableColumn model_col= "9" _title="Summary" expansion="3.0" minimum_width="10" resizable="true" cell="calstring" compare="string" priority="10"/> - <ETableColumn model_col="10" _title="Show Time As" expansion="1.0" minimum_width="10" resizable="true" cell="transparency" compare="string" priority="-1" disabled="true"/> - <ETableColumn model_col="11" _title="URL" expansion="2.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> - <ETableColumn model_col="12" _title="Alarms" expansion="1.0" minimum_width="10" resizable="true" cell="calstring" compare="string" disabled="true"/> - <ETableColumn model_col="13" pixbuf="icon" _title="Type" expansion="1.0" minimum_width="16" resizable="false" cell="icon" compare="integer" priority="-4"/> - <ETableColumn model_col="14" pixbuf="complete" _title="Complete" expansion="1.0" minimum_width="16" resizable="false" cell="checkbox" compare="integer" priority="-4"/> - <ETableColumn model_col="18" _title="Status" expansion="1.0" minimum_width="10" resizable="true" cell="calstatus" compare="string" priority="-1"/> + <ETableColumn model_col="2" _title="color" cell="calcolor" priority="-4"/> + <ETableColumn model_col="3" _title="component" cell="calcomp" priority="-4"/> + <ETableColumn model_col="4" _title="Description" expansion="2.0" minimum_width="10" resizable="true" cell="calstring" compare="string" priority="-1"/> + <ETableColumn model_col= "5" _title="Start Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/> + <ETableColumn model_col="6" _title="Alarms" expansion="1.0" minimum_width="10" resizable="true" cell="calstring" compare="string" disabled="true"/> + <ETableColumn model_col="7" pixbuf="icon" _title="Type" expansion="1.0" minimum_width="16" resizable="false" cell="icon" compare="integer" priority="-4"/> + <ETableColumn model_col= "8" _title="Summary" expansion="3.0" minimum_width="10" resizable="true" cell="calstring" compare="string" priority="10"/> + <ETableColumn model_col= "10" _title="Completion Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/> + <ETableColumn model_col="11" pixbuf="complete" _title="Complete" expansion="1.0" minimum_width="16" resizable="false" cell="checkbox" compare="integer" priority="-4"/> + <ETableColumn model_col= "12" _title="Due Date" expansion="2.0" minimum_width="10" resizable="true" cell="dateedit" compare="date-compare" priority="-2"/> + <ETableColumn model_col= "13" _title="Geographical Position" expansion="1.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> + <ETableColumn model_col= "15" _title="% Complete" expansion="1.0" minimum_width="10" resizable="true" cell="percent" compare="percent-compare" priority="-3"/> + <ETableColumn model_col= "16" _title="Priority" expansion="1.0" minimum_width="10" resizable="true" cell="priority" compare="priority-compare" priority="-3"/> + <ETableColumn model_col="17" _title="Status" expansion="1.0" minimum_width="10" resizable="true" cell="calstatus" compare="string" priority="-1"/> + <ETableColumn model_col="18" _title="URL" expansion="2.0" minimum_width="10" resizable="true" cell="calstring" compare="string"/> <ETableColumn model_col="19" _title="Task sort" cell="task-sort" compare="task-sort" priority="-4"/> <ETableState> - <column source="13"/> - <column source="14"/> - <column source= "9"/> + <column source="7"/> + <column source="11"/> + <column source= "8"/> <grouping></grouping> </ETableState> </ETableSpecification> diff --git a/calendar/gui/e-calendar-table.h b/calendar/gui/e-calendar-table.h index fab3afd85d..70dd031174 100644 --- a/calendar/gui/e-calendar-table.h +++ b/calendar/gui/e-calendar-table.h @@ -26,12 +26,11 @@ #include <gtk/gtktable.h> #include <gal/e-table/e-table-scrolled.h> +#include <shell/evolution-activity-client.h> #include <widgets/misc/e-cell-date-edit.h> -#include "calendar-model.h" +#include "e-cal-model.h" -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +G_BEGIN_DECLS /* * ECalendarTable - displays the iCalendar objects in a table (an ETable). @@ -48,12 +47,11 @@ typedef struct _ECalendarTable ECalendarTable; typedef struct _ECalendarTableClass ECalendarTableClass; -struct _ECalendarTable -{ +struct _ECalendarTable { GtkTable table; /* The model that we use */ - CalendarModel *model; + ECalModel *model; GtkWidget *etable; @@ -64,23 +62,25 @@ struct _ECalendarTable GtkWidget *invisible; gchar *clipboard_selection; icalcomponent *tmp_vcal; + + /* The activity client used to show messages on the status bar. */ + EvolutionActivityClient *activity; }; -struct _ECalendarTableClass -{ +struct _ECalendarTableClass { GtkTableClass parent_class; }; -GtkType e_calendar_table_get_type (void); -GtkWidget* e_calendar_table_new (void); +GtkType e_calendar_table_get_type (void); +GtkWidget* e_calendar_table_new (void); -CalendarModel *e_calendar_table_get_model (ECalendarTable *cal_table); +ECalModel *e_calendar_table_get_model (ECalendarTable *cal_table); -ETable *e_calendar_table_get_table (ECalendarTable *cal_table); +ETable *e_calendar_table_get_table (ECalendarTable *cal_table); -void e_calendar_table_complete_selected (ECalendarTable *cal_table); -void e_calendar_table_delete_selected (ECalendarTable *cal_table); +void e_calendar_table_complete_selected (ECalendarTable *cal_table); +void e_calendar_table_delete_selected (ECalendarTable *cal_table); /* Clipboard related functions */ void e_calendar_table_cut_clipboard (ECalendarTable *cal_table); @@ -94,9 +94,9 @@ void e_calendar_table_load_state (ECalendarTable *cal_table, void e_calendar_table_save_state (ECalendarTable *cal_table, gchar *filename); +void e_calendar_table_set_status_message (ECalendarTable *cal_table, + const gchar *message); -#ifdef __cplusplus -} -#endif /* __cplusplus */ +G_END_DECLS #endif /* _E_CALENDAR_TABLE_H_ */ diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c index 1895de2e61..24ff9ab570 100644 --- a/calendar/gui/e-calendar-view.c +++ b/calendar/gui/e-calendar-view.c @@ -587,7 +587,7 @@ e_cal_view_copy_clipboard (ECalView *cal_view) event = (ECalViewEvent *) l->data; if (event) - cal_util_add_timezones_from_component (vcal_comp, event->comp); + cal_util_add_timezones_from_component (vcal_comp, cal_component_get_icalcomponent (event->comp)); } for (l = selected; l != NULL; l = l->next) { @@ -846,7 +846,8 @@ on_save_as (GtkWidget *widget, gpointer user_data) return; event = (ECalViewEvent *) selected->data; - ical_string = cal_client_get_component_as_string (cal_view->priv->client, event->comp); + ical_string = cal_client_get_component_as_string (cal_view->priv->client, + cal_component_get_icalcomponent (event->comp)); if (ical_string == NULL) { g_warning ("Couldn't convert item to a string"); return; diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 1ef6f9c07b..ded89f91f4 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -6794,7 +6794,7 @@ e_day_view_on_drag_data_get (GtkWidget *widget, icalcomponent *vcal; vcal = cal_util_new_top_level (); - cal_util_add_timezones_from_component (vcal, event->comp); + cal_util_add_timezones_from_component (vcal, cal_component_get_icalcomponent (event->comp)); icalcomponent_add_component ( vcal, icalcomponent_new_clone (cal_component_get_icalcomponent (event->comp))); diff --git a/calendar/gui/e-tasks.c b/calendar/gui/e-tasks.c index d0a0873195..b441aee09d 100644 --- a/calendar/gui/e-tasks.c +++ b/calendar/gui/e-tasks.c @@ -360,7 +360,8 @@ table_cursor_change_cb (ETable *etable, int row, gpointer data) /* update the HTML widget */ if (n_selected == 1) { GtkHTMLStream *stream; - CalendarModel *model; + ECalModel *model; + ECalModelComponent *comp_data; CalComponent *comp; const char *uid; @@ -368,7 +369,9 @@ table_cursor_change_cb (ETable *etable, int row, gpointer data) stream = gtk_html_begin (GTK_HTML (priv->html)); - comp = calendar_model_get_component (model, e_table_get_cursor_row (etable)); + comp_data = e_cal_model_get_component_at (model, e_table_get_cursor_row (etable)); + comp = cal_component_new (); + cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); write_html (stream, comp); gtk_html_stream_close (stream, GTK_HTML_STREAM_OK); @@ -377,6 +380,8 @@ table_cursor_change_cb (ETable *etable, int row, gpointer data) if (priv->current_uid) g_free (priv->current_uid); priv->current_uid = g_strdup (uid); + + g_object_unref (comp); } else gtk_html_load_empty (GTK_HTML (priv->html)); } @@ -401,13 +406,13 @@ search_bar_sexp_changed_cb (CalSearchBar *cal_search, const char *sexp, gpointer { ETasks *tasks; ETasksPrivate *priv; - CalendarModel *model; + ECalModel *model; tasks = E_TASKS (data); priv = tasks->priv; model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); - calendar_model_set_query (model, sexp); + e_cal_model_set_query (model, sexp); } /* Callback used when the selected category in the search bar changes */ @@ -416,13 +421,13 @@ search_bar_category_changed_cb (CalSearchBar *cal_search, const char *category, { ETasks *tasks; ETasksPrivate *priv; - CalendarModel *model; + ECalModel *model; tasks = E_TASKS (data); priv = tasks->priv; model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); - calendar_model_set_default_category (model, category); + e_cal_model_set_default_category (model, category); } /* Callback used when the user selects a URL in the HTML widget */ @@ -472,7 +477,6 @@ setup_widgets (ETasks *tasks) { ETasksPrivate *priv; ETable *etable; - CalendarModel *model; GtkWidget *paned, *scroll; priv = tasks->priv; @@ -498,8 +502,6 @@ setup_widgets (ETasks *tasks) /* create the task list */ priv->tasks_view = e_calendar_table_new (); - model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); - calendar_model_set_new_comp_vtype (model, CAL_COMPONENT_TODO); etable = e_table_scrolled_get_table ( E_TABLE_SCROLLED (E_CALENDAR_TABLE (priv->tasks_view)->etable)); @@ -570,7 +572,7 @@ GtkWidget * e_tasks_construct (ETasks *tasks) { ETasksPrivate *priv; - CalendarModel *model; + ECalModel *model; g_return_val_if_fail (tasks != NULL, NULL); g_return_val_if_fail (E_IS_TASKS (tasks), NULL); @@ -595,7 +597,7 @@ e_tasks_construct (ETasks *tasks) model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); g_assert (model != NULL); - calendar_model_set_cal_client (model, priv->client, CALOBJ_TYPE_TODO); + e_cal_model_add_client (model, priv->client); return GTK_WIDGET (tasks); } @@ -668,12 +670,10 @@ static void set_status_message (ETasks *tasks, const char *message) { ETasksPrivate *priv; - CalendarModel *model; priv = tasks->priv; - model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); - calendar_model_set_status_message (model, message); + e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->tasks_view), message); } gboolean diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index 4dab508ffc..d127f46079 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -653,7 +653,7 @@ void gnome_calendar_set_query (GnomeCalendar *gcal, const char *sexp) { GnomeCalendarPrivate *priv; - CalendarModel *model; + ECalModel *model; g_return_if_fail (gcal != NULL); g_return_if_fail (GNOME_IS_CALENDAR (gcal)); @@ -676,7 +676,7 @@ gnome_calendar_set_query (GnomeCalendar *gcal, const char *sexp) /* Set the query on the task pad */ model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)); - calendar_model_set_query (model, sexp); + e_cal_model_set_query (model, sexp); } /* Returns the current time, for the ECalendarItem. */ @@ -715,7 +715,7 @@ search_bar_category_changed_cb (CalSearchBar *cal_search, const char *category, { GnomeCalendar *gcal; GnomeCalendarPrivate *priv; - CalendarModel *model; + ECalModel *model; gcal = GNOME_CALENDAR (data); priv = gcal->priv; @@ -726,7 +726,7 @@ search_bar_category_changed_cb (CalSearchBar *cal_search, const char *category, e_week_view_set_default_category (E_WEEK_VIEW (priv->month_view), category); model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)); - calendar_model_set_default_category (model, category); + e_cal_model_set_default_category (model, category); } static void @@ -812,7 +812,6 @@ setup_widgets (GnomeCalendar *gcal) GnomeCalendarPrivate *priv; GtkWidget *w; gchar *filename; - CalendarModel *model; ETable *etable; priv = gcal->priv; @@ -872,8 +871,6 @@ setup_widgets (GnomeCalendar *gcal) /* The ToDo list. */ priv->todo = e_calendar_table_new (); calendar_config_configure_e_calendar_table (E_CALENDAR_TABLE (priv->todo)); - model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)); - calendar_model_set_new_comp_vtype (model, CAL_COMPONENT_TODO); gtk_paned_pack2 (GTK_PANED (priv->vpane), priv->todo, TRUE, TRUE); gtk_widget_show (priv->todo); @@ -1696,8 +1693,7 @@ client_cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer da e_cal_view_set_status_message (E_CAL_VIEW (priv->week_view), msg); } else if (client == priv->task_pad_client) { - calendar_model_set_status_message ( - e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), msg); + e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), msg); } g_free (msg); @@ -1730,8 +1726,7 @@ client_cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer da e_cal_view_set_status_message (E_CAL_VIEW (priv->week_view), NULL); } else if (client == priv->task_pad_client) { - calendar_model_set_status_message ( - e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), NULL); + e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL); } } @@ -1895,8 +1890,7 @@ backend_died_cb (CalClient *client, gpointer data) "You will have to restart Evolution in order " "to use it again"), uristr); - calendar_model_set_status_message ( - e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), NULL); + e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL); } else { message = NULL; g_assert_not_reached (); @@ -1912,7 +1906,7 @@ gnome_calendar_construct (GnomeCalendar *gcal) { GnomeCalendarPrivate *priv; GnomeCalendarViewType view_type; - CalendarModel *model; + ECalModel *model; g_return_val_if_fail (gcal != NULL, NULL); g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), NULL); @@ -1959,7 +1953,7 @@ gnome_calendar_construct (GnomeCalendar *gcal) model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)); g_assert (model != NULL); - calendar_model_set_cal_client (model, priv->task_pad_client, CALOBJ_TYPE_TODO); + e_cal_model_add_client (model, priv->task_pad_client); /* Get the default view to show. */ view_type = calendar_config_get_default_view (); @@ -2137,8 +2131,7 @@ gnome_calendar_open (GnomeCalendar *gcal, const char *str_uri) if (!uri) { tasks_uri = g_strdup_printf ("%s/local/Tasks/tasks.ics", evolution_dir); message = g_strdup_printf (_("Opening tasks at %s"), tasks_uri); - calendar_model_set_status_message ( - e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), message); + e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), message); g_free (message); success = cal_client_open_calendar (priv->task_pad_client, tasks_uri, FALSE); @@ -2148,17 +2141,15 @@ gnome_calendar_open (GnomeCalendar *gcal, const char *str_uri) if (!g_strncasecmp (uri->protocol, "file", 4)) { tasks_uri = g_strdup_printf ("%s/local/Tasks/tasks.ics", evolution_dir); message = g_strdup_printf (_("Opening tasks at %s"), tasks_uri); - calendar_model_set_status_message ( - e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), message); + e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), message); g_free (message); success = cal_client_open_calendar (priv->task_pad_client, tasks_uri, FALSE); g_free (tasks_uri); } else { - calendar_model_set_status_message ( - e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), - _("Opening default tasks folder")); + e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), + _("Opening default tasks folder")); success = cal_client_open_default_tasks (priv->task_pad_client, FALSE); } } @@ -2168,8 +2159,7 @@ gnome_calendar_open (GnomeCalendar *gcal, const char *str_uri) if (!success) { g_message ("gnome_calendar_open(): Could not issue the request to open the tasks folder"); - calendar_model_set_status_message ( - e_calendar_table_get_model (E_CALENDAR_TABLE (priv->todo)), NULL); + e_calendar_table_set_status_message (E_CALENDAR_TABLE (priv->todo), NULL); return FALSE; } diff --git a/calendar/gui/print.c b/calendar/gui/print.c index aaf12f548a..f338bc2e36 100644 --- a/calendar/gui/print.c +++ b/calendar/gui/print.c @@ -1771,7 +1771,7 @@ print_todo_details (GnomePrintContext *pc, GnomeCalendar *gcal, struct icaltimetype *tt; ECalendarTable *task_pad; ETable *table; - CalendarModel *model; + ECalModel *model; gint rows, row; /* We get the tasks directly from the TaskPad ETable. This means we @@ -1794,17 +1794,24 @@ print_todo_details (GnomePrintContext *pc, GnomeCalendar *gcal, rows = e_table_model_row_count (E_TABLE_MODEL (model)); for (row = 0; row < rows; row++) { + ECalModelComponent *comp_data; CalComponent *comp; CalComponentText summary; int model_row; model_row = e_table_view_to_model_row (table, row); - comp = calendar_model_get_component (model, model_row); + comp_data = e_cal_model_get_component_at (model, model_row); + if (!comp_data) + continue; - cal_component_get_summary (comp, &summary); + comp = cal_component_new (); + cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); - if (!summary.value) + cal_component_get_summary (comp_data->icalcomp, &summary); + if (!summary.value) { + g_object_unref (comp); continue; + } x = left; xend = right - 2; @@ -1835,6 +1842,8 @@ print_todo_details (GnomePrintContext *pc, GnomeCalendar *gcal, gnome_print_lineto (pc, xend, y); gnome_print_stroke (pc); y -= 3; + + g_object_unref (comp); } g_object_unref (font_summary); diff --git a/libical/ChangeLog b/libical/ChangeLog index a08e9535a8..912cc73a1b 100644 --- a/libical/ChangeLog +++ b/libical/ChangeLog @@ -1,3 +1,8 @@ +2003-08-07 Rodrigo Moya <rodrigo@ximian.com> + + * src/libical/icalcomponent.c (icalcomponent_get_uid): added missing + implementation. + 2003-05-14 Rodrigo Moya <rodrigo@ximian.com> Fixes #41579 diff --git a/libical/src/libical/icalcomponent.c b/libical/src/libical/icalcomponent.c index ce819ddbd6..c771dc3cf9 100644 --- a/libical/src/libical/icalcomponent.c +++ b/libical/src/libical/icalcomponent.c @@ -1459,7 +1459,18 @@ void icalcomponent_set_comment(icalcomponent* comp, const char* v); const char* icalcomponent_get_comment(icalcomponent* comp); void icalcomponent_set_uid(icalcomponent* comp, const char* v); -const char* icalcomponent_get_uid(icalcomponent* comp); + +const char* icalcomponent_get_uid(icalcomponent* comp) +{ + icalcomponent *inner = icalcomponent_get_inner (comp); + icalproperty *prop = icalcomponent_get_first_property (inner, ICAL_UID_PROPERTY); + + if (prop == 0) { + return 0; + } + + return icalproperty_get_uid (prop); +} void icalcomponent_set_recurrenceid(icalcomponent* comp, struct icaltimetype v); |