blob: 7baf05f29752dcaf1b9a4bdfbef7675cdb6f537e [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "q3complexwidgets.h"
#include <q3header.h>
#include <private/q3titlebar_p.h>
#include <qapplication.h>
QT_BEGIN_NAMESPACE
Q3AccessibleHeader::Q3AccessibleHeader(QWidget *w)
: QAccessibleWidget(w)
{
Q_ASSERT(header());
addControllingSignal(QLatin1String("clicked(int)"));
}
/*! Returns the Q3Header. */
Q3Header *Q3AccessibleHeader::header() const
{
return qobject_cast<Q3Header*>(object());
}
/*! \reimp */
QRect Q3AccessibleHeader::rect(int child) const
{
QPoint zero = header()->mapToGlobal(QPoint(0, 0));
QRect sect = header()->sectionRect(child - 1);
return QRect(sect.x() + zero.x(), sect.y() + zero.y(), sect.width(), sect.height());
}
/*! \reimp */
int Q3AccessibleHeader::childCount() const
{
return header()->count();
}
/*! \reimp */
QString Q3AccessibleHeader::text(Text t, int child) const
{
QString str;
if (child <= childCount()) {
switch (t) {
case Name:
str = header()->label(child - 1);
break;
case Description: {
QAccessibleEvent event(QEvent::AccessibilityDescription, child);
if (QApplication::sendEvent(widget(), &event))
str = event.value();
break; }
case Help: {
QAccessibleEvent event(QEvent::AccessibilityHelp, child);
if (QApplication::sendEvent(widget(), &event))
str = event.value();
break; }
default:
break;
}
}
if (str.isEmpty())
str = QAccessibleWidget::text(t, child);;
return str;
}
/*! \reimp */
QAccessible::Role Q3AccessibleHeader::role(int) const
{
return (header()->orientation() == Qt::Horizontal) ? ColumnHeader : RowHeader;
}
/*! \reimp */
QAccessible::State Q3AccessibleHeader::state(int child) const
{
State state = QAccessibleWidget::state(child);
int section = child ? child - 1 : -1;
if (!header()->isClickEnabled(section))
state |= Unavailable;
else
state |= Selectable;
if (child && section == header()->sortIndicatorSection())
state |= Selected;
if (header()->isResizeEnabled(section))
state |= Sizeable;
if (child && header()->isMovingEnabled())
state |= Movable;
return state;
}
/*!
\class Q3AccessibleTitleBar
\brief The Q3AccessibleTitleBar class implements the QAccessibleInterface for title bars.
\internal
\ingroup accessibility
*/
/*!
Constructs a Q3AccessibleTitleBar object for \a w.
*/
Q3AccessibleTitleBar::Q3AccessibleTitleBar(QWidget *w)
: QAccessibleWidget(w, TitleBar)
{
Q_ASSERT(titleBar());
}
/*!
Returns the title bar.
*/
Q3TitleBar *Q3AccessibleTitleBar::titleBar() const
{
return qobject_cast<Q3TitleBar*>(object());
}
/*! \reimp */
QRect Q3AccessibleTitleBar::rect(int child) const
{
if (!child)
return QAccessibleWidget::rect(child);
QStyle::SubControl sc;
switch (child) {
case 1:
sc = QStyle::SC_TitleBarSysMenu;
break;
case 2:
sc = QStyle::SC_TitleBarLabel;
break;
case 3:
sc = QStyle::SC_TitleBarMinButton;
break;
case 4:
sc = QStyle::SC_TitleBarMaxButton;
break;
case 5:
sc = QStyle::SC_TitleBarCloseButton;
break;
default:
sc = QStyle::SC_None;
break;
}
QRect r;
if (sc != QStyle::SC_None) {
QStyleOptionTitleBar option;
r = titleBar()->style()->subControlRect(QStyle::CC_TitleBar, &option, sc, titleBar());
}
QPoint tp = titleBar()->mapToGlobal(QPoint(0,0));
return QRect(tp.x() + r.x(), tp.y() + r.y(), r.width(), r.height());
}
/* \reimp
int Q3AccessibleTitleBar::navigate(NavDirection direction, int startControl) const
{
if (direction != NavFirstChild && direction != NavLastChild && direction != NavFocusChild && !startControl)
return QAccessibleWidget::navigate(direction, startControl);
switch (direction) {
case NavFirstChild:
return 1;
break;
case NavLastChild:
return childCount();
break;
case NavNext:
case NavRight:
return startControl + 1 > childCount() ? -1 : startControl + 1;
case NavPrevious:
case NavLeft:
return startControl -1 < 1 ? -1 : startControl - 1;
default:
break;
}
return -1;
}
*/
/*! \reimp */
int Q3AccessibleTitleBar::childCount() const
{
if (!(titleBar()->windowFlags() & Qt::WStyle_SysMenu))
return 0;
int control = 3;
if (!(titleBar()->windowFlags() & Qt::WStyle_Minimize))
++control;
if (!(titleBar()->windowFlags() & Qt::WStyle_Maximize))
++control;
return control;
}
/*! \reimp */
QString Q3AccessibleTitleBar::text(Text t, int child) const
{
QString str = QAccessibleWidget::text(t, child);
if (str.size())
return str;
QWidget *window = titleBar()->window();
switch (t) {
case Name:
switch (child) {
case 1:
return Q3TitleBar::tr("System");
case 3:
if (window && window->isMinimized())
return Q3TitleBar::tr("Restore up");
return Q3TitleBar::tr("Minimize");
case 4:
if (window && window->isMaximized())
return Q3TitleBar::tr("Restore down");
return Q3TitleBar::tr("Maximize");
case 5:
return Q3TitleBar::tr("Close");
default:
break;
}
break;
case Value:
if (!child || child == 2)
return window ? window->windowTitle() : QString();
break;
/*
case DefaultAction:
if (child > 2)
return Q3TitleBar::tr("Press");
break;
*/
case Description:
switch (child) {
case 1:
return Q3TitleBar::tr("Contains commands to manipulate the window");
case 3:
if (window && window->isMinimized())
return Q3TitleBar::tr("Puts a minimized window back to normal");
return Q3TitleBar::tr("Moves the window out of the way");
case 4:
if (window && window->isMaximized())
return Q3TitleBar::tr("Puts a maximized window back to normal");
return Q3TitleBar::tr("Makes the window full screen");
case 5:
return Q3TitleBar::tr("Closes the window");
default:
return Q3TitleBar::tr("Displays the name of the window and contains controls to manipulate it");
}
default:
break;
}
return str;
}
/*! \reimp */
QAccessible::Role Q3AccessibleTitleBar::role(int child) const
{
switch (child)
{
case 1:
case 3:
case 4:
case 5:
return PushButton;
default:
return TitleBar;
}
}
/*! \reimp */
QAccessible::State Q3AccessibleTitleBar::state(int child) const
{
return QAccessibleWidget::state(child);
}
/*! \reimp */
bool Q3AccessibleTitleBar::doAction(int, int child, const QVariantList &)
{
switch (child) {
case 3:
if (titleBar()->window()->isMinimized())
titleBar()->window()->showNormal();
else
titleBar()->window()->showMinimized();
return true;
case 4:
if (titleBar()->window()->isMaximized())
titleBar()->window()->showNormal();
else
titleBar()->window()->showMaximized();
return true;
case 5:
titleBar()->window()->close();
return true;
default:
break;
}
return false;
}
QT_END_NAMESPACE