summaryrefslogtreecommitdiffstats
path: root/src/plugins/accessible/widgets/qaccessiblemenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/accessible/widgets/qaccessiblemenu.cpp')
-rw-r--r--src/plugins/accessible/widgets/qaccessiblemenu.cpp454
1 files changed, 169 insertions, 285 deletions
diff --git a/src/plugins/accessible/widgets/qaccessiblemenu.cpp b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
index eaf4ecb971..46954c4fbf 100644
--- a/src/plugins/accessible/widgets/qaccessiblemenu.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblemenu.cpp
@@ -73,13 +73,8 @@ int QAccessibleMenu::childCount() const
QRect QAccessibleMenu::rect(int child) const
{
- if (!child || child > childCount())
- return QAccessibleWidget::rect(child);
-
- QRect r = menu()->actionGeometry(menu()->actions()[child - 1]);
- QPoint tlp = menu()->mapToGlobal(QPoint(0,0));
-
- return QRect(tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height());
+ Q_ASSERT(child == 0);
+ return QAccessibleWidget::rect(child);
}
int QAccessibleMenu::childAt(int x, int y) const
@@ -92,79 +87,38 @@ int QAccessibleMenu::childAt(int x, int y) const
QString QAccessibleMenu::text(Text t, int child) const
{
+ Q_ASSERT(child == 0);
QString tx = QAccessibleWidget::text(t, child);
if (tx.size())
return tx;
- switch (t) {
- case Name:
- if (!child)
- return menu()->windowTitle();
- return qt_accStripAmp(menu()->actions().at(child-1)->text());
- case Help:
- return child ? menu()->actions().at(child-1)->whatsThis() : tx;
-#ifndef QT_NO_SHORTCUT
- case Accelerator:
- return child ? static_cast<QString>(menu()->actions().at(child-1)->shortcut()) : tx;
-#endif
- default:
- break;
- }
+ if (t == Name)
+ return menu()->windowTitle();
return tx;
}
QAccessible::Role QAccessibleMenu::role(int child) const
{
- if (!child)
- return PopupMenu;
-
- QAction *action = menu()->actions()[child-1];
- if (action && action->isSeparator())
- return Separator;
- return MenuItem;
+ Q_ASSERT(child == 0);
+ return PopupMenu;
}
QAccessible::State QAccessibleMenu::state(int child) const
{
+ Q_ASSERT(child == 0);
State s = QAccessibleWidget::state(child);
- if (!child)
- return s;
-
- QAction *action = menu()->actions()[child-1];
- if (!action)
- return s;
-
- if (menu()->style()->styleHint(QStyle::SH_Menu_MouseTracking))
- s |= HotTracked;
- if (action->isSeparator() || !action->isEnabled())
- s |= Unavailable;
- if (action->isChecked())
- s |= Checked;
- if (menu()->activeAction() == action)
- s |= Focused;
-
return s;
}
QString QAccessibleMenu::actionText(int action, QAccessible::Text text, int child) const
{
- if (action == QAccessible::DefaultAction && child && text == QAccessible::Name) {
- QAction *a = menu()->actions().value(child-1, 0);
- if (!a || a->isSeparator())
- return QString();
- if (a->menu()) {
- if (a->menu()->isVisible())
- return QMenu::tr("Close");
- return QMenu::tr("Open");
- }
- return QMenu::tr("Execute");
- }
-
+ Q_ASSERT(child == 0);
return QAccessibleWidget::actionText(action, text, child);
}
bool QAccessibleMenu::doAction(int act, int child, const QVariantList &)
{
+// Q_ASSERT(child == 0);
if (!child || act != QAccessible::DefaultAction)
return false;
@@ -179,52 +133,35 @@ bool QAccessibleMenu::doAction(int act, int child, const QVariantList &)
return true;
}
-int QAccessibleMenu::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+QAccessibleInterface *QAccessibleMenu::child(int index) const
{
- int ret = -1;
- if (entry < 0) {
- *target = 0;
- return ret;
- }
+ if (index < childCount())
+ return new QAccessibleMenuItem(menu(), menu()->actions().at(index));
+ return 0;
+}
- if (relation == Self || entry == 0) {
- *target = new QAccessibleMenu(menu());
- return 0;
+QAccessibleInterface *QAccessibleMenu::parent() const
+{
+ QWidget *parent = menu()->parentWidget();
+ if (qobject_cast<QMenu*>(parent) || qobject_cast<QMenuBar*>(parent)) {
+ return new QAccessibleMenuItem(parent, menu()->menuAction());
}
+ return QAccessibleWidget::parent();
+}
+int QAccessibleMenu::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ Q_ASSERT(entry >= 0);
switch (relation) {
case Child:
- if (entry <= childCount()) {
- *target = new QAccessibleMenuItem(menu(), menu()->actions().at( entry - 1 ));
- ret = 0;
- }
- break;
- case Ancestor: {
- QAccessibleInterface *iface;
- QWidget *parent = menu()->parentWidget();
- if (qobject_cast<QMenu*>(parent) || qobject_cast<QMenuBar*>(parent)) {
- iface = new QAccessibleMenuItem(parent, menu()->menuAction());
- if (entry == 1) {
- *target = iface;
- ret = 0;
- } else {
- ret = iface->navigate(Ancestor, entry - 1, target);
- delete iface;
- }
- } else {
- return QAccessibleWidget::navigate(relation, entry, target);
- }
- break;}
+ *target = child(entry - 1);
+ return *target ? 0 : -1;
+ case Ancestor:
+ *target = parent();
+ return *target ? 0 : -1;
default:
return QAccessibleWidget::navigate(relation, entry, target);
}
-
-
- if (ret == -1)
- *target = 0;
-
- return ret;
-
}
int QAccessibleMenu::indexOfChild( const QAccessibleInterface *child ) const
@@ -258,12 +195,8 @@ int QAccessibleMenuBar::childCount() const
QRect QAccessibleMenuBar::rect(int child) const
{
- if (!child)
- return QAccessibleWidget::rect(child);
-
- QRect r = menuBar()->actionGeometry(menuBar()->actions()[child - 1]);
- QPoint tlp = menuBar()->mapToGlobal(QPoint(0,0));
- return QRect(tlp.x() + r.x(), tlp.y() + r.y(), r.width(), r.height());
+ Q_ASSERT(child == 0);
+ return QAccessibleWidget::rect(child);
}
int QAccessibleMenuBar::childAt(int x, int y) const
@@ -275,38 +208,23 @@ int QAccessibleMenuBar::childAt(int x, int y) const
return -1;
}
-int QAccessibleMenuBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+QAccessibleInterface *QAccessibleMenuBar::child(int index) const
{
- int ret = -1;
- if (entry < 0) {
- *target = 0;
- return ret;
- }
-
- if (relation == Self || entry == 0) {
- *target = new QAccessibleMenuBar(menuBar());
- return 0;
- }
+ if (index < childCount())
+ return new QAccessibleMenuItem(menuBar(), menuBar()->actions().at(index));
+ return 0;
+}
- switch (relation) {
- case Child:
- if (entry <= childCount()) {
- *target = new QAccessibleMenuItem(menuBar(), menuBar()->actions().at( entry - 1 ));
- ret = 0;
- }
- break;
- default:
- return QAccessibleWidget::navigate(relation, entry, target);
+int QAccessibleMenuBar::navigate(RelationFlag relation, int entry, QAccessibleInterface **target) const
+{
+ if (relation == Child) {
+ *target = child(entry - 1);
+ return *target ? 0 : -1;
}
-
-
- if (ret == -1)
- *target = 0;
-
- return ret;
+ return QAccessibleWidget::navigate(relation, entry, target);
}
-int QAccessibleMenuBar::indexOfChild( const QAccessibleInterface *child ) const
+int QAccessibleMenuBar::indexOfChild(const QAccessibleInterface *child) const
{
int index = -1;
Role r = child->role(0);
@@ -320,87 +238,43 @@ int QAccessibleMenuBar::indexOfChild( const QAccessibleInterface *child ) const
QString QAccessibleMenuBar::text(Text t, int child) const
{
- QString str;
-
- if (child) {
- if (QAction *action = menuBar()->actions().value(child - 1, 0)) {
- switch (t) {
- case Name:
- return qt_accStripAmp(action->text());
- case Accelerator:
- str = qt_accHotKey(action->text());
- break;
- default:
- break;
- }
- }
- }
- if (str.isEmpty())
- str = QAccessibleWidget::text(t, child);
- return str;
+ Q_ASSERT(child == 0);
+ return QAccessibleWidget::text(t, child);
}
QAccessible::Role QAccessibleMenuBar::role(int child) const
{
- if (!child)
- return MenuBar;
-
- QAction *action = menuBar()->actions()[child-1];
- if (action && action->isSeparator())
- return Separator;
- return MenuItem;
+ Q_ASSERT(child == 0);
+ return MenuBar;
}
QAccessible::State QAccessibleMenuBar::state(int child) const
{
+ Q_ASSERT(child == 0);
State s = QAccessibleWidget::state(child);
- if (!child)
- return s;
-
- QAction *action = menuBar()->actions().value(child-1, 0);
- if (!action)
- return s;
-
- if (menuBar()->style()->styleHint(QStyle::SH_Menu_MouseTracking))
- s |= HotTracked;
- if (action->isSeparator() || !action->isEnabled())
- s |= Unavailable;
- if (menuBar()->activeAction() == action)
- s |= Focused;
-
return s;
}
QString QAccessibleMenuBar::actionText(int action, QAccessible::Text text, int child) const
{
- if (action == QAccessible::DefaultAction && child && text == QAccessible::Name) {
- QAction *a = menuBar()->actions().value(child-1, 0);
- if (!a || a->isSeparator())
- return QString();
- if (a->menu()) {
- if (a->menu()->isVisible())
- return QMenu::tr("Close");
- return QMenu::tr("Open");
- }
- return QMenu::tr("Execute");
- }
-
+ Q_ASSERT(child == 0);
return QAccessibleWidget::actionText(action, text, child);
}
-bool QAccessibleMenuBar::doAction(int act, int child, const QVariantList &)
+bool QAccessibleMenuBar::doAction(int, int child, const QVariantList &)
{
- if (act != !child)
- return false;
-
+// Q_ASSERT(child == 0);
QAction *action = menuBar()->actions().value(child-1, 0);
if (!action || !action->isEnabled())
return false;
if (action->menu() && action->menu()->isVisible())
action->menu()->hide();
- else
+ else {
menuBar()->setActiveAction(action);
+ }
return true;
+
+ return false;
}
#endif // QT_NO_MENUBAR
@@ -427,32 +301,69 @@ int QAccessibleMenuItem::childCount() const
return m_action->menu() ? 1 : 0;
}
-QString QAccessibleMenuItem::actionText(int action, Text text, int child ) const
+QString QAccessibleMenuItem::actionText(int action, Text text, int child) const
{
- if (text == Name && child == 0) {
- switch (action) {
- case Press:
- case DefaultAction:
- return QMenu::tr("Execute");
- break;
- default:
- break;
+ Q_ASSERT(child == 0);
+ if (!m_action || m_action->isSeparator())
+ return QString();
+
+ if (text == Name && ((action == Press) || (action == DefaultAction))) {
+ if (m_action->menu()) {
+ return QMenu::tr("Open");
}
+ return QMenu::tr("Execute");
}
return QString();
}
+
+//QAction *action = menuBar()->actions().value(child-1, 0);
+//if (!action || !action->isEnabled())
+// return false;
+//if (action->menu() && action->menu()->isVisible())
+// action->menu()->hide();
+//else
+// menuBar()->setActiveAction(action);
+//return true;
+
+
+
bool QAccessibleMenuItem::doAction(int action, int child, const QVariantList & /*params = QVariantList()*/ )
{
- if ((action == Press || action == DefaultAction) && child == 0) {
+ Q_ASSERT(child == 0);
+ if ((action != Press) && (action != DefaultAction))
+ return false;
+ if (!m_action->isEnabled())
+ return false;
+
+ if (QMenuBar *bar = qobject_cast<QMenuBar*>(owner())) {
+ if (m_action->menu() && m_action->menu()->isVisible()) {
+ m_action->menu()->hide();
+ return true;
+ } else {
+ bar->setActiveAction(m_action);
+ return true;
+ }
+ return false;
+ } else if (QMenu *menu = qobject_cast<QMenu*>(owner())){
+ if (m_action->menu() && m_action->menu()->isVisible()) {
+ m_action->menu()->hide();
+ return true;
+ } else {
+ menu->setActiveAction(m_action);
+ return true;
+ }
+ } else {
+ // no menu
m_action->trigger();
return true;
}
return false;
}
-int QAccessibleMenuItem::indexOfChild( const QAccessibleInterface * child ) const
+int QAccessibleMenuItem::indexOfChild(const QAccessibleInterface * child) const
{
+ Q_ASSERT(child == 0);
if (child->role(0) == PopupMenu && child->object() == m_action->menu())
return 1;
@@ -464,6 +375,18 @@ bool QAccessibleMenuItem::isValid() const
return m_action ? true : false;
}
+QAccessibleInterface *QAccessibleMenuItem::parent() const
+{
+ return QAccessible::queryAccessibleInterface(owner());
+}
+
+QAccessibleInterface *QAccessibleMenuItem::child(int index) const
+{
+ if (index == 0 && action()->menu())
+ return new QAccessibleMenu(action()->menu());
+ return 0;
+}
+
int QAccessibleMenuItem::navigate(RelationFlag relation, int entry, QAccessibleInterface ** target ) const
{
int ret = -1;
@@ -472,32 +395,14 @@ int QAccessibleMenuItem::navigate(RelationFlag relation, int entry, QAccessibleI
return ret;
}
- if (relation == Self || entry == 0) {
- *target = new QAccessibleMenuItem(owner(), action());
- return 0;
- }
-
switch (relation) {
case Child:
- if (entry <= childCount()) {
- *target = new QAccessibleMenu(action()->menu());
- ret = 0;
- }
+ *target = child(entry - 1);
+ ret = *target ? 0 : -1;
break;
-
- case Ancestor:{
- QWidget *parent = owner();
- QAccessibleInterface *ancestor = parent ? QAccessible::queryAccessibleInterface(parent) : 0;
- if (ancestor) {
- if (entry == 1) {
- *target = ancestor;
- ret = 0;
- } else {
- ret = ancestor->navigate(Ancestor, entry - 1, target);
- delete ancestor;
- }
- }
- break;}
+ case Ancestor:
+ *target = parent();
+ return 0;
case Up:
case Down:{
QAccessibleInterface *parent = 0;
@@ -533,36 +438,29 @@ QObject *QAccessibleMenuItem::object() const
return m_action;
}
-QRect QAccessibleMenuItem::rect (int child ) const
+QRect QAccessibleMenuItem::rect(int child) const
{
+ Q_ASSERT(child == 0);
QRect rect;
- if (child == 0) {
- QWidget *own = owner();
+ QWidget *own = owner();
#ifndef QT_NO_MENUBAR
- if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
- rect = menuBar->actionGeometry(m_action);
- QPoint globalPos = menuBar->mapToGlobal(QPoint(0,0));
- rect = rect.translated(globalPos);
- } else
+ if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
+ rect = menuBar->actionGeometry(m_action);
+ QPoint globalPos = menuBar->mapToGlobal(QPoint(0,0));
+ rect = rect.translated(globalPos);
+ } else
#endif // QT_NO_MENUBAR
- if (QMenu *menu = qobject_cast<QMenu*>(own)) {
- rect = menu->actionGeometry(m_action);
- QPoint globalPos = menu->mapToGlobal(QPoint(0,0));
- rect = rect.translated(globalPos);
- }
- } else if (child == 1) {
- QMenu *menu = m_action->menu();
- if (menu) {
- rect = menu->rect();
- QPoint globalPos = menu->mapToGlobal(QPoint(0,0));
- rect = rect.translated(globalPos);
- }
+ if (QMenu *menu = qobject_cast<QMenu*>(own)) {
+ rect = menu->actionGeometry(m_action);
+ QPoint globalPos = menu->mapToGlobal(QPoint(0,0));
+ rect = rect.translated(globalPos);
}
return rect;
}
QAccessible::Relation QAccessibleMenuItem::relationTo ( int child, const QAccessibleInterface * other, int otherChild ) const
{
+ Q_ASSERT(child == 0);
if (other->object() == owner()) {
return Child;
}
@@ -573,81 +471,68 @@ QAccessible::Relation QAccessibleMenuItem::relationTo ( int child, const QAccess
return Unrelated;
}
-QAccessible::Role QAccessibleMenuItem::role(int /*child*/ ) const
+QAccessible::Role QAccessibleMenuItem::role(int child) const
{
- return m_action->isSeparator() ? Separator :MenuItem;
+ Q_ASSERT(child == 0);
+// if (m_action->menu())
+// return PopupMenu;
+ return m_action->isSeparator() ? Separator : MenuItem;
}
void QAccessibleMenuItem::setText ( Text /*t*/, int /*child*/, const QString & /*text */)
{
-
}
-QAccessible::State QAccessibleMenuItem::state(int child ) const
+QAccessible::State QAccessibleMenuItem::state(int child) const
{
- QAccessible::State s = Unavailable;
-
- if (child == 0) {
- s = Normal;
- QWidget *own = owner();
+ Q_ASSERT(child == 0);
+ QAccessible::State s = Normal;
+ QWidget *own = owner();
- if (own->testAttribute(Qt::WA_WState_Visible) == false || m_action->isVisible() == false) {
- s |= Invisible;
- }
+ if (own->testAttribute(Qt::WA_WState_Visible) == false || m_action->isVisible() == false) {
+ s |= Invisible;
+ }
- if (QMenu *menu = qobject_cast<QMenu*>(own)) {
- if (menu->activeAction() == m_action)
- s |= Focused;
+ if (QMenu *menu = qobject_cast<QMenu*>(own)) {
+ if (menu->activeAction() == m_action)
+ s |= Focused;
#ifndef QT_NO_MENUBAR
- } else if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
- if (menuBar->activeAction() == m_action)
- s |= Focused;
+ } else if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(own)) {
+ if (menuBar->activeAction() == m_action)
+ s |= Focused;
#endif
- }
- if (own->style()->styleHint(QStyle::SH_Menu_MouseTracking))
- s |= HotTracked;
- if (m_action->isSeparator() || !m_action->isEnabled())
- s |= Unavailable;
- if (m_action->isChecked())
- s |= Checked;
- } else if (child == 1) {
- QMenu *menu = m_action->menu();
- if (menu) {
- QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(menu);
- s = iface->state(0);
- delete iface;
- }
}
+ if (own->style()->styleHint(QStyle::SH_Menu_MouseTracking))
+ s |= HotTracked;
+ if (m_action->isSeparator() || !m_action->isEnabled())
+ s |= Unavailable;
+ if (m_action->isChecked())
+ s |= Checked;
+
return s;
}
QString QAccessibleMenuItem::text ( Text t, int child ) const
{
+ Q_ASSERT(child == 0);
QString str;
switch (t) {
case Name:
- if (child == 0) {
- str = m_action->text();
- } else if (child == 1) {
- QMenu *m = m_action->menu();
- if (m)
- str = m->title();
- }
+ str = m_action->text();
str = qt_accStripAmp(str);
break;
- case Accelerator:
- if (child == 0) {
+ case Accelerator: {
#ifndef QT_NO_SHORTCUT
- QKeySequence key = m_action->shortcut();
- if (!key.isEmpty()) {
- str = key.toString();
- } else
+ QKeySequence key = m_action->shortcut();
+ if (!key.isEmpty()) {
+ str = key.toString();
+ } else
#endif
- {
- str = qt_accHotKey(m_action->text());
- }
+ {
+ str = qt_accHotKey(m_action->text());
}
break;
+ }
default:
break;
}
@@ -659,7 +544,6 @@ int QAccessibleMenuItem::userActionCount ( int /*child*/ ) const
return 0;
}
-
QAction *QAccessibleMenuItem::action() const
{
return m_action;