Bug 793125 - Crash due to popup menus left attached too long
[evolution.git] / src / calendar / gui / e-cal-model-memos.c
blobf7ee2b03d64de63c1fd65568ec1f16357478934d
1 /*
2 * Evolution memos - Data model for ETable
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * for more details.
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 * Authors:
18 * Rodrigo Moya <rodrigo@ximian.com>
19 * Nathan Owens <pianocomp81@yahoo.com>
21 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
25 #include "evolution-config.h"
27 #include <string.h>
28 #include <glib/gi18n.h>
29 #include "e-cal-model-memos.h"
30 #include "e-cell-date-edit-text.h"
31 #include "misc.h"
33 #define d(x) (x)
35 /* Forward Declarations */
36 static void e_cal_model_memos_table_model_init
37 (ETableModelInterface *iface);
39 static ETableModelInterface *table_model_parent_interface;
41 G_DEFINE_TYPE_WITH_CODE (
42 ECalModelMemos,
43 e_cal_model_memos,
44 E_TYPE_CAL_MODEL,
45 G_IMPLEMENT_INTERFACE (
46 E_TYPE_TABLE_MODEL,
47 e_cal_model_memos_table_model_init))
49 static void
50 cal_model_memos_store_values_from_model (ECalModel *model,
51 ETableModel *source_model,
52 gint row,
53 GHashTable *values)
55 g_return_if_fail (E_IS_CAL_MODEL_MEMOS (model));
56 g_return_if_fail (E_IS_TABLE_MODEL (source_model));
57 g_return_if_fail (values != NULL);
59 /* nothing is stored from UI currently */
62 static void
63 cal_model_memos_fill_component_from_values (ECalModel *model,
64 ECalModelComponent *comp_data,
65 GHashTable *values)
67 icaltimetype start;
69 g_return_if_fail (E_IS_CAL_MODEL_MEMOS (model));
70 g_return_if_fail (comp_data != NULL);
71 g_return_if_fail (values != NULL);
73 start = icalcomponent_get_dtstart (comp_data->icalcomp);
74 if (icaltime_compare_date_only (start, icaltime_null_time ()) == 0) {
75 start = icaltime_today ();
76 icalcomponent_set_dtstart (comp_data->icalcomp, start);
80 static gint
81 cal_model_memos_column_count (ETableModel *etm)
83 return E_CAL_MODEL_MEMOS_FIELD_LAST;
86 static gpointer
87 cal_model_memos_value_at (ETableModel *etm,
88 gint col,
89 gint row)
91 ECalModelComponent *comp_data;
92 ECalModelMemos *model = (ECalModelMemos *) etm;
94 g_return_val_if_fail (E_IS_CAL_MODEL_MEMOS (model), NULL);
96 g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, NULL);
97 g_return_val_if_fail (row >= 0 && row < e_table_model_row_count (etm), NULL);
99 if (col < E_CAL_MODEL_FIELD_LAST)
100 return table_model_parent_interface->value_at (etm, col, row);
102 comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row);
103 if (!comp_data)
104 return (gpointer) "";
106 return (gpointer) "";
109 static void
110 cal_model_memos_set_value_at (ETableModel *etm,
111 gint col,
112 gint row,
113 gconstpointer value)
115 ECalModelComponent *comp_data;
116 ECalModelMemos *model = (ECalModelMemos *) etm;
118 g_return_if_fail (E_IS_CAL_MODEL_MEMOS (model));
119 g_return_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST);
120 g_return_if_fail (row >= 0 && row < e_table_model_row_count (etm));
122 if (col < E_CAL_MODEL_FIELD_LAST) {
123 table_model_parent_interface->set_value_at (etm, col, row, value);
124 return;
127 comp_data = e_cal_model_get_component_at (E_CAL_MODEL (model), row);
128 if (!comp_data) {
129 g_warning ("couldn't get component data: row == %d", row);
130 return;
133 e_cal_model_modify_component (E_CAL_MODEL (model), comp_data, E_CAL_OBJ_MOD_ALL);
136 static gboolean
137 cal_model_memos_is_cell_editable (ETableModel *etm,
138 gint col,
139 gint row)
141 ECalModelMemos *model = (ECalModelMemos *) etm;
142 gboolean retval = FALSE;
144 g_return_val_if_fail (E_IS_CAL_MODEL_MEMOS (model), FALSE);
145 g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, FALSE);
146 g_return_val_if_fail (row >= -1 || (row >= 0 && row < e_table_model_row_count (etm)), FALSE);
148 if (!e_cal_model_test_row_editable (E_CAL_MODEL (etm), row))
149 return FALSE;
151 if (col < E_CAL_MODEL_FIELD_LAST)
152 retval = table_model_parent_interface->is_cell_editable (etm, col, row);
154 return retval;
157 static gpointer
158 cal_model_memos_duplicate_value (ETableModel *etm,
159 gint col,
160 gconstpointer value)
162 g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, NULL);
164 if (col < E_CAL_MODEL_FIELD_LAST)
165 return table_model_parent_interface->duplicate_value (etm, col, value);
167 return NULL;
170 static void
171 cal_model_memos_free_value (ETableModel *etm,
172 gint col,
173 gpointer value)
175 g_return_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST);
177 if (col < E_CAL_MODEL_FIELD_LAST) {
178 table_model_parent_interface->free_value (etm, col, value);
179 return;
183 static gpointer
184 cal_model_memos_initialize_value (ETableModel *etm,
185 gint col)
187 g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, NULL);
189 if (col < E_CAL_MODEL_FIELD_LAST)
190 return table_model_parent_interface->initialize_value (etm, col);
192 return NULL;
195 static gboolean
196 cal_model_memos_value_is_empty (ETableModel *etm,
197 gint col,
198 gconstpointer value)
200 g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, TRUE);
202 if (col < E_CAL_MODEL_FIELD_LAST)
203 return table_model_parent_interface->value_is_empty (etm, col, value);
205 return TRUE;
208 static gchar *
209 cal_model_memos_value_to_string (ETableModel *etm,
210 gint col,
211 gconstpointer value)
213 g_return_val_if_fail (col >= 0 && col < E_CAL_MODEL_MEMOS_FIELD_LAST, g_strdup (""));
215 if (col < E_CAL_MODEL_FIELD_LAST)
216 return table_model_parent_interface->value_to_string (etm, col, value);
218 return g_strdup ("");
221 static void
222 e_cal_model_memos_class_init (ECalModelMemosClass *class)
224 ECalModelClass *model_class;
226 model_class = E_CAL_MODEL_CLASS (class);
227 model_class->store_values_from_model = cal_model_memos_store_values_from_model;
228 model_class->fill_component_from_values = cal_model_memos_fill_component_from_values;
231 static void
232 e_cal_model_memos_table_model_init (ETableModelInterface *iface)
234 table_model_parent_interface =
235 g_type_interface_peek_parent (iface);
237 iface->column_count = cal_model_memos_column_count;
239 iface->value_at = cal_model_memos_value_at;
240 iface->set_value_at = cal_model_memos_set_value_at;
241 iface->is_cell_editable = cal_model_memos_is_cell_editable;
243 iface->duplicate_value = cal_model_memos_duplicate_value;
244 iface->free_value = cal_model_memos_free_value;
245 iface->initialize_value = cal_model_memos_initialize_value;
246 iface->value_is_empty = cal_model_memos_value_is_empty;
247 iface->value_to_string = cal_model_memos_value_to_string;
250 static void
251 e_cal_model_memos_init (ECalModelMemos *model)
253 e_cal_model_set_component_kind (
254 E_CAL_MODEL (model), ICAL_VJOURNAL_COMPONENT);
257 ECalModel *
258 e_cal_model_memos_new (ECalDataModel *data_model,
259 ESourceRegistry *registry,
260 EShell *shell)
262 g_return_val_if_fail (E_IS_CAL_DATA_MODEL (data_model), NULL);
263 g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), NULL);
264 g_return_val_if_fail (E_IS_SHELL (shell), NULL);
266 return g_object_new (
267 E_TYPE_CAL_MODEL_MEMOS,
268 "data-model", data_model,
269 "registry", registry,
270 "shell", shell,
271 NULL);