Merged missing bits from branch
svn path=/trunk/; revision=22152
This commit is contained in:
@ -37,13 +37,15 @@ 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 void ecmc_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data,
|
||||
ECalModel *source_model, gint row);
|
||||
|
||||
static GObjectClass *parent_class = NULL;
|
||||
|
||||
E_MAKE_TYPE (e_cal_model_calendar, "ECalModelCalendar", ECalModelCalendar, ecmc_class_init,
|
||||
@ -54,6 +56,7 @@ ecmc_class_init (ECalModelCalendarClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (klass);
|
||||
ECalModelClass *model_class = E_CAL_MODEL_CLASS (klass);
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
@ -63,12 +66,13 @@ ecmc_class_init (ECalModelCalendarClass *klass)
|
||||
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;
|
||||
|
||||
model_class->fill_component_from_model = ecmc_fill_component_from_model;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -330,16 +334,6 @@ ecmc_is_cell_editable (ETableModel *etm, int col, int row)
|
||||
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)
|
||||
{
|
||||
@ -437,6 +431,24 @@ ecmc_value_to_string (ETableModel *etm, int col, const void *value)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* ECalModel class methods */
|
||||
|
||||
static void
|
||||
ecmc_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data,
|
||||
ECalModel *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_CAL_MODEL_CALENDAR (source_model));
|
||||
|
||||
set_dtend (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_CALENDAR_FIELD_DTEND, row));
|
||||
set_location (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_CALENDAR_FIELD_LOCATION, row));
|
||||
set_transparency (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY, row));
|
||||
}
|
||||
|
||||
/**
|
||||
* e_cal_model_calendar_new
|
||||
*/
|
||||
|
@ -35,6 +35,8 @@ G_BEGIN_DECLS
|
||||
typedef struct _ECalModelCalendarPrivate ECalModelCalendarPrivate;
|
||||
|
||||
typedef enum {
|
||||
/* If you add new items here or reorder them, you have to update the
|
||||
.etspec files for the tables using this model */
|
||||
E_CAL_MODEL_CALENDAR_FIELD_DTEND = E_CAL_MODEL_FIELD_LAST,
|
||||
E_CAL_MODEL_CALENDAR_FIELD_LOCATION,
|
||||
E_CAL_MODEL_CALENDAR_FIELD_TRANSPARENCY,
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <gtk/gtkmessagedialog.h>
|
||||
#include <libgnome/gnome-i18n.h>
|
||||
#include <gal/util/e-util.h>
|
||||
#include "calendar-config.h"
|
||||
#include "e-cal-model-tasks.h"
|
||||
#include "e-cell-date-edit-text.h"
|
||||
#include "misc.h"
|
||||
@ -39,13 +40,15 @@ static int ecmt_column_count (ETableModel *etm);
|
||||
static void *ecmt_value_at (ETableModel *etm, int col, int row);
|
||||
static void ecmt_set_value_at (ETableModel *etm, int col, int row, const void *value);
|
||||
static gboolean ecmt_is_cell_editable (ETableModel *etm, int col, int row);
|
||||
static void ecmt_append_row (ETableModel *etm, ETableModel *source, int row);
|
||||
static void *ecmt_duplicate_value (ETableModel *etm, int col, const void *value);
|
||||
static void ecmt_free_value (ETableModel *etm, int col, void *value);
|
||||
static void *ecmt_initialize_value (ETableModel *etm, int col);
|
||||
static gboolean ecmt_value_is_empty (ETableModel *etm, int col, const void *value);
|
||||
static char *ecmt_value_to_string (ETableModel *etm, int col, const void *value);
|
||||
|
||||
static const char *ecmt_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data);
|
||||
static void ecmt_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data,
|
||||
ECalModel *source_model, gint row);
|
||||
|
||||
static GObjectClass *parent_class = NULL;
|
||||
|
||||
@ -57,6 +60,7 @@ ecmt_class_init (ECalModelTasksClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (klass);
|
||||
ECalModelClass *model_class = E_CAL_MODEL_CLASS (klass);
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
@ -66,12 +70,14 @@ ecmt_class_init (ECalModelTasksClass *klass)
|
||||
etm_class->value_at = ecmt_value_at;
|
||||
etm_class->set_value_at = ecmt_set_value_at;
|
||||
etm_class->is_cell_editable = ecmt_is_cell_editable;
|
||||
etm_class->append_row = ecmt_append_row;
|
||||
etm_class->duplicate_value = ecmt_duplicate_value;
|
||||
etm_class->free_value = ecmt_free_value;
|
||||
etm_class->initialize_value = ecmt_initialize_value;
|
||||
etm_class->value_is_empty = ecmt_value_is_empty;
|
||||
etm_class->value_to_string = ecmt_value_to_string;
|
||||
|
||||
model_class->get_color_for_component = ecmt_get_color_for_component;
|
||||
model_class->fill_component_from_model = ecmt_fill_component_from_model;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -197,9 +203,61 @@ ensure_task_not_complete (ECalModelComponent *comp_data)
|
||||
static ECellDateEditValue *
|
||||
get_completed (ECalModelComponent *comp_data)
|
||||
{
|
||||
/* FIXME */
|
||||
struct icaltimetype tt_completed;
|
||||
|
||||
return NULL;
|
||||
if (!comp_data->completed) {
|
||||
icaltimezone *zone;
|
||||
icalproperty *prop;
|
||||
|
||||
prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_COMPLETED_PROPERTY);
|
||||
if (!prop)
|
||||
return NULL;
|
||||
|
||||
tt_completed = icalproperty_get_completed (prop);
|
||||
if (!icaltime_is_valid_time (tt_completed))
|
||||
return NULL;
|
||||
|
||||
comp_data->completed = g_new0 (ECellDateEditValue, 1);
|
||||
comp_data->completed->tt = tt_completed;
|
||||
|
||||
/* FIXME: handle errors */
|
||||
cal_client_get_timezone (comp_data->client,
|
||||
icaltimezone_get_tzid (icaltimezone_get_builtin_timezone (tt_completed.zone)),
|
||||
&zone);
|
||||
comp_data->completed->zone = zone;
|
||||
}
|
||||
|
||||
return comp_data->completed;
|
||||
}
|
||||
|
||||
static ECellDateEditValue *
|
||||
get_due (ECalModelComponent *comp_data)
|
||||
{
|
||||
struct icaltimetype tt_due;
|
||||
|
||||
if (!comp_data->due) {
|
||||
icaltimezone *zone;
|
||||
icalproperty *prop;
|
||||
|
||||
prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DUE_PROPERTY);
|
||||
if (!prop)
|
||||
return NULL;
|
||||
|
||||
tt_due = icalproperty_get_due (prop);
|
||||
if (!icaltime_is_valid_time (tt_due))
|
||||
return NULL;
|
||||
|
||||
comp_data->due = g_new0 (ECellDateEditValue, 1);
|
||||
comp_data->due->tt = tt_due;
|
||||
|
||||
/* FIXME: handle errors */
|
||||
cal_client_get_timezone (comp_data->client,
|
||||
icaltimezone_get_tzid (icaltimezone_get_builtin_timezone (tt_due.zone)),
|
||||
&zone);
|
||||
comp_data->due->zone = zone;
|
||||
}
|
||||
|
||||
return comp_data->due;
|
||||
}
|
||||
|
||||
static char *
|
||||
@ -403,8 +461,7 @@ ecmt_value_at (ETableModel *etm, int col, int row)
|
||||
case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
|
||||
return GINT_TO_POINTER (is_complete (comp_data));
|
||||
case E_CAL_MODEL_TASKS_FIELD_DUE :
|
||||
/* FIXME */
|
||||
break;
|
||||
return get_due (comp_data);
|
||||
case E_CAL_MODEL_TASKS_FIELD_GEO :
|
||||
return get_geo (comp_data);
|
||||
case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
|
||||
@ -458,6 +515,29 @@ set_complete (ECalModelComponent *comp_data, const void *value)
|
||||
ensure_task_not_complete (comp_data);
|
||||
}
|
||||
|
||||
static void
|
||||
set_due (ECalModelComponent *comp_data, const void *value)
|
||||
{
|
||||
icalproperty *prop;
|
||||
ECellDateEditValue *dv = (ECellDateEditValue *) value;
|
||||
|
||||
prop = icalcomponent_get_first_property (comp_data->icalcomp, ICAL_DUE_PROPERTY);
|
||||
|
||||
if (!dv) {
|
||||
if (prop) {
|
||||
icalcomponent_remove_property (comp_data->icalcomp, prop);
|
||||
icalproperty_free (prop);
|
||||
}
|
||||
} else {
|
||||
if (prop)
|
||||
icalproperty_set_due (prop, dv->tt);
|
||||
else {
|
||||
prop = icalproperty_new_due (dv->tt);
|
||||
icalcomponent_add_property (comp_data->icalcomp, prop);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: We need to set the "transient_for" property for the dialog, but the
|
||||
* model doesn't know anything about the windows.
|
||||
*/
|
||||
@ -660,7 +740,7 @@ ecmt_set_value_at (ETableModel *etm, int col, int row, const void *value)
|
||||
set_complete (comp_data, value);
|
||||
break;
|
||||
case E_CAL_MODEL_TASKS_FIELD_DUE :
|
||||
/* FIXME */
|
||||
set_due (comp_data, value);
|
||||
break;
|
||||
case E_CAL_MODEL_TASKS_FIELD_GEO :
|
||||
set_geo (comp_data, value);
|
||||
@ -712,19 +792,6 @@ ecmt_is_cell_editable (ETableModel *etm, int col, int row)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
ecmt_append_row (ETableModel *etm, ETableModel *source, gint row)
|
||||
{
|
||||
ECalModelTasksPrivate *priv;
|
||||
ECalModelTasks *model = (ECalModelTasks *) etm;
|
||||
|
||||
g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
|
||||
|
||||
priv = model->priv;
|
||||
|
||||
/* FIXME: how to chain to ecm_append_row? */
|
||||
}
|
||||
|
||||
static void *
|
||||
ecmt_duplicate_value (ETableModel *etm, int col, const void *value)
|
||||
{
|
||||
@ -874,6 +941,8 @@ ecmt_value_to_string (ETableModel *etm, int col, const void *value)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* ECalModel class methods */
|
||||
|
||||
static const char *
|
||||
ecmt_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data)
|
||||
{
|
||||
@ -881,17 +950,40 @@ ecmt_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data)
|
||||
g_return_val_if_fail (comp_data != NULL, NULL);
|
||||
|
||||
switch (get_due_status ((ECalModelTasks *) model, comp_data)) {
|
||||
case E_CAL_MODEL_TASKS_DUE_NEVER:
|
||||
case E_CAL_MODEL_TASKS_DUE_FUTURE:
|
||||
case E_CAL_MODEL_TASKS_DUE_COMPLETE:
|
||||
return NULL;
|
||||
case E_CAL_MODEL_TASKS_DUE_TODAY:
|
||||
return calendar_config_get_tasks_due_today_color ();
|
||||
case E_CAL_MODEL_TASKS_DUE_OVERDUE:
|
||||
return calendar_config_get_tasks_overdue_color ();
|
||||
case E_CAL_MODEL_TASKS_DUE_NEVER:
|
||||
case E_CAL_MODEL_TASKS_DUE_FUTURE:
|
||||
case E_CAL_MODEL_TASKS_DUE_COMPLETE:
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return E_CAL_MODEL_CLASS (parent_class)->get_color_for_component (model, comp_data);
|
||||
}
|
||||
|
||||
static void
|
||||
ecmt_fill_component_from_model (ECalModel *model, ECalModelComponent *comp_data,
|
||||
ECalModel *source_model, gint row)
|
||||
{
|
||||
g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
|
||||
g_return_if_fail (comp_data != NULL);
|
||||
g_return_if_fail (E_IS_CAL_MODEL_TASKS (source_model));
|
||||
|
||||
set_completed ((ECalModelTasks *) model, comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_TASKS_FIELD_COMPLETED, row));
|
||||
set_due (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_TASKS_FIELD_DUE, row));
|
||||
set_geo (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_TASKS_FIELD_GEO, row));
|
||||
set_percent (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_TASKS_FIELD_PERCENT, row));
|
||||
set_priority (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_TASKS_FIELD_PRIORITY, row));
|
||||
set_status (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_TASKS_FIELD_STATUS, row));
|
||||
set_url (comp_data,
|
||||
e_table_model_value_at (E_TABLE_MODEL (source_model), E_CAL_MODEL_TASKS_FIELD_URL, row));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -902,3 +994,22 @@ e_cal_model_tasks_new (void)
|
||||
{
|
||||
return g_object_new (E_TYPE_CAL_MODEL_TASKS, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* e_cal_model_tasks_mark_task_complete
|
||||
*/
|
||||
void
|
||||
e_cal_model_tasks_mark_task_complete (ECalModelTasks *model, gint model_row)
|
||||
{
|
||||
ECalModelTasksPrivate *priv;
|
||||
ECalModelComponent *comp_data;
|
||||
|
||||
g_return_if_fail (E_IS_CAL_MODEL_TASKS (model));
|
||||
g_return_if_fail (model_row >= 0 && model_row < e_table_model_row_count (E_TABLE_MODEL (model)));
|
||||
|
||||
priv = model->priv;
|
||||
|
||||
comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), model_row);
|
||||
if (comp_data)
|
||||
ensure_task_complete (comp_data, -1);
|
||||
}
|
||||
|
@ -35,6 +35,8 @@ G_BEGIN_DECLS
|
||||
typedef struct _ECalModelTasksPrivate ECalModelTasksPrivate;
|
||||
|
||||
typedef enum {
|
||||
/* If you add new items here or reorder them, you have to update the
|
||||
.etspec files for the tables using this model */
|
||||
E_CAL_MODEL_TASKS_FIELD_COMPLETED = E_CAL_MODEL_FIELD_LAST,
|
||||
E_CAL_MODEL_TASKS_FIELD_COMPLETE,
|
||||
E_CAL_MODEL_TASKS_FIELD_DUE,
|
||||
@ -59,6 +61,8 @@ typedef struct {
|
||||
GType e_cal_model_tasks_get_type (void);
|
||||
ECalModelTasks *e_cal_model_tasks_new (void);
|
||||
|
||||
void e_cal_model_tasks_mark_task_complete (ECalModelTasks *model, gint model_row);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
||||
|
@ -23,9 +23,11 @@
|
||||
#include <glib/garray.h>
|
||||
#include <libgnome/gnome-i18n.h>
|
||||
#include <gal/util/e-util.h>
|
||||
#include <e-util/e-config-listener.h>
|
||||
#include <e-util/e-time-utils.h>
|
||||
#include <cal-util/timeutil.h>
|
||||
#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));
|
||||
|
||||
if (cal_client_update_objects (comp_data->client, icalcomp) != CAL_CLIENT_RESULT_SUCCESS) {
|
||||
/* 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) {
|
||||
/* 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);
|
||||
|
@ -37,6 +37,8 @@ G_BEGIN_DECLS
|
||||
typedef struct _ECalModelPrivate ECalModelPrivate;
|
||||
|
||||
typedef enum {
|
||||
/* If you add new items here or reorder them, you have to update the
|
||||
.etspec files for the tables using this model */
|
||||
E_CAL_MODEL_FIELD_CATEGORIES,
|
||||
E_CAL_MODEL_FIELD_CLASSIFICATION,
|
||||
E_CAL_MODEL_FIELD_COLOR, /* not a real field */
|
||||
@ -57,6 +59,8 @@ typedef struct {
|
||||
/* private data */
|
||||
ECellDateEditValue *dtstart;
|
||||
ECellDateEditValue *dtend;
|
||||
ECellDateEditValue *due;
|
||||
ECellDateEditValue *completed;
|
||||
} ECalModelComponent;
|
||||
|
||||
typedef struct {
|
||||
@ -69,6 +73,8 @@ typedef struct {
|
||||
|
||||
/* virtual methods */
|
||||
const gchar * (* get_color_for_component) (ECalModel *model, ECalModelComponent *comp_data);
|
||||
void (* fill_component_from_model) (ECalModel *model, ECalModelComponent *comp_data,
|
||||
ECalModel *source_model, gint row);
|
||||
} ECalModelClass;
|
||||
|
||||
GType e_cal_model_get_type (void);
|
||||
@ -78,6 +84,10 @@ void e_cal_model_set_component_kind (ECalModel *model, icalcompon
|
||||
icaltimezone *e_cal_model_get_timezone (ECalModel *model);
|
||||
void e_cal_model_set_timezone (ECalModel *model, icaltimezone *zone);
|
||||
|
||||
void e_cal_model_set_default_category (ECalModel *model, const gchar *default_cat);
|
||||
void e_cal_model_set_use_24_hour_format (ECalModel *model, gboolean use24);
|
||||
|
||||
CalClient *e_cal_model_get_default_client (ECalModel *model);
|
||||
void e_cal_model_add_client (ECalModel *model, CalClient *client);
|
||||
void e_cal_model_remove_client (ECalModel *model, CalClient *client);
|
||||
void e_cal_model_remove_all_clients (ECalModel *model);
|
||||
|
Reference in New Issue
Block a user