1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 IBM Corporation and others. All rights reserved.
3  * The contents of this file are made available under the terms
4  * of the GNU Lesser General Public License (LGPL) Version 2.1 that
5  * accompanies this distribution (lgpl-v21.txt).  The LGPL is also
6  * available at http://www.gnu.org/licenses/lgpl.html.  If the version
7  * of the LGPL at http://www.gnu.org is different to the version of
8  * the LGPL accompanying this distribution and there is any conflict
9  * between the two license versions, the terms of the LGPL accompanying
10  * this distribution shall govern.
11  *
12  * Contributors:
13  *     IBM Corporation - initial API and implementation
14  * Port to the D programming language:
15  *     Frank Benoit <benoit@tionex.de>
16  *******************************************************************************/
17 module org.eclipse.swt.internal.accessibility.gtk.ATK;
18 
19 import java.lang.all;
20 
21 
22 import org.eclipse.swt.internal.Library;
23 import org.eclipse.swt.internal.gtk.OS;
24 import org.eclipse.swt.internal.c.atk;
25 import org.eclipse.swt.internal.c.gtk;
26 
27 version(Tango){
28     import tango.core.Traits;
29     import tango.core.Tuple;
30 } else { // Phobos
31     import std.traits;
32     import std.typetuple;
33 }
34 
35 alias org.eclipse.swt.internal.c.atk.AtkObjectFactory AtkObjectFactory;
36 alias org.eclipse.swt.internal.c.atk.AtkObjectClass AtkObjectClass;
37 alias org.eclipse.swt.internal.c.atk.AtkActionIface AtkActionIface;
38 alias org.eclipse.swt.internal.c.atk.AtkComponentIface AtkComponentIface;
39 alias org.eclipse.swt.internal.c.atk.AtkHypertextIface AtkHypertextIface;
40 alias org.eclipse.swt.internal.c.atk.AtkSelectionIface AtkSelectionIface;
41 alias org.eclipse.swt.internal.c.atk.AtkTextIface AtkTextIface;
42 alias org.eclipse.swt.internal.c.atk.AtkObject AtkObject;
43 alias org.eclipse.swt.internal.c.atk.AtkStateSet AtkStateSet;
44 alias org.eclipse.swt.internal.c.atk.AtkObjectFactoryClass AtkObjectFactoryClass;
45 alias org.eclipse.swt.internal.c.atk.AtkHyperlink AtkHyperlink;
46 
47 alias org.eclipse.swt.internal.c.gtk.GtkAccessible GtkAccessible;
48 
49 private AtkActionIface* ATK_ACTION_GET_IFACE( AtkObject* ){
50     return null;
51 }
52 private AtkComponentIface* ATK_COMPONENT_GET_IFACE( AtkObject* ){
53     return null;
54 }
55 private AtkObjectFactoryClass* ATK_OBJECT_FACTORY_CLASS( void* ){
56     return null;
57 }
58 private AtkSelectionIface* ATK_SELECTION_GET_IFACE( AtkObject* ){
59     return null;
60 }
61 private AtkTextIface* ATK_TEXT_GET_IFACE(AtkObject*){
62     return null;
63 }
64 private GtkAccessible* GTK_ACCESSIBLE(AtkObject*){
65     return null;
66 }
67 
68 
69 template NameOfFunc(alias f) {
70     // Note: highly dependent on the .stringof formatting
71     // the value begins with "& " which is why the first two chars are cut off
72     // stringof in DMD and LDC is "& foobar"
73     static assert( (&f).stringof[0] == '&' );
74     static assert( (&f).stringof[1] == ' ' );
75     const char[] NameOfFunc = (&f).stringof[2 .. $];
76 }
77 
78 template ForwardGtkAtkCFunc( alias cFunc ) {
79     version(Tango){
80         alias ParameterTupleOf!(cFunc) P;
81         alias ReturnTypeOf!(cFunc) R;
82         mixin("public static R " ~ NameOfFunc!(cFunc) ~ "( P p ){
83             lock.lock();
84             scope(exit) lock.unlock();
85             return cFunc(p);
86         }");
87     } else { // Phobos
88         alias ParameterTypeTuple!(cFunc) P;
89         alias ReturnType!(cFunc) R;
90         mixin("public static R " ~ NameOfFunc!(cFunc) ~ "( P p ){
91             lock.lock();
92             scope(exit) lock.unlock();
93             return cFunc(p);
94         }");
95     }
96 }
97 /+
98 // alternative template implementation, might be more stable
99 template ForwardGtkOsCFunc(String name) {
100   alias typeof(mixin(name)) func;
101   alias ParameterTupleOf!(func) Params;
102   alias ReturnTypeOf!(func) Ret;
103   mixin("public static Ret "~name~"( Params p ) {
104     return ."~name~"(p);
105   }");
106 }
107 +/
108 
109 public class ATK : OS {
110 
111     /** Constants */
112     public static const int ATK_RELATION_LABELLED_BY = 4;
113     public static const int ATK_ROLE_CHECK_BOX = 7;
114     public static const int ATK_ROLE_COMBO_BOX = 11;
115     public static const int ATK_ROLE_DIALOG = 16;
116     public static const int ATK_ROLE_DRAWING_AREA = 18;
117     public static const int ATK_ROLE_WINDOW = 68;
118     public static const int ATK_ROLE_LABEL = 28;
119     public static const int ATK_ROLE_LIST = 30;
120     public static const int ATK_ROLE_LIST_ITEM = 31;
121     public static const int ATK_ROLE_MENU = 32;
122     public static const int ATK_ROLE_MENU_BAR = 33;
123     public static const int ATK_ROLE_MENU_ITEM = 34;
124     public static const int ATK_ROLE_PAGE_TAB = 36;
125     public static const int ATK_ROLE_PAGE_TAB_LIST = 37;
126     public static const int ATK_ROLE_PROGRESS_BAR = 41;
127     public static const int ATK_ROLE_PUSH_BUTTON = 42;
128     public static const int ATK_ROLE_RADIO_BUTTON = 43;
129     public static const int ATK_ROLE_SCROLL_BAR = 47;
130     public static const int ATK_ROLE_SEPARATOR = 49;
131     public static const int ATK_ROLE_SLIDER = 50;
132     public static const int ATK_ROLE_TABLE = 54;
133     public static const int ATK_ROLE_TABLE_CELL = 55;
134     public static const int ATK_ROLE_TABLE_COLUMN_HEADER = 56;
135     public static const int ATK_ROLE_TABLE_ROW_HEADER = 57;
136     public static const int ATK_ROLE_TEXT = 60;
137     public static const int ATK_ROLE_TOOL_BAR = 62;
138     public static const int ATK_ROLE_TOOL_TIP = 63;
139     public static const int ATK_ROLE_TREE = 64;
140     public static const int ATK_STATE_ARMED = 2;
141     public static const int ATK_STATE_BUSY = 3;
142     public static const int ATK_STATE_CHECKED = 4;
143     public static const int ATK_STATE_DEFUNCT = 5;
144     public static const int ATK_STATE_EDITABLE = 6;
145     public static const int ATK_STATE_ENABLED = 7;
146     public static const int ATK_STATE_EXPANDED = 9;
147     public static const int ATK_STATE_FOCUSABLE = 10;
148     public static const int ATK_STATE_FOCUSED = 11;
149     public static const int ATK_STATE_MULTISELECTABLE = 16;
150     public static const int ATK_STATE_PRESSED = 18;
151     public static const int ATK_STATE_RESIZABLE = 19;
152     public static const int ATK_STATE_SELECTABLE = 20;
153     public static const int ATK_STATE_SELECTED = 21;
154     public static const int ATK_STATE_SHOWING = 23;
155     public static const int ATK_STATE_TRANSIENT = 26;
156     public static const int ATK_STATE_VISIBLE = 28;
157     public static const int ATK_TEXT_BOUNDARY_CHAR = 0;
158     public static const int ATK_TEXT_BOUNDARY_WORD_START = 1;
159     public static const int ATK_TEXT_BOUNDARY_WORD_END = 2;
160     public static const int ATK_TEXT_BOUNDARY_SENTENCE_START = 3;
161     public static const int ATK_TEXT_BOUNDARY_SENTENCE_END = 4;
162     public static const int ATK_TEXT_BOUNDARY_LINE_START = 5;
163     public static const int ATK_TEXT_BOUNDARY_LINE_END = 6;
164     public static const int ATK_XY_WINDOW = 1;
165 
166     /** Signals */
167     public static const String selection_changed = "selection_changed";
168     public static const String text_changed_insert = "text_changed::insert";
169     public static const String text_changed_delete = "text_changed::delete";
170     public static const String text_caret_moved = "text_caret_moved";
171     public static const String text_selection_changed = "text_selection_changed";
172 
173     mixin ForwardGtkAtkCFunc!(.ATK_ACTION_GET_IFACE );
174     mixin ForwardGtkAtkCFunc!(.ATK_COMPONENT_GET_IFACE);
175     mixin ForwardGtkAtkCFunc!(.ATK_OBJECT_FACTORY_CLASS );
176     mixin ForwardGtkAtkCFunc!(.ATK_SELECTION_GET_IFACE );
177     mixin ForwardGtkAtkCFunc!(.ATK_TEXT_GET_IFACE );
178     mixin ForwardGtkAtkCFunc!(.GTK_ACCESSIBLE );
179     mixin ForwardGtkAtkCFunc!(.atk_focus_tracker_notify );
180     mixin ForwardGtkAtkCFunc!(.atk_get_default_registry );
181     mixin ForwardGtkAtkCFunc!(.atk_object_factory_create_accessible );
182     mixin ForwardGtkAtkCFunc!(.atk_object_factory_get_accessible_type );
183     mixin ForwardGtkAtkCFunc!(.atk_object_initialize );
184     mixin ForwardGtkAtkCFunc!(.atk_object_ref_relation_set );
185     mixin ForwardGtkAtkCFunc!(.atk_registry_get_factory );
186     mixin ForwardGtkAtkCFunc!(.atk_registry_set_factory_type );
187     mixin ForwardGtkAtkCFunc!(.atk_relation_set_get_n_relations );
188     mixin ForwardGtkAtkCFunc!(.atk_relation_set_get_relation );
189     mixin ForwardGtkAtkCFunc!(.atk_relation_set_remove );
190     mixin ForwardGtkAtkCFunc!(.atk_state_set_add_state );
191     mixin ForwardGtkAtkCFunc!(.atk_state_set_new );
192 
193 }
194 
195