2012-10-02 09:12:39 +02:00
|
|
|
/****************************************************************************
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2013-01-28 17:12:19 +01:00
|
|
|
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
2012-10-02 09:12:39 +02:00
|
|
|
** Contact: http://www.qt-project.org/legal
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator.
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Digia. For licensing terms and
|
|
|
|
|
** conditions see http://qt.digia.com/licensing. For further information
|
|
|
|
|
** use the contact form at http://qt.digia.com/contact-us.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** GNU Lesser General Public License Usage
|
2012-10-02 09:12:39 +02:00
|
|
|
** Alternatively, 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, Digia gives you certain additional
|
|
|
|
|
** rights. These rights are described in the Digia Qt LGPL Exception
|
2010-12-17 16:01:08 +01:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
****************************************************************************/
|
2008-12-02 14:09:21 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "basefilewizard.h"
|
2009-01-23 13:03:36 +01:00
|
|
|
#include "icore.h"
|
|
|
|
|
#include "ifilewizardextension.h"
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "mimedatabase.h"
|
2009-01-23 13:03:36 +01:00
|
|
|
#include "editormanager/editormanager.h"
|
2011-04-15 11:27:15 +02:00
|
|
|
#include "dialogs/promptoverwritedialog.h"
|
2009-01-19 12:39:20 +01:00
|
|
|
#include <extensionsystem/pluginmanager.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <utils/filewizarddialog.h>
|
2009-11-26 18:03:16 +01:00
|
|
|
#include <utils/qtcassert.h>
|
2010-06-08 17:33:37 +02:00
|
|
|
#include <utils/stringutils.h>
|
2012-08-23 15:53:58 +02:00
|
|
|
#include <utils/hostosinfo.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QDir>
|
|
|
|
|
#include <QFileInfo>
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QSharedData>
|
|
|
|
|
#include <QEventLoop>
|
|
|
|
|
#include <QScopedPointer>
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QMessageBox>
|
|
|
|
|
#include <QWizard>
|
|
|
|
|
#include <QIcon>
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
enum { debugWizard = 0 };
|
|
|
|
|
|
|
|
|
|
namespace Core {
|
|
|
|
|
|
2011-04-15 11:27:15 +02:00
|
|
|
static int indexOfFile(const GeneratedFiles &f, const QString &path)
|
|
|
|
|
{
|
|
|
|
|
const int size = f.size();
|
|
|
|
|
for (int i = 0; i < size; ++i)
|
|
|
|
|
if (f.at(i).path() == path)
|
|
|
|
|
return i;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
// ------------ BaseFileWizardParameterData
|
2008-12-02 14:09:21 +01:00
|
|
|
class BaseFileWizardParameterData : public QSharedData
|
|
|
|
|
{
|
2008-12-02 12:01:29 +01:00
|
|
|
public:
|
2010-01-14 14:14:39 +01:00
|
|
|
explicit BaseFileWizardParameterData(IWizard::WizardKind kind = IWizard::FileWizard);
|
2010-03-12 11:20:32 +01:00
|
|
|
void clear();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-01-14 14:14:39 +01:00
|
|
|
IWizard::WizardKind kind;
|
2008-12-02 12:01:29 +01:00
|
|
|
QIcon icon;
|
|
|
|
|
QString description;
|
2010-01-07 18:17:24 +01:00
|
|
|
QString displayName;
|
2009-11-27 10:33:24 +01:00
|
|
|
QString id;
|
2008-12-02 12:01:29 +01:00
|
|
|
QString category;
|
2010-01-07 18:17:24 +01:00
|
|
|
QString displayCategory;
|
2012-01-18 13:50:14 +01:00
|
|
|
Core::FeatureSet requiredFeatures;
|
2012-02-08 17:25:35 +01:00
|
|
|
Core::IWizard::WizardFlags flags;
|
2012-02-10 15:40:53 +01:00
|
|
|
QString descriptionImage;
|
2008-12-02 12:01:29 +01:00
|
|
|
};
|
|
|
|
|
|
2010-01-14 14:14:39 +01:00
|
|
|
BaseFileWizardParameterData::BaseFileWizardParameterData(IWizard::WizardKind k) :
|
2008-12-02 12:01:29 +01:00
|
|
|
kind(k)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-12 11:20:32 +01:00
|
|
|
void BaseFileWizardParameterData::clear()
|
|
|
|
|
{
|
|
|
|
|
kind = IWizard::FileWizard;
|
|
|
|
|
icon = QIcon();
|
|
|
|
|
description.clear();
|
|
|
|
|
displayName.clear();
|
|
|
|
|
id.clear();
|
|
|
|
|
category.clear();
|
|
|
|
|
displayCategory.clear();
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\class Core::BaseFileWizardParameters
|
|
|
|
|
\brief Parameter class for passing parameters to instances of class Wizard
|
|
|
|
|
containing name, icon and such.
|
|
|
|
|
|
|
|
|
|
\sa Core::GeneratedFile, Core::BaseFileWizard, Core::StandardFileWizard
|
|
|
|
|
\sa Core::Internal::WizardEventLoop
|
|
|
|
|
*/
|
|
|
|
|
|
2010-01-14 14:14:39 +01:00
|
|
|
BaseFileWizardParameters::BaseFileWizardParameters(IWizard::WizardKind kind) :
|
2008-12-02 12:01:29 +01:00
|
|
|
m_d(new BaseFileWizardParameterData(kind))
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BaseFileWizardParameters::BaseFileWizardParameters(const BaseFileWizardParameters &rhs) :
|
|
|
|
|
m_d(rhs.m_d)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BaseFileWizardParameters &BaseFileWizardParameters::operator=(const BaseFileWizardParameters &rhs)
|
|
|
|
|
{
|
|
|
|
|
if (this != &rhs)
|
|
|
|
|
m_d.operator=(rhs.m_d);
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BaseFileWizardParameters::~BaseFileWizardParameters()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-12 11:20:32 +01:00
|
|
|
void BaseFileWizardParameters::clear()
|
|
|
|
|
{
|
|
|
|
|
m_d->clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CORE_EXPORT QDebug operator<<(QDebug d, const BaseFileWizardParameters &p)
|
|
|
|
|
{
|
|
|
|
|
d.nospace() << "Kind: " << p.kind() << " Id: " << p.id()
|
|
|
|
|
<< " Category: " << p.category()
|
|
|
|
|
<< " DisplayName: " << p.displayName()
|
|
|
|
|
<< " Description: " << p.description()
|
2012-01-18 13:50:14 +01:00
|
|
|
<< " DisplayCategory: " << p.displayCategory()
|
|
|
|
|
<< " Required Features: " << p.requiredFeatures().toStringList();
|
2010-03-12 11:20:32 +01:00
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-14 14:14:39 +01:00
|
|
|
IWizard::WizardKind BaseFileWizardParameters::kind() const
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
|
return m_d->kind;
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-14 14:14:39 +01:00
|
|
|
void BaseFileWizardParameters::setKind(IWizard::WizardKind k)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
|
m_d->kind = k;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QIcon BaseFileWizardParameters::icon() const
|
|
|
|
|
{
|
|
|
|
|
return m_d->icon;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseFileWizardParameters::setIcon(const QIcon &icon)
|
|
|
|
|
{
|
|
|
|
|
m_d->icon = icon;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString BaseFileWizardParameters::description() const
|
|
|
|
|
{
|
|
|
|
|
return m_d->description;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseFileWizardParameters::setDescription(const QString &v)
|
|
|
|
|
{
|
|
|
|
|
m_d->description = v;
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
QString BaseFileWizardParameters::displayName() const
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2010-01-07 18:17:24 +01:00
|
|
|
return m_d->displayName;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
void BaseFileWizardParameters::setDisplayName(const QString &v)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2010-01-07 18:17:24 +01:00
|
|
|
m_d->displayName = v;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2009-11-27 10:33:24 +01:00
|
|
|
QString BaseFileWizardParameters::id() const
|
|
|
|
|
{
|
|
|
|
|
return m_d->id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseFileWizardParameters::setId(const QString &v)
|
|
|
|
|
{
|
|
|
|
|
m_d->id = v;
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
QString BaseFileWizardParameters::category() const
|
|
|
|
|
{
|
|
|
|
|
return m_d->category;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseFileWizardParameters::setCategory(const QString &v)
|
|
|
|
|
{
|
|
|
|
|
m_d->category = v;
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
QString BaseFileWizardParameters::displayCategory() const
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2010-01-07 18:17:24 +01:00
|
|
|
return m_d->displayCategory;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2012-01-18 13:50:14 +01:00
|
|
|
Core::FeatureSet BaseFileWizardParameters::requiredFeatures() const
|
|
|
|
|
{
|
|
|
|
|
return m_d->requiredFeatures;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseFileWizardParameters::setRequiredFeatures(Core::FeatureSet features)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
m_d->requiredFeatures = features;
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
void BaseFileWizardParameters::setDisplayCategory(const QString &v)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2010-01-07 18:17:24 +01:00
|
|
|
m_d->displayCategory = v;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2012-02-08 17:25:35 +01:00
|
|
|
Core::IWizard::WizardFlags BaseFileWizardParameters::flags() const
|
|
|
|
|
{
|
|
|
|
|
return m_d->flags;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseFileWizardParameters::setFlags(Core::IWizard::WizardFlags flags)
|
|
|
|
|
{
|
|
|
|
|
m_d->flags = flags;
|
|
|
|
|
}
|
2012-02-10 15:40:53 +01:00
|
|
|
|
|
|
|
|
QString BaseFileWizardParameters::descriptionImage() const
|
|
|
|
|
{
|
|
|
|
|
return m_d->descriptionImage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseFileWizardParameters::setDescriptionImage(const QString &path)
|
|
|
|
|
{
|
|
|
|
|
m_d->descriptionImage = path;
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\class Core::Internal::WizardEventLoop
|
|
|
|
|
\brief Special event loop that runs a QWizard and terminates if the page changes.
|
|
|
|
|
|
|
|
|
|
Use by Core::BaseFileWizard to intercept the change from the standard wizard pages
|
|
|
|
|
to the extension pages (as the latter require the list of Core::GeneratedFile generated).
|
|
|
|
|
|
|
|
|
|
Synopsis:
|
|
|
|
|
\code
|
2008-12-02 12:01:29 +01:00
|
|
|
Wizard wizard(parent);
|
|
|
|
|
WizardEventLoop::WizardResult wr;
|
|
|
|
|
do {
|
|
|
|
|
wr = WizardEventLoop::execWizardPage(wizard);
|
|
|
|
|
} while (wr == WizardEventLoop::PageChanged);
|
2011-04-01 12:18:25 +02:00
|
|
|
\endcode
|
|
|
|
|
|
|
|
|
|
\sa Core::GeneratedFile, Core::BaseFileWizardParameters, Core::BaseFileWizard, Core::StandardFileWizard
|
|
|
|
|
*/
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
class WizardEventLoop : public QEventLoop
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
WizardEventLoop(QObject *parent);
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
enum WizardResult { Accepted, Rejected , PageChanged };
|
|
|
|
|
|
|
|
|
|
static WizardResult execWizardPage(QWizard &w);
|
|
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
void pageChanged(int);
|
|
|
|
|
void accepted();
|
|
|
|
|
void rejected();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
WizardResult execWizardPageI();
|
|
|
|
|
|
|
|
|
|
WizardResult m_result;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
WizardEventLoop::WizardEventLoop(QObject *parent) :
|
|
|
|
|
QEventLoop(parent),
|
|
|
|
|
m_result(Rejected)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WizardEventLoop::WizardResult WizardEventLoop::execWizardPage(QWizard &wizard)
|
|
|
|
|
{
|
|
|
|
|
/* Install ourselves on the wizard. Main trick is here to connect
|
|
|
|
|
* to the page changed signal and quit() on it. */
|
|
|
|
|
WizardEventLoop *eventLoop = wizard.findChild<WizardEventLoop *>();
|
|
|
|
|
if (!eventLoop) {
|
|
|
|
|
eventLoop = new WizardEventLoop(&wizard);
|
|
|
|
|
connect(&wizard, SIGNAL(currentIdChanged(int)), eventLoop, SLOT(pageChanged(int)));
|
|
|
|
|
connect(&wizard, SIGNAL(accepted()), eventLoop, SLOT(accepted()));
|
|
|
|
|
connect(&wizard, SIGNAL(rejected()), eventLoop, SLOT(rejected()));
|
|
|
|
|
wizard.setAttribute(Qt::WA_ShowModal, true);
|
|
|
|
|
wizard.show();
|
|
|
|
|
}
|
|
|
|
|
const WizardResult result = eventLoop->execWizardPageI();
|
|
|
|
|
// Quitting?
|
|
|
|
|
if (result != PageChanged)
|
|
|
|
|
delete eventLoop;
|
|
|
|
|
if (debugWizard)
|
|
|
|
|
qDebug() << "WizardEventLoop::runWizard" << wizard.pageIds() << " returns " << result;
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WizardEventLoop::WizardResult WizardEventLoop::execWizardPageI()
|
|
|
|
|
{
|
|
|
|
|
m_result = Rejected;
|
|
|
|
|
exec(QEventLoop::DialogExec);
|
|
|
|
|
return m_result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WizardEventLoop::pageChanged(int /*page*/)
|
|
|
|
|
{
|
|
|
|
|
m_result = PageChanged;
|
|
|
|
|
quit(); // !
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WizardEventLoop::accepted()
|
|
|
|
|
{
|
|
|
|
|
m_result = Accepted;
|
|
|
|
|
quit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WizardEventLoop::rejected()
|
|
|
|
|
{
|
|
|
|
|
m_result = Rejected;
|
|
|
|
|
quit();
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\class Core::BaseFileWizard
|
|
|
|
|
\brief A generic wizard for creating files.
|
|
|
|
|
|
|
|
|
|
The abstract methods:
|
|
|
|
|
\list
|
2013-02-06 08:50:23 +01:00
|
|
|
\li createWizardDialog(): Called to create the QWizard dialog to be shown
|
|
|
|
|
\li generateFiles(): Generate file content
|
2011-04-01 12:18:25 +02:00
|
|
|
\endlist
|
|
|
|
|
|
|
|
|
|
must be implemented.
|
|
|
|
|
The behaviour can be further customized by overwriting the virtual method \c postGenerateFiles(),
|
|
|
|
|
which is called after generating the files.
|
|
|
|
|
|
|
|
|
|
\sa Core::GeneratedFile, Core::BaseFileWizardParameters, Core::StandardFileWizard
|
|
|
|
|
\sa Core::Internal::WizardEventLoop
|
|
|
|
|
*/
|
|
|
|
|
|
2008-12-02 14:09:21 +01:00
|
|
|
struct BaseFileWizardPrivate
|
|
|
|
|
{
|
2009-01-20 15:31:33 +01:00
|
|
|
explicit BaseFileWizardPrivate(const Core::BaseFileWizardParameters ¶meters)
|
|
|
|
|
: m_parameters(parameters), m_wizardDialog(0)
|
|
|
|
|
{}
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
const Core::BaseFileWizardParameters m_parameters;
|
|
|
|
|
QWizard *m_wizardDialog;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// ---------------- Wizard
|
|
|
|
|
BaseFileWizard::BaseFileWizard(const BaseFileWizardParameters ¶meters,
|
|
|
|
|
QObject *parent) :
|
|
|
|
|
IWizard(parent),
|
2011-09-15 13:42:38 +02:00
|
|
|
d(new BaseFileWizardPrivate(parameters))
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2012-01-18 13:50:14 +01:00
|
|
|
BaseFileWizardParameters BaseFileWizard::baseFileWizardParameters() const
|
|
|
|
|
{
|
|
|
|
|
return d->m_parameters;
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
BaseFileWizard::~BaseFileWizard()
|
|
|
|
|
{
|
2011-09-15 13:42:38 +02:00
|
|
|
delete d;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2010-01-14 14:14:39 +01:00
|
|
|
IWizard::WizardKind BaseFileWizard::kind() const
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2011-09-15 13:42:38 +02:00
|
|
|
return d->m_parameters.kind();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QIcon BaseFileWizard::icon() const
|
|
|
|
|
{
|
2011-09-15 13:42:38 +02:00
|
|
|
return d->m_parameters.icon();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString BaseFileWizard::description() const
|
|
|
|
|
{
|
2011-09-15 13:42:38 +02:00
|
|
|
return d->m_parameters.description();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
QString BaseFileWizard::displayName() const
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2011-09-15 13:42:38 +02:00
|
|
|
return d->m_parameters.displayName();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2009-11-27 10:33:24 +01:00
|
|
|
QString BaseFileWizard::id() const
|
|
|
|
|
{
|
2011-09-15 13:42:38 +02:00
|
|
|
return d->m_parameters.id();
|
2009-11-27 10:33:24 +01:00
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
QString BaseFileWizard::category() const
|
|
|
|
|
{
|
2011-09-15 13:42:38 +02:00
|
|
|
return d->m_parameters.category();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
QString BaseFileWizard::displayCategory() const
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2011-09-15 13:42:38 +02:00
|
|
|
return d->m_parameters.displayCategory();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2012-02-10 15:40:53 +01:00
|
|
|
QString BaseFileWizard::descriptionImage() const
|
|
|
|
|
{
|
|
|
|
|
return d->m_parameters.descriptionImage();
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-02 14:55:56 +02:00
|
|
|
void BaseFileWizard::runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &extraValues)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2010-09-16 17:09:36 +02:00
|
|
|
QTC_ASSERT(!path.isEmpty(), return);
|
2009-11-26 18:03:16 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
typedef QList<IFileWizardExtension*> ExtensionList;
|
|
|
|
|
|
|
|
|
|
QString errorMessage;
|
|
|
|
|
// Compile extension pages, purge out unused ones
|
2012-06-18 11:34:15 +02:00
|
|
|
ExtensionList extensions = ExtensionSystem::PluginManager::getObjects<IFileWizardExtension>();
|
2008-12-02 12:01:29 +01:00
|
|
|
WizardPageList allExtensionPages;
|
|
|
|
|
for (ExtensionList::iterator it = extensions.begin(); it != extensions.end(); ) {
|
|
|
|
|
const WizardPageList extensionPages = (*it)->extensionPages(this);
|
|
|
|
|
if (extensionPages.empty()) {
|
|
|
|
|
it = extensions.erase(it);
|
|
|
|
|
} else {
|
|
|
|
|
allExtensionPages += extensionPages;
|
|
|
|
|
++it;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (debugWizard)
|
|
|
|
|
qDebug() << Q_FUNC_INFO << path << parent << "exs" << extensions.size() << allExtensionPages.size();
|
|
|
|
|
|
|
|
|
|
QWizardPage *firstExtensionPage = 0;
|
|
|
|
|
if (!allExtensionPages.empty())
|
|
|
|
|
firstExtensionPage = allExtensionPages.front();
|
|
|
|
|
|
|
|
|
|
// Create dialog and run it. Ensure that the dialog is deleted when
|
|
|
|
|
// leaving the func, but not before the IFileWizardExtension::process
|
|
|
|
|
// has been called
|
2012-03-19 16:12:51 +01:00
|
|
|
|
|
|
|
|
WizardDialogParameters::DialogParameterFlags dialogParameterFlags;
|
|
|
|
|
|
|
|
|
|
if (flags().testFlag(ForceCapitalLetterForFileName))
|
|
|
|
|
dialogParameterFlags |= WizardDialogParameters::ForceCapitalLetterForFileName;
|
|
|
|
|
|
2012-02-08 17:25:35 +01:00
|
|
|
const QScopedPointer<QWizard> wizard(createWizardDialog(parent, WizardDialogParameters(path,
|
|
|
|
|
allExtensionPages,
|
|
|
|
|
platform,
|
2012-03-19 16:12:51 +01:00
|
|
|
requiredFeatures(),
|
2012-05-14 18:55:30 +02:00
|
|
|
dialogParameterFlags,
|
|
|
|
|
extraValues)));
|
2010-09-16 17:09:36 +02:00
|
|
|
QTC_ASSERT(!wizard.isNull(), return);
|
2010-09-07 10:07:30 +02:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
GeneratedFiles files;
|
|
|
|
|
// Run the wizard: Call generate files on switching to the first extension
|
|
|
|
|
// page is OR after 'Accepted' if there are no extension pages
|
|
|
|
|
while (true) {
|
|
|
|
|
const WizardEventLoop::WizardResult wr = WizardEventLoop::execWizardPage(*wizard);
|
|
|
|
|
if (wr == WizardEventLoop::Rejected) {
|
|
|
|
|
files.clear();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
const bool accepted = wr == WizardEventLoop::Accepted;
|
|
|
|
|
const bool firstExtensionPageHit = wr == WizardEventLoop::PageChanged
|
|
|
|
|
&& wizard->page(wizard->currentId()) == firstExtensionPage;
|
|
|
|
|
const bool needGenerateFiles = firstExtensionPageHit || (accepted && allExtensionPages.empty());
|
|
|
|
|
if (needGenerateFiles) {
|
|
|
|
|
QString errorMessage;
|
|
|
|
|
files = generateFiles(wizard.data(), &errorMessage);
|
|
|
|
|
if (files.empty()) {
|
|
|
|
|
QMessageBox::critical(0, tr("File Generation Failure"), errorMessage);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (firstExtensionPageHit)
|
2008-12-09 11:07:24 +01:00
|
|
|
foreach (IFileWizardExtension *ex, extensions)
|
2012-04-02 14:55:56 +02:00
|
|
|
ex->firstExtensionPageShown(files, extraValues);
|
2008-12-02 12:01:29 +01:00
|
|
|
if (accepted)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (files.empty())
|
2010-09-16 17:09:36 +02:00
|
|
|
return;
|
2008-12-02 12:01:29 +01:00
|
|
|
// Compile result list and prompt for overwrite
|
2011-04-15 11:27:15 +02:00
|
|
|
switch (promptOverwrite(&files, &errorMessage)) {
|
2008-12-02 12:01:29 +01:00
|
|
|
case OverwriteCanceled:
|
2010-09-16 17:09:36 +02:00
|
|
|
return;
|
2008-12-02 12:01:29 +01:00
|
|
|
case OverwriteError:
|
|
|
|
|
QMessageBox::critical(0, tr("Existing files"), errorMessage);
|
2010-09-16 17:09:36 +02:00
|
|
|
return;
|
2008-12-02 12:01:29 +01:00
|
|
|
case OverwriteOk:
|
|
|
|
|
break;
|
|
|
|
|
}
|
2011-08-05 09:59:28 +02:00
|
|
|
|
|
|
|
|
foreach (IFileWizardExtension *ex, extensions) {
|
|
|
|
|
for (int i = 0; i < files.count(); i++) {
|
|
|
|
|
ex->applyCodeStyle(&files[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
// Write
|
2010-09-01 13:27:24 +02:00
|
|
|
if (!writeFiles(files, &errorMessage)) {
|
|
|
|
|
QMessageBox::critical(parent, tr("File Generation Failure"), errorMessage);
|
2010-09-16 17:09:36 +02:00
|
|
|
return;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
2010-09-01 13:27:24 +02:00
|
|
|
|
2010-08-26 18:33:16 +02:00
|
|
|
bool removeOpenProjectAttribute = false;
|
2008-12-02 12:01:29 +01:00
|
|
|
// Run the extensions
|
2010-08-26 18:33:16 +02:00
|
|
|
foreach (IFileWizardExtension *ex, extensions) {
|
|
|
|
|
bool remove;
|
2011-08-05 09:59:28 +02:00
|
|
|
if (!ex->processFiles(files, &remove, &errorMessage)) {
|
2013-03-17 16:09:01 +01:00
|
|
|
if (!errorMessage.isEmpty())
|
|
|
|
|
QMessageBox::critical(parent, tr("File Generation Failure"), errorMessage);
|
2010-09-16 17:09:36 +02:00
|
|
|
return;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
2010-08-26 18:33:16 +02:00
|
|
|
removeOpenProjectAttribute |= remove;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (removeOpenProjectAttribute) {
|
|
|
|
|
for (int i = 0; i < files.count(); i++) {
|
|
|
|
|
if (files[i].attributes() & Core::GeneratedFile::OpenProjectAttribute)
|
|
|
|
|
files[i].setAttributes(Core::GeneratedFile::OpenEditorAttribute);
|
|
|
|
|
}
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
// Post generation handler
|
2010-09-16 17:09:36 +02:00
|
|
|
if (!postGenerateFiles(wizard.data(), files, &errorMessage))
|
2012-10-10 15:26:13 +02:00
|
|
|
if (!errorMessage.isEmpty())
|
|
|
|
|
QMessageBox::critical(0, tr("File Generation Failure"), errorMessage);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2012-01-18 13:50:14 +01:00
|
|
|
|
|
|
|
|
Core::FeatureSet BaseFileWizard::requiredFeatures() const
|
|
|
|
|
{
|
|
|
|
|
return d->m_parameters.requiredFeatures();
|
|
|
|
|
}
|
|
|
|
|
|
2012-02-08 17:25:35 +01:00
|
|
|
Core::IWizard::WizardFlags BaseFileWizard::flags() const
|
|
|
|
|
{
|
|
|
|
|
return d->m_parameters.flags();
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\fn virtual QWizard *Core::BaseFileWizard::createWizardDialog(QWidget *parent,
|
|
|
|
|
const QString &defaultPath,
|
|
|
|
|
const WizardPageList &extensionPages) const = 0
|
|
|
|
|
\brief Implement to create the wizard dialog on the parent, adding the extension pages.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn virtual Core::GeneratedFiles Core::BaseFileWizard::generateFiles(const QWizard *w,
|
|
|
|
|
QString *errorMessage) const = 0
|
|
|
|
|
\brief Overwrite to query the parameters from the dialog and generate the files.
|
|
|
|
|
|
|
|
|
|
Note: This does not generate physical files, but merely the list of Core::GeneratedFile.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\brief Physically write files.
|
|
|
|
|
|
|
|
|
|
Re-implement (calling the base implementation) to create files with CustomGeneratorAttribute set.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-09-01 13:27:24 +02:00
|
|
|
bool BaseFileWizard::writeFiles(const GeneratedFiles &files, QString *errorMessage)
|
|
|
|
|
{
|
2011-04-15 11:27:15 +02:00
|
|
|
const GeneratedFile::Attributes noWriteAttributes
|
|
|
|
|
= GeneratedFile::CustomGeneratorAttribute|GeneratedFile::KeepExistingFileAttribute;
|
2010-09-01 13:27:24 +02:00
|
|
|
foreach (const GeneratedFile &generatedFile, files)
|
2011-04-15 11:27:15 +02:00
|
|
|
if (!(generatedFile.attributes() & noWriteAttributes ))
|
2010-09-01 13:27:24 +02:00
|
|
|
if (!generatedFile.write(errorMessage))
|
|
|
|
|
return false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Sets some standard options on a QWizard
|
|
|
|
|
*/
|
2010-09-01 13:27:24 +02:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
void BaseFileWizard::setupWizard(QWizard *w)
|
|
|
|
|
{
|
2008-12-03 16:34:33 +01:00
|
|
|
w->setOption(QWizard::NoCancelButton, false);
|
|
|
|
|
w->setOption(QWizard::NoDefaultButton, false);
|
2009-05-29 13:43:34 +02:00
|
|
|
w->setOption(QWizard::NoBackButtonOnStartPage, true);
|
2011-04-15 11:43:09 +02:00
|
|
|
w->setWindowFlags(w->windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
2011-09-22 18:02:43 +02:00
|
|
|
|
2012-08-23 15:53:58 +02:00
|
|
|
if (Utils::HostOsInfo::isMacHost()) {
|
|
|
|
|
w->setButtonLayout(QList<QWizard::WizardButton>()
|
|
|
|
|
<< QWizard::CancelButton
|
|
|
|
|
<< QWizard::Stretch
|
|
|
|
|
<< QWizard::BackButton
|
|
|
|
|
<< QWizard::NextButton
|
|
|
|
|
<< QWizard::CommitButton
|
|
|
|
|
<< QWizard::FinishButton);
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Read "shortTitle" dynamic property of the pageId and apply it as the title
|
|
|
|
|
of corresponding progress item
|
|
|
|
|
*/
|
|
|
|
|
|
2010-03-31 14:48:08 +02:00
|
|
|
void BaseFileWizard::applyExtensionPageShortTitle(Utils::Wizard *wizard, int pageId)
|
|
|
|
|
{
|
|
|
|
|
if (pageId < 0)
|
|
|
|
|
return;
|
|
|
|
|
QWizardPage *p = wizard->page(pageId);
|
|
|
|
|
if (!p)
|
|
|
|
|
return;
|
|
|
|
|
Utils::WizardProgressItem *item = wizard->wizardProgress()->item(pageId);
|
|
|
|
|
if (!item)
|
|
|
|
|
return;
|
|
|
|
|
const QString shortTitle = p->property("shortTitle").toString();
|
|
|
|
|
if (!shortTitle.isEmpty())
|
|
|
|
|
item->setTitle(shortTitle);
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Overwrite to perform steps to be done after files are actually created.
|
|
|
|
|
|
|
|
|
|
The default implementation opens editors with the newly generated files.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-04-16 15:55:32 +02:00
|
|
|
bool BaseFileWizard::postGenerateFiles(const QWizard *, const GeneratedFiles &l, QString *errorMessage)
|
|
|
|
|
{
|
|
|
|
|
return BaseFileWizard::postGenerateOpenEditors(l, errorMessage);
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Utility to open the editors for the files whose attribute is set accordingly.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-04-16 15:55:32 +02:00
|
|
|
bool BaseFileWizard::postGenerateOpenEditors(const GeneratedFiles &l, QString *errorMessage)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2012-11-28 20:44:03 +02:00
|
|
|
foreach (const Core::GeneratedFile &file, l) {
|
2010-04-16 15:55:32 +02:00
|
|
|
if (file.attributes() & Core::GeneratedFile::OpenEditorAttribute) {
|
2012-05-08 09:43:14 +02:00
|
|
|
if (!Core::EditorManager::openEditor(file.path(), file.editorId(), Core::EditorManager::ModeSwitch )) {
|
2010-04-16 15:55:32 +02:00
|
|
|
if (errorMessage)
|
2010-09-30 16:50:59 +02:00
|
|
|
*errorMessage = tr("Failed to open an editor for '%1'.").arg(QDir::toNativeSeparators(file.path()));
|
2010-04-16 15:55:32 +02:00
|
|
|
return false;
|
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Utility that performs an overwrite check on a set of files. It checks if
|
|
|
|
|
the file exists, can be overwritten at all and prompts the user with a summary.
|
|
|
|
|
*/
|
|
|
|
|
|
2011-04-15 11:27:15 +02:00
|
|
|
BaseFileWizard::OverwriteResult BaseFileWizard::promptOverwrite(GeneratedFiles *files,
|
2008-12-02 12:01:29 +01:00
|
|
|
QString *errorMessage) const
|
|
|
|
|
{
|
|
|
|
|
if (debugWizard)
|
2010-06-08 17:33:37 +02:00
|
|
|
qDebug() << Q_FUNC_INFO << files;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-06-08 17:33:37 +02:00
|
|
|
QStringList existingFiles;
|
2008-12-02 12:01:29 +01:00
|
|
|
bool oddStuffFound = false;
|
|
|
|
|
|
|
|
|
|
static const QString readOnlyMsg = tr(" [read only]");
|
2011-04-15 11:27:15 +02:00
|
|
|
static const QString directoryMsg = tr(" [folder]");
|
2008-12-02 12:01:29 +01:00
|
|
|
static const QString symLinkMsg = tr(" [symbolic link]");
|
|
|
|
|
|
2011-04-15 11:27:15 +02:00
|
|
|
foreach (const GeneratedFile &file, *files) {
|
|
|
|
|
const QFileInfo fi(file.path());
|
2010-06-08 17:33:37 +02:00
|
|
|
if (fi.exists())
|
2011-04-15 11:27:15 +02:00
|
|
|
existingFiles.append(file.path());
|
2010-06-08 17:33:37 +02:00
|
|
|
}
|
2011-04-15 11:27:15 +02:00
|
|
|
if (existingFiles.isEmpty())
|
|
|
|
|
return OverwriteOk;
|
|
|
|
|
// Before prompting to overwrite existing files, loop over files and check
|
|
|
|
|
// if there is anything blocking overwriting them (like them being links or folders).
|
|
|
|
|
// Format a file list message as ( "<file1> [readonly], <file2> [folder]").
|
2010-06-08 17:33:37 +02:00
|
|
|
const QString commonExistingPath = Utils::commonPath(existingFiles);
|
2008-12-02 12:01:29 +01:00
|
|
|
QString fileNamesMsgPart;
|
2010-06-08 17:33:37 +02:00
|
|
|
foreach (const QString &fileName, existingFiles) {
|
2008-12-02 12:01:29 +01:00
|
|
|
const QFileInfo fi(fileName);
|
|
|
|
|
if (fi.exists()) {
|
|
|
|
|
if (!fileNamesMsgPart.isEmpty())
|
|
|
|
|
fileNamesMsgPart += QLatin1String(", ");
|
2010-09-30 16:50:59 +02:00
|
|
|
fileNamesMsgPart += QDir::toNativeSeparators(fileName.mid(commonExistingPath.size() + 1));
|
2008-12-02 12:01:29 +01:00
|
|
|
do {
|
|
|
|
|
if (fi.isDir()) {
|
|
|
|
|
oddStuffFound = true;
|
|
|
|
|
fileNamesMsgPart += directoryMsg;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (fi.isSymLink()) {
|
|
|
|
|
oddStuffFound = true;
|
|
|
|
|
fileNamesMsgPart += symLinkMsg;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!fi.isWritable()) {
|
|
|
|
|
oddStuffFound = true;
|
|
|
|
|
fileNamesMsgPart += readOnlyMsg;
|
|
|
|
|
}
|
|
|
|
|
} while (false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (oddStuffFound) {
|
2010-09-30 16:50:59 +02:00
|
|
|
*errorMessage = tr("The project directory %1 contains files which cannot be overwritten:\n%2.")
|
|
|
|
|
.arg(QDir::toNativeSeparators(commonExistingPath)).arg(fileNamesMsgPart);
|
2008-12-02 12:01:29 +01:00
|
|
|
return OverwriteError;
|
|
|
|
|
}
|
2011-04-15 11:27:15 +02:00
|
|
|
// Prompt to overwrite existing files.
|
|
|
|
|
Internal::PromptOverwriteDialog overwriteDialog;
|
|
|
|
|
// Scripts cannot handle overwrite
|
|
|
|
|
overwriteDialog.setFiles(existingFiles);
|
|
|
|
|
foreach (const GeneratedFile &file, *files)
|
|
|
|
|
if (file.attributes() & GeneratedFile::CustomGeneratorAttribute)
|
|
|
|
|
overwriteDialog.setFileEnabled(file.path(), false);
|
|
|
|
|
if (overwriteDialog.exec() != QDialog::Accepted)
|
|
|
|
|
return OverwriteCanceled;
|
|
|
|
|
const QStringList existingFilesToKeep = overwriteDialog.uncheckedFiles();
|
|
|
|
|
if (existingFilesToKeep.size() == files->size()) // All exist & all unchecked->Cancel.
|
|
|
|
|
return OverwriteCanceled;
|
|
|
|
|
// Set 'keep' attribute in files
|
|
|
|
|
foreach (const QString &keepFile, existingFilesToKeep) {
|
|
|
|
|
const int i = indexOfFile(*files, keepFile);
|
2012-04-17 08:01:25 +02:00
|
|
|
QTC_ASSERT(i != -1, return OverwriteCanceled);
|
2011-04-15 11:27:15 +02:00
|
|
|
GeneratedFile &file = (*files)[i];
|
|
|
|
|
file.setAttributes(file.attributes() | GeneratedFile::KeepExistingFileAttribute);
|
|
|
|
|
}
|
|
|
|
|
return OverwriteOk;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Build a file name, adding the extension unless baseName already has one.
|
|
|
|
|
*/
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
QString BaseFileWizard::buildFileName(const QString &path,
|
|
|
|
|
const QString &baseName,
|
|
|
|
|
const QString &extension)
|
|
|
|
|
{
|
|
|
|
|
QString rc = path;
|
|
|
|
|
if (!rc.isEmpty() && !rc.endsWith(QDir::separator()))
|
|
|
|
|
rc += QDir::separator();
|
|
|
|
|
rc += baseName;
|
|
|
|
|
// Add extension unless user specified something else
|
|
|
|
|
const QChar dot = QLatin1Char('.');
|
|
|
|
|
if (!extension.isEmpty() && !baseName.contains(dot)) {
|
|
|
|
|
if (!extension.startsWith(dot))
|
|
|
|
|
rc += dot;
|
|
|
|
|
rc += extension;
|
|
|
|
|
}
|
|
|
|
|
if (debugWizard)
|
|
|
|
|
qDebug() << Q_FUNC_INFO << rc;
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Utility that returns the preferred suffix for a mime type
|
|
|
|
|
*/
|
|
|
|
|
|
2009-12-16 14:19:34 +01:00
|
|
|
QString BaseFileWizard::preferredSuffix(const QString &mimeType)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2012-01-24 15:36:40 +01:00
|
|
|
const QString rc = Core::ICore::mimeDatabase()->preferredSuffixByType(mimeType);
|
2008-12-02 12:01:29 +01:00
|
|
|
if (rc.isEmpty())
|
|
|
|
|
qWarning("%s: WARNING: Unable to find a preferred suffix for %s.",
|
|
|
|
|
Q_FUNC_INFO, mimeType.toUtf8().constData());
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\class Core::StandardFileWizard
|
|
|
|
|
\brief Convenience class for creating one file.
|
|
|
|
|
|
|
|
|
|
It uses Utils::FileWizardDialog and introduces a new virtual to generate the
|
|
|
|
|
files from path and name.
|
|
|
|
|
|
|
|
|
|
\sa Core::GeneratedFile, Core::BaseFileWizardParameters, Core::BaseFileWizard
|
|
|
|
|
\sa Core::Internal::WizardEventLoop
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\fn Core::GeneratedFiles Core::StandardFileWizard::generateFilesFromPath(const QString &path,
|
|
|
|
|
const QString &name,
|
|
|
|
|
QString *errorMessage) const = 0
|
|
|
|
|
\brief Newly introduced virtual that creates the files under the path.
|
|
|
|
|
*/
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
StandardFileWizard::StandardFileWizard(const BaseFileWizardParameters ¶meters,
|
|
|
|
|
QObject *parent) :
|
2009-01-20 15:31:33 +01:00
|
|
|
BaseFileWizard(parameters, parent)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Implemented to create a Utils::FileWizardDialog.
|
|
|
|
|
*/
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
QWizard *StandardFileWizard::createWizardDialog(QWidget *parent,
|
2012-02-03 18:00:08 +01:00
|
|
|
const WizardDialogParameters &wizardDialogParameters) const
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2009-10-05 11:06:05 +02:00
|
|
|
Utils::FileWizardDialog *standardWizardDialog = new Utils::FileWizardDialog(parent);
|
2012-03-19 16:12:51 +01:00
|
|
|
if (wizardDialogParameters.flags().testFlag(WizardDialogParameters::ForceCapitalLetterForFileName))
|
|
|
|
|
standardWizardDialog->setForceFirstCapitalLetterForFileName(true);
|
2010-01-07 18:17:24 +01:00
|
|
|
standardWizardDialog->setWindowTitle(tr("New %1").arg(displayName()));
|
2008-12-02 12:01:29 +01:00
|
|
|
setupWizard(standardWizardDialog);
|
2012-02-03 18:00:08 +01:00
|
|
|
standardWizardDialog->setPath(wizardDialogParameters.defaultPath());
|
|
|
|
|
foreach (QWizardPage *p, wizardDialogParameters.extensionPages())
|
2010-03-31 14:48:08 +02:00
|
|
|
BaseFileWizard::applyExtensionPageShortTitle(standardWizardDialog, standardWizardDialog->addPage(p));
|
2008-12-02 12:01:29 +01:00
|
|
|
return standardWizardDialog;
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 12:18:25 +02:00
|
|
|
/*!
|
|
|
|
|
\brief Implemented to retrieve path and name and call generateFilesFromPath()
|
|
|
|
|
*/
|
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
GeneratedFiles StandardFileWizard::generateFiles(const QWizard *w,
|
|
|
|
|
QString *errorMessage) const
|
|
|
|
|
{
|
2009-10-05 11:06:05 +02:00
|
|
|
const Utils::FileWizardDialog *standardWizardDialog = qobject_cast<const Utils::FileWizardDialog *>(w);
|
2008-12-02 12:01:29 +01:00
|
|
|
return generateFilesFromPath(standardWizardDialog->path(),
|
2010-01-07 18:17:24 +01:00
|
|
|
standardWizardDialog->fileName(),
|
2008-12-02 12:01:29 +01:00
|
|
|
errorMessage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Core
|
2008-12-02 14:09:21 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "basefilewizard.moc"
|