aboutsummaryrefslogblamecommitdiffstats
path: root/a11y/calendar/ea-calendar-helpers.c
blob: 9b484d0040d1a8330fceb393265a8d2097530416 (plain) (tree)


























                                                                             
                           



                              
                                               


                                         
                                                             








                                                                     
                                                                                                        






                                                                  

                                              
                                                        






                                                               




                                            
                                                             




                                                    
               





                                                                    
                                                                                                       





                                                                               
                                                         
                            
                                        




                                                      
                                   
  
                                                  

    
                    

                                                                          
                                
                             
                                           

























                                                                                       
                                                                       














                                                                                    
                                                                       






                                        
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/* vim:expandtab:shiftwidth=8:tabstop=8:
 */
/* Evolution Accessibility: ea-calendar-helpers.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-calendar-helpers.h"
#include "ea-cal-view-event.h"
#include "ea-jump-button.h"
#include "e-day-view.h"
#include "e-week-view.h"

#include <gal/e-text/e-text.h>
#include <libgnomecanvas/gnome-canvas-pixbuf.h>

/**
 * ea_calendar_helpers_get_accessible_for
 * @canvas_item: the canvas item for a event or a jump button
 * @returns: the atk object for the canvas_item
 * 
 **/
AtkObject *
ea_calendar_helpers_get_accessible_for (GnomeCanvasItem *canvas_item)
{
    AtkObject *atk_obj = NULL;
    GObject *g_obj;

    g_return_val_if_fail ((E_IS_TEXT (canvas_item)) || (GNOME_IS_CANVAS_ITEM (canvas_item)), NULL);;

    g_obj = G_OBJECT (canvas_item);
    /* we cannot use atk_gobject_accessible_for_object here,
     * EaDayViewEvent/EaWeekViewEvent cannot be created by the
     * registered facotry of E_TEXT
     */
    atk_obj = g_object_get_data (g_obj, "accessible-object");
    if (!atk_obj) {
                if (E_IS_TEXT (canvas_item)) {
        atk_obj = ea_cal_view_event_new (g_obj);
                }
                else if (GNOME_IS_CANVAS_PIXBUF(canvas_item)) {
                        atk_obj = ea_jump_button_new (g_obj);
                }
                else
                        return NULL;
        }
    return atk_obj;
}

/**
 * ea_calendar_helpers_get_view_widget_from:
 * @canvas_item: the canvas item for a event or a jump button
 * @returns: the cal view widget if exists
 *
 * Get the cal view widget contains the canvas_item.
 * 
 **/
ECalendarView *
ea_calendar_helpers_get_cal_view_from (GnomeCanvasItem *canvas_item)
{
    GnomeCanvas *canvas;
    GtkWidget *view_widget = NULL;

    g_return_val_if_fail (canvas_item, NULL);
    g_return_val_if_fail ((E_IS_TEXT (canvas_item)) || (GNOME_IS_CANVAS_ITEM (canvas_item)), NULL);

    /* canvas_item is the e_text for the event */
    /* canvas_item->canvas is the ECanvas for day view */
    /* parent of canvas_item->canvas is the EDayView or EWeekView widget */
    canvas = canvas_item->canvas;
    view_widget = gtk_widget_get_parent (GTK_WIDGET(canvas));
    if (!view_widget || !E_IS_CAL_VIEW (view_widget))
        return NULL;
    return E_CAL_VIEW (view_widget);
}

/**
 * ea_calendar_helpers_get_cal_view_event_from
 * @canvas_item: the cavas_item (e_text) for the event
 * @returns: the ECalendarViewEvent
 *
 * Get the ECalendarViewEvent for the canvas_item.
 *
 **/
ECalendarViewEvent *
ea_calendar_helpers_get_cal_view_event_from (GnomeCanvasItem *canvas_item)
{
    ECalendarView *cal_view;
    gboolean event_found;
    ECalendarViewEvent *cal_view_event;

    g_return_val_if_fail (E_IS_TEXT (canvas_item), NULL);

    cal_view = ea_calendar_helpers_get_cal_view_from (canvas_item);

    if (!cal_view)
        return NULL;

    if (E_IS_DAY_VIEW (cal_view)) {
        gint event_day, event_num;
        EDayViewEvent *day_view_event;
        EDayView *day_view = E_DAY_VIEW (cal_view);
        event_found = e_day_view_find_event_from_item (day_view, canvas_item,
                                   &event_day, &event_num);
        if (!event_found)
            return NULL;
        if (event_day == E_DAY_VIEW_LONG_EVENT) {
            /* a long event */
            day_view_event = &g_array_index (day_view->long_events,
                             EDayViewEvent, event_num);
        }
        else {
            /* a main canvas event */
            day_view_event = &g_array_index (day_view->events[event_day],
                             EDayViewEvent, event_num);
        }
        cal_view_event = (ECalendarViewEvent *) day_view_event;
    }
    else if (E_IS_WEEK_VIEW (cal_view)) {
        gint event_num, span_num;
        EWeekViewEvent *week_view_event;
        EWeekView *week_view = E_WEEK_VIEW (cal_view);
        event_found = e_week_view_find_event_from_item (week_view,
                                canvas_item,
                                &event_num,
                                &span_num);
        if (!event_found)
            return NULL;

        week_view_event = &g_array_index (week_view->events, EWeekViewEvent,
                          event_num);

        cal_view_event = (ECalendarViewEvent *)week_view_event;
    }
    else {
        g_assert_not_reached ();
        return NULL;
    }
    return cal_view_event;
}