1 /***************************************************************************
2 * Copyright (C) 2012 by Amandeep Singh <aman.dedman@gmail.com> *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program 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 *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 ***************************************************************************/
20 #ifndef QT_NO_ACCESSIBILITY
22 #include "kitemlistviewaccessible.h"
24 #include "kitemlistcontainer.h"
25 #include "kitemlistcontroller.h"
26 #include "kitemlistselectionmanager.h"
27 #include "kitemlistview.h"
28 #include "private/kitemlistviewlayouter.h"
30 #include <QtGui/qaccessible2.h>
31 #include <qgraphicsscene.h>
32 #include <qgraphicsview.h>
37 KItemListView
* KItemListViewAccessible::view() const
39 return qobject_cast
<KItemListView
*>(object());
42 KItemListViewAccessible::KItemListViewAccessible(KItemListView
* view_
) :
43 QAccessibleObjectEx(view_
)
48 void KItemListViewAccessible::modelReset()
52 QAccessible::Role
KItemListViewAccessible::cellRole() const
54 return QAccessible::Cell
;
57 QAccessibleTable2CellInterface
* KItemListViewAccessible::cell(int index
) const
59 if (index
< 0 || index
>= view()->model()->count()) {
62 return new KItemListAccessibleCell(view(), index
);
66 QVariant
KItemListViewAccessible::invokeMethodEx(Method
, int, const QVariantList
&)
71 QAccessibleTable2CellInterface
* KItemListViewAccessible::cellAt(int row
, int column
) const
73 return cell(columnCount() * row
+ column
);
76 QAccessibleInterface
* KItemListViewAccessible::caption() const
81 QString
KItemListViewAccessible::columnDescription(int) const
86 int KItemListViewAccessible::columnCount() const
88 return view()->m_layouter
->columnCount();
91 int KItemListViewAccessible::rowCount() const
93 if (columnCount() <= 0) {
97 int itemCount
= view()->model()->count();
98 int rowCount
= itemCount
/ columnCount();
104 if (itemCount
% columnCount()) {
110 int KItemListViewAccessible::selectedCellCount() const
112 return view()->controller()->selectionManager()->selectedItems().count();
115 int KItemListViewAccessible::selectedColumnCount() const
120 int KItemListViewAccessible::selectedRowCount() const
125 QString
KItemListViewAccessible::rowDescription(int) const
130 QList
<QAccessibleTable2CellInterface
*> KItemListViewAccessible::selectedCells() const
132 QList
<QAccessibleTable2CellInterface
*> cells
;
133 Q_FOREACH (int index
, view()->controller()->selectionManager()->selectedItems()) {
134 cells
.append(cell(index
));
139 QList
<int> KItemListViewAccessible::selectedColumns() const
144 QList
<int> KItemListViewAccessible::selectedRows() const
149 QAccessibleInterface
* KItemListViewAccessible::summary() const
154 bool KItemListViewAccessible::isColumnSelected(int) const
159 bool KItemListViewAccessible::isRowSelected(int) const
164 bool KItemListViewAccessible::selectRow(int)
169 bool KItemListViewAccessible::selectColumn(int)
174 bool KItemListViewAccessible::unselectRow(int)
179 bool KItemListViewAccessible::unselectColumn(int)
184 QAccessible2::TableModelChange
KItemListViewAccessible::modelChange() const
186 QAccessible2::TableModelChange change
;
187 change
.lastRow
= rowCount();
188 change
.lastColumn
= columnCount();
192 QAccessible::Role
KItemListViewAccessible::role(int child
) const
194 Q_ASSERT(child
>= 0);
197 return QAccessible::Cell
;
199 return QAccessible::Table
;
203 QAccessible::State
KItemListViewAccessible::state(int child
) const
206 QAccessibleInterface
* interface
= 0;
207 navigate(Child
, child
, &interface
);
209 return interface
->state(0);
213 return QAccessible::Normal
| QAccessible::HasInvokeExtension
;
216 int KItemListViewAccessible::childAt(int x
, int y
) const
218 const QPointF point
= QPointF(x
,y
);
219 return view()->itemAt(view()->mapFromScene(point
));
222 int KItemListViewAccessible::childCount() const
224 return view()->model()->count();
227 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface
* interface
) const
229 const KItemListAccessibleCell
* widget
= static_cast<const KItemListAccessibleCell
*>(interface
);
230 return widget
->index() + 1;
233 QString
KItemListViewAccessible::text(Text
, int child
) const
235 Q_ASSERT(child
== 0);
239 QRect
KItemListViewAccessible::rect(int child
) const
242 if (!view()->isVisible()) {
246 const QGraphicsScene
* scene
= view()->scene();
248 const QPoint origin
= scene
->views()[0]->mapToGlobal(QPoint(0, 0));
249 const QRect viewRect
= view()->geometry().toRect();
250 return viewRect
.translated(origin
);
256 int KItemListViewAccessible::navigate(RelationFlag relation
, int index
, QAccessibleInterface
** interface
) const
261 case QAccessible::Child
:
263 *interface
= cell(index
- 1);
276 QAccessible::Relation
KItemListViewAccessible::relationTo(int, const QAccessibleInterface
*, int) const
278 return QAccessible::Unrelated
;
283 int KItemListViewAccessible::userActionCount(int) const
288 QString
KItemListViewAccessible::actionText(int, Text
, int) const
293 bool KItemListViewAccessible::doAction(int, int, const QVariantList
&)
302 KItemListAccessibleCell::KItemListAccessibleCell(KItemListView
* view
, int index
) :
306 Q_ASSERT(index
>= 0 && index
< view
->model()->count());
309 int KItemListAccessibleCell::columnExtent() const
314 int KItemListAccessibleCell::rowExtent() const
319 QList
<QAccessibleInterface
*> KItemListAccessibleCell::rowHeaderCells() const
321 return QList
<QAccessibleInterface
*>();
324 QList
<QAccessibleInterface
*> KItemListAccessibleCell::columnHeaderCells() const
326 return QList
<QAccessibleInterface
*>();
329 int KItemListAccessibleCell::columnIndex() const
331 return m_view
->m_layouter
->itemColumn(m_index
);
334 int KItemListAccessibleCell::rowIndex() const
336 return m_view
->m_layouter
->itemRow(m_index
);
339 bool KItemListAccessibleCell::isSelected() const
341 return m_view
->controller()->selectionManager()->isSelected(m_index
);
344 void KItemListAccessibleCell::rowColumnExtents(int* row
, int* column
, int* rowExtents
, int* columnExtents
, bool* selected
) const
346 const KItemListViewLayouter
* layouter
= m_view
->m_layouter
;
347 *row
= layouter
->itemRow(m_index
);
348 *column
= layouter
->itemColumn(m_index
);
351 *selected
= isSelected();
354 QAccessibleTable2Interface
* KItemListAccessibleCell::table() const
356 return QAccessible::queryAccessibleInterface(m_view
)->table2Interface();
359 QAccessible::Role
KItemListAccessibleCell::role(int child
) const
361 Q_ASSERT(child
== 0);
362 return QAccessible::Cell
;
365 QAccessible::State
KItemListAccessibleCell::state(int child
) const
367 Q_ASSERT(child
== 0);
368 QAccessible::State state
= Normal
;
374 if (m_view
->controller()->selectionManager()->currentItem() == m_index
) {
381 if (m_view
->controller()->selectionBehavior() == KItemListController::MultiSelection
) {
382 state
|= MultiSelectable
;
385 if (m_view
->model()->isExpandable(m_index
)) {
386 if (m_view
->model()->isExpanded(m_index
)) {
396 bool KItemListAccessibleCell::isExpandable() const
398 return m_view
->model()->isExpandable(m_index
);
401 QRect
KItemListAccessibleCell::rect(int) const
403 QRect rect
= m_view
->itemRect(m_index
).toRect();
409 rect
.translate(m_view
->mapToScene(QPointF(0.0, 0.0)).toPoint());
410 rect
.translate(m_view
->scene()->views()[0]->mapToGlobal(QPoint(0, 0)));
414 QString
KItemListAccessibleCell::text(QAccessible::Text t
, int child
) const
416 Q_ASSERT(child
== 0);
420 case QAccessible::Value
:
421 case QAccessible::Name
: {
422 const QHash
<QByteArray
, QVariant
> data
= m_view
->model()->data(m_index
);
423 return data
["text"].toString();
433 void KItemListAccessibleCell::setText(QAccessible::Text
, int child
, const QString
&)
435 Q_ASSERT(child
== 0);
438 bool KItemListAccessibleCell::isValid() const
440 return m_view
&& (m_index
>= 0) && (m_index
< m_view
->model()->count());
443 int KItemListAccessibleCell::childAt(int, int) const
448 int KItemListAccessibleCell::childCount() const
453 int KItemListAccessibleCell::indexOfChild(const QAccessibleInterface
* child
) const
459 int KItemListAccessibleCell::navigate(RelationFlag relation
, int index
, QAccessibleInterface
** interface
) const
461 if (relation
== Ancestor
&& index
== 1) {
462 *interface
= new KItemListViewAccessible(m_view
);
470 QAccessible::Relation
KItemListAccessibleCell::relationTo(int child
, const QAccessibleInterface
* , int otherChild
) const
472 Q_ASSERT(child
== 0);
473 Q_ASSERT(otherChild
== 0);
474 return QAccessible::Unrelated
;
479 int KItemListAccessibleCell::userActionCount(int) const
484 QString
KItemListAccessibleCell::actionText(int, Text
, int) const
489 bool KItemListAccessibleCell::doAction(int, int, const QVariantList
&)
496 int KItemListAccessibleCell::index() const
501 QObject
* KItemListAccessibleCell::object() const
506 // Container Interface
507 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer
* container
) :
508 QAccessibleWidgetEx(container
)
512 KItemListContainerAccessible::~KItemListContainerAccessible()
516 int KItemListContainerAccessible::childCount() const
521 int KItemListContainerAccessible::indexOfChild(const QAccessibleInterface
* child
) const
523 if (child
->object() == container()->controller()->view()) {
530 int KItemListContainerAccessible::navigate(QAccessible::RelationFlag relation
, int index
, QAccessibleInterface
** target
) const
532 if (relation
== QAccessible::Child
) {
533 *target
= new KItemListViewAccessible(container()->controller()->view());
536 return QAccessibleWidgetEx::navigate(relation
, index
, target
);
540 const KItemListContainer
* KItemListContainerAccessible::container() const
542 return qobject_cast
<KItemListContainer
*>(object());
545 #endif // QT_NO_ACCESSIBILITY