2011-03-15 18:09:50 +01:00

252 lines
12 KiB
C++

/**************************************************************************
**
** This file is part of Qt SDK**
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).*
**
** Contact: Nokia Corporation qt-info@nokia.com**
**
** No Commercial Usage
**
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** 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.
**
** If you are unsure which license is appropriate for your use, please contact
** (qt-info@nokia.com).
**
**************************************************************************/
#include "messageboxhandler.h"
#include <QApplication>
#include <QScriptValue>
#include <QScriptEngine>
#include <QDebug>
#include <QPushButton>
#include <QDialogButtonBox>
QScriptValue QInstaller::registerMessageBox( QScriptEngine* scriptEngine ) {
QScriptValue messageBox = scriptEngine->newQObject(MessageBoxHandler::instance());
// register QMessageBox::StandardButton enum in the script connection
messageBox.setProperty( QLatin1String( "Ok" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Yes ) ) );
messageBox.setProperty( QLatin1String( "Open" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Open ) ) );
messageBox.setProperty( QLatin1String( "Save" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Save ) ) );
messageBox.setProperty( QLatin1String( "Cancel" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Cancel ) ) );
messageBox.setProperty( QLatin1String( "Close" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Close ) ) );
messageBox.setProperty( QLatin1String( "Discard" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Discard ) ) );
messageBox.setProperty( QLatin1String( "Apply" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Apply ) ) );
messageBox.setProperty( QLatin1String( "Reset" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Reset ) ) );
messageBox.setProperty( QLatin1String( "RestoreDefaults" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::RestoreDefaults ) ) );
messageBox.setProperty( QLatin1String( "Help" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Help ) ) );
messageBox.setProperty( QLatin1String( "SaveAll" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::SaveAll ) ) );
messageBox.setProperty( QLatin1String( "Yes" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Yes ) ) );
messageBox.setProperty( QLatin1String( "YesToAll" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::YesToAll ) ) );
messageBox.setProperty( QLatin1String( "No" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::No ) ) );
messageBox.setProperty( QLatin1String( "NoToAll" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::NoToAll ) ) );
messageBox.setProperty( QLatin1String( "Abort" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Abort ) ) );
messageBox.setProperty( QLatin1String( "Retry" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Retry ) ) );
messageBox.setProperty( QLatin1String( "Ignore" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::Ignore ) ) );
messageBox.setProperty( QLatin1String( "NoButton" ), scriptEngine->newVariant( static_cast< int >( QMessageBox::NoButton ) ) );
scriptEngine->globalObject().setProperty( QLatin1String("QMessageBox"), messageBox );
return messageBox;
}
using namespace QInstaller;
MessageBoxHandler *MessageBoxHandler::m_instance = 0;
MessageBoxHandler::MessageBoxHandler(QObject *parent)
: QObject(parent), m_defaultAction( MessageBoxHandler::AskUser )
{
}
MessageBoxHandler::~MessageBoxHandler()
{
}
MessageBoxHandler* MessageBoxHandler::instance()
{
if (m_instance == 0)
m_instance = new MessageBoxHandler(qApp);
return m_instance;
}
void MessageBoxHandler::setAutomaticAnswer(const QString& identifier, QMessageBox::StandardButton answer)
{
m_automaticAnswers.insert( identifier, answer );
}
template <typename T>
static QList<T> reversed( const QList<T>& list ) {
QList<T> res = list;
qCopyBackward( list.begin(), list.end(), res.end() );
return res;
}
void MessageBoxHandler::setDefaultAction(DefaultAction defaultAction)
{
if ( m_defaultAction == defaultAction )
return;
m_defaultAction = defaultAction;
m_buttonOrder.clear();
if ( m_defaultAction != AskUser )
m_buttonOrder << QMessageBox::YesToAll << QMessageBox::Yes << QMessageBox::Ok << QMessageBox::Apply
<< QMessageBox::SaveAll << QMessageBox::Save <<QMessageBox::Retry << QMessageBox::Ignore
<< QMessageBox::Help << QMessageBox::RestoreDefaults << QMessageBox::Reset << QMessageBox::Open
<< QMessageBox::Cancel << QMessageBox::Close << QMessageBox::Abort << QMessageBox::Discard
<< QMessageBox::No << QMessageBox::NoToAll;
if ( m_defaultAction == Reject ) {
//if we want to reject everything, we need the lowest button
//for example if Cancel existing it could use Cancel, but if Close existing
//it will use Close
m_buttonOrder = reversed( m_buttonOrder );
}
}
QMessageBox::StandardButton MessageBoxHandler::autoReply( QMessageBox::StandardButtons buttons ) const {
if ( buttons == QMessageBox::NoButton )
return QMessageBox::NoButton;
foreach (const QMessageBox::StandardButton& currentButton, m_buttonOrder)
if ( (buttons & currentButton) != 0 )
return currentButton;
Q_ASSERT( !"the list must have all possible buttons" );
return QMessageBox::NoButton;
}
QWidget* MessageBoxHandler::currentBestSuitParent()
{
if (QApplication::type() == QApplication::Tty) {
Q_ASSERT_X(false, Q_FUNC_INFO, "We can't find a parent widget if we are a console application.");
return 0;
}
if (qApp->activeModalWidget())
return qApp->activeModalWidget();
return qApp->activeWindow();
}
// taken from Qt
static QMessageBox::StandardButton showNewMessageBox(QWidget *parent, QMessageBox::Icon icon,
const QString& title, const QString& text, QMessageBox::StandardButtons buttons,
QMessageBox::StandardButton defaultButton)
{
QMessageBox msgBox(icon, title, text, QMessageBox::NoButton, parent);
QDialogButtonBox *buttonBox = msgBox.findChild<QDialogButtonBox*>();
Q_ASSERT(buttonBox != 0);
uint mask = QMessageBox::FirstButton;
while (mask <= QMessageBox::LastButton) {
uint sb = buttons & mask;
mask <<= 1;
if (!sb)
continue;
QPushButton *button = msgBox.addButton((QMessageBox::StandardButton)sb);
// Choose the first accept role as the default
if (msgBox.defaultButton())
continue;
if ((defaultButton == QMessageBox::NoButton
&& buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole)
|| (defaultButton != QMessageBox::NoButton && sb == uint(defaultButton))) {
msgBox.setDefaultButton(button);
}
}
#if defined(Q_WS_MAC)
msgBox.setWindowModality(Qt::WindowModal);
#endif
if (msgBox.exec() == -1)
return QMessageBox::Cancel;
return msgBox.standardButton(msgBox.clickedButton());
}
QMessageBox::StandardButton MessageBoxHandler::showMessageBox(MessageType messageType, QWidget* parent, const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button) const
{
if (QApplication::type() == QApplication::Tty)
return button;
if ( m_automaticAnswers.contains( identifier ) )
return m_automaticAnswers.value( identifier );
if ( m_defaultAction == AskUser ) {
if (!identifier.isEmpty())
qDebug() << QString(QLatin1String("create message box with identifier: '%1'")).arg(identifier);
switch( messageType ) {
case criticalType:
return showNewMessageBox( parent, QMessageBox::Critical, title, text, buttons, button );
case informationType:
return showNewMessageBox( parent, QMessageBox::Information, title, text, buttons, button );
case questionType:
return showNewMessageBox( parent, QMessageBox::Question, title, text, buttons, button );
case warningType:
return showNewMessageBox( parent, QMessageBox::Warning, title, text, buttons, button );
}
}
else
return autoReply( buttons );
Q_ASSERT_X(false, Q_FUNC_INFO, "Something went realy wrong.");
return button;
}
QMessageBox::StandardButton MessageBoxHandler::critical(QWidget* parent, const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button)
{
return instance()->showMessageBox(criticalType, parent, identifier, title, text, buttons, button);
}
QMessageBox::StandardButton MessageBoxHandler::information(QWidget* parent, const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button)
{
return instance()->showMessageBox(informationType, parent, identifier, title, text, buttons, button);
}
QMessageBox::StandardButton MessageBoxHandler::question(QWidget* parent, const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button)
{
return instance()->showMessageBox(questionType, parent, identifier, title, text, buttons, button);
}
QMessageBox::StandardButton MessageBoxHandler::warning(QWidget* parent, const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button)
{
return instance()->showMessageBox(warningType, parent, identifier, title, text, buttons, button);
}
int MessageBoxHandler::critical(const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button) const
{
return showMessageBox(criticalType, currentBestSuitParent(), identifier, title, text, buttons, button);
}
int MessageBoxHandler::information(const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button) const
{
return showMessageBox(informationType, currentBestSuitParent(), identifier, title, text, buttons, button);
}
int MessageBoxHandler::question(const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button) const
{
return showMessageBox(questionType, currentBestSuitParent(), identifier, title, text, buttons, button);
}
int MessageBoxHandler::warning(const QString& identifier, const QString& title, const QString& text,
QMessageBox::StandardButtons buttons, QMessageBox::StandardButton button) const
{
return showMessageBox(warningType, currentBestSuitParent(), identifier, title, text, buttons, button);
}