From 8f65ff7000f89f936e46007d0db78c0aa602f0b8 Mon Sep 17 00:00:00 2001 From: Rodrigo Moya Date: Sat, 9 Aug 2003 09:01:35 +0000 Subject: Merged missing bits from branch svn path=/trunk/; revision=22152 --- calendar/gui/e-cal-model.c | 239 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 204 insertions(+), 35 deletions(-) (limited to 'calendar/gui/e-cal-model.c') diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c index a184fabe48..92f5649270 100644 --- a/calendar/gui/e-cal-model.c +++ b/calendar/gui/e-cal-model.c @@ -23,9 +23,11 @@ #include #include #include +#include #include #include #include "calendar-config.h" +#include "comp-util.h" #include "e-cal-model.h" #include "itip-utils.h" #include "misc.h" @@ -53,6 +55,9 @@ struct _ECalModelPrivate { /* Addresses for determining icons */ EAccountList *accounts; + + /* Whether we display dates in 24-hour format. */ + gboolean use_24_hour_format; }; static void e_cal_model_class_init (ECalModelClass *klass); @@ -101,6 +106,7 @@ e_cal_model_class_init (ECalModelClass *klass) etm_class->value_to_string = ecm_value_to_string; klass->get_color_for_component = ecm_get_color_for_component; + klass->fill_component_from_model = NULL; } static void @@ -117,6 +123,8 @@ e_cal_model_init (ECalModel *model, ECalModelClass *klass) priv->kind = ICAL_NO_COMPONENT; priv->accounts = itip_addresses_get (); + + priv->use_24_hour_format = TRUE; } static void @@ -141,6 +149,16 @@ free_comp_data (ECalModelComponent *comp_data) comp_data->dtend = NULL; } + if (comp_data->due) { + g_free (comp_data->due); + comp_data->due = NULL; + } + + if (comp_data->completed) { + g_free (comp_data->completed); + comp_data->completed = NULL; + } + g_free (comp_data); } @@ -172,7 +190,20 @@ e_cal_model_finalize (GObject *object) priv = model->priv; if (priv) { if (priv->clients) { - e_cal_model_remove_all_clients (model); + while (priv->clients != NULL) { + ECalModelClient *client_data = (ECalModelClient *) priv->clients->data; + + g_signal_handlers_disconnect_matched (client_data->client, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, model); + g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, model); + + priv->clients = g_list_remove (priv->clients, client_data); + g_object_unref (client_data->client); + g_object_unref (client_data->query); + g_free (client_data); + } + priv->clients = NULL; } @@ -291,8 +322,13 @@ get_dtstart (ECalModel *model, ECalModelComponent *comp_data) if (!comp_data->dtstart) { icaltimezone *zone; + icalproperty *prop; - tt_start = icalcomponent_get_dtstart (comp_data->icalcomp); + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DTSTART_PROPERTY); + if (!prop) + return NULL; + + tt_start = icalproperty_get_dtstart (prop); if (!icaltime_is_valid_time (tt_start)) return NULL; @@ -350,13 +386,13 @@ ecm_value_at (ETableModel *etm, int col, int row) case E_CAL_MODEL_FIELD_CLASSIFICATION : return get_classification (comp_data); case E_CAL_MODEL_FIELD_COLOR : - return GINT_TO_POINTER (get_color (model, comp_data)); + return (void *) 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 get_dtstart (model, comp_data); + return (void *) get_dtstart (model, comp_data); case E_CAL_MODEL_FIELD_HAS_ALARMS : return GINT_TO_POINTER ((icalcomponent_get_first_component (comp_data->icalcomp, ICAL_VALARM_COMPONENT) != NULL)); @@ -410,58 +446,58 @@ ecm_value_at (ETableModel *etm, int col, int row) } static void -set_categories (icalcomponent *icalcomp, const char *value) +set_categories (ECalModelComponent *comp_data, const char *value) { icalproperty *prop; - prop = icalcomponent_get_first_property (icalcomp, ICAL_CATEGORIES_PROPERTY); + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CATEGORIES_PROPERTY); if (!value || !(*value)) { if (prop) { - icalcomponent_remove_property (icalcomp, prop); + icalcomponent_remove_property (comp_data->icalcomp, prop); icalproperty_free (prop); } } else { if (!prop) { prop = icalproperty_new_categories (value); - icalcomponent_add_property (icalcomp, prop); + icalcomponent_add_property (comp_data->icalcomp, prop); } else icalproperty_set_categories (prop, value); } } static void -set_classification (icalcomponent *icalcomp, const char *value) +set_classification (ECalModelComponent *comp_data, const char *value) { icalproperty *prop; - prop = icalcomponent_get_first_property (icalcomp, ICAL_CLASS_PROPERTY); + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_CLASS_PROPERTY); if (!value || !(*value)) { if (prop) { - icalcomponent_remove_property (icalcomp, prop); + icalcomponent_remove_property (comp_data->icalcomp, prop); icalproperty_free (prop); } } else { if (!prop) { prop = icalproperty_new_class (value); - icalcomponent_add_property (icalcomp, prop); + icalcomponent_add_property (comp_data->icalcomp, prop); } else icalproperty_set_class (prop, value); } } static void -set_description (icalcomponent *icalcomp, const char *value) +set_description (ECalModelComponent *comp_data, const char *value) { icalproperty *prop; /* remove old description(s) */ - prop = icalcomponent_get_first_property (icalcomp, ICAL_DESCRIPTION_PROPERTY); + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY); while (prop) { icalproperty *next; - next = icalcomponent_get_next_property (icalcomp, ICAL_DESCRIPTION_PROPERTY); + next = icalcomponent_get_next_property (comp_data->icalcomp, ICAL_DESCRIPTION_PROPERTY); - icalcomponent_remove_property (icalcomp, prop); + icalcomponent_remove_property (comp_data->icalcomp, prop); icalproperty_free (prop); prop = next; @@ -472,7 +508,7 @@ set_description (icalcomponent *icalcomp, const char *value) return; prop = icalproperty_new_description (value); - icalcomponent_add_property (icalcomp, prop); + icalcomponent_add_property (comp_data->icalcomp, prop); } static void @@ -492,9 +528,25 @@ set_dtstart (ECalModel *model, ECalModelComponent *comp_data, const void *value) } static void -set_summary (icalcomponent *icalcomp, const char *value) +set_summary (ECalModelComponent *comp_data, const char *value) { - icalcomponent_set_summary (icalcomp, value); + icalproperty *prop; + + prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_SUMMARY_PROPERTY); + + 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); + } + } } static void @@ -561,7 +613,8 @@ ecm_is_cell_editable (ETableModel *etm, int col, int row) static void ecm_append_row (ETableModel *etm, ETableModel *source, int row) { - ECalModelComponent *comp_data; + ECalModelClass *model_class; + ECalModelComponent comp_data; icalcomponent *icalcomp; ECalModel *source_model = (ECalModel *) source; ECalModel *model = (ECalModel *) etm; @@ -569,21 +622,29 @@ ecm_append_row (ETableModel *etm, ETableModel *source, int row) g_return_if_fail (E_IS_CAL_MODEL (model)); g_return_if_fail (E_IS_CAL_MODEL (source_model)); - comp_data = g_ptr_array_index (source_model->priv->objects, row); - g_assert (comp_data != NULL); + memset (&comp_data, 0, sizeof (comp_data)); + comp_data.client = e_cal_model_get_default_client (model); /* guard against saving before the calendar is open */ - if (!(comp_data->client && cal_client_get_load_state (comp_data->client) == CAL_CLIENT_LOAD_LOADED)) + if (!(comp_data.client && cal_client_get_load_state (comp_data.client) == CAL_CLIENT_LOAD_LOADED)) return; - icalcomp = e_cal_model_create_component_with_defaults (model); + comp_data.icalcomp = e_cal_model_create_component_with_defaults (model); - set_categories (icalcomp, e_table_model_value_at (source, E_CAL_MODEL_FIELD_CATEGORIES, row)); - set_classification (icalcomp, e_table_model_value_at (source, E_CAL_MODEL_FIELD_CLASSIFICATION, row)); - set_description (icalcomp, e_table_model_value_at (source, E_CAL_MODEL_FIELD_DESCRIPTION, row)); - set_summary (icalcomp, e_table_model_value_at (source, E_CAL_MODEL_FIELD_SUMMARY, row)); + /* 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_dtstart (model, &comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_DTSTART, row)); + set_summary (&comp_data, e_table_model_value_at (source, E_CAL_MODEL_FIELD_SUMMARY, row)); + + /* 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_model, row); + } - if (cal_client_update_objects (comp_data->client, icalcomp) != CAL_CLIENT_RESULT_SUCCESS) { + if (cal_client_update_objects (comp_data.client, icalcomp) != CAL_CLIENT_RESULT_SUCCESS) { /* FIXME: show error dialog */ } @@ -696,7 +757,7 @@ ecm_value_is_empty (ETableModel *etm, int col, const void *value) * contains the default category, then it possibly means that * the user has not entered anything at all in the click-to-add; * the category is in the value because we put it there in - * calendar_model_initialize_value(). + * ecm_initialize_value(). */ if (priv->default_category && value && strcmp (priv->default_category, value) == 0) return TRUE; @@ -756,7 +817,20 @@ ecm_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data) ECalModelPrivate *priv; gint i, pos; GList *l; - gchar *colors[] = { "gray", "green", "darkblue" }; + gchar *colors[] = { + "#718DA9", /* 113 141 169 */ + "#C6E2E2", /* 198 226 226 */ + "#8DC671", /* 141 198 113 */ + "#C6E2A9", /* 198 226 169 */ + "#C6A971", /* 198 169 113 */ + "#FFE271", /* 255 226 113 */ + "#E27171", /* 226 113 113 */ + "#FFA9A9", /* 255 169 169 */ + "#C68DC6", /* 198 141 198 */ + "#E2C6E2", /* 226 198 226 */ + "#D6D684", /* 214 214 132 */ + "#5B5B84" /* 91 91 132 */ + }; g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); g_return_val_if_fail (comp_data != NULL, NULL); @@ -834,6 +908,85 @@ e_cal_model_set_timezone (ECalModel *model, icaltimezone *zone) } } +/** + * e_cal_model_set_default_category + */ +void +e_cal_model_set_default_category (ECalModel *model, const gchar *default_cat) +{ + g_return_if_fail (E_IS_CAL_MODEL (model)); + + if (model->priv->default_category) + g_free (model->priv->default_category); + + model->priv->default_category = g_strdup (default_cat); +} + +/** + * e_cal_model_set_use_24_hour_format + */ +void +e_cal_model_set_use_24_hour_format (ECalModel *model, gboolean use24) +{ + g_return_if_fail (E_IS_CAL_MODEL (model)); + + if (model->priv->use_24_hour_format != use24) { + e_table_model_pre_change (E_TABLE_MODEL (model)); + model->priv->use_24_hour_format = use24; + /* Get the views to redraw themselves. */ + e_table_model_changed (E_TABLE_MODEL (model)); + } +} + +/** + * e_cal_model_get_default_client + */ +CalClient * +e_cal_model_get_default_client (ECalModel *model) +{ + ECalModelPrivate *priv; + GList *l; + gchar *default_uri = NULL; + EConfigListener *db; + ECalModelClient *client_data; + + g_return_val_if_fail (E_IS_CAL_MODEL (model), NULL); + + priv = model->priv; + + if (!priv->clients) + return NULL; + + db = e_config_listener_new (); + + /* look at the configuration and return the real default calendar if we've got it loaded */ + if (priv->kind == ICAL_VEVENT_COMPONENT) + default_uri = e_config_listener_get_string (db, "/apps/evolution/shell/default_folders/calendar_uri"); + else if (priv->kind == ICAL_VTODO_COMPONENT) + default_uri = e_config_listener_get_string (db, "/apps/evolution/shell/default_folders/tasks_uri"); + + g_object_unref (db); + + if (!default_uri) { + client_data = (ECalModelClient *) priv->clients->data; + return client_data->client; + } + + for (l = priv->clients; l != NULL; l = l->next) { + client_data = (ECalModelClient *) l->data; + + if (!strcmp (default_uri, cal_client_get_uri (client_data->client))) { + g_free (default_uri); + return client_data->client; + } + } + + g_free (default_uri); + + client_data = (ECalModelClient *) priv->clients->data; + return client_data->client; +} + static ECalModelComponent * search_by_uid_and_client (ECalModelPrivate *priv, CalClient *client, const char *uid) { @@ -895,6 +1048,23 @@ query_obj_updated_cb (CalQuery *query, const char *uid, if (comp_data) { if (comp_data->icalcomp) icalcomponent_free (comp_data->icalcomp); + if (comp_data->dtstart) { + g_free (comp_data->dtstart); + comp_data->dtstart = NULL; + } + if (comp_data->dtend) { + g_free (comp_data->dtend); + comp_data->dtend = NULL; + } + if (comp_data->due) { + g_free (comp_data->due); + comp_data->due = NULL; + } + if (comp_data->completed) { + g_free (comp_data->completed); + comp_data->completed = NULL; + } + comp_data->icalcomp = new_icalcomp; e_table_model_row_changed (E_TABLE_MODEL (model), get_position_in_array (priv->objects, comp_data)); @@ -1060,10 +1230,8 @@ cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer user_data { ECalModel *model = (ECalModel *) user_data; - if (status != CAL_CLIENT_OPEN_SUCCESS) { - e_cal_model_remove_client (model, client); + if (status != CAL_CLIENT_OPEN_SUCCESS) return; - } add_new_client (model, client); } @@ -1296,7 +1464,8 @@ e_cal_model_date_value_to_string (ECalModel *model, const void *value) tmp_tm.tm_wday = time_day_of_week (tt.day, tt.month - 1, tt.year); - e_time_format_date_and_time (&tmp_tm, calendar_config_get_24_hour_format (), + memset (buffer, 0, sizeof (buffer)); + e_time_format_date_and_time (&tmp_tm, priv->use_24_hour_format, TRUE, FALSE, buffer, sizeof (buffer)); return g_strdup (buffer); -- cgit