X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libspi%2Frelation.c;h=80002fac1578ef4338c057bb61d47b331ac6e96e;hb=382015c9a4958feaac31e9c3bbec70eda91c5a40;hp=1ddb74f23531febdc2cd7819ae6c25c8d9f064b6;hpb=e215f4330239bfe0d9bf87dfe968ced9eca79089;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/libspi/relation.c b/libspi/relation.c index 1ddb74f..80002fa 100644 --- a/libspi/relation.c +++ b/libspi/relation.c @@ -2,7 +2,8 @@ * AT-SPI - Assistive Technology Service Provider Interface * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) * - * Copyright 2001 Sun Microsystems Inc. + * Copyright 2001, 2002 Sun Microsystems Inc., + * Copyright 2001, 2002 Ximian, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -24,109 +25,138 @@ #include #include +#include #include -/* Static function declarations */ -static void -spi_relation_class_init (SpiRelationClass *klass); -static void -spi_relation_init (SpiRelation *relation); -static void -spi_relation_finalize (GObject *obj); -static CORBA_string -impl_getURI (PortableServer_Servant _servant, - const CORBA_long i, CORBA_Environment * ev); -static CORBA_short -impl__get_n_anchors (PortableServer_Servant _servant, - CORBA_Environment * ev); -static CORBA_long -impl__get_startIndex (PortableServer_Servant _servant, - CORBA_Environment * ev); -static CORBA_long -impl__get_endIndex (PortableServer_Servant _servant, - CORBA_Environment * ev); -static Accessibility_Accessible -impl_getObject (PortableServer_Servant _servant, - const CORBA_long i, - CORBA_Environment * ev); -static CORBA_boolean -impl_isValid (PortableServer_Servant _servant, - CORBA_Environment * ev); - -static GObjectClass *parent_class; - -GType -spi_relation_get_type (void) +static gboolean +spi_init_relation_type_table (Accessibility_RelationType *types) { - static GType type = 0; - - if (!type) { - static const GTypeInfo tinfo = { - sizeof (SpiRelationClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) spi_relation_class_init, - (GClassFinalizeFunc) NULL, - NULL, /* class data */ - sizeof (SpiRelation), - 0, /* n preallocs */ - (GInstanceInitFunc) spi_relation_init, - NULL /* value table */ - }; - - /* - * Bonobo_type_unique auto-generates a load of - * CORBA structures for us. All derived types must - * use bonobo_type_unique. - */ - type = bonobo_type_unique ( - BONOBO_OBJECT_TYPE, - POA_Accessibility_Relation__init, - NULL, - G_STRUCT_OFFSET (SpiRelationClass, epv), - &tinfo, - "SpiAccessibleRelation"); - } - - return type; + gint i; + + for (i = 0; i < ATK_RELATION_LAST_DEFINED; i++) + types[i] = Accessibility_RELATION_NULL; + + types[ATK_RELATION_CONTROLLED_BY] = Accessibility_RELATION_CONTROLLED_BY; + types[ATK_RELATION_CONTROLLER_FOR] = Accessibility_RELATION_CONTROLLER_FOR; + types[ATK_RELATION_LABEL_FOR] = Accessibility_RELATION_LABEL_FOR; + types[ATK_RELATION_LABELLED_BY] = Accessibility_RELATION_LABELLED_BY; + types[ATK_RELATION_MEMBER_OF] = Accessibility_RELATION_MEMBER_OF; + types[ATK_RELATION_NODE_CHILD_OF] = Accessibility_RELATION_NODE_CHILD_OF; + types[ATK_RELATION_FLOWS_TO] = Accessibility_RELATION_FLOWS_TO; + types[ATK_RELATION_FLOWS_FROM] = Accessibility_RELATION_FLOWS_FROM; + types[ATK_RELATION_SUBWINDOW_OF] = Accessibility_RELATION_SUBWINDOW_OF; + types[ATK_RELATION_EMBEDS] = Accessibility_RELATION_EMBEDS; + types[ATK_RELATION_EMBEDDED_BY] = Accessibility_RELATION_EMBEDDED_BY; + types[ATK_RELATION_POPUP_FOR] = Accessibility_RELATION_POPUP_FOR; + return TRUE; } -static void -spi_relation_class_init (SpiRelationClass *klass) + + +static Accessibility_RelationType +spi_relation_type_from_atk_relation_type (AtkRelationType type) { - GObjectClass * object_class = (GObjectClass *) klass; - POA_Accessibility_Relation__epv *epv = &klass->epv; - parent_class = g_type_class_peek_parent (klass); + static gboolean is_initialized = FALSE; + static Accessibility_RelationType spi_relation_type_table [ATK_RELATION_LAST_DEFINED]; + Accessibility_RelationType spi_type; + + if (!is_initialized) + is_initialized = spi_init_relation_type_table (spi_relation_type_table); + + if (type > ATK_RELATION_NULL && type < ATK_RELATION_LAST_DEFINED) + spi_type = spi_relation_type_table[type]; + else + spi_type = Accessibility_RELATION_EXTENDED; + return spi_type; +} + - object_class->finalize = spi_relation_finalize; - epv->getRelationType = NULL; /* TODO: finish me! */ - epv->getNTargets = NULL; - epv->getTarget = NULL; +static AtkRelation * +get_relation_from_servant (PortableServer_Servant servant) +{ + SpiBase *base = SPI_BASE (bonobo_object_from_servant(servant)); + + g_return_val_if_fail (base, NULL); + return ATK_RELATION(base->gobj); } -static void -spi_relation_init (SpiRelation *relation) + + +static Accessibility_RelationType +impl_getRelationType (PortableServer_Servant servant, + CORBA_Environment * ev) { + AtkRelation *relation = get_relation_from_servant (servant); + AtkRelationType type; + + g_return_val_if_fail (relation != NULL, 0); + type = atk_relation_get_relation_type (relation); + return spi_relation_type_from_atk_relation_type (type); } -static void -spi_relation_finalize (GObject *obj) + +static CORBA_short +impl_getNTargets (PortableServer_Servant servant, + CORBA_Environment * ev) { - SpiRelation *relation = SPI_RELATION(obj); - g_object_unref (relation->relation); - relation->relation = NULL; - parent_class->finalize (obj); + AtkRelation *relation = get_relation_from_servant(servant); + g_return_val_if_fail (relation != NULL, 0); + + return relation->target ? relation->target->len : 0; } + +static CORBA_Object +impl_getTarget (PortableServer_Servant servant, + const CORBA_short index, + CORBA_Environment * ev) +{ + AtkObject *atk_object; + AtkRelation *relation = get_relation_from_servant (servant); + g_return_val_if_fail (relation, NULL); + + if (!relation->target || + index < 0 || + index >= relation->target->len) + return CORBA_OBJECT_NIL; + + atk_object = g_ptr_array_index (relation->target, index); + if (!atk_object) + return CORBA_OBJECT_NIL; + + return spi_accessible_new_return (atk_object, FALSE, ev); +} + + SpiRelation * spi_relation_new (AtkRelation *obj) { - SpiRelation *new_relation = - SPI_RELATION (g_object_new (SPI_RELATION_TYPE, NULL)); - new_relation->relation = obj; - g_object_ref (obj); + SpiRelation *new_relation = g_object_new (SPI_RELATION_TYPE, NULL); + spi_base_construct (SPI_BASE (new_relation), G_OBJECT (obj)); return new_relation; } + +static void +spi_relation_class_init (SpiRelationClass *klass) +{ + POA_Accessibility_Relation__epv *epv = &klass->epv; + + epv->getRelationType = impl_getRelationType; + epv->getNTargets = impl_getNTargets; + epv->getTarget = impl_getTarget; +} + + +static void +spi_relation_init (SpiRelation *relation) +{ +} + + +BONOBO_TYPE_FUNC_FULL (SpiRelation, + Accessibility_Relation, + SPI_TYPE_BASE, + spi_relation)