/**************************************************************************** | |
** | |
** 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 |