Re: [evolution-patches] Re: patch for bug 48509



Hi JP and Rodrigo,

This a11y patch has pass the internal review, and it is has little affect to other modules.  Can you review it?

Thanks,
Bolian


Bolian Yin wrote:
Hi,

how about the review progress?

Thanks,
Bolian

Bolian Yin wrote:
Hi JP and Rodrigo,

can you review this patch?

Thanks,
Bolian

Bolian Yin wrote:


Gilbert Fang wrote:
+               /* strftime format %d = day of month, %b = abbreviated
month name.
+                  Don't use any other specifiers. */
+               format = _("%d %b");
+       else
+               format = "%d";

The lastest "%d" is not enclosed by bracket. Does that mean it need not
localization? while others need.
  
Yes, I think the digital need no localization.

+#ifdef ACC_DEBUG
  
+static void ea_day_view_cell_finalize (GObject *object)
+{
+	++n_ea_day_view_cell_destroyed;
+	printf ("ACC_DEBUG: n_ea_day_view_cell_destroyed = %d\n",
+		n_ea_day_view_cell_destroyed);
+}
+#endif
    

I found some debug codes in your patch. I wonder if there is any
possibility to remove them, because I guess that may confuse other
developers.

  
I want to keep the debug code.  It is still useful.

Thanks,
Bolian
On Tue, 2003-09-16 at 15:37, Bolian Yin wrote:
  
Hi,

Another a11y patch review.
Bug Summary:
   Need a class to support atk impl. of e-day-view-main-item. This class
   should support table and selection interfaces to enable the user navigate
   and select the current time range.

This patch changes files in calendar/gui and a11y/calendar, Please the 
the ChangLog changes in the patch for details.


Thanks,
Bolian
        

Index: calendar/ChangeLog =================================================================== RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v retrieving revision 1.1871 diff -u -r1.1871 ChangeLog --- calendar/ChangeLog 15 Sep 2003 09:30:59 -0000 1.1871 +++ calendar/ChangeLog 16 Sep 2003 07:20:56 -0000 @@ -1,3 +1,13 @@ +2003-09-15 Bolian Yin <bolian yin sun com> + + * gui/e-cal-view.c: add new signal "selected_time_changed" + * gui/e-day-view-main-item.c (e_day_view_main_item_class_init): + a11y initialization + * gui/e-day-view-top-item (e_day_view_top_item_get_day_label): + new public function. + * gui/e-day-view.c (e_day_view_ensure_rows_visible, e_day_view_update_calendar_selection_time): make static functions public + (e_day_view_cursor_key_up, e_day_view_cursor_key_down, e_day_view_cursor_key_left, e_day_view_cursor_key_right): emit "selected_time_changed". + 2003-09-15 Harry Lu <harry lu sun com> * gui/apps_evolution_calendar.schemas: change last_notification_time's Index: calendar/gui/e-cal-view.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/e-cal-view.c,v retrieving revision 1.15 diff -u -r1.15 e-cal-view.c --- calendar/gui/e-cal-view.c 20 Aug 2003 12:02:32 -0000 1.15 +++ calendar/gui/e-cal-view.c 16 Sep 2003 07:20:58 -0000 @@ -82,6 +82,7 @@ /* Signal IDs */ enum { SELECTION_CHANGED, + SELECTED_TIME_CHANGED, TIMEZONE_CHANGED, EVENT_CHANGED, EVENT_ADDED, @@ -106,6 +107,14 @@ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + e_cal_view_signals[SELECTED_TIME_CHANGED] = + g_signal_new ("selected_time_changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (ECalViewClass, selected_time_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); e_cal_view_signals[TIMEZONE_CHANGED] = g_signal_new ("timezone_changed", G_TYPE_FROM_CLASS (klass), @@ -139,6 +148,7 @@ object_class->destroy = e_cal_view_destroy; klass->selection_changed = NULL; + klass->selected_time_changed = NULL; klass->event_changed = NULL; klass->event_added = NULL; Index: calendar/gui/e-cal-view.h =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/e-cal-view.h,v retrieving revision 1.11 diff -u -r1.11 e-cal-view.h --- calendar/gui/e-cal-view.h 20 Aug 2003 10:16:59 -0000 1.11 +++ calendar/gui/e-cal-view.h 16 Sep 2003 07:20:58 -0000 @@ -76,6 +76,7 @@ /* Notification signals */ void (* selection_changed) (ECalView *cal_view); + void (* selected_time_changed) (ECalView *cal_view); void (* timezone_changed) (ECalView *cal_view, icaltimezone *old_zone, icaltimezone *new_zone); void (* event_changed) (ECalView *day_view, ECalViewEvent *event); void (* event_added) (ECalView *day_view, ECalViewEvent *event); Index: calendar/gui/e-day-view-main-item.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/e-day-view-main-item.c,v retrieving revision 1.34 diff -u -r1.34 e-day-view-main-item.c --- calendar/gui/e-day-view-main-item.c 20 Aug 2003 10:16:59 -0000 1.34 +++ calendar/gui/e-day-view-main-item.c 16 Sep 2003 07:20:59 -0000 @@ -31,6 +31,7 @@ #include "e-util/e-categories-config.h" #include "e-day-view-layout.h" #include "e-day-view-main-item.h" +#include "ea-calendar.h" static void e_day_view_main_item_class_init (EDayViewMainItemClass *class); static void e_day_view_main_item_init (EDayViewMainItem *dvtitem); @@ -106,6 +107,9 @@ item_class->draw = e_day_view_main_item_draw; item_class->point = e_day_view_main_item_point; item_class->event = e_day_view_main_item_event; + + /* init the accessibility support for e_day_view */ + e_day_view_main_item_a11y_init (); } Index: calendar/gui/e-day-view-top-item.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/e-day-view-top-item.c,v retrieving revision 1.36 diff -u -r1.36 e-day-view-top-item.c --- calendar/gui/e-day-view-top-item.c 20 Aug 2003 10:16:59 -0000 1.36 +++ calendar/gui/e-day-view-top-item.c 16 Sep 2003 07:21:00 -0000 @@ -165,12 +165,10 @@ EDayView *day_view; GtkStyle *style; GdkGC *gc, *fg_gc, *bg_gc, *light_gc, *dark_gc; - gchar buffer[128], *format; + gchar buffer[128]; GdkRectangle clip_rect; gint canvas_width, canvas_height, left_edge, day, date_width, date_x; gint item_height, event_num; - struct tm day_start = { 0 }; - struct icaltimetype day_start_tt; PangoLayout *layout; #if 0 @@ -245,34 +243,8 @@ /* Draw the date. Set a clipping rectangle so we don't draw over the next day. */ for (day = 0; day < day_view->days_shown; day++) { - day_start_tt = icaltime_from_timet_with_zone (day_view->day_starts[day], FALSE, - e_cal_view_get_timezone (E_CAL_VIEW (day_view))); - day_start.tm_year = day_start_tt.year - 1900; - day_start.tm_mon = day_start_tt.month - 1; - day_start.tm_mday = day_start_tt.day; - day_start.tm_isdst = -1; - - day_start.tm_wday = time_day_of_week (day_start_tt.day, - day_start_tt.month - 1, - day_start_tt.year); - - if (day_view->date_format == E_DAY_VIEW_DATE_FULL) - /* strftime format %A = full weekday name, %d = day of month, - %B = full month name. Don't use any other specifiers. */ - format = _("%A %d %B"); - else if (day_view->date_format == E_DAY_VIEW_DATE_ABBREVIATED) - /* strftime format %a = abbreviated weekday name, %d = day of month, - %b = abbreviated month name. Don't use any other specifiers. */ - format = _("%a %d %b"); - else if (day_view->date_format == E_DAY_VIEW_DATE_NO_WEEKDAY) - /* strftime format %d = day of month, %b = abbreviated month name. - Don't use any other specifiers. */ - format = _("%d %b"); - else - format = "%d"; - - e_utf8_strftime (buffer, sizeof (buffer), format, &day_start); - + e_day_view_top_item_get_day_label (day_view, day, + buffer, sizeof (buffer)); clip_rect.x = day_view->day_offsets[day] - x; clip_rect.y = 2 - y; clip_rect.width = day_view->day_widths[day]; @@ -690,4 +662,40 @@ return FALSE; } +void +e_day_view_top_item_get_day_label (EDayView *day_view, gint day, + gchar *buffer, gint buffer_len) +{ + struct icaltimetype day_start_tt; + struct tm day_start = { 0 }; + gchar *format; + day_start_tt = icaltime_from_timet_with_zone (day_view->day_starts[day], + FALSE, + e_cal_view_get_timezone (E_CAL_VIEW (day_view))); + day_start.tm_year = day_start_tt.year - 1900; + day_start.tm_mon = day_start_tt.month - 1; + day_start.tm_mday = day_start_tt.day; + day_start.tm_isdst = -1; + + day_start.tm_wday = time_day_of_week (day_start_tt.day, + day_start_tt.month - 1, + day_start_tt.year); + + if (day_view->date_format == E_DAY_VIEW_DATE_FULL) + /* strftime format %A = full weekday name, %d = day of month, + %B = full month name. Don't use any other specifiers. */ + format = _("%A %d %B"); + else if (day_view->date_format == E_DAY_VIEW_DATE_ABBREVIATED) + /* strftime format %a = abbreviated weekday name, %d = day of month, + %b = abbreviated month name. Don't use any other specifiers. */ + format = _("%a %d %b"); + else if (day_view->date_format == E_DAY_VIEW_DATE_NO_WEEKDAY) + /* strftime format %d = day of month, %b = abbreviated month name. + Don't use any other specifiers. */ + format = _("%d %b"); + else + format = "%d"; + + e_utf8_strftime (buffer, buffer_len, format, &day_start); +} Index: calendar/gui/e-day-view-top-item.h =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/e-day-view-top-item.h,v retrieving revision 1.5 diff -u -r1.5 e-day-view-top-item.h --- calendar/gui/e-day-view-top-item.h 27 Oct 2001 16:44:11 -0000 1.5 +++ calendar/gui/e-day-view-top-item.h 16 Sep 2003 07:21:00 -0000 @@ -55,7 +55,8 @@ GtkType e_day_view_top_item_get_type (void); - +void e_day_view_top_item_get_day_label (EDayView *day_view, gint day, + gchar *buffer, gint buffer_len); #ifdef __cplusplus Index: calendar/gui/e-day-view.c =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/e-day-view.c,v retrieving revision 1.219 diff -u -r1.219 e-day-view.c --- calendar/gui/e-day-view.c 1 Sep 2003 06:15:33 -0000 1.219 +++ calendar/gui/e-day-view.c 16 Sep 2003 07:21:05 -0000 @@ -182,9 +182,6 @@ GdkEventKey *event); static void e_day_view_cursor_key_right (EDayView *day_view, GdkEventKey *event); -static void e_day_view_ensure_rows_visible (EDayView *day_view, - gint start_row, - gint end_row); static void e_day_view_scroll (EDayView *day_view, gfloat pages_to_scroll); @@ -217,7 +214,6 @@ GdkEventScroll *scroll, EDayView *day_view); -static void e_day_view_update_calendar_selection_time (EDayView *day_view); static gboolean e_day_view_on_main_canvas_motion (GtkWidget *widget, GdkEventMotion *event, EDayView *day_view); @@ -3414,7 +3410,7 @@ } -static void +void e_day_view_update_calendar_selection_time (EDayView *day_view) { time_t start, end; @@ -5348,6 +5344,7 @@ day_view->selection_start_row, day_view->selection_end_row); + g_signal_emit_by_name (day_view, "selected_time_changed"); e_day_view_update_calendar_selection_time (day_view); /* FIXME: Optimise? */ @@ -5380,6 +5377,7 @@ day_view->selection_start_row, day_view->selection_end_row); + g_signal_emit_by_name (day_view, "selected_time_changed"); e_day_view_update_calendar_selection_time (day_view); /* FIXME: Optimise? */ @@ -5403,6 +5401,7 @@ gtk_widget_queue_draw (day_view->top_canvas); gtk_widget_queue_draw (day_view->main_canvas); } + g_signal_emit_by_name (day_view, "selected_time_changed"); } @@ -5421,6 +5420,7 @@ gtk_widget_queue_draw (day_view->top_canvas); gtk_widget_queue_draw (day_view->main_canvas); } + g_signal_emit_by_name (day_view, "selected_time_changed"); } @@ -5468,7 +5468,7 @@ } -static void +void e_day_view_ensure_rows_visible (EDayView *day_view, gint start_row, gint end_row) Index: calendar/gui/e-day-view.h =================================================================== RCS file: /cvs/gnome/evolution/calendar/gui/e-day-view.h,v retrieving revision 1.51 diff -u -r1.51 e-day-view.h --- calendar/gui/e-day-view.h 20 Aug 2003 10:16:59 -0000 1.51 +++ calendar/gui/e-day-view.h 16 Sep 2003 07:21:06 -0000 @@ -592,6 +592,11 @@ GnomeCanvasItem *item, gint *day_return, gint *event_num_return); +void e_day_view_update_calendar_selection_time (EDayView *day_view); +void e_day_view_ensure_rows_visible (EDayView *day_view, + gint start_row, + gint end_row); + #ifdef __cplusplus } Index: a11y/ChangeLog =================================================================== RCS file: /cvs/gnome/evolution/a11y/ChangeLog,v retrieving revision 1.4 diff -u -r1.4 ChangeLog --- a11y/ChangeLog 27 Aug 2003 03:36:40 -0000 1.4 +++ a11y/ChangeLog 16 Sep 2003 07:21:06 -0000 @@ -1,3 +1,11 @@ +2003-09-16 Bolian Yin <bolian yin sun com> + + * Makefile.am: add entries for new files + * New files added: + ea-day-view-main-item.c ea-day-view-main-item.h + ea-day-view-cell.c ea-day-view-cell.h + * Add debug info and remove some non-C99 compilers warnings. + 2003-08-27 Bolian Yin <bolian yin sun com> * Makefile.am: add widgets directory; move calendar idl stuff to calendar directory; stop make a single shared lib for whole a11y stuff. Index: a11y/calendar/Makefile.am =================================================================== RCS file: /cvs/gnome/evolution/a11y/calendar/Makefile.am,v retrieving revision 1.3 diff -u -r1.3 Makefile.am --- a11y/calendar/Makefile.am 27 Aug 2003 03:36:41 -0000 1.3 +++ a11y/calendar/Makefile.am 16 Sep 2003 07:21:06 -0000 @@ -76,6 +76,10 @@ ea-cal-view-event.h \ ea-day-view.c \ ea-day-view.h \ + ea-day-view-main-item.c \ + ea-day-view-main-item.h \ + ea-day-view-cell.c \ + ea-day-view-cell.h \ ea-week-view.c \ ea-week-view.h \ ea-gnome-calendar.c \ Index: a11y/calendar/ea-cal-view-event.c =================================================================== RCS file: /cvs/gnome/evolution/a11y/calendar/ea-cal-view-event.c,v retrieving revision 1.4 diff -u -r1.4 ea-cal-view-event.c --- a11y/calendar/ea-cal-view-event.c 27 Aug 2003 03:36:41 -0000 1.4 +++ a11y/calendar/ea-cal-view-event.c 16 Sep 2003 07:21:07 -0000 @@ -42,6 +42,11 @@ gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type); +#ifdef ACC_DEBUG +static gint n_ea_cal_view_event_created = 0, n_ea_cal_view_event_destroyed = 0; +static void ea_cal_view_finalize (GObject *object); +#endif + static gpointer parent_class = NULL; GType @@ -100,6 +105,10 @@ ea_cal_view_event_class_init (EaCalViewEventClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); +#ifdef ACC_DEBUG + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = ea_cal_view_finalize; +#endif parent_class = g_type_class_peek_parent (klass); @@ -111,6 +120,15 @@ } +#ifdef ACC_DEBUG +static void ea_cal_view_finalize (GObject *object) +{ + ++n_ea_cal_view_event_destroyed; + printf ("ACC_DEBUG: n_ea_cal_view_event_destroyed = %d\n", + n_ea_cal_view_event_destroyed); +} +#endif + AtkObject* ea_cal_view_event_new (GObject *obj) { @@ -157,8 +175,9 @@ event_role = atk_role_register ("Calendar Event"); atk_obj->role = event_role; #ifdef ACC_DEBUG - printf ("EvoAcc: ea_cal_view_event created %p for item=%p\n", - atk_obj, target_obj); + ++n_ea_cal_view_event_created; + printf ("ACC_DEBUG: n_ea_cal_view_event_created = %d\n", + n_ea_cal_view_event_created); #endif } @@ -235,7 +254,7 @@ ATK_OBJECT_CLASS (parent_class)->set_name (accessible, new_name); #ifdef ACC_DEBUG printf("EvoAcc: name for event accobj=%p, is %s\n", - accessible, new_name); + (void *)accessible, new_name); #endif g_free (new_name); return accessible->name; Index: a11y/calendar/ea-cal-view.c =================================================================== RCS file: /cvs/gnome/evolution/a11y/calendar/ea-cal-view.c,v retrieving revision 1.2 diff -u -r1.2 ea-cal-view.c --- a11y/calendar/ea-cal-view.c 20 Aug 2003 07:46:04 -0000 1.2 +++ a11y/calendar/ea-cal-view.c 16 Sep 2003 07:21:07 -0000 @@ -33,7 +33,6 @@ static void ea_cal_view_class_init (EaCalViewClass *klass); static AtkObject* ea_cal_view_get_parent (AtkObject *accessible); -static gint ea_cal_view_get_index_in_parent (AtkObject *accessible); static void ea_cal_view_real_initialize (AtkObject *accessible, gpointer data); static void ea_cal_view_event_changed_cb (ECalView *cal_view, @@ -95,7 +94,6 @@ parent_class = g_type_class_peek_parent (klass); class->get_parent = ea_cal_view_get_parent; - class->get_index_in_parent = ea_cal_view_get_index_in_parent; class->initialize = ea_cal_view_real_initialize; } @@ -120,12 +118,15 @@ { ECalView *cal_view; GnomeCalendar *gcal; + static AtkRole role = ATK_ROLE_INVALID; g_return_if_fail (EA_IS_CAL_VIEW (accessible)); g_return_if_fail (E_IS_CAL_VIEW (data)); ATK_OBJECT_CLASS (parent_class)->initialize (accessible, data); - accessible->role = ATK_ROLE_CANVAS; + if (role == ATK_ROLE_INVALID) + role = atk_role_register ("Calendar View"); + accessible->role = role; cal_view = E_CAL_VIEW (data); /* add listener for event_changed, event_added @@ -164,12 +165,6 @@ return gtk_widget_get_accessible (GTK_WIDGET(gnomeCalendar)); } -static gint -ea_cal_view_get_index_in_parent (AtkObject *accessible) -{ - return 1; -} - static void ea_cal_view_event_changed_cb (ECalView *cal_view, ECalViewEvent *event, gpointer data) @@ -201,7 +196,7 @@ } if (event_atk_obj) { #ifdef ACC_DEBUG - printf ("AccDebug: event=%p changed\n", event); + printf ("AccDebug: event=%p changed\n", (void *)event); #endif g_object_notify (G_OBJECT(event_atk_obj), "accessible-name"); g_signal_emit_by_name (event_atk_obj, "visible_data_changed"); @@ -245,7 +240,7 @@ if (index < 0) return; #ifdef ACC_DEBUG - printf ("AccDebug: event=%p added\n", event); + printf ("AccDebug: event=%p added\n", (void *)event); #endif g_signal_emit_by_name (atk_obj, "children_changed::add", index, event_atk_obj, NULL); @@ -255,17 +250,22 @@ static void ea_cal_view_dates_change_cb (GnomeCalendar *gcal, gpointer data) { - AtkObject *atk_obj; + AtkObject *ea_cal_view; g_return_if_fail (GNOME_IS_CALENDAR (gcal)); g_return_if_fail (data); g_return_if_fail (EA_IS_CAL_VIEW (data)); - atk_obj = ATK_OBJECT(data); - if (atk_obj->name) { - g_free (atk_obj->name); - atk_obj->name = NULL; - } - g_object_notify (G_OBJECT (data), "accessible-name"); - g_signal_emit_by_name (data, "visible_data_changed"); + ea_cal_view = ATK_OBJECT(data); + + if (ea_cal_view->name) { + g_free (ea_cal_view->name); + ea_cal_view->name = NULL; + } + g_object_notify (G_OBJECT (ea_cal_view), "accessible-name"); + g_signal_emit_by_name (ea_cal_view, "visible_data_changed"); + g_signal_emit_by_name (ea_cal_view, "children_changed", NULL); +#ifdef ACC_DEBUG + printf ("AccDebug: cal view date changed\n"); +#endif } Index: a11y/calendar/ea-calendar.c =================================================================== RCS file: /cvs/gnome/evolution/a11y/calendar/ea-calendar.c,v retrieving revision 1.2 diff -u -r1.2 ea-calendar.c --- a11y/calendar/ea-calendar.c 20 Aug 2003 07:46:05 -0000 1.2 +++ a11y/calendar/ea-calendar.c 16 Sep 2003 07:21:07 -0000 @@ -31,57 +31,65 @@ #include "calendar/ea-cal-view.h" #include "calendar/ea-cal-view-event.h" #include "calendar/ea-day-view.h" +#include "calendar/ea-day-view-main-item.h" #include "calendar/ea-week-view.h" #include "calendar/ea-gnome-calendar.h" -EA_FACTORY (EA_TYPE_CAL_VIEW, ea_cal_view, ea_cal_view_new); -EA_FACTORY (EA_TYPE_DAY_VIEW, ea_day_view, ea_day_view_new); -EA_FACTORY (EA_TYPE_WEEK_VIEW, ea_week_view, ea_week_view_new); -EA_FACTORY (EA_TYPE_GNOME_CALENDAR, ea_gnome_calendar, ea_gnome_calendar_new); +EA_FACTORY (EA_TYPE_CAL_VIEW, ea_cal_view, ea_cal_view_new) +EA_FACTORY (EA_TYPE_DAY_VIEW, ea_day_view, ea_day_view_new) +EA_FACTORY_GOBJECT (EA_TYPE_DAY_VIEW_MAIN_ITEM, ea_day_view_main_item, ea_day_view_main_item_new) +EA_FACTORY (EA_TYPE_WEEK_VIEW, ea_week_view, ea_week_view_new) +EA_FACTORY (EA_TYPE_GNOME_CALENDAR, ea_gnome_calendar, ea_gnome_calendar_new) static gboolean ea_calendar_focus_watcher (GSignalInvocationHint *ihint, - guint n_param_values, - const GValue *param_values, - gpointer data); + guint n_param_values, + const GValue *param_values, + gpointer data); void gnome_calendar_a11y_init (void) { - EA_SET_FACTORY (gnome_calendar_get_type(), ea_gnome_calendar); - /* we only add focus watcher when accessibility is enabled - */ - if (atk_get_root ()) - g_signal_add_emission_hook (g_signal_lookup ("event", E_TYPE_TEXT), - 0, ea_calendar_focus_watcher, - NULL, (GDestroyNotify) NULL); + EA_SET_FACTORY (gnome_calendar_get_type(), ea_gnome_calendar); + /* we only add focus watcher when accessibility is enabled + */ + if (atk_get_root ()) { + g_signal_add_emission_hook (g_signal_lookup ("event", E_TYPE_TEXT), + 0, ea_calendar_focus_watcher, + NULL, (GDestroyNotify) NULL); + g_signal_add_emission_hook (g_signal_lookup ("event-after", + e_day_view_get_type()), + 0, ea_calendar_focus_watcher, + NULL, (GDestroyNotify) NULL); + g_signal_add_emission_hook (g_signal_lookup ("event", + e_day_view_main_item_get_type()), + 0, ea_calendar_focus_watcher, + NULL, (GDestroyNotify) NULL); + + } } void e_cal_view_a11y_init (void) { - EA_SET_FACTORY (e_cal_view_get_type(), ea_cal_view); - /* we only add focus watcher when accessibility is enabled - */ -#if 0 - if (atk_get_root ()) - g_signal_add_emission_hook (g_signal_lookup ("selection_time_changed", - e_cal_view_get_type ()), - 0, ea_calendar_focus_watcher, - NULL, (GDestroyNotify) NULL); -#endif + EA_SET_FACTORY (e_cal_view_get_type(), ea_cal_view); } void e_day_view_a11y_init (void) { - EA_SET_FACTORY (e_day_view_get_type(), ea_day_view); + EA_SET_FACTORY (e_day_view_get_type(), ea_day_view); +} + +void e_day_view_main_item_a11y_init (void) +{ + EA_SET_FACTORY (e_day_view_main_item_get_type (), ea_day_view_main_item); } void e_week_view_a11y_init (void) { - EA_SET_FACTORY (e_week_view_get_type(), ea_week_view); + EA_SET_FACTORY (e_week_view_get_type(), ea_week_view); } gboolean @@ -90,46 +98,53 @@ const GValue *param_values, gpointer data) { - GObject *object; - GdkEvent *event; - - object = g_value_get_object (param_values + 0); - event = g_value_get_boxed (param_values + 1); - - if (E_IS_TEXT (object)) { - /* "event" signal on canvas item - */ - GnomeCanvasItem *canvas_item; - AtkObject *ea_event; - - canvas_item = GNOME_CANVAS_ITEM (object); - if (event->type == GDK_FOCUS_CHANGE) { - if (event->focus_change.in) - ea_event = - ea_calendar_helpers_get_accessible_for (canvas_item); - else - /* focus out */ - ea_event = NULL; - atk_focus_tracker_notify (ea_event); - - } - } -#if 0 - else if (E_IS_DAY_VIEW (object)) { - /* "selection_time_changed" signal on day_view - */ - if (ATK_IS_SELECTION (object)) { - AtkSelection *atk_selection; - AtkObject *atk_obj; - atk_selection = ATK_SELECTION (object); - atk_obj = atk_selection_ref_selection (atk_selection, 0); - + GObject *object; + GdkEvent *event; + AtkObject *ea_event = NULL; + + object = g_value_get_object (param_values + 0); + event = g_value_get_boxed (param_values + 1); + + if (E_IS_TEXT (object)) { + /* "event" signal on canvas item + */ + GnomeCanvasItem *canvas_item; + + canvas_item = GNOME_CANVAS_ITEM (object); + if (event->type == GDK_FOCUS_CHANGE) { + if (event->focus_change.in) + ea_event = + ea_calendar_helpers_get_accessible_for (canvas_item); + else + /* focus out */ + ea_event = NULL; + atk_focus_tracker_notify (ea_event); + + } + } + else if (E_IS_DAY_VIEW (object)) { + EDayView *day_view = E_DAY_VIEW (object); + if (event->type == GDK_FOCUS_CHANGE) { + if (event->focus_change.in) { + /* give main item chance to emit focus */ + gnome_canvas_item_grab_focus (day_view->main_canvas_item); + } + } + } + else if (E_IS_DAY_VIEW_MAIN_ITEM (object)) { + if (event->type == GDK_FOCUS_CHANGE) { + if (event->focus_change.in) { + /* we should emit focus on main item */ + ea_event = atk_gobject_accessible_for_object (object); + } + else + /* focus out */ + ea_event = NULL; #ifdef ACC_DEBUG - printf ("EvoAcc: ref a selection %p\n", atk_selection); -#endif - atk_focus_tracker_notify (atk_obj); - } - } + printf ("EvoAcc: focus notify on day main item %p\n", (void *)object); #endif - return TRUE; + atk_focus_tracker_notify (ea_event); + } + } + return TRUE; } Index: a11y/calendar/ea-calendar.h =================================================================== RCS file: /cvs/gnome/evolution/a11y/calendar/ea-calendar.h,v retrieving revision 1.2 diff -u -r1.2 ea-calendar.h --- a11y/calendar/ea-calendar.h 20 Aug 2003 07:46:05 -0000 1.2 +++ a11y/calendar/ea-calendar.h 16 Sep 2003 07:21:07 -0000 @@ -32,6 +32,7 @@ void gnome_calendar_a11y_init (void); void e_cal_view_a11y_init (void); void e_day_view_a11y_init (void); +void e_day_view_main_item_a11y_init (void); void e_week_view_a11y_init (void); #endif /* _EA_CALENDAR_H__ */ Index: a11y/calendar/ea-day-view-cell.c =================================================================== RCS file: a11y/calendar/ea-day-view-cell.c diff -N a11y/calendar/ea-day-view-cell.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ a11y/calendar/ea-day-view-cell.c 16 Sep 2003 07:21:07 -0000 @@ -0,0 +1,211 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* vim:expandtab:shiftwidth=8:tabstop=8: + */ +/* Evolution Accessibility: ea-day-view-cell.c + * + * Copyright (C) 2003 Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Bolian Yin <bolian yin sun com> Sun Microsystem Inc., 2003 + * + */ + +#include "ea-day-view-cell.h" +#include "ea-day-view-main-item.h" +#include "ea-factory.h" + +/* EDayViewCell */ + +static void e_day_view_cell_class_init (EDayViewCellClass *class); + +EA_FACTORY_GOBJECT (EA_TYPE_DAY_VIEW_CELL, ea_day_view_cell, ea_day_view_cell_new) + +GType +e_day_view_cell_get_type (void) +{ + static GType type = 0; + + if (!type) { + static GTypeInfo tinfo = { + sizeof (EDayViewCellClass), + (GBaseInitFunc) NULL, /* base init */ + (GBaseFinalizeFunc) NULL, /* base finalize */ + (GClassInitFunc) e_day_view_cell_class_init, /* class init */ + (GClassFinalizeFunc) NULL, /* class finalize */ + NULL, /* class data */ + sizeof (EDayViewCell), /* instance size */ + 0, /* nb preallocs */ + (GInstanceInitFunc) NULL, /* instance init */ + NULL /* value table */ + }; + + type = g_type_register_static (G_TYPE_OBJECT, + "EDayViewCell", &tinfo, 0); + } + + return type; +} + +static void +e_day_view_cell_class_init (EDayViewCellClass *class) +{ + EA_SET_FACTORY (e_day_view_cell_get_type (), ea_day_view_cell); +} + +EDayViewCell * +e_day_view_cell_new (EDayView *day_view, gint row, gint column) +{ + GObject *object; + EDayViewCell *cell; + + g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL); + + object = g_object_new (E_TYPE_DAY_VIEW_CELL, NULL); + cell = E_DAY_VIEW_CELL (object); + cell->day_view = day_view; + cell->row = row; + cell->column = column; + +#ifdef ACC_DEBUG + printf ("EvoAcc: e_day_view_cell created %p\n", (void *)cell); +#endif + + return cell; +} + +/* EaDayViewCell */ + +static void ea_day_view_cell_class_init (EaDayViewCellClass *klass); + +static G_CONST_RETURN gchar* ea_day_view_cell_get_name (AtkObject *accessible); +static G_CONST_RETURN gchar* ea_day_view_cell_get_description (AtkObject *accessible); +static gpointer parent_class = NULL; + +#ifdef ACC_DEBUG +static gint n_ea_day_view_cell_created = 0, n_ea_day_view_cell_destroyed = 0; +static void ea_day_view_cell_finalize (GObject *object); +#endif + +GType +ea_day_view_cell_get_type (void) +{ + static GType type = 0; + + if (!type) { + static GTypeInfo tinfo = { + sizeof (EaDayViewCellClass), + (GBaseInitFunc) NULL, /* base init */ + (GBaseFinalizeFunc) NULL, /* base finalize */ + (GClassInitFunc) ea_day_view_cell_class_init, /* class init */ + (GClassFinalizeFunc) NULL, /* class finalize */ + NULL, /* class data */ + sizeof (EaDayViewCell), /* instance size */ + 0, /* nb preallocs */ + (GInstanceInitFunc) NULL, /* instance init */ + NULL /* value table */ + }; + + type = g_type_register_static (ATK_TYPE_GOBJECT_ACCESSIBLE, + "EaDayViewCell", &tinfo, 0); + } + + return type; +} + +static void +ea_day_view_cell_class_init (EaDayViewCellClass *klass) +{ + AtkObjectClass *class = ATK_OBJECT_CLASS (klass); + +#ifdef ACC_DEBUG + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = ea_day_view_cell_finalize; +#endif + + parent_class = g_type_class_peek_parent (klass); + + class->get_name = ea_day_view_cell_get_name; + class->get_description = ea_day_view_cell_get_description; +} + +AtkObject* +ea_day_view_cell_new (GObject *obj) +{ + gpointer object; + AtkObject *atk_object; + + g_return_val_if_fail (E_IS_DAY_VIEW_CELL (obj), NULL); + object = g_object_new (EA_TYPE_DAY_VIEW_CELL, NULL); + atk_object = ATK_OBJECT (object); + atk_object_initialize (atk_object, obj); + atk_object->role = ATK_ROLE_UNKNOWN; + +#ifdef ACC_DEBUG + ++n_ea_day_view_cell_created; + printf ("ACC_DEBUG: n_ea_day_view_cell_created = %d\n", + n_ea_day_view_cell_created); +#endif + return atk_object; +} + +#ifdef ACC_DEBUG +static void ea_day_view_cell_finalize (GObject *object) +{ + ++n_ea_day_view_cell_destroyed; + printf ("ACC_DEBUG: n_ea_day_view_cell_destroyed = %d\n", + n_ea_day_view_cell_destroyed); +} +#endif + +static G_CONST_RETURN gchar* +ea_day_view_cell_get_name (AtkObject *accessible) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewCell *cell; + + g_return_val_if_fail (EA_IS_DAY_VIEW_CELL (accessible), NULL); + + if (!accessible->name) { + AtkObject *ea_main_item; + GnomeCanvasItem *main_item; + gchar *new_name = g_strdup (""); + const gchar *row_label, *column_label; + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return NULL; + + cell = E_DAY_VIEW_CELL (g_obj); + main_item = cell->day_view->main_canvas_item; + ea_main_item = atk_gobject_accessible_for_object (G_OBJECT (main_item)); + column_label = atk_table_get_column_description (ATK_TABLE (ea_main_item), + cell->column); + row_label = atk_table_get_row_description (ATK_TABLE (ea_main_item), + cell->row); + new_name = g_strconcat (column_label, " ", row_label, NULL); + ATK_OBJECT_CLASS (parent_class)->set_name (accessible, new_name); + g_free (new_name); + } + return accessible->name; +} + +static G_CONST_RETURN gchar* +ea_day_view_cell_get_description (AtkObject *accessible) +{ + return ea_day_view_cell_get_name (accessible); +} Index: a11y/calendar/ea-day-view-cell.h =================================================================== RCS file: a11y/calendar/ea-day-view-cell.h diff -N a11y/calendar/ea-day-view-cell.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ a11y/calendar/ea-day-view-cell.h 16 Sep 2003 07:21:07 -0000 @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* vim:expandtab:shiftwidth=8:tabstop=8: + */ +/* Evolution Accessibility: ea-day-view-cell.h + * + * Copyright (C) 2003 Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Bolian Yin <bolian yin sun com> Sun Microsystem Inc., 2003 + * + */ + +#ifndef __EA_DAY_VIEW_CELL_H__ +#define __EA_DAY_VIEW_CELL_H__ + +#include <atk/atkgobjectaccessible.h> +#include "e-day-view.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define E_TYPE_DAY_VIEW_CELL (e_day_view_cell_get_type ()) +#define E_DAY_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_DAY_VIEW_CELL, EDayViewCell)) +#define E_DAY_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_DAY_VIEW_CELL, EDayViewCellClass)) +#define E_IS_DAY_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_DAY_VIEW_CELL)) +#define E_IS_DAY_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_DAY_VIEW_CELL)) +#define E_DAY_VIEW_CELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_DAY_VIEW_CELL, EDayViewCellClass)) + +typedef struct _EDayViewCell EDayViewCell; +typedef struct _EDayViewCellClass EDayViewCellClass; + +struct _EDayViewCell +{ + GObject parent; + EDayView *day_view; + gint row; + gint column; +}; + +GType e_day_view_cell_get_type (void); + +struct _EDayViewCellClass +{ + GObjectClass parent_class; +}; + +EDayViewCell * e_day_view_cell_new (EDayView *day_view, gint row, gint column); + +#define EA_TYPE_DAY_VIEW_CELL (ea_day_view_cell_get_type ()) +#define EA_DAY_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_DAY_VIEW_CELL, EaDayViewCell)) +#define EA_DAY_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_DAY_VIEW_CELL, EaDayViewCellClass)) +#define EA_IS_DAY_VIEW_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_DAY_VIEW_CELL)) +#define EA_IS_DAY_VIEW_CELL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_DAY_VIEW_CELL)) +#define EA_DAY_VIEW_CELL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_DAY_VIEW_CELL, EaDayViewCellClass)) + +typedef struct _EaDayViewCell EaDayViewCell; +typedef struct _EaDayViewCellClass EaDayViewCellClass; + +struct _EaDayViewCell +{ + AtkGObjectAccessible parent; +}; + +GType ea_day_view_cell_get_type (void); + +struct _EaDayViewCellClass +{ + AtkGObjectAccessibleClass parent_class; +}; + +AtkObject* ea_day_view_cell_new (GObject *gobj); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __EA_DAY_VIEW_CELL_H__ */ Index: a11y/calendar/ea-day-view-main-item.c =================================================================== RCS file: a11y/calendar/ea-day-view-main-item.c diff -N a11y/calendar/ea-day-view-main-item.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ a11y/calendar/ea-day-view-main-item.c 16 Sep 2003 07:21:08 -0000 @@ -0,0 +1,1343 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* vim:expandtab:shiftwidth=8:tabstop=8: + */ +/* Evolution Accessibility: ea-day-view-main-item.c + * + * Copyright (C) 2003 Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Bolian Yin <bolian yin sun com> Sun Microsystem Inc., 2003 + * + */ + +#include "ea-day-view-main-item.h" +#include "e-day-view-top-item.h" +#include "ea-day-view.h" +#include "ea-day-view-cell.h" + +/* DayViewCellData */ + +#define CELL_DATA_MAX_COLUMNS E_DAY_VIEW_MAX_DAYS +#define CELL_DATA_MAX_ROWS (12 * 24) /* when a row = 5 mins */ + +struct _DayViewCellData { + gint columns; + gint rows; + char *column_labels[CELL_DATA_MAX_COLUMNS]; + char *row_labels[CELL_DATA_MAX_ROWS]; + EDayViewCell **cells; +}; + +typedef struct _DayViewCellData DayViewCellData; + +DayViewCellData * day_view_cell_data_create (gint days, gint rows); +void day_view_cell_data_destroy (DayViewCellData * cell_data); +EDayViewCell * day_view_cell_data_get_cell (DayViewCellData * cell_data, + gint row, gint column); +void day_view_cell_data_set_cell (DayViewCellData * cell_data, + gint row, gint column, EDayViewCell *cell); +EDayViewCell * +day_view_cell_data_get_cell_at_index (DayViewCellData * cell_data, gint index); +G_CONST_RETURN gchar* +day_view_cell_data_get_column_label (DayViewCellData * cell_data, gint day); +void day_view_cell_data_set_column_label (DayViewCellData * cell_data, + gint day, const gchar *label); +G_CONST_RETURN gchar* +day_view_cell_data_get_row_label (DayViewCellData * cell_data, gint row); +void day_view_cell_data_set_row_label (DayViewCellData * cell_data, + gint row, const gchar *label); + +/* EaDayViewMainItem */ +static void ea_day_view_main_item_class_init (EaDayViewMainItemClass *klass); + +static void ea_day_view_main_item_finalize (GObject *object); +static G_CONST_RETURN gchar* ea_day_view_main_item_get_name (AtkObject *accessible); +static G_CONST_RETURN gchar* ea_day_view_main_item_get_description (AtkObject *accessible); + +static gint ea_day_view_main_item_get_n_children (AtkObject *obj); +static AtkObject* ea_day_view_main_item_ref_child (AtkObject *obj, + gint i); +static AtkObject * ea_day_view_main_item_get_parent (AtkObject *accessible); +static gint ea_day_view_main_item_get_index_in_parent (AtkObject *accessible); + +/* callbacks */ +static void ea_day_view_main_item_dates_change_cb (GnomeCalendar *gcal, gpointer data); +static void ea_day_view_main_item_time_change_cb (EDayView *day_view, gpointer data); + +/* atk table interface */ +static void atk_table_interface_init (AtkTableIface *iface); +static gint table_interface_get_index_at (AtkTable *table, + gint row, + gint column); +static gint table_interface_get_column_at_index (AtkTable *table, + gint index); +static gint table_interface_get_row_at_index (AtkTable *table, + gint index); +static AtkObject* table_interface_ref_at (AtkTable *table, + gint row, + gint column); +static gint table_interface_get_n_rows (AtkTable *table); +static gint table_interface_get_n_columns (AtkTable *table); +static gint table_interface_get_column_extent_at (AtkTable *table, + gint row, + gint column); +static gint table_interface_get_row_extent_at (AtkTable *table, + gint row, + gint column); + +static gboolean table_interface_is_row_selected (AtkTable *table, + gint row); +static gboolean table_interface_is_column_selected (AtkTable *table, + gint row); +static gboolean table_interface_is_selected (AtkTable *table, + gint row, + gint column); +static gint table_interface_get_selected_rows (AtkTable *table, + gint **rows_selected); +static gint table_interface_get_selected_columns (AtkTable *table, + gint **columns_selected); +static gboolean table_interface_add_row_selection (AtkTable *table, gint row); +static gboolean table_interface_remove_row_selection (AtkTable *table, + gint row); +static gboolean table_interface_add_column_selection (AtkTable *table, + gint column); +static gboolean table_interface_remove_column_selection (AtkTable *table, + gint column); +static AtkObject* table_interface_get_row_header (AtkTable *table, gint row); +static AtkObject* table_interface_get_column_header (AtkTable *table, + gint in_col); +static AtkObject* table_interface_get_caption (AtkTable *table); + +static G_CONST_RETURN gchar* +table_interface_get_column_description (AtkTable *table, gint in_col); + +static G_CONST_RETURN gchar* +table_interface_get_row_description (AtkTable *table, gint row); + +static AtkObject* table_interface_get_summary (AtkTable *table); + +/* atk selection interface */ +static void atk_selection_interface_init (AtkSelectionIface *iface); +static gboolean selection_interface_add_selection (AtkSelection *selection, + gint i); +static gboolean selection_interface_clear_selection (AtkSelection *selection); +static AtkObject* selection_interface_ref_selection (AtkSelection *selection, + gint i); +static gint selection_interface_get_selection_count (AtkSelection *selection); +static gboolean selection_interface_is_child_selected (AtkSelection *selection, + gint i); + +/* helpers */ +static DayViewCellData * +ea_day_view_main_item_get_cell_data (EaDayViewMainItem *ea_main_item); + +static void +ea_day_view_main_item_destory_cell_data (EaDayViewMainItem *ea_main_item); + +static gint +ea_day_view_main_item_get_child_index_at (EaDayViewMainItem *ea_main_item, + gint row, gint column); +static gint +ea_day_view_main_item_get_row_at_index (EaDayViewMainItem *ea_main_item, + gint index); +static gint +ea_day_view_main_item_get_column_at_index (EaDayViewMainItem *ea_main_item, + gint index); +static gint +ea_day_view_main_item_get_row_label (EaDayViewMainItem *ea_main_item, + gint row, gchar *buffer, + gint buffer_size); + +#ifdef ACC_DEBUG +static gint n_ea_day_view_main_item_created = 0; +static gint n_ea_day_view_main_item_destroyed = 0; +#endif + +static gpointer parent_class = NULL; + +GType +ea_day_view_main_item_get_type (void) +{ + static GType type = 0; + AtkObjectFactory *factory; + GTypeQuery query; + GType derived_atk_type; + + if (!type) { + static GTypeInfo tinfo = { + sizeof (EaDayViewMainItemClass), + (GBaseInitFunc) NULL, /* base init */ + (GBaseFinalizeFunc) NULL, /* base finalize */ + (GClassInitFunc) ea_day_view_main_item_class_init, + (GClassFinalizeFunc) NULL, /* class finalize */ + NULL, /* class data */ + sizeof (EaDayViewMainItem), /* instance size */ + 0, /* nb preallocs */ + (GInstanceInitFunc) NULL, /* instance init */ + NULL /* value table */ + }; + + static const GInterfaceInfo atk_table_info = { + (GInterfaceInitFunc) atk_table_interface_init, + (GInterfaceFinalizeFunc) NULL, + NULL + }; + static const GInterfaceInfo atk_selection_info = { + (GInterfaceInitFunc) atk_selection_interface_init, + (GInterfaceFinalizeFunc) NULL, + NULL + }; + + + /* + * Figure out the size of the class and instance + * we are run-time deriving from (GailCanvasItem, in this case) + * + */ + + factory = atk_registry_get_factory (atk_get_default_registry (), + e_day_view_main_item_get_type()); + derived_atk_type = atk_object_factory_get_accessible_type (factory); + g_type_query (derived_atk_type, &query); + + tinfo.class_size = query.class_size; + tinfo.instance_size = query.instance_size; + + type = g_type_register_static (derived_atk_type, + "EaDayViewMainItem", &tinfo, 0); + g_type_add_interface_static (type, ATK_TYPE_TABLE, + &atk_table_info); + g_type_add_interface_static (type, ATK_TYPE_SELECTION, + &atk_selection_info); + } + + return type; +} + +static void +ea_day_view_main_item_class_init (EaDayViewMainItemClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + AtkObjectClass *class = ATK_OBJECT_CLASS (klass); + + gobject_class->finalize = ea_day_view_main_item_finalize; + parent_class = g_type_class_peek_parent (klass); + + class->get_name = ea_day_view_main_item_get_name; + class->get_description = ea_day_view_main_item_get_description; + + class->get_n_children = ea_day_view_main_item_get_n_children; + class->ref_child = ea_day_view_main_item_ref_child; + class->get_parent = ea_day_view_main_item_get_parent; + class->get_index_in_parent = ea_day_view_main_item_get_index_in_parent; +} + +AtkObject* +ea_day_view_main_item_new (GObject *obj) +{ + AtkObject *accessible; + GnomeCalendar *gcal; + EDayViewMainItem *main_item; + + g_return_val_if_fail (E_IS_DAY_VIEW_MAIN_ITEM (obj), NULL); + + accessible = ATK_OBJECT (g_object_new (EA_TYPE_DAY_VIEW_MAIN_ITEM, + NULL)); + + atk_object_initialize (accessible, obj); + +#ifdef ACC_DEBUG + ++n_ea_day_view_main_item_created; + printf ("ACC_DEBUG: n_ea_day_view_main_item_created = %d\n", + n_ea_day_view_main_item_created); +#endif + main_item = E_DAY_VIEW_MAIN_ITEM (obj); + g_signal_connect (main_item->day_view, "selected_time_changed", + G_CALLBACK (ea_day_view_main_item_time_change_cb), + accessible); + + /* listen for date changes of calendar */ + gcal = e_cal_view_get_calendar (E_CAL_VIEW (main_item->day_view)); + if (gcal) + g_signal_connect (gcal, "dates_shown_changed", + G_CALLBACK (ea_day_view_main_item_dates_change_cb), + accessible); + + return accessible; +} + +static void +ea_day_view_main_item_finalize (GObject *object) +{ + EaDayViewMainItem *ea_main_item; + + g_return_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (object)); + + ea_main_item = EA_DAY_VIEW_MAIN_ITEM (object); + + /* Free the allocated cell data */ + ea_day_view_main_item_destory_cell_data (ea_main_item); + + G_OBJECT_CLASS (parent_class)->finalize (object); +#ifdef ACC_DEBUG + ++n_ea_day_view_main_item_destroyed; + printf ("ACC_DEBUG: n_ea_day_view_main_item_destroyed = %d\n", + n_ea_day_view_main_item_destroyed); +#endif +} + +static G_CONST_RETURN gchar* +ea_day_view_main_item_get_name (AtkObject *accessible) +{ + return "day view time table"; +} + +static G_CONST_RETURN gchar* +ea_day_view_main_item_get_description (AtkObject *accessible) +{ + return "a table to view and select the current time range"; +} + +static gint +ea_day_view_main_item_get_n_children (AtkObject *accessible) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + + g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), -1); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + return day_view->rows * day_view->days_shown; +} + +static AtkObject * +ea_day_view_main_item_ref_child (AtkObject *accessible, gint index) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + gint n_children; + EDayViewCell *cell; + DayViewCellData *cell_data; + EaDayViewMainItem *ea_main_item; + gint row, column; + + g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), NULL); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return NULL; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + n_children = ea_day_view_main_item_get_n_children (accessible); + if (index < 0 || index >= n_children) + return NULL; + + ea_main_item = EA_DAY_VIEW_MAIN_ITEM (accessible); + cell_data = ea_day_view_main_item_get_cell_data (ea_main_item); + if (!cell_data) + return NULL; + + row = ea_day_view_main_item_get_row_at_index (ea_main_item, index); + column = ea_day_view_main_item_get_column_at_index (ea_main_item, index); + + cell = day_view_cell_data_get_cell (cell_data, row, column); + if (!cell) { + cell = e_day_view_cell_new (day_view, row, column); + day_view_cell_data_set_cell (cell_data, row, column, cell); + } + return g_object_ref (atk_gobject_accessible_for_object (G_OBJECT(cell))); +} + +static AtkObject * +ea_day_view_main_item_get_parent (AtkObject *accessible) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + + g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), NULL); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return NULL; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + return gtk_widget_get_accessible (GTK_WIDGET (main_item->day_view)); +} + +static gint +ea_day_view_main_item_get_index_in_parent (AtkObject *accessible) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + + g_return_val_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (accessible), -1); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (accessible); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + /* always the first child of ea-day-view */ + return 0; +} + +/* callbacks */ + +static void +ea_day_view_main_item_dates_change_cb (GnomeCalendar *gcal, gpointer data) +{ + EaDayViewMainItem *ea_main_item; + + g_return_if_fail (GNOME_IS_CALENDAR (gcal)); + g_return_if_fail (data); + g_return_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (data)); + + ea_main_item = EA_DAY_VIEW_MAIN_ITEM (data); + +#ifdef ACC_DEBUG + printf ("EvoAcc: ea_day_view_main_item update cb\n"); +#endif + + ea_day_view_main_item_destory_cell_data (ea_main_item); +} + +static void +ea_day_view_main_item_time_change_cb (EDayView *day_view, gpointer data) +{ + EaDayViewMainItem *ea_main_item; + + g_return_if_fail (E_IS_DAY_VIEW (day_view)); + g_return_if_fail (data); + g_return_if_fail (EA_IS_DAY_VIEW_MAIN_ITEM (data)); + + ea_main_item = EA_DAY_VIEW_MAIN_ITEM (data); + +#ifdef ACC_DEBUG + printf ("EvoAcc: ea_day_view_main_item time changed cb\n"); +#endif + g_signal_emit_by_name (data, "selection_changed"); +} + +/* helpers */ + +static gint +ea_day_view_main_item_get_child_index_at (EaDayViewMainItem *ea_main_item, + gint row, gint column) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + + g_return_val_if_fail (ea_main_item, -1); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + if (row >= 0 && row < day_view->rows && + column >= 0 && column < day_view->days_shown) + return column * day_view->rows + row; + return -1; +} + +static gint +ea_day_view_main_item_get_row_at_index (EaDayViewMainItem *ea_main_item, + gint index) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + gint n_children; + + g_return_val_if_fail (ea_main_item, -1); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + n_children = ea_day_view_main_item_get_n_children (ATK_OBJECT (ea_main_item)); + if (index >= 0 && index < n_children) + return index % day_view->rows; + return -1; +} + +static gint +ea_day_view_main_item_get_column_at_index (EaDayViewMainItem *ea_main_item, + gint index) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + gint n_children; + + g_return_val_if_fail (ea_main_item, -1); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + n_children = ea_day_view_main_item_get_n_children (ATK_OBJECT (ea_main_item)); + if (index >= 0 && index < n_children) + return index / day_view->rows; + return -1; +} + +static gint +ea_day_view_main_item_get_row_label (EaDayViewMainItem *ea_main_item, + gint row, gchar *buffer, gint buffer_size) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + gchar *suffix; + gint hour, minute, suffix_width; + + g_return_val_if_fail (ea_main_item, 0); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return 0 ; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + hour = day_view->first_hour_shown; + minute = day_view->first_minute_shown; + minute += row * day_view->mins_per_row; + hour = (hour + minute / 60) % 24; + minute %= 60; + + e_day_view_convert_time_to_display (day_view, hour, &hour, + &suffix, &suffix_width); + return g_snprintf (buffer, buffer_size, "%i:%02i %s", + hour, minute, suffix); +} + +static DayViewCellData * +ea_day_view_main_item_get_cell_data (EaDayViewMainItem *ea_main_item) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + DayViewCellData *cell_data; + + g_return_val_if_fail (ea_main_item, NULL); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return NULL; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + cell_data = g_object_get_data (G_OBJECT(ea_main_item), + "ea-day-view-cell-data"); + if (!cell_data) { + cell_data = day_view_cell_data_create (day_view->days_shown, + day_view->rows); + g_object_set_data (G_OBJECT(ea_main_item), + "ea-day-view-cell-data", cell_data); + } + return cell_data; +} + +static void +ea_day_view_main_item_destory_cell_data (EaDayViewMainItem *ea_main_item) +{ + DayViewCellData *cell_data; + + g_return_if_fail (ea_main_item); + + cell_data = g_object_get_data (G_OBJECT(ea_main_item), + "ea-day-view-cell-data"); + if (cell_data) { + day_view_cell_data_destroy (cell_data); + g_object_set_data (G_OBJECT(ea_main_item), + "ea-day-view-cell-data", NULL); + } +} + +/* atk table interface */ + +static void +atk_table_interface_init (AtkTableIface *iface) +{ + g_return_if_fail (iface != NULL); + + iface->ref_at = table_interface_ref_at; + + iface->get_n_rows = table_interface_get_n_rows; + iface->get_n_columns = table_interface_get_n_columns; + iface->get_index_at = table_interface_get_index_at; + iface->get_column_at_index = table_interface_get_column_at_index; + iface->get_row_at_index = table_interface_get_row_at_index; + iface->get_column_extent_at = table_interface_get_column_extent_at; + iface->get_row_extent_at = table_interface_get_row_extent_at; + + iface->is_selected = table_interface_is_selected; + iface->get_selected_rows = table_interface_get_selected_rows; + iface->get_selected_columns = table_interface_get_selected_columns; + iface->is_row_selected = table_interface_is_row_selected; + iface->is_column_selected = table_interface_is_column_selected; + iface->add_row_selection = table_interface_add_row_selection; + iface->remove_row_selection = table_interface_remove_row_selection; + iface->add_column_selection = table_interface_add_column_selection; + iface->remove_column_selection = table_interface_remove_column_selection; + + iface->get_row_header = table_interface_get_row_header; + iface->get_column_header = table_interface_get_column_header; + iface->get_caption = table_interface_get_caption; + iface->get_summary = table_interface_get_summary; + iface->get_row_description = table_interface_get_row_description; + iface->get_column_description = table_interface_get_column_description; +} + +static AtkObject* +table_interface_ref_at (AtkTable *table, + gint row, + gint column) +{ + gint index; + + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + index = ea_day_view_main_item_get_child_index_at (ea_main_item, + row, column); + return ea_day_view_main_item_ref_child (ATK_OBJECT (ea_main_item), index); +} + +static gint +table_interface_get_n_rows (AtkTable *table) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + return day_view->rows; +} + +static gint +table_interface_get_n_columns (AtkTable *table) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + return day_view->days_shown; +} + +static gint +table_interface_get_index_at (AtkTable *table, + gint row, + gint column) +{ + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + return ea_day_view_main_item_get_child_index_at (ea_main_item, + row, column); +} + +static gint +table_interface_get_column_at_index (AtkTable *table, + gint index) +{ + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + return ea_day_view_main_item_get_column_at_index (ea_main_item, index); +} + +static gint +table_interface_get_row_at_index (AtkTable *table, + gint index) +{ + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + return ea_day_view_main_item_get_row_at_index (ea_main_item, index); +} + +static gint +table_interface_get_column_extent_at (AtkTable *table, + gint row, + gint column) +{ + /* FIXME: NOT IMPLEMENTED */ + return 0; +} + +static gint +table_interface_get_row_extent_at (AtkTable *table, + gint row, + gint column) +{ + /* FIXME: NOT IMPLEMENTED */ + return 0; +} + +static gboolean +table_interface_is_row_selected (AtkTable *table, + gint row) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return FALSE; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + if (day_view->selection_start_day == -1) + /* no selection */ + return FALSE; + if (day_view->selection_start_day != day_view->selection_end_day) + /* all row is selected */ + return TRUE; + if (row >= day_view->selection_start_row && + row <= day_view->selection_end_row) + return TRUE; + return FALSE; +} + +static gboolean +table_interface_is_selected (AtkTable *table, + gint row, + gint column) +{ + return table_interface_is_row_selected (table, row); +} + +static gboolean +table_interface_is_column_selected (AtkTable *table, + gint column) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return FALSE; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + if (column >= day_view->selection_start_day && + column <= day_view->selection_end_day) + return TRUE; + return FALSE; +} + +static gint +table_interface_get_selected_rows (AtkTable *table, + gint **rows_selected) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + gint start_row = -1, n_rows = 0; + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + if (day_view->selection_start_day == -1) + return 0; + + if (day_view->selection_start_day != day_view->selection_end_day) { + /* all the rows should be selected */ + n_rows = day_view->rows; + start_row = 0; + } + else if (day_view->selection_start_row != -1) { + start_row = day_view->selection_start_row; + n_rows = day_view->selection_end_row - start_row + 1; + } + if (n_rows > 0 && start_row != -1 && rows_selected) { + gint index; + + *rows_selected = (gint *) g_malloc (n_rows * sizeof (gint)); + for (index = 0; index < n_rows; ++index) + (*rows_selected)[index] = start_row + index; + } + return n_rows; +} + +static gint +table_interface_get_selected_columns (AtkTable *table, + gint **columns_selected) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + gint start_column = -1, n_columns = 0; + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + if (day_view->selection_start_day == -1) + return 0; + + start_column = day_view->selection_start_day; + n_columns = day_view->selection_end_day - start_column + 1; + if (n_columns > 0 && start_column != -1 && columns_selected) { + gint index; + + *columns_selected = (gint *) g_malloc (n_columns * sizeof (gint)); + for (index = 0; index < n_columns; ++index) + (*columns_selected)[index] = start_column + index; + } + return n_columns; +} + +static gboolean +table_interface_add_row_selection (AtkTable *table, + gint row) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return FALSE; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + /* FIXME: we need multi-selection */ + + day_view->selection_start_day = 0; + day_view->selection_end_day = 0; + day_view->selection_start_row = row; + day_view->selection_end_row = row; + + e_day_view_ensure_rows_visible (day_view, + day_view->selection_start_row, + day_view->selection_end_row); + e_day_view_update_calendar_selection_time (day_view); + gtk_widget_queue_draw (day_view->main_canvas); + return TRUE; +} + +static gboolean +table_interface_remove_row_selection (AtkTable *table, + gint row) +{ + return FALSE; +} + +static gboolean +table_interface_add_column_selection (AtkTable *table, + gint column) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return FALSE; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + /* FIXME: we need multi-selection */ + + day_view->selection_start_day = column; + day_view->selection_end_day = column; + day_view->selection_start_row = 0; + day_view->selection_end_row = day_view->rows; + + e_day_view_update_calendar_selection_time (day_view); + gtk_widget_queue_draw (day_view->main_canvas); + return TRUE; +} + +static gboolean +table_interface_remove_column_selection (AtkTable *table, + gint column) +{ + /* FIXME: NOT IMPLEMENTED */ + return FALSE; +} + +static AtkObject* +table_interface_get_row_header (AtkTable *table, + gint row) +{ + /* FIXME: NOT IMPLEMENTED */ + return NULL; +} + +static AtkObject* +table_interface_get_column_header (AtkTable *table, + gint in_col) +{ + /* FIXME: NOT IMPLEMENTED */ + return NULL; +} + +static AtkObject* +table_interface_get_caption (AtkTable *table) +{ + /* FIXME: NOT IMPLEMENTED */ + return NULL; +} + +static G_CONST_RETURN gchar* +table_interface_get_column_description (AtkTable *table, + gint in_col) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + const gchar *description; + DayViewCellData *cell_data; + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return NULL; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + if (in_col < 0 || in_col >= day_view->days_shown) + return NULL; + cell_data = ea_day_view_main_item_get_cell_data (ea_main_item); + if (!cell_data) + return NULL; + + description = day_view_cell_data_get_column_label (cell_data, in_col); + if (!description) { + gchar buffer[128]; + e_day_view_top_item_get_day_label (day_view, in_col, buffer, 128); + day_view_cell_data_set_column_label (cell_data, in_col, buffer); + description = day_view_cell_data_get_column_label (cell_data, in_col); + } + return description; +} + +static G_CONST_RETURN gchar* +table_interface_get_row_description (AtkTable *table, + gint row) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (table); + const gchar *description; + DayViewCellData *cell_data; + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return NULL; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + if (row < 0 || row >= 12 * 24) + return NULL; + cell_data = ea_day_view_main_item_get_cell_data (ea_main_item); + if (!cell_data) + return NULL; + + description = day_view_cell_data_get_row_label (cell_data, row); + if (!description) { + gchar buffer[128]; + ea_day_view_main_item_get_row_label (ea_main_item, row, buffer, sizeof (buffer)); + day_view_cell_data_set_row_label (cell_data, row, buffer); + description = day_view_cell_data_get_row_label (cell_data, + row); + } + return description; +} + +static AtkObject* +table_interface_get_summary (AtkTable *table) +{ + /* FIXME: NOT IMPLEMENTED */ + return NULL; +} + +/* atkselection interface */ + +static void +atk_selection_interface_init (AtkSelectionIface *iface) +{ + g_return_if_fail (iface != NULL); + + iface->add_selection = selection_interface_add_selection; + iface->clear_selection = selection_interface_clear_selection; + iface->ref_selection = selection_interface_ref_selection; + iface->get_selection_count = selection_interface_get_selection_count; + iface->is_child_selected = selection_interface_is_child_selected; +} + +static gboolean +selection_interface_add_selection (AtkSelection *selection, gint i) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection); + gint column, row; + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return FALSE; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + row = ea_day_view_main_item_get_row_at_index (ea_main_item, i); + column = ea_day_view_main_item_get_column_at_index (ea_main_item, i); + + if (row == -1 || column == -1) + return FALSE; + + /*FIXME: multi-selection is needed */ + day_view->selection_start_day = column; + day_view->selection_end_day = column; + day_view->selection_start_row = row; + day_view->selection_end_row = row; + + e_day_view_ensure_rows_visible (day_view, + day_view->selection_start_row, + day_view->selection_end_row); + e_day_view_update_calendar_selection_time (day_view); + gtk_widget_queue_draw (day_view->main_canvas); + return TRUE; +} + +static gboolean +selection_interface_clear_selection (AtkSelection *selection) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection); + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return -1; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + day_view->selection_start_row = -1; + day_view->selection_start_day = -1; + day_view->selection_end_row = -1; + day_view->selection_end_day = -1; + + e_day_view_update_calendar_selection_time (day_view); + gtk_widget_queue_draw (day_view->main_canvas); + + return TRUE; +} + +static AtkObject* +selection_interface_ref_selection (AtkSelection *selection, gint i) +{ + if (selection_interface_is_child_selected (selection, i)) + return ea_day_view_main_item_ref_child (ATK_OBJECT (selection), i); + return NULL; +} + +static gint +selection_interface_get_selection_count (AtkSelection *selection) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection); + gint start_index, end_index; + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return 0; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + if (day_view->selection_start_day == -1 || + day_view->selection_start_row == -1) + return 0; + start_index = ea_day_view_main_item_get_child_index_at (ea_main_item, + day_view->selection_start_row, + day_view->selection_start_day); + end_index = ea_day_view_main_item_get_child_index_at (ea_main_item, + day_view->selection_end_row, + day_view->selection_end_day); + + return end_index - start_index + 1; +} + +static gboolean +selection_interface_is_child_selected (AtkSelection *selection, gint i) +{ + AtkGObjectAccessible *atk_gobj; + GObject *g_obj; + EDayViewMainItem *main_item; + EDayView *day_view; + EaDayViewMainItem* ea_main_item = EA_DAY_VIEW_MAIN_ITEM (selection); + gint column, row; + + atk_gobj = ATK_GOBJECT_ACCESSIBLE (ea_main_item); + g_obj = atk_gobject_accessible_get_object (atk_gobj); + if (!g_obj) + return FALSE; + + main_item = E_DAY_VIEW_MAIN_ITEM (g_obj); + day_view = main_item->day_view; + + row = ea_day_view_main_item_get_row_at_index (ea_main_item, i); + column = ea_day_view_main_item_get_column_at_index (ea_main_item, i); + + if (column < day_view->selection_start_day || + column > day_view->selection_end_day) + return FALSE; + + if ((column == day_view->selection_start_day || + column == day_view->selection_end_day) && + (row < day_view->selection_start_row || + row > day_view->selection_end_row)) + return FALSE; + + /* if comes here, the cell is selected */ + return TRUE; +} + +/* DayViewCellData */ + +DayViewCellData * +day_view_cell_data_create (gint columns, gint rows) +{ + DayViewCellData * cell_data; + gint index; + + g_return_val_if_fail (((columns > 0) && (rows > 0)), NULL); + + cell_data = g_new0 (DayViewCellData, 1); + + cell_data->columns = columns; + cell_data->rows = rows; + + for (index = 0; index < CELL_DATA_MAX_COLUMNS; ++index) + cell_data->column_labels [index] =NULL; + + for (index = 0; index < CELL_DATA_MAX_ROWS; ++index) + cell_data->row_labels [index] = NULL; + + cell_data->cells = (EDayViewCell **)g_new0(gpointer, (columns * rows)); + + for (index = (columns * rows) -1; index >= 0; --index) + cell_data->cells [index] = NULL; + return cell_data; +} + +void +day_view_cell_data_destroy (DayViewCellData * cell_data) +{ + gint index; + g_return_if_fail (cell_data); + + for (index = 0; index < CELL_DATA_MAX_COLUMNS; ++index) + if (cell_data->column_labels [index]) + g_free (cell_data->column_labels [index]); + + for (index = 0; index < CELL_DATA_MAX_ROWS; ++index) + if (cell_data->row_labels [index]) + g_free (cell_data->row_labels [index]); + + for (index = (cell_data->columns * cell_data->rows) -1; index >= 0; --index) + if (cell_data->cells[index]) + g_object_unref (cell_data->cells[index]); + + g_free (cell_data->cells); +} + +EDayViewCell * +day_view_cell_data_get_cell (DayViewCellData * cell_data, + gint row, gint column) +{ + g_return_val_if_fail (cell_data, NULL); + + if (row >= 0 && row < cell_data->rows && + column >= 0 && column < cell_data->columns) + return cell_data->cells[column * cell_data->rows + row]; + return NULL; +} + +void +day_view_cell_data_set_cell (DayViewCellData * cell_data, + gint row, gint column, EDayViewCell *cell) +{ + g_return_if_fail (cell_data); + + if (row >= 0 && row < cell_data->rows && + column >= 0 && column < cell_data->columns) { + gint index = column * cell_data->rows + row; + if (cell) + g_object_ref (cell); + if (cell_data->cells[index]) + g_object_unref (cell_data->cells[index]); + cell_data->cells[index] = cell; + } +} + +EDayViewCell * +day_view_cell_data_get_cell_at_index (DayViewCellData * cell_data, + gint index) +{ + g_return_val_if_fail (cell_data, NULL); + + if (index >=0 && index < (cell_data->columns * cell_data->rows)) + return cell_data->cells [index]; + return NULL; +} + +G_CONST_RETURN gchar* +day_view_cell_data_get_column_label (DayViewCellData * cell_data, + gint day) +{ + g_return_val_if_fail (cell_data, NULL); + g_return_val_if_fail ((day >= 0 && day < cell_data->columns), NULL); + + return cell_data->column_labels[day]; +} + +void +day_view_cell_data_set_column_label (DayViewCellData * cell_data, + gint day, const gchar *label) +{ + g_return_if_fail (cell_data); + g_return_if_fail ((day >= 0 && day < cell_data->columns)); + + if (cell_data->column_labels[day]) + g_free (cell_data->column_labels[day]); + cell_data->column_labels[day] = g_strdup(label); +} + +G_CONST_RETURN gchar* +day_view_cell_data_get_row_label (DayViewCellData * cell_data, + gint row) +{ + g_return_val_if_fail (cell_data, NULL); + g_return_val_if_fail ((row >= 0 && row < cell_data->rows), NULL); + + return cell_data->row_labels[row]; +} + +void +day_view_cell_data_set_row_label (DayViewCellData * cell_data, + gint row, const gchar *label) +{ + g_return_if_fail (cell_data); + g_return_if_fail ((row >= 0 && row < cell_data->rows)); + + if (cell_data->row_labels[row]) + g_free (cell_data->row_labels[row]); + cell_data->row_labels[row] = g_strdup(label); +} Index: a11y/calendar/ea-day-view-main-item.h =================================================================== RCS file: a11y/calendar/ea-day-view-main-item.h diff -N a11y/calendar/ea-day-view-main-item.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ a11y/calendar/ea-day-view-main-item.h 16 Sep 2003 07:21:08 -0000 @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* vim:expandtab:shiftwidth=8:tabstop=8: + */ +/* Evolution Accessibility: ea-day-view-main-item.h + * + * Copyright (C) 2003 Ximian, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Bolian Yin <bolian yin sun com> Sun Microsystem Inc., 2003 + * + */ + +#ifndef __EA_DAY_VIEW_MAIN_ITEM_H__ +#define __EA_DAY_VIEW_MAIN_ITEM_H__ + +#include <atk/atkgobjectaccessible.h> +#include "e-day-view-main-item.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define EA_TYPE_DAY_VIEW_MAIN_ITEM (ea_day_view_main_item_get_type ()) +#define EA_DAY_VIEW_MAIN_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EA_TYPE_DAY_VIEW_MAIN_ITEM, EaDayViewMainItem)) +#define EA_DAY_VIEW_MAIN_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EA_TYPE_DAY_VIEW_MAIN_ITEM, EaDayViewMainItemClass)) +#define EA_IS_DAY_VIEW_MAIN_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EA_TYPE_DAY_VIEW_MAIN_ITEM)) +#define EA_IS_DAY_VIEW_MAIN_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EA_TYPE_DAY_VIEW_MAIN_ITEM)) +#define EA_DAY_VIEW_MAIN_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EA_TYPE_DAY_VIEW_MAIN_ITEM, EaDayViewMainItemClass)) + +typedef struct _EaDayViewMainItem EaDayViewMainItem; +typedef struct _EaDayViewMainItemClass EaDayViewMainItemClass; + +struct _EaDayViewMainItem +{ + AtkGObjectAccessible parent; +}; + +GType ea_day_view_main_item_get_type (void); + +struct _EaDayViewMainItemClass +{ + AtkGObjectAccessibleClass parent_class; +}; + +AtkObject* ea_day_view_main_item_new (GObject *obj); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __EA_DAY_VIEW_MAIN_ITEM_H__ */ Index: a11y/calendar/ea-day-view.c =================================================================== RCS file: /cvs/gnome/evolution/a11y/calendar/ea-day-view.c,v retrieving revision 1.2 diff -u -r1.2 ea-day-view.c --- a11y/calendar/ea-day-view.c 20 Aug 2003 07:46:05 -0000 1.2 +++ a11y/calendar/ea-day-view.c 16 Sep 2003 07:21:09 -0000 @@ -112,7 +112,7 @@ atk_object_initialize (accessible, widget); #ifdef ACC_DEBUG - printf ("EvoAcc: ea_day_view created %p\n", accessible); + printf ("EvoAcc: ea_day_view created %p\n", (void *)accessible); #endif return accessible; @@ -196,7 +196,8 @@ child_num += day_view->events[day]->len; } - return child_num; + /* "+1" for the main item */ + return child_num + 1; } static AtkObject * @@ -218,28 +219,36 @@ return NULL; day_view = E_DAY_VIEW (GTK_ACCESSIBLE (accessible)->widget); - /* a long event */ - if (index < day_view->long_events->len) { - event = &g_array_index (day_view->long_events, - EDayViewEvent, index); + if (index == 0) { + /* index == 0 is the main item */ + atk_object = atk_gobject_accessible_for_object (G_OBJECT (day_view->main_canvas_item)); + g_object_ref (atk_object); } else { - index -= day_view->long_events->len; - day = 0; - while (index >= day_view->events[day]->len) { - index -= day_view->events[day]->len; - ++day; + --index; + /* a long event */ + if (index < day_view->long_events->len) { + event = &g_array_index (day_view->long_events, + EDayViewEvent, index); } + else { + index -= day_view->long_events->len; + day = 0; + while (index >= day_view->events[day]->len) { + index -= day_view->events[day]->len; + ++day; + } - event = &g_array_index (day_view->events[day], - EDayViewEvent, index); - } - if (event && event->canvas_item) { - /* Not use atk_gobject_accessible_for_object here, - * we need to do special thing here - */ - atk_object = ea_calendar_helpers_get_accessible_for (event->canvas_item); - g_object_ref (atk_object); + event = &g_array_index (day_view->events[day], + EDayViewEvent, index); + } + if (event && event->canvas_item) { + /* Not use atk_gobject_accessible_for_object here, + * we need to do special thing here + */ + atk_object = ea_calendar_helpers_get_accessible_for (event->canvas_item); + g_object_ref (atk_object); + } } return atk_object; } Index: a11y/calendar/ea-gnome-calendar.c =================================================================== RCS file: /cvs/gnome/evolution/a11y/calendar/ea-gnome-calendar.c,v retrieving revision 1.3 diff -u -r1.3 ea-gnome-calendar.c --- a11y/calendar/ea-gnome-calendar.c 27 Aug 2003 03:36:41 -0000 1.3 +++ a11y/calendar/ea-gnome-calendar.c 16 Sep 2003 07:21:09 -0000 @@ -128,7 +128,7 @@ } #ifdef ACC_DEBUG - printf ("EvoAcc: ea-gnome-calendar created: %p\n", accessible); + printf ("EvoAcc: ea-gnome-calendar created: %p\n", (void *)accessible); #endif return accessible; @@ -225,7 +225,7 @@ #ifdef ACC_DEBUG printf ("AccDebug: view switch to widget %p (index=%d) \n", - new_widget, index); + (void *)new_widget, index); #endif } Index: a11y/calendar/ea-week-view.c =================================================================== RCS file: /cvs/gnome/evolution/a11y/calendar/ea-week-view.c,v retrieving revision 1.2 diff -u -r1.2 ea-week-view.c --- a11y/calendar/ea-week-view.c 20 Aug 2003 07:46:05 -0000 1.2 +++ a11y/calendar/ea-week-view.c 16 Sep 2003 07:21:09 -0000 @@ -28,6 +28,7 @@ #include "ea-cal-view-event.h" #include "ea-calendar-helpers.h" #include "calendar-commands.h" +#include <gal/e-text/e-text.h> static void ea_week_view_class_init (EaWeekViewClass *klass); @@ -37,6 +38,8 @@ static AtkObject* ea_week_view_ref_child (AtkObject *obj, gint i); +static void get_visible_text_item_count (GnomeCanvasItem *item, gpointer data); + static gpointer parent_class = NULL; GType @@ -113,7 +116,7 @@ atk_object_initialize (accessible, widget); #ifdef ACC_DEBUG - printf ("EvoAcc: ea_week_view created %p\n", accessible); + printf ("EvoAcc: ea_week_view created %p\n", (void *)accessible); #endif return accessible; @@ -139,8 +142,6 @@ label_text = calendar_get_text_for_folder_bar_label (gcal); view_type = gnome_calendar_get_view (gcal); - view_type = gnome_calendar_get_view (gcal); - if (view_type == GNOME_CAL_MONTH_VIEW) accessible->name = g_strconcat ("month view :", label_text, @@ -185,51 +186,102 @@ ea_week_view_get_n_children (AtkObject *accessible) { EWeekView *week_view; + GnomeCanvasGroup *canvas_group; + gint i, count = 0; g_return_val_if_fail (EA_IS_WEEK_VIEW (accessible), -1); if (!GTK_ACCESSIBLE (accessible)->widget) return -1; week_view = E_WEEK_VIEW (GTK_ACCESSIBLE (accessible)->widget); + canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->main_canvas)->root); + g_list_foreach (canvas_group->item_list, (GFunc)get_visible_text_item_count, + &count); + + /* add the number of visible jump buttons */ + for (i = 0; i < E_WEEK_VIEW_MAX_WEEKS * 7; i++) { + if (week_view->jump_buttons[i]->object.flags & GNOME_CANVAS_ITEM_VISIBLE) + ++count; + } - return week_view->events->len; +#ifdef ACC_DEBUG + printf("AccDebug: week view %p has %d children\n", (void *)week_view, count); +#endif + return count; } static AtkObject * ea_week_view_ref_child (AtkObject *accessible, gint index) { EWeekView *week_view; - gint child_num; + gint child_num, max_count; AtkObject *atk_object = NULL; - EWeekViewEvent *event; - EWeekViewEventSpan *span; + gint event_index; + gint jump_button = -1; gint span_num = 0; + gint count = 0; g_return_val_if_fail (EA_IS_WEEK_VIEW (accessible), NULL); child_num = atk_object_get_n_accessible_children (accessible); - if (child_num <= 0 || index < 0 || index >= child_num) + if (child_num <= 0 || index < 0 || index >= child_num) return NULL; if (!GTK_ACCESSIBLE (accessible)->widget) return NULL; week_view = E_WEEK_VIEW (GTK_ACCESSIBLE (accessible)->widget); + max_count = week_view->events->len; - event = &g_array_index (week_view->events, - EWeekViewEvent, index); - span = &g_array_index (week_view->spans, EWeekViewEventSpan, - event->spans_index + span_num); - - if (event) { - /* Not use atk_gobject_accessible_for_object here, - * we need to do special thing here - */ - atk_object = ea_calendar_helpers_get_accessible_for (span->text_item); - g_object_ref (atk_object); + for (event_index = 0; event_index < max_count; ++event_index) { + EWeekViewEvent *event; + EWeekViewEventSpan *span; + gint current_day; + + event = &g_array_index (week_view->events, + EWeekViewEvent, event_index); + span = &g_array_index (week_view->spans, EWeekViewEventSpan, + event->spans_index + span_num); + + if (!event || !span) + continue; + + current_day = span->start_day; + if (span->text_item) + ++count; + else if (current_day != jump_button) { + /* we should go to the jump button */ + jump_button = current_day; + ++count; + } + else + continue; + + if (count == (index + 1)) { + if (span->text_item) { + /* Not use atk_gobject_accessible_for_object for event + * text_item we need to do special thing here + */ + atk_object = ea_calendar_helpers_get_accessible_for (span->text_item); + } + else { + atk_object = atk_gobject_accessible_for_object (G_OBJECT(week_view->jump_buttons[current_day == -1 ? 0 : current_day])); + } + g_object_ref (atk_object); + break; + } } + #ifdef ACC_DEBUG printf ("EvoAcc: ea_week_view_ref_child [%d]=%p\n", - index, atk_object); + index, (void *)atk_object); #endif return atk_object; +} + +static void get_visible_text_item_count (GnomeCanvasItem *item, gpointer data) +{ + gint *count = (gint *)data; + + if (item && E_IS_TEXT (item)) + ++(*count); } Index: a11y/widgets/ea-calendar-item.c =================================================================== RCS file: /cvs/gnome/evolution/a11y/widgets/ea-calendar-item.c,v retrieving revision 1.1 diff -u -r1.1 ea-calendar-item.c --- a11y/widgets/ea-calendar-item.c 27 Aug 2003 03:36:42 -0000 1.1 +++ a11y/widgets/ea-calendar-item.c 16 Sep 2003 07:21:09 -0000 @@ -102,7 +102,7 @@ atk_object_initialize (atk_object, obj); atk_object->role = ATK_ROLE_CALENDAR; #ifdef ACC_DEBUG - g_print ("ea_calendar_item created %p\n", atk_object); + g_print ("ea_calendar_item created %p\n", (void *)atk_object); #endif return atk_object; } Index: a11y/widgets/ea-widgets.c =================================================================== RCS file: /cvs/gnome/evolution/a11y/widgets/ea-widgets.c,v retrieving revision 1.1 diff -u -r1.1 ea-widgets.c --- a11y/widgets/ea-widgets.c 27 Aug 2003 03:36:42 -0000 1.1 +++ a11y/widgets/ea-widgets.c 16 Sep 2003 07:21:09 -0000 @@ -27,7 +27,7 @@ #include "widgets/ea-calendar-item.h" #include "ea-widgets.h" -EA_FACTORY_GOBJECT (EA_TYPE_CALENDAR_ITEM, ea_calendar_item, ea_calendar_item_new); +EA_FACTORY_GOBJECT (EA_TYPE_CALENDAR_ITEM, ea_calendar_item, ea_calendar_item_new) void e_calendar_item_a11y_init (void) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]