1 #include "kitemlistviewaccessible.h"
2 #include "kitemlistcontroller.h"
3 #include "kitemlistselectionmanager.h"
4 #include "private/kitemlistviewlayouter.h"
6 #include <QtGui/qtableview.h>
7 #include <QtGui/qaccessible2.h>
10 #ifndef QT_NO_ACCESSIBILITY
12 #ifndef QT_NO_ITEMVIEWS
14 Implementation of the IAccessible2 table2 interface. Much simpler than
15 the other table interfaces since there is only the main table and cells:
24 KItemListView
*KItemListViewAccessible::view() const
26 return qobject_cast
<KItemListView
*>(object());
29 KItemListViewAccessible::KItemListViewAccessible(KItemListView
*view_
)
30 : QAccessibleObjectEx(view_
)
34 /*if (qobject_cast<const QTableView*>(view())) {
35 m_role = QAccessible::Table;
36 } else if (qobject_cast<const QTreeView*>(view())) {
37 m_role = QAccessible::Tree;
38 } else if (qobject_cast<const QListView*>(view())) {
39 m_role = QAccessible::List;
41 // is this our best guess?
42 m_role = QAccessible::Table;
46 KItemListViewAccessible::~KItemListViewAccessible()
50 void KItemListViewAccessible::modelReset()
53 QAccessibleTable2CellInterface
*KItemListViewAccessible::cell(int index
) const
56 return new KItemListWidgetAccessible(view(), index
);
60 QAccessibleTable2CellInterface
*KItemListViewAccessible::cellAt(int row
, int column
) const
62 /*Q_ASSERT(role(0) != QAccessible::Tree);
63 QModelIndex index = view()->model()->index(row, column);
64 //Q_ASSERT(index.isValid());
65 if (!index.isValid()) {
66 qWarning() << "QAccessibleTable2::cellAt: invalid index: " << index << " for " << view();
76 QAccessibleInterface
*KItemListViewAccessible::caption() const
81 QString
KItemListViewAccessible::columnDescription(int) const
84 return "No Column Description";
87 int KItemListViewAccessible::columnCount() const
89 return view()->layouter()->columnCount();
92 int KItemListViewAccessible::rowCount() const
94 int itemCount
= view()->model()->count();
95 int rowCount
= itemCount
/ columnCount();
96 if (itemCount
% rowCount
)
101 int KItemListViewAccessible::selectedCellCount() const
103 return view()->controller()->selectionManager()->selectedItems().size();
106 int KItemListViewAccessible::selectedColumnCount() const
111 int KItemListViewAccessible::selectedRowCount() const
116 QString
KItemListViewAccessible::rowDescription(int) const
118 return "No Row Description";
121 QList
<QAccessibleTable2CellInterface
*> KItemListViewAccessible::selectedCells() const
123 QList
<QAccessibleTable2CellInterface
*> cells
;
124 Q_FOREACH (int index
, view()->controller()->selectionManager()->selectedItems()) {
125 cells
.append(cell(index
));
130 QList
<int> KItemListViewAccessible::selectedColumns() const
133 /*Q_FOREACH (const QModelIndex &index, view()->selectionModel()->selectedColumns()) {
134 columns.append(index.column());
139 QList
<int> KItemListViewAccessible::selectedRows() const
142 /*Q_FOREACH (const QModelIndex &index, view()->selectionModel()->selectedRows()) {
143 rows.append(index.row());
148 QAccessibleInterface
*KItemListViewAccessible::summary() const
153 bool KItemListViewAccessible::isColumnSelected(int) const
155 return false; //view()->selectionModel()->isColumnSelected(column, QModelIndex());
158 bool KItemListViewAccessible::isRowSelected(int) const
160 return false; //view()->selectionModel()->isRowSelected(row, QModelIndex());
163 bool KItemListViewAccessible::selectRow(int)
165 /*QModelIndex index = view()->model()->index(row, 0);
166 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
168 view()->selectionModel()->select(index, QItemSelectionModel::Select);*/
172 bool KItemListViewAccessible::selectColumn(int)
174 /*QModelIndex index = view()->model()->index(0, column);
175 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
177 view()->selectionModel()->select(index, QItemSelectionModel::Select);*/
181 bool KItemListViewAccessible::unselectRow(int)
183 /*QModelIndex index = view()->model()->index(row, 0);
184 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
186 view()->selectionModel()->select(index, QItemSelectionModel::Deselect);*/
190 bool KItemListViewAccessible::unselectColumn(int)
192 /*QModelIndex index = view()->model()->index(0, column);
193 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
195 view()->selectionModel()->select(index, QItemSelectionModel::Columns & QItemSelectionModel::Deselect);*/
199 QAccessible2::TableModelChange
KItemListViewAccessible::modelChange() const
201 QAccessible2::TableModelChange change
;
206 QAccessible::Role
KItemListViewAccessible::role(int child
) const
208 Q_ASSERT(child
>= 0);
210 return QAccessible::Cell
;
211 return QAccessible::Table
;
214 QAccessible::State
KItemListViewAccessible::state(int child
) const
216 Q_ASSERT(child
== 0);
217 return QAccessible::Normal
| HasInvokeExtension
;
220 int KItemListViewAccessible::childAt(int x
, int y
) const
222 QPointF point
= QPointF(x
,y
);
223 return view()->itemAt(view()->mapFromScene(point
));
226 int KItemListViewAccessible::childCount() const
228 return rowCount() * columnCount();
231 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface
*iface
) const
233 /*Q_ASSERT(iface->role(0) != QAccessible::TreeItem); // should be handled by tree class
234 if (iface->role(0) == QAccessible::Cell || iface->role(0) == QAccessible::ListItem) {
235 const QAccessibleTable2Cell* cell = static_cast<const QAccessibleTable2Cell*>(iface);
236 return logicalIndex(cell->m_index);
237 } else if (iface->role(0) == QAccessible::ColumnHeader){
238 const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
239 return cell->index + (verticalHeader() ? 1 : 0) + 1;
240 } else if (iface->role(0) == QAccessible::RowHeader){
241 const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
242 return (cell->index+1) * (view()->model()->rowCount()+1) + 1;
243 } else if (iface->role(0) == QAccessible::Pane) {
244 return 1; // corner button
246 qWarning() << "WARNING QAccessibleTable2::indexOfChild Fix my children..."
247 << iface->role(0) << iface->text(QAccessible::Name, 0);
249 // FIXME: we are in denial of our children. this should stop.
252 const KItemListWidgetAccessible
*widget
= static_cast<const KItemListWidgetAccessible
*>(iface
);
253 return widget
->getIndex();
256 QString
KItemListViewAccessible::text(Text t
, int child
) const
258 Q_ASSERT(child
== 0);
259 // FIXME: I don't think this is needed, but if at all it needs i18n
260 if (t
== QAccessible::Description
)
261 return "List of files present in the current directory";
265 QRect
KItemListViewAccessible::rect(int child
) const
268 if (!view()->isVisible())
271 // FIXME: map to global
272 return view()->geometry().toRect();
275 int KItemListViewAccessible::navigate(RelationFlag relation
, int index
, QAccessibleInterface
**iface
) const
280 if (index == 1 && view()->parent()) {
281 *iface = QAccessible::queryAccessibleInterface(view()->parent());
287 case QAccessible::Child
: {
289 *iface
= cell(index
);
301 QAccessible::Relation
KItemListViewAccessible::relationTo(int, const QAccessibleInterface
*, int) const
303 return QAccessible::Unrelated
;
307 int KItemListViewAccessible::userActionCount(int) const
311 QString
KItemListViewAccessible::actionText(int, Text
, int) const
315 bool KItemListViewAccessible::doAction(int, int, const QVariantList
&)
323 KItemListWidgetAccessible::KItemListWidgetAccessible(KItemListView
*view_
, int index_
)
324 : /* QAccessibleSimpleEditableTextInterface(this), */ view(view_
), index(index_
)
329 int KItemListWidgetAccessible::columnExtent() const { return 1; }
330 int KItemListWidgetAccessible::rowExtent() const { return 1; }
332 QList
<QAccessibleInterface
*> KItemListWidgetAccessible::rowHeaderCells() const
334 QList
<QAccessibleInterface
*> headerCell
;
335 /*if (verticalHeader()) {
336 headerCell.append(new QAccessibleTable2HeaderCell(view, m_index.row(), Qt::Vertical));
341 QList
<QAccessibleInterface
*> KItemListWidgetAccessible::columnHeaderCells() const
343 QList
<QAccessibleInterface
*> headerCell
;
344 /*if (horizontalHeader()) {
345 headerCell.append(new QAccessibleTable2HeaderCell(view, m_index.column(), Qt::Horizontal));
350 int KItemListWidgetAccessible::columnIndex() const
352 return view
->layouter()->itemColumn(index
);
355 int KItemListWidgetAccessible::rowIndex() const
357 /*if (role(0) == QAccessible::TreeItem) {
358 const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
360 int row = treeView->d_func()->viewIndex(m_index);
363 return view
->layouter()->itemRow(index
);
367 bool KItemListWidgetAccessible::isSelected() const
369 return widget
->isSelected();
372 void KItemListWidgetAccessible::rowColumnExtents(int *row
, int *column
, int *rowExtents
, int *columnExtents
, bool *selected
) const
374 KItemListViewLayouter
* layouter
= view
->layouter();
375 *row
= layouter
->itemRow(index
);
376 *column
= layouter
->itemColumn(index
);
379 *selected
= isSelected();
382 QAccessibleTable2Interface
* KItemListWidgetAccessible::table() const
384 return QAccessible::queryAccessibleInterface(view
)->table2Interface();
387 QAccessible::Role
KItemListWidgetAccessible::role(int child
) const
389 Q_ASSERT(child
== 0);
390 return QAccessible::Cell
;
393 QAccessible::State
KItemListWidgetAccessible::state(int child
) const
395 Q_ASSERT(child
== 0);
396 QAccessible::State st
= Normal
;
398 //QRect globalRect = view->rect();
399 //globalRect.translate(view->mapToGlobal(QPoint(0,0)));
400 //if (!globalRect.intersects(rect(0)))
403 if (widget
->isSelected())
405 if (view
->controller()->selectionManager()->currentItem() == index
)
408 //if (m_index.model()->data(m_index, Qt::CheckStateRole).toInt() == Qt::Checked)
410 //if (flags & Qt::ItemIsSelectable) {
413 if (view
->controller()->selectionBehavior() == KItemListController::MultiSelection
)
414 st
|= MultiSelectable
;
416 //if (view->selectionMode() == QAbstractItemView::ExtendedSelection)
417 //st |= ExtSelectable;
419 //if (m_role == QAccessible::TreeItem) {
420 // const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
421 // if (treeView->isExpanded(m_index))
425 st
|= HasInvokeExtension
;
430 bool KItemListWidgetAccessible::isExpandable() const
432 return false; //view->model()->hasChildren(m_index);
436 QRect
KItemListWidgetAccessible::rect(int child
) const
438 // Q_ASSERT(child == 0);
444 //r = view->visualRect(m_index);
447 // r.translate(view->viewport()->mapTo(view, QPoint(0,0)));
448 // r.translate(view->mapToGlobal(QPoint(0, 0)));
449 //return widget->textRect().toRect();
453 QString
KItemListWidgetAccessible::text(Text t
, int child
) const
455 Q_ASSERT(child
== 0);
457 QHash
<QByteArray
, QVariant
> data
= widget
->data();
459 case QAccessible::Value
:
460 case QAccessible::Name
:
461 return data
["text"].toString();
462 case QAccessible::Description
:
463 return data
["text"].toString() + " : " + data
["group"].toString();
471 void KItemListWidgetAccessible::setText(QAccessible::Text
/*t*/, int child
, const QString
&text
)
473 Q_ASSERT(child
== 0);
474 (widget
->data())["text"]=QVariant(text
);
478 bool KItemListWidgetAccessible::isValid() const
481 kDebug() << "Interface is not valid";
487 int KItemListWidgetAccessible::navigate(RelationFlag relation
, int index
, QAccessibleInterface
**iface
) const
489 if (relation
== Ancestor
&& index
== 1) {
490 //if (m_role == QAccessible::TreeItem) {
491 // *iface = new QAccessibleTree(view);
493 *iface
= new KItemListViewAccessible(view
);
508 QAccessibleInterface
*parent
= queryAccessibleInterface(view
);
509 int ret
= parent
->navigate(QAccessible::Child
, index
, iface
);
516 // From table1 implementation:
521 // // This is in the "not so nice" category. In order to find out which item
522 // // is geometrically around, we have to set the current index, navigate
523 // // and restore the index as well as the old selection
524 // view()->setUpdatesEnabled(false);
525 // const QModelIndex oldIdx = view()->currentIndex();
526 // QList<QModelIndex> kids = children();
527 // const QModelIndex currentIndex = index ? kids.at(index - 1) : QModelIndex(row);
528 // const QItemSelection oldSelection = view()->selectionModel()->selection();
529 // view()->setCurrentIndex(currentIndex);
530 // const QModelIndex idx = view()->moveCursor(toCursorAction(relation), Qt::NoModifier);
531 // view()->setCurrentIndex(oldIdx);
532 // view()->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect);
533 // view()->setUpdatesEnabled(true);
534 // if (!idx.isValid())
537 // if (idx.parent() != row.parent() || idx.row() != row.row())
538 // *iface = cell(idx);
539 // return index ? kids.indexOf(idx) + 1 : 0; }
547 QAccessible::Relation
KItemListWidgetAccessible::relationTo(int child
, const QAccessibleInterface
*, int otherChild
) const
549 Q_ASSERT(child
== 0);
550 Q_ASSERT(otherChild
== 0);
551 /* we only check for parent-child relationships in trees
552 if (m_role == QAccessible::TreeItem && other->role(0) == QAccessible::TreeItem) {
553 QModelIndex otherIndex = static_cast<const QAccessibleTable2Cell*>(other)->m_index;
554 // is the other our parent?
555 if (otherIndex.parent() == m_index)
556 return QAccessible::Ancestor;
557 // are we the other's child?
558 if (m_index.parent() == otherIndex)
559 return QAccessible::Child;
561 return QAccessible::Unrelated
;
565 int KItemListWidgetAccessible::userActionCount(int) const
570 QString
KItemListWidgetAccessible::actionText(int, Text
, int) const
575 bool KItemListWidgetAccessible::doAction(int, int, const QVariantList
&)
582 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer
*container
)
583 : QAccessibleWidgetEx(container
)
586 KItemListContainerAccessible::~KItemListContainerAccessible ()
589 int KItemListContainerAccessible::childCount () const
594 int KItemListContainerAccessible::indexOfChild ( const QAccessibleInterface
* child
) const
596 if(child
== QAccessible::queryAccessibleInterface(container()->controller()->view()))
601 int KItemListContainerAccessible::navigate ( QAccessible::RelationFlag relation
, int index
, QAccessibleInterface
** target
) const
603 if (relation
== QAccessible::Child
) {
604 *target
= new KItemListViewAccessible(container()->controller()->view());
607 return QAccessibleWidgetEx::navigate(relation
, index
, target
);
610 #endif // QT_NO_ITEMVIEWS
612 #endif // QT_NO_ACCESSIBILITY