2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001 Sun Microsystems Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
23 /* table.c : implements the Table interface */
27 #include <bonobo/bonobo-exception.h>
28 #include <atk/atktable.h>
29 #include <libspi/accessible.h>
30 #include <libspi/table.h>
34 spi_table_interface_new (AtkObject *obj)
36 SpiTable *new_table = g_object_new (SPI_TABLE_TYPE, NULL);
38 spi_base_construct (SPI_BASE (new_table), G_OBJECT(obj));
45 get_table_from_servant (PortableServer_Servant servant)
47 SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant));
49 g_return_val_if_fail (object, NULL);
50 g_return_val_if_fail (ATK_IS_OBJECT(object->gobj), NULL);
51 return ATK_TABLE (object->gobj);
55 static Accessibility_Accessible
56 impl__get_caption (PortableServer_Servant servant,
57 CORBA_Environment *ev)
59 AtkObject *atk_object;
60 AtkTable *table = get_table_from_servant (servant);
62 g_return_val_if_fail (table != NULL, CORBA_OBJECT_NIL);
64 atk_object = atk_table_get_caption (table);
66 return spi_accessible_new_return (atk_object, FALSE, ev);
70 static Accessibility_Accessible
71 impl__get_summary (PortableServer_Servant servant,
72 CORBA_Environment *ev)
74 AtkObject *atk_object;
75 AtkTable *table = get_table_from_servant (servant);
77 g_return_val_if_fail (table != NULL, CORBA_OBJECT_NIL);
79 atk_object = atk_table_get_summary (table);
81 return spi_accessible_new_return (atk_object, FALSE, ev);
86 impl__get_nRows (PortableServer_Servant servant,
87 CORBA_Environment *ev)
89 AtkTable *table = get_table_from_servant (servant);
91 g_return_val_if_fail (table != NULL, 0);
93 return atk_table_get_n_rows (table);
98 impl__get_nColumns (PortableServer_Servant servant,
99 CORBA_Environment *ev)
101 AtkTable *table = get_table_from_servant (servant);
103 g_return_val_if_fail (table != NULL, 0);
105 return atk_table_get_n_columns (table);
109 static Accessibility_Accessible
110 impl_getAccessibleAt (PortableServer_Servant servant,
111 const CORBA_long row,
112 const CORBA_long column,
113 CORBA_Environment *ev)
115 AtkObject *atk_object;
116 AtkTable *table = get_table_from_servant (servant);
118 g_return_val_if_fail (table != NULL, CORBA_OBJECT_NIL);
120 atk_object = atk_table_ref_at (table, row, column);
122 return spi_accessible_new_return (atk_object, TRUE, ev);
127 impl_getIndexAt (PortableServer_Servant servant,
128 const CORBA_long row,
129 const CORBA_long column,
130 CORBA_Environment *ev)
132 AtkTable *table = get_table_from_servant (servant);
134 g_return_val_if_fail (table != NULL, 0);
136 return atk_table_get_index_at (table, row, column);
141 impl_getRowAtIndex (PortableServer_Servant servant,
142 const CORBA_long index,
143 CORBA_Environment *ev)
145 AtkTable *table = get_table_from_servant (servant);
147 g_return_val_if_fail (table != NULL, 0);
149 return atk_table_get_row_at_index (table, index);
154 impl_getColumnAtIndex (PortableServer_Servant servant,
155 const CORBA_long index,
156 CORBA_Environment *ev)
158 AtkTable *table = get_table_from_servant (servant);
160 g_return_val_if_fail (table != NULL, 0);
162 return atk_table_get_column_at_index (table, index);
167 impl_getRowDescription (PortableServer_Servant servant,
168 const CORBA_long row,
169 CORBA_Environment *ev)
172 AtkTable *table = get_table_from_servant (servant);
174 g_return_val_if_fail (table != NULL, 0);
176 rv = atk_table_get_row_description (table, row);
180 return CORBA_string_dup (rv);
184 return CORBA_string_dup ("");
190 impl_getColumnDescription (PortableServer_Servant servant,
191 const CORBA_long column,
192 CORBA_Environment *ev)
195 AtkTable *table = get_table_from_servant (servant);
197 g_return_val_if_fail (table != NULL, CORBA_string_dup (""));
199 rv = atk_table_get_row_description (table, column);
203 return CORBA_string_dup (rv);
207 return CORBA_string_dup ("");
213 impl_getRowExtentAt (PortableServer_Servant servant,
214 const CORBA_long row,
215 const CORBA_long column,
216 CORBA_Environment *ev)
218 AtkTable *table = get_table_from_servant (servant);
220 g_return_val_if_fail (table != NULL, -1);
222 return atk_table_get_row_extent_at (table, row, column);
227 impl_getColumnExtentAt (PortableServer_Servant servant,
228 const CORBA_long row,
229 const CORBA_long column,
230 CORBA_Environment *ev)
232 AtkTable *table = get_table_from_servant (servant);
234 g_return_val_if_fail (table != NULL, -1);
236 return atk_table_get_column_extent_at (table, row, column);
240 static Accessibility_Table
241 impl_getRowHeader (PortableServer_Servant servant,
242 const CORBA_long row,
243 CORBA_Environment *ev)
246 AtkTable *table = get_table_from_servant (servant);
248 g_return_val_if_fail (table != NULL, CORBA_OBJECT_NIL);
250 header = atk_table_get_row_header (table, row);
252 return spi_accessible_new_return (header, FALSE, ev);
256 static Accessibility_Table
257 impl_getColumnHeader (PortableServer_Servant servant,
258 const CORBA_long column,
259 CORBA_Environment *ev)
262 AtkTable *table = get_table_from_servant (servant);
264 g_return_val_if_fail (table != NULL, CORBA_OBJECT_NIL);
266 header = atk_table_get_column_header (table, column);
268 return spi_accessible_new_return (header, FALSE, ev);
272 static Accessibility_LongSeq *
273 impl_getSelectedRows (PortableServer_Servant servant,
274 CORBA_Environment *ev)
278 Accessibility_LongSeq *retval;
279 AtkTable *table = get_table_from_servant (servant);
281 bonobo_return_val_if_fail (table != NULL, NULL, ev);
283 length = atk_table_get_selected_rows (table, &selectedRows);
285 bonobo_return_val_if_fail (length > 0, NULL, ev);
287 retval = Accessibility_LongSeq__alloc ();
288 retval->_maximum = retval->_length = length;
289 retval->_buffer = Accessibility_LongSeq_allocbuf (length);
291 while (--length >= 0)
293 retval->_buffer[length] = selectedRows[length];
296 g_free (selectedRows);
302 static Accessibility_LongSeq *
303 impl_getSelectedColumns (PortableServer_Servant servant,
304 CORBA_Environment *ev)
306 gint *selectedColumns;
308 Accessibility_LongSeq *retval;
309 AtkTable *table = get_table_from_servant (servant);
311 bonobo_return_val_if_fail (table != NULL, NULL, ev);
313 length = atk_table_get_selected_columns (table, &selectedColumns);
315 bonobo_return_val_if_fail (length >= 0, NULL, ev);
317 retval = Accessibility_LongSeq__alloc ();
318 retval->_maximum = retval->_length = length;
319 retval->_buffer = Accessibility_LongSeq_allocbuf (length);
321 while (--length >= 0)
323 retval->_buffer[length] = (CORBA_long) selectedColumns[length];
326 g_free (selectedColumns);
333 impl_isRowSelected (PortableServer_Servant servant,
334 const CORBA_long row,
335 CORBA_Environment *ev)
337 AtkTable *table = get_table_from_servant (servant);
339 g_return_val_if_fail (table != NULL, FALSE);
341 return atk_table_is_row_selected (table, row);
346 impl_isColumnSelected (PortableServer_Servant servant,
347 const CORBA_long column,
348 CORBA_Environment *ev)
350 AtkTable *table = get_table_from_servant (servant);
352 g_return_val_if_fail (table != NULL, FALSE);
354 return atk_table_is_column_selected (table, column);
358 impl_addRowSelection (PortableServer_Servant servant,
359 const CORBA_long row,
360 CORBA_Environment *ev)
362 AtkTable *table = get_table_from_servant (servant);
364 g_return_val_if_fail (table != NULL, FALSE);
366 return atk_table_add_row_selection (table, row);
371 impl_addColumnSelection (PortableServer_Servant servant,
372 const CORBA_long column,
373 CORBA_Environment *ev)
375 AtkTable *table = get_table_from_servant (servant);
377 g_return_val_if_fail (table != NULL, FALSE);
379 return atk_table_add_column_selection (table, column);
384 impl_removeRowSelection (PortableServer_Servant servant,
385 const CORBA_long row,
386 CORBA_Environment *ev)
388 AtkTable *table = get_table_from_servant (servant);
390 g_return_val_if_fail (table != NULL, FALSE);
392 return atk_table_remove_row_selection (table, row);
397 impl_removeColumnSelection (PortableServer_Servant servant,
398 const CORBA_long column,
399 CORBA_Environment *ev)
401 AtkTable *table = get_table_from_servant (servant);
403 g_return_val_if_fail (table != NULL, FALSE);
405 return atk_table_remove_column_selection (table, column);
410 impl_isSelected (PortableServer_Servant servant,
411 const CORBA_long row,
412 const CORBA_long column,
413 CORBA_Environment *ev)
415 AtkTable *table = get_table_from_servant (servant);
417 g_return_val_if_fail (table != NULL, FALSE);
419 return atk_table_is_selected (table,
425 spi_table_class_init (SpiTableClass *klass)
427 POA_Accessibility_Table__epv *epv = &klass->epv;
429 /* Initialize epv table */
431 epv->_get_caption = impl__get_caption;
432 epv->_get_summary = impl__get_summary;
433 epv->_get_nRows = impl__get_nRows;
434 epv->_get_nColumns = impl__get_nColumns;
435 epv->getAccessibleAt = impl_getAccessibleAt;
436 epv->getIndexAt = impl_getIndexAt;
437 epv->getRowAtIndex = impl_getRowAtIndex;
438 epv->getColumnAtIndex = impl_getColumnAtIndex;
439 epv->getRowDescription = impl_getRowDescription;
440 epv->getColumnDescription = impl_getColumnDescription;
441 epv->getRowExtentAt = impl_getRowExtentAt;
442 epv->getColumnExtentAt = impl_getColumnExtentAt;
443 epv->getRowHeader = impl_getRowHeader;
444 epv->getColumnHeader = impl_getColumnHeader;
445 epv->getSelectedRows = impl_getSelectedRows;
446 epv->getSelectedColumns = impl_getSelectedColumns;
447 epv->isRowSelected = impl_isRowSelected;
448 epv->isColumnSelected = impl_isColumnSelected;
449 epv->addRowSelection = impl_addRowSelection;
450 epv->addColumnSelection = impl_addColumnSelection;
451 epv->removeRowSelection = impl_removeRowSelection;
452 epv->removeColumnSelection = impl_removeColumnSelection;
453 epv->isSelected = impl_isSelected;
457 spi_table_init (SpiTable *table)
461 BONOBO_TYPE_FUNC_FULL (SpiTable,