* Boston, MA 02111-1307, USA.
*/
+#include "config.h"
+
#include <string.h>
#include <glib-object.h>
-#include "atkobject.h"
-#include "atkrelation.h"
-#include "atk-enum-types.h"
+#include "atk.h"
+/**
+ * SECTION:atkrelation
+ * @Short_description: An object used to describe a relation between a
+ * object and one or more other objects.
+ * @Title:AtkRelation
+ *
+ * An AtkRelation describes a relation between an object and one or
+ * more other objects. The actual relations that an object has with
+ * other objects are defined as an AtkRelationSet, which is a set of
+ * AtkRelations.
+ */
enum {
PROP_0,
*
* Returns: the string describing the AtkRelationType
*/
-G_CONST_RETURN gchar*
+const gchar*
atk_relation_type_get_name (AtkRelationType type)
{
GTypeClass *type_class;
GEnumValue *value;
- gchar *name = NULL;
+ const gchar *name = NULL;
type_class = g_type_class_ref (ATK_TYPE_RELATION_TYPE);
g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), NULL);
/**
* atk_relation_new:
- * @targets: an array of pointers to #AtkObjects
+ * @targets: (array length=n_targets): an array of pointers to
+ * #AtkObjects
* @n_targets: number of #AtkObjects pointed to by @targets
* @relationship: an #AtkRelationType with which to create the new
* #AtkRelation
*
* Create a new relation for the specified key and the specified list
- * of targets.
+ * of targets. See also atk_object_add_relationship().
*
* Returns: a pointer to a new #AtkRelation
**/
*
* Gets the target list of @relation
*
- * Returns: the target list of @relation
+ * Returns: (transfer none) (element-type Atk.Object): the target list of @relation
**/
GPtrArray*
atk_relation_get_target (AtkRelation *relation)
g_ptr_array_remove (array, where_the_object_was);
}
+/**
+ * atk_relation_add_target:
+ * @relation: an #AtkRelation
+ * @target: an #AtkObject
+ *
+ * Adds the specified AtkObject to the target for the relation, if it is
+ * not already present. See also atk_object_add_relationship().
+ *
+ *
+ * Since: 1.9
+ **/
+void
+atk_relation_add_target (AtkRelation *relation,
+ AtkObject *target)
+{
+ guint i;
+
+ g_return_if_fail (ATK_IS_RELATION (relation));
+ g_return_if_fail (ATK_IS_OBJECT (target));
+
+ /* first check if target occurs in array ... */
+ for (i = 0; i < relation->target->len; i++)
+ if (g_ptr_array_index(relation->target, i) == target)
+ return;
+
+ g_ptr_array_add (relation->target, target);
+ g_object_weak_ref (G_OBJECT (target), (GWeakNotify) delete_object_while_in_relation, relation->target);
+}
+
+/**
+ * atk_relation_remove_target:
+ * @relation: an #AtkRelation
+ * @target: an #AtkObject
+ *
+ * Remove the specified AtkObject from the target for the relation.
+ *
+ * Returns: TRUE if the removal is successful.
+ **/
+
+gboolean
+atk_relation_remove_target (AtkRelation *relation,
+ AtkObject *target)
+{
+ gboolean ret = FALSE;
+ GPtrArray *array;
+
+ array = atk_relation_get_target (relation);
+
+ if (array && g_ptr_array_remove (array, target))
+ {
+ g_object_weak_unref (G_OBJECT (target),
+ (GWeakNotify) delete_object_while_in_relation,
+ relation->target);
+ ret = TRUE;
+ }
+ return ret;
+}
+
static void
atk_relation_finalize (GObject *object)
{
relation->relationship = g_value_get_enum (value);
break;
case PROP_TARGET:
+ if (relation->target)
+ {
+ gint i;
+
+ for (i = 0; i < relation->target->len; i++)
+ {
+ g_object_weak_unref (G_OBJECT (g_ptr_array_index (relation->target, i)),
+ (GWeakNotify) delete_object_while_in_relation,
+ relation->target);
+ }
+ g_ptr_array_free (relation->target, TRUE);
+ }
boxed = g_value_get_boxed (value);
relation->target = atk_relation_get_ptr_array_from_value_array ( (GValueArray *) boxed);
break;