Fix for bug 147989; Added ATK_ROLE_EMBEDDED. Revved to 1.7.2.
[atk.git] / atk / atkobject.c
blob2ec044c02897191faa56d56d585bf75aa72e2340
1 /* ATK - Accessibility Toolkit
2 * Copyright 2001 Sun Microsystems Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
20 #include <string.h>
22 #include <glib-object.h>
24 #ifdef G_OS_WIN32
25 #define STRICT
26 #include <windows.h>
27 #undef STRICT
28 #undef FOCUS_EVENT /* <windows.h> pollutes the namespace
29 * like a six hundred pound gorilla */
30 #endif
32 #include "atk.h"
33 #include "atkmarshal.h"
34 #include "atk-enum-types.h"
35 #include "atkintl.h"
37 static GPtrArray *extra_roles = NULL;
39 enum
41 PROP_0, /* gobject convention */
43 PROP_NAME,
44 PROP_DESCRIPTION,
45 PROP_PARENT, /* ancestry has changed */
46 PROP_VALUE,
47 PROP_ROLE,
48 PROP_LAYER,
49 PROP_MDI_ZORDER,
50 PROP_TABLE_CAPTION,
51 PROP_TABLE_COLUMN_DESCRIPTION,
52 PROP_TABLE_COLUMN_HEADER,
53 PROP_TABLE_ROW_DESCRIPTION,
54 PROP_TABLE_ROW_HEADER,
55 PROP_TABLE_SUMMARY,
56 PROP_TABLE_CAPTION_OBJECT,
57 PROP_HYPERTEXT_NUM_LINKS,
58 PROP_LAST /* gobject convention */
61 enum {
62 CHILDREN_CHANGED,
63 FOCUS_EVENT,
64 PROPERTY_CHANGE,
65 STATE_CHANGE,
66 VISIBLE_DATA_CHANGED,
67 ACTIVE_DESCENDANT_CHANGED,
69 LAST_SIGNAL
72 typedef struct _AtkRoleItem AtkRoleItem;
74 struct _AtkRoleItem
76 AtkRole role;
77 gchar *name;
80 static AtkRoleItem role_items [] =
82 { ATK_ROLE_INVALID, N_("invalid")},
83 { ATK_ROLE_ACCEL_LABEL, N_("accelerator label")},
84 { ATK_ROLE_ALERT, N_("alert")},
85 { ATK_ROLE_ANIMATION, N_("animation")},
86 { ATK_ROLE_ARROW, N_("arrow")},
87 { ATK_ROLE_CALENDAR, N_("calendar")},
88 { ATK_ROLE_CANVAS, N_("canvas")},
89 { ATK_ROLE_CHECK_BOX, N_("check box")},
90 { ATK_ROLE_CHECK_MENU_ITEM, N_("check menu item")},
91 { ATK_ROLE_COLOR_CHOOSER, N_("color chooser")},
92 { ATK_ROLE_COLUMN_HEADER, N_("column header")},
93 { ATK_ROLE_COMBO_BOX, N_("combo box")},
94 { ATK_ROLE_DATE_EDITOR, N_("dateeditor")},
95 { ATK_ROLE_DESKTOP_ICON, N_("desktop icon")},
96 { ATK_ROLE_DESKTOP_FRAME, N_("desktop frame")},
97 { ATK_ROLE_DIAL, N_("dial")},
98 { ATK_ROLE_DIALOG, N_("dialog")},
99 { ATK_ROLE_DIRECTORY_PANE, N_("directory pane")},
100 { ATK_ROLE_DRAWING_AREA, N_("drawing area")},
101 { ATK_ROLE_FILE_CHOOSER, N_("file chooser")},
102 { ATK_ROLE_FILLER, N_("filler")},
103 /* I know it looks wrong but that is what Java returns */
104 { ATK_ROLE_FONT_CHOOSER, N_("fontchooser")},
105 { ATK_ROLE_FRAME, N_("frame")},
106 { ATK_ROLE_GLASS_PANE, N_("glass pane")},
107 { ATK_ROLE_HTML_CONTAINER, N_("html container")},
108 { ATK_ROLE_ICON, N_("icon")},
109 { ATK_ROLE_IMAGE, N_("image")},
110 { ATK_ROLE_INTERNAL_FRAME, N_("internal frame")},
111 { ATK_ROLE_LABEL, N_("label")},
112 { ATK_ROLE_LAYERED_PANE, N_("layered pane")},
113 { ATK_ROLE_LIST, N_("list")},
114 { ATK_ROLE_LIST_ITEM, N_("list item")},
115 { ATK_ROLE_MENU, N_("menu")},
116 { ATK_ROLE_MENU_BAR, N_("menu bar")},
117 { ATK_ROLE_MENU_ITEM, N_("menu item")},
118 { ATK_ROLE_OPTION_PANE, N_("option pane")},
119 { ATK_ROLE_PAGE_TAB, N_("page tab")},
120 { ATK_ROLE_PAGE_TAB_LIST, N_("page tab list")},
121 { ATK_ROLE_PANEL, N_("panel")},
122 { ATK_ROLE_PASSWORD_TEXT, N_("password text")},
123 { ATK_ROLE_POPUP_MENU, N_("popup menu")},
124 { ATK_ROLE_PROGRESS_BAR, N_("progress bar")},
125 { ATK_ROLE_PUSH_BUTTON, N_("push button")},
126 { ATK_ROLE_RADIO_BUTTON, N_("radio button")},
127 { ATK_ROLE_RADIO_MENU_ITEM, N_("radio menu item")},
128 { ATK_ROLE_ROOT_PANE, N_("root pane")},
129 { ATK_ROLE_ROW_HEADER, N_("row header")},
130 { ATK_ROLE_SCROLL_BAR, N_("scroll bar")},
131 { ATK_ROLE_SCROLL_PANE, N_("scroll pane")},
132 { ATK_ROLE_SEPARATOR, N_("separator")},
133 { ATK_ROLE_SLIDER, N_("slider")},
134 { ATK_ROLE_SPLIT_PANE, N_("split pane")},
135 { ATK_ROLE_SPIN_BUTTON, N_("spin button")},
136 { ATK_ROLE_STATUSBAR, N_("statusbar")},
137 { ATK_ROLE_TABLE, N_("table")},
138 { ATK_ROLE_TABLE_CELL, N_("table cell")},
139 { ATK_ROLE_TABLE_COLUMN_HEADER, N_("table column header")},
140 { ATK_ROLE_TABLE_ROW_HEADER, N_("table row header")},
141 { ATK_ROLE_TEAR_OFF_MENU_ITEM, N_("tear off menu item")},
142 { ATK_ROLE_TERMINAL, N_("terminal")},
143 { ATK_ROLE_TEXT, N_("text")},
144 { ATK_ROLE_TOGGLE_BUTTON, N_("toggle button")},
145 { ATK_ROLE_TOOL_BAR, N_("tool bar")},
146 { ATK_ROLE_TOOL_TIP, N_("tool tip")},
147 { ATK_ROLE_TREE, N_("tree")},
148 { ATK_ROLE_TREE_TABLE, N_("tree table")},
149 { ATK_ROLE_UNKNOWN, N_("unknown")},
150 { ATK_ROLE_VIEWPORT, N_("viewport")},
151 { ATK_ROLE_WINDOW, N_("window")},
152 { ATK_ROLE_HEADER, N_("header")},
153 { ATK_ROLE_FOOTER, N_("footer")},
154 { ATK_ROLE_PARAGRAPH, N_("paragraph")},
155 { ATK_ROLE_APPLICATION, N_("application")},
156 { ATK_ROLE_AUTOCOMPLETE, N_("autocomplete")},
157 { ATK_ROLE_EDITBAR, N_("edit bar")},
158 { ATK_ROLE_EMBEDDED, N_("embedded component")}
161 static void atk_object_class_init (AtkObjectClass *klass);
162 static void atk_object_init (AtkObject *accessible,
163 AtkObjectClass *klass);
164 static AtkRelationSet* atk_object_real_ref_relation_set
165 (AtkObject *accessible);
166 static void atk_object_real_initialize (AtkObject *accessible,
167 gpointer data);
168 static void atk_object_real_set_property (GObject *object,
169 guint prop_id,
170 const GValue *value,
171 GParamSpec *pspec);
172 static void atk_object_real_get_property (GObject *object,
173 guint prop_id,
174 GValue *value,
175 GParamSpec *pspec);
176 static void atk_object_finalize (GObject *object);
177 static G_CONST_RETURN gchar*
178 atk_object_real_get_name (AtkObject *object);
179 static G_CONST_RETURN gchar*
180 atk_object_real_get_description
181 (AtkObject *object);
182 static AtkObject* atk_object_real_get_parent (AtkObject *object);
183 static AtkRole atk_object_real_get_role (AtkObject *object);
184 static AtkLayer atk_object_real_get_layer (AtkObject *object);
185 static AtkStateSet* atk_object_real_ref_state_set
186 (AtkObject *object);
187 static void atk_object_real_set_name (AtkObject *object,
188 const gchar *name);
189 static void atk_object_real_set_description
190 (AtkObject *object,
191 const gchar *description);
192 static void atk_object_real_set_parent (AtkObject *object,
193 AtkObject *parent);
194 static void atk_object_real_set_role (AtkObject *object,
195 AtkRole role);
196 static guint atk_object_real_connect_property_change_handler
197 (AtkObject *obj,
198 AtkPropertyChangeHandler
199 *handler);
200 static void atk_object_real_remove_property_change_handler
201 (AtkObject *obj,
202 guint handler_id);
203 static void atk_object_notify (GObject *obj,
204 GParamSpec *pspec);
207 static guint atk_object_signals[LAST_SIGNAL] = { 0, };
209 static gpointer parent_class = NULL;
211 static const gchar* atk_object_name_property_name = "accessible-name";
212 static const gchar* atk_object_name_property_description = "accessible-description";
213 static const gchar* atk_object_name_property_parent = "accessible-parent";
214 static const gchar* atk_object_name_property_value = "accessible-value";
215 static const gchar* atk_object_name_property_role = "accessible-role";
216 static const gchar* atk_object_name_property_component_layer = "accessible-component-layer";
217 static const gchar* atk_object_name_property_component_mdi_zorder = "accessible-component-mdi-zorder";
218 static const gchar* atk_object_name_property_table_caption = "accessible-table-caption";
219 static const gchar* atk_object_name_property_table_column_description = "accessible-table-column-description";
220 static const gchar* atk_object_name_property_table_column_header = "accessible-table-column-header";
221 static const gchar* atk_object_name_property_table_row_description = "accessible-table-row-description";
222 static const gchar* atk_object_name_property_table_row_header = "accessible-table-row-header";
223 static const gchar* atk_object_name_property_table_summary = "accessible-table-summary";
224 static const gchar* atk_object_name_property_table_caption_object = "accessible-table-caption-object";
225 static const gchar* atk_object_name_property_hypertext_num_links = "accessible-hypertext-nlinks";
227 GType
228 atk_object_get_type (void)
230 static GType type = 0;
232 if (!type)
234 static const GTypeInfo typeInfo =
236 sizeof (AtkObjectClass),
237 (GBaseInitFunc) NULL,
238 (GBaseFinalizeFunc) NULL,
239 (GClassInitFunc) atk_object_class_init,
240 (GClassFinalizeFunc) NULL,
241 NULL,
242 sizeof (AtkObject),
244 (GInstanceInitFunc) atk_object_init,
246 type = g_type_register_static (G_TYPE_OBJECT, "AtkObject", &typeInfo, 0) ;
248 return type;
251 static void
252 atk_object_class_init (AtkObjectClass *klass)
254 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
256 parent_class = g_type_class_peek_parent (klass);
258 gobject_class->set_property = atk_object_real_set_property;
259 gobject_class->get_property = atk_object_real_get_property;
260 gobject_class->finalize = atk_object_finalize;
261 gobject_class->notify = atk_object_notify;
263 klass->get_name = atk_object_real_get_name;
264 klass->get_description = atk_object_real_get_description;
265 klass->get_parent = atk_object_real_get_parent;
266 klass->get_n_children = NULL;
267 klass->ref_child = NULL;
268 klass->get_index_in_parent = NULL;
269 klass->ref_relation_set = atk_object_real_ref_relation_set;
270 klass->get_role = atk_object_real_get_role;
271 klass->get_layer = atk_object_real_get_layer;
272 klass->get_mdi_zorder = NULL;
273 klass->initialize = atk_object_real_initialize;
274 klass->ref_state_set = atk_object_real_ref_state_set;
275 klass->set_name = atk_object_real_set_name;
276 klass->set_description = atk_object_real_set_description;
277 klass->set_parent = atk_object_real_set_parent;
278 klass->set_role = atk_object_real_set_role;
279 klass->connect_property_change_handler =
280 atk_object_real_connect_property_change_handler;
281 klass->remove_property_change_handler =
282 atk_object_real_remove_property_change_handler;
285 * We do not define default signal handlers here
287 klass->children_changed = NULL;
288 klass->focus_event = NULL;
289 klass->property_change = NULL;
290 klass->visible_data_changed = NULL;
291 klass->active_descendant_changed = NULL;
293 g_object_class_install_property (gobject_class,
294 PROP_NAME,
295 g_param_spec_string (atk_object_name_property_name,
296 _("Accessible Name"),
297 _("Object instance\'s name formatted for assistive technology access"),
298 NULL,
299 G_PARAM_READWRITE));
300 g_object_class_install_property (gobject_class,
301 PROP_DESCRIPTION,
302 g_param_spec_string (atk_object_name_property_description,
303 _("Accessible Description"),
304 _("Description of an object, formatted for assistive technology access"),
305 NULL,
306 G_PARAM_READWRITE));
307 g_object_class_install_property (gobject_class,
308 PROP_PARENT,
309 g_param_spec_object (atk_object_name_property_parent,
310 _("Accessible Parent"),
311 _("Is used to notify that the parent has changed"),
312 ATK_TYPE_OBJECT,
313 G_PARAM_READWRITE));
314 g_object_class_install_property (gobject_class,
315 PROP_VALUE,
316 g_param_spec_double (atk_object_name_property_value,
317 _("Accessible Value"),
318 _("Is used to notify that the value has changed"),
319 0.0,
320 G_MAXDOUBLE,
321 0.0,
322 G_PARAM_READWRITE));
323 g_object_class_install_property (gobject_class,
324 PROP_ROLE,
325 g_param_spec_int (atk_object_name_property_role,
326 _("Accessible Role"),
327 _("The accessible role of this object"),
329 G_MAXINT,
331 G_PARAM_READWRITE));
332 g_object_class_install_property (gobject_class,
333 PROP_LAYER,
334 g_param_spec_int (atk_object_name_property_component_layer,
335 _("Accessible Layer"),
336 _("The accessible layer of this object"),
338 G_MAXINT,
340 G_PARAM_READABLE));
341 g_object_class_install_property (gobject_class,
342 PROP_MDI_ZORDER,
343 g_param_spec_int (atk_object_name_property_component_mdi_zorder,
344 _("Accessible MDI Value"),
345 _("The accessible MDI value of this object"),
346 G_MININT,
347 G_MAXINT,
348 G_MININT,
349 G_PARAM_READABLE));
350 g_object_class_install_property (gobject_class,
351 PROP_TABLE_CAPTION,
352 g_param_spec_string (atk_object_name_property_table_caption,
353 _("Accessible Table Caption"),
354 _("Is used to notify that the table caption has changed; this property should not be used. accessible-table-caption-object should be used instead"),
355 NULL,
356 G_PARAM_READWRITE));
357 g_object_class_install_property (gobject_class,
358 PROP_TABLE_COLUMN_HEADER,
359 g_param_spec_object (atk_object_name_property_table_column_header,
360 _("Accessible Table Column Header"),
361 _("Is used to notify that the table column header has changed"),
362 ATK_TYPE_OBJECT,
363 G_PARAM_READWRITE));
364 g_object_class_install_property (gobject_class,
365 PROP_TABLE_COLUMN_DESCRIPTION,
366 g_param_spec_string (atk_object_name_property_table_column_description,
367 _("Accessible Table Column Description"),
368 _("Is used to notify that the table column description has changed"),
369 NULL,
370 G_PARAM_READWRITE));
371 g_object_class_install_property (gobject_class,
372 PROP_TABLE_ROW_HEADER,
373 g_param_spec_object (atk_object_name_property_table_row_header,
374 _("Accessible Table Row Header"),
375 _("Is used to notify that the table row header has changed"),
376 ATK_TYPE_OBJECT,
377 G_PARAM_READWRITE));
378 g_object_class_install_property (gobject_class,
379 PROP_TABLE_ROW_DESCRIPTION,
380 g_param_spec_string (atk_object_name_property_table_row_description,
381 _("Accessible Table Row Description"),
382 _("Is used to notify that the table row description has changed"),
383 NULL,
384 G_PARAM_READWRITE));
385 g_object_class_install_property (gobject_class,
386 PROP_TABLE_SUMMARY,
387 g_param_spec_object (atk_object_name_property_table_summary,
388 _("Accessible Table Summary"),
389 _("Is used to notify that the table summary has changed"),
390 ATK_TYPE_OBJECT,
391 G_PARAM_READWRITE));
392 g_object_class_install_property (gobject_class,
393 PROP_TABLE_CAPTION_OBJECT,
394 g_param_spec_object (atk_object_name_property_table_caption_object,
395 _("Accessible Table Caption Object"),
396 _("Is used to notify that the table caption has changed"),
397 ATK_TYPE_OBJECT,
398 G_PARAM_READWRITE));
399 g_object_class_install_property (gobject_class,
400 PROP_HYPERTEXT_NUM_LINKS,
401 g_param_spec_int (atk_object_name_property_hypertext_num_links,
402 _("Number of Accessible Hypertext Links"),
403 _("The number of links which the current AtkHypertext has"),
405 G_MAXINT,
407 G_PARAM_READABLE));
408 atk_object_signals[CHILDREN_CHANGED] =
409 g_signal_new ("children_changed",
410 G_TYPE_FROM_CLASS (klass),
411 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
412 G_STRUCT_OFFSET (AtkObjectClass, children_changed),
413 NULL, NULL,
414 g_cclosure_marshal_VOID__UINT_POINTER,
415 G_TYPE_NONE,
416 2, G_TYPE_UINT, G_TYPE_POINTER);
417 atk_object_signals[FOCUS_EVENT] =
418 g_signal_new ("focus_event",
419 G_TYPE_FROM_CLASS (klass),
420 G_SIGNAL_RUN_LAST,
421 G_STRUCT_OFFSET (AtkObjectClass, focus_event),
422 NULL, NULL,
423 g_cclosure_marshal_VOID__BOOLEAN,
424 G_TYPE_NONE,
425 1, G_TYPE_BOOLEAN);
426 atk_object_signals[PROPERTY_CHANGE] =
427 g_signal_new ("property_change",
428 G_TYPE_FROM_CLASS (klass),
429 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
430 G_STRUCT_OFFSET (AtkObjectClass, property_change),
431 (GSignalAccumulator) NULL, NULL,
432 g_cclosure_marshal_VOID__POINTER,
433 G_TYPE_NONE, 1,
434 G_TYPE_POINTER);
435 atk_object_signals[STATE_CHANGE] =
436 g_signal_new ("state_change",
437 G_TYPE_FROM_CLASS (klass),
438 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
439 G_STRUCT_OFFSET (AtkObjectClass, state_change),
440 (GSignalAccumulator) NULL, NULL,
441 atk_marshal_VOID__STRING_BOOLEAN,
442 G_TYPE_NONE, 2,
443 G_TYPE_STRING,
444 G_TYPE_BOOLEAN);
445 atk_object_signals[VISIBLE_DATA_CHANGED] =
446 g_signal_new ("visible_data_changed",
447 G_TYPE_FROM_CLASS (klass),
448 G_SIGNAL_RUN_LAST,
449 G_STRUCT_OFFSET (AtkObjectClass, visible_data_changed),
450 (GSignalAccumulator) NULL, NULL,
451 g_cclosure_marshal_VOID__VOID,
452 G_TYPE_NONE, 0);
453 atk_object_signals[ACTIVE_DESCENDANT_CHANGED] =
454 g_signal_new ("active_descendant_changed",
455 G_TYPE_FROM_CLASS (klass),
456 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
457 G_STRUCT_OFFSET (AtkObjectClass, active_descendant_changed),
458 NULL, NULL,
459 g_cclosure_marshal_VOID__POINTER,
460 G_TYPE_NONE,
461 1, G_TYPE_POINTER);
464 static void
465 atk_object_init (AtkObject *accessible,
466 AtkObjectClass *klass)
468 accessible->name = NULL;
469 accessible->description = NULL;
470 accessible->accessible_parent = NULL;
471 accessible->relation_set = atk_relation_set_new();
472 accessible->role = ATK_ROLE_UNKNOWN;
475 GType
476 atk_implementor_get_type (void)
478 static GType type = 0;
480 if (!type)
482 static const GTypeInfo typeInfo =
484 sizeof (AtkImplementorIface),
485 (GBaseInitFunc) NULL,
486 (GBaseFinalizeFunc) NULL,
489 type = g_type_register_static (G_TYPE_INTERFACE, "AtkImplementorIface", &typeInfo, 0) ;
492 return type;
496 * atk_object_get_name:
497 * @accessible: an #AtkObject
499 * Gets the accessible name of the accessible.
501 * Returns: a character string representing the accessible name of the object.
503 G_CONST_RETURN gchar*
504 atk_object_get_name (AtkObject *accessible)
506 AtkObjectClass *klass;
508 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
510 klass = ATK_OBJECT_GET_CLASS (accessible);
511 if (klass->get_name)
512 return (klass->get_name) (accessible);
513 else
514 return NULL;
518 * atk_object_get_description:
519 * @accessible: an #AtkObject
521 * Gets the accessible description of the accessible.
523 * Returns: a character string representing the accessible description
524 * of the accessible.
527 G_CONST_RETURN gchar*
528 atk_object_get_description (AtkObject *accessible)
530 AtkObjectClass *klass;
532 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
534 klass = ATK_OBJECT_GET_CLASS (accessible);
535 if (klass->get_description)
536 return (klass->get_description) (accessible);
537 else
538 return NULL;
542 * atk_object_get_parent:
543 * @accessible: an #AtkObject
545 * Gets the accessible parent of the accessible.
547 * Returns: a #AtkObject representing the accessible parent of the accessible
549 AtkObject*
550 atk_object_get_parent (AtkObject *accessible)
552 AtkObjectClass *klass;
554 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
556 klass = ATK_OBJECT_GET_CLASS (accessible);
557 if (klass->get_parent)
558 return (klass->get_parent) (accessible);
559 else
560 return NULL;
564 * atk_object_get_n_accessible_children:
565 * @accessible: an #AtkObject
567 * Gets the number of accessible children of the accessible.
569 * Returns: an integer representing the number of accessible children
570 * of the accessible.
572 gint
573 atk_object_get_n_accessible_children (AtkObject *accessible)
575 AtkObjectClass *klass;
577 g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
579 klass = ATK_OBJECT_GET_CLASS (accessible);
580 if (klass->get_n_children)
581 return (klass->get_n_children) (accessible);
582 else
583 return 0;
587 * atk_object_ref_accessible_child:
588 * @accessible: an #AtkObject
589 * @i: a gint representing the position of the child, starting from 0
591 * Gets a reference to the specified accessible child of the object.
592 * The accessible children are 0-based so the first accessible child is
593 * at index 0, the second at index 1 and so on.
595 * Returns: an #AtkObject representing the specified accessible child
596 * of the accessible.
598 AtkObject*
599 atk_object_ref_accessible_child (AtkObject *accessible,
600 gint i)
602 AtkObjectClass *klass;
604 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
606 klass = ATK_OBJECT_GET_CLASS (accessible);
607 if (klass->ref_child)
608 return (klass->ref_child) (accessible, i);
609 else
610 return NULL;
614 * atk_object_ref_relation_set:
615 * @accessible: an #AtkObject
617 * Gets the #AtkRelationSet associated with the object.
619 * Returns: an #AtkRelationSet representing the relation set of the object.
621 AtkRelationSet*
622 atk_object_ref_relation_set (AtkObject *accessible)
624 AtkObjectClass *klass;
626 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
628 klass = ATK_OBJECT_GET_CLASS (accessible);
629 if (klass->ref_relation_set)
630 return (klass->ref_relation_set) (accessible);
631 else
632 return NULL;
636 * atk_role_register:
637 * @name: a character string describing the new role.
639 * Registers the role specified by @name.
641 * Returns: an #AtkRole for the new role.
643 AtkRole
644 atk_role_register (const gchar *name)
646 if (!extra_roles)
647 extra_roles = g_ptr_array_new ();
649 g_ptr_array_add (extra_roles, g_strdup (name));
650 return extra_roles->len + ATK_ROLE_LAST_DEFINED;
654 * atk_object_get_role:
655 * @accessible: an #AtkObject
657 * Gets the role of the accessible.
659 * Returns: an #AtkRole which is the role of the accessible
661 AtkRole
662 atk_object_get_role (AtkObject *accessible)
664 AtkObjectClass *klass;
666 g_return_val_if_fail (ATK_IS_OBJECT (accessible), ATK_ROLE_UNKNOWN);
668 klass = ATK_OBJECT_GET_CLASS (accessible);
669 if (klass->get_role)
670 return (klass->get_role) (accessible);
671 else
672 return ATK_ROLE_UNKNOWN;
676 * atk_object_get_layer:
677 * @accessible: an #AtkObject
679 * Gets the layer of the accessible.
680 * DEPRECATED: use atk_component_get_layer instead!
682 * Returns: an #AtkLayer which is the layer of the accessible
684 AtkLayer
685 atk_object_get_layer (AtkObject *accessible)
687 AtkObjectClass *klass;
689 g_return_val_if_fail (ATK_IS_OBJECT (accessible), ATK_LAYER_INVALID);
691 klass = ATK_OBJECT_GET_CLASS (accessible);
692 if (klass->get_layer)
693 return (klass->get_layer) (accessible);
694 else
695 return ATK_LAYER_INVALID;
699 * atk_object_get_mdi_zorder:
700 * @accessible: an #AtkObject
702 * Gets the zorder of the accessible. The value G_MININT will be returned
703 * if the layer of the accessible is not ATK_LAYER_MDI.
704 * DEPRECATED: use atk_component_get_mdi_zorder instead!
706 * Returns: a gint which is the zorder of the accessible, i.e. the depth at
707 * which the component is shown in relation to other components in the same
708 * container.
710 gint
711 atk_object_get_mdi_zorder (AtkObject *accessible)
713 AtkObjectClass *klass;
715 g_return_val_if_fail (ATK_IS_OBJECT (accessible), G_MININT);
717 klass = ATK_OBJECT_GET_CLASS (accessible);
718 if (klass->get_mdi_zorder)
719 return (klass->get_mdi_zorder) (accessible);
720 else
721 return G_MININT;
725 * atk_object_ref_state_set:
726 * @accessible: an #AtkObject
728 * Gets a reference to the state set of the accessible; the caller must
729 * unreference it when it is no longer needed.
731 * Returns: a reference to an #AtkStateSet which is the state
732 * set of the accessible
734 AtkStateSet*
735 atk_object_ref_state_set (AtkObject *accessible)
737 AtkObjectClass *klass;
739 g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
741 klass = ATK_OBJECT_GET_CLASS (accessible);
742 if (klass->ref_state_set)
743 return (klass->ref_state_set) (accessible);
744 else
745 return NULL;
749 * atk_object_get_index_in_parent:
750 * @accessible: an #AtkObject
752 * Gets the 0-based index of this accessible in its parent; returns -1 if the
753 * accessible does not have an accessible parent.
755 * Returns: an integer which is the index of the accessible in its parent
757 gint
758 atk_object_get_index_in_parent (AtkObject *accessible)
760 AtkObjectClass *klass;
762 g_return_val_if_fail (ATK_OBJECT (accessible), -1);
764 klass = ATK_OBJECT_GET_CLASS (accessible);
765 if (klass->get_index_in_parent)
766 return (klass->get_index_in_parent) (accessible);
767 else
768 return -1;
772 * atk_object_set_name:
773 * @accessible: an #AtkObject
774 * @name: a character string to be set as the accessible name
776 * Sets the accessible name of the accessible.
778 void
779 atk_object_set_name (AtkObject *accessible,
780 const gchar *name)
782 AtkObjectClass *klass;
784 g_return_if_fail (ATK_IS_OBJECT (accessible));
785 g_return_if_fail (name != NULL);
787 klass = ATK_OBJECT_GET_CLASS (accessible);
788 if (klass->set_name)
790 (klass->set_name) (accessible, name);
791 g_object_notify (G_OBJECT (accessible), atk_object_name_property_name);
796 * atk_object_set_description:
797 * @accessible: an #AtkObject
798 * @description : a character string to be set as the accessible description
800 * Sets the accessible description of the accessible.
802 void
803 atk_object_set_description (AtkObject *accessible,
804 const gchar *description)
806 AtkObjectClass *klass;
808 g_return_if_fail (ATK_IS_OBJECT (accessible));
809 g_return_if_fail (description != NULL);
811 klass = ATK_OBJECT_GET_CLASS (accessible);
812 if (klass->set_description)
814 (klass->set_description) (accessible, description);
815 g_object_notify (G_OBJECT (accessible), atk_object_name_property_description);
820 * atk_object_set_parent:
821 * @accessible: an #AtkObject
822 * @parent : an #AtkObject to be set as the accessible parent
824 * Sets the accessible parent of the accessible.
826 void
827 atk_object_set_parent (AtkObject *accessible,
828 AtkObject *parent)
830 AtkObjectClass *klass;
832 g_return_if_fail (ATK_IS_OBJECT (accessible));
834 klass = ATK_OBJECT_GET_CLASS (accessible);
835 if (klass->set_parent)
837 (klass->set_parent) (accessible, parent);
838 g_object_notify (G_OBJECT (accessible), atk_object_name_property_parent);
843 * atk_object_set_role:
844 * @accessible: an #AtkObject
845 * @role : an #AtkRole to be set as the role
847 * Sets the role of the accessible.
849 void
850 atk_object_set_role (AtkObject *accessible,
851 AtkRole role)
853 AtkObjectClass *klass;
854 AtkRole old_role;
856 g_return_if_fail (ATK_IS_OBJECT (accessible));
858 klass = ATK_OBJECT_GET_CLASS (accessible);
859 if (klass->set_role)
861 old_role = atk_object_get_role (accessible);
862 if (old_role != role)
864 (klass->set_role) (accessible, role);
865 if (old_role != ATK_ROLE_UNKNOWN)
866 /* Do not notify for initial role setting */
867 g_object_notify (G_OBJECT (accessible), atk_object_name_property_role);
873 * atk_object_connect_property_change_handler:
874 * @accessible: an #AtkObject
875 * @handler : a function to be called when a property changes its value
877 * Specifies a function to be called when a property changes value.
879 * Returns: a #guint which is the handler id used in
880 * atk_object_remove_property_change_handler()
882 guint
883 atk_object_connect_property_change_handler (AtkObject *accessible,
884 AtkPropertyChangeHandler *handler)
886 AtkObjectClass *klass;
888 g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
889 g_return_val_if_fail ((handler != NULL), 0);
891 klass = ATK_OBJECT_GET_CLASS (accessible);
892 if (klass->connect_property_change_handler)
893 return (klass->connect_property_change_handler) (accessible, handler);
894 else
895 return 0;
899 * atk_object_remove_property_change_handler:
900 * @accessible: an #AtkObject
901 * @handler_id : a guint which identifies the handler to be removed.
903 * Removes a property change handler.
905 void
906 atk_object_remove_property_change_handler (AtkObject *accessible,
907 guint handler_id)
909 AtkObjectClass *klass;
911 g_return_if_fail (ATK_IS_OBJECT (accessible));
913 klass = ATK_OBJECT_GET_CLASS (accessible);
914 if (klass->remove_property_change_handler)
915 (klass->remove_property_change_handler) (accessible, handler_id);
919 * atk_object_notify_state_change:
920 * @accessible: an #AtkObject
921 * @state: an #AtkState whose state is changed
922 * @value : a gboolean which indicates whether the state is being set on or off
924 * Emits a state-change signal for the specified state.
926 void
927 atk_object_notify_state_change (AtkObject *accessible,
928 AtkState state,
929 gboolean value)
931 G_CONST_RETURN gchar* name;
933 name = atk_state_type_get_name (state);
934 g_signal_emit (accessible, atk_object_signals[STATE_CHANGE],
935 g_quark_from_string (name),
936 name, value, NULL);
940 * atk_implementor_ref_accessible:
941 * @implementor: The #GObject instance which should implement #AtkImplementorIface
942 * if a non-null return value is required.
944 * Gets a reference to an object's #AtkObject implementation, if
945 * the object implements #AtkObjectIface
947 * Returns: a reference to an object's #AtkObject implementation
949 AtkObject *
950 atk_implementor_ref_accessible (AtkImplementor *object)
952 AtkImplementorIface *iface;
953 AtkObject *accessible = NULL;
955 g_return_val_if_fail (ATK_IS_IMPLEMENTOR (object), NULL);
957 iface = ATK_IMPLEMENTOR_GET_IFACE (object);
959 if (iface != NULL)
960 accessible = iface->ref_accessible (object);
962 g_return_val_if_fail ((accessible != NULL), NULL);
964 return accessible;
967 static AtkRelationSet*
968 atk_object_real_ref_relation_set (AtkObject *accessible)
970 g_return_val_if_fail (accessible->relation_set, NULL);
971 g_object_ref (accessible->relation_set);
973 return accessible->relation_set;
976 static void
977 atk_object_real_set_property (GObject *object,
978 guint prop_id,
979 const GValue *value,
980 GParamSpec *pspec)
982 AtkObject *accessible;
984 accessible = ATK_OBJECT (object);
986 switch (prop_id)
988 case PROP_NAME:
989 atk_object_set_name (accessible, g_value_get_string (value));
990 break;
991 case PROP_DESCRIPTION:
992 atk_object_set_description (accessible, g_value_get_string (value));
993 break;
994 case PROP_ROLE:
995 atk_object_set_role (accessible, g_value_get_int (value));
996 break;
997 case PROP_PARENT:
998 atk_object_set_parent (accessible, g_value_get_object (value));
999 break;
1000 case PROP_VALUE:
1001 if (ATK_IS_VALUE (accessible))
1002 atk_value_set_current_value (ATK_VALUE (accessible), value);
1003 break;
1004 case PROP_TABLE_SUMMARY:
1005 if (ATK_IS_TABLE (accessible))
1006 atk_table_set_summary (ATK_TABLE (accessible), g_value_get_object (value));
1007 break;
1008 case PROP_TABLE_CAPTION_OBJECT:
1009 if (ATK_IS_TABLE (accessible))
1010 atk_table_set_caption (ATK_TABLE (accessible), g_value_get_object (value));
1011 break;
1012 default:
1013 break;
1017 static void
1018 atk_object_real_get_property (GObject *object,
1019 guint prop_id,
1020 GValue *value,
1021 GParamSpec *pspec)
1023 AtkObject *accessible;
1025 accessible = ATK_OBJECT (object);
1027 switch (prop_id)
1029 case PROP_NAME:
1030 g_value_set_string (value, atk_object_get_name (accessible));
1031 break;
1032 case PROP_DESCRIPTION:
1033 g_value_set_string (value, atk_object_get_description (accessible));
1034 break;
1035 case PROP_ROLE:
1036 g_value_set_int (value, atk_object_get_role (accessible));
1037 break;
1038 case PROP_LAYER:
1039 if (ATK_IS_COMPONENT (accessible))
1040 g_value_set_int (value, atk_component_get_layer (ATK_COMPONENT (accessible)));
1041 break;
1042 case PROP_MDI_ZORDER:
1043 if (ATK_IS_COMPONENT (accessible))
1044 g_value_set_int (value, atk_component_get_mdi_zorder (ATK_COMPONENT (accessible)));
1045 break;
1046 case PROP_PARENT:
1047 g_value_set_object (value, atk_object_get_parent (accessible));
1048 break;
1049 case PROP_VALUE:
1050 if (ATK_IS_VALUE (accessible))
1051 atk_value_get_current_value (ATK_VALUE (accessible), value);
1052 break;
1053 case PROP_TABLE_SUMMARY:
1054 if (ATK_IS_TABLE (accessible))
1055 g_value_set_object (value, atk_table_get_summary (ATK_TABLE (accessible)));
1056 break;
1057 case PROP_TABLE_CAPTION_OBJECT:
1058 if (ATK_IS_TABLE (accessible))
1059 g_value_set_object (value, atk_table_get_caption (ATK_TABLE (accessible)));
1060 break;
1061 case PROP_HYPERTEXT_NUM_LINKS:
1062 if (ATK_IS_HYPERTEXT (accessible))
1063 g_value_set_int (value, atk_hypertext_get_n_links (ATK_HYPERTEXT (accessible)));
1064 break;
1065 default:
1066 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1067 break;
1071 static void
1072 atk_object_finalize (GObject *object)
1074 AtkObject *accessible;
1076 g_return_if_fail (ATK_IS_OBJECT (object));
1078 accessible = ATK_OBJECT (object);
1080 g_free (accessible->name);
1081 g_free (accessible->description);
1084 * Free memory allocated for relation set if it have been allocated.
1086 if (accessible->relation_set)
1087 g_object_unref (accessible->relation_set);
1089 if (accessible->accessible_parent)
1090 g_object_unref (accessible->accessible_parent);
1092 G_OBJECT_CLASS (parent_class)->finalize (object);
1095 static G_CONST_RETURN gchar*
1096 atk_object_real_get_name (AtkObject *object)
1098 return object->name;
1101 static G_CONST_RETURN gchar*
1102 atk_object_real_get_description (AtkObject *object)
1104 return object->description;
1107 static AtkObject*
1108 atk_object_real_get_parent (AtkObject *object)
1110 return object->accessible_parent;
1113 static AtkRole
1114 atk_object_real_get_role (AtkObject *object)
1116 return object->role;
1119 static AtkLayer
1120 atk_object_real_get_layer (AtkObject *object)
1122 return object->layer;
1125 static AtkStateSet*
1126 atk_object_real_ref_state_set (AtkObject *accessible)
1128 AtkStateSet *state_set;
1129 AtkObject *ap;
1130 AtkObject *focus_object;
1132 state_set = atk_state_set_new ();
1134 ap = atk_object_get_parent (accessible);
1135 if (ap)
1136 if (ATK_IS_SELECTION (ap))
1138 int i;
1140 atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
1142 i = atk_object_get_index_in_parent (accessible);
1143 if (i >= 0)
1144 if (atk_selection_is_child_selected(ATK_SELECTION (ap), i))
1145 atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
1147 focus_object = atk_get_focus_object ();
1148 if (focus_object == accessible)
1149 atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
1151 return state_set;
1154 static void
1155 atk_object_real_set_name (AtkObject *object,
1156 const gchar *name)
1158 g_free (object->name);
1159 object->name = g_strdup (name);
1162 static void
1163 atk_object_real_set_description (AtkObject *object,
1164 const gchar *description)
1166 g_free (object->description);
1167 object->description = g_strdup (description);
1170 static void
1171 atk_object_real_set_parent (AtkObject *object,
1172 AtkObject *parent)
1174 if (object->accessible_parent)
1175 g_object_unref (object->accessible_parent);
1177 object->accessible_parent = parent;
1178 if (object->accessible_parent)
1179 g_object_ref (object->accessible_parent);
1182 static void
1183 atk_object_real_set_role (AtkObject *object,
1184 AtkRole role)
1186 object->role = role;
1189 static guint
1190 atk_object_real_connect_property_change_handler (AtkObject *obj,
1191 AtkPropertyChangeHandler *handler)
1193 return g_signal_connect_closure_by_id (obj,
1194 atk_object_signals[PROPERTY_CHANGE],
1196 g_cclosure_new (
1197 G_CALLBACK (handler), NULL,
1198 (GClosureNotify) NULL),
1199 FALSE);
1202 static void
1203 atk_object_real_remove_property_change_handler (AtkObject *obj,
1204 guint handler_id)
1206 g_signal_handler_disconnect (obj, handler_id);
1210 * atk_object_initialize:
1211 * @accessible: a #AtkObject
1212 * @data: a #gpointer which identifies the object for which the AtkObject was created.
1214 * This function is called when implementing subclasses of #AtkObject.
1215 * It does initialization required for the new object. It is intended
1216 * that this function should called only in the ..._new() functions used
1217 * to create an instance of a subclass of #AtkObject
1219 void
1220 atk_object_initialize (AtkObject *accessible,
1221 gpointer data)
1223 AtkObjectClass *klass;
1225 g_return_if_fail (ATK_IS_OBJECT (accessible));
1227 klass = ATK_OBJECT_GET_CLASS (accessible);
1228 if (klass->initialize)
1229 klass->initialize (accessible, data);
1233 * This function is a signal handler for notify signal which gets emitted
1234 * when a property changes value.
1236 * It constructs an AtkPropertyValues structure and emits a "property_changed"
1237 * signal which causes the user specified AtkPropertyChangeHandler
1238 * to be called.
1240 static void
1241 atk_object_notify (GObject *obj,
1242 GParamSpec *pspec)
1244 AtkPropertyValues values = { 0, };
1246 g_value_init (&values.new_value, pspec->value_type);
1247 g_object_get_property (obj, pspec->name, &values.new_value);
1248 values.property_name = pspec->name;
1249 g_signal_emit (obj, atk_object_signals[PROPERTY_CHANGE],
1250 g_quark_from_string (pspec->name),
1251 &values, NULL);
1252 g_value_unset (&values.new_value);
1256 * atk_role_get_name:
1257 * @role: The #AtkRole whose name is required
1259 * Gets the description string describing the #AtkRole @role.
1261 * Returns: the string describing the AtkRole
1263 G_CONST_RETURN gchar*
1264 atk_role_get_name (AtkRole role)
1266 gchar *name = NULL;
1267 gint i;
1269 for (i = 0; i < G_N_ELEMENTS (role_items); i++)
1271 if (role == role_items[i].role)
1272 return role_items[i].name;
1275 if (extra_roles)
1277 gint n = role;
1279 n -= ATK_ROLE_LAST_DEFINED + 1;
1281 if (n < extra_roles->len)
1282 name = g_ptr_array_index (extra_roles, n);
1284 return name;
1287 #ifdef G_OS_WIN32
1289 #undef ATK_LOCALEDIR
1291 #define ATK_LOCALEDIR get_atk_locale_dir()
1293 G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name)
1295 static char *
1296 get_atk_locale_dir (void)
1298 return g_win32_get_package_installation_subdirectory
1299 (GETTEXT_PACKAGE, dll_name, "lib/locale");
1302 #endif
1305 * atk_role_get_localized_name:
1306 * @role: The #AtkRole whose localized name is required
1308 * Gets the localized description string describing the #AtkRole @role.
1310 * Returns: the localized string describing the AtkRole
1312 G_CONST_RETURN gchar*
1313 atk_role_get_localized_name (AtkRole role)
1315 G_CONST_RETURN gchar *name;
1316 gint i;
1317 static gboolean gettext_initialized = FALSE;
1319 #ifdef ENABLE_NLS
1320 if (!gettext_initialized)
1322 const char *dir = g_getenv ("ATK_ALT_LOCALEDIR");
1324 gettext_initialized = TRUE;
1325 if (dir == NULL)
1326 dir = ATK_LOCALEDIR;
1328 bindtextdomain (GETTEXT_PACKAGE, dir);
1329 #ifdef HAVE_BIND_TEXTDOMAIN_CODESET
1330 bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
1331 #endif
1333 #endif
1335 for (i = 0; i < G_N_ELEMENTS (role_items); i++)
1337 if (role == role_items[i].role)
1338 return dgettext (GETTEXT_PACKAGE, role_items[i].name);
1340 name = atk_role_get_name (role);
1342 return name;
1346 * atk_role_for_name:
1347 * @name: a string which is the (non-localized) name of an ATK role.
1349 * Get the #AtkRole type corresponding to a rolew name.
1351 * Returns: the #AtkRole enumerated type corresponding to the specified
1352 name,
1353 * or #ATK_ROLE_INVALID if no matching role is found.
1355 AtkRole
1356 atk_role_for_name (const gchar *name)
1358 AtkRole role = ATK_ROLE_INVALID;
1359 gint i;
1361 g_return_val_if_fail (name, ATK_ROLE_INVALID);
1363 for (i = 0; i < G_N_ELEMENTS (role_items); i++)
1365 if (strcmp (name, role_items[i].name) == 0)
1366 return role_items[i].role;
1369 if (extra_roles)
1371 for (i = 0; i < extra_roles->len; i++)
1373 gchar *extra_role = (gchar *)g_ptr_array_index (extra_roles, i);
1375 g_return_val_if_fail (extra_role, ATK_ROLE_INVALID);
1377 if (strcmp (name, extra_role) == 0)
1379 role = i + 1 + ATK_ROLE_LAST_DEFINED;
1380 break;
1385 return role;
1389 * atk_object_add_relationship:
1390 * @object: The #AtkObject to which an AtkRelation is to be added.
1391 * @relationship: The #AtkRelationType of the relation
1392 * @target: The #AtkObject which is to be the target of the relation.
1394 * Adds a relationship of the specified type with the specified target.
1396 * Returns TRUE if the relationship is added.
1398 gboolean
1399 atk_object_add_relationship (AtkObject *object,
1400 AtkRelationType relationship,
1401 AtkObject *target)
1403 AtkObject *array[1];
1404 AtkRelation *relation;
1406 g_return_val_if_fail (ATK_IS_OBJECT (object), FALSE);
1407 g_return_val_if_fail (ATK_IS_OBJECT (target), FALSE);
1409 array[0] = target;
1410 relation = atk_relation_new (array, 1, relationship);
1411 atk_relation_set_add (object->relation_set, relation);
1412 g_object_unref (relation);
1414 return TRUE;
1418 * atk_object_remove_relationship:
1419 * @object: The #AtkObject from which an AtkRelation is to be removed.
1420 * @relationship: The #AtkRelationType of the relation
1421 * @target: The #AtkObject which is the target of the relation to be removed.
1423 * Removes a relationship of the specified type with the specified target.
1425 * Returns TRUE if the relationship is removed.
1427 gboolean
1428 atk_object_remove_relationship (AtkObject *object,
1429 AtkRelationType relationship,
1430 AtkObject *target)
1432 gint n_relations, i;
1433 gboolean ret = FALSE;
1434 AtkRelation *relation;
1436 g_return_val_if_fail (ATK_IS_OBJECT (object), FALSE);
1437 g_return_val_if_fail (ATK_IS_OBJECT (target), FALSE);
1439 n_relations = atk_relation_set_get_n_relations (object->relation_set);
1440 for (i = 0; i < n_relations; i++)
1442 relation = atk_relation_set_get_relation (object->relation_set, i);
1443 if (atk_relation_get_relation_type (relation) == relationship)
1445 GPtrArray *array;
1447 array = atk_relation_get_target (relation);
1449 if (g_ptr_array_index (array, 0) == target)
1451 atk_relation_set_remove (object->relation_set, relation);
1452 ret = TRUE;
1453 break;
1458 return ret;
1461 static void
1462 atk_object_real_initialize (AtkObject *accessible,
1463 gpointer data)
1465 return;