From ca9ceb157cff46f1ecddd0b807d9b7776c0f7ca1 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 27 Sep 2007 08:10:45 +0000 Subject: 2007-09-27 mcrha Fix for bug #346686 svn path=/trunk/; revision=34315 --- calendar/gui/e-cal-model-calendar.c | 3 +++ calendar/gui/e-cal-model-memos.c | 2 ++ calendar/gui/e-cal-model-tasks.c | 3 +++ calendar/gui/e-cal-model.c | 38 +++++++++++++++++++++++++++++++++++++ calendar/gui/e-cal-model.h | 2 +- 5 files changed, 47 insertions(+), 1 deletion(-) (limited to 'calendar/gui') diff --git a/calendar/gui/e-cal-model-calendar.c b/calendar/gui/e-cal-model-calendar.c index 6d4ffdf3d7..19e257523a 100644 --- a/calendar/gui/e-cal-model-calendar.c +++ b/calendar/gui/e-cal-model-calendar.c @@ -403,6 +403,9 @@ ecmc_is_cell_editable (ETableModel *etm, int col, int row) if (col < E_CAL_MODEL_FIELD_LAST) return E_TABLE_MODEL_CLASS (e_cal_model_calendar_parent_class)->is_cell_editable (etm, col, row); + if (!e_cal_model_test_row_editable (E_CAL_MODEL (etm), row)) + return FALSE; + switch (col) { case E_CAL_MODEL_CALENDAR_FIELD_DTEND : case E_CAL_MODEL_CALENDAR_FIELD_LOCATION : diff --git a/calendar/gui/e-cal-model-memos.c b/calendar/gui/e-cal-model-memos.c index 1b08b714dd..877e3fb8ec 100644 --- a/calendar/gui/e-cal-model-memos.c +++ b/calendar/gui/e-cal-model-memos.c @@ -172,6 +172,8 @@ ecmm_is_cell_editable (ETableModel *etm, int col, int row) g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, FALSE); g_return_val_if_fail (row >= -1 || (row >= 0 && row < e_table_model_row_count (etm)), FALSE); + if (!e_cal_model_test_row_editable (E_CAL_MODEL (etm), row)) + return FALSE; if (col < E_CAL_MODEL_FIELD_LAST) retval = E_TABLE_MODEL_CLASS (e_cal_model_memos_parent_class)->is_cell_editable (etm, col, row); diff --git a/calendar/gui/e-cal-model-tasks.c b/calendar/gui/e-cal-model-tasks.c index 9afd09fe5c..66e7c536d5 100644 --- a/calendar/gui/e-cal-model-tasks.c +++ b/calendar/gui/e-cal-model-tasks.c @@ -846,6 +846,9 @@ ecmt_is_cell_editable (ETableModel *etm, int col, int row) if (col < E_CAL_MODEL_FIELD_LAST) return E_TABLE_MODEL_CLASS (e_cal_model_tasks_parent_class)->is_cell_editable (etm, col, row); + if (!e_cal_model_test_row_editable (E_CAL_MODEL (etm), row)) + return FALSE; + switch (col) { case E_CAL_MODEL_TASKS_FIELD_COMPLETED : case E_CAL_MODEL_TASKS_FIELD_COMPLETE : diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c index a86c893cc6..36466c1ac1 100644 --- a/calendar/gui/e-cal-model.c +++ b/calendar/gui/e-cal-model.c @@ -710,6 +710,41 @@ ecm_set_value_at (ETableModel *etm, int col, int row, const void *value) } } +/** + * e_cal_model_test_row_editable + * Checks if component at row 'row' is editable or not. It doesn't check bounds for 'row'. + * + * @param model Calendar model. + * @param row Row of our interest. -1 is editable only when default client is editable. + * @return Whether row is editable or not. + **/ +gboolean +e_cal_model_test_row_editable (ECalModel *model, int row) +{ + gboolean readonly; + ECal *cal = NULL; + + if (row != -1) { + ECalModelComponent *comp_data; + + comp_data = e_cal_model_get_component_at (model, row); + + if (comp_data) + cal = comp_data->client; + + } else { + cal = e_cal_model_get_default_client (model); + } + + readonly = cal == NULL; + + if (!readonly) + if (!e_cal_is_read_only (cal, &readonly, NULL)) + readonly = TRUE; + + return !readonly; +} + static gboolean ecm_is_cell_editable (ETableModel *etm, int col, int row) { @@ -723,6 +758,9 @@ ecm_is_cell_editable (ETableModel *etm, int col, int row) 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 : diff --git a/calendar/gui/e-cal-model.h b/calendar/gui/e-cal-model.h index c59ed9e6c9..45504acf4e 100644 --- a/calendar/gui/e-cal-model.h +++ b/calendar/gui/e-cal-model.h @@ -156,7 +156,7 @@ GPtrArray * e_cal_model_get_object_array (ECalModel *model); void e_cal_model_set_instance_times (ECalModelComponent *comp_data, const icaltimezone *zone); void e_cal_model_set_search_query_with_time_range (ECalModel *model, const char *sexp, time_t start, time_t end); - +gboolean e_cal_model_test_row_editable (ECalModel *model, int row); G_END_DECLS -- cgit v1.2.3