Update atk_role_register() to allow extra roles to be defined Update
authorPadraig O'Briain <padraigo@src.gnome.org>
Tue, 4 Dec 2001 17:12:48 +0000 (17:12 +0000)
committerPadraig O'Briain <padraigo@src.gnome.org>
Tue, 4 Dec 2001 17:12:48 +0000 (17:12 +0000)
* atk/atkobject.c:
Update atk_role_register() to allow extra roles to be defined
Update atk_role_get_name() and atk_role_for_name() for newly defined
roles

* tests/testrelation.c:
Add tests for roles

ChangeLog
atk/atkobject.c
tests/testrelation.c

index a4493f0..39ee883 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2001-12-04  Padraig O'Briain  <padraig.obriain@sun.com>
+
+       * atk/atkobject.c:
+       Update atk_role_register() to allow extra roles to be defined
+       Update atk_role_get_name() and atk_role_for_name() for newly defined
+       roles
+
+       * tests/testrelation.c:
+       Add tests for roles
+
 2001-12-03  Padraig O'Briain  <padraig.obriain@sun.com>
 
        * atk/atkrelation.c:
index 81ac0e1..c762db7 100755 (executable)
@@ -25,6 +25,8 @@
 #include "atkmarshal.h"
 #include "atk-enum-types.h"
 
+GPtrArray *extra_roles = NULL;
+
 enum
 {
   PROP_0,  /* gobject convention */
@@ -521,9 +523,11 @@ atk_object_ref_relation_set (AtkObject *accessible)
 AtkRole
 atk_role_register (const gchar *name)
 {
-  /* TODO: associate name with new type */
-  static guint type = ATK_ROLE_LAST_DEFINED;
-  return (++type);
+  if (!extra_roles)
+    extra_roles = g_ptr_array_new ();
+
+  g_ptr_array_add (extra_roles, g_strdup (name));
+  return extra_roles->len + ATK_ROLE_LAST_DEFINED;
 }
 
 /**
@@ -1082,7 +1086,7 @@ atk_role_get_name (AtkRole role)
 {
   GTypeClass *type_class;
   GEnumValue *value;
-  gchar *name;
+  gchar *name = NULL;
 
   type_class = g_type_class_ref (ATK_TYPE_ROLE);
   g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), NULL);
@@ -1091,12 +1095,19 @@ atk_role_get_name (AtkRole role)
 
   if (value)
     {
-      name = value->value_name;
+      name = value->value_nick;
     }
   else
     {
-      value = g_enum_get_value (G_ENUM_CLASS (type_class), ATK_ROLE_INVALID);
-      name = value->value_name;
+      if (extra_roles)
+        {
+          gint n = role;
+
+          n -= ATK_ROLE_LAST_DEFINED + 1;
+
+          if (n < extra_roles->len)
+            name = g_ptr_array_index (extra_roles, n);
+        }
     }
   g_type_class_unref (type_class);
   return name;
@@ -1117,14 +1128,14 @@ atk_role_for_name (const gchar *name)
 {
   GTypeClass *type_class;
   GEnumValue *value;
-  AtkRole role;
+  AtkRole role = ATK_ROLE_INVALID;
 
   g_return_val_if_fail (name, ATK_ROLE_INVALID);
 
   type_class = g_type_class_ref (ATK_TYPE_ROLE);
   g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), ATK_ROLE_INVALID);
 
-  value = g_enum_get_value_by_name (G_ENUM_CLASS (type_class), name);
+  value = g_enum_get_value_by_nick (G_ENUM_CLASS (type_class), name);
 
   if (value)
     {
@@ -1132,7 +1143,23 @@ atk_role_for_name (const gchar *name)
     }
   else
     {
-      role = ATK_ROLE_INVALID;
+     gint i;
+
+      if (extra_roles)
+        {
+          for (i = 0; i < extra_roles->len; i++)
+            {
+              gchar *extra_role = (gchar *)g_ptr_array_index (extra_roles, i);
+
+              g_return_val_if_fail (extra_role, ATK_ROLE_INVALID);
+
+              if (strcmp (name, extra_role) == 0)
+                {
+                  role = i + 1 + ATK_ROLE_LAST_DEFINED;
+                  break;
+                }
+            }
+        }
     }
   g_type_class_unref (type_class);
   
index 26907fa..6ea90ac 100644 (file)
@@ -22,6 +22,7 @@
 #include <string.h>
 
 static gboolean  test_relation (void);
+static gboolean  test_role (void);
 
 static gboolean
 test_relation (void)
@@ -41,7 +42,7 @@ test_relation (void)
   g_return_val_if_fail (name, FALSE);
   if (strcmp (name, "node-child-of") != 0)
     {
-      g_print ("Unexpected name for ATK_STATE_MODAL %s\n", name);
+      g_print ("Unexpected name for ATK_RELATION_NODE_CHILD_OF %s\n", name);
       return FALSE;
     }
 
@@ -84,6 +85,67 @@ test_relation (void)
   return TRUE;
 }
 
+static gboolean
+test_role (void)
+{
+  AtkRole role1, role2;
+  G_CONST_RETURN gchar *name;
+
+  name = atk_role_get_name (ATK_ROLE_PAGE_TAB);
+  g_return_val_if_fail (name, FALSE);
+  if (strcmp (name, "page-tab") != 0)
+    {
+      g_print ("Unexpected name for ATK_ROLE_PAGE_TAB %s\n", name);
+      return FALSE;
+    }
+
+  name = atk_role_get_name (ATK_ROLE_LAYERED_PANE);
+  g_return_val_if_fail (name, FALSE);
+  if (strcmp (name, "layered-pane") != 0)
+    {
+      g_print ("Unexpected name for ATK_ROLE_LAYERED_PANE %s\n", name);
+      return FALSE;
+    }
+
+  role1 = atk_role_for_name ("list-item");
+  if (role1 != ATK_ROLE_LIST_ITEM)
+    {
+      g_print ("Unexpected role for list_item\n");
+      return FALSE;
+    }
+
+  role1 = atk_role_register ("test-role");
+  name = atk_role_get_name (role1);
+  g_return_val_if_fail (name, FALSE);
+  if (strcmp (name, "test-role") != 0)
+    {
+      g_print ("Unexpected name for test-role %s\n", name);
+      return FALSE;
+    }
+  role2 = atk_role_for_name ("test-role");
+  if (role1 != role2)
+  {
+    g_print ("Unexpected role for test-role\n");
+    return FALSE;
+  }
+  role2 = atk_role_for_name ("TEST_ROLE");
+  if (role2 != 0)
+    {
+      g_print ("Unexpected role for TEST_ROLE\n");
+      return FALSE;
+    }
+  /*
+   * Check that a non-existent type returns NULL
+   */
+  name = atk_role_get_name (ATK_ROLE_LAST_DEFINED + 2);
+  if (name)
+    {
+      g_print ("Unexpected name for undefined role %s\n", name);
+      return FALSE;
+    }
+  return TRUE;
+}
+
 int
 gtk_module_init (gint  argc, 
                  char* argv[])
@@ -97,5 +159,10 @@ gtk_module_init (gint  argc,
     g_print ("Relation tests succeeded\n");
   else
     g_print ("Relation tests failed\n");
+  b_ret = test_role ();
+  if (b_ret)
+    g_print ("Role tests succeeded\n");
+  else
+    g_print ("Role tests failed\n");
   return 0;
 }