Added new method to Accessibility::Table; see RFE #326536.
[platform/core/uifw/at-spi2-atk.git] / libspi / table.c
index 111c872..33290dd 100644 (file)
@@ -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
@@ -35,7 +36,7 @@ spi_table_interface_new (AtkObject *obj)
 {
   SpiTable *new_table = g_object_new (SPI_TABLE_TYPE, NULL);
 
-  spi_base_construct (SPI_BASE (new_table), obj);
+  spi_base_construct (SPI_BASE (new_table), G_OBJECT(obj));
 
   return new_table;
 }
@@ -46,12 +47,9 @@ get_table_from_servant (PortableServer_Servant servant)
 {
   SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant));
 
-  if (!object)
-    {
-      return NULL;
-    }
-
-  return ATK_TABLE (object->atko);
+  g_return_val_if_fail (object, NULL);
+  g_return_val_if_fail (ATK_IS_OBJECT(object->gobj), NULL);
+  return ATK_TABLE (object->gobj);
 }
 
 
@@ -93,7 +91,7 @@ impl__get_nRows (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, 0);
 
-  return (CORBA_long) atk_table_get_n_rows (table);
+  return atk_table_get_n_rows (table);
 }
 
 
@@ -105,7 +103,7 @@ impl__get_nColumns (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, 0);
 
-  return (CORBA_long) atk_table_get_n_columns (table);
+  return atk_table_get_n_columns (table);
 }
 
 
@@ -120,8 +118,7 @@ impl_getAccessibleAt (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, CORBA_OBJECT_NIL);
 
-  atk_object = atk_table_ref_at (table,
-                                (gint) row, (gint) column);
+  atk_object = atk_table_ref_at (table, row, column);
 
   return spi_accessible_new_return (atk_object, TRUE, ev);
 }
@@ -137,8 +134,7 @@ impl_getIndexAt (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, 0);
 
-  return (CORBA_long)
-    atk_table_get_index_at (table, (gint) row, (gint) column);
+  return atk_table_get_index_at (table, row, column);
 }
 
 
@@ -151,8 +147,7 @@ impl_getRowAtIndex (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, 0);
 
-  return (CORBA_long)
-    atk_table_get_row_at_index (table, (gint) index);
+  return atk_table_get_row_at_index (table, index);
 }
 
 
@@ -165,8 +160,7 @@ impl_getColumnAtIndex (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, 0);
 
-  return (CORBA_long)
-    atk_table_get_column_at_index (table, (gint) index);
+  return atk_table_get_column_at_index (table, index);
 }
 
 
@@ -178,7 +172,7 @@ impl_getRowDescription (PortableServer_Servant servant,
   const char *rv;
   AtkTable   *table = get_table_from_servant (servant);
 
-  g_return_val_if_fail (table != NULL, 0);
+  g_return_val_if_fail (table != NULL, NULL);
   
   rv = atk_table_get_row_description (table, row);
 
@@ -203,7 +197,7 @@ impl_getColumnDescription (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, CORBA_string_dup (""));
   
-  rv = atk_table_get_row_description (table, column);
+  rv = atk_table_get_column_description (table, column);
 
   if (rv)
     {
@@ -226,9 +220,7 @@ impl_getRowExtentAt (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, -1);
 
-  return (CORBA_long)
-    atk_table_get_row_extent_at (table,
-                                (gint) row, (gint) column);
+  return atk_table_get_row_extent_at (table, row, column);
 }
 
 
@@ -242,9 +234,7 @@ impl_getColumnExtentAt (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, -1);
 
-  return (CORBA_long)
-    atk_table_get_column_extent_at (table,
-                                   (gint) row, (gint) column);
+  return atk_table_get_column_extent_at (table, row, column);
 }
 
 
@@ -258,7 +248,7 @@ impl_getRowHeader (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, CORBA_OBJECT_NIL);
 
-  header = atk_table_get_row_header (table, (gint) row);
+  header = atk_table_get_row_header (table, row);
 
   return spi_accessible_new_return (header, FALSE, ev);
 }
@@ -274,17 +264,47 @@ impl_getColumnHeader (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, CORBA_OBJECT_NIL);
 
-  header = atk_table_get_column_header (table, (gint) column);
+  header = atk_table_get_column_header (table, column);
 
   return spi_accessible_new_return (header, FALSE, ev);
 }
 
+static CORBA_long
+impl__get_nSelectedRows (PortableServer_Servant servant,
+                        CORBA_Environment     *ev)
+{
+  gint *selectedRows = NULL;
+  gint retval = 0;
+  AtkTable *table = get_table_from_servant (servant);
+
+  bonobo_return_val_if_fail (table != NULL, 0, ev);
+
+  retval = atk_table_get_selected_rows (table, &selectedRows);
+  if (selectedRows) g_free (selectedRows);
+  return retval;
+}
+
+
+static CORBA_long
+impl__get_nSelectedColumns (PortableServer_Servant servant,
+                           CORBA_Environment     *ev)
+{
+  gint *selectedColumns = NULL;
+  gint retval = 0;
+  AtkTable *table = get_table_from_servant (servant);
+
+  bonobo_return_val_if_fail (table != NULL, 0, ev);
+
+  retval = atk_table_get_selected_columns (table, &selectedColumns);
+  if (selectedColumns) g_free (selectedColumns);
+  return retval;
+}
 
 static Accessibility_LongSeq *
 impl_getSelectedRows (PortableServer_Servant servant,
                      CORBA_Environment     *ev)
 {
-  gint *selectedRows;
+  gint *selectedRows = NULL;
   gint length;
   Accessibility_LongSeq *retval;
   AtkTable *table = get_table_from_servant (servant);
@@ -293,18 +313,18 @@ impl_getSelectedRows (PortableServer_Servant servant,
 
   length = atk_table_get_selected_rows (table, &selectedRows);
 
-  bonobo_return_val_if_fail (length > 0, NULL, ev);
+  bonobo_return_val_if_fail (length >= 0, NULL, ev);
 
   retval = Accessibility_LongSeq__alloc ();
-  retval->_maximum = retval->_length = (CORBA_long) length;
+  retval->_maximum = retval->_length = length;
   retval->_buffer = Accessibility_LongSeq_allocbuf (length);
 
-  while (--length)
+  while (--length >= 0)
     {
-      retval->_buffer[length] = (CORBA_long) selectedRows[length];
+      retval->_buffer[length] = selectedRows[length];
     }
 
-  g_free ((gpointer) selectedRows);
+  if (selectedRows) g_free (selectedRows);
 
   return retval;
 }
@@ -314,7 +334,7 @@ static Accessibility_LongSeq *
 impl_getSelectedColumns (PortableServer_Servant servant,
                         CORBA_Environment     *ev)
 {
-  gint *selectedColumns;
+  gint *selectedColumns = NULL;
   gint length;
   Accessibility_LongSeq *retval;
   AtkTable *table = get_table_from_servant (servant);
@@ -326,15 +346,15 @@ impl_getSelectedColumns (PortableServer_Servant servant,
   bonobo_return_val_if_fail (length >= 0, NULL, ev);
 
   retval = Accessibility_LongSeq__alloc ();
-  retval->_maximum = retval->_length = (CORBA_long) length;
+  retval->_maximum = retval->_length = length;
   retval->_buffer = Accessibility_LongSeq_allocbuf (length);
 
-  while (--length)
+  while (--length >= 0)
     {
       retval->_buffer[length] = (CORBA_long) selectedColumns[length];
     }
 
-  g_free ((gpointer) selectedColumns);
+  if (selectedColumns) g_free (selectedColumns);
 
   return retval;
 }
@@ -349,7 +369,7 @@ impl_isRowSelected (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, FALSE);
 
-  return (CORBA_boolean) atk_table_is_row_selected (table, (gint) row);
+  return atk_table_is_row_selected (table, row);
 }
 
 
@@ -362,11 +382,103 @@ impl_isColumnSelected (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, FALSE);
 
-  return (CORBA_boolean) atk_table_is_column_selected (table, (gint) column);
+  return atk_table_is_column_selected (table, column);
+}
+
+static CORBA_boolean
+impl_addRowSelection (PortableServer_Servant servant,
+                     const CORBA_long       row,
+                     CORBA_Environment     *ev)
+{
+  AtkTable *table = get_table_from_servant (servant);
+
+  g_return_val_if_fail (table != NULL, FALSE);
+
+  return atk_table_add_row_selection (table, row);
+}
+
+
+static CORBA_boolean
+impl_addColumnSelection (PortableServer_Servant servant,
+                        const CORBA_long       column,
+                        CORBA_Environment     *ev)
+{
+  AtkTable *table = get_table_from_servant (servant);
+
+  g_return_val_if_fail (table != NULL, FALSE);
+
+  return atk_table_add_column_selection (table, column);
 }
 
 
 static CORBA_boolean
+impl_removeRowSelection (PortableServer_Servant servant,
+                        const CORBA_long       row,
+                        CORBA_Environment     *ev)
+{
+  AtkTable *table = get_table_from_servant (servant);
+
+  g_return_val_if_fail (table != NULL, FALSE);
+
+  return atk_table_remove_row_selection (table, row);
+}
+
+
+static CORBA_boolean
+impl_removeColumnSelection (PortableServer_Servant servant,
+                           const CORBA_long       column,
+                           CORBA_Environment     *ev)
+{
+  AtkTable *table = get_table_from_servant (servant);
+
+  g_return_val_if_fail (table != NULL, FALSE);
+
+  return atk_table_remove_column_selection (table, column);
+}
+
+
+static CORBA_boolean
+impl_getRowColumnExtentsAtIndex (PortableServer_Servant servant,
+                                const CORBA_long index,
+                                CORBA_long *row,
+                                CORBA_long *column,
+                                CORBA_long *row_extents,
+                                CORBA_long *col_extents,
+                                CORBA_boolean *is_selected,
+                                CORBA_Environment *ev)
+{
+
+  AtkObject *cell;
+  AtkRole role;
+  AtkTable *table = get_table_from_servant (servant);
+  gint intColumn, intRow, intRow_extents, intCol_extents;
+  gboolean boolIs_selected;
+
+  g_return_val_if_fail (table != NULL, FALSE);
+
+  intColumn = atk_table_get_column_at_index (table, index);
+  intRow = atk_table_get_row_at_index (table, index);
+  intRow_extents = atk_table_get_row_extent_at (table, intRow, intColumn);
+  intCol_extents = atk_table_get_column_extent_at (table, intRow, intColumn);
+  boolIs_selected = atk_table_is_selected (table, intRow, intColumn);
+
+  *column = intColumn;
+  *row = intRow;
+  *row_extents = intRow_extents;
+  *col_extents = intCol_extents;
+  *is_selected = boolIs_selected;
+
+  cell = atk_table_ref_at (table, intRow, intColumn);
+  role = atk_object_get_role (cell);
+
+  if (role == ATK_ROLE_TABLE_CELL)
+    return TRUE;
+  
+  return FALSE;
+
+}
+
+static CORBA_boolean
 impl_isSelected (PortableServer_Servant servant,
                 const CORBA_long       row,
                 const CORBA_long       column,
@@ -376,8 +488,8 @@ impl_isSelected (PortableServer_Servant servant,
 
   g_return_val_if_fail (table != NULL, FALSE);
 
-  return (CORBA_boolean) atk_table_is_selected (table,
-                                               (gint) row, (gint) column);
+  return atk_table_is_selected (table,
+                               row, column);
 }
 
 
@@ -392,6 +504,8 @@ spi_table_class_init (SpiTableClass *klass)
   epv->_get_summary = impl__get_summary;
   epv->_get_nRows = impl__get_nRows;
   epv->_get_nColumns = impl__get_nColumns;
+  epv->_get_nSelectedRows = impl__get_nSelectedRows;
+  epv->_get_nSelectedColumns = impl__get_nSelectedColumns;
   epv->getAccessibleAt = impl_getAccessibleAt;
   epv->getIndexAt = impl_getIndexAt;
   epv->getRowAtIndex = impl_getRowAtIndex;
@@ -406,7 +520,12 @@ spi_table_class_init (SpiTableClass *klass)
   epv->getSelectedColumns = impl_getSelectedColumns;
   epv->isRowSelected = impl_isRowSelected;
   epv->isColumnSelected = impl_isColumnSelected;
+  epv->addRowSelection = impl_addRowSelection;
+  epv->addColumnSelection = impl_addColumnSelection;
+  epv->removeRowSelection = impl_removeRowSelection;
+  epv->removeColumnSelection = impl_removeColumnSelection;
   epv->isSelected = impl_isSelected;
+  epv->getRowColumnExtentsAtIndex = impl_getRowColumnExtentsAtIndex;
 }
 
 static void
@@ -417,4 +536,4 @@ spi_table_init (SpiTable *table)
 BONOBO_TYPE_FUNC_FULL (SpiTable,
                       Accessibility_Table,
                       SPI_TYPE_BASE,
-                      spi_table);
+                      spi_table)