Updated Traditional Chinese translation(Hong Kong and Taiwan)
[evolution.git] / calendar / gui / ea-week-view-main-item.c
blob84a4ea119114d716f1330d625dc0e213c01efabc
1 /*
2 * Evolution Accessibility: ea-week-view-main-item.c
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) version 3.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with the program; if not, see <http://www.gnu.org/licenses/>
18 * Authors:
20 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
24 #include "ea-week-view-main-item.h"
25 #include "ea-week-view.h"
26 #include "ea-week-view-cell.h"
27 #include "ea-cell-table.h"
28 #include <glib/gi18n.h>
30 /* EaWeekViewMainItem */
31 static void ea_week_view_main_item_class_init
32 (EaWeekViewMainItemClass *class);
33 static void ea_week_view_main_item_finalize (GObject *object);
34 static G_CONST_RETURN gchar *
35 ea_week_view_main_item_get_name (AtkObject *accessible);
36 static G_CONST_RETURN gchar *
37 ea_week_view_main_item_get_description
38 (AtkObject *accessible);
39 static gint ea_week_view_main_item_get_n_children
40 (AtkObject *accessible);
41 static AtkObject *
42 ea_week_view_main_item_ref_child (AtkObject *accessible,
43 gint i);
44 static AtkObject *
45 ea_week_view_main_item_get_parent
46 (AtkObject *accessible);
47 static gint ea_week_view_main_item_get_index_in_parent
48 (AtkObject *accessible);
50 /* callbacks */
51 static void ea_week_view_main_item_dates_change_cb
52 (GnomeCalendar *gcal,
53 gpointer data);
54 static void ea_week_view_main_item_time_change_cb
55 (EWeekView *week_view,
56 gpointer data);
58 /* component interface */
59 static void atk_component_interface_init (AtkComponentIface *iface);
60 static void component_interface_get_extents (AtkComponent *component,
61 gint *x,
62 gint *y,
63 gint *width,
64 gint *height,
65 AtkCoordType coord_type);
67 /* atk table interface */
68 static void atk_table_interface_init (AtkTableIface *iface);
69 static gint table_interface_get_index_at (AtkTable *table,
70 gint row,
71 gint column);
72 static gint table_interface_get_column_at_index
73 (AtkTable *table,
74 gint index);
75 static gint table_interface_get_row_at_index (AtkTable *table,
76 gint index);
77 static AtkObject *
78 table_interface_ref_at (AtkTable *table,
79 gint row,
80 gint column);
81 static gint table_interface_get_n_rows (AtkTable *table);
82 static gint table_interface_get_n_columns (AtkTable *table);
83 static gint table_interface_get_column_extent_at
84 (AtkTable *table,
85 gint row,
86 gint column);
87 static gint table_interface_get_row_extent_at
88 (AtkTable *table,
89 gint row,
90 gint column);
92 static gboolean table_interface_is_row_selected (AtkTable *table,
93 gint row);
94 static gboolean table_interface_is_column_selected
95 (AtkTable *table,
96 gint row);
97 static gboolean table_interface_is_selected (AtkTable *table,
98 gint row,
99 gint column);
100 static gint table_interface_get_selected_rows
101 (AtkTable *table,
102 gint **rows_selected);
103 static gint table_interface_get_selected_columns
104 (AtkTable *table,
105 gint **columns_selected);
106 static gboolean table_interface_add_row_selection
107 (AtkTable *table,
108 gint row);
109 static gboolean table_interface_remove_row_selection
110 (AtkTable *table,
111 gint row);
112 static gboolean table_interface_add_column_selection
113 (AtkTable *table,
114 gint column);
115 static gboolean table_interface_remove_column_selection
116 (AtkTable *table,
117 gint column);
118 static AtkObject *
119 table_interface_get_row_header (AtkTable *table,
120 gint row);
121 static AtkObject *
122 table_interface_get_column_header
123 (AtkTable *table,
124 gint in_col);
125 static AtkObject *
126 table_interface_get_caption (AtkTable *table);
128 static G_CONST_RETURN gchar *
129 table_interface_get_column_description
130 (AtkTable *table,
131 gint in_col);
133 static G_CONST_RETURN gchar *
134 table_interface_get_row_description
135 (AtkTable *table,
136 gint row);
138 static AtkObject *
139 table_interface_get_summary (AtkTable *table);
141 /* atk selection interface */
142 static void atk_selection_interface_init (AtkSelectionIface *iface);
143 static gboolean selection_interface_add_selection (AtkSelection *selection,
144 gint i);
145 static gboolean selection_interface_clear_selection (AtkSelection *selection);
146 static AtkObject* selection_interface_ref_selection (AtkSelection *selection,
147 gint i);
148 static gint selection_interface_get_selection_count (AtkSelection *selection);
149 static gboolean selection_interface_is_child_selected (AtkSelection *selection,
150 gint i);
152 /* helpers */
153 static EaCellTable *
154 ea_week_view_main_item_get_cell_data
155 (EaWeekViewMainItem *ea_main_item);
157 static void ea_week_view_main_item_destory_cell_data
158 (EaWeekViewMainItem *ea_main_item);
160 static gint ea_week_view_main_item_get_child_index_at
161 (EaWeekViewMainItem *ea_main_item,
162 gint row,
163 gint column);
164 static gint ea_week_view_main_item_get_row_at_index
165 (EaWeekViewMainItem *ea_main_item,
166 gint index);
167 static gint ea_week_view_main_item_get_column_at_index
168 (EaWeekViewMainItem *ea_main_item,
169 gint index);
170 static gint ea_week_view_main_item_get_row_label
171 (EaWeekViewMainItem *ea_main_item,
172 gint row,
173 gchar *buffer,
174 gint buffer_size);
176 #ifdef ACC_DEBUG
177 static gint n_ea_week_view_main_item_created = 0;
178 static gint n_ea_week_view_main_item_destroyed = 0;
179 #endif
181 static gpointer parent_class = NULL;
183 GType
184 ea_week_view_main_item_get_type (void)
186 static GType type = 0;
187 AtkObjectFactory *factory;
188 GTypeQuery query;
189 GType derived_atk_type;
191 if (!type) {
192 static GTypeInfo tinfo = {
193 sizeof (EaWeekViewMainItemClass),
194 (GBaseInitFunc) NULL, /* base init */
195 (GBaseFinalizeFunc) NULL, /* base finalize */
196 (GClassInitFunc) ea_week_view_main_item_class_init,
197 (GClassFinalizeFunc) NULL, /* class finalize */
198 NULL, /* class data */
199 sizeof (EaWeekViewMainItem), /* instance size */
200 0, /* nb preallocs */
201 (GInstanceInitFunc) NULL, /* instance init */
202 NULL /* value table */
205 static const GInterfaceInfo atk_component_info = {
206 (GInterfaceInitFunc) atk_component_interface_init,
207 (GInterfaceFinalizeFunc) NULL,
208 NULL
211 static const GInterfaceInfo atk_table_info = {
212 (GInterfaceInitFunc) atk_table_interface_init,
213 (GInterfaceFinalizeFunc) NULL,
214 NULL
216 static const GInterfaceInfo atk_selection_info = {
217 (GInterfaceInitFunc) atk_selection_interface_init,
218 (GInterfaceFinalizeFunc) NULL,
219 NULL
223 * Figure out the size of the class and instance
224 * we are run-time deriving from (GailCanvasItem, in this case)
228 factory = atk_registry_get_factory (atk_get_default_registry (),
229 e_week_view_main_item_get_type ());
230 derived_atk_type = atk_object_factory_get_accessible_type (factory);
231 g_type_query (derived_atk_type, &query);
233 tinfo.class_size = query.class_size;
234 tinfo.instance_size = query.instance_size;
236 type = g_type_register_static (derived_atk_type,
237 "EaWeekViewMainItem", &tinfo, 0);
238 g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
239 &atk_component_info);
240 g_type_add_interface_static (type, ATK_TYPE_TABLE,
241 &atk_table_info);
242 g_type_add_interface_static (type, ATK_TYPE_SELECTION,
243 &atk_selection_info);
246 return type;
249 static void
250 ea_week_view_main_item_class_init (EaWeekViewMainItemClass *klass)
252 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
253 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
255 gobject_class->finalize = ea_week_view_main_item_finalize;
256 parent_class = g_type_class_peek_parent (klass);
258 class->get_name = ea_week_view_main_item_get_name;
259 class->get_description = ea_week_view_main_item_get_description;
261 class->get_n_children = ea_week_view_main_item_get_n_children;
262 class->ref_child = ea_week_view_main_item_ref_child;
263 class->get_parent = ea_week_view_main_item_get_parent;
264 class->get_index_in_parent = ea_week_view_main_item_get_index_in_parent;
267 AtkObject*
268 ea_week_view_main_item_new (GObject *obj)
270 AtkObject *accessible;
271 GnomeCalendar *gcal;
272 EWeekViewMainItem *main_item;
273 EWeekView *week_view;
275 g_return_val_if_fail (E_IS_WEEK_VIEW_MAIN_ITEM (obj), NULL);
277 accessible = ATK_OBJECT (g_object_new (EA_TYPE_WEEK_VIEW_MAIN_ITEM,
278 NULL));
280 atk_object_initialize (accessible, obj);
281 accessible->role = ATK_ROLE_TABLE;
283 #ifdef ACC_DEBUG
284 ++n_ea_week_view_main_item_created;
285 printf ("ACC_DEBUG: n_ea_week_view_main_item_created = %d\n",
286 n_ea_week_view_main_item_created);
287 #endif
289 main_item = E_WEEK_VIEW_MAIN_ITEM (obj);
290 week_view = e_week_view_main_item_get_week_view (main_item);
292 g_signal_connect (
293 week_view, "selected_time_changed",
294 G_CALLBACK (ea_week_view_main_item_time_change_cb),
295 accessible);
297 /* listen for date changes of calendar */
298 gcal = e_calendar_view_get_calendar (E_CALENDAR_VIEW (week_view));
299 if (gcal)
300 g_signal_connect (gcal, "dates_shown_changed",
301 G_CALLBACK (ea_week_view_main_item_dates_change_cb),
302 accessible);
304 return accessible;
307 static void
308 ea_week_view_main_item_finalize (GObject *object)
310 EaWeekViewMainItem *ea_main_item;
312 g_return_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (object));
314 ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (object);
316 /* Free the allocated cell data */
317 ea_week_view_main_item_destory_cell_data (ea_main_item);
319 G_OBJECT_CLASS (parent_class)->finalize (object);
320 #ifdef ACC_DEBUG
321 ++n_ea_week_view_main_item_destroyed;
322 printf ("ACC_DEBUG: n_ea_week_view_main_item_destroyed = %d\n",
323 n_ea_week_view_main_item_destroyed);
324 #endif
327 static G_CONST_RETURN gchar *
328 ea_week_view_main_item_get_name (AtkObject *accessible)
330 AtkObject *parent;
331 g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), NULL);
332 parent = atk_object_get_parent (accessible);
333 return atk_object_get_name (parent);
337 static G_CONST_RETURN gchar *
338 ea_week_view_main_item_get_description (AtkObject *accessible)
340 return _("a table to view and select the current time range");
343 static gint
344 ea_week_view_main_item_get_n_children (AtkObject *accessible)
346 AtkGObjectAccessible *atk_gobj;
347 GObject *g_obj;
348 EWeekViewMainItem *main_item;
349 EWeekView *week_view;
351 g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), -1);
353 atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
354 g_obj = atk_gobject_accessible_get_object (atk_gobj);
355 if (!g_obj)
356 return -1;
358 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
359 week_view = e_week_view_main_item_get_week_view (main_item);
361 if (week_view->multi_week_view)
362 return 7 * week_view->weeks_shown;
363 else
364 return 7;
367 static AtkObject *
368 ea_week_view_main_item_ref_child (AtkObject *accessible, gint index)
370 AtkGObjectAccessible *atk_gobj;
371 GObject *g_obj;
372 EWeekViewMainItem *main_item;
373 EWeekView *week_view;
374 gint n_children;
375 EWeekViewCell *cell;
376 EaCellTable *cell_data;
377 EaWeekViewMainItem *ea_main_item;
379 g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), NULL);
381 atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
382 g_obj = atk_gobject_accessible_get_object (atk_gobj);
383 if (!g_obj)
384 return NULL;
386 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
387 week_view = e_week_view_main_item_get_week_view (main_item);
389 n_children = ea_week_view_main_item_get_n_children (accessible);
390 if (index < 0 || index >= n_children)
391 return NULL;
393 ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (accessible);
394 cell_data = ea_week_view_main_item_get_cell_data (ea_main_item);
395 if (!cell_data)
396 return NULL;
397 cell = ea_cell_table_get_cell_at_index (cell_data, index);
398 if (!cell) {
399 gint row, column;
401 row = ea_week_view_main_item_get_row_at_index (ea_main_item, index);
402 column = ea_week_view_main_item_get_column_at_index (ea_main_item, index);
403 cell = e_week_view_cell_new (week_view, row, column);
404 ea_cell_table_set_cell_at_index (cell_data, index, cell);
405 g_object_unref (cell);
408 return g_object_ref (atk_gobject_accessible_for_object (G_OBJECT (cell)));
411 static AtkObject *
412 ea_week_view_main_item_get_parent (AtkObject *accessible)
414 AtkGObjectAccessible *atk_gobj;
415 GObject *g_obj;
416 EWeekViewMainItem *main_item;
417 EWeekView *week_view;
419 g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), NULL);
421 atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
422 g_obj = atk_gobject_accessible_get_object (atk_gobj);
423 if (!g_obj)
424 return NULL;
426 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
427 week_view = e_week_view_main_item_get_week_view (main_item);
429 return gtk_widget_get_accessible (GTK_WIDGET (week_view));
432 static gint
433 ea_week_view_main_item_get_index_in_parent (AtkObject *accessible)
435 AtkGObjectAccessible *atk_gobj;
436 GObject *g_obj;
438 g_return_val_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (accessible), -1);
440 atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible);
441 g_obj = atk_gobject_accessible_get_object (atk_gobj);
442 if (!g_obj)
443 return -1;
445 /* always the first child of ea-week-view */
446 return 0;
449 /* callbacks */
451 static void
452 ea_week_view_main_item_dates_change_cb (GnomeCalendar *gcal, gpointer data)
454 EaWeekViewMainItem *ea_main_item;
456 g_return_if_fail (GNOME_IS_CALENDAR (gcal));
457 g_return_if_fail (data);
458 g_return_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (data));
460 ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (data);
462 #ifdef ACC_DEBUG
463 printf ("EvoAcc: ea_week_view_main_item update cb\n");
464 #endif
466 ea_week_view_main_item_destory_cell_data (ea_main_item);
469 static void
470 ea_week_view_main_item_time_change_cb (EWeekView *week_view, gpointer data)
472 EaWeekViewMainItem *ea_main_item;
473 AtkObject *item_cell = NULL;
475 g_return_if_fail (E_IS_WEEK_VIEW (week_view));
476 g_return_if_fail (data);
477 g_return_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (data));
479 ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (data);
481 #ifdef ACC_DEBUG
482 printf ("EvoAcc: ea_week_view_main_item time changed cb\n");
483 #endif
484 /* only deal with the first selected child, for now */
485 item_cell = atk_selection_ref_selection (ATK_SELECTION (ea_main_item),
487 if (item_cell) {
488 AtkStateSet *state_set;
489 state_set = atk_object_ref_state_set (item_cell);
490 atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
491 g_object_unref (state_set);
493 g_signal_emit_by_name (ea_main_item,
494 "active-descendant-changed",
495 item_cell);
496 g_signal_emit_by_name (data, "selection_changed");
497 atk_focus_tracker_notify (item_cell);
498 g_object_unref (item_cell);
502 /* helpers */
504 static gint
505 ea_week_view_main_item_get_child_index_at (EaWeekViewMainItem *ea_main_item,
506 gint row, gint column)
508 AtkGObjectAccessible *atk_gobj;
509 GObject *g_obj;
510 EWeekViewMainItem *main_item;
511 EWeekView *week_view;
513 g_return_val_if_fail (ea_main_item, -1);
515 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
516 g_obj = atk_gobject_accessible_get_object (atk_gobj);
517 if (!g_obj)
518 return -1;
520 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
521 week_view = e_week_view_main_item_get_week_view (main_item);
523 if (row >= 0 && row < week_view->weeks_shown &&
524 column >= 0 && column < 7)
525 return row * 7 + column;
527 return -1;
530 static gint
531 ea_week_view_main_item_get_row_at_index (EaWeekViewMainItem *ea_main_item,
532 gint index)
534 AtkGObjectAccessible *atk_gobj;
535 GObject *g_obj;
536 gint n_children;
538 g_return_val_if_fail (ea_main_item, -1);
540 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
541 g_obj = atk_gobject_accessible_get_object (atk_gobj);
542 if (!g_obj)
543 return -1;
545 n_children = ea_week_view_main_item_get_n_children (ATK_OBJECT (ea_main_item));
546 if (index >= 0 && index < n_children)
547 return index / 7;
548 return -1;
551 static gint
552 ea_week_view_main_item_get_column_at_index (EaWeekViewMainItem *ea_main_item,
553 gint index)
555 AtkGObjectAccessible *atk_gobj;
556 GObject *g_obj;
557 gint n_children;
559 g_return_val_if_fail (ea_main_item, -1);
561 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
562 g_obj = atk_gobject_accessible_get_object (atk_gobj);
563 if (!g_obj)
564 return -1;
566 n_children = ea_week_view_main_item_get_n_children (ATK_OBJECT (ea_main_item));
567 if (index >= 0 && index < n_children)
568 return index % 7;
569 return -1;
572 static gint
573 ea_week_view_main_item_get_row_label (EaWeekViewMainItem *ea_main_item,
574 gint row, gchar *buffer, gint buffer_size)
576 AtkGObjectAccessible *atk_gobj;
577 GObject *g_obj;
579 g_return_val_if_fail (ea_main_item, 0);
581 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
582 g_obj = atk_gobject_accessible_get_object (atk_gobj);
583 if (!g_obj)
584 return 0;
586 return g_snprintf (buffer, buffer_size, "the %i week",
587 row + 1);
591 static EaCellTable *
592 ea_week_view_main_item_get_cell_data (EaWeekViewMainItem *ea_main_item)
594 AtkGObjectAccessible *atk_gobj;
595 GObject *g_obj;
596 EWeekViewMainItem *main_item;
597 EWeekView *week_view;
598 EaCellTable *cell_data;
600 g_return_val_if_fail (ea_main_item, NULL);
602 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
603 g_obj = atk_gobject_accessible_get_object (atk_gobj);
604 if (!g_obj)
605 return NULL;
607 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
608 week_view = e_week_view_main_item_get_week_view (main_item);
610 cell_data = g_object_get_data (G_OBJECT (ea_main_item),
611 "ea-week-view-cell-table");
612 if (!cell_data) {
613 cell_data = ea_cell_table_create (week_view->weeks_shown, 7, TRUE);
614 g_object_set_data (G_OBJECT (ea_main_item),
615 "ea-week-view-cell-table", cell_data);
617 return cell_data;
620 static void
621 ea_week_view_main_item_destory_cell_data (EaWeekViewMainItem *ea_main_item)
623 EaCellTable *cell_data;
625 g_return_if_fail (ea_main_item);
627 cell_data = g_object_get_data (G_OBJECT (ea_main_item),
628 "ea-week-view-cell-table");
629 if (cell_data) {
630 g_object_set_data (G_OBJECT (ea_main_item),
631 "ea-week-view-cell-table", NULL);
632 ea_cell_table_destroy (cell_data);
636 /* Atk Component Interface */
638 static void
639 atk_component_interface_init (AtkComponentIface *iface)
641 g_return_if_fail (iface != NULL);
643 iface->get_extents = component_interface_get_extents;
646 static void
647 component_interface_get_extents (AtkComponent *component,
648 gint *x, gint *y, gint *width, gint *height,
649 AtkCoordType coord_type)
651 GObject *g_obj;
652 AtkObject *ea_canvas;
653 EWeekViewMainItem *main_item;
654 EWeekView *week_view;
656 *x = *y = *width = *height = 0;
658 g_return_if_fail (EA_IS_WEEK_VIEW_MAIN_ITEM (component));
660 g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (component));
661 if (!g_obj)
662 /* defunct object*/
663 return;
664 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
665 week_view = e_week_view_main_item_get_week_view (main_item);
667 ea_canvas = gtk_widget_get_accessible (week_view->main_canvas);
668 atk_component_get_extents (ATK_COMPONENT (ea_canvas), x, y,
669 width, height, coord_type);
672 /* atk table interface */
674 static void
675 atk_table_interface_init (AtkTableIface *iface)
677 g_return_if_fail (iface != NULL);
679 iface->ref_at = table_interface_ref_at;
681 iface->get_n_rows = table_interface_get_n_rows;
682 iface->get_n_columns = table_interface_get_n_columns;
683 iface->get_index_at = table_interface_get_index_at;
684 iface->get_column_at_index = table_interface_get_column_at_index;
685 iface->get_row_at_index = table_interface_get_row_at_index;
686 iface->get_column_extent_at = table_interface_get_column_extent_at;
687 iface->get_row_extent_at = table_interface_get_row_extent_at;
689 iface->is_selected = table_interface_is_selected;
690 iface->get_selected_rows = table_interface_get_selected_rows;
691 iface->get_selected_columns = table_interface_get_selected_columns;
692 iface->is_row_selected = table_interface_is_row_selected;
693 iface->is_column_selected = table_interface_is_column_selected;
694 iface->add_row_selection = table_interface_add_row_selection;
695 iface->remove_row_selection = table_interface_remove_row_selection;
696 iface->add_column_selection = table_interface_add_column_selection;
697 iface->remove_column_selection = table_interface_remove_column_selection;
699 iface->get_row_header = table_interface_get_row_header;
700 iface->get_column_header = table_interface_get_column_header;
701 iface->get_caption = table_interface_get_caption;
702 iface->get_summary = table_interface_get_summary;
703 iface->get_row_description = table_interface_get_row_description;
704 iface->get_column_description = table_interface_get_column_description;
707 static AtkObject*
708 table_interface_ref_at (AtkTable *table,
709 gint row,
710 gint column)
712 gint index;
714 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
715 index = ea_week_view_main_item_get_child_index_at (ea_main_item,
716 row, column);
717 return ea_week_view_main_item_ref_child (ATK_OBJECT (ea_main_item), index);
720 static gint
721 table_interface_get_n_rows (AtkTable *table)
723 AtkGObjectAccessible *atk_gobj;
724 GObject *g_obj;
725 EWeekViewMainItem *main_item;
726 EWeekView *week_view;
727 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
729 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
730 g_obj = atk_gobject_accessible_get_object (atk_gobj);
731 if (!g_obj)
732 return -1;
734 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
735 week_view = e_week_view_main_item_get_week_view (main_item);
737 return week_view->weeks_shown;
740 static gint
741 table_interface_get_n_columns (AtkTable *table)
743 AtkGObjectAccessible *atk_gobj;
744 GObject *g_obj;
745 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
747 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
748 g_obj = atk_gobject_accessible_get_object (atk_gobj);
749 if (!g_obj)
750 return -1;
752 return 7;
755 static gint
756 table_interface_get_index_at (AtkTable *table,
757 gint row,
758 gint column)
760 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
761 return ea_week_view_main_item_get_child_index_at (ea_main_item,
762 row, column);
765 static gint
766 table_interface_get_column_at_index (AtkTable *table,
767 gint index)
769 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
770 return ea_week_view_main_item_get_column_at_index (ea_main_item, index);
773 static gint
774 table_interface_get_row_at_index (AtkTable *table,
775 gint index)
777 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
778 return ea_week_view_main_item_get_row_at_index (ea_main_item, index);
781 static gint
782 table_interface_get_column_extent_at (AtkTable *table,
783 gint row,
784 gint column)
786 gint index;
787 gint width = 0, height = 0;
788 AtkObject *child;
789 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
791 index = ea_week_view_main_item_get_child_index_at (ea_main_item,
792 row, column);
793 child = atk_object_ref_accessible_child (ATK_OBJECT (ea_main_item),
794 index);
795 if (child)
796 atk_component_get_size (ATK_COMPONENT (child),
797 &width, &height);
799 return width;
802 static gint
803 table_interface_get_row_extent_at (AtkTable *table,
804 gint row,
805 gint column)
807 gint index;
808 gint width = 0, height = 0;
809 AtkObject *child;
810 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
812 index = ea_week_view_main_item_get_child_index_at (ea_main_item,
813 row, column);
814 child = atk_object_ref_accessible_child (ATK_OBJECT (ea_main_item),
815 index);
816 if (child)
817 atk_component_get_size (ATK_COMPONENT (child),
818 &width, &height);
820 return height;
823 static gboolean
824 table_interface_is_row_selected (AtkTable *table,
825 gint row)
827 AtkGObjectAccessible *atk_gobj;
828 GObject *g_obj;
829 EWeekViewMainItem *main_item;
830 EWeekView *week_view;
831 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
833 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
834 g_obj = atk_gobject_accessible_get_object (atk_gobj);
835 if (!g_obj)
836 return FALSE;
838 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
839 week_view = e_week_view_main_item_get_week_view (main_item);
841 if (week_view->selection_start_day == -1)
842 /* no selection */
843 return FALSE;
844 if ((row < 0)&&(row + 1 > week_view->weeks_shown ))
845 return FALSE;
846 if (((week_view->selection_start_day < row * 7) &&
847 (week_view->selection_end_day < row * 7)) ||
848 ((week_view->selection_start_day > row * 7 + 6) &&
849 (week_view->selection_end_day > row * 7 + 6)))
850 return FALSE;
851 else
852 return TRUE;
855 static gboolean
856 table_interface_is_selected (AtkTable *table,
857 gint row,
858 gint column)
860 return table_interface_is_row_selected (table, row) &&
861 table_interface_is_column_selected (table, column);
864 static gboolean
865 table_interface_is_column_selected (AtkTable *table,
866 gint column)
868 AtkGObjectAccessible *atk_gobj;
869 GObject *g_obj;
870 EWeekViewMainItem *main_item;
871 EWeekView *week_view;
872 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
874 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
875 g_obj = atk_gobject_accessible_get_object (atk_gobj);
876 if (!g_obj)
877 return FALSE;
879 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
880 week_view = e_week_view_main_item_get_week_view (main_item);
882 if ((column <0)||(column >6))
883 return FALSE;
884 else {
885 gint i;
886 for (i=0;i<week_view->weeks_shown;i++)
887 if ((column + i*7>= week_view->selection_start_day ) &&
888 (column + i*7<= week_view->selection_end_day))
889 return TRUE;
890 return FALSE;
894 static gint
895 table_interface_get_selected_rows (AtkTable *table,
896 gint **rows_selected)
898 AtkGObjectAccessible *atk_gobj;
899 GObject *g_obj;
900 EWeekViewMainItem *main_item;
901 EWeekView *week_view;
902 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
903 gint start_row = -1, n_rows = 0;
905 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
906 g_obj = atk_gobject_accessible_get_object (atk_gobj);
907 if (!g_obj)
908 return -1;
910 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
911 week_view = e_week_view_main_item_get_week_view (main_item);
913 if (week_view->selection_start_day == -1)
914 return 0;
916 start_row = week_view->selection_start_day;
917 n_rows = week_view->selection_end_day - start_row + 1;
919 if (n_rows > 0 && start_row != -1 && rows_selected) {
920 gint index;
922 *rows_selected = (gint *) g_malloc (n_rows * sizeof (gint));
923 for (index = 0; index < n_rows; ++index)
924 (*rows_selected)[index] = start_row + index;
926 return n_rows;
929 static gint
930 table_interface_get_selected_columns (AtkTable *table,
931 gint **columns_selected)
933 AtkGObjectAccessible *atk_gobj;
934 GObject *g_obj;
935 EWeekViewMainItem *main_item;
936 EWeekView *week_view;
937 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
938 gint start_column = -1, n_columns = 0;
940 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
941 g_obj = atk_gobject_accessible_get_object (atk_gobj);
942 if (!g_obj)
943 return -1;
945 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
946 week_view = e_week_view_main_item_get_week_view (main_item);
948 if (week_view->selection_start_day == -1)
949 return 0;
950 if (week_view->selection_end_day - week_view->selection_start_day >= 6 ) {
951 start_column = 0;
952 n_columns =7;
953 } else {
954 start_column = week_view->selection_start_day % 7;
955 n_columns = (week_view->selection_end_day % 7) - start_column + 1;
957 if (n_columns > 0 && start_column != -1 && columns_selected) {
958 gint index;
960 *columns_selected = (gint *) g_malloc (n_columns * sizeof (gint));
961 for (index = 0; index < n_columns; ++index)
962 (*columns_selected)[index] = start_column + index;
964 return n_columns;
967 static gboolean
968 table_interface_add_row_selection (AtkTable *table,
969 gint row)
971 AtkGObjectAccessible *atk_gobj;
972 GObject *g_obj;
973 EWeekViewMainItem *main_item;
974 EWeekView *week_view;
975 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
977 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
978 g_obj = atk_gobject_accessible_get_object (atk_gobj);
979 if (!g_obj)
980 return FALSE;
982 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
983 week_view = e_week_view_main_item_get_week_view (main_item);
985 /* FIXME: we need multi-selection */
987 week_view->selection_start_day = row * 7;
988 week_view->selection_end_day = row *7 + 6;
990 gtk_widget_queue_draw (week_view->main_canvas);
991 return TRUE;
994 static gboolean
995 table_interface_remove_row_selection (AtkTable *table,
996 gint row)
998 return FALSE;
1001 static gboolean
1002 table_interface_add_column_selection (AtkTable *table,
1003 gint column)
1005 AtkGObjectAccessible *atk_gobj;
1006 GObject *g_obj;
1007 EWeekViewMainItem *main_item;
1008 EWeekView *week_view;
1009 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
1011 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
1012 g_obj = atk_gobject_accessible_get_object (atk_gobj);
1013 if (!g_obj)
1014 return FALSE;
1016 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
1017 week_view = e_week_view_main_item_get_week_view (main_item);
1019 /* FIXME: we need multi-selection */
1021 week_view->selection_start_day = column;
1022 week_view->selection_end_day = (week_view->weeks_shown - 1)*7+column;
1024 gtk_widget_queue_draw (week_view->main_canvas);
1025 return TRUE;
1028 static gboolean
1029 table_interface_remove_column_selection (AtkTable *table,
1030 gint column)
1032 /* FIXME: NOT IMPLEMENTED */
1033 return FALSE;
1036 static AtkObject*
1037 table_interface_get_row_header (AtkTable *table,
1038 gint row)
1040 /* FIXME: NOT IMPLEMENTED */
1041 return NULL;
1044 static AtkObject*
1045 table_interface_get_column_header (AtkTable *table,
1046 gint in_col)
1048 /* FIXME: NOT IMPLEMENTED */
1049 return NULL;
1052 static AtkObject*
1053 table_interface_get_caption (AtkTable *table)
1055 /* FIXME: NOT IMPLEMENTED */
1056 return NULL;
1059 static G_CONST_RETURN gchar *
1060 table_interface_get_column_description (AtkTable *table,
1061 gint in_col)
1063 AtkGObjectAccessible *atk_gobj;
1064 GObject *g_obj;
1065 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
1066 const gchar *description;
1067 EaCellTable *cell_data;
1069 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
1070 g_obj = atk_gobject_accessible_get_object (atk_gobj);
1071 if (!g_obj)
1072 return NULL;
1074 if (in_col < 0 || in_col > 6)
1075 return NULL;
1076 cell_data = ea_week_view_main_item_get_cell_data (ea_main_item);
1077 if (!cell_data)
1078 return NULL;
1080 description = ea_cell_table_get_column_label (cell_data, in_col);
1081 if (!description) {
1082 gchar buffer[128];
1084 switch (in_col) {
1085 case 0:
1086 g_snprintf(buffer,128,"Monday");
1087 break;
1088 case 1:
1089 g_snprintf(buffer,128,"Tuesday");
1090 break;
1091 case 2:
1092 g_snprintf(buffer,128,"Wednesday");
1093 break;
1094 case 3:
1095 g_snprintf(buffer,128,"Thursday");
1096 break;
1097 case 4:
1098 g_snprintf(buffer,128,"Friday");
1099 break;
1100 case 5:
1101 g_snprintf(buffer,128,"Saturday");
1102 break;
1103 case 6:
1104 g_snprintf(buffer,128,"Sunday");
1105 break;
1106 default:
1107 break;
1110 ea_cell_table_set_column_label (cell_data, in_col, buffer);
1111 description = ea_cell_table_get_column_label (cell_data, in_col);
1113 return description;
1116 static G_CONST_RETURN gchar *
1117 table_interface_get_row_description (AtkTable *table,
1118 gint row)
1120 AtkGObjectAccessible *atk_gobj;
1121 GObject *g_obj;
1122 EWeekViewMainItem *main_item;
1123 EWeekView *week_view;
1124 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (table);
1125 const gchar *description;
1126 EaCellTable *cell_data;
1128 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
1129 g_obj = atk_gobject_accessible_get_object (atk_gobj);
1130 if (!g_obj)
1131 return NULL;
1133 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
1134 week_view = e_week_view_main_item_get_week_view (main_item);
1136 if (row < 0 || row >= week_view->weeks_shown)
1137 return NULL;
1138 cell_data = ea_week_view_main_item_get_cell_data (ea_main_item);
1139 if (!cell_data)
1140 return NULL;
1142 description = ea_cell_table_get_row_label (cell_data, row);
1143 if (!description) {
1144 gchar buffer[128];
1145 ea_week_view_main_item_get_row_label (ea_main_item, row, buffer, sizeof (buffer));
1146 ea_cell_table_set_row_label (cell_data, row, buffer);
1147 description = ea_cell_table_get_row_label (cell_data,
1148 row);
1150 return description;
1153 static AtkObject*
1154 table_interface_get_summary (AtkTable *table)
1156 /* FIXME: NOT IMPLEMENTED */
1157 return NULL;
1160 /* atkselection interface */
1162 static void
1163 atk_selection_interface_init (AtkSelectionIface *iface)
1165 g_return_if_fail (iface != NULL);
1167 iface->add_selection = selection_interface_add_selection;
1168 iface->clear_selection = selection_interface_clear_selection;
1169 iface->ref_selection = selection_interface_ref_selection;
1170 iface->get_selection_count = selection_interface_get_selection_count;
1171 iface->is_child_selected = selection_interface_is_child_selected;
1174 static gboolean
1175 selection_interface_add_selection (AtkSelection *selection, gint i)
1177 AtkGObjectAccessible *atk_gobj;
1178 GObject *g_obj;
1179 EWeekViewMainItem *main_item;
1180 EWeekView *week_view;
1181 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
1183 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
1184 g_obj = atk_gobject_accessible_get_object (atk_gobj);
1185 if (!g_obj)
1186 return FALSE;
1188 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
1189 week_view = e_week_view_main_item_get_week_view (main_item);
1191 if (i < 0 || i > week_view->weeks_shown * 7 -1)
1192 return FALSE;
1194 /*FIXME: multi-selection is needed */
1195 week_view->selection_start_day = i;
1196 week_view->selection_end_day = i;
1198 gtk_widget_queue_draw (week_view->main_canvas);
1199 return TRUE;
1202 static gboolean
1203 selection_interface_clear_selection (AtkSelection *selection)
1205 AtkGObjectAccessible *atk_gobj;
1206 GObject *g_obj;
1207 EWeekViewMainItem *main_item;
1208 EWeekView *week_view;
1209 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
1211 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
1212 g_obj = atk_gobject_accessible_get_object (atk_gobj);
1213 if (!g_obj)
1214 return FALSE;
1216 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
1217 week_view = e_week_view_main_item_get_week_view (main_item);
1219 week_view->selection_start_day = -1;
1220 week_view->selection_end_day = -1;
1222 gtk_widget_queue_draw (week_view->main_canvas);
1224 return TRUE;
1227 static AtkObject*
1228 selection_interface_ref_selection (AtkSelection *selection, gint i)
1230 gint count;
1231 GObject *g_obj;
1232 EWeekViewMainItem *main_item;
1233 EWeekView *week_view;
1234 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
1235 gint start_index;
1237 count = selection_interface_get_selection_count (selection);
1238 if (i < 0 || i >=count)
1239 return NULL;
1241 g_obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (ea_main_item));
1243 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
1244 week_view = e_week_view_main_item_get_week_view (main_item);
1246 start_index = ea_week_view_main_item_get_child_index_at (ea_main_item,
1247 week_view->selection_start_day / 7,
1248 week_view->selection_start_day % 7);
1250 return ea_week_view_main_item_ref_child (ATK_OBJECT (selection), start_index + i);
1253 static gint
1254 selection_interface_get_selection_count (AtkSelection *selection)
1256 AtkGObjectAccessible *atk_gobj;
1257 GObject *g_obj;
1258 EWeekViewMainItem *main_item;
1259 EWeekView *week_view;
1260 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
1262 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
1263 g_obj = atk_gobject_accessible_get_object (atk_gobj);
1264 if (!g_obj)
1265 return 0;
1267 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
1268 week_view = e_week_view_main_item_get_week_view (main_item);
1270 if (week_view->selection_start_day == -1 ||
1271 week_view->selection_end_day == -1)
1272 return 0;
1274 return week_view->selection_end_day - week_view->selection_start_day + 1;
1277 static gboolean
1278 selection_interface_is_child_selected (AtkSelection *selection, gint i)
1280 AtkGObjectAccessible *atk_gobj;
1281 GObject *g_obj;
1282 EWeekViewMainItem *main_item;
1283 EWeekView *week_view;
1284 EaWeekViewMainItem* ea_main_item = EA_WEEK_VIEW_MAIN_ITEM (selection);
1286 atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item);
1287 g_obj = atk_gobject_accessible_get_object (atk_gobj);
1288 if (!g_obj)
1289 return FALSE;
1291 main_item = E_WEEK_VIEW_MAIN_ITEM (g_obj);
1292 week_view = e_week_view_main_item_get_week_view (main_item);
1294 if ((week_view->selection_start_day <= i)&&(week_view->selection_end_day >= i))
1295 return TRUE;
1296 else
1297 return FALSE;