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>
8 #include <qgraphicsscene.h>
9 #include <qgraphicsview.h>
14 #ifndef QT_NO_ACCESSIBILITY
16 #ifndef QT_NO_ITEMVIEWS
18 KItemListView
*KItemListViewAccessible::view() const
20 return qobject_cast
<KItemListView
*>(object());
23 KItemListViewAccessible::KItemListViewAccessible(KItemListView
*view_
)
24 : QAccessibleObjectEx(view_
)
28 /*if (qobject_cast<const QTableView*>(view())) {
29 m_role = QAccessible::Table;
30 } else if (qobject_cast<const QTreeView*>(view())) {
31 m_role = QAccessible::Tree;
32 } else if (qobject_cast<const QListView*>(view())) {
33 m_role = QAccessible::List;
35 // is this our best guess?
36 m_role = QAccessible::Table;
40 KItemListViewAccessible::~KItemListViewAccessible()
44 void KItemListViewAccessible::modelReset()
47 QAccessibleTable2CellInterface
*KItemListViewAccessible::cell(int index
) const
50 return new KItemListAccessibleCell(view(), index
);
54 QAccessibleTable2CellInterface
*KItemListViewAccessible::cellAt(int row
, int column
) const
56 /*Q_ASSERT(role(0) != QAccessible::Tree);
57 QModelIndex index = view()->model()->index(row, column);
58 //Q_ASSERT(index.isValid());
59 if (!index.isValid()) {
60 qWarning() << "QAccessibleTable2::cellAt: invalid index: " << index << " for " << view();
70 QAccessibleInterface
*KItemListViewAccessible::caption() const
75 QString
KItemListViewAccessible::columnDescription(int) const
78 return QObject::tr("No Column Description");
81 int KItemListViewAccessible::columnCount() const
83 return view()->layouter()->columnCount();
86 int KItemListViewAccessible::rowCount() const
88 int itemCount
= view()->model()->count();
89 int rowCount
= itemCount
/ columnCount();
90 if (itemCount
% rowCount
)
95 int KItemListViewAccessible::selectedCellCount() const
97 return view()->controller()->selectionManager()->selectedItems().size();
100 int KItemListViewAccessible::selectedColumnCount() const
105 int KItemListViewAccessible::selectedRowCount() const
110 QString
KItemListViewAccessible::rowDescription(int) const
112 return "No Row Description";
115 QList
<QAccessibleTable2CellInterface
*> KItemListViewAccessible::selectedCells() const
117 QList
<QAccessibleTable2CellInterface
*> cells
;
118 Q_FOREACH (int index
, view()->controller()->selectionManager()->selectedItems()) {
119 cells
.append(cell(index
));
124 QList
<int> KItemListViewAccessible::selectedColumns() const
127 /*Q_FOREACH (const QModelIndex &index, view()->selectionModel()->selectedColumns()) {
128 columns.append(index.column());
133 QList
<int> KItemListViewAccessible::selectedRows() const
136 /*Q_FOREACH (const QModelIndex &index, view()->selectionModel()->selectedRows()) {
137 rows.append(index.row());
142 QAccessibleInterface
*KItemListViewAccessible::summary() const
147 bool KItemListViewAccessible::isColumnSelected(int) const
149 return false; //view()->selectionModel()->isColumnSelected(column, QModelIndex());
152 bool KItemListViewAccessible::isRowSelected(int) const
154 return false; //view()->selectionModel()->isRowSelected(row, QModelIndex());
157 bool KItemListViewAccessible::selectRow(int)
159 /*QModelIndex index = view()->model()->index(row, 0);
160 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
162 view()->selectionModel()->select(index, QItemSelectionModel::Select);*/
166 bool KItemListViewAccessible::selectColumn(int)
168 /*QModelIndex index = view()->model()->index(0, column);
169 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
171 view()->selectionModel()->select(index, QItemSelectionModel::Select);*/
175 bool KItemListViewAccessible::unselectRow(int)
177 /*QModelIndex index = view()->model()->index(row, 0);
178 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
180 view()->selectionModel()->select(index, QItemSelectionModel::Deselect);*/
184 bool KItemListViewAccessible::unselectColumn(int)
186 /*QModelIndex index = view()->model()->index(0, column);
187 if (!index.isValid() || view()->selectionMode() & QAbstractItemView::NoSelection)
189 view()->selectionModel()->select(index, QItemSelectionModel::Columns & QItemSelectionModel::Deselect);*/
193 QAccessible2::TableModelChange
KItemListViewAccessible::modelChange() const
195 QAccessible2::TableModelChange change
;
200 QAccessible::Role
KItemListViewAccessible::role(int child
) const
202 Q_ASSERT(child
>= 0);
204 return QAccessible::Cell
;
205 return QAccessible::Table
;
208 QAccessible::State
KItemListViewAccessible::state(int child
) const
210 Q_ASSERT(child
== 0);
211 return QAccessible::Normal
;
214 int KItemListViewAccessible::childAt(int x
, int y
) const
216 QPointF point
= QPointF(x
,y
);
217 return view()->itemAt(view()->mapFromScene(point
));
220 int KItemListViewAccessible::childCount() const
222 return rowCount() * columnCount();
225 int KItemListViewAccessible::indexOfChild(const QAccessibleInterface
*iface
) const
227 /*Q_ASSERT(iface->role(0) != QAccessible::TreeItem); // should be handled by tree class
228 if (iface->role(0) == QAccessible::Cell || iface->role(0) == QAccessible::ListItem) {
229 const QAccessibleTable2Cell* cell = static_cast<const QAccessibleTable2Cell*>(iface);
230 return logicalIndex(cell->m_index);
231 } else if (iface->role(0) == QAccessible::ColumnHeader){
232 const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
233 return cell->index + (verticalHeader() ? 1 : 0) + 1;
234 } else if (iface->role(0) == QAccessible::RowHeader){
235 const QAccessibleTable2HeaderCell* cell = static_cast<const QAccessibleTable2HeaderCell*>(iface);
236 return (cell->index+1) * (view()->model()->rowCount()+1) + 1;
237 } else if (iface->role(0) == QAccessible::Pane) {
238 return 1; // corner button
240 qWarning() << "WARNING QAccessibleTable2::indexOfChild Fix my children..."
241 << iface->role(0) << iface->text(QAccessible::Name, 0);
243 // FIXME: we are in denial of our children. this should stop.
246 const KItemListAccessibleCell
*widget
= static_cast<const KItemListAccessibleCell
*>(iface
);
247 return widget
->getIndex();
250 QString
KItemListViewAccessible::text(Text t
, int child
) const
252 Q_ASSERT(child
== 0);
253 // FIXME: I don't think this is needed, but if at all it needs i18n
254 if (t
== QAccessible::Description
)
255 return QObject::tr("List of files present in the current directory");
256 return QObject::tr("File List");
259 QRect
KItemListViewAccessible::rect(int child
) const
262 if (!view()->isVisible())
264 QPoint origin
= view()->scene()->views()[0]->mapToGlobal(QPoint(0, 0));
265 QRect viewRect
= view()->geometry().toRect();
266 return viewRect
.translated(origin
);
269 int KItemListViewAccessible::navigate(RelationFlag relation
, int index
, QAccessibleInterface
**iface
) const
274 if (index == 1 && view()->parent()) {
275 *iface = QAccessible::queryAccessibleInterface(view()->parent());
281 case QAccessible::Child
: {
283 *iface
= cell(index
);
295 QAccessible::Relation
KItemListViewAccessible::relationTo(int, const QAccessibleInterface
*, int) const
297 return QAccessible::Unrelated
;
301 int KItemListViewAccessible::userActionCount(int) const
305 QString
KItemListViewAccessible::actionText(int, Text
, int) const
309 bool KItemListViewAccessible::doAction(int, int, const QVariantList
&)
317 KItemListAccessibleCell::KItemListAccessibleCell(KItemListView
*view_
, int index_
)
318 : /* QAccessibleSimpleEditableTextInterface(this), */ view(view_
)
321 Q_ASSERT(index_
> 0);
324 int KItemListAccessibleCell::columnExtent() const
329 int KItemListAccessibleCell::rowExtent() const
334 QList
<QAccessibleInterface
*> KItemListAccessibleCell::rowHeaderCells() const
336 QList
<QAccessibleInterface
*> headerCell
;
337 /*if (verticalHeader()) {
338 headerCell.append(new QAccessibleTable2HeaderCell(view, m_index.row(), Qt::Vertical));
343 QList
<QAccessibleInterface
*> KItemListAccessibleCell::columnHeaderCells() const
345 QList
<QAccessibleInterface
*> headerCell
;
346 /*if (horizontalHeader()) {
347 headerCell.append(new QAccessibleTable2HeaderCell(view, m_index.column(), Qt::Horizontal));
352 int KItemListAccessibleCell::columnIndex() const
354 return view
->layouter()->itemColumn(index
);
357 int KItemListAccessibleCell::rowIndex() const
359 /*if (role(0) == QAccessible::TreeItem) {
360 const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
362 int row = treeView->d_func()->viewIndex(m_index);
365 return view
->layouter()->itemRow(index
);
369 bool KItemListAccessibleCell::isSelected() const
371 //return widget->isSelected();
376 void KItemListAccessibleCell::rowColumnExtents(int *row
, int *column
, int *rowExtents
, int *columnExtents
, bool *selected
) const
378 KItemListViewLayouter
* layouter
= view
->layouter();
379 *row
= layouter
->itemRow(index
);
380 *column
= layouter
->itemColumn(index
);
383 *selected
= isSelected();
386 QAccessibleTable2Interface
* KItemListAccessibleCell::table() const
388 return QAccessible::queryAccessibleInterface(view
)->table2Interface();
391 QAccessible::Role
KItemListAccessibleCell::role(int child
) const
393 Q_ASSERT(child
== 0);
394 return QAccessible::Cell
;
397 QAccessible::State
KItemListAccessibleCell::state(int child
) const
399 Q_ASSERT(child
== 0);
400 QAccessible::State st
= Normal
;
402 //QRect globalRect = view->rect();
403 //globalRect.translate(view->mapToGlobal(QPoint(0,0)));
404 //if (!globalRect.intersects(rect(0)))
407 // if (widget->isSelected())
409 if (view
->controller()->selectionManager()->currentItem() == index
)
412 //if (m_index.model()->data(m_index, Qt::CheckStateRole).toInt() == Qt::Checked)
414 //if (flags & Qt::ItemIsSelectable) {
417 if (view
->controller()->selectionBehavior() == KItemListController::MultiSelection
)
418 st
|= MultiSelectable
;
420 //if (view->selectionMode() == QAbstractItemView::ExtendedSelection)
421 //st |= ExtSelectable;
423 //if (m_role == QAccessible::TreeItem) {
424 // const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
425 // if (treeView->isExpanded(m_index))
433 bool KItemListAccessibleCell::isExpandable() const
435 return false; //view->model()->hasChildren(m_index);
439 QRect
KItemListAccessibleCell::rect(int) const
441 QRect r
= view
->itemRect(index
).toRect();
444 r
.translate(view
->mapToScene(QPointF(0.0, 0.0)).toPoint());
445 r
.translate(view
->scene()->views()[0]->mapToGlobal(QPoint(0, 0)));
449 QString
KItemListAccessibleCell::text(QAccessible::Text t
, int child
) const
451 Q_ASSERT(child
== 0);
452 QHash
<QByteArray
, QVariant
> data
= view
->model()->data(index
);
454 case QAccessible::Value
:
455 case QAccessible::Name
:
456 return data
["text"].toString();
457 case QAccessible::Description
:
458 return data
["text"].toString() + " : " + data
["group"].toString();
465 void KItemListAccessibleCell::setText(QAccessible::Text
/*t*/, int child
, const QString
&text
)
467 Q_ASSERT(child
== 0);
468 // FIXME - is this even allowed on the KItemListWidget?
471 bool KItemListAccessibleCell::isValid() const
473 return view
&& (index
> 0);
476 int KItemListAccessibleCell::navigate(RelationFlag relation
, int index
, QAccessibleInterface
**iface
) const
478 if (relation
== Ancestor
&& index
== 1) {
479 //if (m_role == QAccessible::TreeItem) {
480 // *iface = new QAccessibleTree(view);
482 *iface
= new KItemListViewAccessible(view
);
497 QAccessibleInterface
*parent
= queryAccessibleInterface(view
);
498 int ret
= parent
->navigate(QAccessible::Child
, index
, iface
);
511 QAccessible::Relation
KItemListAccessibleCell::relationTo(int child
, const QAccessibleInterface
*, int otherChild
) const
513 Q_ASSERT(child
== 0);
514 Q_ASSERT(otherChild
== 0);
515 /* we only check for parent-child relationships in trees
516 if (m_role == QAccessible::TreeItem && other->role(0) == QAccessible::TreeItem) {
517 QModelIndex otherIndex = static_cast<const QAccessibleTable2Cell*>(other)->m_index;
518 // is the other our parent?
519 if (otherIndex.parent() == m_index)
520 return QAccessible::Ancestor;
521 // are we the other's child?
522 if (m_index.parent() == otherIndex)
523 return QAccessible::Child;
525 return QAccessible::Unrelated
;
529 int KItemListAccessibleCell::userActionCount(int) const
534 QString
KItemListAccessibleCell::actionText(int, Text
, int) const
539 bool KItemListAccessibleCell::doAction(int, int, const QVariantList
&)
546 KItemListContainerAccessible::KItemListContainerAccessible(KItemListContainer
*container
)
547 : QAccessibleWidgetEx(container
)
550 KItemListContainerAccessible::~KItemListContainerAccessible ()
553 int KItemListContainerAccessible::childCount () const
558 int KItemListContainerAccessible::indexOfChild ( const QAccessibleInterface
* child
) const
560 if(child
->object() == container()->controller()->view())
565 int KItemListContainerAccessible::navigate ( QAccessible::RelationFlag relation
, int index
, QAccessibleInterface
** target
) const
567 if (relation
== QAccessible::Child
) {
568 *target
= new KItemListViewAccessible(container()->controller()->view());
571 return QAccessibleWidgetEx::navigate(relation
, index
, target
);
574 #endif // QT_NO_ITEMVIEWS
576 #endif // QT_NO_ACCESSIBILITY