From c6ccd45a0ef07b12a0313deb3abee032d89eec0a Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 18 Jun 2013 09:25:40 -0400 Subject: ETable-related cleanups. --- calendar/gui/e-cal-model-calendar.c | 227 ++- calendar/gui/e-cal-model-memos.c | 144 +- calendar/gui/e-cal-model-tasks.c | 722 +++++---- calendar/gui/e-cal-model.c | 2822 +++++++++++++++++------------------ 4 files changed, 1929 insertions(+), 1986 deletions(-) (limited to 'calendar/gui') diff --git a/calendar/gui/e-cal-model-calendar.c b/calendar/gui/e-cal-model-calendar.c index 5759d3acb1..114ffd4a7e 100644 --- a/calendar/gui/e-cal-model-calendar.c +++ b/calendar/gui/e-cal-model-calendar.c @@ -35,52 +35,10 @@ #include "dialogs/recur-comp.h" #include "dialogs/send-comp.h" -static gint ecmc_column_count (ETableModel *etm); -static gpointer ecmc_value_at (ETableModel *etm, gint col, gint row); -static void ecmc_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value); -static gboolean ecmc_is_cell_editable (ETableModel *etm, gint col, gint row); -static gpointer ecmc_duplicate_value (ETableModel *etm, gint col, gconstpointer value); -static void ecmc_free_value (ETableModel *etm, gint col, gpointer value); -static gpointer ecmc_initialize_value (ETableModel *etm, gint col); -static gboolean ecmc_value_is_empty (ETableModel *etm, gint col, gconstpointer value); -static gchar *ecmc_value_to_string (ETableModel *etm, gint col, gconstpointer value); - -static void ecmc_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data, - ETableModel *source_model, gint row); - -G_DEFINE_TYPE (ECalModelCalendar, e_cal_model_calendar, E_TYPE_CAL_MODEL) - -static void -e_cal_model_calendar_class_init (ECalModelCalendarClass *class) -{ - ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (class); - ECalModelClass *model_class = E_CAL_MODEL_CLASS (class); - - etm_class->column_count = ecmc_column_count; - etm_class->value_at = ecmc_value_at; - etm_class->set_value_at = ecmc_set_value_at; - etm_class->is_cell_editable = ecmc_is_cell_editable; - etm_class->duplicate_value = ecmc_duplicate_value; - etm_class->free_value = ecmc_free_value; - etm_class->initialize_value = ecmc_initialize_value; - etm_class->value_is_empty = ecmc_value_is_empty; - etm_class->value_to_string = ecmc_value_to_string; - - model_class->fill_component_from_model = ecmc_fill_component_from_model; -} - -static void -e_cal_model_calendar_init (ECalModelCalendar *model) -{ - e_cal_model_set_component_kind (E_CAL_MODEL (model), ICAL_VEVENT_COMPONENT); -} - -/* ETableModel methods */ -static gint -ecmc_column_count (ETableModel *etm) -{ - return E_CAL_MODEL_CALENDAR_FIELD_LAST; -} +G_DEFINE_TYPE ( + ECalModelCalendar, + e_cal_model_calendar, + E_TYPE_CAL_MODEL) static ECellDateEditValue * get_dtend (ECalModelCalendar *model, @@ -164,38 +122,6 @@ get_transparency (ECalModelComponent *comp_data) return NULL; } -static gpointer -ecmc_value_at (ETableModel *etm, - gint col, - gint row) -{ - ECalModelComponent *comp_data; - ECalModelCalendar *model = (ECalModelCalendar *) etm; - - g_return_val_if_fail (E_IS_CAL_MODEL_CALENDAR (model), NULL); - - g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL); - g_return_val_if_fail (row >= 0 && row < e_table_model_row_count (etm), NULL); - - if (col < E_CAL_MODEL_FIELD_LAST) - return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->value_at (etm, col, row); - - comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row); - if (!comp_data) - return (gpointer) ""; - - switch (col) { - case E_CAL_MODEL_CALENDAR_FIELD_DTEND : - return get_dtend (model, comp_data); - case E_CAL_MODEL_CALENDAR_FIELD_LOCATION : - return get_location (comp_data); - case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY : - return get_transparency (comp_data); - } - - return (gpointer) ""; -} - static void set_dtend (ECalModel *model, ECalModelComponent *comp_data, @@ -266,10 +192,69 @@ set_transparency (ECalModelComponent *comp_data, } static void -ecmc_set_value_at (ETableModel *etm, - gint col, - gint row, - gconstpointer value) +cal_model_calendar_fill_component_from_model (ECalModel *model, + ECalModelComponent *comp_data, + ETableModel *source_model, + gint row) +{ + g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model)); + g_return_if_fail (comp_data != NULL); + g_return_if_fail (E_IS_TABLE_MODEL (source_model)); + + set_dtend ( + model, comp_data, + e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_DTEND, row)); + set_location ( + comp_data, + e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_LOCATION, row)); + set_transparency ( + comp_data, + e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY, row)); +} + +static gint +cal_model_calendar_column_count (ETableModel *etm) +{ + return E_CAL_MODEL_CALENDAR_FIELD_LAST; +} + +static gpointer +cal_model_calendar_value_at (ETableModel *etm, + gint col, + gint row) +{ + ECalModelComponent *comp_data; + ECalModelCalendar *model = (ECalModelCalendar *) etm; + + g_return_val_if_fail (E_IS_CAL_MODEL_CALENDAR (model), NULL); + + g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL); + g_return_val_if_fail (row >= 0 && row < e_table_model_row_count (etm), NULL); + + if (col < E_CAL_MODEL_FIELD_LAST) + return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->value_at (etm, col, row); + + comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row); + if (!comp_data) + return (gpointer) ""; + + switch (col) { + case E_CAL_MODEL_CALENDAR_FIELD_DTEND : + return get_dtend (model, comp_data); + case E_CAL_MODEL_CALENDAR_FIELD_LOCATION : + return get_location (comp_data); + case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY : + return get_transparency (comp_data); + } + + return (gpointer) ""; +} + +static void +cal_model_calendar_set_value_at (ETableModel *etm, + gint col, + gint row, + gconstpointer value) { ECalModelComponent *comp_data; CalObjModType mod = CALOBJ_MOD_ALL; @@ -366,9 +351,9 @@ ecmc_set_value_at (ETableModel *etm, } static gboolean -ecmc_is_cell_editable (ETableModel *etm, - gint col, - gint row) +cal_model_calendar_is_cell_editable (ETableModel *etm, + gint col, + gint row) { ECalModelCalendar *model = (ECalModelCalendar *) etm; @@ -393,9 +378,9 @@ ecmc_is_cell_editable (ETableModel *etm, } static gpointer -ecmc_duplicate_value (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_calendar_duplicate_value (ETableModel *etm, + gint col, + gconstpointer value) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL); @@ -423,9 +408,9 @@ ecmc_duplicate_value (ETableModel *etm, } static void -ecmc_free_value (ETableModel *etm, - gint col, - gpointer value) +cal_model_calendar_free_value (ETableModel *etm, + gint col, + gpointer value) { g_return_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST); @@ -445,8 +430,8 @@ ecmc_free_value (ETableModel *etm, } static gpointer -ecmc_initialize_value (ETableModel *etm, - gint col) +cal_model_calendar_initialize_value (ETableModel *etm, + gint col) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL); @@ -465,9 +450,9 @@ ecmc_initialize_value (ETableModel *etm, } static gboolean -ecmc_value_is_empty (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_calendar_value_is_empty (ETableModel *etm, + gint col, + gconstpointer value) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, TRUE); @@ -486,9 +471,9 @@ ecmc_value_is_empty (ETableModel *etm, } static gchar * -ecmc_value_to_string (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_calendar_value_to_string (ETableModel *etm, + gint col, + gconstpointer value) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, g_strdup ("")); @@ -506,32 +491,34 @@ ecmc_value_to_string (ETableModel *etm, return g_strdup (""); } -/* ECalModel class methods */ - static void -ecmc_fill_component_from_model (ECalModel *model, - ECalModelComponent *comp_data, - ETableModel *source_model, - gint row) +e_cal_model_calendar_class_init (ECalModelCalendarClass *class) { - g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model)); - g_return_if_fail (comp_data != NULL); - g_return_if_fail (E_IS_TABLE_MODEL (source_model)); + ECalModelClass *model_class; + ETableModelClass *etm_class; + + model_class = E_CAL_MODEL_CLASS (class); + model_class->fill_component_from_model = cal_model_calendar_fill_component_from_model; + + etm_class = E_TABLE_MODEL_CLASS (class); + etm_class->column_count = cal_model_calendar_column_count; + etm_class->value_at = cal_model_calendar_value_at; + etm_class->set_value_at = cal_model_calendar_set_value_at; + etm_class->is_cell_editable = cal_model_calendar_is_cell_editable; + etm_class->duplicate_value = cal_model_calendar_duplicate_value; + etm_class->free_value = cal_model_calendar_free_value; + etm_class->initialize_value = cal_model_calendar_initialize_value; + etm_class->value_is_empty = cal_model_calendar_value_is_empty; + etm_class->value_to_string = cal_model_calendar_value_to_string; +} - set_dtend ( - model, comp_data, - e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_DTEND, row)); - set_location ( - comp_data, - e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_LOCATION, row)); - set_transparency ( - comp_data, - e_table_model_value_at (source_model, E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY, row)); +static void +e_cal_model_calendar_init (ECalModelCalendar *model) +{ + e_cal_model_set_component_kind ( + E_CAL_MODEL (model), ICAL_VEVENT_COMPONENT); } -/** - * e_cal_model_calendar_new - */ ECalModel * e_cal_model_calendar_new (ESourceRegistry *registry) { diff --git a/calendar/gui/e-cal-model-memos.c b/calendar/gui/e-cal-model-memos.c index a6d3f1d612..dc3440e54d 100644 --- a/calendar/gui/e-cal-model-memos.c +++ b/calendar/gui/e-cal-model-memos.c @@ -35,57 +35,39 @@ #define d(x) (x) -static gint ecmm_column_count (ETableModel *etm); -static gpointer ecmm_value_at (ETableModel *etm, gint col, gint row); -static void ecmm_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value); -static gboolean ecmm_is_cell_editable (ETableModel *etm, gint col, gint row); -static gpointer ecmm_duplicate_value (ETableModel *etm, gint col, gconstpointer value); -static void ecmm_free_value (ETableModel *etm, gint col, gpointer value); -static gpointer ecmm_initialize_value (ETableModel *etm, gint col); -static gboolean ecmm_value_is_empty (ETableModel *etm, gint col, gconstpointer value); -static gchar *ecmm_value_to_string (ETableModel *etm, gint col, gconstpointer value); - -static void ecmm_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data, - ETableModel *source_model, gint row); - -G_DEFINE_TYPE (ECalModelMemos, e_cal_model_memos, E_TYPE_CAL_MODEL) +G_DEFINE_TYPE ( + ECalModelMemos, + e_cal_model_memos, + E_TYPE_CAL_MODEL) static void -e_cal_model_memos_class_init (ECalModelMemosClass *class) +cal_model_memos_fill_component_from_model (ECalModel *model, + ECalModelComponent *comp_data, + ETableModel *source_model, + gint row) { - ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (class); - ECalModelClass *model_class = E_CAL_MODEL_CLASS (class); - - etm_class->column_count = ecmm_column_count; - etm_class->value_at = ecmm_value_at; - etm_class->set_value_at = ecmm_set_value_at; - etm_class->is_cell_editable = ecmm_is_cell_editable; - etm_class->duplicate_value = ecmm_duplicate_value; - etm_class->free_value = ecmm_free_value; - etm_class->initialize_value = ecmm_initialize_value; - etm_class->value_is_empty = ecmm_value_is_empty; - etm_class->value_to_string = ecmm_value_to_string; - - model_class->fill_component_from_model = ecmm_fill_component_from_model; -} + icaltimetype start; + g_return_if_fail (E_IS_CAL_MODEL_MEMOS (model)); + g_return_if_fail (comp_data != NULL); + g_return_if_fail (E_IS_TABLE_MODEL (source_model)); -static void -e_cal_model_memos_init (ECalModelMemos *model) -{ - e_cal_model_set_component_kind (E_CAL_MODEL (model), ICAL_VJOURNAL_COMPONENT); + start = icalcomponent_get_dtstart (comp_data->icalcomp); + if (icaltime_compare_date_only (start, icaltime_null_time ()) == 0) { + start = icaltime_today (); + icalcomponent_set_dtstart (comp_data->icalcomp, start); + } } -/* ETableModel methods */ static gint -ecmm_column_count (ETableModel *etm) +cal_model_memos_column_count (ETableModel *etm) { return E_CAL_MODEL_MEMOS_FIELD_LAST; } static gpointer -ecmm_value_at (ETableModel *etm, - gint col, - gint row) +cal_model_memos_value_at (ETableModel *etm, + gint col, + gint row) { ECalModelComponent *comp_data; ECalModelMemos *model = (ECalModelMemos *) etm; @@ -106,10 +88,10 @@ ecmm_value_at (ETableModel *etm, } static void -ecmm_set_value_at (ETableModel *etm, - gint col, - gint row, - gconstpointer value) +cal_model_memos_set_value_at (ETableModel *etm, + gint col, + gint row, + gconstpointer value) { ECalModelComponent *comp_data; ECalModelMemos *model = (ECalModelMemos *) etm; @@ -146,9 +128,9 @@ ecmm_set_value_at (ETableModel *etm, } static gboolean -ecmm_is_cell_editable (ETableModel *etm, - gint col, - gint row) +cal_model_memos_is_cell_editable (ETableModel *etm, + gint col, + gint row) { ECalModelMemos *model = (ECalModelMemos *) etm; gboolean retval = FALSE; @@ -167,9 +149,9 @@ ecmm_is_cell_editable (ETableModel *etm, } static gpointer -ecmm_duplicate_value (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_memos_duplicate_value (ETableModel *etm, + gint col, + gconstpointer value) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, NULL); @@ -180,9 +162,9 @@ ecmm_duplicate_value (ETableModel *etm, } static void -ecmm_free_value (ETableModel *etm, - gint col, - gpointer value) +cal_model_memos_free_value (ETableModel *etm, + gint col, + gpointer value) { g_return_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST); @@ -193,8 +175,8 @@ ecmm_free_value (ETableModel *etm, } static gpointer -ecmm_initialize_value (ETableModel *etm, - gint col) +cal_model_memos_initialize_value (ETableModel *etm, + gint col) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, NULL); @@ -205,9 +187,9 @@ ecmm_initialize_value (ETableModel *etm, } static gboolean -ecmm_value_is_empty (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_memos_value_is_empty (ETableModel *etm, + gint col, + gconstpointer value) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, TRUE); @@ -218,9 +200,9 @@ ecmm_value_is_empty (ETableModel *etm, } static gchar * -ecmm_value_to_string (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_memos_value_to_string (ETableModel *etm, + gint col, + gconstpointer value) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, g_strdup ("")); @@ -230,30 +212,34 @@ ecmm_value_to_string (ETableModel *etm, return g_strdup (""); } -/* ECalModel class methods */ - static void -ecmm_fill_component_from_model (ECalModel *model, - ECalModelComponent *comp_data, - ETableModel *source_model, - gint row) +e_cal_model_memos_class_init (ECalModelMemosClass *class) { - icaltimetype start; - g_return_if_fail (E_IS_CAL_MODEL_MEMOS (model)); - g_return_if_fail (comp_data != NULL); - g_return_if_fail (E_IS_TABLE_MODEL (source_model)); - - start = icalcomponent_get_dtstart (comp_data->icalcomp); - if (icaltime_compare_date_only (start, icaltime_null_time ()) == 0) { - start = icaltime_today (); - icalcomponent_set_dtstart (comp_data->icalcomp, start); - } + ECalModelClass *model_class; + ETableModelClass *etm_class; + + model_class = E_CAL_MODEL_CLASS (class); + model_class->fill_component_from_model = cal_model_memos_fill_component_from_model; + + etm_class = E_TABLE_MODEL_CLASS (class); + etm_class->column_count = cal_model_memos_column_count; + etm_class->value_at = cal_model_memos_value_at; + etm_class->set_value_at = cal_model_memos_set_value_at; + etm_class->is_cell_editable = cal_model_memos_is_cell_editable; + etm_class->duplicate_value = cal_model_memos_duplicate_value; + etm_class->free_value = cal_model_memos_free_value; + etm_class->initialize_value = cal_model_memos_initialize_value; + etm_class->value_is_empty = cal_model_memos_value_is_empty; + etm_class->value_to_string = cal_model_memos_value_to_string; +} +static void +e_cal_model_memos_init (ECalModelMemos *model) +{ + e_cal_model_set_component_kind ( + E_CAL_MODEL (model), ICAL_VJOURNAL_COMPONENT); } -/** - * e_cal_model_memos_new - */ ECalModel * e_cal_model_memos_new (ESourceRegistry *registry) { diff --git a/calendar/gui/e-cal-model-tasks.c b/calendar/gui/e-cal-model-tasks.c index 81c3cb3a45..a3e6cb8107 100644 --- a/calendar/gui/e-cal-model-tasks.c +++ b/calendar/gui/e-cal-model-tasks.c @@ -47,23 +47,6 @@ struct _ECalModelTasksPrivate { gchar *color_overdue; }; -static gint ecmt_column_count (ETableModel *etm); -static gpointer ecmt_value_at (ETableModel *etm, gint col, gint row); -static void ecmt_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value); -static gboolean ecmt_is_cell_editable (ETableModel *etm, gint col, gint row); -static gpointer ecmt_duplicate_value (ETableModel *etm, gint col, gconstpointer value); -static void ecmt_free_value (ETableModel *etm, gint col, gpointer value); -static gpointer ecmt_initialize_value (ETableModel *etm, gint col); -static gboolean ecmt_value_is_empty (ETableModel *etm, gint col, gconstpointer value); -static gchar *ecmt_value_to_string (ETableModel *etm, gint col, gconstpointer value); - -static const gchar *ecmt_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data); -static void ecmt_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data, - ETableModel *source_model, gint row); -static void commit_component_changes (ECalModelComponent *comp_data); - -G_DEFINE_TYPE (ECalModelTasks, e_cal_model_tasks, E_TYPE_CAL_MODEL) - enum { PROP_0, PROP_HIGHLIGHT_DUE_TODAY, @@ -72,182 +55,10 @@ enum { PROP_COLOR_OVERDUE }; -static void -cal_model_tasks_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (property_id) { - case PROP_HIGHLIGHT_DUE_TODAY: - e_cal_model_tasks_set_highlight_due_today ( - E_CAL_MODEL_TASKS (object), - g_value_get_boolean (value)); - return; - - case PROP_COLOR_DUE_TODAY: - e_cal_model_tasks_set_color_due_today ( - E_CAL_MODEL_TASKS (object), - g_value_get_string (value)); - return; - - case PROP_HIGHLIGHT_OVERDUE: - e_cal_model_tasks_set_highlight_overdue ( - E_CAL_MODEL_TASKS (object), - g_value_get_boolean (value)); - return; - - case PROP_COLOR_OVERDUE: - e_cal_model_tasks_set_color_overdue ( - E_CAL_MODEL_TASKS (object), - g_value_get_string (value)); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -cal_model_tasks_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - switch (property_id) { - case PROP_HIGHLIGHT_DUE_TODAY: - g_value_set_boolean ( - value, - e_cal_model_tasks_get_highlight_due_today ( - E_CAL_MODEL_TASKS (object))); - return; - - case PROP_COLOR_DUE_TODAY: - g_value_set_string ( - value, - e_cal_model_tasks_get_color_due_today ( - E_CAL_MODEL_TASKS (object))); - return; - - case PROP_HIGHLIGHT_OVERDUE: - g_value_set_boolean ( - value, - e_cal_model_tasks_get_highlight_overdue ( - E_CAL_MODEL_TASKS (object))); - return; - - case PROP_COLOR_OVERDUE: - g_value_set_string ( - value, - e_cal_model_tasks_get_color_overdue ( - E_CAL_MODEL_TASKS (object))); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -cal_model_tasks_finalize (GObject *object) -{ - ECalModelTasksPrivate *priv; - - priv = E_CAL_MODEL_TASKS_GET_PRIVATE (object); - - g_free (priv->color_due_today); - g_free (priv->color_overdue); - - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (e_cal_model_tasks_parent_class)->finalize (object); -} - -static void -e_cal_model_tasks_class_init (ECalModelTasksClass *class) -{ - GObjectClass *object_class; - ETableModelClass *table_model_class; - ECalModelClass *cal_model_class; - - g_type_class_add_private (class, sizeof (ECalModelTasksPrivate)); - - object_class = G_OBJECT_CLASS (class); - object_class->set_property = cal_model_tasks_set_property; - object_class->get_property = cal_model_tasks_get_property; - object_class->finalize = cal_model_tasks_finalize; - - table_model_class = E_TABLE_MODEL_CLASS (class); - table_model_class->column_count = ecmt_column_count; - table_model_class->value_at = ecmt_value_at; - table_model_class->set_value_at = ecmt_set_value_at; - table_model_class->is_cell_editable = ecmt_is_cell_editable; - table_model_class->duplicate_value = ecmt_duplicate_value; - table_model_class->free_value = ecmt_free_value; - table_model_class->initialize_value = ecmt_initialize_value; - table_model_class->value_is_empty = ecmt_value_is_empty; - table_model_class->value_to_string = ecmt_value_to_string; - - cal_model_class = E_CAL_MODEL_CLASS (class); - cal_model_class->get_color_for_component = ecmt_get_color_for_component; - cal_model_class->fill_component_from_model = ecmt_fill_component_from_model; - - g_object_class_install_property ( - object_class, - PROP_HIGHLIGHT_DUE_TODAY, - g_param_spec_boolean ( - "highlight-due-today", - "Highlight Due Today", - NULL, - TRUE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_COLOR_DUE_TODAY, - g_param_spec_string ( - "color-due-today", - "Color Due Today", - NULL, - "#1e90ff", - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_HIGHLIGHT_OVERDUE, - g_param_spec_boolean ( - "highlight-overdue", - "Highlight Overdue", - NULL, - TRUE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_COLOR_OVERDUE, - g_param_spec_string ( - "color-overdue", - "Color Overdue", - NULL, - "#ff0000", - G_PARAM_READWRITE)); -} - -static void -e_cal_model_tasks_init (ECalModelTasks *model) -{ - model->priv = E_CAL_MODEL_TASKS_GET_PRIVATE (model); - - model->priv->highlight_due_today = TRUE; - model->priv->highlight_overdue = TRUE; - - e_cal_model_set_component_kind ( - E_CAL_MODEL (model), ICAL_VTODO_COMPONENT); -} - -/* ETableModel methods */ -static gint -ecmt_column_count (ETableModel *etm) -{ - return E_CAL_MODEL_TASKS_FIELD_LAST; -} +G_DEFINE_TYPE ( + ECalModelTasks, + e_cal_model_tasks, + E_TYPE_CAL_MODEL) /* This makes sure a task is marked as complete. * It makes sure the "Date Completed" property is set. If the completed_date @@ -617,52 +428,6 @@ is_overdue (ECalModelTasks *model, return FALSE; } -static gpointer -ecmt_value_at (ETableModel *etm, - gint col, - gint row) -{ - ECalModelComponent *comp_data; - ECalModelTasks *model = (ECalModelTasks *) etm; - - g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), NULL); - - g_return_val_if_fail (col >= 0 && (col < E_CAL_MODEL_TASKS_FIELD_LAST || col == E_CAL_MODEL_TASKS_FIELD_STRIKEOUT), NULL); - g_return_val_if_fail (row >= 0 && row < e_table_model_row_count (etm), NULL); - - if (col < E_CAL_MODEL_FIELD_LAST) - return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->value_at (etm, col, row); - - comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row); - if (!comp_data) - return (gpointer) ""; - - switch (col) { - case E_CAL_MODEL_TASKS_FIELD_COMPLETED : - return get_completed (comp_data); - case E_CAL_MODEL_TASKS_FIELD_STRIKEOUT : - return GINT_TO_POINTER (is_status_canceled (comp_data) || is_complete (comp_data)); - case E_CAL_MODEL_TASKS_FIELD_COMPLETE : - return GINT_TO_POINTER (is_complete (comp_data)); - case E_CAL_MODEL_TASKS_FIELD_DUE : - return get_due (comp_data); - case E_CAL_MODEL_TASKS_FIELD_GEO : - return get_geo (comp_data); - case E_CAL_MODEL_TASKS_FIELD_OVERDUE : - return GINT_TO_POINTER (is_overdue (model, comp_data)); - case E_CAL_MODEL_TASKS_FIELD_PERCENT : - return GINT_TO_POINTER (get_percent (comp_data)); - case E_CAL_MODEL_TASKS_FIELD_PRIORITY : - return get_priority (comp_data); - case E_CAL_MODEL_TASKS_FIELD_STATUS : - return get_status (comp_data); - case E_CAL_MODEL_TASKS_FIELD_URL : - return get_url (comp_data); - } - - return (gpointer) ""; -} - static void set_completed (ECalModelTasks *model, ECalModelComponent *comp_data, @@ -906,34 +671,273 @@ set_url (ECalModelComponent *comp_data, } } +/** + * commit_component_changes + * @comp_data: Component of our interest, which has been changed. + * + * Commits changes to the backend calendar of the component. + **/ static void -ecmt_set_value_at (ETableModel *etm, - gint col, - gint row, - gconstpointer value) +commit_component_changes (ECalModelComponent *comp_data) { - ECalModelComponent *comp_data; - ECalModelTasks *model = (ECalModelTasks *) etm; + GError *error = NULL; - g_return_if_fail (E_IS_CAL_MODEL_TASKS (model)); + g_return_if_fail (comp_data != NULL); - g_return_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST); - g_return_if_fail (row >= 0 && row < e_table_model_row_count (etm)); + /* FIXME ask about mod type */ + e_cal_client_modify_object_sync ( + comp_data->client, comp_data->icalcomp, + CALOBJ_MOD_ALL, NULL, &error); - if (col < E_CAL_MODEL_FIELD_LAST) { - E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->set_value_at (etm, col, row, value); - return; + if (error != NULL) { + g_warning ( + G_STRLOC ": Could not modify the object! %s", + error->message); + + /* FIXME Show error dialog */ + g_error_free (error); } +} - comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row); - if (!comp_data) - return; +static void +cal_model_tasks_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_HIGHLIGHT_DUE_TODAY: + e_cal_model_tasks_set_highlight_due_today ( + E_CAL_MODEL_TASKS (object), + g_value_get_boolean (value)); + return; - switch (col) { - case E_CAL_MODEL_TASKS_FIELD_COMPLETED : - set_completed (model, comp_data, value); - break; - case E_CAL_MODEL_TASKS_FIELD_COMPLETE : + case PROP_COLOR_DUE_TODAY: + e_cal_model_tasks_set_color_due_today ( + E_CAL_MODEL_TASKS (object), + g_value_get_string (value)); + return; + + case PROP_HIGHLIGHT_OVERDUE: + e_cal_model_tasks_set_highlight_overdue ( + E_CAL_MODEL_TASKS (object), + g_value_get_boolean (value)); + return; + + case PROP_COLOR_OVERDUE: + e_cal_model_tasks_set_color_overdue ( + E_CAL_MODEL_TASKS (object), + g_value_get_string (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +cal_model_tasks_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_HIGHLIGHT_DUE_TODAY: + g_value_set_boolean ( + value, + e_cal_model_tasks_get_highlight_due_today ( + E_CAL_MODEL_TASKS (object))); + return; + + case PROP_COLOR_DUE_TODAY: + g_value_set_string ( + value, + e_cal_model_tasks_get_color_due_today ( + E_CAL_MODEL_TASKS (object))); + return; + + case PROP_HIGHLIGHT_OVERDUE: + g_value_set_boolean ( + value, + e_cal_model_tasks_get_highlight_overdue ( + E_CAL_MODEL_TASKS (object))); + return; + + case PROP_COLOR_OVERDUE: + g_value_set_string ( + value, + e_cal_model_tasks_get_color_overdue ( + E_CAL_MODEL_TASKS (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +cal_model_tasks_finalize (GObject *object) +{ + ECalModelTasksPrivate *priv; + + priv = E_CAL_MODEL_TASKS_GET_PRIVATE (object); + + g_free (priv->color_due_today); + g_free (priv->color_overdue); + + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (e_cal_model_tasks_parent_class)->finalize (object); +} + +static const gchar * +cal_model_tasks_get_color_for_component (ECalModel *model, + ECalModelComponent *comp_data) +{ + ECalModelTasks *tasks; + + g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), NULL); + g_return_val_if_fail (comp_data != NULL, NULL); + + tasks = E_CAL_MODEL_TASKS (model); + + /* XXX ECalModel's get_color_for_component() method should really + * get a GdkColor instead of a color specification string. */ + + switch (get_due_status (tasks, comp_data)) { + case E_CAL_MODEL_TASKS_DUE_TODAY: + if (!e_cal_model_tasks_get_highlight_due_today (tasks)) + break; + return e_cal_model_tasks_get_color_due_today (tasks); + case E_CAL_MODEL_TASKS_DUE_OVERDUE: + if (!e_cal_model_tasks_get_highlight_overdue (tasks)) + break; + return e_cal_model_tasks_get_color_overdue (tasks); + case E_CAL_MODEL_TASKS_DUE_NEVER: + case E_CAL_MODEL_TASKS_DUE_FUTURE: + case E_CAL_MODEL_TASKS_DUE_COMPLETE: + break; + } + + return E_CAL_MODEL_CLASS (e_cal_model_tasks_parent_class)-> + get_color_for_component (model, comp_data); +} + +static void +cal_model_tasks_fill_component_from_model (ECalModel *model, + ECalModelComponent *comp_data, + ETableModel *source_model, + gint row) +{ + gpointer value; + + g_return_if_fail (E_IS_CAL_MODEL_TASKS (model)); + g_return_if_fail (comp_data != NULL); + g_return_if_fail (E_IS_TABLE_MODEL (source_model)); + + /* This just makes sure if anything indicates completion, all + * three fields do or if percent is 0, status is sane */ + + value = e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_COMPLETED, row); + set_completed ((ECalModelTasks *) model, comp_data, value); + if (!value) { + value = e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_PERCENT, row); + set_percent (comp_data, value); + if (GPOINTER_TO_INT (value) != 100 && GPOINTER_TO_INT (value) != 0) + set_status (comp_data, e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_STATUS, row)); + } + + set_due ( + model, comp_data, + e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_DUE, row)); + set_geo ( + comp_data, + e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_GEO, row)); + set_priority ( + comp_data, + e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_PRIORITY, row)); + set_url ( + comp_data, + e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_URL, row)); +} + +static gint +cal_model_tasks_column_count (ETableModel *etm) +{ + return E_CAL_MODEL_TASKS_FIELD_LAST; +} + +static gpointer +cal_model_tasks_value_at (ETableModel *etm, + gint col, + gint row) +{ + ECalModelComponent *comp_data; + ECalModelTasks *model = (ECalModelTasks *) etm; + + g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), NULL); + + g_return_val_if_fail (col >= 0 && (col < E_CAL_MODEL_TASKS_FIELD_LAST || col == E_CAL_MODEL_TASKS_FIELD_STRIKEOUT), NULL); + g_return_val_if_fail (row >= 0 && row < e_table_model_row_count (etm), NULL); + + if (col < E_CAL_MODEL_FIELD_LAST) + return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->value_at (etm, col, row); + + comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row); + if (!comp_data) + return (gpointer) ""; + + switch (col) { + case E_CAL_MODEL_TASKS_FIELD_COMPLETED : + return get_completed (comp_data); + case E_CAL_MODEL_TASKS_FIELD_STRIKEOUT : + return GINT_TO_POINTER (is_status_canceled (comp_data) || is_complete (comp_data)); + case E_CAL_MODEL_TASKS_FIELD_COMPLETE : + return GINT_TO_POINTER (is_complete (comp_data)); + case E_CAL_MODEL_TASKS_FIELD_DUE : + return get_due (comp_data); + case E_CAL_MODEL_TASKS_FIELD_GEO : + return get_geo (comp_data); + case E_CAL_MODEL_TASKS_FIELD_OVERDUE : + return GINT_TO_POINTER (is_overdue (model, comp_data)); + case E_CAL_MODEL_TASKS_FIELD_PERCENT : + return GINT_TO_POINTER (get_percent (comp_data)); + case E_CAL_MODEL_TASKS_FIELD_PRIORITY : + return get_priority (comp_data); + case E_CAL_MODEL_TASKS_FIELD_STATUS : + return get_status (comp_data); + case E_CAL_MODEL_TASKS_FIELD_URL : + return get_url (comp_data); + } + + return (gpointer) ""; +} + +static void +cal_model_tasks_set_value_at (ETableModel *etm, + gint col, + gint row, + gconstpointer value) +{ + ECalModelComponent *comp_data; + ECalModelTasks *model = (ECalModelTasks *) etm; + + g_return_if_fail (E_IS_CAL_MODEL_TASKS (model)); + + g_return_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST); + g_return_if_fail (row >= 0 && row < e_table_model_row_count (etm)); + + if (col < E_CAL_MODEL_FIELD_LAST) { + E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->set_value_at (etm, col, row, value); + return; + } + + comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row); + if (!comp_data) + return; + + switch (col) { + case E_CAL_MODEL_TASKS_FIELD_COMPLETED : + set_completed (model, comp_data, value); + break; + case E_CAL_MODEL_TASKS_FIELD_COMPLETE : set_complete (comp_data, value); break; case E_CAL_MODEL_TASKS_FIELD_DUE : @@ -960,9 +964,9 @@ ecmt_set_value_at (ETableModel *etm, } static gboolean -ecmt_is_cell_editable (ETableModel *etm, - gint col, - gint row) +cal_model_tasks_is_cell_editable (ETableModel *etm, + gint col, + gint row) { ECalModelTasks *model = (ECalModelTasks *) etm; @@ -993,9 +997,9 @@ ecmt_is_cell_editable (ETableModel *etm, } static gpointer -ecmt_duplicate_value (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_tasks_duplicate_value (ETableModel *etm, + gint col, + gconstpointer value) { g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST, NULL); @@ -1031,9 +1035,9 @@ ecmt_duplicate_value (ETableModel *etm, } static void -ecmt_free_value (ETableModel *etm, - gint col, - gpointer value) +cal_model_tasks_free_value (ETableModel *etm, + gint col, + gpointer value) { g_return_if_fail (col >= 0 && col < E_CAL_MODEL_TASKS_FIELD_LAST); @@ -1060,8 +1064,8 @@ ecmt_free_value (ETableModel *etm, } static gpointer -ecmt_initialize_value (ETableModel *etm, - gint col) +cal_model_tasks_initialize_value (ETableModel *etm, + gint col) { ECalModelTasks *model = (ECalModelTasks *) etm; @@ -1090,9 +1094,9 @@ ecmt_initialize_value (ETableModel *etm, } static gboolean -ecmt_value_is_empty (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_tasks_value_is_empty (ETableModel *etm, + gint col, + gconstpointer value) { ECalModelTasks *model = (ECalModelTasks *) etm; @@ -1122,9 +1126,9 @@ ecmt_value_is_empty (ETableModel *etm, } static gchar * -ecmt_value_to_string (ETableModel *etm, - gint col, - gconstpointer value) +cal_model_tasks_value_to_string (ETableModel *etm, + gint col, + gconstpointer value) { ECalModelTasks *model = (ECalModelTasks *) etm; @@ -1156,77 +1160,86 @@ ecmt_value_to_string (ETableModel *etm, return g_strdup (""); } -/* ECalModel class methods */ - -static const gchar * -ecmt_get_color_for_component (ECalModel *model, - ECalModelComponent *comp_data) +static void +e_cal_model_tasks_class_init (ECalModelTasksClass *class) { - ECalModelTasks *tasks; + GObjectClass *object_class; + ECalModelClass *cal_model_class; + ETableModelClass *table_model_class; - g_return_val_if_fail (E_IS_CAL_MODEL_TASKS (model), NULL); - g_return_val_if_fail (comp_data != NULL, NULL); + g_type_class_add_private (class, sizeof (ECalModelTasksPrivate)); - tasks = E_CAL_MODEL_TASKS (model); + object_class = G_OBJECT_CLASS (class); + object_class->set_property = cal_model_tasks_set_property; + object_class->get_property = cal_model_tasks_get_property; + object_class->finalize = cal_model_tasks_finalize; - /* XXX ECalModel's get_color_for_component() method should really - * get a GdkColor instead of a color specification string. */ + cal_model_class = E_CAL_MODEL_CLASS (class); + cal_model_class->get_color_for_component = cal_model_tasks_get_color_for_component; + cal_model_class->fill_component_from_model = cal_model_tasks_fill_component_from_model; - switch (get_due_status (tasks, comp_data)) { - case E_CAL_MODEL_TASKS_DUE_TODAY: - if (!e_cal_model_tasks_get_highlight_due_today (tasks)) - break; - return e_cal_model_tasks_get_color_due_today (tasks); - case E_CAL_MODEL_TASKS_DUE_OVERDUE: - if (!e_cal_model_tasks_get_highlight_overdue (tasks)) - break; - return e_cal_model_tasks_get_color_overdue (tasks); - case E_CAL_MODEL_TASKS_DUE_NEVER: - case E_CAL_MODEL_TASKS_DUE_FUTURE: - case E_CAL_MODEL_TASKS_DUE_COMPLETE: - break; - } + table_model_class = E_TABLE_MODEL_CLASS (class); + table_model_class->column_count = cal_model_tasks_column_count; + table_model_class->value_at = cal_model_tasks_value_at; + table_model_class->set_value_at = cal_model_tasks_set_value_at; + table_model_class->is_cell_editable = cal_model_tasks_is_cell_editable; + table_model_class->duplicate_value = cal_model_tasks_duplicate_value; + table_model_class->free_value = cal_model_tasks_free_value; + table_model_class->initialize_value = cal_model_tasks_initialize_value; + table_model_class->value_is_empty = cal_model_tasks_value_is_empty; + table_model_class->value_to_string = cal_model_tasks_value_to_string; - return E_CAL_MODEL_CLASS (e_cal_model_tasks_parent_class)-> - get_color_for_component (model, comp_data); + g_object_class_install_property ( + object_class, + PROP_HIGHLIGHT_DUE_TODAY, + g_param_spec_boolean ( + "highlight-due-today", + "Highlight Due Today", + NULL, + TRUE, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_COLOR_DUE_TODAY, + g_param_spec_string ( + "color-due-today", + "Color Due Today", + NULL, + "#1e90ff", + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_HIGHLIGHT_OVERDUE, + g_param_spec_boolean ( + "highlight-overdue", + "Highlight Overdue", + NULL, + TRUE, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_COLOR_OVERDUE, + g_param_spec_string ( + "color-overdue", + "Color Overdue", + NULL, + "#ff0000", + G_PARAM_READWRITE)); } static void -ecmt_fill_component_from_model (ECalModel *model, - ECalModelComponent *comp_data, - ETableModel *source_model, - gint row) +e_cal_model_tasks_init (ECalModelTasks *model) { - gpointer value; - - g_return_if_fail (E_IS_CAL_MODEL_TASKS (model)); - g_return_if_fail (comp_data != NULL); - g_return_if_fail (E_IS_TABLE_MODEL (source_model)); - - /* This just makes sure if anything indicates completion, all - * three fields do or if percent is 0, status is sane */ + model->priv = E_CAL_MODEL_TASKS_GET_PRIVATE (model); - value = e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_COMPLETED, row); - set_completed ((ECalModelTasks *) model, comp_data, value); - if (!value) { - value = e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_PERCENT, row); - set_percent (comp_data, value); - if (GPOINTER_TO_INT (value) != 100 && GPOINTER_TO_INT (value) != 0) - set_status (comp_data, e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_STATUS, row)); - } + model->priv->highlight_due_today = TRUE; + model->priv->highlight_overdue = TRUE; - set_due ( - model, comp_data, - e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_DUE, row)); - set_geo ( - comp_data, - e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_GEO, row)); - set_priority ( - comp_data, - e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_PRIORITY, row)); - set_url ( - comp_data, - e_table_model_value_at (source_model, E_CAL_MODEL_TASKS_FIELD_URL, row)); + e_cal_model_set_component_kind ( + E_CAL_MODEL (model), ICAL_VTODO_COMPONENT); } ECalModel * @@ -1338,7 +1351,9 @@ e_cal_model_tasks_set_color_overdue (ECalModelTasks *model, * * Marks component as complete and commits changes to the calendar backend. **/ -void e_cal_model_tasks_mark_comp_complete (ECalModelTasks *model, ECalModelComponent *comp_data) +void +e_cal_model_tasks_mark_comp_complete (ECalModelTasks *model, + ECalModelComponent *comp_data) { g_return_if_fail (model != NULL); g_return_if_fail (comp_data != NULL); @@ -1360,7 +1375,9 @@ void e_cal_model_tasks_mark_comp_complete (ECalModelTasks *model, ECalModelCompo * * Marks component as incomplete and commits changes to the calendar backend. **/ -void e_cal_model_tasks_mark_comp_incomplete (ECalModelTasks *model, ECalModelComponent *comp_data) +void +e_cal_model_tasks_mark_comp_incomplete (ECalModelTasks *model, + ECalModelComponent *comp_data) { icalproperty *prop,*prop1; @@ -1396,37 +1413,6 @@ void e_cal_model_tasks_mark_comp_incomplete (ECalModelTasks *model, ECalModelCom commit_component_changes (comp_data); } -/** - * commit_component_changes - * @comp_data: Component of our interest, which has been changed. - * - * Commits changes to the backend calendar of the component. - **/ -static void -commit_component_changes (ECalModelComponent *comp_data) -{ - GError *error = NULL; - - g_return_if_fail (comp_data != NULL); - - /* FIXME ask about mod type */ - e_cal_client_modify_object_sync ( - comp_data->client, comp_data->icalcomp, - CALOBJ_MOD_ALL, NULL, &error); - - if (error != NULL) { - g_warning ( - G_STRLOC ": Could not modify the object! %s", - error->message); - - /* FIXME Show error dialog */ - g_error_free (error); - } -} - -/** - * e_cal_model_tasks_update_due_tasks - */ void e_cal_model_tasks_update_due_tasks (ECalModelTasks *model) { diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c index 16c968d704..288a896f9d 100644 --- a/calendar/gui/e-cal-model.c +++ b/calendar/gui/e-cal-model.c @@ -145,19 +145,12 @@ struct _ECalModelPrivate { GCancellable *loading_clients; }; -static gint ecm_column_count (ETableModel *etm); -static gint ecm_row_count (ETableModel *etm); -static gpointer ecm_value_at (ETableModel *etm, gint col, gint row); -static void ecm_set_value_at (ETableModel *etm, gint col, gint row, gconstpointer value); -static gboolean ecm_is_cell_editable (ETableModel *etm, gint col, gint row); -static void ecm_append_row (ETableModel *etm, ETableModel *source, gint row); -static gpointer ecm_duplicate_value (ETableModel *etm, gint col, gconstpointer value); -static void ecm_free_value (ETableModel *etm, gint col, gpointer value); -static gpointer ecm_initialize_value (ETableModel *etm, gint col); -static gboolean ecm_value_is_empty (ETableModel *etm, gint col, gconstpointer value); -static gchar *ecm_value_to_string (ETableModel *etm, gint col, gconstpointer value); - -static const gchar *ecm_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data); +typedef struct { + const gchar *color; + GList *uids; +} AssignedColorData; + +static const gchar *cal_model_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data); static gboolean add_new_client (ECalModel *model, ECalClient *client, gboolean do_query); static void remove_client_objects (ECalModel *model, ClientData *client_data); @@ -415,1301 +408,1009 @@ cal_model_clients_remove (ECalModel *model, return removed; } -static void -cal_model_set_registry (ECalModel *model, - ESourceRegistry *registry) +static gpointer +get_categories (ECalModelComponent *comp_data) { - g_return_if_fail (E_IS_SOURCE_REGISTRY (registry)); - g_return_if_fail (model->priv->registry == NULL); + if (!comp_data->priv->categories_str) { + icalproperty *prop; - model->priv->registry = g_object_ref (registry); + comp_data->priv->categories_str = g_string_new (""); + + for (prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY); + prop; + prop = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY)) { + const gchar *categories = icalproperty_get_categories (prop); + if (!categories) + continue; + + if (comp_data->priv->categories_str->len) + g_string_append_c (comp_data->priv->categories_str, ','); + g_string_append (comp_data->priv->categories_str, categories); + } + } + + return comp_data->priv->categories_str->str; } -static void -cal_model_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) +static gchar * +get_classification (ECalModelComponent *comp_data) { - switch (property_id) { - case PROP_COMPRESS_WEEKEND: - e_cal_model_set_compress_weekend ( - E_CAL_MODEL (object), - g_value_get_boolean (value)); - return; + icalproperty *prop; + icalproperty_class class; - case PROP_CONFIRM_DELETE: - e_cal_model_set_confirm_delete ( - E_CAL_MODEL (object), - g_value_get_boolean (value)); - return; + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CLASS_PROPERTY); - case PROP_DEFAULT_CLIENT: - e_cal_model_set_default_client ( - E_CAL_MODEL (object), - g_value_get_object (value)); - return; + if (!prop) + return _("Public"); - case PROP_DEFAULT_REMINDER_INTERVAL: - e_cal_model_set_default_reminder_interval ( - E_CAL_MODEL (object), - g_value_get_int (value)); - return; + class = icalproperty_get_class (prop); - case PROP_DEFAULT_REMINDER_UNITS: - e_cal_model_set_default_reminder_units ( - E_CAL_MODEL (object), - g_value_get_enum (value)); - return; + switch (class) + { + case ICAL_CLASS_PUBLIC: + return _("Public"); + case ICAL_CLASS_PRIVATE: + return _("Private"); + case ICAL_CLASS_CONFIDENTIAL: + return _("Confidential"); + default: + return _("Unknown"); + } +} - case PROP_REGISTRY: - cal_model_set_registry ( - E_CAL_MODEL (object), - g_value_get_object (value)); - return; +static const gchar * +get_color (ECalModel *model, + ECalModelComponent *comp_data) +{ + g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); - case PROP_TIMEZONE: - e_cal_model_set_timezone ( - E_CAL_MODEL (object), - g_value_get_pointer (value)); - return; + return e_cal_model_get_color_for_component (model, comp_data); +} - case PROP_USE_24_HOUR_FORMAT: - e_cal_model_set_use_24_hour_format ( - E_CAL_MODEL (object), - g_value_get_boolean (value)); - return; +static gpointer +get_description (ECalModelComponent *comp_data) +{ + icalproperty *prop; + static GString *str = NULL; - case PROP_USE_DEFAULT_REMINDER: - e_cal_model_set_use_default_reminder ( - E_CAL_MODEL (object), - g_value_get_boolean (value)); - return; + if (str) { + g_string_free (str, TRUE); + str = NULL; + } - case PROP_WEEK_START_DAY: - e_cal_model_set_week_start_day ( - E_CAL_MODEL (object), - g_value_get_enum (value)); - return; + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY); + if (prop) { + str = g_string_new (NULL); + do { + str = g_string_append (str, icalproperty_get_description (prop)); + } while ((prop = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY))); - case PROP_WORK_DAY_MONDAY: - e_cal_model_set_work_day ( - E_CAL_MODEL (object), - G_DATE_MONDAY, - g_value_get_boolean (value)); - return; + return str->str; + } - case PROP_WORK_DAY_TUESDAY: - e_cal_model_set_work_day ( - E_CAL_MODEL (object), - G_DATE_TUESDAY, - g_value_get_boolean (value)); - return; + return (gpointer) ""; +} - case PROP_WORK_DAY_WEDNESDAY: - e_cal_model_set_work_day ( - E_CAL_MODEL (object), - G_DATE_WEDNESDAY, - g_value_get_boolean (value)); - return; +static ECellDateEditValue * +get_dtstart (ECalModel *model, + ECalModelComponent *comp_data) +{ + ECalModelPrivate *priv; + struct icaltimetype tt_start; - case PROP_WORK_DAY_THURSDAY: - e_cal_model_set_work_day ( - E_CAL_MODEL (object), - G_DATE_THURSDAY, - g_value_get_boolean (value)); - return; + priv = model->priv; - case PROP_WORK_DAY_FRIDAY: - e_cal_model_set_work_day ( - E_CAL_MODEL (object), - G_DATE_FRIDAY, - g_value_get_boolean (value)); - return; + if (!comp_data->dtstart) { + icalproperty *prop; + icaltimezone *zone; + gboolean got_zone = FALSE; - case PROP_WORK_DAY_SATURDAY: - e_cal_model_set_work_day ( - E_CAL_MODEL (object), - G_DATE_SATURDAY, - g_value_get_boolean (value)); - return; + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTSTART_PROPERTY); + if (!prop) + return NULL; - case PROP_WORK_DAY_SUNDAY: - e_cal_model_set_work_day ( - E_CAL_MODEL (object), - G_DATE_SUNDAY, - g_value_get_boolean (value)); - return; + tt_start = icalproperty_get_dtstart (prop); - case PROP_WORK_DAY_END_HOUR: - e_cal_model_set_work_day_end_hour ( - E_CAL_MODEL (object), - g_value_get_int (value)); - return; + if (icaltime_get_tzid (tt_start) + && e_cal_client_get_timezone_sync (comp_data->client, icaltime_get_tzid (tt_start), &zone, NULL, NULL)) + got_zone = TRUE; - case PROP_WORK_DAY_END_MINUTE: - e_cal_model_set_work_day_end_minute ( - E_CAL_MODEL (object), - g_value_get_int (value)); - return; + if (e_cal_model_get_flags (model) & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES) { + if (got_zone) { + tt_start = icaltime_from_timet_with_zone (comp_data->instance_start, tt_start.is_date, zone); + if (priv->zone) + icaltimezone_convert_time (&tt_start, zone, priv->zone); + } else + if (priv->zone) + tt_start = icaltime_from_timet_with_zone (comp_data->instance_start, tt_start.is_date, priv->zone); + } - case PROP_WORK_DAY_START_HOUR: - e_cal_model_set_work_day_start_hour ( - E_CAL_MODEL (object), - g_value_get_int (value)); - return; + if (!icaltime_is_valid_time (tt_start) || icaltime_is_null_time (tt_start)) + return NULL; - case PROP_WORK_DAY_START_MINUTE: - e_cal_model_set_work_day_start_minute ( - E_CAL_MODEL (object), - g_value_get_int (value)); - return; + comp_data->dtstart = g_new0 (ECellDateEditValue, 1); + comp_data->dtstart->tt = tt_start; + + if (got_zone) + comp_data->dtstart->zone = zone; + else + comp_data->dtstart->zone = NULL; } - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + return comp_data->dtstart; } -static void -cal_model_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) +static ECellDateEditValue * +get_datetime_from_utc (ECalModel *model, + ECalModelComponent *comp_data, + icalproperty_kind propkind, + struct icaltimetype (*get_value) (const icalproperty *prop), + ECellDateEditValue **buffer) { - switch (property_id) { - case PROP_COMPRESS_WEEKEND: - g_value_set_boolean ( - value, - e_cal_model_get_compress_weekend ( - E_CAL_MODEL (object))); - return; + ECalModelPrivate *priv; + struct icaltimetype tt_value; + icalproperty *prop; + ECellDateEditValue *res; - case PROP_CONFIRM_DELETE: - g_value_set_boolean ( - value, - e_cal_model_get_confirm_delete ( - E_CAL_MODEL (object))); - return; - - case PROP_DEFAULT_CLIENT: - g_value_take_object ( - value, - e_cal_model_ref_default_client ( - E_CAL_MODEL (object))); - return; + g_return_val_if_fail (buffer!= NULL, NULL); - case PROP_DEFAULT_REMINDER_INTERVAL: - g_value_set_int ( - value, - e_cal_model_get_default_reminder_interval ( - E_CAL_MODEL (object))); - return; + if (*buffer) + return *buffer; - case PROP_DEFAULT_REMINDER_UNITS: - g_value_set_enum ( - value, - e_cal_model_get_default_reminder_units ( - E_CAL_MODEL (object))); - return; + priv = model->priv; - case PROP_REGISTRY: - g_value_set_object ( - value, - e_cal_model_get_registry ( - E_CAL_MODEL (object))); - return; + prop = icalcomponent_get_first_property (comp_data->icalcomp, propkind); + if (!prop) + return NULL; - case PROP_TIMEZONE: - g_value_set_pointer ( - value, - e_cal_model_get_timezone ( - E_CAL_MODEL (object))); - return; + tt_value = get_value (prop); - case PROP_USE_24_HOUR_FORMAT: - g_value_set_boolean ( - value, - e_cal_model_get_use_24_hour_format ( - E_CAL_MODEL (object))); - return; + /* these are always in UTC, thus convert to default zone, if any and done */ + if (priv->zone) + icaltimezone_convert_time (&tt_value, icaltimezone_get_utc_timezone (), priv->zone); - case PROP_USE_DEFAULT_REMINDER: - g_value_set_boolean ( - value, - e_cal_model_get_use_default_reminder ( - E_CAL_MODEL (object))); - return; + if (!icaltime_is_valid_time (tt_value) || icaltime_is_null_time (tt_value)) + return NULL; - case PROP_WEEK_START_DAY: - g_value_set_enum ( - value, - e_cal_model_get_week_start_day ( - E_CAL_MODEL (object))); - return; + res = g_new0 (ECellDateEditValue, 1); + res->tt = tt_value; + res->zone = NULL; - case PROP_WORK_DAY_MONDAY: - g_value_set_boolean ( - value, - e_cal_model_get_work_day ( - E_CAL_MODEL (object), G_DATE_MONDAY)); - return; + *buffer = res; - case PROP_WORK_DAY_TUESDAY: - g_value_set_boolean ( - value, - e_cal_model_get_work_day ( - E_CAL_MODEL (object), G_DATE_TUESDAY)); - return; + return res; +} - case PROP_WORK_DAY_WEDNESDAY: - g_value_set_boolean ( - value, - e_cal_model_get_work_day ( - E_CAL_MODEL (object), G_DATE_WEDNESDAY)); - return; +static gpointer +get_summary (ECalModelComponent *comp_data) +{ + icalproperty *prop; - case PROP_WORK_DAY_THURSDAY: - g_value_set_boolean ( - value, - e_cal_model_get_work_day ( - E_CAL_MODEL (object), G_DATE_THURSDAY)); - return; + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_SUMMARY_PROPERTY); + if (prop) + return (gpointer) icalproperty_get_summary (prop); - case PROP_WORK_DAY_FRIDAY: - g_value_set_boolean ( - value, - e_cal_model_get_work_day ( - E_CAL_MODEL (object), G_DATE_FRIDAY)); - return; + return (gpointer) ""; +} - case PROP_WORK_DAY_SATURDAY: - g_value_set_boolean ( - value, - e_cal_model_get_work_day ( - E_CAL_MODEL (object), G_DATE_SATURDAY)); - return; +static gchar * +get_uid (ECalModelComponent *comp_data) +{ + return (gchar *) icalcomponent_get_uid (comp_data->icalcomp); +} - case PROP_WORK_DAY_SUNDAY: - g_value_set_boolean ( - value, - e_cal_model_get_work_day ( - E_CAL_MODEL (object), G_DATE_SUNDAY)); - return; +static void +set_categories (ECalModelComponent *comp_data, + const gchar *value) +{ + icalproperty *prop; - case PROP_WORK_DAY_END_HOUR: - g_value_set_int ( - value, - e_cal_model_get_work_day_end_hour ( - E_CAL_MODEL (object))); - return; + /* remove all categories first */ + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY); + while (prop) { + icalproperty *to_remove = prop; + prop = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY); - case PROP_WORK_DAY_END_MINUTE: - g_value_set_int ( - value, - e_cal_model_get_work_day_end_minute ( - E_CAL_MODEL (object))); - return; + icalcomponent_remove_property (comp_data->icalcomp, to_remove); + icalproperty_free (to_remove); + } - case PROP_WORK_DAY_START_HOUR: - g_value_set_int ( - value, - e_cal_model_get_work_day_start_hour ( - E_CAL_MODEL (object))); - return; + if (comp_data->priv->categories_str) + g_string_free (comp_data->priv->categories_str, TRUE); + comp_data->priv->categories_str = NULL; - case PROP_WORK_DAY_START_MINUTE: - g_value_set_int ( - value, - e_cal_model_get_work_day_start_minute ( - E_CAL_MODEL (object))); - return; + /* then set a new value; no need to populate categories_str, + * it'll be populated on demand (in the get_categories() function) + */ + if (value && *value) { + prop = icalproperty_new_categories (value); + icalcomponent_add_property (comp_data->icalcomp, prop); } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void -cal_model_constructed (GObject *object) +set_classification (ECalModelComponent *comp_data, + const gchar *value) { - e_extensible_load_extensions (E_EXTENSIBLE (object)); + icalproperty *prop; - /* Chain up to parent's constructed() method. */ - G_OBJECT_CLASS (e_cal_model_parent_class)->constructed (object); + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CLASS_PROPERTY); + if (!value || !(*value)) { + if (prop) { + icalcomponent_remove_property (comp_data->icalcomp, prop); + icalproperty_free (prop); + } + } else { + icalproperty_class ical_class; + + if (!g_ascii_strcasecmp (value, "PUBLIC")) + ical_class = ICAL_CLASS_PUBLIC; + else if (!g_ascii_strcasecmp (value, "PRIVATE")) + ical_class = ICAL_CLASS_PRIVATE; + else if (!g_ascii_strcasecmp (value, "CONFIDENTIAL")) + ical_class = ICAL_CLASS_CONFIDENTIAL; + else + ical_class = ICAL_CLASS_NONE; + + if (!prop) { + prop = icalproperty_new_class (ical_class); + icalcomponent_add_property (comp_data->icalcomp, prop); + } else + icalproperty_set_class (prop, ical_class); + } } static void -cal_model_dispose (GObject *object) +set_description (ECalModelComponent *comp_data, + const gchar *value) { - ECalModelPrivate *priv; + icalproperty *prop; - priv = E_CAL_MODEL_GET_PRIVATE (object); + /* remove old description(s) */ + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY); + while (prop) { + icalproperty *next; - if (priv->registry != NULL) { - g_object_unref (priv->registry); - priv->registry = NULL; - } + next = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY); - if (priv->loading_clients) { - g_cancellable_cancel (priv->loading_clients); - g_object_unref (priv->loading_clients); - priv->loading_clients = NULL; - } + icalcomponent_remove_property (comp_data->icalcomp, prop); + icalproperty_free (prop); - while (!g_queue_is_empty (&priv->clients)) - client_data_unref (g_queue_pop_head (&priv->clients)); + prop = next; + } - priv->default_client = NULL; + /* now add the new description */ + if (!value || !(*value)) + return; - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (e_cal_model_parent_class)->dispose (object); + prop = icalproperty_new_description (value); + icalcomponent_add_property (comp_data->icalcomp, prop); } static void -cal_model_finalize (GObject *object) +set_dtstart (ECalModel *model, + ECalModelComponent *comp_data, + gconstpointer value) { - ECalModelPrivate *priv; - gint ii; - - priv = E_CAL_MODEL_GET_PRIVATE (object); + e_cal_model_update_comp_time ( + model, comp_data, value, + ICAL_DTSTART_PROPERTY, + icalproperty_set_dtstart, + icalproperty_new_dtstart); +} - g_mutex_clear (&priv->clients_lock); - - g_free (priv->search_sexp); - g_free (priv->full_sexp); - - g_free (priv->default_category); +static void +set_summary (ECalModelComponent *comp_data, + const gchar *value) +{ + icalproperty *prop; - for (ii = 0; ii < priv->objects->len; ii++) { - ECalModelComponent *comp_data; + prop = icalcomponent_get_first_property ( + comp_data->icalcomp, ICAL_SUMMARY_PROPERTY); - comp_data = g_ptr_array_index (priv->objects, ii); - if (comp_data == NULL) { - g_warning ("comp_data is null\n"); - continue; + if (string_is_empty (value)) { + if (prop) { + icalcomponent_remove_property (comp_data->icalcomp, prop); + icalproperty_free (prop); + } + } else { + if (prop) + icalproperty_set_summary (prop, value); + else { + prop = icalproperty_new_summary (value); + icalcomponent_add_property (comp_data->icalcomp, prop); } - g_object_unref (comp_data); } - g_ptr_array_free (priv->objects, FALSE); +} - g_mutex_clear (&priv->notify_lock); +static void +datetime_to_zone (ECalClient *client, + struct icaltimetype *tt, + icaltimezone *tt_zone, + const gchar *tzid) +{ + icaltimezone *from, *to; + const gchar *tt_tzid = NULL; - g_hash_table_destroy (priv->notify_added); - g_hash_table_destroy (priv->notify_modified); - g_hash_table_destroy (priv->notify_removed); + g_return_if_fail (tt != NULL); - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (e_cal_model_parent_class)->finalize (object); + if (tt_zone) + tt_tzid = icaltimezone_get_tzid (tt_zone); + + if (tt_tzid == NULL || tzid == NULL || + tt_tzid == tzid || g_str_equal (tt_tzid, tzid)) + return; + + from = tt_zone; + to = icaltimezone_get_builtin_timezone_from_tzid (tzid); + if (!to) { + /* do not check failure here, maybe the zone is not available there */ + e_cal_client_get_timezone_sync (client, tzid, &to, NULL, NULL); + } + + icaltimezone_convert_time (tt, from, to); } static void -e_cal_model_class_init (ECalModelClass *class) +cal_model_set_registry (ECalModel *model, + ESourceRegistry *registry) { - GObjectClass *object_class; - ETableModelClass *etm_class; + g_return_if_fail (E_IS_SOURCE_REGISTRY (registry)); + g_return_if_fail (model->priv->registry == NULL); - g_type_class_add_private (class, sizeof (ECalModelPrivate)); + model->priv->registry = g_object_ref (registry); +} - object_class = G_OBJECT_CLASS (class); - object_class->set_property = cal_model_set_property; - object_class->get_property = cal_model_get_property; - object_class->constructed = cal_model_constructed; - object_class->dispose = cal_model_dispose; - object_class->finalize = cal_model_finalize; +static void +cal_model_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_COMPRESS_WEEKEND: + e_cal_model_set_compress_weekend ( + E_CAL_MODEL (object), + g_value_get_boolean (value)); + return; - etm_class = E_TABLE_MODEL_CLASS (class); - etm_class->column_count = ecm_column_count; - etm_class->row_count = ecm_row_count; - etm_class->value_at = ecm_value_at; - etm_class->set_value_at = ecm_set_value_at; - etm_class->is_cell_editable = ecm_is_cell_editable; - etm_class->append_row = ecm_append_row; - etm_class->duplicate_value = ecm_duplicate_value; - etm_class->free_value = ecm_free_value; - etm_class->initialize_value = ecm_initialize_value; - etm_class->value_is_empty = ecm_value_is_empty; - etm_class->value_to_string = ecm_value_to_string; - - class->get_color_for_component = ecm_get_color_for_component; - class->fill_component_from_model = NULL; + case PROP_CONFIRM_DELETE: + e_cal_model_set_confirm_delete ( + E_CAL_MODEL (object), + g_value_get_boolean (value)); + return; - g_object_class_install_property ( - object_class, - PROP_COMPRESS_WEEKEND, - g_param_spec_boolean ( - "compress-weekend", - "Compress Weekend", - NULL, - FALSE, - G_PARAM_READWRITE)); + case PROP_DEFAULT_CLIENT: + e_cal_model_set_default_client ( + E_CAL_MODEL (object), + g_value_get_object (value)); + return; - g_object_class_install_property ( - object_class, - PROP_CONFIRM_DELETE, - g_param_spec_boolean ( - "confirm-delete", - "Confirm Delete", - NULL, - TRUE, - G_PARAM_READWRITE)); + case PROP_DEFAULT_REMINDER_INTERVAL: + e_cal_model_set_default_reminder_interval ( + E_CAL_MODEL (object), + g_value_get_int (value)); + return; - g_object_class_install_property ( - object_class, - PROP_DEFAULT_CLIENT, - g_param_spec_object ( - "default-client", - "Default ECalClient", - NULL, - E_TYPE_CAL_CLIENT, - G_PARAM_READWRITE)); + case PROP_DEFAULT_REMINDER_UNITS: + e_cal_model_set_default_reminder_units ( + E_CAL_MODEL (object), + g_value_get_enum (value)); + return; - g_object_class_install_property ( - object_class, - PROP_DEFAULT_REMINDER_INTERVAL, - g_param_spec_int ( - "default-reminder-interval", - "Default Reminder Interval", - NULL, - G_MININT, - G_MAXINT, - 0, - G_PARAM_READWRITE)); + case PROP_REGISTRY: + cal_model_set_registry ( + E_CAL_MODEL (object), + g_value_get_object (value)); + return; - g_object_class_install_property ( - object_class, - PROP_DEFAULT_REMINDER_UNITS, - g_param_spec_enum ( - "default-reminder-units", - "Default Reminder Units", - NULL, - E_TYPE_DURATION_TYPE, - E_DURATION_MINUTES, - G_PARAM_READWRITE)); + case PROP_TIMEZONE: + e_cal_model_set_timezone ( + E_CAL_MODEL (object), + g_value_get_pointer (value)); + return; - g_object_class_install_property ( - object_class, - PROP_REGISTRY, - g_param_spec_object ( - "registry", - "Registry", - "Data source registry", - E_TYPE_SOURCE_REGISTRY, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); + case PROP_USE_24_HOUR_FORMAT: + e_cal_model_set_use_24_hour_format ( + E_CAL_MODEL (object), + g_value_get_boolean (value)); + return; - g_object_class_install_property ( - object_class, - PROP_TIMEZONE, - g_param_spec_pointer ( - "timezone", - "Time Zone", - NULL, - G_PARAM_READWRITE)); + case PROP_USE_DEFAULT_REMINDER: + e_cal_model_set_use_default_reminder ( + E_CAL_MODEL (object), + g_value_get_boolean (value)); + return; - g_object_class_install_property ( - object_class, - PROP_USE_24_HOUR_FORMAT, - g_param_spec_boolean ( - "use-24-hour-format", - "Use 24-Hour Format", - NULL, - TRUE, - G_PARAM_READWRITE)); + case PROP_WEEK_START_DAY: + e_cal_model_set_week_start_day ( + E_CAL_MODEL (object), + g_value_get_enum (value)); + return; - g_object_class_install_property ( - object_class, - PROP_USE_DEFAULT_REMINDER, - g_param_spec_boolean ( - "use-default-reminder", - "Use Default Reminder", - NULL, - FALSE, - G_PARAM_READWRITE)); + case PROP_WORK_DAY_MONDAY: + e_cal_model_set_work_day ( + E_CAL_MODEL (object), + G_DATE_MONDAY, + g_value_get_boolean (value)); + return; - g_object_class_install_property ( - object_class, - PROP_WEEK_START_DAY, - g_param_spec_enum ( - "week-start-day", - "Week Start Day", - NULL, - E_TYPE_DATE_WEEKDAY, - G_DATE_MONDAY, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT)); + case PROP_WORK_DAY_TUESDAY: + e_cal_model_set_work_day ( + E_CAL_MODEL (object), + G_DATE_TUESDAY, + g_value_get_boolean (value)); + return; - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_MONDAY, - g_param_spec_boolean ( - "work-day-monday", - "Work Day: Monday", - "Whether Monday is a work day", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_TUESDAY, - g_param_spec_boolean ( - "work-day-tuesday", - "Work Day: Tuesday", - "Whether Tuesday is a work day", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_WEDNESDAY, - g_param_spec_boolean ( - "work-day-wednesday", - "Work Day: Wednesday", - "Whether Wednesday is a work day", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_THURSDAY, - g_param_spec_boolean ( - "work-day-thursday", - "Work Day: Thursday", - "Whether Thursday is a work day", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_FRIDAY, - g_param_spec_boolean ( - "work-day-friday", - "Work Day: Friday", - "Whether Friday is a work day", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_SATURDAY, - g_param_spec_boolean ( - "work-day-saturday", - "Work Day: Saturday", - "Whether Saturday is a work day", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_SUNDAY, - g_param_spec_boolean ( - "work-day-sunday", - "Work Day: Sunday", - "Whether Sunday is a work day", - TRUE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_END_HOUR, - g_param_spec_int ( - "work-day-end-hour", - "Work Day End Hour", - NULL, - 0, - 23, - 0, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_END_MINUTE, - g_param_spec_int ( - "work-day-end-minute", - "Work Day End Minute", - NULL, - 0, - 59, - 0, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_START_HOUR, - g_param_spec_int ( - "work-day-start-hour", - "Work Day Start Hour", - NULL, - 0, - 23, - 0, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_WORK_DAY_START_MINUTE, - g_param_spec_int ( - "work-day-start-minute", - "Work Day Start Minute", - NULL, - 0, - 59, - 0, - G_PARAM_READWRITE)); - - signals[TIME_RANGE_CHANGED] = g_signal_new ( - "time_range_changed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ECalModelClass, time_range_changed), - NULL, NULL, - e_marshal_VOID__LONG_LONG, - G_TYPE_NONE, 2, - G_TYPE_LONG, - G_TYPE_LONG); - - signals[ROW_APPENDED] = g_signal_new ( - "row_appended", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ECalModelClass, row_appended), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[COMPS_DELETED] = g_signal_new ( - "comps_deleted", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ECalModelClass, comps_deleted), - NULL, NULL, - g_cclosure_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - - signals[CAL_VIEW_PROGRESS] = g_signal_new ( - "cal_view_progress", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ECalModelClass, cal_view_progress), - NULL, NULL, - e_marshal_VOID__STRING_INT_INT, - G_TYPE_NONE, 3, - G_TYPE_STRING, - G_TYPE_INT, - G_TYPE_INT); - - signals[CAL_VIEW_COMPLETE] = g_signal_new ( - "cal_view_complete", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ECalModelClass, cal_view_complete), - NULL, NULL, - e_marshal_VOID__BOXED_INT, - G_TYPE_NONE, 2, - G_TYPE_ERROR, - G_TYPE_INT); - - signals[STATUS_MESSAGE] = g_signal_new ( - "status-message", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (ECalModelClass, status_message), - NULL, NULL, - e_marshal_VOID__STRING_DOUBLE, - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_DOUBLE); - - signals[TIMEZONE_CHANGED] = g_signal_new ( - "timezone-changed", - G_TYPE_FROM_CLASS (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ECalModelClass, timezone_changed), - NULL, NULL, - e_marshal_VOID__POINTER_POINTER, - G_TYPE_NONE, 2, - G_TYPE_POINTER, - G_TYPE_POINTER); -} - -static void -e_cal_model_init (ECalModel *model) -{ - model->priv = E_CAL_MODEL_GET_PRIVATE (model); - - g_mutex_init (&model->priv->clients_lock); - - /* match none by default */ - model->priv->start = -1; - model->priv->end = -1; - model->priv->search_sexp = NULL; - model->priv->full_sexp = g_strdup ("#f"); - - model->priv->objects = g_ptr_array_new (); - model->priv->kind = ICAL_NO_COMPONENT; - model->priv->flags = 0; - - model->priv->use_24_hour_format = TRUE; - - model->priv->in_added = FALSE; - model->priv->in_modified = FALSE; - model->priv->in_removed = FALSE; - model->priv->notify_added = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); - model->priv->notify_modified = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); - model->priv->notify_removed = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); - g_mutex_init (&model->priv->notify_lock); - - model->priv->loading_clients = g_cancellable_new (); -} - -/* ETableModel methods */ - -static gint -ecm_column_count (ETableModel *etm) -{ - return E_CAL_MODEL_FIELD_LAST; -} + case PROP_WORK_DAY_WEDNESDAY: + e_cal_model_set_work_day ( + E_CAL_MODEL (object), + G_DATE_WEDNESDAY, + g_value_get_boolean (value)); + return; -static gint -ecm_row_count (ETableModel *etm) -{ - ECalModelPrivate *priv; - ECalModel *model = (ECalModel *) etm; + case PROP_WORK_DAY_THURSDAY: + e_cal_model_set_work_day ( + E_CAL_MODEL (object), + G_DATE_THURSDAY, + g_value_get_boolean (value)); + return; - g_return_val_if_fail (E_IS_CAL_MODEL (model), -1); + case PROP_WORK_DAY_FRIDAY: + e_cal_model_set_work_day ( + E_CAL_MODEL (object), + G_DATE_FRIDAY, + g_value_get_boolean (value)); + return; - priv = model->priv; + case PROP_WORK_DAY_SATURDAY: + e_cal_model_set_work_day ( + E_CAL_MODEL (object), + G_DATE_SATURDAY, + g_value_get_boolean (value)); + return; - return priv->objects->len; -} + case PROP_WORK_DAY_SUNDAY: + e_cal_model_set_work_day ( + E_CAL_MODEL (object), + G_DATE_SUNDAY, + g_value_get_boolean (value)); + return; -static gpointer -get_categories (ECalModelComponent *comp_data) -{ - if (!comp_data->priv->categories_str) { - icalproperty *prop; + case PROP_WORK_DAY_END_HOUR: + e_cal_model_set_work_day_end_hour ( + E_CAL_MODEL (object), + g_value_get_int (value)); + return; - comp_data->priv->categories_str = g_string_new (""); + case PROP_WORK_DAY_END_MINUTE: + e_cal_model_set_work_day_end_minute ( + E_CAL_MODEL (object), + g_value_get_int (value)); + return; - for (prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY); - prop; - prop = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY)) { - const gchar *categories = icalproperty_get_categories (prop); - if (!categories) - continue; + case PROP_WORK_DAY_START_HOUR: + e_cal_model_set_work_day_start_hour ( + E_CAL_MODEL (object), + g_value_get_int (value)); + return; - if (comp_data->priv->categories_str->len) - g_string_append_c (comp_data->priv->categories_str, ','); - g_string_append (comp_data->priv->categories_str, categories); - } + case PROP_WORK_DAY_START_MINUTE: + e_cal_model_set_work_day_start_minute ( + E_CAL_MODEL (object), + g_value_get_int (value)); + return; } - return comp_data->priv->categories_str->str; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } -static gchar * -get_classification (ECalModelComponent *comp_data) +static void +cal_model_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { - icalproperty *prop; - icalproperty_class class; - - prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CLASS_PROPERTY); + switch (property_id) { + case PROP_COMPRESS_WEEKEND: + g_value_set_boolean ( + value, + e_cal_model_get_compress_weekend ( + E_CAL_MODEL (object))); + return; - if (!prop) - return _("Public"); + case PROP_CONFIRM_DELETE: + g_value_set_boolean ( + value, + e_cal_model_get_confirm_delete ( + E_CAL_MODEL (object))); + return; - class = icalproperty_get_class (prop); + case PROP_DEFAULT_CLIENT: + g_value_take_object ( + value, + e_cal_model_ref_default_client ( + E_CAL_MODEL (object))); + return; - switch (class) - { - case ICAL_CLASS_PUBLIC: - return _("Public"); - case ICAL_CLASS_PRIVATE: - return _("Private"); - case ICAL_CLASS_CONFIDENTIAL: - return _("Confidential"); - default: - return _("Unknown"); - } -} + case PROP_DEFAULT_REMINDER_INTERVAL: + g_value_set_int ( + value, + e_cal_model_get_default_reminder_interval ( + E_CAL_MODEL (object))); + return; -static const gchar * -get_color (ECalModel *model, - ECalModelComponent *comp_data) -{ - g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); + case PROP_DEFAULT_REMINDER_UNITS: + g_value_set_enum ( + value, + e_cal_model_get_default_reminder_units ( + E_CAL_MODEL (object))); + return; - return e_cal_model_get_color_for_component (model, comp_data); -} + case PROP_REGISTRY: + g_value_set_object ( + value, + e_cal_model_get_registry ( + E_CAL_MODEL (object))); + return; -static gpointer -get_description (ECalModelComponent *comp_data) -{ - icalproperty *prop; - static GString *str = NULL; + case PROP_TIMEZONE: + g_value_set_pointer ( + value, + e_cal_model_get_timezone ( + E_CAL_MODEL (object))); + return; - if (str) { - g_string_free (str, TRUE); - str = NULL; - } + case PROP_USE_24_HOUR_FORMAT: + g_value_set_boolean ( + value, + e_cal_model_get_use_24_hour_format ( + E_CAL_MODEL (object))); + return; - prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY); - if (prop) { - str = g_string_new (NULL); - do { - str = g_string_append (str, icalproperty_get_description (prop)); - } while ((prop = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY))); + case PROP_USE_DEFAULT_REMINDER: + g_value_set_boolean ( + value, + e_cal_model_get_use_default_reminder ( + E_CAL_MODEL (object))); + return; - return str->str; - } + case PROP_WEEK_START_DAY: + g_value_set_enum ( + value, + e_cal_model_get_week_start_day ( + E_CAL_MODEL (object))); + return; - return (gpointer) ""; -} + case PROP_WORK_DAY_MONDAY: + g_value_set_boolean ( + value, + e_cal_model_get_work_day ( + E_CAL_MODEL (object), G_DATE_MONDAY)); + return; -static ECellDateEditValue * -get_dtstart (ECalModel *model, - ECalModelComponent *comp_data) -{ - ECalModelPrivate *priv; - struct icaltimetype tt_start; + case PROP_WORK_DAY_TUESDAY: + g_value_set_boolean ( + value, + e_cal_model_get_work_day ( + E_CAL_MODEL (object), G_DATE_TUESDAY)); + return; - priv = model->priv; + case PROP_WORK_DAY_WEDNESDAY: + g_value_set_boolean ( + value, + e_cal_model_get_work_day ( + E_CAL_MODEL (object), G_DATE_WEDNESDAY)); + return; - if (!comp_data->dtstart) { - icalproperty *prop; - icaltimezone *zone; - gboolean got_zone = FALSE; + case PROP_WORK_DAY_THURSDAY: + g_value_set_boolean ( + value, + e_cal_model_get_work_day ( + E_CAL_MODEL (object), G_DATE_THURSDAY)); + return; - prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTSTART_PROPERTY); - if (!prop) - return NULL; + case PROP_WORK_DAY_FRIDAY: + g_value_set_boolean ( + value, + e_cal_model_get_work_day ( + E_CAL_MODEL (object), G_DATE_FRIDAY)); + return; - tt_start = icalproperty_get_dtstart (prop); + case PROP_WORK_DAY_SATURDAY: + g_value_set_boolean ( + value, + e_cal_model_get_work_day ( + E_CAL_MODEL (object), G_DATE_SATURDAY)); + return; - if (icaltime_get_tzid (tt_start) - && e_cal_client_get_timezone_sync (comp_data->client, icaltime_get_tzid (tt_start), &zone, NULL, NULL)) - got_zone = TRUE; + case PROP_WORK_DAY_SUNDAY: + g_value_set_boolean ( + value, + e_cal_model_get_work_day ( + E_CAL_MODEL (object), G_DATE_SUNDAY)); + return; - if (e_cal_model_get_flags (model) & E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES) { - if (got_zone) { - tt_start = icaltime_from_timet_with_zone (comp_data->instance_start, tt_start.is_date, zone); - if (priv->zone) - icaltimezone_convert_time (&tt_start, zone, priv->zone); - } else - if (priv->zone) - tt_start = icaltime_from_timet_with_zone (comp_data->instance_start, tt_start.is_date, priv->zone); - } + case PROP_WORK_DAY_END_HOUR: + g_value_set_int ( + value, + e_cal_model_get_work_day_end_hour ( + E_CAL_MODEL (object))); + return; - if (!icaltime_is_valid_time (tt_start) || icaltime_is_null_time (tt_start)) - return NULL; + case PROP_WORK_DAY_END_MINUTE: + g_value_set_int ( + value, + e_cal_model_get_work_day_end_minute ( + E_CAL_MODEL (object))); + return; - comp_data->dtstart = g_new0 (ECellDateEditValue, 1); - comp_data->dtstart->tt = tt_start; + case PROP_WORK_DAY_START_HOUR: + g_value_set_int ( + value, + e_cal_model_get_work_day_start_hour ( + E_CAL_MODEL (object))); + return; - if (got_zone) - comp_data->dtstart->zone = zone; - else - comp_data->dtstart->zone = NULL; + case PROP_WORK_DAY_START_MINUTE: + g_value_set_int ( + value, + e_cal_model_get_work_day_start_minute ( + E_CAL_MODEL (object))); + return; } - return comp_data->dtstart; + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } -static ECellDateEditValue * -get_datetime_from_utc (ECalModel *model, - ECalModelComponent *comp_data, - icalproperty_kind propkind, - struct icaltimetype (*get_value) (const icalproperty *prop), - ECellDateEditValue **buffer) +static void +cal_model_constructed (GObject *object) { - ECalModelPrivate *priv; - struct icaltimetype tt_value; - icalproperty *prop; - ECellDateEditValue *res; - - g_return_val_if_fail (buffer!= NULL, NULL); - - if (*buffer) - return *buffer; - - priv = model->priv; - - prop = icalcomponent_get_first_property (comp_data->icalcomp, propkind); - if (!prop) - return NULL; - - tt_value = get_value (prop); - - /* these are always in UTC, thus convert to default zone, if any and done */ - if (priv->zone) - icaltimezone_convert_time (&tt_value, icaltimezone_get_utc_timezone (), priv->zone); + e_extensible_load_extensions (E_EXTENSIBLE (object)); - if (!icaltime_is_valid_time (tt_value) || icaltime_is_null_time (tt_value)) - return NULL; + /* Chain up to parent's constructed() method. */ + G_OBJECT_CLASS (e_cal_model_parent_class)->constructed (object); +} - res = g_new0 (ECellDateEditValue, 1); - res->tt = tt_value; - res->zone = NULL; +static void +cal_model_dispose (GObject *object) +{ + ECalModelPrivate *priv; - *buffer = res; + priv = E_CAL_MODEL_GET_PRIVATE (object); - return res; -} + if (priv->registry != NULL) { + g_object_unref (priv->registry); + priv->registry = NULL; + } -static gpointer -get_summary (ECalModelComponent *comp_data) -{ - icalproperty *prop; + if (priv->loading_clients) { + g_cancellable_cancel (priv->loading_clients); + g_object_unref (priv->loading_clients); + priv->loading_clients = NULL; + } - prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_SUMMARY_PROPERTY); - if (prop) - return (gpointer) icalproperty_get_summary (prop); + while (!g_queue_is_empty (&priv->clients)) + client_data_unref (g_queue_pop_head (&priv->clients)); - return (gpointer) ""; -} + priv->default_client = NULL; -static gchar * -get_uid (ECalModelComponent *comp_data) -{ - return (gchar *) icalcomponent_get_uid (comp_data->icalcomp); + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_cal_model_parent_class)->dispose (object); } -static gpointer -ecm_value_at (ETableModel *etm, - gint col, - gint row) +static void +cal_model_finalize (GObject *object) { ECalModelPrivate *priv; - ECalModelComponent *comp_data; - ECalModel *model = (ECalModel *) etm; - ESourceRegistry *registry; + gint ii; - g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); + priv = E_CAL_MODEL_GET_PRIVATE (object); - priv = model->priv; + g_mutex_clear (&priv->clients_lock); - registry = e_cal_model_get_registry (model); + g_free (priv->search_sexp); + g_free (priv->full_sexp); - g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL); - g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL); + g_free (priv->default_category); - comp_data = g_ptr_array_index (priv->objects, row); - g_return_val_if_fail (comp_data != NULL, NULL); - g_return_val_if_fail (comp_data->icalcomp != NULL, NULL); + for (ii = 0; ii < priv->objects->len; ii++) { + ECalModelComponent *comp_data; - switch (col) { - case E_CAL_MODEL_FIELD_CATEGORIES : - return get_categories (comp_data); - case E_CAL_MODEL_FIELD_CLASSIFICATION : - return get_classification (comp_data); - case E_CAL_MODEL_FIELD_COLOR : - return (gpointer) get_color (model, comp_data); - case E_CAL_MODEL_FIELD_COMPONENT : - return comp_data->icalcomp; - case E_CAL_MODEL_FIELD_DESCRIPTION : - return get_description (comp_data); - case E_CAL_MODEL_FIELD_DTSTART : - return (gpointer) get_dtstart (model, comp_data); - case E_CAL_MODEL_FIELD_CREATED : - return (gpointer) get_datetime_from_utc ( - model, comp_data, ICAL_CREATED_PROPERTY, - icalproperty_get_created, &comp_data->created); - case E_CAL_MODEL_FIELD_LASTMODIFIED : - return (gpointer) get_datetime_from_utc ( - model, comp_data, ICAL_LASTMODIFIED_PROPERTY, - icalproperty_get_lastmodified, &comp_data->lastmodified); - case E_CAL_MODEL_FIELD_HAS_ALARMS : - return GINT_TO_POINTER ( - icalcomponent_get_first_component ( - comp_data->icalcomp, - ICAL_VALARM_COMPONENT) != NULL); - case E_CAL_MODEL_FIELD_ICON : - { - ECalComponent *comp; - icalcomponent *icalcomp; - gint retval = 0; + comp_data = g_ptr_array_index (priv->objects, ii); + if (comp_data == NULL) { + g_warning ("comp_data is null\n"); + continue; + } + g_object_unref (comp_data); + } + g_ptr_array_free (priv->objects, FALSE); - comp = e_cal_component_new (); - icalcomp = icalcomponent_new_clone (comp_data->icalcomp); - if (e_cal_component_set_icalcomponent (comp, icalcomp)) { - if (e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_JOURNAL) { - g_object_unref (comp); - return GINT_TO_POINTER (retval); - } + g_mutex_clear (&priv->notify_lock); - if (e_cal_component_has_recurrences (comp)) - retval = 1; - else if (itip_organizer_is_user (registry, comp, comp_data->client)) - retval = 3; - else { - GSList *attendees = NULL, *sl; + g_hash_table_destroy (priv->notify_added); + g_hash_table_destroy (priv->notify_modified); + g_hash_table_destroy (priv->notify_removed); - e_cal_component_get_attendee_list (comp, &attendees); - for (sl = attendees; sl != NULL; sl = sl->next) { - ECalComponentAttendee *ca = sl->data; - const gchar *text; + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (e_cal_model_parent_class)->finalize (object); +} - text = itip_strip_mailto (ca->value); - if (itip_address_is_user (registry, text)) { - if (ca->delto != NULL) - retval = 3; - else - retval = 2; - break; - } - } +static const gchar * +cal_model_get_color_for_component (ECalModel *model, + ECalModelComponent *comp_data) +{ + ESource *source; + ESourceSelectable *extension; + const gchar *color_spec; + const gchar *extension_name; + const gchar *uid; + gint i, first_empty = 0; - e_cal_component_free_attendee_list (attendees); - } - } else - icalcomponent_free (icalcomp); + static AssignedColorData assigned_colors[] = { + { "#BECEDD", NULL }, /* 190 206 221 Blue */ + { "#E2F0EF", NULL }, /* 226 240 239 Light Blue */ + { "#C6E2B7", NULL }, /* 198 226 183 Green */ + { "#E2F0D3", NULL }, /* 226 240 211 Light Green */ + { "#E2D4B7", NULL }, /* 226 212 183 Khaki */ + { "#EAEAC1", NULL }, /* 234 234 193 Light Khaki */ + { "#F0B8B7", NULL }, /* 240 184 183 Pink */ + { "#FED4D3", NULL }, /* 254 212 211 Light Pink */ + { "#E2C6E1", NULL }, /* 226 198 225 Purple */ + { "#F0E2EF", NULL } /* 240 226 239 Light Purple */ + }; - g_object_unref (comp); + g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); - return GINT_TO_POINTER (retval); + switch (e_cal_client_get_source_type (comp_data->client)) { + case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: + extension_name = E_SOURCE_EXTENSION_CALENDAR; + break; + case E_CAL_CLIENT_SOURCE_TYPE_TASKS: + extension_name = E_SOURCE_EXTENSION_TASK_LIST; + break; + case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: + extension_name = E_SOURCE_EXTENSION_MEMO_LIST; + break; + default: + g_return_val_if_reached (NULL); } - case E_CAL_MODEL_FIELD_SUMMARY : - return get_summary (comp_data); - case E_CAL_MODEL_FIELD_UID : - return get_uid (comp_data); + + source = e_client_get_source (E_CLIENT (comp_data->client)); + extension = e_source_get_extension (source, extension_name); + color_spec = e_source_selectable_get_color (extension); + + if (color_spec != NULL) { + g_free (comp_data->color); + comp_data->color = g_strdup (color_spec); + return comp_data->color; } - return (gpointer) ""; -} + uid = e_source_get_uid (source); -static void -set_categories (ECalModelComponent *comp_data, - const gchar *value) -{ - icalproperty *prop; + for (i = 0; i < G_N_ELEMENTS (assigned_colors); i++) { + GList *l; - /* remove all categories first */ - prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY); - while (prop) { - icalproperty *to_remove = prop; - prop = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY); + if (assigned_colors[i].uids == NULL) { + first_empty = i; + continue; + } - icalcomponent_remove_property (comp_data->icalcomp, to_remove); - icalproperty_free (to_remove); + for (l = assigned_colors[i].uids; l != NULL; l = l->next) + if (g_strcmp0 (l->data, uid) == 0) + return assigned_colors[i].color; } - if (comp_data->priv->categories_str) - g_string_free (comp_data->priv->categories_str, TRUE); - comp_data->priv->categories_str = NULL; + /* return the first unused color */ + assigned_colors[first_empty].uids = g_list_append ( + assigned_colors[first_empty].uids, g_strdup (uid)); - /* then set a new value; no need to populate categories_str, - * it'll be populated on demand (in the get_categories() function) - */ - if (value && *value) { - prop = icalproperty_new_categories (value); - icalcomponent_add_property (comp_data->icalcomp, prop); - } + return assigned_colors[first_empty].color; } -static void -set_classification (ECalModelComponent *comp_data, - const gchar *value) +static gint +cal_model_column_count (ETableModel *etm) { - icalproperty *prop; + return E_CAL_MODEL_FIELD_LAST; +} - prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CLASS_PROPERTY); - if (!value || !(*value)) { - if (prop) { - icalcomponent_remove_property (comp_data->icalcomp, prop); - icalproperty_free (prop); - } - } else { - icalproperty_class ical_class; +static gint +cal_model_row_count (ETableModel *etm) +{ + ECalModelPrivate *priv; + ECalModel *model = (ECalModel *) etm; - if (!g_ascii_strcasecmp (value, "PUBLIC")) - ical_class = ICAL_CLASS_PUBLIC; - else if (!g_ascii_strcasecmp (value, "PRIVATE")) - ical_class = ICAL_CLASS_PRIVATE; - else if (!g_ascii_strcasecmp (value, "CONFIDENTIAL")) - ical_class = ICAL_CLASS_CONFIDENTIAL; - else - ical_class = ICAL_CLASS_NONE; + g_return_val_if_fail (E_IS_CAL_MODEL (model), -1); - if (!prop) { - prop = icalproperty_new_class (ical_class); - icalcomponent_add_property (comp_data->icalcomp, prop); - } else - icalproperty_set_class (prop, ical_class); - } + priv = model->priv; + + return priv->objects->len; } static void -set_description (ECalModelComponent *comp_data, - const gchar *value) +cal_model_append_row (ETableModel *etm, + ETableModel *source, + gint row) { - icalproperty *prop; + ECalModelClass *model_class; + ECalModelComponent *comp_data; + ECalModel *model = (ECalModel *) etm; + gchar *uid = NULL; + GError *error = NULL; - /* remove old description(s) */ - prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY); - while (prop) { - icalproperty *next; + g_return_if_fail (E_IS_CAL_MODEL (model)); + g_return_if_fail (E_IS_TABLE_MODEL (source)); - next = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY); + comp_data = g_object_new (E_TYPE_CAL_MODEL_COMPONENT, NULL); - icalcomponent_remove_property (comp_data->icalcomp, prop); - icalproperty_free (prop); + comp_data->client = e_cal_model_ref_default_client (model); - prop = next; + if (comp_data->client == NULL) { + g_object_unref (comp_data); + return; } - /* now add the new description */ - if (!value || !(*value)) - return; + comp_data->icalcomp = e_cal_model_create_component_with_defaults (model, FALSE); - prop = icalproperty_new_description (value); - icalcomponent_add_property (comp_data->icalcomp, prop); -} + /* set values for our fields */ + set_categories (comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_CATEGORIES, row)); + set_classification (comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_CLASSIFICATION, row)); + set_description (comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_DESCRIPTION, row)); + set_summary (comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_SUMMARY, row)); -static void -datetime_to_zone (ECalClient *client, - struct icaltimetype *tt, - icaltimezone *tt_zone, - const gchar *tzid) -{ - icaltimezone *from, *to; - const gchar *tt_tzid = NULL; + if (e_table_model_value_at (source, E_CAL_MODEL_FIELD_DTSTART, row)) { + set_dtstart (model, comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_DTSTART, row)); + } else if (model->priv->get_default_time) { + time_t tt = model->priv->get_default_time (model, model->priv->get_default_time_user_data); - g_return_if_fail (tt != NULL); + if (tt > 0) { + struct icaltimetype itt = icaltime_from_timet_with_zone (tt, FALSE, e_cal_model_get_timezone (model)); + icalproperty *prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTSTART_PROPERTY); - if (tt_zone) - tt_tzid = icaltimezone_get_tzid (tt_zone); + if (prop) { + icalproperty_set_dtstart (prop, itt); + } else { + prop = icalproperty_new_dtstart (itt); + icalcomponent_add_property (comp_data->icalcomp, prop); + } + } + } - if (tt_tzid == NULL || tzid == NULL || - tt_tzid == tzid || g_str_equal (tt_tzid, tzid)) - return; + /* call the class' method for filling the component */ + model_class = (ECalModelClass *) G_OBJECT_GET_CLASS (model); + if (model_class->fill_component_from_model != NULL) { + model_class->fill_component_from_model (model, comp_data, source, row); + } - from = tt_zone; - to = icaltimezone_get_builtin_timezone_from_tzid (tzid); - if (!to) { - /* do not check failure here, maybe the zone is not available there */ - e_cal_client_get_timezone_sync (client, tzid, &to, NULL, NULL); + e_cal_client_create_object_sync ( + comp_data->client, comp_data->icalcomp, &uid, NULL, &error); + + if (error != NULL) { + g_warning ( + G_STRLOC ": Could not create the object! %s", + error->message); + + /* FIXME: show error dialog */ + g_error_free (error); + } else { + if (uid) + icalcomponent_set_uid (comp_data->icalcomp, uid); + + g_signal_emit (model, signals[ROW_APPENDED], 0); } - icaltimezone_convert_time (tt, from, to); + g_free (uid); + g_object_unref (comp_data); } -/* updates time in a component, and keeps the timezone used in it, if exists */ -void -e_cal_model_update_comp_time (ECalModel *model, - ECalModelComponent *comp_data, - gconstpointer time_value, - icalproperty_kind kind, - void (*set_func) (icalproperty *prop, - struct icaltimetype v), - icalproperty * (*new_func) (struct icaltimetype v)) -{ - ECellDateEditValue *dv = (ECellDateEditValue *) time_value; - icalproperty *prop; - icalparameter *param; - struct icaltimetype tt; - - g_return_if_fail (model != NULL); - g_return_if_fail (comp_data != NULL); - g_return_if_fail (set_func != NULL); - g_return_if_fail (new_func != NULL); +static gpointer +cal_model_value_at (ETableModel *etm, + gint col, + gint row) +{ + ECalModelPrivate *priv; + ECalModelComponent *comp_data; + ECalModel *model = (ECalModel *) etm; + ESourceRegistry *registry; - prop = icalcomponent_get_first_property (comp_data->icalcomp, kind); - if (prop) - param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER); - else - param = NULL; + g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); - /* If we are setting the property to NULL (i.e. removing it), then - * we remove it if it exists. */ - if (!dv) { - if (prop) { - icalcomponent_remove_property (comp_data->icalcomp, prop); - icalproperty_free (prop); - } + priv = model->priv; - return; - } + registry = e_cal_model_get_registry (model); - tt = dv->tt; - datetime_to_zone (comp_data->client, &tt, e_cal_model_get_timezone (model), param ? icalparameter_get_tzid (param) : NULL); + g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL); + g_return_val_if_fail (row >= 0 && row < priv->objects->len, NULL); - if (prop) { - set_func (prop, tt); - } else { - prop = new_func (tt); - icalcomponent_add_property (comp_data->icalcomp, prop); - } + comp_data = g_ptr_array_index (priv->objects, row); + g_return_val_if_fail (comp_data != NULL, NULL); + g_return_val_if_fail (comp_data->icalcomp != NULL, NULL); - if (param) { - const gchar *tzid = icalparameter_get_tzid (param); + switch (col) { + case E_CAL_MODEL_FIELD_CATEGORIES : + return get_categories (comp_data); + case E_CAL_MODEL_FIELD_CLASSIFICATION : + return get_classification (comp_data); + case E_CAL_MODEL_FIELD_COLOR : + return (gpointer) get_color (model, comp_data); + case E_CAL_MODEL_FIELD_COMPONENT : + return comp_data->icalcomp; + case E_CAL_MODEL_FIELD_DESCRIPTION : + return get_description (comp_data); + case E_CAL_MODEL_FIELD_DTSTART : + return (gpointer) get_dtstart (model, comp_data); + case E_CAL_MODEL_FIELD_CREATED : + return (gpointer) get_datetime_from_utc ( + model, comp_data, ICAL_CREATED_PROPERTY, + icalproperty_get_created, &comp_data->created); + case E_CAL_MODEL_FIELD_LASTMODIFIED : + return (gpointer) get_datetime_from_utc ( + model, comp_data, ICAL_LASTMODIFIED_PROPERTY, + icalproperty_get_lastmodified, &comp_data->lastmodified); + case E_CAL_MODEL_FIELD_HAS_ALARMS : + return GINT_TO_POINTER ( + icalcomponent_get_first_component ( + comp_data->icalcomp, + ICAL_VALARM_COMPONENT) != NULL); + case E_CAL_MODEL_FIELD_ICON : + { + ECalComponent *comp; + icalcomponent *icalcomp; + gint retval = 0; - /* If the TZID is set to "UTC", we don't want to save the TZID. */ - if (tzid && strcmp (tzid, "UTC")) { - if (param) { - icalparameter_set_tzid (param, (gchar *) tzid); - } else { - param = icalparameter_new_tzid ((gchar *) tzid); - icalproperty_add_parameter (prop, param); + comp = e_cal_component_new (); + icalcomp = icalcomponent_new_clone (comp_data->icalcomp); + if (e_cal_component_set_icalcomponent (comp, icalcomp)) { + if (e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_JOURNAL) { + g_object_unref (comp); + return GINT_TO_POINTER (retval); } - } else { - icalproperty_remove_parameter (prop, ICAL_TZID_PARAMETER); - } - } -} -static void -set_dtstart (ECalModel *model, - ECalModelComponent *comp_data, - gconstpointer value) -{ - e_cal_model_update_comp_time ( - model, comp_data, value, - ICAL_DTSTART_PROPERTY, - icalproperty_set_dtstart, - icalproperty_new_dtstart); -} + if (e_cal_component_has_recurrences (comp)) + retval = 1; + else if (itip_organizer_is_user (registry, comp, comp_data->client)) + retval = 3; + else { + GSList *attendees = NULL, *sl; -static void -set_summary (ECalModelComponent *comp_data, - const gchar *value) -{ - icalproperty *prop; + e_cal_component_get_attendee_list (comp, &attendees); + for (sl = attendees; sl != NULL; sl = sl->next) { + ECalComponentAttendee *ca = sl->data; + const gchar *text; - prop = icalcomponent_get_first_property ( - comp_data->icalcomp, ICAL_SUMMARY_PROPERTY); + text = itip_strip_mailto (ca->value); + if (itip_address_is_user (registry, text)) { + if (ca->delto != NULL) + retval = 3; + else + retval = 2; + break; + } + } - if (string_is_empty (value)) { - if (prop) { - icalcomponent_remove_property (comp_data->icalcomp, prop); - icalproperty_free (prop); - } - } else { - if (prop) - icalproperty_set_summary (prop, value); - else { - prop = icalproperty_new_summary (value); - icalcomponent_add_property (comp_data->icalcomp, prop); - } + e_cal_component_free_attendee_list (attendees); + } + } else + icalcomponent_free (icalcomp); + + g_object_unref (comp); + + return GINT_TO_POINTER (retval); } + case E_CAL_MODEL_FIELD_SUMMARY : + return get_summary (comp_data); + case E_CAL_MODEL_FIELD_UID : + return get_uid (comp_data); + } + + return (gpointer) ""; } static void -ecm_set_value_at (ETableModel *etm, - gint col, - gint row, - gconstpointer value) +cal_model_set_value_at (ETableModel *etm, + gint col, + gint row, + gconstpointer value) { ECalModelPrivate *priv; ECalModelComponent *comp_data; @@ -1759,407 +1460,690 @@ ecm_set_value_at (ETableModel *etm, } } -/** - * e_cal_model_test_row_editable - * @model: an #ECalModel - * @row: Row of our interest. -1 is editable only when default client is - * editable. - * - * Checks if component at @row is editable or not. It doesn't check bounds - * for @row. - * - * Returns: Whether @row is editable or not. - **/ -gboolean -e_cal_model_test_row_editable (ECalModel *model, - gint row) +static gboolean +cal_model_is_cell_editable (ETableModel *etm, + gint col, + gint row) { - gboolean readonly; - ECalClient *client = NULL; + ECalModelPrivate *priv; + ECalModel *model = (ECalModel *) etm; + + g_return_val_if_fail (E_IS_CAL_MODEL (model), FALSE); + + priv = model->priv; + + g_return_val_if_fail (col >= 0 && col <= E_CAL_MODEL_FIELD_LAST, FALSE); + g_return_val_if_fail (row >= -1 || (row >= 0 && row < priv->objects->len), FALSE); + + if (!e_cal_model_test_row_editable (E_CAL_MODEL (etm), row)) + return FALSE; + + switch (col) { + case E_CAL_MODEL_FIELD_CATEGORIES : + case E_CAL_MODEL_FIELD_CLASSIFICATION : + case E_CAL_MODEL_FIELD_DESCRIPTION : + case E_CAL_MODEL_FIELD_DTSTART : + case E_CAL_MODEL_FIELD_SUMMARY : + return TRUE; + } + + return FALSE; +} + +static gpointer +cal_model_duplicate_value (ETableModel *etm, + gint col, + gconstpointer value) +{ + g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL); + + switch (col) { + case E_CAL_MODEL_FIELD_CATEGORIES : + case E_CAL_MODEL_FIELD_CLASSIFICATION : + case E_CAL_MODEL_FIELD_DESCRIPTION : + case E_CAL_MODEL_FIELD_SUMMARY : + return g_strdup (value); + case E_CAL_MODEL_FIELD_HAS_ALARMS : + case E_CAL_MODEL_FIELD_ICON : + case E_CAL_MODEL_FIELD_COLOR : + return (gpointer) value; + case E_CAL_MODEL_FIELD_COMPONENT : + return icalcomponent_new_clone ((icalcomponent *) value); + case E_CAL_MODEL_FIELD_DTSTART : + case E_CAL_MODEL_FIELD_CREATED : + case E_CAL_MODEL_FIELD_LASTMODIFIED : + if (value) { + ECellDateEditValue *dv, *orig_dv; + + orig_dv = (ECellDateEditValue *) value; + dv = g_new0 (ECellDateEditValue, 1); + *dv = *orig_dv; + + return dv; + } + break; + } + + return NULL; +} + +static void +cal_model_free_value (ETableModel *etm, + gint col, + gpointer value) +{ + g_return_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST); + + switch (col) { + case E_CAL_MODEL_FIELD_CATEGORIES : + case E_CAL_MODEL_FIELD_DESCRIPTION : + case E_CAL_MODEL_FIELD_SUMMARY : + if (value) + g_free (value); + break; + case E_CAL_MODEL_FIELD_CLASSIFICATION : + case E_CAL_MODEL_FIELD_HAS_ALARMS : + case E_CAL_MODEL_FIELD_ICON : + case E_CAL_MODEL_FIELD_COLOR : + break; + case E_CAL_MODEL_FIELD_DTSTART : + case E_CAL_MODEL_FIELD_CREATED : + case E_CAL_MODEL_FIELD_LASTMODIFIED : + if (value) + g_free (value); + break; + case E_CAL_MODEL_FIELD_COMPONENT : + if (value) + icalcomponent_free ((icalcomponent *) value); + break; + } +} - if (row != -1) { - ECalModelComponent *comp_data; +static gpointer +cal_model_initialize_value (ETableModel *etm, + gint col) +{ + ECalModelPrivate *priv; + ECalModel *model = (ECalModel *) etm; - comp_data = e_cal_model_get_component_at (model, row); + g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); + g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL); - if (comp_data != NULL && comp_data->client != NULL) - client = g_object_ref (comp_data->client); + priv = model->priv; - } else { - client = e_cal_model_ref_default_client (model); + switch (col) { + case E_CAL_MODEL_FIELD_CATEGORIES : + return g_strdup (priv->default_category ? priv->default_category:""); + case E_CAL_MODEL_FIELD_CLASSIFICATION : + case E_CAL_MODEL_FIELD_DESCRIPTION : + case E_CAL_MODEL_FIELD_SUMMARY : + return g_strdup (""); + case E_CAL_MODEL_FIELD_DTSTART : + case E_CAL_MODEL_FIELD_CREATED : + case E_CAL_MODEL_FIELD_LASTMODIFIED : + case E_CAL_MODEL_FIELD_HAS_ALARMS : + case E_CAL_MODEL_FIELD_ICON : + case E_CAL_MODEL_FIELD_COLOR : + case E_CAL_MODEL_FIELD_COMPONENT : + return NULL; } - readonly = (client == NULL); - - if (!readonly) - readonly = e_client_is_readonly (E_CLIENT (client)); - - g_clear_object (&client); - - return !readonly; + return NULL; } static gboolean -ecm_is_cell_editable (ETableModel *etm, - gint col, - gint row) +cal_model_value_is_empty (ETableModel *etm, + gint col, + gconstpointer value) { ECalModelPrivate *priv; ECalModel *model = (ECalModel *) etm; - g_return_val_if_fail (E_IS_CAL_MODEL (model), FALSE); + g_return_val_if_fail (E_IS_CAL_MODEL (model), TRUE); + g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, TRUE); priv = model->priv; - g_return_val_if_fail (col >= 0 && col <= E_CAL_MODEL_FIELD_LAST, FALSE); - g_return_val_if_fail (row >= -1 || (row >= 0 && row < priv->objects->len), FALSE); + switch (col) { + case E_CAL_MODEL_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 + * ecm_initialize_value(). + */ + if (priv->default_category && value && strcmp (priv->default_category, value) == 0) + return TRUE; + else + return string_is_empty (value); + case E_CAL_MODEL_FIELD_CLASSIFICATION : + case E_CAL_MODEL_FIELD_DESCRIPTION : + case E_CAL_MODEL_FIELD_SUMMARY : + return string_is_empty (value); + case E_CAL_MODEL_FIELD_DTSTART : + case E_CAL_MODEL_FIELD_CREATED : + case E_CAL_MODEL_FIELD_LASTMODIFIED : + return value ? FALSE : TRUE; + case E_CAL_MODEL_FIELD_HAS_ALARMS : + case E_CAL_MODEL_FIELD_ICON : + case E_CAL_MODEL_FIELD_COLOR : + case E_CAL_MODEL_FIELD_COMPONENT : + return TRUE; + } - if (!e_cal_model_test_row_editable (E_CAL_MODEL (etm), row)) - return FALSE; + return TRUE; +} + +static gchar * +cal_model_value_to_string (ETableModel *etm, + gint col, + gconstpointer value) +{ + g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, g_strdup ("")); switch (col) { case E_CAL_MODEL_FIELD_CATEGORIES : case E_CAL_MODEL_FIELD_CLASSIFICATION : case E_CAL_MODEL_FIELD_DESCRIPTION : - case E_CAL_MODEL_FIELD_DTSTART : case E_CAL_MODEL_FIELD_SUMMARY : - return TRUE; + return g_strdup (value); + case E_CAL_MODEL_FIELD_DTSTART : + case E_CAL_MODEL_FIELD_CREATED : + case E_CAL_MODEL_FIELD_LASTMODIFIED : + return e_cal_model_date_value_to_string (E_CAL_MODEL (etm), value); + case E_CAL_MODEL_FIELD_ICON : + if (GPOINTER_TO_INT (value) == 0) + return g_strdup (_("Normal")); + else if (GPOINTER_TO_INT (value) == 1) + return g_strdup (_("Recurring")); + else + return g_strdup (_("Assigned")); + case E_CAL_MODEL_FIELD_HAS_ALARMS : + return g_strdup (value ? _("Yes") : _("No")); + case E_CAL_MODEL_FIELD_COLOR : + case E_CAL_MODEL_FIELD_COMPONENT : + return g_strdup (""); } - return FALSE; + return g_strdup (""); } static void -ecm_append_row (ETableModel *etm, - ETableModel *source, - gint row) +e_cal_model_class_init (ECalModelClass *class) { - ECalModelClass *model_class; - ECalModelComponent *comp_data; - ECalModel *model = (ECalModel *) etm; - gchar *uid = NULL; - GError *error = NULL; + GObjectClass *object_class; + ETableModelClass *etm_class; - g_return_if_fail (E_IS_CAL_MODEL (model)); - g_return_if_fail (E_IS_TABLE_MODEL (source)); + g_type_class_add_private (class, sizeof (ECalModelPrivate)); - comp_data = g_object_new (E_TYPE_CAL_MODEL_COMPONENT, NULL); + object_class = G_OBJECT_CLASS (class); + object_class->set_property = cal_model_set_property; + object_class->get_property = cal_model_get_property; + object_class->constructed = cal_model_constructed; + object_class->dispose = cal_model_dispose; + object_class->finalize = cal_model_finalize; - comp_data->client = e_cal_model_ref_default_client (model); + class->get_color_for_component = cal_model_get_color_for_component; + class->fill_component_from_model = NULL; - if (comp_data->client == NULL) { - g_object_unref (comp_data); - return; - } + etm_class = E_TABLE_MODEL_CLASS (class); + etm_class->column_count = cal_model_column_count; + etm_class->row_count = cal_model_row_count; + etm_class->append_row = cal_model_append_row; + etm_class->value_at = cal_model_value_at; + etm_class->set_value_at = cal_model_set_value_at; + etm_class->is_cell_editable = cal_model_is_cell_editable; + etm_class->duplicate_value = cal_model_duplicate_value; + etm_class->free_value = cal_model_free_value; + etm_class->initialize_value = cal_model_initialize_value; + etm_class->value_is_empty = cal_model_value_is_empty; + etm_class->value_to_string = cal_model_value_to_string; - comp_data->icalcomp = e_cal_model_create_component_with_defaults (model, FALSE); + g_object_class_install_property ( + object_class, + PROP_COMPRESS_WEEKEND, + g_param_spec_boolean ( + "compress-weekend", + "Compress Weekend", + NULL, + FALSE, + G_PARAM_READWRITE)); - /* set values for our fields */ - set_categories (comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_CATEGORIES, row)); - set_classification (comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_CLASSIFICATION, row)); - set_description (comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_DESCRIPTION, row)); - set_summary (comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_SUMMARY, row)); + g_object_class_install_property ( + object_class, + PROP_CONFIRM_DELETE, + g_param_spec_boolean ( + "confirm-delete", + "Confirm Delete", + NULL, + TRUE, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_DEFAULT_CLIENT, + g_param_spec_object ( + "default-client", + "Default ECalClient", + NULL, + E_TYPE_CAL_CLIENT, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_DEFAULT_REMINDER_INTERVAL, + g_param_spec_int ( + "default-reminder-interval", + "Default Reminder Interval", + NULL, + G_MININT, + G_MAXINT, + 0, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_DEFAULT_REMINDER_UNITS, + g_param_spec_enum ( + "default-reminder-units", + "Default Reminder Units", + NULL, + E_TYPE_DURATION_TYPE, + E_DURATION_MINUTES, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_REGISTRY, + g_param_spec_object ( + "registry", + "Registry", + "Data source registry", + E_TYPE_SOURCE_REGISTRY, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property ( + object_class, + PROP_TIMEZONE, + g_param_spec_pointer ( + "timezone", + "Time Zone", + NULL, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_USE_24_HOUR_FORMAT, + g_param_spec_boolean ( + "use-24-hour-format", + "Use 24-Hour Format", + NULL, + TRUE, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_USE_DEFAULT_REMINDER, + g_param_spec_boolean ( + "use-default-reminder", + "Use Default Reminder", + NULL, + FALSE, + G_PARAM_READWRITE)); + + g_object_class_install_property ( + object_class, + PROP_WEEK_START_DAY, + g_param_spec_enum ( + "week-start-day", + "Week Start Day", + NULL, + E_TYPE_DATE_WEEKDAY, + G_DATE_MONDAY, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_MONDAY, + g_param_spec_boolean ( + "work-day-monday", + "Work Day: Monday", + "Whether Monday is a work day", + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_TUESDAY, + g_param_spec_boolean ( + "work-day-tuesday", + "Work Day: Tuesday", + "Whether Tuesday is a work day", + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); - if (e_table_model_value_at (source, E_CAL_MODEL_FIELD_DTSTART, row)) { - set_dtstart (model, comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_DTSTART, row)); - } else if (model->priv->get_default_time) { - time_t tt = model->priv->get_default_time (model, model->priv->get_default_time_user_data); + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_WEDNESDAY, + g_param_spec_boolean ( + "work-day-wednesday", + "Work Day: Wednesday", + "Whether Wednesday is a work day", + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); - if (tt > 0) { - struct icaltimetype itt = icaltime_from_timet_with_zone (tt, FALSE, e_cal_model_get_timezone (model)); - icalproperty *prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTSTART_PROPERTY); + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_THURSDAY, + g_param_spec_boolean ( + "work-day-thursday", + "Work Day: Thursday", + "Whether Thursday is a work day", + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); - if (prop) { - icalproperty_set_dtstart (prop, itt); - } else { - prop = icalproperty_new_dtstart (itt); - icalcomponent_add_property (comp_data->icalcomp, prop); - } - } - } + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_FRIDAY, + g_param_spec_boolean ( + "work-day-friday", + "Work Day: Friday", + "Whether Friday is a work day", + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); - /* call the class' method for filling the component */ - model_class = (ECalModelClass *) G_OBJECT_GET_CLASS (model); - if (model_class->fill_component_from_model != NULL) { - model_class->fill_component_from_model (model, comp_data, source, row); - } + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_SATURDAY, + g_param_spec_boolean ( + "work-day-saturday", + "Work Day: Saturday", + "Whether Saturday is a work day", + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); - e_cal_client_create_object_sync ( - comp_data->client, comp_data->icalcomp, &uid, NULL, &error); + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_SUNDAY, + g_param_spec_boolean ( + "work-day-sunday", + "Work Day: Sunday", + "Whether Sunday is a work day", + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); - if (error != NULL) { - g_warning ( - G_STRLOC ": Could not create the object! %s", - error->message); + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_END_HOUR, + g_param_spec_int ( + "work-day-end-hour", + "Work Day End Hour", + NULL, + 0, + 23, + 0, + G_PARAM_READWRITE)); - /* FIXME: show error dialog */ - g_error_free (error); - } else { - if (uid) - icalcomponent_set_uid (comp_data->icalcomp, uid); + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_END_MINUTE, + g_param_spec_int ( + "work-day-end-minute", + "Work Day End Minute", + NULL, + 0, + 59, + 0, + G_PARAM_READWRITE)); - g_signal_emit (model, signals[ROW_APPENDED], 0); - } + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_START_HOUR, + g_param_spec_int ( + "work-day-start-hour", + "Work Day Start Hour", + NULL, + 0, + 23, + 0, + G_PARAM_READWRITE)); - g_free (uid); - g_object_unref (comp_data); -} + g_object_class_install_property ( + object_class, + PROP_WORK_DAY_START_MINUTE, + g_param_spec_int ( + "work-day-start-minute", + "Work Day Start Minute", + NULL, + 0, + 59, + 0, + G_PARAM_READWRITE)); -static gpointer -ecm_duplicate_value (ETableModel *etm, - gint col, - gconstpointer value) -{ - g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL); + signals[TIME_RANGE_CHANGED] = g_signal_new ( + "time_range_changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ECalModelClass, time_range_changed), + NULL, NULL, + e_marshal_VOID__LONG_LONG, + G_TYPE_NONE, 2, + G_TYPE_LONG, + G_TYPE_LONG); - switch (col) { - case E_CAL_MODEL_FIELD_CATEGORIES : - case E_CAL_MODEL_FIELD_CLASSIFICATION : - case E_CAL_MODEL_FIELD_DESCRIPTION : - case E_CAL_MODEL_FIELD_SUMMARY : - return g_strdup (value); - case E_CAL_MODEL_FIELD_HAS_ALARMS : - case E_CAL_MODEL_FIELD_ICON : - case E_CAL_MODEL_FIELD_COLOR : - return (gpointer) value; - case E_CAL_MODEL_FIELD_COMPONENT : - return icalcomponent_new_clone ((icalcomponent *) value); - case E_CAL_MODEL_FIELD_DTSTART : - case E_CAL_MODEL_FIELD_CREATED : - case E_CAL_MODEL_FIELD_LASTMODIFIED : - if (value) { - ECellDateEditValue *dv, *orig_dv; + signals[ROW_APPENDED] = g_signal_new ( + "row_appended", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ECalModelClass, row_appended), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); - orig_dv = (ECellDateEditValue *) value; - dv = g_new0 (ECellDateEditValue, 1); - *dv = *orig_dv; + signals[COMPS_DELETED] = g_signal_new ( + "comps_deleted", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ECalModelClass, comps_deleted), + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); - return dv; - } - break; - } + signals[CAL_VIEW_PROGRESS] = g_signal_new ( + "cal_view_progress", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ECalModelClass, cal_view_progress), + NULL, NULL, + e_marshal_VOID__STRING_INT_INT, + G_TYPE_NONE, 3, + G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_INT); - return NULL; -} + signals[CAL_VIEW_COMPLETE] = g_signal_new ( + "cal_view_complete", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ECalModelClass, cal_view_complete), + NULL, NULL, + e_marshal_VOID__BOXED_INT, + G_TYPE_NONE, 2, + G_TYPE_ERROR, + G_TYPE_INT); -static void -ecm_free_value (ETableModel *etm, - gint col, - gpointer value) -{ - g_return_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST); + signals[STATUS_MESSAGE] = g_signal_new ( + "status-message", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (ECalModelClass, status_message), + NULL, NULL, + e_marshal_VOID__STRING_DOUBLE, + G_TYPE_NONE, 2, + G_TYPE_STRING, + G_TYPE_DOUBLE); - switch (col) { - case E_CAL_MODEL_FIELD_CATEGORIES : - case E_CAL_MODEL_FIELD_DESCRIPTION : - case E_CAL_MODEL_FIELD_SUMMARY : - if (value) - g_free (value); - break; - case E_CAL_MODEL_FIELD_CLASSIFICATION : - case E_CAL_MODEL_FIELD_HAS_ALARMS : - case E_CAL_MODEL_FIELD_ICON : - case E_CAL_MODEL_FIELD_COLOR : - break; - case E_CAL_MODEL_FIELD_DTSTART : - case E_CAL_MODEL_FIELD_CREATED : - case E_CAL_MODEL_FIELD_LASTMODIFIED : - if (value) - g_free (value); - break; - case E_CAL_MODEL_FIELD_COMPONENT : - if (value) - icalcomponent_free ((icalcomponent *) value); - break; - } + signals[TIMEZONE_CHANGED] = g_signal_new ( + "timezone-changed", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ECalModelClass, timezone_changed), + NULL, NULL, + e_marshal_VOID__POINTER_POINTER, + G_TYPE_NONE, 2, + G_TYPE_POINTER, + G_TYPE_POINTER); } -static gpointer -ecm_initialize_value (ETableModel *etm, - gint col) +static void +e_cal_model_init (ECalModel *model) { - ECalModelPrivate *priv; - ECalModel *model = (ECalModel *) etm; + model->priv = E_CAL_MODEL_GET_PRIVATE (model); - g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); - g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, NULL); + g_mutex_init (&model->priv->clients_lock); - priv = model->priv; + /* match none by default */ + model->priv->start = -1; + model->priv->end = -1; + model->priv->search_sexp = NULL; + model->priv->full_sexp = g_strdup ("#f"); - switch (col) { - case E_CAL_MODEL_FIELD_CATEGORIES : - return g_strdup (priv->default_category ? priv->default_category:""); - case E_CAL_MODEL_FIELD_CLASSIFICATION : - case E_CAL_MODEL_FIELD_DESCRIPTION : - case E_CAL_MODEL_FIELD_SUMMARY : - return g_strdup (""); - case E_CAL_MODEL_FIELD_DTSTART : - case E_CAL_MODEL_FIELD_CREATED : - case E_CAL_MODEL_FIELD_LASTMODIFIED : - case E_CAL_MODEL_FIELD_HAS_ALARMS : - case E_CAL_MODEL_FIELD_ICON : - case E_CAL_MODEL_FIELD_COLOR : - case E_CAL_MODEL_FIELD_COMPONENT : - return NULL; - } + model->priv->objects = g_ptr_array_new (); + model->priv->kind = ICAL_NO_COMPONENT; + model->priv->flags = 0; - return NULL; + model->priv->use_24_hour_format = TRUE; + + model->priv->in_added = FALSE; + model->priv->in_modified = FALSE; + model->priv->in_removed = FALSE; + model->priv->notify_added = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); + model->priv->notify_modified = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); + model->priv->notify_removed = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); + g_mutex_init (&model->priv->notify_lock); + + model->priv->loading_clients = g_cancellable_new (); } -static gboolean -ecm_value_is_empty (ETableModel *etm, - gint col, - gconstpointer value) +/* updates time in a component, and keeps the timezone used in it, if exists */ +void +e_cal_model_update_comp_time (ECalModel *model, + ECalModelComponent *comp_data, + gconstpointer time_value, + icalproperty_kind kind, + void (*set_func) (icalproperty *prop, + struct icaltimetype v), + icalproperty * (*new_func) (struct icaltimetype v)) { - ECalModelPrivate *priv; - ECalModel *model = (ECalModel *) etm; + ECellDateEditValue *dv = (ECellDateEditValue *) time_value; + icalproperty *prop; + icalparameter *param; + struct icaltimetype tt; - g_return_val_if_fail (E_IS_CAL_MODEL (model), TRUE); - g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, TRUE); + g_return_if_fail (model != NULL); + g_return_if_fail (comp_data != NULL); + g_return_if_fail (set_func != NULL); + g_return_if_fail (new_func != NULL); - priv = model->priv; + prop = icalcomponent_get_first_property (comp_data->icalcomp, kind); + if (prop) + param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER); + else + param = NULL; - switch (col) { - case E_CAL_MODEL_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 - * ecm_initialize_value(). - */ - if (priv->default_category && value && strcmp (priv->default_category, value) == 0) - return TRUE; - else - return string_is_empty (value); - case E_CAL_MODEL_FIELD_CLASSIFICATION : - case E_CAL_MODEL_FIELD_DESCRIPTION : - case E_CAL_MODEL_FIELD_SUMMARY : - return string_is_empty (value); - case E_CAL_MODEL_FIELD_DTSTART : - case E_CAL_MODEL_FIELD_CREATED : - case E_CAL_MODEL_FIELD_LASTMODIFIED : - return value ? FALSE : TRUE; - case E_CAL_MODEL_FIELD_HAS_ALARMS : - case E_CAL_MODEL_FIELD_ICON : - case E_CAL_MODEL_FIELD_COLOR : - case E_CAL_MODEL_FIELD_COMPONENT : - return TRUE; - } + /* If we are setting the property to NULL (i.e. removing it), then + * we remove it if it exists. */ + if (!dv) { + if (prop) { + icalcomponent_remove_property (comp_data->icalcomp, prop); + icalproperty_free (prop); + } - return TRUE; -} + return; + } -static gchar * -ecm_value_to_string (ETableModel *etm, - gint col, - gconstpointer value) -{ - g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_FIELD_LAST, g_strdup ("")); + tt = dv->tt; + datetime_to_zone (comp_data->client, &tt, e_cal_model_get_timezone (model), param ? icalparameter_get_tzid (param) : NULL); - switch (col) { - case E_CAL_MODEL_FIELD_CATEGORIES : - case E_CAL_MODEL_FIELD_CLASSIFICATION : - case E_CAL_MODEL_FIELD_DESCRIPTION : - case E_CAL_MODEL_FIELD_SUMMARY : - return g_strdup (value); - case E_CAL_MODEL_FIELD_DTSTART : - case E_CAL_MODEL_FIELD_CREATED : - case E_CAL_MODEL_FIELD_LASTMODIFIED : - return e_cal_model_date_value_to_string (E_CAL_MODEL (etm), value); - case E_CAL_MODEL_FIELD_ICON : - if (GPOINTER_TO_INT (value) == 0) - return g_strdup (_("Normal")); - else if (GPOINTER_TO_INT (value) == 1) - return g_strdup (_("Recurring")); - else - return g_strdup (_("Assigned")); - case E_CAL_MODEL_FIELD_HAS_ALARMS : - return g_strdup (value ? _("Yes") : _("No")); - case E_CAL_MODEL_FIELD_COLOR : - case E_CAL_MODEL_FIELD_COMPONENT : - return g_strdup (""); + if (prop) { + set_func (prop, tt); + } else { + prop = new_func (tt); + icalcomponent_add_property (comp_data->icalcomp, prop); } - return g_strdup (""); -} - -/* ECalModel class methods */ + if (param) { + const gchar *tzid = icalparameter_get_tzid (param); -typedef struct { - const gchar *color; - GList *uids; -} AssignedColorData; + /* If the TZID is set to "UTC", we don't want to save the TZID. */ + if (tzid && strcmp (tzid, "UTC")) { + if (param) { + icalparameter_set_tzid (param, (gchar *) tzid); + } else { + param = icalparameter_new_tzid ((gchar *) tzid); + icalproperty_add_parameter (prop, param); + } + } else { + icalproperty_remove_parameter (prop, ICAL_TZID_PARAMETER); + } + } +} -static const gchar * -ecm_get_color_for_component (ECalModel *model, - ECalModelComponent *comp_data) +/** + * e_cal_model_test_row_editable + * @model: an #ECalModel + * @row: Row of our interest. -1 is editable only when default client is + * editable. + * + * Checks if component at @row is editable or not. It doesn't check bounds + * for @row. + * + * Returns: Whether @row is editable or not. + **/ +gboolean +e_cal_model_test_row_editable (ECalModel *model, + gint row) { - ESource *source; - ESourceSelectable *extension; - const gchar *color_spec; - const gchar *extension_name; - const gchar *uid; - gint i, first_empty = 0; - - static AssignedColorData assigned_colors[] = { - { "#BECEDD", NULL }, /* 190 206 221 Blue */ - { "#E2F0EF", NULL }, /* 226 240 239 Light Blue */ - { "#C6E2B7", NULL }, /* 198 226 183 Green */ - { "#E2F0D3", NULL }, /* 226 240 211 Light Green */ - { "#E2D4B7", NULL }, /* 226 212 183 Khaki */ - { "#EAEAC1", NULL }, /* 234 234 193 Light Khaki */ - { "#F0B8B7", NULL }, /* 240 184 183 Pink */ - { "#FED4D3", NULL }, /* 254 212 211 Light Pink */ - { "#E2C6E1", NULL }, /* 226 198 225 Purple */ - { "#F0E2EF", NULL } /* 240 226 239 Light Purple */ - }; + gboolean readonly; + ECalClient *client = NULL; - g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); + if (row != -1) { + ECalModelComponent *comp_data; - switch (e_cal_client_get_source_type (comp_data->client)) { - case E_CAL_CLIENT_SOURCE_TYPE_EVENTS: - extension_name = E_SOURCE_EXTENSION_CALENDAR; - break; - case E_CAL_CLIENT_SOURCE_TYPE_TASKS: - extension_name = E_SOURCE_EXTENSION_TASK_LIST; - break; - case E_CAL_CLIENT_SOURCE_TYPE_MEMOS: - extension_name = E_SOURCE_EXTENSION_MEMO_LIST; - break; - default: - g_return_val_if_reached (NULL); - } + comp_data = e_cal_model_get_component_at (model, row); - source = e_client_get_source (E_CLIENT (comp_data->client)); - extension = e_source_get_extension (source, extension_name); - color_spec = e_source_selectable_get_color (extension); + if (comp_data != NULL && comp_data->client != NULL) + client = g_object_ref (comp_data->client); - if (color_spec != NULL) { - g_free (comp_data->color); - comp_data->color = g_strdup (color_spec); - return comp_data->color; + } else { + client = e_cal_model_ref_default_client (model); } - uid = e_source_get_uid (source); - - for (i = 0; i < G_N_ELEMENTS (assigned_colors); i++) { - GList *l; - - if (assigned_colors[i].uids == NULL) { - first_empty = i; - continue; - } + readonly = (client == NULL); - for (l = assigned_colors[i].uids; l != NULL; l = l->next) - if (g_strcmp0 (l->data, uid) == 0) - return assigned_colors[i].color; - } + if (!readonly) + readonly = e_client_is_readonly (E_CLIENT (client)); - /* return the first unused color */ - assigned_colors[first_empty].uids = g_list_append ( - assigned_colors[first_empty].uids, g_strdup (uid)); + g_clear_object (&client); - return assigned_colors[first_empty].color; + return !readonly; } gboolean @@ -4045,7 +4029,7 @@ e_cal_model_get_color_for_component (ECalModel *model, color = model_class->get_color_for_component (model, comp_data); if (!color) - color = ecm_get_color_for_component (model, comp_data); + color = cal_model_get_color_for_component (model, comp_data); return color; } -- cgit v1.2.3