]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kitemlistviewaccessible.cpp
Making code confirm to policy
[dolphin.git] / src / kitemviews / kitemlistviewaccessible.cpp
1 #include "kitemlistviewaccessible.h"
2 #include "kitemlistcontroller.h"
3 #include "kitemlistselectionmanager.h"
4 #include "private/kitemlistviewlayouter.h"
5
6 #include <QtGui/qaccessible2.h>
7 #include <qgraphicsscene.h>
8 #include <qgraphicsview.h>
9
10 #include <KDebug>
11 #include <QHash>
12
13 #ifndef QT_NO_ACCESSIBILITY
14
15 KItemListView* KItemListViewAccessible::view() const
16 {
17 return qobject_cast<KItemListView*>(object());
18 }
19
20 KItemListViewAccessible::KItemListViewAccessible(KItemListView* view_) :
21 QAccessibleObjectEx(view_)
22 {
23 Q_ASSERT(view());
24 }
25
26 void KItemListViewAccessible::modelReset()
27 {}
28
29 QAccessible::Role KItemListViewAccessible::cellRole() const
30 {
31 return QAccessible::Cell;
32 }
33
34 QAccessibleTable2CellInterface* KItemListViewAccessible::cell(int index) const
35 {
36 if (index > 0) {
37 return new KItemListAccessibleCell(view(), index);
38 }
39 return 0;
40 }
41
42 QVariant KItemListViewAccessible::invokeMethodEx(Method, int, const QVariantList &)
43 {
44 return QVariant();
45 }
46
47 QAccessibleTable2CellInterface* KItemListViewAccessible::cellAt(int row, int column) const
48 {
49 return cell(column * (row-1) + column) ;
50 }
51
52 QAccessibleInterface* KItemListViewAccessible::caption() const
53 {
54 return 0;
55 }
56
57 QString KItemListViewAccessible::columnDescription(int) const
58 {
59 return QString();
60 }
61
62 int KItemListViewAccessible::columnCount() const
63 {
64 return view()->layouter()->columnCount();
65 }
66
67 int KItemListViewAccessible::rowCount() const
68 {
69 int itemCount = view()->model()->count();
70 int rowCount = itemCount / columnCount();
71 if (itemCount % rowCount) {
72 ++rowCount;
73 }
74 return rowCount;
75 }
76
77 int KItemListViewAccessible::selectedCellCount() const
78 {
79 return view()->controller()->selectionManager()->selectedItems().size();
80 }
81
82 int KItemListViewAccessible::selectedColumnCount() const
83 {
84 return 0;
85 }
86
87 int KItemListViewAccessible::selectedRowCount() const
88 {
89 return 0;
90 }
91
92 QString KItemListViewAccessible::rowDescription(int) const
93 {
94 return QString();
95 }
96
97 QList<QAccessibleTable2CellInterface*> KItemListViewAccessible::selectedCells() const
98 {
99 QList<QAccessibleTable2CellInterface*> cells;
100 Q_FOREACH (int index, view()->controller()->selectionManager()->selectedItems()) {
101 cells.append(cell(index));
102 }
103 return cells;
104 }
105
106 QList<int> KItemListViewAccessible::selectedColumns() const
107 {
108 return QList<int>();
109 }
110
111 QList<int> KItemListViewAccessible::selectedRows() const
112 {
113 return QList<int>();
114 }
115
116 QAccessibleInterface* KItemListViewAccessible::summary() const
117 {
118 return 0;
119 }
120
121 bool KItemListViewAccessible::isColumnSelected(int) const
122 {
123 return false;
124 }
125
126 bool KItemListViewAccessible::isRowSelected(int) const
127 {
128 return false;
129 }
130
131 bool KItemListViewAccessible::selectRow(int)
132 {
133 return true;
134 }
135
136 bool KItemListViewAccessible::selectColumn(int)
137 {
138 return true;
139 }
140
141 bool KItemListViewAccessible::unselectRow(int)
142 {
143 return true;
144 }
145
146 bool KItemListViewAccessible::unselectColumn(int)
147 {
148 return true;
149 }
150
151 QAccessible2::TableModelChange KItemListViewAccessible::modelChange() const
152 {
153 QAccessible2::TableModelChange change;
154 return change;
155 }
156
157 QAccessible::Role KItemListViewAccessible::role(int child) const
158 {
159 Q_ASSERT(child >= 0);
160 if (child > 0) {
161 return QAccessible::Cell;
162 }
163 return QAccessible::Table;
164 }
165
166 QAccessible::State KItemListViewAccessible::state(int child) const
167 {
168 if (child) {
169 QAccessibleInterface* iface;
170 navigate(Child,child,&iface);
171 if (iface) {
172 return iface->state(0);
173 }
174 }
175 return QAccessible::Normal | QAccessible::HasInvokeExtension;
176 }
177
178 int KItemListViewAccessible::childAt(int x, int y) const
179 {
180 QPointF point = QPointF(x,y);
181 return view()->itemAt(view()->mapFromScene(point));
182 }
183
184 int KItemListViewAccessible::childCount() const
185 {
186 return view()->model()->count();
187 }
188
189 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface* iface) const
190 {
191 const KItemListAccessibleCell* widget = static_cast<const KItemListAccessibleCell*>(iface);
192 return widget->index();
193 }
194
195 QString KItemListViewAccessible::text(Text , int child) const
196 {
197 Q_ASSERT(child == 0);
198 return QString();
199 }
200
201 QRect KItemListViewAccessible::rect(int child) const
202 {
203 Q_UNUSED(child)
204 if (!view()->isVisible()) {
205 return QRect();
206 }
207 QPoint origin = view()->scene()->views()[0]->mapToGlobal(QPoint(0, 0));
208 QRect viewRect = view()->geometry().toRect();
209 return viewRect.translated(origin);
210 }
211
212 int KItemListViewAccessible::navigate(RelationFlag relation, int index, QAccessibleInterface* *iface) const
213 {
214 *iface = 0;
215 switch (relation) {
216 case QAccessible::Child: {
217 Q_ASSERT(index > 0);
218 *iface = cell(index);
219 if (*iface) {
220 return 0;
221 }
222 break;
223 }
224 default:
225 break;
226 }
227 return -1;
228 }
229
230 QAccessible::Relation KItemListViewAccessible::relationTo(int, const QAccessibleInterface* , int) const
231 {
232 return QAccessible::Unrelated;
233 }
234
235 #ifndef QT_NO_ACTION
236
237 int KItemListViewAccessible::userActionCount(int) const
238 {
239 return 0;
240 }
241
242 QString KItemListViewAccessible::actionText(int, Text, int) const
243 {
244 return QString();
245 }
246
247 bool KItemListViewAccessible::doAction(int, int, const QVariantList &)
248 {
249 return false;
250 }
251
252 #endif
253
254 // Table Cell
255
256 KItemListAccessibleCell::KItemListAccessibleCell(KItemListView* view, int index) :
257 m_view(view),
258 m_index(index)
259 {
260 Q_ASSERT(index > 0);
261 }
262
263 int KItemListAccessibleCell::columnExtent() const
264 {
265 return 1;
266 }
267
268 int KItemListAccessibleCell::rowExtent() const
269 {
270 return 1;
271 }
272
273 QList<QAccessibleInterface*> KItemListAccessibleCell::rowHeaderCells() const
274 {
275 return QList<QAccessibleInterface*>();
276 }
277
278 QList<QAccessibleInterface*> KItemListAccessibleCell::columnHeaderCells() const
279 {
280 return QList<QAccessibleInterface*>();
281 }
282
283 int KItemListAccessibleCell::columnIndex() const
284 {
285 return m_view->layouter()->itemColumn(m_index);
286 }
287
288 int KItemListAccessibleCell::rowIndex() const
289 {
290 return m_view->layouter()->itemRow(m_index);
291 }
292
293 bool KItemListAccessibleCell::isSelected() const
294 {
295 return m_view->controller()->selectionManager()->isSelected(m_index-1);
296 }
297
298 void KItemListAccessibleCell::rowColumnExtents(int* row, int* column, int* rowExtents, int* columnExtents, bool* selected) const
299 {
300 KItemListViewLayouter* layouter = m_view->layouter();
301 *row = layouter->itemRow(m_index);
302 *column = layouter->itemColumn(m_index);
303 *rowExtents = 1;
304 *columnExtents = 1;
305 *selected = isSelected();
306 }
307
308 QAccessibleTable2Interface* KItemListAccessibleCell::table() const
309 {
310 return QAccessible::queryAccessibleInterface(m_view)->table2Interface();
311 }
312
313 QAccessible::Role KItemListAccessibleCell::role(int child) const
314 {
315 Q_ASSERT(child == 0);
316 return QAccessible::Cell;
317 }
318
319 QAccessible::State KItemListAccessibleCell::state(int child) const
320 {
321 Q_ASSERT(child == 0);
322 QAccessible::State state = Normal;
323
324 if (isSelected()) {
325 state |= Selected;
326 }
327 if (m_view->controller()->selectionManager()->currentItem() == m_index) {
328 state |= Focused;
329 }
330
331 state |= Selectable;
332 state |= Focusable;
333
334 if (m_view->controller()->selectionBehavior() == KItemListController::MultiSelection){
335 state |= MultiSelectable;
336 }
337
338 return state;
339 }
340
341 bool KItemListAccessibleCell::isExpandable() const
342 {
343 return false;
344 }
345
346 QRect KItemListAccessibleCell::rect(int) const
347 {
348 QRect rect = m_view->itemRect(m_index-1).toRect();
349 if (rect.isNull()) {
350 return QRect();
351 }
352 rect.translate(m_view->mapToScene(QPointF(0.0, 0.0)).toPoint());
353 rect.translate(m_view->scene()->views()[0]->mapToGlobal(QPoint(0, 0)));
354 return rect;
355 }
356
357 QString KItemListAccessibleCell::text(QAccessible::Text t, int child) const
358 {
359 Q_ASSERT(child == 0);
360 Q_UNUSED(child)
361 const QHash<QByteArray, QVariant> data = m_view->model()->data(m_index-1);
362 switch (t) {
363 case QAccessible::Value:
364 case QAccessible::Name:
365 return data["text"].toString();
366 default:
367 break;
368 }
369 return QString();
370 }
371
372 void KItemListAccessibleCell::setText(QAccessible::Text /*t*/, int child, const QString &/*text*/)
373 {
374 Q_ASSERT(child == 0);
375 }
376
377 bool KItemListAccessibleCell::isValid() const
378 {
379 return m_view && (m_index > 0);
380 }
381
382 int KItemListAccessibleCell::childAt(int, int) const
383 {
384 return 0;
385 }
386
387 int KItemListAccessibleCell::childCount() const
388 {
389 return 0;
390 }
391
392 int KItemListAccessibleCell::indexOfChild(const QAccessibleInterface* child) const
393 {
394 return -1;
395 }
396
397 int KItemListAccessibleCell::navigate(RelationFlag relation, int index, QAccessibleInterface* *iface) const
398 {
399 if (relation == Ancestor && index == 1) {
400 *iface = new KItemListViewAccessible(m_view);
401 return 0;
402 }
403
404 *iface = 0;
405 if (!m_view) {
406 return -1;
407 }
408
409 switch (relation) {
410
411 case Child: {
412 return -1;
413 }
414 case Sibling:
415 if (index > 0) {
416 QAccessibleInterface* parent = queryAccessibleInterface(m_view);
417 int ret = parent->navigate(QAccessible::Child, index, iface);
418 delete parent;
419 if (*iface) {
420 return ret;
421 }
422 }
423 return -1;
424 default:
425 break;
426 }
427
428 return -1;
429 }
430
431 QAccessible::Relation KItemListAccessibleCell::relationTo(int child, const QAccessibleInterface* , int otherChild) const
432 {
433 Q_ASSERT(child == 0);
434 Q_ASSERT(otherChild == 0);
435 return QAccessible::Unrelated;
436 }
437
438 #ifndef QT_NO_ACTION
439
440 int KItemListAccessibleCell::userActionCount(int) const
441 {
442 return 0;
443 }
444
445 QString KItemListAccessibleCell::actionText(int, Text, int) const
446 {
447 return QString();
448 }
449
450 bool KItemListAccessibleCell::doAction(int, int, const QVariantList &)
451 {
452 return false;
453 }
454
455 #endif
456
457 int KItemListAccessibleCell::index() const
458 {
459 return m_index;
460 }
461
462 QObject* KItemListAccessibleCell::object() const
463 {
464 return 0;
465 }
466
467 // Container Interface
468 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer* container) :
469 QAccessibleWidgetEx(container)
470 {}
471
472 KItemListContainerAccessible::~KItemListContainerAccessible ()
473 {}
474
475 int KItemListContainerAccessible::childCount () const
476 {
477 return 1;
478 }
479
480 int KItemListContainerAccessible::indexOfChild ( const QAccessibleInterface* child ) const
481 {
482 if (child->object() == container()->controller()->view()) {
483 return 1;
484 }
485 return -1;
486 }
487
488 int KItemListContainerAccessible::navigate ( QAccessible::RelationFlag relation, int index, QAccessibleInterface** target ) const
489 {
490 if (relation == QAccessible::Child) {
491 *target = new KItemListViewAccessible(container()->controller()->view());
492 return 0;
493 }
494 return QAccessibleWidgetEx::navigate(relation, index, target);
495 }
496
497 #endif // QT_NO_ACCESSIBILITY