source: trunk/src/plugins/accessible/compat/qaccessiblecompat.cpp

Last change on this file was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 20.7 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the plugins of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at qt-info@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qaccessiblecompat.h"
43#include "q3widgetstack.h"
44
45#include <q3listview.h>
46#include <q3textedit.h>
47#include <q3iconview.h>
48#include <q3listbox.h>
49
50QT_BEGIN_NAMESPACE
51
52/*!
53\fn Q3AccessibleScrollView::Q3AccessibleScrollView(QWidget* widget, Role role)
54
55Constructs a Q3AccessibleScrollView object for a \a widget.
56The \a role is propagated to the QAccessibleWidget constructor.
57*/
58Q3AccessibleScrollView::Q3AccessibleScrollView(QWidget *w, Role role)
59: QAccessibleWidget(w, role)
60{
61}
62
63/*!
64 Returns the ID of the item at viewport position \a x, \a y.
65*/
66int Q3AccessibleScrollView::itemAt(int /*x*/, int /*y*/) const
67{
68 return 0;
69}
70
71/*!
72 Returns the location in viewport coordinates of the item with ID \a
73 item.
74*/
75QRect Q3AccessibleScrollView::itemRect(int /*item*/) const
76{
77 return QRect();
78}
79
80/*!
81 Returns the number of items in the scroll view.
82*/
83int Q3AccessibleScrollView::itemCount() const
84{
85 return 0;
86}
87
88/*!
89 \class QAccessibleListView
90 \brief The QAccessibleListView class implements the QAccessibleInterface for list views.
91 \internal
92*/
93
94static Q3ListViewItem *findLVItem(Q3ListView* listView, int child)
95{
96 int id = 1;
97 Q3ListViewItemIterator it(listView);
98 Q3ListViewItem *item = it.current();
99 while (item && id < child) {
100 ++it;
101 ++id;
102 item = it.current();
103 }
104 return item;
105}
106
107/*!
108 \fn QAccessibleListView::QAccessibleListView(QWidget* widget)
109
110 Constructs a QAccessibleListView object for a \a widget.
111*/
112QAccessibleListView::QAccessibleListView(QWidget *o)
113 : Q3AccessibleScrollView(o, Tree)
114{
115}
116
117/*! Returns the list view. */
118Q3ListView *QAccessibleListView::listView() const
119{
120 Q_ASSERT(widget()->inherits("Q3ListView"));
121 return (Q3ListView*)widget();
122}
123
124/*! \reimp */
125int QAccessibleListView::itemAt(int x, int y) const
126{
127 Q3ListViewItem *item = listView()->itemAt(QPoint(x, y));
128 if (!item)
129 return 0;
130
131 Q3ListViewItemIterator it(listView());
132 int c = 1;
133 while (it.current()) {
134 if (it.current() == item)
135 return c;
136 ++c;
137 ++it;
138 }
139 return 0;
140}
141
142/*! \reimp */
143QRect QAccessibleListView::itemRect(int child) const
144{
145 Q3ListViewItem *item = findLVItem(listView(), child);
146 if (!item)
147 return QRect();
148 return listView()->itemRect(item);
149}
150
151/*! \reimp */
152int QAccessibleListView::itemCount() const
153{
154 Q3ListViewItemIterator it(listView());
155 int c = 0;
156 while (it.current()) {
157 ++c;
158 ++it;
159 }
160
161 return c;
162}
163
164/*! \reimp */
165QString QAccessibleListView::text(Text t, int child) const
166{
167 if (!child || t != Name)
168 return Q3AccessibleScrollView::text(t, child);
169
170 Q3ListViewItem *item = findLVItem(listView(), child);
171 if (!item)
172 return QString();
173 return item->text(0);
174}
175
176/*! \reimp */
177QAccessible::Role QAccessibleListView::role(int child) const
178{
179 if (!child)
180 return Q3AccessibleScrollView::role(child);
181 return TreeItem;
182}
183
184/*! \reimp */
185QAccessible::State QAccessibleListView::state(int child) const
186{
187 State state = Q3AccessibleScrollView::state(child);
188 Q3ListViewItem *item;
189 if (!child || !(item = findLVItem(listView(), child)))
190 return state;
191
192 if (item->isSelectable()) {
193 if (listView()->selectionMode() == Q3ListView::Multi)
194 state |= MultiSelectable;
195 else if (listView()->selectionMode() == Q3ListView::Extended)
196 state |= ExtSelectable;
197 else if (listView()->selectionMode() == Q3ListView::Single)
198 state |= Selectable;
199 if (item->isSelected())
200 state |= Selected;
201 }
202 if (listView()->focusPolicy() != Qt::NoFocus) {
203 state |= Focusable;
204 if (item == listView()->currentItem())
205 state |= Focused;
206 }
207 if (item->childCount()) {
208 if (item->isOpen())
209 state |= Expanded;
210 else
211 state |= Collapsed;
212 }
213 if (!listView()->itemRect(item).isValid())
214 state |= Invisible;
215
216 if (item->rtti() == Q3CheckListItem::RTTI) {
217 if (((Q3CheckListItem*)item)->isOn())
218 state|=Checked;
219 }
220 return state;
221}
222
223/* \reimp
224QAccessibleInterface *QAccessibleListView::focusChild(int *child) const
225{
226 Q3ListViewItem *item = listView()->currentItem();
227 if (!item)
228 return 0;
229
230 Q3ListViewItemIterator it(listView());
231 int c = 1;
232 while (it.current()) {
233 if (it.current() == item) {
234 *child = c;
235 return (QAccessibleInterface*)this;
236 }
237 ++c;
238 ++it;
239 }
240 return 0;
241}
242*/
243/* \reimp
244bool QAccessibleListView::setFocus(int child)
245{
246 bool res = Q3AccessibleScrollView::setFocus(0);
247 if (!child || !res)
248 return res;
249
250 Q3ListViewItem *item = findLVItem(listView(), child);
251 if (!item)
252 return false;
253 listView()->setCurrentItem(item);
254 return true;
255}*/
256
257/*! \internal */
258bool QAccessibleListView::setSelected(int child, bool on, bool extend)
259{
260 if (!child || (extend &&
261 listView()->selectionMode() != Q3ListView::Extended &&
262 listView()->selectionMode() != Q3ListView::Multi))
263 return false;
264
265 Q3ListViewItem *item = findLVItem(listView(), child);
266 if (!item)
267 return false;
268 if (!extend) {
269 listView()->setSelected(item, on);
270 } else {
271 Q3ListViewItem *current = listView()->currentItem();
272 if (!current)
273 return false;
274 bool down = item->itemPos() > current->itemPos();
275 Q3ListViewItemIterator it(current);
276 while (it.current()) {
277 listView()->setSelected(it.current(), on);
278 if (it.current() == item)
279 break;
280 if (down)
281 ++it;
282 else
283 --it;
284 }
285 }
286 return true;
287}
288
289/*! \internal */
290void QAccessibleListView::clearSelection()
291{
292 listView()->clearSelection();
293}
294
295/*! \internal */
296QVector<int> QAccessibleListView::selection() const
297{
298 QVector<int> array;
299 uint size = 0;
300 int id = 1;
301 array.resize(size);
302 Q3ListViewItemIterator it(listView());
303 while (it.current()) {
304 if (it.current()->isSelected()) {
305 ++size;
306 array.resize(size);
307 array[(int)size-1] = id;
308 }
309 ++it;
310 ++id;
311 }
312 return array;
313}
314
315/*!
316 \class QAccessibleIconView
317 \brief The QAccessibleIconView class implements the QAccessibleInterface for icon views.
318 \internal
319*/
320
321static Q3IconViewItem *findIVItem(Q3IconView *iconView, int child)
322{
323 int id = 1;
324 Q3IconViewItem *item = iconView->firstItem();
325 while (item && id < child) {
326 item = item->nextItem();
327 ++id;
328 }
329
330 return item;
331}
332
333/*!
334 \fn QAccessibleIconView::QAccessibleIconView(QWidget* widget)
335
336 Constructs a QAccessibleIconView object for a \a widget.
337*/
338QAccessibleIconView::QAccessibleIconView(QWidget *o)
339 : Q3AccessibleScrollView(o, List)
340{
341 Q_ASSERT(widget()->inherits("Q3IconView"));
342}
343
344/*! Returns the icon view. */
345Q3IconView *QAccessibleIconView::iconView() const
346{
347 return (Q3IconView*)widget();
348}
349
350/*! \internal */
351int QAccessibleIconView::itemAt(int x, int y) const
352{
353 Q3IconViewItem *item = iconView()->findItem(QPoint(x, y));
354 return iconView()->index(item) + 1;
355}
356
357/*! \internal */
358QRect QAccessibleIconView::itemRect(int child) const
359{
360 Q3IconViewItem *item = findIVItem(iconView(), child);
361
362 if (!item)
363 return QRect();
364 return item->rect();
365}
366
367/*! \internal */
368int QAccessibleIconView::itemCount() const
369{
370 return iconView()->count();
371}
372
373/*! \internal */
374QString QAccessibleIconView::text(Text t, int child) const
375{
376 if (!child || t != Name)
377 return Q3AccessibleScrollView::text(t, child);
378
379 Q3IconViewItem *item = findIVItem(iconView(), child);
380 if (!item)
381 return QString();
382 return item->text();
383}
384
385/*! \internal */
386QAccessible::Role QAccessibleIconView::role(int child) const
387{
388 if (!child)
389 return Q3AccessibleScrollView::role(child);
390 return ListItem;
391}
392
393/*! \internal */
394QAccessible::State QAccessibleIconView::state(int child) const
395{
396 State state = Q3AccessibleScrollView::state(child);
397 Q3IconViewItem *item;
398 if (!child || !(item = findIVItem(iconView(), child)))
399 return state;
400
401 if (item->isSelectable()) {
402 if (iconView()->selectionMode() == Q3IconView::Multi)
403 state |= MultiSelectable;
404 else if (iconView()->selectionMode() == Q3IconView::Extended)
405 state |= ExtSelectable;
406 else if (iconView()->selectionMode() == Q3IconView::Single)
407 state |= Selectable;
408 if (item->isSelected())
409 state |= Selected;
410 }
411 if (iconView()->itemsMovable())
412 state |= Movable;
413 if (iconView()->focusPolicy() != Qt::NoFocus) {
414 state |= Focusable;
415 if (item == iconView()->currentItem())
416 state |= Focused;
417 }
418
419 return state;
420}
421
422/* \reimp
423QAccessibleInterface *QAccessibleIconView::focusChild(int *child) const
424{
425 Q3IconViewItem *item = iconView()->currentItem();
426 if (!item)
427 return 0;
428
429 *child = iconView()->index(item);
430 return (QAccessibleInterface*)this;
431}
432*/
433/* \reimp
434bool QAccessibleIconView::setFocus(int child)
435{
436 bool res = Q3AccessibleScrollView::setFocus(0);
437 if (!child || !res)
438 return res;
439
440 Q3IconViewItem *item = findIVItem(iconView(), child);
441 if (!item)
442 return false;
443 iconView()->setCurrentItem(item);
444 return true;
445}*/
446
447/*! \internal */
448bool QAccessibleIconView::setSelected(int child, bool on, bool extend)
449{
450 if (!child || (extend &&
451 iconView()->selectionMode() != Q3IconView::Extended &&
452 iconView()->selectionMode() != Q3IconView::Multi))
453 return false;
454
455 Q3IconViewItem *item = findIVItem(iconView(), child);
456 if (!item)
457 return false;
458 if (!extend) {
459 iconView()->setSelected(item, on, true);
460 } else {
461 Q3IconViewItem *current = iconView()->currentItem();
462 if (!current)
463 return false;
464 bool down = false;
465 Q3IconViewItem *temp = current;
466 while ((temp = temp->nextItem())) {
467 if (temp == item) {
468 down = true;
469 break;
470 }
471 }
472 temp = current;
473 if (down) {
474 while ((temp = temp->nextItem())) {
475 iconView()->setSelected(temp, on, true);
476 if (temp == item)
477 break;
478 }
479 } else {
480 while ((temp = temp->prevItem())) {
481 iconView()->setSelected(temp, on, true);
482 if (temp == item)
483 break;
484 }
485 }
486 }
487 return true;
488}
489
490/*! \internal */
491void QAccessibleIconView::clearSelection()
492{
493 iconView()->clearSelection();
494}
495
496/*! \internal */
497QVector<int> QAccessibleIconView::selection() const
498{
499 QVector<int> array;
500 uint size = 0;
501 int id = 1;
502 array.resize(iconView()->count());
503 Q3IconViewItem *item = iconView()->firstItem();
504 while (item) {
505 if (item->isSelected()) {
506 ++size;
507 array[(int)size-1] = id;
508 }
509 item = item->nextItem();
510 ++id;
511 }
512 array.resize(size);
513 return array;
514}
515
516
517/*!
518 \class Q3AccessibleTextEdit
519 \brief The Q3AccessibleTextEdit class implements the QAccessibleInterface for richtext editors.
520 \internal
521*/
522
523/*!
524 \fn Q3AccessibleTextEdit::Q3AccessibleTextEdit(QWidget* widget)
525
526 Constructs a Q3AccessibleTextEdit object for a \a widget.
527*/
528Q3AccessibleTextEdit::Q3AccessibleTextEdit(QWidget *o)
529: Q3AccessibleScrollView(o, Pane)
530{
531 Q_ASSERT(widget()->inherits("Q3TextEdit"));
532}
533
534/*! Returns the text edit. */
535Q3TextEdit *Q3AccessibleTextEdit::textEdit() const
536{
537
538 return (Q3TextEdit*)widget();
539}
540
541/*! \reimp */
542int Q3AccessibleTextEdit::itemAt(int x, int y) const
543{
544 int p;
545 QPoint cp = textEdit()->viewportToContents(QPoint(x,y));
546 textEdit()->charAt(cp , &p);
547 return p + 1;
548}
549
550/*! \reimp */
551QRect Q3AccessibleTextEdit::itemRect(int item) const
552{
553 QRect rect = textEdit()->paragraphRect(item - 1);
554 if (!rect.isValid())
555 return QRect();
556 QPoint ntl = textEdit()->contentsToViewport(QPoint(rect.x(), rect.y()));
557 return QRect(ntl.x(), ntl.y(), rect.width(), rect.height());
558}
559
560/*! \reimp */
561int Q3AccessibleTextEdit::itemCount() const
562{
563 return textEdit()->paragraphs();
564}
565
566/*! \reimp */
567QString Q3AccessibleTextEdit::text(Text t, int child) const
568{
569 if (t == Name && child > 0)
570 return textEdit()->text(child - 1);
571 if (t == Value) {
572 if (child > 0)
573 return textEdit()->text(child - 1);
574 else
575 return textEdit()->text();
576 }
577
578 return Q3AccessibleScrollView::text(t, child);
579}
580
581/*! \reimp */
582void Q3AccessibleTextEdit::setText(Text t, int control, const QString &text)
583{
584 if (t != Value || control) {
585 Q3AccessibleScrollView::setText(t, control, text);
586 return;
587 }
588 textEdit()->setText(text);
589}
590
591/*! \reimp */
592QAccessible::Role Q3AccessibleTextEdit::role(int child) const
593{
594 if (child)
595 return EditableText;
596 return Q3AccessibleScrollView::role(child);
597}
598
599/*!
600 \class QAccessibleWidgetStack
601 \brief The QAccessibleWidgetStack class implements the QAccessibleInterface for widget stacks.
602
603 \ingroup accessibility
604 \internal
605*/
606
607/*!
608 \fn QAccessibleWidgetStack::QAccessibleWidgetStack(QWidget* widget)
609
610 Creates a QAccessibleWidgetStack object for a \a widget.
611*/
612QAccessibleWidgetStack::QAccessibleWidgetStack(QWidget *w)
613: QAccessibleWidget(w, LayeredPane)
614{
615 Q_ASSERT(widgetStack());
616 setDescription(QLatin1String("This is a widgetstack"));
617}
618
619/*! Returns the widget stack. */
620Q3WidgetStack *QAccessibleWidgetStack::widgetStack() const
621{
622 return qobject_cast<Q3WidgetStack*>(object());
623}
624
625/*! \reimp */
626int QAccessibleWidgetStack::childCount() const
627{
628 // a widget stack has always only one accessible widget
629 return 1;
630}
631
632/*! \reimp */
633int QAccessibleWidgetStack::indexOfChild(const QAccessibleInterface *child) const
634{
635 QObject *childObject = child ? child->object() : 0;
636 if (childObject != widgetStack()->visibleWidget())
637 return -1;
638 return 1;
639}
640
641/*! \reimp */
642int QAccessibleWidgetStack::childAt(int, int) const
643{
644 QWidget *curPage = widgetStack()->visibleWidget();
645 if (!curPage)
646 return 0;
647 return 1;
648}
649
650/*! \reimp */
651int QAccessibleWidgetStack::navigate(RelationFlag rel, int entry,
652 QAccessibleInterface **target) const
653{
654 *target = 0;
655 QObject *targetObject = 0;
656 switch (rel) {
657 // Hierarchical
658 case Child:
659 if (entry != 1)
660 return -1;
661 targetObject = widgetStack()->visibleWidget();
662 break;
663 default:
664 return QAccessibleWidget::navigate(rel, entry, target);
665 }
666 *target = QAccessible::queryAccessibleInterface(targetObject);
667 return *target ? 0 : -1;
668}
669
670/*!
671 \class QAccessibleListBox
672 \brief The QAccessibleListBox class implements the QAccessibleInterface for list boxes.
673
674 \ingroup accessibility
675 \internal
676*/
677
678/*!
679 \fn QAccessibleListBox::QAccessibleListBox(QWidget* widget)
680
681 Constructs a QAccessibleListBox object for a \a widget.
682*/
683QAccessibleListBox::QAccessibleListBox(QWidget *o)
684 : Q3AccessibleScrollView(o, List)
685{
686 Q_ASSERT(widget()->inherits("Q3ListBox"));
687}
688
689/*! Returns the list box. */
690Q3ListBox *QAccessibleListBox::listBox() const
691{
692 return (Q3ListBox*)widget();
693}
694
695/*! \reimp */
696int QAccessibleListBox::itemAt(int x, int y) const
697{
698 Q3ListBoxItem *item = listBox()->itemAt(QPoint(x, y));
699 return listBox()->index(item) + 1;
700}
701
702/*! \reimp */
703QRect QAccessibleListBox::itemRect(int item) const
704{
705 return listBox()->itemRect(listBox()->item(item-1));
706}
707
708/*! \reimp */
709int QAccessibleListBox::itemCount() const
710{
711 return listBox()->count();
712}
713
714/*! \reimp */
715QString QAccessibleListBox::text(Text t, int child) const
716{
717 if (!child || t != Name)
718 return Q3AccessibleScrollView::text(t, child);
719
720 Q3ListBoxItem *item = listBox()->item(child - 1);
721 if (item)
722 return item->text();
723 return QString();
724}
725
726/*! \reimp */
727QAccessible::Role QAccessibleListBox::role(int child) const
728{
729 if (!child)
730 return Q3AccessibleScrollView::role(child);
731 return ListItem;
732}
733
734/*! \reimp */
735QAccessible::State QAccessibleListBox::state(int child) const
736{
737 State state = Q3AccessibleScrollView::state(child);
738 Q3ListBoxItem *item;
739 if (!child || !(item = listBox()->item(child - 1)))
740 return state;
741
742 if (item->isSelectable()) {
743 if (listBox()->selectionMode() == Q3ListBox::Multi)
744 state |= MultiSelectable;
745 else if (listBox()->selectionMode() == Q3ListBox::Extended)
746 state |= ExtSelectable;
747 else if (listBox()->selectionMode() == Q3ListBox::Single)
748 state |= Selectable;
749 if (item->isSelected())
750 state |= Selected;
751 }
752 if (listBox()->focusPolicy() != Qt::NoFocus) {
753 state |= Focusable;
754 if (item->isCurrent())
755 state |= Focused;
756 }
757 if (!listBox()->itemVisible(item))
758 state |= Invisible;
759
760 return state;
761}
762
763/* \reimp
764bool QAccessibleListBox::setFocus(int child)
765{
766 bool res = Q3AccessibleScrollView::setFocus(0);
767 if (!child || !res)
768 return res;
769
770 Q3ListBoxItem *item = listBox()->item(child -1);
771 if (!item)
772 return false;
773 listBox()->setCurrentItem(item);
774 return true;
775}*/
776
777/*!
778 Selects the item with index \a child if \a on is true; otherwise
779 unselects it. If \a extend is true and the selection mode is not
780 \c Single and there is an existing selection, the selection is
781 extended to include all the items from the existing selection up
782 to and including the item with index \a child. Returns true if a
783 selection was made or extended; otherwise returns false.
784
785 \sa selection() clearSelection()
786*/
787bool QAccessibleListBox::setSelected(int child, bool on, bool extend)
788{
789 if (!child || (extend &&
790 listBox()->selectionMode() != Q3ListBox::Extended &&
791 listBox()->selectionMode() != Q3ListBox::Multi))
792 return false;
793
794 Q3ListBoxItem *item = listBox()->item(child -1);
795 if (!item)
796 return false;
797 if (!extend) {
798 listBox()->setSelected(item, on);
799 } else {
800 int current = listBox()->currentItem();
801 bool down = child > current;
802 for (int i = current; i != child;) {
803 down ? i++ : i--;
804 listBox()->setSelected(i, on);
805 }
806
807 }
808 return true;
809}
810
811/*!
812 Sets all the items in the list box to be unselected.
813
814 \sa setSelected() selection()
815*/
816void QAccessibleListBox::clearSelection()
817{
818 listBox()->clearSelection();
819}
820
821/*!
822 Returns a (possibly empty) list of indexes of the items selected
823 in the list box.
824
825 \sa setSelected() clearSelection()
826*/
827QVector<int> QAccessibleListBox::selection() const
828{
829 QVector<int> array;
830 uint size = 0;
831 const uint c = listBox()->count();
832 array.resize(c);
833 for (uint i = 0; i < c; ++i) {
834 if (listBox()->isSelected(i)) {
835 ++size;
836 array[(int)size-1] = i+1;
837 }
838 }
839 array.resize(size);
840 return array;
841}
842
843QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.