AtkRelation: added method that checks relationship and target
authorAlejandro Piñeiro <apinheiro@igalia.com>
Mon, 16 Jul 2012 22:41:06 +0000 (00:41 +0200)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Mon, 16 Jul 2012 22:46:17 +0000 (00:46 +0200)
Note: the algorithm to make this search doesn't have a really
good theorical performance, but this is part caused by the
current internal structure by AtkRelationSet and AtkRelation

https://bugzilla.gnome.org/show_bug.cgi?id=672869

atk/atkobject.c
atk/atkrelationset.c
atk/atkrelationset.h

index b197d2a..4817e16 100755 (executable)
@@ -1636,7 +1636,8 @@ atk_object_add_relationship (AtkObject       *object,
   g_return_val_if_fail (ATK_IS_OBJECT (object), FALSE);
   g_return_val_if_fail (ATK_IS_OBJECT (target), FALSE);
 
-  if (atk_relation_set_contains (object->relation_set, relationship))
+  if (atk_relation_set_contains_target (object->relation_set,
+                                        relationship, target))
     return FALSE;
 
   array[0] = target;
index de52320..f68ed15 100755 (executable)
@@ -339,3 +339,53 @@ atk_relation_set_add_relation_by_type (AtkRelationSet  *set,
     }
 }
 
+/**
+ * atk_relation_set_contains_target:
+ * @set: an #AtkRelationSet
+ * @relationship: an #AtkRelationType
+ * @target: an #AtkObject
+ *
+ * Determines whether the relation set contains a relation that
+ * matches the specified pair formed by type @relationship and object
+ * @target.
+ *
+ * Returns: %TRUE if @set contains a relation with the relationship
+ * type @relationship with an object @target, %FALSE otherwise
+ **/
+
+gboolean
+atk_relation_set_contains_target (AtkRelationSet  *set,
+                                  AtkRelationType relationship,
+                                  AtkObject       *target)
+{
+  GPtrArray *array_relations;
+  GPtrArray *array_target;
+  AtkObject *current_target;
+  AtkRelation *relation;
+  gint i;
+  gint c;
+
+  g_return_val_if_fail (ATK_IS_RELATION_SET (set), FALSE);
+  g_return_val_if_fail (ATK_IS_OBJECT (target), FALSE);
+
+  array_relations = set->relations;
+  if (array_relations == NULL)
+    return FALSE;
+
+  for (i = 0; i < array_relations->len; i++)
+  {
+    relation = g_ptr_array_index (array_relations, i);
+    if (relation->relationship == relationship)
+      {
+        array_target = atk_relation_get_target (relation);
+        for (c = 0; c < array_target->len; c++)
+          {
+            current_target = g_ptr_array_index (array_target, c);
+            if (target == current_target)
+              return TRUE;
+          }
+      }
+  }
+
+  return FALSE;
+}
index 9bf572c..e0b5449 100755 (executable)
@@ -60,6 +60,9 @@ GType atk_relation_set_get_type (void);
 AtkRelationSet* atk_relation_set_new                  (void);
 gboolean        atk_relation_set_contains             (AtkRelationSet  *set,
                                                        AtkRelationType relationship);
+gboolean        atk_relation_set_contains_target      (AtkRelationSet  *set,
+                                                       AtkRelationType relationship,
+                                                       AtkObject       *targe);
 void            atk_relation_set_remove               (AtkRelationSet  *set,
                                                        AtkRelation     *relation);
 void            atk_relation_set_add                  (AtkRelationSet  *set,