1
/****************************************************************************
3
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4
** All rights reserved.
5
** Contact: Nokia Corporation (qt-info@nokia.com)
7
** This file is part of the plugins of the Qt Toolkit.
9
** $QT_BEGIN_LICENSE:LGPL$
10
** GNU Lesser General Public License Usage
11
** This file may be used under the terms of the GNU Lesser General Public
12
** License version 2.1 as published by the Free Software Foundation and
13
** appearing in the file LICENSE.LGPL included in the packaging of this
14
** file. Please review the following information to ensure the GNU Lesser
15
** General Public License version 2.1 requirements will be met:
16
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18
** In addition, as a special exception, Nokia gives you certain additional
19
** rights. These rights are described in the Nokia Qt LGPL Exception
20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22
** GNU General Public License Usage
23
** Alternatively, this file may be used under the terms of the GNU General
24
** Public License version 3.0 as published by the Free Software Foundation
25
** and appearing in the file LICENSE.GPL included in the packaging of this
26
** file. Please review the following information to ensure the GNU General
27
** Public License version 3.0 requirements will be met:
28
** http://www.gnu.org/copyleft/gpl.html.
31
** Alternatively, this file may be used in accordance with the terms and
32
** conditions contained in a signed written agreement between you and Nokia.
40
****************************************************************************/
42
#include "qaccessiblemenu.h"
46
#include <QtGui/QAction>
49
#ifndef QT_NO_ACCESSIBILITY
55
QString Q_GUI_EXPORT qt_accStripAmp(const QString &text);
56
QString Q_GUI_EXPORT qt_accHotKey(const QString &text);
58
QAccessibleMenu::QAccessibleMenu(QWidget *w)
59
: QAccessibleWidgetEx(w)
64
QMenu *QAccessibleMenu::menu() const
66
return qobject_cast<QMenu*>(object());
69
int QAccessibleMenu::childCount() const
71
return menu()->actions().count();
74
QRect QAccessibleMenu::rect(int child) const
76
if (!child || child > childCount())
77
return QAccessibleWidgetEx::rect(child);
79
QRect r = menu()->actionGeometry(menu()->actions()[child - 1]);
80
QPoint tlp = menu()->mapToGlobal(QPoint(0,0));
82
return QRect(tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height());
85
int QAccessibleMenu::childAt(int x, int y) const
87
QAction *act = menu()->actionAt(menu()->mapFromGlobal(QPoint(x,y)));
88
if(act && act->isSeparator())
90
return menu()->actions().indexOf(act) + 1;
93
QString QAccessibleMenu::text(Text t, int child) const
95
QString tx = QAccessibleWidgetEx::text(t, child);
102
return menu()->windowTitle();
103
return qt_accStripAmp(menu()->actions().at(child-1)->text());
105
return child ? menu()->actions().at(child-1)->whatsThis() : tx;
106
#ifndef QT_NO_SHORTCUT
108
return child ? static_cast<QString>(menu()->actions().at(child-1)->shortcut()) : tx;
116
QAccessible::Role QAccessibleMenu::role(int child) const
121
QAction *action = menu()->actions()[child-1];
122
if (action && action->isSeparator())
127
QAccessible::State QAccessibleMenu::state(int child) const
129
State s = QAccessibleWidgetEx::state(child);
133
QAction *action = menu()->actions()[child-1];
137
if (menu()->style()->styleHint(QStyle::SH_Menu_MouseTracking))
139
if (action->isSeparator() || !action->isEnabled())
141
if (action->isChecked())
143
if (menu()->activeAction() == action)
149
QString QAccessibleMenu::actionText(int action, QAccessible::Text text, int child) const
151
if (action == QAccessible::DefaultAction && child && text == QAccessible::Name) {
152
QAction *a = menu()->actions().value(child-1, 0);
153
if (!a || a->isSeparator())
156
if (a->menu()->isVisible())
157
return QMenu::tr("Close");
158
return QMenu::tr("Open");
160
return QMenu::tr("Execute");
163
return QAccessibleWidgetEx::actionText(action, text, child);
166
bool QAccessibleMenu::doAction(int act, int child, const QVariantList &)
168
if (!child || act != QAccessible::DefaultAction)
171
QAction *action = menu()->actions().value(child-1, 0);
172
if (!action || !action->isEnabled())
175
if (action->menu() && action->menu()->isVisible())
176
action->menu()->hide();
178
menu()->setActiveAction(action);
182
int QAccessibleMenu::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
190
if (relation == Self || entry == 0) {
191
*target = new QAccessibleMenu(menu());
197
if (entry <= childCount()) {
198
*target = new QAccessibleMenuItem(menu(), menu()->actions().at( entry - 1 ));
203
QAccessibleInterface *iface;
204
QWidget *parent = menu()->parentWidget();
205
if (qobject_cast<QMenu*>(parent) || qobject_cast<QMenuBar*>(parent)) {
206
iface = new QAccessibleMenuItem(parent, menu()->menuAction());
211
ret = iface->navigate(Ancestor, entry - 1, target);
215
return QAccessibleWidgetEx::navigate(relation, entry, target);
219
return QAccessibleWidgetEx::navigate(relation, entry, target);
230
int QAccessibleMenu::indexOfChild( const QAccessibleInterface *child ) const
233
Role r = child->role(0);
234
if ((r == MenuItem || r == Separator) && menu()) {
235
index = menu()->actions().indexOf(qobject_cast<QAction*>(child->object()));
242
#ifndef QT_NO_MENUBAR
243
QAccessibleMenuBar::QAccessibleMenuBar(QWidget *w)
244
: QAccessibleWidgetEx(w)
249
QMenuBar *QAccessibleMenuBar::menuBar() const
251
return qobject_cast<QMenuBar*>(object());
254
int QAccessibleMenuBar::childCount() const
256
return menuBar()->actions().count();
259
QRect QAccessibleMenuBar::rect(int child) const
262
return QAccessibleWidgetEx::rect(child);
264
QRect r = menuBar()->actionGeometry(menuBar()->actions()[child - 1]);
265
QPoint tlp = menuBar()->mapToGlobal(QPoint(0,0));
266
return QRect(tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height());
269
int QAccessibleMenuBar::childAt(int x, int y) const
271
for (int i = childCount(); i >= 0; --i) {
272
if (rect(i).contains(x,y))
278
int QAccessibleMenuBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
286
if (relation == Self || entry == 0) {
287
*target = new QAccessibleMenuBar(menuBar());
293
if (entry <= childCount()) {
294
*target = new QAccessibleMenuItem(menuBar(), menuBar()->actions().at( entry - 1 ));
299
return QAccessibleWidgetEx::navigate(relation, entry, target);
309
int QAccessibleMenuBar::indexOfChild( const QAccessibleInterface *child ) const
312
Role r = child->role(0);
313
if ((r == MenuItem || r == Separator) && menuBar()) {
314
index = menuBar()->actions().indexOf(qobject_cast<QAction*>(child->object()));
321
QString QAccessibleMenuBar::text(Text t, int child) const
326
if (QAction *action = menuBar()->actions().value(child - 1, 0)) {
329
return qt_accStripAmp(action->text());
331
str = qt_accHotKey(action->text());
339
str = QAccessibleWidgetEx::text(t, child);
343
QAccessible::Role QAccessibleMenuBar::role(int child) const
348
QAction *action = menuBar()->actions()[child-1];
349
if (action && action->isSeparator())
354
QAccessible::State QAccessibleMenuBar::state(int child) const
356
State s = QAccessibleWidgetEx::state(child);
360
QAction *action = menuBar()->actions().value(child-1, 0);
364
if (menuBar()->style()->styleHint(QStyle::SH_Menu_MouseTracking))
366
if (action->isSeparator() || !action->isEnabled())
368
if (menuBar()->activeAction() == action)
374
QString QAccessibleMenuBar::actionText(int action, QAccessible::Text text, int child) const
376
if (action == QAccessible::DefaultAction && child && text == QAccessible::Name) {
377
QAction *a = menuBar()->actions().value(child-1, 0);
378
if (!a || a->isSeparator())
381
if (a->menu()->isVisible())
382
return QMenu::tr("Close");
383
return QMenu::tr("Open");
385
return QMenu::tr("Execute");
388
return QAccessibleWidgetEx::actionText(action, text, child);
391
bool QAccessibleMenuBar::doAction(int act, int child, const QVariantList &)
396
QAction *action = menuBar()->actions().value(child-1, 0);
397
if (!action || !action->isEnabled())
399
if (action->menu() && action->menu()->isVisible())
400
action->menu()->hide();
402
menuBar()->setActiveAction(action);
406
#endif // QT_NO_MENUBAR
408
QAccessibleMenuItem::QAccessibleMenuItem(QWidget *owner, QAction *action) : m_action(action), m_owner(owner)
413
QAccessibleMenuItem::~QAccessibleMenuItem()
416
int QAccessibleMenuItem::childAt(int x, int y ) const
418
for (int i = childCount(); i >= 0; --i) {
419
if (rect(i).contains(x,y))
425
int QAccessibleMenuItem::childCount() const
427
return m_action->menu() ? 1 : 0;
430
QString QAccessibleMenuItem::actionText(int action, Text text, int child ) const
432
if (text == Name && child == 0) {
436
return QMenu::tr("Execute");
445
bool QAccessibleMenuItem::doAction(int action, int child, const QVariantList & /*params = QVariantList()*/ )
447
if ((action == Press || action == DefaultAction) && child == 0) {
454
int QAccessibleMenuItem::indexOfChild( const QAccessibleInterface * child ) const
456
if (child->role(0) == PopupMenu && child->object() == m_action->menu())
462
bool QAccessibleMenuItem::isValid() const
464
return m_action ? true : false;
467
int QAccessibleMenuItem::navigate(RelationFlag relation, int entry, QAccessibleInterface ** target ) const
475
if (relation == Self || entry == 0) {
476
*target = new QAccessibleMenuItem(owner(), action());
482
if (entry <= childCount()) {
483
*target = new QAccessibleMenu(action()->menu());
489
QWidget *parent = owner();
490
QAccessibleInterface *ancestor = parent ? QAccessible::queryAccessibleInterface(parent) : 0;
496
ret = ancestor->navigate(Ancestor, entry - 1, target);
503
QAccessibleInterface *parent = 0;
504
int ent = navigate(Ancestor, 1, &parent);
506
int index = parent->indexOfChild(this);
508
index += (relation == Down ? +1 : -1);
509
ret = parent->navigate(Child, index, target);
515
QAccessibleInterface *parent = 0;
516
int ent = navigate(Ancestor, 1, &parent);
518
ret = parent->navigate(Child, entry, target);
531
QObject *QAccessibleMenuItem::object() const
536
QRect QAccessibleMenuItem::rect (int child ) const
540
QWidget *own = owner();
541
#ifndef QT_NO_MENUBAR
542
if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
543
rect = menuBar->actionGeometry(m_action);
544
QPoint globalPos = menuBar->mapToGlobal(QPoint(0,0));
545
rect = rect.translated(globalPos);
547
#endif // QT_NO_MENUBAR
548
if (QMenu *menu = qobject_cast<QMenu*>(own)) {
549
rect = menu->actionGeometry(m_action);
550
QPoint globalPos = menu->mapToGlobal(QPoint(0,0));
551
rect = rect.translated(globalPos);
553
} else if (child == 1) {
554
QMenu *menu = m_action->menu();
557
QPoint globalPos = menu->mapToGlobal(QPoint(0,0));
558
rect = rect.translated(globalPos);
564
QAccessible::Relation QAccessibleMenuItem::relationTo ( int child, const QAccessibleInterface * other, int otherChild ) const
566
if (other->object() == owner()) {
576
QAccessible::Role QAccessibleMenuItem::role(int /*child*/ ) const
578
return m_action->isSeparator() ? Separator :MenuItem;
581
void QAccessibleMenuItem::setText ( Text /*t*/, int /*child*/, const QString & /*text */)
586
QAccessible::State QAccessibleMenuItem::state(int child ) const
588
QAccessible::State s = Unavailable;
592
QWidget *own = owner();
594
if (own->testAttribute(Qt::WA_WState_Visible) == false || m_action->isVisible() == false) {
598
if (QMenu *menu = qobject_cast<QMenu*>(own)) {
599
if (menu->activeAction() == m_action)
601
#ifndef QT_NO_MENUBAR
602
} else if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
603
if (menuBar->activeAction() == m_action)
607
if (own->style()->styleHint(QStyle::SH_Menu_MouseTracking))
609
if (m_action->isSeparator() || !m_action->isEnabled())
611
if (m_action->isChecked())
613
} else if (child == 1) {
614
QMenu *menu = m_action->menu();
616
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(menu);
624
QString QAccessibleMenuItem::text ( Text t, int child ) const
630
str = m_action->text();
631
} else if (child == 1) {
632
QMenu *m = m_action->menu();
636
str = qt_accStripAmp(str);
640
#ifndef QT_NO_SHORTCUT
641
QKeySequence key = m_action->shortcut();
642
if (!key.isEmpty()) {
643
str = key.toString();
647
str = qt_accHotKey(m_action->text());
657
int QAccessibleMenuItem::userActionCount ( int /*child*/ ) const
663
QAction *QAccessibleMenuItem::action() const
668
QWidget *QAccessibleMenuItem::owner() const
677
#endif // QT_NO_ACCESSIBILITY