aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-cal-model-calendar.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/e-cal-model-calendar.c')
-rw-r--r--calendar/gui/e-cal-model-calendar.c447
1 files changed, 447 insertions, 0 deletions
diff --git a/calendar/gui/e-cal-model-calendar.c b/calendar/gui/e-cal-model-calendar.c
new file mode 100644
index 0000000000..246d1c5ca8
--- /dev/null
+++ b/calendar/gui/e-cal-model-calendar.c
@@ -0,0 +1,447 @@
+/* Evolution calendar - Data model for ETable
+ *
+ * Copyright (C) 2000 Ximian, Inc.
+ * Copyright (C) 2000 Ximian, Inc.
+ *
+ * Authors: Rodrigo Moya <rodrigo@ximian.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <libgnome/gnome-i18n.h>
+#include <gal/util/e-util.h>
+#include "e-cal-model-calendar.h"
+#include "e-cell-date-edit-text.h"
+#include "misc.h"
+
+struct _ECalModelCalendarPrivate {
+};
+
+static void ecmc_class_init (ECalModelCalendarClass *klass);
+static void ecmc_init (ECalModelCalendar *model, ECalModelCalendarClass *klass);
+static void ecmc_finalize (GObject *object);
+static int ecmc_column_count (ETableModel *etm);
+static void *ecmc_value_at (ETableModel *etm, int col, int row);
+static void ecmc_set_value_at (ETableModel *etm, int col, int row, const void *value);
+static gboolean ecmc_is_cell_editable (ETableModel *etm, int col, int row);
+static void ecmc_append_row (ETableModel *etm, ETableModel *source, int row);
+static void *ecmc_duplicate_value (ETableModel *etm, int col, const void *value);
+static void ecmc_free_value (ETableModel *etm, int col, void *value);
+static void *ecmc_initialize_value (ETableModel *etm, int col);
+static gboolean ecmc_value_is_empty (ETableModel *etm, int col, const void *value);
+static char *ecmc_value_to_string (ETableModel *etm, int col, const void *value);
+
+static GObjectClass *parent_class = NULL;
+
+E_MAKE_TYPE (e_cal_model_calendar, "ECalModelCalendar", ECalModelCalendar, ecmc_class_init,
+ ecmc_init, E_TYPE_CAL_MODEL);
+
+static void
+ecmc_class_init (ECalModelCalendarClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_class->finalize = ecmc_finalize;
+
+ 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->append_row = ecmc_append_row;
+ 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;
+}
+
+static void
+ecmc_init (ECalModelCalendar *model, ECalModelCalendarClass *klass)
+{
+ ECalModelCalendarPrivate *priv;
+
+ priv = g_new0 (ECalModelCalendarPrivate, 1);
+ model->priv = priv;
+
+ e_cal_model_set_component_kind (E_CAL_MODEL (model), ICAL_VEVENT_COMPONENT);
+}
+
+static void
+ecmc_finalize (GObject *object)
+{
+ ECalModelCalendarPrivate *priv;
+ ECalModelCalendar *model = (ECalModelCalendar *) object;
+
+ g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model));
+
+ priv = model->priv;
+ if (priv) {
+ g_free (priv);
+ model->priv = NULL;
+ }
+
+ if (parent_class->finalize)
+ parent_class->finalize (object);
+}
+
+/* ETableModel methods */
+static int
+ecmc_column_count (ETableModel *etm)
+{
+ return E_CAL_MODEL_CALENDAR_FIELD_LAST;
+}
+
+static ECellDateEditValue *
+get_dtend (ECalModelComponent *comp_data)
+{
+ struct icaltimetype tt_end;
+
+ if (!comp_data->dtend) {
+ icaltimezone *zone;
+
+ tt_end = icalcomponent_get_dtend (comp_data->icalcomp);
+ if (!icaltime_is_valid_time (tt_end))
+ return NULL;
+
+ comp_data->dtend = g_new0 (ECellDateEditValue, 1);
+ comp_data->dtend->tt = tt_end;
+
+ /* FIXME: handle errors */
+ cal_client_get_timezone (comp_data->client,
+ icaltimezone_get_tzid (icaltimezone_get_builtin_timezone (tt_end.zone)),
+ &zone);
+ comp_data->dtend->zone = zone;
+ }
+
+ return comp_data->dtend;
+}
+
+static void *
+get_location (ECalModelComponent *comp_data)
+{
+ icalproperty *prop;
+
+ prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_LOCATION_PROPERTY);
+ if (prop)
+ return (void *) icalproperty_get_location (prop);
+
+ return NULL;
+}
+
+static void *
+get_transparency (ECalModelComponent *comp_data)
+{
+ icalproperty *prop;
+
+ prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_TRANSP_PROPERTY);
+ if (prop) {
+ const char *transp;
+
+ transp = icalproperty_get_transp (prop);
+ if (strcasecmp (transp, "TRANSPARENT") == 0)
+ return _("Free");
+ else if (strcasecmp (transp, "OPAQUE") == 0)
+ return _("Busy");
+ }
+
+ return NULL;
+}
+
+static void *
+ecmc_value_at (ETableModel *etm, int col, int row)
+{
+ ECalModelComponent *comp_data;
+ ECalModelCalendarPrivate *priv;
+ ECalModelCalendar *model = (ECalModelCalendar *) etm;
+
+ g_return_val_if_fail (E_IS_CAL_MODEL_CALENDAR (model), NULL);
+
+ priv = model->priv;
+
+ 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 (parent_class)->value_at (etm, col, row);
+
+ comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row);
+ if (!comp_data)
+ return "";
+
+ switch (col) {
+ case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
+ return get_dtend (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 "";
+}
+
+static void
+set_dtend (ECalModelComponent *comp_data, const void *value)
+{
+ icalproperty *prop;
+ ECellDateEditValue *dv = (ECellDateEditValue *) value;
+
+ prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTEND_PROPERTY);
+ if (!dv) {
+ if (prop) {
+ icalcomponent_remove_property (comp_data->icalcomp, prop);
+ icalproperty_free (prop);
+ }
+ } else
+ icalcomponent_set_dtend (comp_data->icalcomp, dv->tt);
+}
+
+static void
+set_location (ECalModelComponent *comp_data, const void *value)
+{
+ icalproperty *prop;
+
+ prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_LOCATION_PROPERTY);
+
+ if (string_is_empty (value)) {
+ if (prop) {
+ icalcomponent_remove_property (comp_data->icalcomp, prop);
+ icalproperty_free (prop);
+ }
+ } else {
+ if (prop)
+ icalproperty_set_location (prop, (const char *) value);
+ else {
+ prop = icalproperty_new_location ((const char *) value);
+ icalcomponent_add_property (comp_data->icalcomp, prop);
+ }
+ }
+}
+
+static void
+set_transparency (ECalModelComponent *comp_data, const void *value)
+{
+ icalproperty *prop;
+
+ prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_TRANSP_PROPERTY);
+
+ if (string_is_empty (value)) {
+ if (prop) {
+ icalcomponent_remove_property (comp_data->icalcomp, prop);
+ icalproperty_free (prop);
+ }
+ } else {
+ const char *transp;
+
+ if (strcasecmp (value, "FREE"))
+ transp = "TRANSPARENT";
+ else if (strcasecmp (value, "OPAQUE"))
+ transp = "OPAQUE";
+ else {
+ if (prop) {
+ icalcomponent_remove_property (comp_data->icalcomp, prop);
+ icalproperty_free (prop);
+ }
+
+ return;
+ }
+
+ if (prop)
+ icalproperty_set_transp (prop, transp);
+ else {
+ prop = icalproperty_new_transp (transp);
+ icalcomponent_add_property (comp_data->icalcomp, prop);
+ }
+ }
+}
+
+static void
+ecmc_set_value_at (ETableModel *etm, int col, int row, const void *value)
+{
+ ECalModelComponent *comp_data;
+ ECalModelCalendar *model = (ECalModelCalendar *) etm;
+
+ g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model));
+ g_return_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_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 (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_CALENDAR_FIELD_DTEND :
+ set_dtend (comp_data, value);
+ break;
+ case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
+ set_location (comp_data, value);
+ break;
+ case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
+ set_transparency (comp_data, value);
+ break;
+ }
+
+ if (cal_client_update_objects (comp_data->client, comp_data->icalcomp) != CAL_CLIENT_RESULT_SUCCESS)
+ g_message ("ecmc_set_value_at(): Could not update the object!");
+}
+
+static gboolean
+ecmc_is_cell_editable (ETableModel *etm, int col, int row)
+{
+ ECalModelCalendar *model = (ECalModelCalendar *) etm;
+
+ g_return_val_if_fail (E_IS_CAL_MODEL_CALENDAR (model), FALSE);
+ g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, FALSE);
+
+ /* FIXME: We can't check this as 'click-to-add' passes row 0. */
+ /* g_return_val_if_fail (row >= 0 && row < e_table_model_get_row_count (etm), FALSE); */
+
+ if (col < E_CAL_MODEL_FIELD_LAST)
+ return E_TABLE_MODEL_CLASS (parent_class)->is_cell_editable (etm, col, row);
+
+ switch (col) {
+ case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
+ case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
+ case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+ecmc_append_row (ETableModel *etm, ETableModel *source, gint row)
+{
+ ECalModelCalendar *model = (ECalModelCalendar *) etm;
+
+ g_return_if_fail (E_IS_CAL_MODEL_CALENDAR (model));
+
+ /* FIXME: how to chain to ecm_append_row? */
+}
+
+static void *
+ecmc_duplicate_value (ETableModel *etm, int col, const void *value)
+{
+ g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL);
+
+ if (col < E_CAL_MODEL_FIELD_LAST)
+ return E_TABLE_MODEL_CLASS (parent_class)->duplicate_value (etm, col, value);
+
+ switch (col) {
+ case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
+ /* FIXME */
+ break;
+ case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
+ case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
+ return g_strdup (value);
+ }
+
+ return NULL;
+}
+
+static void
+ecmc_free_value (ETableModel *etm, int col, void *value)
+{
+ g_return_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST);
+
+ if (col < E_CAL_MODEL_FIELD_LAST) {
+ E_TABLE_MODEL_CLASS (parent_class)->free_value (etm, col, value);
+ return;
+ }
+
+ switch (col) {
+ case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
+ case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
+ case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
+ if (value)
+ g_free (value);
+ break;
+ }
+}
+
+static void *
+ecmc_initialize_value (ETableModel *etm, int col)
+{
+ g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL);
+
+ if (col < E_CAL_MODEL_FIELD_LAST)
+ return E_TABLE_MODEL_CLASS (parent_class)->initialize_value (etm, col);
+
+ switch (col) {
+ case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
+ return NULL;
+ case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
+ case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
+ return g_strdup ("");
+ }
+
+ return NULL;
+}
+
+static gboolean
+ecmc_value_is_empty (ETableModel *etm, int col, const void *value)
+{
+ g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, TRUE);
+
+ if (col < E_CAL_MODEL_FIELD_LAST)
+ return E_TABLE_MODEL_CLASS (parent_class)->value_is_empty (etm, col, value);
+
+ switch (col) {
+ case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
+ return value ? FALSE : TRUE;
+ case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
+ case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
+ return string_is_empty (value);
+ }
+
+ return TRUE;
+}
+
+static char *
+ecmc_value_to_string (ETableModel *etm, int col, const void *value)
+{
+ g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_CALENDAR_FIELD_LAST, NULL);
+
+ if (col < E_CAL_MODEL_FIELD_LAST)
+ return E_TABLE_MODEL_CLASS (parent_class)->value_to_string (etm, col, value);
+
+ switch (col) {
+ case E_CAL_MODEL_CALENDAR_FIELD_DTEND :
+ return e_cal_model_date_value_to_string (E_CAL_MODEL (etm), value);
+ case E_CAL_MODEL_CALENDAR_FIELD_LOCATION :
+ case E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY :
+ return g_strdup (value);
+ }
+
+ return NULL;
+}
+
+/**
+ * e_cal_model_calendar_new
+ */
+ECalModelCalendar *
+e_cal_model_calendar_new (void)
+{
+ return g_object_new (E_TYPE_CAL_MODEL_CALENDAR, NULL);
+}