Make the role conversions from AtkRole to Accessibility_Role and AccessibleRole
authorbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Wed, 12 Dec 2001 21:44:15 +0000 (21:44 +0000)
committerbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Wed, 12 Dec 2001 21:44:15 +0000 (21:44 +0000)
(from ATK, libspi-IDL, and CSPI) robust.  Added some roles used by ATK
to the at-spi role list.

git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@186 e2bd861d-eb25-0410-b326-f6ed22b6b98c

ChangeLog
cspi/spi-roletypes.h
cspi/spi_accessible.c
docs/reference/cspi/tmpl/spi_accessible.sgml
idl/Accessibility_Role.idl
libspi/accessible.c

index 915453f..1239c79 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
 2001-12-12  Bill Haneman <bill.haneman@sun.com>
 
+       * libspi/accessible.c:
+        Convert all AtkRole enumerations to Accessibility_Role enums when
+       getting a role from an AtkObject.
+       
+       * cspi/spi_accessible.c:
+       Complete the conversion of Accessibility_Role enums at runtime to
+       AccessibleRole (SPI_ROLE_*) roles in Accessible_getRole, so that
+       role enums correctly match those given in spi-roletypes.h.  
+       Re-synchronize the local names list for AccessibleRole_getName ().
+       AccessibleRole_getName is now deprecated, since it duplicates the
+       more reliable Accessible_getRoleName.
+       Added some role types from Accessibility_Role.idl.
+
+       * idl/Accessibility_Role.idl:
+       Added some role types used by AtkRole.
+
+2001-12-12  Bill Haneman <bill.haneman@sun.com>
+       
        * cspi/spi.h:
        * cspi/spi_registry.c:
        * cspi/spi_event.c:
index d83ba90..c3fd1e7 100644 (file)
@@ -90,23 +90,31 @@ extern "C" {
 typedef enum
 {
   SPI_ROLE_INVALID,
+  SPI_ROLE_ACCEL_LABEL,
   SPI_ROLE_ALERT,
+  SPI_ROLE_ANIMATION,
+  SPI_ROLE_ARROW,
+  SPI_ROLE_CALENDAR,
   SPI_ROLE_CANVAS,
   SPI_ROLE_CHECK_BOX,
   SPI_ROLE_COLOR_CHOOSER,
   SPI_ROLE_COLUMN_HEADER,
   SPI_ROLE_COMBO_BOX,
-  SPI_ROLE_SPI_DESKTOP_ICON,
-  SPI_ROLE_SPI_DESKTOP_FRAME,
+  SPI_ROLE_DATE_EDITOR,
+  SPI_ROLE_DESKTOP_ICON,
+  SPI_ROLE_DESKTOP_FRAME,
+  SPI_ROLE_DIAL,
   SPI_ROLE_DIALOG,
   SPI_ROLE_DIRECTORY_PANE,
   SPI_ROLE_FILE_CHOOSER,
   SPI_ROLE_FILLER,
   SPI_ROLE_FOCUS_TRAVERSABLE,
+  SPI_ROLE_FONT_CHOOSER,
   SPI_ROLE_FRAME,
   SPI_ROLE_GLASS_PANE,
   SPI_ROLE_HTML_CONTAINER,
   SPI_ROLE_ICON,
+  SPI_ROLE_IMAGE,
   SPI_ROLE_INTERNAL_FRAME,
   SPI_ROLE_LABEL,
   SPI_ROLE_LAYERED_PANE,
@@ -124,25 +132,31 @@ typedef enum
   SPI_ROLE_PROGRESS_BAR,
   SPI_ROLE_PUSH_BUTTON,
   SPI_ROLE_RADIO_BUTTON,
+  SPI_ROLE_RADIO_MENU_ITEM,
   SPI_ROLE_ROOT_PANE,
   SPI_ROLE_ROW_HEADER,
   SPI_ROLE_SCROLL_BAR,
   SPI_ROLE_SCROLL_PANE,
   SPI_ROLE_SEPARATOR,
   SPI_ROLE_SLIDER,
+  SPI_ROLE_SPIN_BUTTON,
   SPI_ROLE_SPLIT_PANE,
+  SPI_ROLE_STATUS_BAR,
   SPI_ROLE_TABLE,
   SPI_ROLE_TABLE_CELL,
   SPI_ROLE_TABLE_COLUMN_HEADER,
   SPI_ROLE_TABLE_ROW_HEADER,
+  SPI_ROLE_TEAROFF_MENU_ITEM,
   SPI_ROLE_TEXT,
   SPI_ROLE_TOGGLE_BUTTON,
   SPI_ROLE_TOOL_BAR,
   SPI_ROLE_TOOL_TIP,
   SPI_ROLE_TREE,
+  SPI_ROLE_TREE_TABLE,
   SPI_ROLE_UNKNOWN,
   SPI_ROLE_VIEWPORT,
   SPI_ROLE_WINDOW,
+  SPI_ROLE_EXTENDED,
   SPI_ROLE_LAST_DEFINED
 } AccessibleRole;
 
index 6f5ff36..c8c13ac 100644 (file)
@@ -17,6 +17,7 @@ static const char *role_names [] =
   "date editor",
   "desktop icon",
   "desktop frame",
+  "dial",
   "dialog",
   "directory pane",
   "file chooser",
@@ -65,6 +66,7 @@ static const char *role_names [] =
   "toolbar",
   "tooltip",
   "tree",
+  "tree-table",
   "<unknown>",
   "viewport",
   "window",
@@ -73,10 +75,104 @@ static const char *role_names [] =
 
 #define MAX_ROLES (sizeof (role_names) / sizeof (char *))
 
+static SPIBoolean
+cspi_init_role_table (AccessibleRole *role_table)
+{
+  int i;
+  for (i = 0; i < Accessibility_ROLE_LAST_DEFINED; ++i)
+    {
+      role_table [i] = SPI_ROLE_UNKNOWN;
+    }
+  role_table [Accessibility_ROLE_INVALID] = SPI_ROLE_INVALID;
+  role_table [Accessibility_ROLE_ACCELERATOR_LABEL] = SPI_ROLE_ACCEL_LABEL;
+  role_table [Accessibility_ROLE_ALERT] = SPI_ROLE_ALERT;
+  role_table [Accessibility_ROLE_ANIMATION] = SPI_ROLE_ANIMATION;
+  role_table [Accessibility_ROLE_ARROW] = SPI_ROLE_ARROW;
+  role_table [Accessibility_ROLE_CALENDAR] = SPI_ROLE_CALENDAR;
+  role_table [Accessibility_ROLE_CANVAS] = SPI_ROLE_CANVAS;
+  role_table [Accessibility_ROLE_CHECK_BOX] = SPI_ROLE_CHECK_BOX;
+  role_table [Accessibility_ROLE_COLOR_CHOOSER] = SPI_ROLE_COLOR_CHOOSER;
+  role_table [Accessibility_ROLE_COLUMN_HEADER] = SPI_ROLE_COLUMN_HEADER;
+  role_table [Accessibility_ROLE_COMBO_BOX] = SPI_ROLE_COMBO_BOX;
+  role_table [Accessibility_ROLE_DATE_EDITOR] = SPI_ROLE_DATE_EDITOR;
+  role_table [Accessibility_ROLE_DESKTOP_ICON] = SPI_ROLE_DESKTOP_ICON;
+  role_table [Accessibility_ROLE_DESKTOP_FRAME] = SPI_ROLE_DESKTOP_FRAME;
+  role_table [Accessibility_ROLE_DIAL] = SPI_ROLE_DIAL;
+  role_table [Accessibility_ROLE_DIALOG] = SPI_ROLE_DIALOG;
+  role_table [Accessibility_ROLE_DIRECTORY_PANE] = SPI_ROLE_DIRECTORY_PANE;
+  role_table [Accessibility_ROLE_FILE_CHOOSER] = SPI_ROLE_FILE_CHOOSER;
+  role_table [Accessibility_ROLE_FILLER] = SPI_ROLE_FILLER;
+  role_table [Accessibility_ROLE_FONT_CHOOSER] = SPI_ROLE_FONT_CHOOSER;
+  role_table [Accessibility_ROLE_FRAME] = SPI_ROLE_FRAME;
+  role_table [Accessibility_ROLE_GLASS_PANE] = SPI_ROLE_GLASS_PANE;
+  role_table [Accessibility_ROLE_HTML_CONTAINER] = SPI_ROLE_HTML_CONTAINER;
+  role_table [Accessibility_ROLE_ICON] = SPI_ROLE_ICON;
+  role_table [Accessibility_ROLE_IMAGE] = SPI_ROLE_IMAGE;
+  role_table [Accessibility_ROLE_INTERNAL_FRAME] = SPI_ROLE_INTERNAL_FRAME;
+  role_table [Accessibility_ROLE_LABEL] = SPI_ROLE_LABEL;
+  role_table [Accessibility_ROLE_LAYERED_PANE] = SPI_ROLE_LAYERED_PANE;
+  role_table [Accessibility_ROLE_LIST] = SPI_ROLE_LIST;
+  role_table [Accessibility_ROLE_LIST_ITEM] = SPI_ROLE_LIST_ITEM;
+  role_table [Accessibility_ROLE_MENU] = SPI_ROLE_MENU;
+  role_table [Accessibility_ROLE_MENU_BAR] = SPI_ROLE_MENU_BAR;
+  role_table [Accessibility_ROLE_MENU_ITEM] = SPI_ROLE_MENU_ITEM;
+  role_table [Accessibility_ROLE_OPTION_PANE] = SPI_ROLE_OPTION_PANE;
+  role_table [Accessibility_ROLE_PAGE_TAB] = SPI_ROLE_PAGE_TAB;
+  role_table [Accessibility_ROLE_PAGE_TAB_LIST] = SPI_ROLE_PAGE_TAB_LIST;
+  role_table [Accessibility_ROLE_PANEL] = SPI_ROLE_PANEL;
+  role_table [Accessibility_ROLE_PASSWORD_TEXT] = SPI_ROLE_PASSWORD_TEXT;
+  role_table [Accessibility_ROLE_POPUP_MENU] = SPI_ROLE_POPUP_MENU;
+  role_table [Accessibility_ROLE_PROGRESS_BAR] = SPI_ROLE_PROGRESS_BAR;
+  role_table [Accessibility_ROLE_PUSH_BUTTON] = SPI_ROLE_PUSH_BUTTON;
+  role_table [Accessibility_ROLE_RADIO_BUTTON] = SPI_ROLE_RADIO_BUTTON;
+  role_table [Accessibility_ROLE_RADIO_MENU_ITEM] = SPI_ROLE_RADIO_MENU_ITEM;
+  role_table [Accessibility_ROLE_ROOT_PANE] = SPI_ROLE_ROOT_PANE;
+  role_table [Accessibility_ROLE_ROW_HEADER] = SPI_ROLE_ROW_HEADER;
+  role_table [Accessibility_ROLE_SCROLL_BAR] = SPI_ROLE_SCROLL_BAR;
+  role_table [Accessibility_ROLE_SCROLL_PANE] = SPI_ROLE_SCROLL_PANE;
+  role_table [Accessibility_ROLE_SEPARATOR] = SPI_ROLE_SEPARATOR;
+  role_table [Accessibility_ROLE_SLIDER] = SPI_ROLE_SLIDER;
+  role_table [Accessibility_ROLE_SPIN_BUTTON] = SPI_ROLE_SPIN_BUTTON;
+  role_table [Accessibility_ROLE_SPLIT_PANE] = SPI_ROLE_SPLIT_PANE;
+  role_table [Accessibility_ROLE_STATUS_BAR] = SPI_ROLE_STATUS_BAR;
+  role_table [Accessibility_ROLE_TABLE] = SPI_ROLE_TABLE;
+  role_table [Accessibility_ROLE_TABLE_CELL] = SPI_ROLE_TABLE_CELL;
+  role_table [Accessibility_ROLE_TEAROFF_MENU_ITEM] = SPI_ROLE_TEAROFF_MENU_ITEM;
+  role_table [Accessibility_ROLE_TEXT] = SPI_ROLE_TEXT;
+  role_table [Accessibility_ROLE_TOGGLE_BUTTON] = SPI_ROLE_TOGGLE_BUTTON;
+  role_table [Accessibility_ROLE_TOOL_BAR] = SPI_ROLE_TOOL_BAR;
+  role_table [Accessibility_ROLE_TOOL_TIP] = SPI_ROLE_TOOL_TIP;
+  role_table [Accessibility_ROLE_TREE] = SPI_ROLE_TREE;
+  role_table [Accessibility_ROLE_TREE_TABLE] = SPI_ROLE_TREE_TABLE;
+  role_table [Accessibility_ROLE_UNKNOWN] = SPI_ROLE_UNKNOWN;
+  role_table [Accessibility_ROLE_VIEWPORT] = SPI_ROLE_VIEWPORT;
+  role_table [Accessibility_ROLE_WINDOW] = SPI_ROLE_WINDOW;
+  role_table [Accessibility_ROLE_EXTENDED] = SPI_ROLE_EXTENDED;
+  role_table [Accessibility_ROLE_LAST_DEFINED] = SPI_ROLE_EXTENDED;
+
+  return TRUE;
+}
+
 static AccessibleRole
 cspi_role_from_spi_role (Accessibility_Role role)
 {
-  return role; /* FIXME: need to compare, equivalence not guaranteed */
+  /* array is sized according to IDL roles because IDL roles are the index */  
+  static AccessibleRole cspi_role_table [Accessibility_ROLE_LAST_DEFINED];
+  static SPIBoolean is_initialized = FALSE;
+  AccessibleRole cspi_role;
+  if (!is_initialized)
+    {
+      is_initialized = cspi_init_role_table (cspi_role_table);     
+    }
+  if (role >= 0 && role < Accessibility_ROLE_LAST_DEFINED)
+    {
+      cspi_role = cspi_role_table [role];          
+    }
+  else
+    {
+      cspi_role = SPI_ROLE_EXTENDED;
+    }
+  return cspi_role; 
 }
 
 /**
@@ -84,7 +180,7 @@ cspi_role_from_spi_role (Accessibility_Role role)
  * @role: an #AccessibleRole object to query.
  *
  * Get a localizeable string that indicates the name of an #AccessibleRole.
- * Currently broken, do not use.
+ * <em>DEPRECATED.</em>
  *
  * Returns: a localizable string name for an #AccessibleRole enumerated type.
  **/
index 1fc69f3..dbadff0 100644 (file)
@@ -321,23 +321,31 @@ Accessible Objects
 </para>
 
 @SPI_ROLE_INVALID: 
+@SPI_ROLE_ACCEL_LABEL: 
 @SPI_ROLE_ALERT: 
+@SPI_ROLE_ANIMATION: 
+@SPI_ROLE_ARROW: 
+@SPI_ROLE_CALENDAR: 
 @SPI_ROLE_CANVAS: 
 @SPI_ROLE_CHECK_BOX: 
 @SPI_ROLE_COLOR_CHOOSER: 
 @SPI_ROLE_COLUMN_HEADER: 
 @SPI_ROLE_COMBO_BOX: 
-@SPI_ROLE_SPI_DESKTOP_ICON: 
-@SPI_ROLE_SPI_DESKTOP_FRAME: 
+@SPI_ROLE_DATE_EDITOR: 
+@SPI_ROLE_DESKTOP_ICON: 
+@SPI_ROLE_DESKTOP_FRAME: 
+@SPI_ROLE_DIAL: 
 @SPI_ROLE_DIALOG: 
 @SPI_ROLE_DIRECTORY_PANE: 
 @SPI_ROLE_FILE_CHOOSER: 
 @SPI_ROLE_FILLER: 
 @SPI_ROLE_FOCUS_TRAVERSABLE: 
+@SPI_ROLE_FONT_CHOOSER: 
 @SPI_ROLE_FRAME: 
 @SPI_ROLE_GLASS_PANE: 
 @SPI_ROLE_HTML_CONTAINER: 
 @SPI_ROLE_ICON: 
+@SPI_ROLE_IMAGE: 
 @SPI_ROLE_INTERNAL_FRAME: 
 @SPI_ROLE_LABEL: 
 @SPI_ROLE_LAYERED_PANE: 
@@ -355,25 +363,31 @@ Accessible Objects
 @SPI_ROLE_PROGRESS_BAR: 
 @SPI_ROLE_PUSH_BUTTON: 
 @SPI_ROLE_RADIO_BUTTON: 
+@SPI_ROLE_RADIO_MENU_ITEM: 
 @SPI_ROLE_ROOT_PANE: 
 @SPI_ROLE_ROW_HEADER: 
 @SPI_ROLE_SCROLL_BAR: 
 @SPI_ROLE_SCROLL_PANE: 
 @SPI_ROLE_SEPARATOR: 
 @SPI_ROLE_SLIDER: 
+@SPI_ROLE_SPIN_BUTTON: 
 @SPI_ROLE_SPLIT_PANE: 
+@SPI_ROLE_STATUS_BAR: 
 @SPI_ROLE_TABLE: 
 @SPI_ROLE_TABLE_CELL: 
 @SPI_ROLE_TABLE_COLUMN_HEADER: 
 @SPI_ROLE_TABLE_ROW_HEADER: 
+@SPI_ROLE_TEAROFF_MENU_ITEM: 
 @SPI_ROLE_TEXT: 
 @SPI_ROLE_TOGGLE_BUTTON: 
 @SPI_ROLE_TOOL_BAR: 
 @SPI_ROLE_TOOL_TIP: 
 @SPI_ROLE_TREE: 
+@SPI_ROLE_TREE_TABLE: 
 @SPI_ROLE_UNKNOWN: 
 @SPI_ROLE_VIEWPORT: 
 @SPI_ROLE_WINDOW: 
+@SPI_ROLE_EXTENDED: 
 @SPI_ROLE_LAST_DEFINED: 
 
 <!-- ##### FUNCTION AccessibleRole_getName ##### -->
index a99b446..87d2c81 100644 (file)
@@ -44,6 +44,8 @@ module Accessibility {
    * indicator for the current state.
    */
   ROLE_CHECK_BOX,
+  /* A menu item that behaves like a check box (see ROLE_CHECK_BOX) */
+  ROLE_CHECK_MENU_ITEM,
   /* A specialized dialog that lets the user choose a color. */
   ROLE_COLOR_CHOOSER,
   /* The header for a column of data */
@@ -59,6 +61,11 @@ module Accessibility {
    * internal frames.
    */
   ROLE_DESKTOP_FRAME,
+  /* 
+   * An object that allows a value to be changed via rotating a visual element,
+   * or which displays a value via such a rotating element. 
+   */
+  ROLE_DIAL,
   /* A top level window with title bar and a border */
   ROLE_DIALOG,
   /*
@@ -199,6 +206,8 @@ module Accessibility {
   ROLE_TABLE_ROW_HEADER,
   /* Object allows menu to be removed from menubar and shown in its own window. */
   ROLE_TEAROFF_MENU_ITEM,
+  /* An object that emulates a terminal */
+  ROLE_TERMINAL,
   /* An object that presents text to the user */
   ROLE_TEXT,
   /*
@@ -216,6 +225,8 @@ module Accessibility {
   ROLE_TOOL_TIP,
   /* An object used to repsent hierarchical information to the user. */
   ROLE_TREE,
+  /* An object that presents both tabular and hierarchical info to the user */
+  ROLE_TREE_TABLE,
   /*
    * The object contains some Accessible information, but its role is
    * not known.
index 1d0eb0e..ef8a66f 100644 (file)
 /* Our parent Gtk object type  */
 #define PARENT_TYPE SPI_TYPE_BASE
 
+static gboolean spi_init_role_lookup_table (Accessibility_Role *role_table);
+static Accessibility_Role spi_role_from_atk_role (AtkRole role);
+
+static gboolean
+spi_init_role_lookup_table (Accessibility_Role *role_table)
+{
+  int i;
+  /* if it's not in the list below, dunno what it is */
+  for (i = 0; i < ATK_ROLE_LAST_DEFINED; ++i)
+    {
+      role_table [i] = Accessibility_ROLE_UNKNOWN;
+    }
+  
+  role_table [ATK_ROLE_INVALID] =          Accessibility_ROLE_INVALID;
+  role_table [ATK_ROLE_ACCEL_LABEL] =      Accessibility_ROLE_ACCELERATOR_LABEL;
+  role_table [ATK_ROLE_ALERT] =            Accessibility_ROLE_ALERT;
+  role_table [ATK_ROLE_ANIMATION] =        Accessibility_ROLE_ANIMATION; 
+  role_table [ATK_ROLE_ARROW] =            Accessibility_ROLE_ARROW; 
+  role_table [ATK_ROLE_CALENDAR] =         Accessibility_ROLE_CALENDAR; 
+  role_table [ATK_ROLE_CANVAS] =           Accessibility_ROLE_CANVAS;
+  role_table [ATK_ROLE_CHECK_BOX] =        Accessibility_ROLE_CHECK_BOX;
+  role_table [ATK_ROLE_CHECK_MENU_ITEM] =  Accessibility_ROLE_CHECK_MENU_ITEM;
+  role_table [ATK_ROLE_COLOR_CHOOSER] =    Accessibility_ROLE_COLOR_CHOOSER;
+  role_table [ATK_ROLE_COLUMN_HEADER] =    Accessibility_ROLE_COLUMN_HEADER;
+  role_table [ATK_ROLE_COMBO_BOX] =        Accessibility_ROLE_COMBO_BOX;
+  role_table [ATK_ROLE_DATE_EDITOR] =      Accessibility_ROLE_DATE_EDITOR;
+  role_table [ATK_ROLE_DESKTOP_ICON] =     Accessibility_ROLE_DESKTOP_ICON;
+  role_table [ATK_ROLE_DESKTOP_FRAME] =    Accessibility_ROLE_DESKTOP_FRAME;
+  role_table [ATK_ROLE_DIAL] =             Accessibility_ROLE_DIAL;
+  role_table [ATK_ROLE_DIALOG] =           Accessibility_ROLE_DIALOG;
+  role_table [ATK_ROLE_DIRECTORY_PANE] =   Accessibility_ROLE_DIRECTORY_PANE;
+  role_table [ATK_ROLE_FILE_CHOOSER] =     Accessibility_ROLE_FILE_CHOOSER;
+  role_table [ATK_ROLE_FILLER] =           Accessibility_ROLE_FILLER;
+  role_table [ATK_ROLE_FONT_CHOOSER] =     Accessibility_ROLE_FONT_CHOOSER;
+  role_table [ATK_ROLE_FRAME] =            Accessibility_ROLE_FRAME;
+  role_table [ATK_ROLE_GLASS_PANE] =       Accessibility_ROLE_GLASS_PANE;
+  role_table [ATK_ROLE_HTML_CONTAINER] =   Accessibility_ROLE_HTML_CONTAINER;
+  role_table [ATK_ROLE_ICON] =             Accessibility_ROLE_ICON;
+  role_table [ATK_ROLE_IMAGE] =            Accessibility_ROLE_IMAGE; 
+  role_table [ATK_ROLE_INTERNAL_FRAME] =   Accessibility_ROLE_INTERNAL_FRAME; 
+  role_table [ATK_ROLE_LABEL] =            Accessibility_ROLE_LABEL;
+  role_table [ATK_ROLE_LAYERED_PANE] =     Accessibility_ROLE_LAYERED_PANE;
+  role_table [ATK_ROLE_LIST] =             Accessibility_ROLE_LIST;
+  role_table [ATK_ROLE_LIST_ITEM] =        Accessibility_ROLE_LIST_ITEM;
+  role_table [ATK_ROLE_MENU] =             Accessibility_ROLE_MENU;
+  role_table [ATK_ROLE_MENU_BAR] =         Accessibility_ROLE_MENU_BAR;
+  role_table [ATK_ROLE_MENU_ITEM] =        Accessibility_ROLE_MENU_ITEM;
+  role_table [ATK_ROLE_OPTION_PANE] =      Accessibility_ROLE_OPTION_PANE;
+  role_table [ATK_ROLE_PAGE_TAB] =         Accessibility_ROLE_PAGE_TAB;
+  role_table [ATK_ROLE_PAGE_TAB_LIST] =    Accessibility_ROLE_PAGE_TAB_LIST; 
+  role_table [ATK_ROLE_PANEL] =            Accessibility_ROLE_PANEL;
+  role_table [ATK_ROLE_PASSWORD_TEXT] =    Accessibility_ROLE_PASSWORD_TEXT;
+  role_table [ATK_ROLE_POPUP_MENU] =       Accessibility_ROLE_POPUP_MENU;
+  role_table [ATK_ROLE_PROGRESS_BAR] =     Accessibility_ROLE_PROGRESS_BAR;
+  role_table [ATK_ROLE_PUSH_BUTTON] =      Accessibility_ROLE_PUSH_BUTTON;
+  role_table [ATK_ROLE_RADIO_BUTTON] =     Accessibility_ROLE_RADIO_BUTTON;
+  role_table [ATK_ROLE_RADIO_MENU_ITEM] =  Accessibility_ROLE_RADIO_MENU_ITEM;
+  role_table [ATK_ROLE_ROOT_PANE] =        Accessibility_ROLE_ROOT_PANE;
+  role_table [ATK_ROLE_ROW_HEADER] =       Accessibility_ROLE_ROW_HEADER;
+  role_table [ATK_ROLE_SCROLL_BAR] =       Accessibility_ROLE_SCROLL_BAR;
+  role_table [ATK_ROLE_SCROLL_PANE] =      Accessibility_ROLE_SCROLL_PANE;
+  role_table [ATK_ROLE_SEPARATOR] =        Accessibility_ROLE_SEPARATOR;
+  role_table [ATK_ROLE_SLIDER] =           Accessibility_ROLE_SLIDER;
+  role_table [ATK_ROLE_SPLIT_PANE] =       Accessibility_ROLE_SPLIT_PANE;
+  role_table [ATK_ROLE_SPIN_BUTTON] =      Accessibility_ROLE_SPIN_BUTTON;
+  role_table [ATK_ROLE_STATUSBAR] =        Accessibility_ROLE_STATUS_BAR;
+  role_table [ATK_ROLE_TABLE] =            Accessibility_ROLE_TABLE;
+  role_table [ATK_ROLE_TABLE_CELL] =       Accessibility_ROLE_TABLE_CELL;
+  role_table [ATK_ROLE_TABLE_COLUMN_HEADER] =
+                                          Accessibility_ROLE_COLUMN_HEADER;
+  role_table [ATK_ROLE_TABLE_ROW_HEADER] = Accessibility_ROLE_ROW_HEADER;
+  role_table [ATK_ROLE_TEAR_OFF_MENU_ITEM] =
+                                          Accessibility_ROLE_TEAROFF_MENU_ITEM;
+  role_table [ATK_ROLE_TERMINAL] =         Accessibility_ROLE_TERMINAL;
+  role_table [ATK_ROLE_TEXT] =             Accessibility_ROLE_TEXT;
+  role_table [ATK_ROLE_TOGGLE_BUTTON] =    Accessibility_ROLE_TOGGLE_BUTTON;
+  role_table [ATK_ROLE_TOOL_BAR] =         Accessibility_ROLE_TOOL_BAR;
+  role_table [ATK_ROLE_TOOL_TIP] =         Accessibility_ROLE_TOOL_TIP;
+  role_table [ATK_ROLE_TREE] =             Accessibility_ROLE_TREE;
+  role_table [ATK_ROLE_TREE_TABLE] =       Accessibility_ROLE_TREE_TABLE;
+  role_table [ATK_ROLE_UNKNOWN] =          Accessibility_ROLE_UNKNOWN;
+  role_table [ATK_ROLE_VIEWPORT] =         Accessibility_ROLE_VIEWPORT;
+  role_table [ATK_ROLE_WINDOW] =           Accessibility_ROLE_WINDOW;
+  role_table [ATK_ROLE_LAST_DEFINED] =     Accessibility_ROLE_EXTENDED;
+  
+  return TRUE;
+}
+
 static Accessibility_Role
 spi_role_from_atk_role (AtkRole role)
 {
+  static gboolean is_initialized = FALSE;
+  static Accessibility_Role spi_role_table [ATK_ROLE_LAST_DEFINED];
   Accessibility_Role spi_role;
 
-  /* TODO: finish and/or make efficient! */
-  switch (role)
-  {
-    case ATK_ROLE_INVALID:
-      spi_role = Accessibility_ROLE_INVALID;
-      break;
-    case ATK_ROLE_ACCEL_LABEL:
-    case ATK_ROLE_ALERT:
-    case ATK_ROLE_ANIMATION: 
-    case ATK_ROLE_ARROW: 
-    case ATK_ROLE_CALENDAR: 
-    case ATK_ROLE_CANVAS:
-    case ATK_ROLE_CHECK_BOX:
-    case ATK_ROLE_CHECK_MENU_ITEM:
-    case ATK_ROLE_COLOR_CHOOSER:
-    case ATK_ROLE_COLUMN_HEADER:
-    case ATK_ROLE_COMBO_BOX:
-    case ATK_ROLE_DATE_EDITOR:
-    case ATK_ROLE_DESKTOP_ICON:
-    case ATK_ROLE_DESKTOP_FRAME:
-    case ATK_ROLE_DIAL:
-    case ATK_ROLE_DIALOG:
-    case ATK_ROLE_DIRECTORY_PANE:
-    case ATK_ROLE_DRAWING_AREA:
-    case ATK_ROLE_FILE_CHOOSER:
-    case ATK_ROLE_FILLER:
-    case ATK_ROLE_FONT_CHOOSER:
-    case ATK_ROLE_FRAME:
-    case ATK_ROLE_GLASS_PANE: 
-    case ATK_ROLE_HTML_CONTAINER: 
-    case ATK_ROLE_ICON: 
-    case ATK_ROLE_IMAGE:
-    case ATK_ROLE_INTERNAL_FRAME:
-    case ATK_ROLE_LABEL:
-    case ATK_ROLE_LAYERED_PANE:
-    case ATK_ROLE_LIST:
-    case ATK_ROLE_LIST_ITEM:
-    case ATK_ROLE_MENU:
-    case ATK_ROLE_MENU_BAR:
-    case ATK_ROLE_MENU_ITEM:
-    case ATK_ROLE_OPTION_PANE:
-    case ATK_ROLE_PAGE_TAB:
-    case ATK_ROLE_PAGE_TAB_LIST:
-    case ATK_ROLE_PANEL:
-    case ATK_ROLE_PASSWORD_TEXT:
-    case ATK_ROLE_POPUP_MENU:
-    case ATK_ROLE_PROGRESS_BAR:
-    case ATK_ROLE_PUSH_BUTTON:
-    case ATK_ROLE_RADIO_BUTTON:
-    case ATK_ROLE_RADIO_MENU_ITEM:
-    case ATK_ROLE_ROOT_PANE:
-    case ATK_ROLE_ROW_HEADER:
-    case ATK_ROLE_SCROLL_BAR:
-    case ATK_ROLE_SCROLL_PANE:
-    case ATK_ROLE_SEPARATOR:
-    case ATK_ROLE_SLIDER:
-    case ATK_ROLE_SPLIT_PANE:
-    case ATK_ROLE_SPIN_BUTTON:
-    case ATK_ROLE_STATUSBAR:
-    case ATK_ROLE_TABLE:
-    case ATK_ROLE_TABLE_CELL:
-    case ATK_ROLE_TABLE_COLUMN_HEADER:
-    case ATK_ROLE_TABLE_ROW_HEADER:
-    case ATK_ROLE_TEAR_OFF_MENU_ITEM:
-    case ATK_ROLE_TERMINAL:
-    case ATK_ROLE_TEXT:
-    case ATK_ROLE_TOGGLE_BUTTON:
-    case ATK_ROLE_TOOL_BAR:
-    case ATK_ROLE_TOOL_TIP:
-    case ATK_ROLE_TREE:
-    case ATK_ROLE_TREE_TABLE:
-    case ATK_ROLE_UNKNOWN:
-    case ATK_ROLE_VIEWPORT:
-    case ATK_ROLE_WINDOW:
-    case ATK_ROLE_LAST_DEFINED:
-    default:
+  if (!is_initialized)
+   {
+     is_initialized = spi_init_role_lookup_table (spi_role_table);        
+   }
+
+  if (role >= 0 && role < ATK_ROLE_LAST_DEFINED)
+    {
+      spi_role = spi_role_table [role];
+    }
+  else
+    {
       spi_role = Accessibility_ROLE_EXTENDED;      
-  }
+    }
   return spi_role;
 }