Make sure that all classes inheriting QAction are treated right.
[qt-at-spi:qt-at-spi.git] / src / atspiadaptor.h
1 /*
2  * Copyright 2011 Nokia Corporation and/or its subsidiary(-ies).
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #ifndef ATSPIADAPTOR_H
19 #define ATSPIADAPTOR_H
20
21 #include <atspi/atspi-constants.h>
22
23 #include <qaccessible2.h>
24 #include <qdbusvirtualobject.h>
25 #include <qsharedpointer.h>
26
27 #include "dbusconnection.h"
28 #include "struct_marshallers.h"
29
30 class QAccessibleInterface;
31 class QSpiAccessibleInterface;
32
33 typedef QSharedPointer<QAccessibleInterface> QAIPointer;
34
35 class AtSpiAdaptor :public QDBusVirtualObject
36 {
37     Q_OBJECT
38
39 public:
40     explicit AtSpiAdaptor(DBusConnection *connection, QObject *parent = 0);
41     ~AtSpiAdaptor();
42
43     void registerApplication();
44     QString introspect(const QString &path) const;
45     bool handleMessage(const QDBusMessage &message, const QDBusConnection &connection);
46     void notify(int reason, QAccessibleInterface *interface, int child);
47
48     void setInitialized(bool init);
49
50 public Q_SLOTS:
51     void eventListenerRegistered(const QString &bus, const QString &path);
52     void eventListenerDeregistered(const QString &bus, const QString &path);
53     void windowActivated(QObject* window, bool active);
54
55 private:
56     void updateEventListeners();
57     void setBitFlag(const QString &flag);
58
59     // sending messages
60     QVariantList packDBusSignalArguments(const QString &type, int data1, int data2, const QVariant &variantData) const;
61     bool sendDBusSignal(const QString &path, const QString &interface, const QString &name, const QVariantList &arguments) const;
62     QVariant variantForPath(const QString &path) const;
63
64     void sendFocusChanged(QAccessibleInterface *interface, int child) const;
65     void notifyAboutCreation(QAccessibleInterface *interface, int child) const;
66     void notifyAboutDestruction(QAccessibleInterface *interface, int child) const;
67
68     // handlers for the different accessible interfaces
69     bool applicationInterface(QAccessibleInterface *interface, int child, const QString &function, const QDBusMessage &message, const QDBusConnection &connection);
70     bool accessibleInterface(QAccessibleInterface *interface, int child, const QString &function, const QDBusMessage &message, const QDBusConnection &connection);
71     bool componentInterface(QAccessibleInterface *interface, int child, const QString &function, const QDBusMessage &message, const QDBusConnection &connection);
72     bool actionInterface(QAccessibleInterface *interface, int child, const QString &function, const QDBusMessage &message, const QDBusConnection &connection);
73     bool textInterface(QAccessibleInterface *interface, int child, const QString &function, const QDBusMessage &message, const QDBusConnection &connection);
74     bool editableTextInterface(QAccessibleInterface *interface, int child, const QString &function, const QDBusMessage &message, const QDBusConnection &connection);
75     bool valueInterface(QAccessibleInterface *interface, int child, const QString &function, const QDBusMessage &message, const QDBusConnection &connection);
76     bool tableInterface(QAccessibleInterface *interface, int child, const QString &function, const QDBusMessage &message, const QDBusConnection &connection);
77
78     void sendReply(const QDBusConnection &connection, const QDBusMessage &message, const QVariant &argument) const;
79     QAccessibleInterface *accessibleParent(QAccessibleInterface *iface, int child) const;
80
81     QPair<QAIPointer, int> interfaceFromPath(const QString& dbusPath) const;
82     QString pathForInterface(QAccessibleInterface *interface, int index, bool inDestructor = false) const;
83     QString pathForObject(QObject *object) const;
84
85     // accessible helper functions
86     AtspiRole getRole(QAccessibleInterface *interface, int child) const;
87     QSpiRelationArray relationSet(QAccessibleInterface *interface, int child, const QDBusConnection &connection) const;
88     QStringList accessibleInterfaces(QAccessibleInterface *interface, int child) const;
89
90     // component helper functions
91     static QSpiRect getExtents(QAccessibleInterface *interface, int child, uint coordType);
92
93     // action helper functions
94     QSpiActionArray getActions(QAccessibleActionInterface* interface) const;
95
96     // text helper functions
97     QVariantList getAttributes(QAccessibleInterface *interface, int offset, bool includeDefaults) const;
98     QVariantList getAttributeValue(QAccessibleInterface *interface, int offset, const QString &attributeName) const;
99     QVariantList getCharacterExtents(QAccessibleInterface *interface, int offset, uint coordType) const;
100     QVariantList getRangeExtents(QAccessibleInterface *interface, int startOffset, int endOffset, uint coordType) const;
101     QAccessible2::BoundaryType qAccessibleBoundaryType(int atspiTextBoundaryType) const;
102
103     static bool inheritsQAction(QObject *object);
104
105     // private vars
106     QSpiObjectReference accessibilityRegistry;
107     DBusConnection *m_dbus;
108
109     /// Assigned from the accessibility registry.
110     int m_applicationId;
111     bool initialized;
112
113     mutable QHash<quintptr, QWeakPointer<QObject> > m_handledObjects;
114
115     // Bit fields - which updates to send
116
117     // AT-SPI has some events that we do not care about:
118     // document
119     // document-load-complete
120     // document-load-stopped
121     // document-reload
122     uint sendFocus : 1;
123     // mouse abs/rel/button
124
125     // all of object
126     uint sendObject : 1;
127     uint sendObject_active_descendant_changed : 1;
128     uint sendObject_attributes_changed : 1;
129     uint sendObject_bounds_changed : 1;
130     uint sendObject_children_changed : 1;
131 //    uint sendObject_children_changed_add : 1;
132 //    uint sendObject_children_changed_remove : 1;
133     uint sendObject_column_deleted : 1;
134     uint sendObject_column_inserted : 1;
135     uint sendObject_column_reordered : 1;
136     uint sendObject_link_selected : 1;
137     uint sendObject_model_changed : 1;
138     uint sendObject_property_change : 1;
139     uint sendObject_property_change_accessible_description : 1;
140     uint sendObject_property_change_accessible_name : 1;
141     uint sendObject_property_change_accessible_parent : 1;
142     uint sendObject_property_change_accessible_role : 1;
143     uint sendObject_property_change_accessible_table_caption : 1;
144     uint sendObject_property_change_accessible_table_column_description : 1;
145     uint sendObject_property_change_accessible_table_column_header : 1;
146     uint sendObject_property_change_accessible_table_row_description : 1;
147     uint sendObject_property_change_accessible_table_row_header : 1;
148     uint sendObject_property_change_accessible_table_summary : 1;
149     uint sendObject_property_change_accessible_value : 1;
150     uint sendObject_row_deleted : 1;
151     uint sendObject_row_inserted : 1;
152     uint sendObject_row_reordered : 1;
153     uint sendObject_selection_changed : 1;
154     uint sendObject_state_changed : 1;
155     uint sendObject_text_attributes_changed : 1;
156     uint sendObject_text_bounds_changed : 1;
157     uint sendObject_text_caret_moved : 1;
158     uint sendObject_text_changed : 1;
159 //    uint sendObject_text_changed_delete : 1;
160 //    uint sendObject_text_changed_insert : 1;
161     uint sendObject_text_selection_changed : 1;
162     uint sendObject_value_changed : 1;
163     uint sendObject_visible_data_changed : 1;
164
165     // we don't implement terminal
166     // terminal-application_changed/charwidth_changed/columncount_changed/line_changed/linecount_changed
167     uint sendWindow : 1;
168     uint sendWindow_activate : 1;
169     uint sendWindow_close: 1;
170     uint sendWindow_create : 1;
171     uint sendWindow_deactivate : 1;
172 //    uint sendWindow_desktop_create : 1;
173 //    uint sendWindow_desktop_destroy : 1;
174     uint sendWindow_lower : 1;
175     uint sendWindow_maximize : 1;
176     uint sendWindow_minimize : 1;
177     uint sendWindow_move : 1;
178     uint sendWindow_raise : 1;
179     uint sendWindow_reparent : 1;
180     uint sendWindow_resize : 1;
181     uint sendWindow_restore : 1;
182     uint sendWindow_restyle : 1;
183     uint sendWindow_shade : 1;
184     uint sendWindow_unshade : 1;
185 };
186
187 #endif