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
83 return "No Column Description";
86 int KItemListViewAccessible::columnCount() const
88 return view()->layouter()->columnCount();
91 int KItemListViewAccessible::rowCount() const
93 int itemCount
= view()->model()->count();
94 int rowCount
= itemCount
/ columnCount();
95 if (itemCount
% rowCount
)
100 int KItemListViewAccessible::selectedCellCount() const
102 return view()->controller()->selectionManager()->selectedItems().size();
105 int KItemListViewAccessible::selectedColumnCount() const
110 int KItemListViewAccessible::selectedRowCount() const
115 QString
KItemListViewAccessible::rowDescription(int) const
117 return "No Row Description";
120 QList
<QAccessibleTable2CellInterface
*> KItemListViewAccessible::selectedCells() const
122 QList
<QAccessibleTable2CellInterface
*> cells
;
123 Q_FOREACH (int index
, view()->controller()->selectionManager()->selectedItems()) {
124 cells
.append(cell(index
));
129 QList
<int> KItemListViewAccessible::selectedColumns() const
132 /*Q_FOREACH (const QModelIndex &index, view()->selectionModel()->selectedColumns()) {
133 columns.append(index.column());
138 QList
<int> KItemListViewAccessible::selectedRows() const
141 /*Q_FOREACH (const QModelIndex &index, view()->selectionModel()->selectedRows()) {
142 rows.append(index.row());
147 QAccessibleInterface
*KItemListViewAccessible::summary() const
152 bool KItemListViewAccessible::isColumnSelected(int) const
154 return false; //view()->selectionModel()->isColumnSelected(column, QModelIndex());
157 bool KItemListViewAccessible::isRowSelected(int) const
159 return false; //view()->selectionModel()->isRowSelected(row, QModelIndex());
162 bool KItemListViewAccessible::selectRow(int)
164 /*QModelIndex index = view()->model()->index(row, 0);
165 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
167 view()->selectionModel()->select(index, QItemSelectionModel::Select);*/
171 bool KItemListViewAccessible::selectColumn(int)
173 /*QModelIndex index = view()->model()->index(0, column);
174 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
176 view()->selectionModel()->select(index, QItemSelectionModel::Select);*/
180 bool KItemListViewAccessible::unselectRow(int)
182 /*QModelIndex index = view()->model()->index(row, 0);
183 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
185 view()->selectionModel()->select(index, QItemSelectionModel::Deselect);*/
189 bool KItemListViewAccessible::unselectColumn(int)
191 /*QModelIndex index = view()->model()->index(0, column);
192 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
194 view()->selectionModel()->select(index, QItemSelectionModel::Columns & QItemSelectionModel::Deselect);*/
198 QAccessible2::TableModelChange
KItemListViewAccessible::modelChange() const
200 QAccessible2::TableModelChange change
;
205 QAccessible::Role
KItemListViewAccessible::role(int child
) const
207 Q_ASSERT(child
>= 0);
209 return QAccessible::Cell
;
210 return QAccessible::Table
;
213 QAccessible::State
KItemListViewAccessible::state(int child
) const
215 Q_ASSERT(child
== 0);
216 return QAccessible::Normal
| HasInvokeExtension
;
219 int KItemListViewAccessible::childAt(int x
, int y
) const
221 QPointF point
= QPointF(x
,y
);
222 return view()->itemAt(view()->mapFromScene(point
));
225 int KItemListViewAccessible::childCount() const
227 return rowCount() * columnCount();
230 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface
*iface
) const
232 /*Q_ASSERT(iface->role(0) != QAccessible::TreeItem); // should be handled by tree class
233 if (iface->role(0) == QAccessible::Cell || iface->role(0) == QAccessible::ListItem) {
234 const QAccessibleTable2Cell* cell = static_cast<const QAccessibleTable2Cell*>(iface);
235 return logicalIndex(cell->m_index);
236 } else if (iface->role(0) == QAccessible::ColumnHeader){
237 const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
238 return cell->index + (verticalHeader() ? 1 : 0) + 1;
239 } else if (iface->role(0) == QAccessible::RowHeader){
240 const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
241 return (cell->index+1) * (view()->model()->rowCount()+1) + 1;
242 } else if (iface->role(0) == QAccessible::Pane) {
243 return 1; // corner button
245 qWarning() << "WARNING QAccessibleTable2::indexOfChild Fix my children..."
246 << iface->role(0) << iface->text(QAccessible::Name, 0);
248 // FIXME: we are in denial of our children. this should stop.
251 const KItemListWidgetAccessible
*widget
= static_cast<const KItemListWidgetAccessible
*>(iface
);
252 return widget
->getIndex();
255 QString
KItemListViewAccessible::text(Text t
, int child
) const
257 Q_ASSERT(child
== 0);
258 if (t
== QAccessible::Description
)
259 return "List of files present in the current directory";
263 QRect
KItemListViewAccessible::rect(int child
) const
266 if (!view()->isVisible())
268 return view()->geometry().toRect();
271 int KItemListViewAccessible::navigate(RelationFlag relation
, int index
, QAccessibleInterface
**iface
) const
276 if (index == 1 && view()->parent()) {
277 *iface = QAccessible::queryAccessibleInterface(view()->parent());
283 case QAccessible::Child
: {
285 *iface
= cell(index
);
297 QAccessible::Relation
KItemListViewAccessible::relationTo(int, const QAccessibleInterface
*, int) const
299 return QAccessible::Unrelated
;
303 int KItemListViewAccessible::userActionCount(int) const
307 QString
KItemListViewAccessible::actionText(int, Text
, int) const
311 bool KItemListViewAccessible::doAction(int, int, const QVariantList
&)
319 KItemListWidgetAccessible::KItemListWidgetAccessible(KItemListView
*view_
, int index_
)
320 : /* QAccessibleSimpleEditableTextInterface(this), */ view(view_
), index(index_
)
325 int KItemListWidgetAccessible::columnExtent() const { return 1; }
326 int KItemListWidgetAccessible::rowExtent() const { return 1; }
328 QList
<QAccessibleInterface
*> KItemListWidgetAccessible::rowHeaderCells() const
330 QList
<QAccessibleInterface
*> headerCell
;
331 /*if (verticalHeader()) {
332 headerCell.append(new QAccessibleTable2HeaderCell(view, m_index.row(), Qt::Vertical));
337 QList
<QAccessibleInterface
*> KItemListWidgetAccessible::columnHeaderCells() const
339 QList
<QAccessibleInterface
*> headerCell
;
340 /*if (horizontalHeader()) {
341 headerCell.append(new QAccessibleTable2HeaderCell(view, m_index.column(), Qt::Horizontal));
346 int KItemListWidgetAccessible::columnIndex() const
348 return view
->layouter()->itemColumn(index
);
351 int KItemListWidgetAccessible::rowIndex() const
353 /*if (role(0) == QAccessible::TreeItem) {
354 const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
356 int row = treeView->d_func()->viewIndex(m_index);
359 return view
->layouter()->itemRow(index
);
363 bool KItemListWidgetAccessible::isSelected() const
365 return widget
->isSelected();
368 void KItemListWidgetAccessible::rowColumnExtents(int *row
, int *column
, int *rowExtents
, int *columnExtents
, bool *selected
) const
370 KItemListViewLayouter
* layouter
= view
->layouter();
371 *row
= layouter
->itemRow(index
);
372 *column
= layouter
->itemColumn(index
);
375 *selected
= isSelected();
378 QAccessibleTable2Interface
* KItemListWidgetAccessible::table() const
380 return QAccessible::queryAccessibleInterface(view
)->table2Interface();
383 QAccessible::Role
KItemListWidgetAccessible::role(int child
) const
385 Q_ASSERT(child
== 0);
386 return QAccessible::Cell
;
389 QAccessible::State
KItemListWidgetAccessible::state(int child
) const
391 Q_ASSERT(child
== 0);
392 QAccessible::State st
= Normal
;
394 //QRect globalRect = view->rect();
395 //globalRect.translate(view->mapToGlobal(QPoint(0,0)));
396 //if (!globalRect.intersects(rect(0)))
399 if (widget
->isSelected())
401 if (view
->controller()->selectionManager()->currentItem() == index
)
404 //if (m_index.model()->data(m_index, Qt::CheckStateRole).toInt() == Qt::Checked)
406 //if (flags & Qt::ItemIsSelectable) {
409 if (view
->controller()->selectionBehavior() == KItemListController::MultiSelection
)
410 st
|= MultiSelectable
;
412 //if (view->selectionMode() == QAbstractItemView::ExtendedSelection)
413 //st |= ExtSelectable;
415 //if (m_role == QAccessible::TreeItem) {
416 // const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
417 // if (treeView->isExpanded(m_index))
421 st
|= HasInvokeExtension
;
426 bool KItemListWidgetAccessible::isExpandable() const
428 return false; //view->model()->hasChildren(m_index);
432 QRect
KItemListWidgetAccessible::rect(int child
) const
434 Q_ASSERT(child
== 0);
437 //r = view->visualRect(m_index);
440 // r.translate(view->viewport()->mapTo(view, QPoint(0,0)));
441 // r.translate(view->mapToGlobal(QPoint(0, 0)));
442 return widget
->textRect().toRect();
446 QString
KItemListWidgetAccessible::text(Text t
, int child
) const
448 Q_ASSERT(child
== 0);
450 QHash
<QByteArray
, QVariant
> data
= widget
->data();
452 case QAccessible::Value
:
453 case QAccessible::Name
:
454 return data
["text"].toString();
455 case QAccessible::Description
:
456 return data
["text"].toString() + " : " + data
["group"].toString();
464 void KItemListWidgetAccessible::setText(QAccessible::Text
/*t*/, int child
, const QString
&text
)
466 Q_ASSERT(child
== 0);
467 (widget
->data())["text"]=QVariant(text
);
471 bool KItemListWidgetAccessible::isValid() const
474 qDebug() << "Interface is not valid";
480 int KItemListWidgetAccessible::navigate(RelationFlag relation
, int index
, QAccessibleInterface
**iface
) const
482 if (relation
== Ancestor
&& index
== 1) {
483 //if (m_role == QAccessible::TreeItem) {
484 // *iface = new QAccessibleTree(view);
486 *iface
= new KItemListViewAccessible(view
);
501 QAccessibleInterface
*parent
= queryAccessibleInterface(view
);
502 int ret
= parent
->navigate(QAccessible::Child
, index
, iface
);
509 // From table1 implementation:
514 // // This is in the "not so nice" category. In order to find out which item
515 // // is geometrically around, we have to set the current index, navigate
516 // // and restore the index as well as the old selection
517 // view()->setUpdatesEnabled(false);
518 // const QModelIndex oldIdx = view()->currentIndex();
519 // QList<QModelIndex> kids = children();
520 // const QModelIndex currentIndex = index ? kids.at(index - 1) : QModelIndex(row);
521 // const QItemSelection oldSelection = view()->selectionModel()->selection();
522 // view()->setCurrentIndex(currentIndex);
523 // const QModelIndex idx = view()->moveCursor(toCursorAction(relation), Qt::NoModifier);
524 // view()->setCurrentIndex(oldIdx);
525 // view()->selectionModel()->select(oldSelection, QItemSelectionModel::ClearAndSelect);
526 // view()->setUpdatesEnabled(true);
527 // if (!idx.isValid())
530 // if (idx.parent() != row.parent() || idx.row() != row.row())
531 // *iface = cell(idx);
532 // return index ? kids.indexOf(idx) + 1 : 0; }
540 QAccessible::Relation
KItemListWidgetAccessible::relationTo(int child
, const QAccessibleInterface
*, int otherChild
) const
542 Q_ASSERT(child
== 0);
543 Q_ASSERT(otherChild
== 0);
544 /* we only check for parent-child relationships in trees
545 if (m_role == QAccessible::TreeItem && other->role(0) == QAccessible::TreeItem) {
546 QModelIndex otherIndex = static_cast<const QAccessibleTable2Cell*>(other)->m_index;
547 // is the other our parent?
548 if (otherIndex.parent() == m_index)
549 return QAccessible::Ancestor;
550 // are we the other's child?
551 if (m_index.parent() == otherIndex)
552 return QAccessible::Child;
554 return QAccessible::Unrelated
;
558 int KItemListWidgetAccessible::userActionCount(int) const
563 QString
KItemListWidgetAccessible::actionText(int, Text
, int) const
568 bool KItemListWidgetAccessible::doAction(int, int, const QVariantList
&)
575 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer
*container
)
576 : QAccessibleWidgetEx(container
)
577 , m_container(container
)
580 KItemListContainerAccessible::~KItemListContainerAccessible ()
583 int KItemListContainerAccessible::childCount () const
588 int KItemListContainerAccessible::indexOfChild ( const QAccessibleInterface
* child
) const
590 if(child
== QAccessible::queryAccessibleInterface(m_container
->controller()->view()))
595 bool KItemListContainerAccessible::isValid () const
600 int KItemListContainerAccessible::navigate ( QAccessible::RelationFlag relation
, int index
, QAccessibleInterface
** target
) const
602 if (relation
== QAccessible::Child
) {
603 *target
= new KItemListViewAccessible(m_container
->controller()->view());
606 return QAccessibleWidgetEx::navigate(relation
, index
, target
);
609 QObject
*KItemListContainerAccessible::object() const
614 QRect
KItemListContainerAccessible::rect ( int child
) const
617 KItemListViewAccessible
*iface
= static_cast<KItemListViewAccessible
* >(QAccessible::queryAccessibleInterface(m_container
->controller()->view()));
618 return iface
->rect(0);
620 return m_container
->frameRect();
623 QAccessible::Relation
KItemListContainerAccessible::relationTo ( int , const QAccessibleInterface
*, int ) const
625 return QAccessible::Unrelated
;
628 QAccessible::Role
KItemListContainerAccessible::role ( int child
) const
631 return QAccessible::Table
;
632 return QAccessible::Pane
;
635 QAccessible::State
KItemListContainerAccessible::state ( int child
) const
637 return Normal
| HasInvokeExtension
;
640 QString
KItemListContainerAccessible::text ( QAccessible::Text
, int ) const
645 #endif // QT_NO_ITEMVIEWS
647 #endif // QT_NO_ACCESSIBILITY