summaryrefslogtreecommitdiffstats
path: root/installerbuilder/libinstaller/messageboxhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'installerbuilder/libinstaller/messageboxhandler.cpp')
-rw-r--r--installerbuilder/libinstaller/messageboxhandler.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/installerbuilder/libinstaller/messageboxhandler.cpp b/installerbuilder/libinstaller/messageboxhandler.cpp
new file mode 100644
index 000000000..2428843cd
--- /dev/null
+++ b/installerbuilder/libinstaller/messageboxhandler.cpp
@@ -0,0 +1,216 @@
+/**************************************************************************
+**
+** 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>
+
+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();
+}
+
+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 QMessageBox::critical( parent, title, text, buttons, button );
+ case informationType:
+ return QMessageBox::information( parent, title, text, buttons, button );
+ case questionType:
+ return QMessageBox::question( parent, title, text, buttons, button );
+ case warningType:
+ return QMessageBox::warning( parent, 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);
+}