| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2013-06-05 14:29:24 +02:00
										 |  |  |     \brief The BaseFileWizardParameters class is a parameter class for | 
					
						
							|  |  |  |     passing parameters to instances of the class Wizard containing name, icon, | 
					
						
							|  |  |  |     and so on. | 
					
						
							| 
									
										
										
										
											2011-04-01 12:18:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \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 | 
					
						
							| 
									
										
										
										
											2013-06-05 14:29:24 +02:00
										 |  |  |     \brief The BaseFileWizard class implements a generic wizard for | 
					
						
							|  |  |  |     creating files. | 
					
						
							| 
									
										
										
										
											2011-04-01 12:18:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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, | 
					
						
							| 
									
										
										
										
											2013-05-23 16:13:55 +02:00
										 |  |  |                                                                   const WizardDialogParameters &wizardDialogParameters) const | 
					
						
							| 
									
										
										
										
											2011-04-01 12:18:25 +02:00
										 |  |  |     \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) { | 
					
						
							| 
									
										
										
										
											2013-05-31 12:52:53 +02:00
										 |  |  |             if (!Core::EditorManager::openEditor(file.path(), file.editorId())) { | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2013-06-05 14:29:24 +02:00
										 |  |  |     \brief The StandardFileWizard class is a convenience class for | 
					
						
							|  |  |  |     creating one file. | 
					
						
							| 
									
										
										
										
											2011-04-01 12:18:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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"
 |