annotate dwt/accessibility/AccessibleObject.d @ 42:787b5413b0ce

accessibility package
author Frank Benoit <benoit@tionex.de>
date Fri, 11 Jan 2008 05:07:22 +0100
parents
children 8f049b136add
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2007 IBM Corporation and others.
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 *******************************************************************************/
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 module dwt.accessibility.AccessibleObject;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 import dwt.internal.accessibility.gtk.ATK;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14 import dwt.internal.gtk.OS;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 import dwt.accessibility.Accessible;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.accessibility.AccessibleListener;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.accessibility.AccessibleControlListener;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.accessibility.AccessibleTextListener;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.accessibility.AccessibleEvent;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.accessibility.AccessibleControlEvent;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.accessibility.AccessibleTextEvent;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.accessibility.ACC;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.accessibility.AccessibleFactory;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.widgets.Display;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.dwthelper.Integer;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import tango.io.Stdout;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import tango.stdc.stringz;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import tango.text.Util;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import Math = tango.math.Math;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 class AccessibleObject {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 AtkObject* handle;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 int /*long*/ parentType;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 int index = -1, id = ACC.CHILDID_SELF;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 Accessible accessible;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 AccessibleObject parent;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 AccessibleObject[AtkObject*] children;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 /*
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 * a lightweight object does not correspond to a concrete gtk widget, but
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 * to a logical child of a widget (eg.- a CTabItem, which is simply drawn)
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 bool isLightweight = false;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 static char[] actionNamePtr;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 static char[] descriptionPtr;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 static char[] keybindingPtr;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 static char[] namePtr;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 static AccessibleObject[AtkObject*] AccessibleObjects;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 static const uint ATK_ACTION_TYPE;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 static const uint ATK_COMPONENT_TYPE;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 static const uint ATK_HYPERTEXT_TYPE;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 static const uint ATK_SELECTION_TYPE;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 static const uint ATK_TEXT_TYPE;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 static const bool DEBUG;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 static this(){
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 DEBUG = Display.DEBUG;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 ATK_ACTION_TYPE = ATK.g_type_from_name ("AtkAction");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 ATK_COMPONENT_TYPE = ATK.g_type_from_name ("AtkComponent");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 ATK_HYPERTEXT_TYPE = ATK.g_type_from_name ("AtkHypertext");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 ATK_SELECTION_TYPE = ATK.g_type_from_name ("AtkSelection");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 ATK_TEXT_TYPE = ATK.g_type_from_name ("AtkText");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 this (int /*long*/ type, GtkWidget* widget, Accessible accessible, int /*long*/ parentType, bool isLightweight) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 handle = cast(AtkObject*)ATK.g_object_new (type, null);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 this.parentType = parentType;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 ATK.atk_object_initialize (handle, widget);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 this.accessible = accessible;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 this.isLightweight = isLightweight;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 AccessibleObjects[handle] = this;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 if (DEBUG) Stdout.formatln("new AccessibleObject: {}", handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 void addChild (AccessibleObject child) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 children[child.handle] = child;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 child.setParent (this);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 package static extern(C) char* atkAction_get_keybinding (void* obj, int index) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 if (DEBUG) Stdout.formatln ("-->atkAction_get_keybinding");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 char* parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 if (ATK.g_type_is_a (object.parentType, ATK_ACTION_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 auto superType = cast(AtkActionIface*)ATK.g_type_interface_peek_parent (ATK.ATK_ACTION_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 AtkActionIface* actionIface = superType;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 if (actionIface.get_keybinding !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 parentResult = actionIface.get_keybinding( object.handle, index );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 AccessibleListener[] listeners = object.getAccessibleListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 AccessibleEvent event = new AccessibleEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 if (parentResult !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 char[] res = fromUtf8z( parentResult );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 event.result = res.dup;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 listeners [i].getKeyboardShortcut (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 if (event.result is null) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 if (keybindingPtr !is null ) OS.g_free (keybindingPtr.ptr);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 char[] name = event.result.dup ~ \0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 char* p = cast(char*) OS.g_malloc (name.length);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 keybindingPtr = p ? p[ 0 .. name.length ] : null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 return keybindingPtr.ptr;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 package static extern(C) char* atkAction_get_name (void* obj, int index) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 if (DEBUG) Stdout.formatln ("-->atkAction_get_name");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 char* parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 if (ATK.g_type_is_a (object.parentType, ATK_ACTION_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 auto actionIface = cast(AtkActionIface*)ATK.g_type_interface_peek_parent (ATK.ATK_ACTION_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 if (actionIface.get_name !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 parentResult = actionIface.get_name( object.handle, index);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 if (parentResult !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 char[] res = fromUtf8z( parentResult );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 event.result = res.dup;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 listeners [i].getDefaultAction (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 if (event.result is null) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 if (actionNamePtr !is null) OS.g_free (actionNamePtr.ptr);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 char[] name = event.result.dup ~ \0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 auto p = cast(char*)OS.g_malloc (name.length);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 actionNamePtr = p ? p[ 0 .. name.length ] : null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 return actionNamePtr.ptr;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 package static extern(C) void atkComponent_get_extents (void* obj, int* x, int* y, int* width, int* height, int coord_type) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 if (DEBUG) Stdout.formatln ("-->atkComponent_get_extents");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 *x = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 *y = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 *width = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 *height = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 if (ATK.g_type_is_a (object.parentType, ATK_COMPONENT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 auto componentIface = cast(AtkComponentIface*) ATK.g_type_interface_peek_parent (ATK.ATK_COMPONENT_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 if (componentIface.get_extents !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 componentIface.get_extents( object.handle, x, y, width, height, coord_type);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 if (listeners.length is 0) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 int parentX = *x, parentY = *y;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 int parentWidth = *width, parentHeight = *height;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 event.x = parentX; event.y = parentY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 event.width = parentWidth; event.height = parentHeight;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 if (coord_type is ATK.ATK_XY_WINDOW) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 /* translate control -> display, for filling in event to be dispatched */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 auto gtkAccessible = ATK.GTK_ACCESSIBLE (object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 auto topLevel = ATK.gtk_widget_get_toplevel (gtkAccessible.widget);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 auto window = OS.GTK_WIDGET_WINDOW (topLevel);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 int topWindowX, topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 OS.gdk_window_get_origin (window, &topWindowX, &topWindowY);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 event.x += topWindowX;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 event.y += topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 listeners [i].getLocation (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 if (coord_type is ATK.ATK_XY_WINDOW) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 /* translate display -> control, for answering to the OS */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 auto gtkAccessible = ATK.GTK_ACCESSIBLE (object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 auto topLevel = ATK.gtk_widget_get_toplevel (gtkAccessible.widget);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 auto window = OS.GTK_WIDGET_WINDOW (topLevel);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 int topWindowX, topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 OS.gdk_window_get_origin (window, &topWindowX, &topWindowY);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 event.x -= topWindowX;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 event.y -= topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 *x = event.x;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 *y = event.y;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 *width = event.width;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 *height = event.height;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 //return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 package static extern(C) void atkComponent_get_position (void* obj, int* x, int* y, int coord_type) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 if (DEBUG) Stdout.formatln ("-->atkComponent_get_position, object: {} x:{} y:{} coord:{}", atkObject, x, y, coord_type);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 *x=0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 *y=0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 if (ATK.g_type_is_a (object.parentType, ATK_COMPONENT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 auto componentIface = cast(AtkComponentIface*)ATK.g_type_interface_peek_parent (ATK.ATK_COMPONENT_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 if (componentIface.get_extents !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 componentIface.get_position( object.handle, x, y, coord_type);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 if (listeners.length is 0) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 int parentX, parentY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 parentX = *x;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 parentY = *y;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 event.x = parentX; event.y = parentY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 if (coord_type is ATK.ATK_XY_WINDOW) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 /* translate control -> display, for filling in event to be dispatched */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 auto gtkAccessible = ATK.GTK_ACCESSIBLE (object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 auto topLevel = ATK.gtk_widget_get_toplevel (gtkAccessible.widget);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 auto window = OS.GTK_WIDGET_WINDOW (topLevel);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 int topWindowX, topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 OS.gdk_window_get_origin (window, &topWindowX, &topWindowY);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 event.x += topWindowX;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 event.y += topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 listeners [i].getLocation (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 if (coord_type is ATK.ATK_XY_WINDOW) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 /* translate display -> control, for answering to the OS */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 auto gtkAccessible = ATK.GTK_ACCESSIBLE (object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 auto topLevel = ATK.gtk_widget_get_toplevel (gtkAccessible.widget);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 auto window = OS.GTK_WIDGET_WINDOW (topLevel);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 int topWindowX, topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 OS.gdk_window_get_origin (window, &topWindowX, &topWindowY);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 event.x -= topWindowX;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 event.y -= topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 *x=event.x;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 *y=event.y;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 //return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 //PORTING_FIXME: what about the coord_type? componentIface.get_size( object.handle, width, height, coord_type);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 //package static extern(C) void atkComponent_get_size (void* obj, int* width, int* height, int coord_type) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 package static extern(C) void atkComponent_get_size (void* obj, int* width, int* height) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 if (DEBUG) Stdout.formatln ("-->atkComponent_get_size");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 *width=0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 *height=0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 if (ATK.g_type_is_a (object.parentType, ATK_COMPONENT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 auto componentIface = cast(AtkComponentIface*)ATK.g_type_interface_peek_parent (ATK.ATK_COMPONENT_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 if (componentIface.get_extents !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 //PORTING_FIXME: what about the coord_type? componentIface.get_size( object.handle, width, height, coord_type);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 componentIface.get_size( object.handle, width, height);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 if (listeners.length is 0) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 int parentWidth, parentHeight;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 parentWidth= *width;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 parentHeight= *height;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 event.width = parentWidth; event.height = parentHeight;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 listeners [i].getLocation (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 *width=event.width;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 *height=event.height;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 //return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 package static extern(C) AtkObject* atkComponent_ref_accessible_at_point (void* obj, int x, int y, int coord_type) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 if (DEBUG) Stdout.formatln ("-->atkComponent_ref_accessible_at_point");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 AtkObject* parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 if (ATK.g_type_is_a (object.parentType, ATK_COMPONENT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 auto componentIface = cast(AtkComponentIface*)ATK.g_type_interface_peek_parent (ATK.ATK_COMPONENT_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 if (componentIface.ref_accessible_at_point !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 parentResult = componentIface.ref_accessible_at_point( object.handle, x, y, coord_type);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 event.x = x; event.y = y;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 if (coord_type is ATK.ATK_XY_WINDOW) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 /* translate control -> display, for filling in the event to be dispatched */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 auto gtkAccessible = ATK.GTK_ACCESSIBLE (object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 auto topLevel = ATK.gtk_widget_get_toplevel (gtkAccessible.widget);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 auto window = OS.GTK_WIDGET_WINDOW (topLevel);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 int topWindowX, topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 OS.gdk_window_get_origin (window, &topWindowX, &topWindowY);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 event.x += topWindowX;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 event.y += topWindowY;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 listeners [i].getChildAtPoint (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 if (event.childID is object.id) event.childID = ACC.CHILDID_SELF;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 AccessibleObject accObj = object.getChildByID (event.childID);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 if (accObj !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 if (parentResult !is null) OS.g_object_unref (parentResult);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 OS.g_object_ref (accObj.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 return accObj.handle;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 package static extern(C) AtkHyperlink* atkHypertext_get_link (void* obj, int link_index) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 if (DEBUG) Stdout.formatln ("-->atkHypertext_get_link");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 package static extern(C) int atkHypertext_get_n_links (void* obj) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 if (DEBUG) Stdout.formatln ("-->atkHypertext_get_n_links");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 return 0; /* read hyperlink's name */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 package static extern(C) int atkHypertext_get_link_index (void* obj, int char_index) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 if (DEBUG) Stdout.formatln ("-->atkHypertext_get_link_index");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 package static extern(C) char* atkObject_get_description (AtkObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 if (DEBUG) Stdout.formatln ("-->atkObject_get_description");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 char* parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 auto objectClass = cast(AtkObjectClass*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 if (objectClass.get_description !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 parentResult = objectClass.get_description(object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 AccessibleListener[] listeners = object.getAccessibleListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 AccessibleEvent event = new AccessibleEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 if (parentResult !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 event.result = fromUtf8z( parentResult ).dup;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 listeners [i].getDescription (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 if (event.result is null) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 if (descriptionPtr !is null) OS.g_free (descriptionPtr.ptr);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 char[] name = event.result.dup ~ \0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 char* p = cast(char*)OS.g_malloc (name.length);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 descriptionPtr = p ? p[ 0 .. name.length ] : null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 return descriptionPtr.ptr; }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 package static extern(C) char* atkObject_get_name (AtkObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 if (DEBUG) Stdout.formatln ("-->atkObject_get_name: {}", atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 char* parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 auto objectClass = cast(AtkObjectClass*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 if (objectClass.get_name !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 parentResult = objectClass.get_name( object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 AccessibleListener[] listeners = object.getAccessibleListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 AccessibleEvent event = new AccessibleEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 if (parentResult !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 event.result = fromUtf8z( parentResult ).dup;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 listeners [i].getName (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 if (event.result is null) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 if (namePtr !is null) OS.g_free (namePtr.ptr);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 char[] name = event.result.dup ~ \0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 char* p = cast(char*)OS.g_malloc (name.length);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 namePtr = p ? p[ 0 .. name.length ] : null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 return namePtr.ptr;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 package static extern(C) int atkObject_get_n_children (AtkObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 if (DEBUG) Stdout.formatln ("-->atkObject_get_n_children: {}", atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 int /*long*/ parentResult = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 auto objectClass = cast(AtkObjectClass*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 if (objectClass.get_n_children !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 parentResult = objectClass.get_n_children( object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 event.detail = cast(int)/*64*/parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 listeners [i].getChildCount (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 return event.detail;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 package static extern(C) int atkObject_get_index_in_parent (AtkObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 if (DEBUG) Stdout.formatln ("-->atkObjectCB_get_index_in_parent. ");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 if (object.index !is -1) return object.index;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 auto objectClass = cast(AtkObjectClass*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 if (objectClass.get_index_in_parent is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 return objectClass.get_index_in_parent(object. handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 package static extern(C) AtkObject* atkObject_get_parent (AtkObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 if (DEBUG) Stdout.formatln ("-->atkObject_get_parent: {}", atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 if (object.parent !is null) return object.parent.handle;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 auto objectClass = cast(AtkObjectClass*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 if (objectClass.get_parent is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 return objectClass.get_parent( object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 package static extern(C) int atkObject_get_role (AtkObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 if (DEBUG) Stdout.formatln ("-->atkObject_get_role: {}", atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443 if (object.getAccessibleListeners ().length !is 0) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
447 event.detail = -1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 listeners [i].getRole (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 if (event.detail !is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452 switch (event.detail) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453 /* Convert from win32 role values to atk role values */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 case ACC.ROLE_CHECKBUTTON: return ATK.ATK_ROLE_CHECK_BOX;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 case ACC.ROLE_CLIENT_AREA: return ATK.ATK_ROLE_DRAWING_AREA;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 case ACC.ROLE_COMBOBOX: return ATK.ATK_ROLE_COMBO_BOX;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457 case ACC.ROLE_DIALOG: return ATK.ATK_ROLE_DIALOG;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 case ACC.ROLE_LABEL: return ATK.ATK_ROLE_LABEL;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 case ACC.ROLE_LINK: return ATK.ATK_ROLE_TEXT;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 case ACC.ROLE_LIST: return ATK.ATK_ROLE_LIST;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 case ACC.ROLE_LISTITEM: return ATK.ATK_ROLE_LIST_ITEM;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 case ACC.ROLE_MENU: return ATK.ATK_ROLE_MENU;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 case ACC.ROLE_MENUBAR: return ATK.ATK_ROLE_MENU_BAR;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 case ACC.ROLE_MENUITEM: return ATK.ATK_ROLE_MENU_ITEM;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 case ACC.ROLE_PROGRESSBAR: return ATK.ATK_ROLE_PROGRESS_BAR;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 case ACC.ROLE_PUSHBUTTON: return ATK.ATK_ROLE_PUSH_BUTTON;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 case ACC.ROLE_SCROLLBAR: return ATK.ATK_ROLE_SCROLL_BAR;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 case ACC.ROLE_SEPARATOR: return ATK.ATK_ROLE_SEPARATOR;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469 case ACC.ROLE_SLIDER: return ATK.ATK_ROLE_SLIDER;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 case ACC.ROLE_TABLE: return ATK.ATK_ROLE_TABLE;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471 case ACC.ROLE_TABLECELL: return ATK.ATK_ROLE_TABLE_CELL;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 case ACC.ROLE_TABLECOLUMNHEADER: return ATK.ATK_ROLE_TABLE_COLUMN_HEADER;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 case ACC.ROLE_TABLEROWHEADER: return ATK.ATK_ROLE_TABLE_ROW_HEADER;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 case ACC.ROLE_TABFOLDER: return ATK.ATK_ROLE_PAGE_TAB_LIST;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475 case ACC.ROLE_TABITEM: return ATK.ATK_ROLE_PAGE_TAB;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476 case ACC.ROLE_TEXT: return ATK.ATK_ROLE_TEXT;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 case ACC.ROLE_TOOLBAR: return ATK.ATK_ROLE_TOOL_BAR;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 case ACC.ROLE_TOOLTIP: return ATK.ATK_ROLE_TOOL_TIP;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 case ACC.ROLE_TREE: return ATK.ATK_ROLE_TREE;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 case ACC.ROLE_TREEITEM: return ATK.ATK_ROLE_LIST_ITEM;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 case ACC.ROLE_RADIOBUTTON: return ATK.ATK_ROLE_RADIO_BUTTON;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 case ACC.ROLE_WINDOW: return ATK.ATK_ROLE_WINDOW;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 auto objectClass = cast(AtkObjectClass*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
487 if (objectClass.get_role is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488 return objectClass.get_role( object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 package static extern(C) AtkObject* atkObject_ref_child (AtkObject* atkObject, int /*long*/ index) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 if (DEBUG) Stdout.formatln ("-->atkObject_ref_child: {} of: {}", index, atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 object.updateChildren ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 AccessibleObject accObject = object.getChildByIndex (cast(int)/*64*/index);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 if (accObject !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 OS.g_object_ref (accObject.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 return accObject.handle;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 auto objectClass = cast(AtkObjectClass*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 if (objectClass.ref_child is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 return objectClass.ref_child( object.handle, index);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 package static extern(C) AtkStateSet * atkObject_ref_state_set (AtkObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 if (DEBUG) Stdout.formatln ("-->atkObject_ref_state_set");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 AtkStateSet* parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 auto objectClass = cast(AtkObjectClass*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512 if (objectClass.ref_state_set !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 parentResult = objectClass.ref_state_set( object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 auto set = parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 event.detail = -1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 listeners [i].getState (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 if (event.detail !is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 /* Convert from win32 state values to atk state values */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 int state = event.detail;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 if ((state & ACC.STATE_BUSY) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_BUSY);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 if ((state & ACC.STATE_CHECKED) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_CHECKED);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 if ((state & ACC.STATE_EXPANDED) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_EXPANDED);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 if ((state & ACC.STATE_FOCUSABLE) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_FOCUSABLE);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 if ((state & ACC.STATE_FOCUSED) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_FOCUSED);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 if ((state & ACC.STATE_HOTTRACKED) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_ARMED);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 if ((state & ACC.STATE_INVISIBLE) is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_VISIBLE);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 if ((state & ACC.STATE_MULTISELECTABLE) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_MULTISELECTABLE);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 if ((state & ACC.STATE_OFFSCREEN) is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_SHOWING);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 if ((state & ACC.STATE_PRESSED) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_PRESSED);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 if ((state & ACC.STATE_READONLY) is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_EDITABLE);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 if ((state & ACC.STATE_SELECTABLE) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_SELECTABLE);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 if ((state & ACC.STATE_SELECTED) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_SELECTED);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 if ((state & ACC.STATE_SIZEABLE) !is 0) ATK.atk_state_set_add_state (set, ATK.ATK_STATE_RESIZABLE);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 /* Note: STATE_COLLAPSED, STATE_LINKED and STATE_NORMAL have no ATK equivalents */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 return set;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 package static extern(C) int atkSelection_is_child_selected (void* obj, int index) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 if (DEBUG) Stdout.formatln ("-->atkSelection_is_child_selected");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 int /*long*/ parentResult = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 if (ATK.g_type_is_a (object.parentType, ATK_SELECTION_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 auto selectionIface = cast(AtkSelectionIface*)ATK.g_type_interface_peek_parent (ATK.ATK_SELECTION_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555 if (selectionIface.is_child_selected !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 parentResult = selectionIface.is_child_selected( object.handle, index);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565 listeners [i].getSelection (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 AccessibleObject accessibleObject = object.getChildByID (event.childID);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 if (accessibleObject !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569 return accessibleObject.index is index ? 1 : 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 package static extern(C) AtkObject* atkSelection_ref_selection (void* obj, int index) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 if (DEBUG) Stdout.formatln ("-->atkSelection_ref_selection");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
578 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 AtkObject* parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 if (ATK.g_type_is_a (object.parentType, ATK_SELECTION_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 auto selectionIface = cast(AtkSelectionIface*)ATK.g_type_interface_peek_parent (ATK.ATK_SELECTION_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 if (selectionIface.ref_selection !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 parentResult = selectionIface.ref_selection( object.handle, index);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 AccessibleControlListener[] listeners = object.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 AccessibleControlEvent event = new AccessibleControlEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 listeners [i].getSelection (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 AccessibleObject accObj = object.getChildByID (event.childID);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 if (accObj !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 if (parentResult !is null) OS.g_object_unref (parentResult);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 OS.g_object_ref (accObj.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 return accObj.handle;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 package static extern(C) int atkText_get_caret_offset (void* obj) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 if (DEBUG) Stdout.formatln ("-->atkText_get_caret_offset");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 int /*long*/ parentResult = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 if (ATK.g_type_is_a (object.parentType, ATK_TEXT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 auto textIface = cast(AtkTextIface*)ATK.g_type_interface_peek_parent (ATK.ATK_TEXT_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 if (textIface.get_caret_offset !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 parentResult = textIface.get_caret_offset( object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 AccessibleTextListener[] listeners = object.getTextListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 AccessibleTextEvent event = new AccessibleTextEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 event.offset = cast(int)/*64*/parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
621 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
622 listeners [i].getCaretOffset (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
623 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 return event.offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 package static extern(C) uint atkText_get_character_at_offset (void* obj, int offset) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 if (DEBUG) Stdout.formatln ("-->atkText_get_character_at_offset");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 char[] text = object.getText ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
633 if (text !is null) return text[cast(int)/*64*/offset ]; // TODO
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 if (ATK.g_type_is_a (object.parentType, ATK_TEXT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 auto textIface = cast(AtkTextIface*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 if (textIface.get_character_at_offset !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 return textIface.get_character_at_offset( object.handle, offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
638 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
639 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
641 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643 package static extern(C) int atkText_get_character_count (void* obj) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
644 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
645 if (DEBUG) Stdout.formatln ("-->atkText_get_character_count");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
647 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
648 char[] text = object.getText ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 if (text !is null) return text.length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 if (ATK.g_type_is_a (object.parentType, ATK_TEXT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 auto textIface = cast(AtkTextIface*)ATK.g_type_class_peek (object.parentType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 if (textIface.get_character_count !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 return textIface.get_character_count( object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
654 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
656 return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
657 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 package static extern(C) int atkText_get_n_selections (void* obj) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 if (DEBUG) Stdout.formatln("-->atkText_get_n_selections");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 if (object is null) return 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
664 int /*long*/ parentResult = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
665 if (ATK.g_type_is_a (object.parentType, ATK_TEXT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 auto textIface = cast(AtkTextIface*)ATK.g_type_interface_peek_parent (ATK.ATK_TEXT_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
667 if (textIface.get_n_selections !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
668 parentResult = textIface.get_n_selections( object.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
670 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
671 AccessibleTextListener[] listeners = object.getTextListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
672 if (listeners.length is 0) return parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
673
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
674 AccessibleTextEvent event = new AccessibleTextEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
675 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
676 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
677 listeners [i].getSelectionRange (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
678 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
679 return event.length is 0 ? parentResult : 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
680 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
681
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
682 package static extern(C) char* atkText_get_selection (void* obj, int selection_num, int* start_offset, int* end_offset) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
683 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
684 if (DEBUG) Stdout.formatln ("-->atkText_get_selection");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
685 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
686 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
687 *start_offset=0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
688 *end_offset=0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
689 if (ATK.g_type_is_a (object.parentType, ATK_TEXT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
690 auto textIface = cast(AtkTextIface*)ATK.g_type_interface_peek_parent (ATK.ATK_TEXT_GET_IFACE (object.handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
691 if (textIface.get_selection !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
692 textIface.get_selection( object.handle, selection_num, start_offset, end_offset );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
693 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
694 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
695 AccessibleTextListener[] listeners = object.getTextListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
696 if (listeners.length is 0) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
697
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
698 AccessibleTextEvent event = new AccessibleTextEvent (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
699 event.childID = object.id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
700 int parentStart;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
701 int parentEnd;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
702 parentStart= *start_offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
703 parentEnd= *end_offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
704 event.offset = parentStart;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
705 event.length = parentEnd - parentStart;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
706 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
707 listeners [i].getSelectionRange (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
708 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
709 *start_offset = event.offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
710 *end_offset = event.offset + event.length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
711 return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
712 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
713
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
714 package static extern(C) char* atkText_get_text (void* obj, int start_offset, int end_offset) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
715 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
716 if (DEBUG) Stdout.formatln ("-->atkText_get_text: {},{}", start_offset, end_offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
717 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
718 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
719 char[] text = object.getText ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
720 if (text.length > 0) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
721 if (end_offset is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
722 end_offset = text.length ;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
723 } else {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
724 end_offset = Math.min (end_offset, text.length );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
725 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
726 start_offset = Math.min (start_offset, end_offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
727 text = text[ start_offset .. end_offset ];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
728 auto result = cast(char*)OS.g_malloc (text.length+1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
729 result[ 0 .. text.length ] = text;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
730 result[ text.length ] = '\0';
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
731 return result;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
732 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
733 return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
734 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
735
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
736 package static extern(C) char* atkText_get_text_after_offset (void* obj, int offset_value, int boundary_type, int* start_offset, int* end_offset) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
737 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
738 if (DEBUG) Stdout.formatln ("-->atkText_get_text_after_offset");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
739 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
740 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
741 int offset = cast(int)/*64*/offset_value;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
742 char[] text = object.getText ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
743 if (text.length > 0) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
744 int length = text.length ;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
745 offset = Math.min (offset, length - 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
746 int startBounds = offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
747 int endBounds = offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
748 switch (cast(int)/*64*/boundary_type) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
749 case ATK.ATK_TEXT_BOUNDARY_CHAR: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
750 if (length > offset) endBounds++;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
751 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
752 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
753 case ATK.ATK_TEXT_BOUNDARY_WORD_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
754 int wordStart1 = nextIndexOfChar (text, " !?.\n", offset - 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
755 if (wordStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
756 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
757 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
758 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
759 wordStart1 = nextIndexOfNotChar (text, " !?.\n", wordStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
760 if (wordStart1 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
761 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
762 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
763 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
764 startBounds = wordStart1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
765 int wordStart2 = nextIndexOfChar (text, " !?.\n", wordStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
766 if (wordStart2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
767 endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
768 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
769 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
770 endBounds = nextIndexOfNotChar (text, " !?.\n", wordStart2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
771 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
772 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
773 case ATK.ATK_TEXT_BOUNDARY_WORD_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
774 int previousWordEnd = previousIndexOfNotChar (text, " \n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
775 if (previousWordEnd is -1 || previousWordEnd !is offset - 1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
776 offset = nextIndexOfNotChar (text, " \n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
777 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
778 if (offset is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
779 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
780 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
781 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
782 int wordEnd1 = nextIndexOfChar (text, " !?.\n", cast(int)/*64*/offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
783 if (wordEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
784 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
785 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
786 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
787 wordEnd1 = nextIndexOfNotChar (text, "!?.", wordEnd1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
788 if (wordEnd1 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
789 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
790 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
791 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
792 startBounds = wordEnd1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
793 int wordEnd2 = nextIndexOfNotChar (text, " \n", wordEnd1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
794 if (wordEnd2 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
795 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
796 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
797 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
798 wordEnd2 = nextIndexOfChar (text, " !?.\n", wordEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
799 if (wordEnd2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
800 endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
801 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
802 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
803 endBounds = nextIndexOfNotChar (text, "!?.", wordEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
804 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
805 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
806 case ATK.ATK_TEXT_BOUNDARY_SENTENCE_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
807 int previousSentenceEnd = previousIndexOfChar (text, "!?.", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
808 int previousText = previousIndexOfNotChar (text, " !?.\n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
809 int sentenceStart1 = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
810 if (previousSentenceEnd >= previousText) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
811 sentenceStart1 = nextIndexOfNotChar (text, " !?.\n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
812 } else {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
813 sentenceStart1 = nextIndexOfChar (text, "!?.", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
814 if (sentenceStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
815 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
816 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
817 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
818 sentenceStart1 = nextIndexOfNotChar (text, " !?.\n", sentenceStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
819 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
820 if (sentenceStart1 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
821 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
822 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
823 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
824 startBounds = sentenceStart1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
825 int sentenceStart2 = nextIndexOfChar (text, "!?.", sentenceStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
826 if (sentenceStart2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
827 endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
828 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
829 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
830 endBounds = nextIndexOfNotChar (text, " !?.\n", sentenceStart2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
831 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
832 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
833 case ATK.ATK_TEXT_BOUNDARY_SENTENCE_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
834 int sentenceEnd1 = nextIndexOfChar (text, "!?.", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
835 if (sentenceEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
836 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
837 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
838 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
839 sentenceEnd1 = nextIndexOfNotChar (text, "!?.", sentenceEnd1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
840 if (sentenceEnd1 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
841 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
842 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
843 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
844 startBounds = sentenceEnd1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
845 int sentenceEnd2 = nextIndexOfNotChar (text, " \n", sentenceEnd1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
846 if (sentenceEnd2 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
847 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
848 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
849 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
850 sentenceEnd2 = nextIndexOfChar (text, "!?.", sentenceEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
851 if (sentenceEnd2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
852 endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
853 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
854 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
855 endBounds = nextIndexOfNotChar (text, "!?.", sentenceEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
856 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
857 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
858 case ATK.ATK_TEXT_BOUNDARY_LINE_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
859 int lineStart1 = locate( text, '\n' );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
860 if( lineStart1 == text.length ) lineStart1 = -1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
861 if (lineStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
862 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
863 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
864 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
865 lineStart1 = nextIndexOfNotChar (text, "\n", lineStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
866 if (lineStart1 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
867 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
868 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
869 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
870 startBounds = lineStart1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
871 int lineStart2 = locate( text, '\n' );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
872 if( lineStart2 == text.length ) lineStart2 = -1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
873 if (lineStart2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
874 endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
875 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
876 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
877 lineStart2 = nextIndexOfNotChar (text, "\n", lineStart2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
878 endBounds = lineStart2;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
879 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
880 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
881 case ATK.ATK_TEXT_BOUNDARY_LINE_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
882 int lineEnd1 = nextIndexOfChar (text, "\n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
883 if (lineEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
884 startBounds = endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
885 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
886 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
887 startBounds = lineEnd1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
888 if (startBounds is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
889 endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
890 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
891 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
892 int lineEnd2 = nextIndexOfChar (text, "\n", lineEnd1 + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
893 if (lineEnd2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
894 endBounds = length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
895 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
896 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
897 endBounds = lineEnd2;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
898 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
899 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
900 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
901 *start_offset=startBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
902 *end_offset=endBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
903 text = text[startBounds .. endBounds ];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
904 auto result = cast(char*)OS.g_malloc (text.length+1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
905 result[ 0 .. text.length ] = text;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
906 result[ text.length ] = '\0';
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
907 return result;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
908 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
909 return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
910 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
911
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
912 package static extern(C) char* atkText_get_text_at_offset (void* obj, int offset_value, int boundary_type, int* start_offset, int* end_offset) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
913 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
914 if (DEBUG) Stdout.formatln ("-->atkText_get_text_at_offset: {} start: {} end: {}", offset_value, start_offset, end_offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
915 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
916 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
917 int offset = offset_value;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
918 char[] text = object.getText ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
919 if (text.length > 0) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
920 int length = text.length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
921 offset = Math.min (offset, length - 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
922 int startBounds = offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
923 int endBounds = offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
924 switch (boundary_type) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
925 case ATK.ATK_TEXT_BOUNDARY_CHAR: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
926 if (length > offset) endBounds++;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
927 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
928 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
929 case ATK.ATK_TEXT_BOUNDARY_WORD_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
930 int wordStart1 = previousIndexOfNotChar (text, " !?.\n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
931 if (wordStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
932 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
933 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
934 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
935 wordStart1 = previousIndexOfChar (text, " !?.\n", wordStart1) + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
936 if (wordStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
937 startBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
938 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
939 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
940 startBounds = wordStart1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
941 int wordStart2 = nextIndexOfChar (text, " !?.\n", wordStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
942 endBounds = nextIndexOfNotChar (text, " !?.\n", wordStart2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
943 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
944 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
945 case ATK.ATK_TEXT_BOUNDARY_WORD_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
946 int wordEnd1 = previousIndexOfNotChar (text, "!?.", offset + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
947 wordEnd1 = previousIndexOfChar (text, " !?.\n", wordEnd1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
948 wordEnd1 = previousIndexOfNotChar (text, " \n", wordEnd1 + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
949 if (wordEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
950 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
951 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
952 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
953 startBounds = wordEnd1 + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
954 int wordEnd2 = nextIndexOfNotChar (text, " \n", startBounds);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
955 if (wordEnd2 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
956 endBounds = startBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
957 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
958 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
959 wordEnd2 = nextIndexOfChar (text, " !?.\n", wordEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
960 if (wordEnd2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
961 endBounds = startBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
962 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
963 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
964 endBounds = nextIndexOfNotChar (text, "!?.", wordEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
965 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
966 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
967 case ATK.ATK_TEXT_BOUNDARY_SENTENCE_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
968 int sentenceStart1 = previousIndexOfNotChar (text, " !?.\n", offset + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
969 if (sentenceStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
970 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
971 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
972 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
973 sentenceStart1 = previousIndexOfChar (text, "!?.", sentenceStart1) + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
974 startBounds = nextIndexOfNotChar (text, " \n", sentenceStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
975 int sentenceStart2 = nextIndexOfChar (text, "!?.", startBounds);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
976 endBounds = nextIndexOfNotChar (text, " !?.\n", sentenceStart2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
977 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
978 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
979 case ATK.ATK_TEXT_BOUNDARY_SENTENCE_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
980 int sentenceEnd1 = previousIndexOfNotChar (text, "!?.", offset + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
981 sentenceEnd1 = previousIndexOfChar (text, "!?.", sentenceEnd1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
982 sentenceEnd1 = previousIndexOfNotChar (text, " \n", sentenceEnd1 + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
983 if (sentenceEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
984 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
985 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
986 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
987 startBounds = sentenceEnd1 + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
988 int sentenceEnd2 = nextIndexOfNotChar (text, " \n", startBounds);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
989 if (sentenceEnd2 is length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
990 endBounds = startBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
991 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
992 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
993 sentenceEnd2 = nextIndexOfChar (text, "!?.", sentenceEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
994 if (sentenceEnd2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
995 endBounds = startBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
996 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
997 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
998 endBounds = nextIndexOfNotChar (text, "!?.", sentenceEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
999 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1000 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1001 case ATK.ATK_TEXT_BOUNDARY_LINE_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1002 startBounds = previousIndexOfChar (text, "\n", offset) + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1003 int lineEnd2 = nextIndexOfChar (text, "\n", startBounds);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1004 if (lineEnd2 < length) lineEnd2++;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1005 endBounds = lineEnd2;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1006 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1007 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1008 case ATK.ATK_TEXT_BOUNDARY_LINE_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1009 int lineEnd1 = previousIndexOfChar (text, "\n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1010 if (lineEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1011 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1012 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1013 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1014 startBounds = lineEnd1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1015 endBounds = nextIndexOfChar (text, "\n", lineEnd1 + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1016 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1017 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1018 *start_offset=startBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1019 *end_offset=endBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1020 text = text[startBounds .. endBounds];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1021 auto result = cast(char*) OS.g_malloc (text.length+1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1022 result[ 0 .. text.length ] = text;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1023 result[ text.length ] = '\0';
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1024 return result;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1025 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1026 return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1027 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1028
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1029 package static extern(C) char* atkText_get_text_before_offset (void* obj, int offset_value, int boundary_type, int* start_offset, int* end_offset) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1030 auto atkObject = cast(AtkObject*)obj;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1031 if (DEBUG) Stdout.formatln ("-->atkText_get_text_before_offset");
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1032 AccessibleObject object = getAccessibleObject (atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1033 if (object is null) return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1034 int offset = offset_value;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1035 char[] text = object.getText ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1036 if (text.length > 0) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1037 int length = text.length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1038 offset = Math.min (offset, length - 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1039 int startBounds = offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1040 int endBounds = offset;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1041 switch (boundary_type) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1042 case ATK.ATK_TEXT_BOUNDARY_CHAR: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1043 if (length >= offset && offset > 0) startBounds--;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1044 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1045 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1046 case ATK.ATK_TEXT_BOUNDARY_WORD_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1047 int wordStart1 = previousIndexOfChar (text, " !?.\n", offset - 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1048 if (wordStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1049 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1050 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1051 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1052 int wordStart2 = previousIndexOfNotChar (text, " !?.\n", wordStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1053 if (wordStart2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1054 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1055 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1056 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1057 endBounds = wordStart1 + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1058 startBounds = previousIndexOfChar (text, " !?.\n", wordStart2) + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1059 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1060 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1061 case ATK.ATK_TEXT_BOUNDARY_WORD_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1062 int wordEnd1 =previousIndexOfChar (text, " !?.\n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1063 if (wordEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1064 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1065 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1066 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1067 wordEnd1 = previousIndexOfNotChar (text, " \n", wordEnd1 + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1068 if (wordEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1069 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1070 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1071 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1072 endBounds = wordEnd1 + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1073 int wordEnd2 = previousIndexOfNotChar (text, " !?.\n", endBounds);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1074 wordEnd2 = previousIndexOfChar (text, " !?.\n", wordEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1075 if (wordEnd2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1076 startBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1077 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1078 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1079 startBounds = previousIndexOfNotChar (text, " \n", wordEnd2 + 1) + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1080 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1081 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1082 case ATK.ATK_TEXT_BOUNDARY_SENTENCE_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1083 int sentenceStart1 = previousIndexOfChar (text, "!?.", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1084 if (sentenceStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1085 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1086 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1087 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1088 int sentenceStart2 = previousIndexOfNotChar (text, "!?.", sentenceStart1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1089 if (sentenceStart2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1090 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1091 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1092 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1093 endBounds = sentenceStart1 + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1094 startBounds = previousIndexOfChar (text, "!?.", sentenceStart2) + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1095 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1096 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1097 case ATK.ATK_TEXT_BOUNDARY_SENTENCE_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1098 int sentenceEnd1 = previousIndexOfChar (text, "!?.", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1099 if (sentenceEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1100 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1101 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1102 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1103 sentenceEnd1 = previousIndexOfNotChar (text, " \n", sentenceEnd1 + 1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1104 if (sentenceEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1105 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1106 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1107 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1108 endBounds = sentenceEnd1 + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1109 int sentenceEnd2 = previousIndexOfNotChar (text, "!?.", endBounds);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1110 sentenceEnd2 = previousIndexOfChar (text, "!?.", sentenceEnd2);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1111 if (sentenceEnd2 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1112 startBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1113 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1114 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1115 startBounds = previousIndexOfNotChar (text, " \n", sentenceEnd2 + 1) + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1116 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1117 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1118 case ATK.ATK_TEXT_BOUNDARY_LINE_START: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1119 int lineStart1 = previousIndexOfChar (text, "\n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1120 if (lineStart1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1121 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1122 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1123 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1124 endBounds = lineStart1 + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1125 startBounds = previousIndexOfChar (text, "\n", lineStart1) + 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1126 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1127 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1128 case ATK.ATK_TEXT_BOUNDARY_LINE_END: {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1129 int lineEnd1 = previousIndexOfChar (text, "\n", offset);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1130 if (lineEnd1 is -1) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1131 startBounds = endBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1132 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1133 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1134 endBounds = lineEnd1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1135 startBounds = previousIndexOfChar (text, "\n", lineEnd1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1136 if (startBounds is -1) startBounds = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1137 break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1138 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1139 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1140 *start_offset=startBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1141 *end_offset=endBounds;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1142 text = text[startBounds .. endBounds];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1143 auto result = cast(char*)OS.g_malloc (text.length+1);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1144 result[ 0 .. text.length ] = text;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1145 result[ text.length ] = '\0';
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1146 return result;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1147 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1148 return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1149 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1150
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1151 AccessibleListener[] getAccessibleListeners () {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1152 if (accessible is null) return new AccessibleListener [0];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1153 AccessibleListener[] result = accessible.getAccessibleListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1154 return result !is null ? result : new AccessibleListener [0];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1155 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1156
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1157 static AccessibleObject getAccessibleObject (AtkObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1158 return AccessibleObjects[atkObject];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1159 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1160
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1161 AccessibleObject getChildByHandle (AtkObject* handle) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1162 return children[handle];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1163 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1164
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1165 AccessibleObject getChildByID (int childId) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1166 if (childId is ACC.CHILDID_SELF) return this;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1167 foreach( object; children ){
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1168 if (object.id is childId) return object;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1169 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1170 return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1171 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1172
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1173 AccessibleObject getChildByIndex (int childIndex) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1174 foreach( object; children ){
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1175 if (object.index is childIndex) return object;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1176 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1177 return null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1178 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1179
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1180 AccessibleControlListener[] getControlListeners () {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1181 if (accessible is null) return new AccessibleControlListener [0];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1182 AccessibleControlListener[] result = accessible.getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1183 return result !is null ? result : new AccessibleControlListener [0];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1184 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1185
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1186 char[] getText () {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1187 char* parentResult;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1188 char[] parentText = ""; //$NON-NLS-1$
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1189 if (ATK.g_type_is_a (parentType, ATK_TEXT_TYPE)) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1190 auto textIface = cast(AtkTextIface*)ATK.g_type_interface_peek_parent (ATK.ATK_TEXT_GET_IFACE (handle));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1191 int /*long*/ characterCount = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1192 if (textIface.get_character_count !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1193 characterCount = textIface.get_character_count( handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1194 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1195 if (characterCount > 0 && textIface.get_text !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1196 parentResult = textIface.get_text( handle, 0, characterCount);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1197 if (parentResult !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1198 parentText = fromUtf8z( parentResult ).dup;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1199 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1200 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1201 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1202 AccessibleControlListener[] controlListeners = getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1203 if (controlListeners.length is 0) return parentText;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1204 AccessibleControlEvent event = new AccessibleControlEvent (this);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1205 event.childID = id;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1206 event.result = parentText;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1207 for (int i = 0; i < controlListeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1208 controlListeners [i].getValue (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1209 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1210 return event.result;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1211 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1212
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1213 AccessibleTextListener[] getTextListeners () {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1214 if (accessible is null) return new AccessibleTextListener [0];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1215 AccessibleTextListener[] result = accessible.getTextListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1216 return result !is null ? result : new AccessibleTextListener [0];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1217 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1218
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1219 private static extern(C) void gObjectClass_finalize (GObject* atkObject) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1220 auto superType = ATK.g_type_class_peek_parent (ATK.G_OBJECT_GET_CLASS (cast(GTypeInstance*)atkObject));
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1221 auto objectClassStruct = cast(GObjectClass*)ATK.G_OBJECT_CLASS (cast(GTypeClass*)superType);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1222 objectClassStruct.finalize(atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1223 AccessibleObject object = getAccessibleObject (cast(AtkObject*)atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1224 if (object !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1225 AccessibleObjects.remove (cast(AtkObject*)atkObject);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1226 object.release ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1227 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1228 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1229
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1230 static int nextIndexOfChar (char[] string, char[] searchChars, int startIndex) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1231 int result = string.length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1232 for (int i = 0; i < searchChars.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1233 char current = searchChars[i];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1234 int index = locate( string, current, startIndex );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1235 if (index !is string.length ) result = Math.min (result, index);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1236 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1237 return result;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1238 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1239
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1240 static int nextIndexOfNotChar (char[] string, char[] searchChars, int startIndex) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1241 int length = string.length;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1242 int index = startIndex;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1243 while (index < length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1244 char current = string[index];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1245 if ( !contains( searchChars, current)) break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1246 index++;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1247 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1248 return index;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1249 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1250
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1251 static int previousIndexOfChar (char[] string, char[] searchChars, int startIndex) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1252 int result = -1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1253 if (startIndex < 0) return result;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1254 string = string[0 .. startIndex];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1255 for (int i = 0; i < searchChars.length ; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1256 char current = searchChars[i];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1257 int index = locatePrior( string, current);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1258 if (index !is string.length ) result = Math.max (result, index);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1259 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1260 return result;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1261 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1262
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1263 static int previousIndexOfNotChar (char[] string, char[] searchChars, int startIndex) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1264 if (startIndex < 0) return -1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1265 int index = startIndex - 1;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1266 while (index >= 0) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1267 char current = string[index];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1268 if ( !contains(searchChars, current)) break;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1269 index--;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1270 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1271 return index;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1272 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1273
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1274 void release () {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1275 if (DEBUG) Stdout.formatln("AccessibleObject.release: {}", handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1276 accessible = null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1277 foreach( child; children ){
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1278 if (child.isLightweight) OS.g_object_unref (child.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1279 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1280 if (parent !is null) parent.removeChild (this, false);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1281 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1282
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1283 void removeChild (AccessibleObject child, bool unref) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1284 children.remove (child.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1285 if (unref && child.isLightweight) OS.g_object_unref (child.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1286 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1287
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1288 void selectionChanged () {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1289 OS.g_signal_emit_by_name0 (handle, ATK.selection_changed.ptr);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1290 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1291
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1292 void setFocus (int childID) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1293 updateChildren ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1294 AccessibleObject accObject = getChildByID (childID);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1295 if (accObject !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1296 ATK.atk_focus_tracker_notify (accObject.handle);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1297 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1298 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1299
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1300 void setParent (AccessibleObject parent) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1301 this.parent = parent;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1302 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1303
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1304 void textCaretMoved(int index) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1305 OS.g_signal_emit_by_name1 (handle, ATK.text_caret_moved.ptr, index);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1306 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1307
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1308 void textChanged(int type, int startIndex, int length) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1309 if (type is ACC.TEXT_DELETE) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1310 OS.g_signal_emit_by_name2 (handle, ATK.text_changed_delete.ptr, startIndex, length);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1311 } else {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1312 OS.g_signal_emit_by_name2 (handle, ATK.text_changed_insert.ptr, startIndex, length);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1313 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1314 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1315
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1316 void textSelectionChanged() {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1317 OS.g_signal_emit_by_name0 (handle, ATK.text_selection_changed.ptr);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1318 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1319
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1320 void updateChildren () {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1321 if (isLightweight) return;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1322 AccessibleControlListener[] listeners = getControlListeners ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1323 if (listeners.length is 0) return;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1324
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1325 AccessibleControlEvent event = new AccessibleControlEvent (this);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1326 for (int i = 0; i < listeners.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1327 listeners [i].getChildren (event);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1328 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1329 if (event.children !is null && event.children.length > 0) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1330 AtkObject*[] idsToKeep = new AtkObject*[]( children.length );
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1331 idsToKeep.length = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1332 if ( null !is (cast(Integer)event.children[0] )) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1333 /* an array of child id's (Integers) was answered */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1334 auto parentType = AccessibleFactory.getDefaultParentType ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1335 for (int i = 0; i < event.children.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1336 AccessibleObject object = getChildByIndex (i);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1337 if (object is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1338 auto childType = AccessibleFactory.getChildType (accessible, i);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1339 object = new AccessibleObject (childType, null, accessible, parentType, true);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1340 AccessibleObjects[object.handle] = object;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1341 addChild (object);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1342 object.index = i;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1343 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1344 if( auto intChild = cast(Integer)event.children[i] ){
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1345 object.id = intChild.intValue ();
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1346 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1347 else {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1348 /* a non-ID value was given so don't set the ID */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1349 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1350 idsToKeep ~= object.handle;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1351 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1352 } else {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1353 /* an array of Accessible children was answered */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1354 int childIndex = 0;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1355 for (int i = 0; i < event.children.length; i++) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1356 AccessibleObject object = null;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1357 if( auto accChild = cast(Accessible)event.children[i] ){
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1358 object = accChild.accessibleObject;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1359 } else {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1360 /* a non-Accessible value was given so nothing to do here */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1361 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1362 if (object !is null) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1363 object.index = childIndex++;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1364 idsToKeep ~= object.handle;
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1365 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1366 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1367 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1368 /* remove old children that were not provided as children anymore */
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1369 foreach( id; children.keys ){
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1370 if ( !tango.core.Array.contains( idsToKeep, id )) {
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1371 AccessibleObject object = cast(AccessibleObject) children[id];
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1372 removeChild (object, true);
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1373 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1374 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1375 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1376 }
787b5413b0ce accessibility package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1377 }