summaryrefslogtreecommitdiff
path: root/src/plugins/coreplugin/basefilewizard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/coreplugin/basefilewizard.cpp')
-rw-r--r--src/plugins/coreplugin/basefilewizard.cpp136
1 files changed, 133 insertions, 3 deletions
diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp
index d65503436a..9fbf83b7e8 100644
--- a/src/plugins/coreplugin/basefilewizard.cpp
+++ b/src/plugins/coreplugin/basefilewizard.cpp
@@ -30,6 +30,136 @@
#include "basefilewizard.h"
-Core::BaseFileWizard::BaseFileWizard(QWidget *parent) :
- Utils::Wizard(parent)
-{ }
+#include "basefilewizardfactory.h"
+#include "ifilewizardextension.h"
+
+#include <extensionsystem/pluginmanager.h>
+
+#include <QMessageBox>
+
+using namespace Utils;
+
+namespace Core {
+
+BaseFileWizard::BaseFileWizard(const BaseFileWizardFactory *factory,
+ const QVariantMap &extraValues,
+ QWidget *parent) :
+ Wizard(parent),
+ m_extraValues(extraValues),
+ m_factory(factory)
+{
+ // Compile extension pages, purge out unused ones
+ QList<IFileWizardExtension *> extensionList
+ = ExtensionSystem::PluginManager::getObjects<IFileWizardExtension>();
+
+ for (auto it = extensionList.begin(); it != extensionList.end(); ) {
+ const QList<QWizardPage *> extensionPages = (*it)->extensionPages(factory);
+ if (extensionPages.empty()) {
+ it = extensionList.erase(it);
+ } else {
+ m_extensionPages += extensionPages;
+ ++it;
+ }
+ }
+
+ if (!m_extensionPages.empty())
+ m_firstExtensionPage = m_extensionPages.front();
+}
+
+void BaseFileWizard::initializePage(int id)
+{
+ if (page(id) == m_firstExtensionPage) {
+ generateFileList();
+
+ QList<IFileWizardExtension *> extensionList
+ = ExtensionSystem::PluginManager::getObjects<IFileWizardExtension>();
+ foreach (IFileWizardExtension *ex, extensionList)
+ ex->firstExtensionPageShown(m_files, m_extraValues);
+ }
+}
+
+QList<QWizardPage *> BaseFileWizard::extensionPages()
+{
+ return m_extensionPages;
+}
+
+void BaseFileWizard::accept()
+{
+ if (m_files.isEmpty())
+ generateFileList();
+
+ QString errorMessage;
+
+ // Compile result list and prompt for overwrite
+ switch (m_factory->promptOverwrite(&m_files, &errorMessage)) {
+ case BaseFileWizardFactory::OverwriteCanceled:
+ reject();
+ return;
+ case BaseFileWizardFactory::OverwriteError:
+ QMessageBox::critical(0, tr("Existing files"), errorMessage);
+ reject();
+ return;
+ case BaseFileWizardFactory::OverwriteOk:
+ break;
+ }
+
+ QList<IFileWizardExtension *> extensionList
+ = ExtensionSystem::PluginManager::getObjects<IFileWizardExtension>();
+ foreach (IFileWizardExtension *ex, extensionList) {
+ for (int i = 0; i < m_files.count(); i++) {
+ ex->applyCodeStyle(&m_files[i]);
+ }
+ }
+
+ // Write
+ if (!m_factory->writeFiles(m_files, &errorMessage)) {
+ QMessageBox::critical(parentWidget(), tr("File Generation Failure"), errorMessage);
+ reject();
+ return;
+ }
+
+ bool removeOpenProjectAttribute = false;
+ // Run the extensions
+ foreach (IFileWizardExtension *ex, extensionList) {
+ bool remove;
+ if (!ex->processFiles(m_files, &remove, &errorMessage)) {
+ if (!errorMessage.isEmpty())
+ QMessageBox::critical(parentWidget(), tr("File Generation Failure"), errorMessage);
+ reject();
+ return;
+ }
+ removeOpenProjectAttribute |= remove;
+ }
+
+ if (removeOpenProjectAttribute) {
+ for (int i = 0; i < m_files.count(); i++) {
+ if (m_files[i].attributes() & GeneratedFile::OpenProjectAttribute)
+ m_files[i].setAttributes(GeneratedFile::OpenEditorAttribute);
+ }
+ }
+
+ // Post generation handler
+ if (!m_factory->postGenerateFiles(this, m_files, &errorMessage))
+ if (!errorMessage.isEmpty())
+ QMessageBox::critical(0, tr("File Generation Failure"), errorMessage);
+
+ Wizard::accept();
+}
+
+void BaseFileWizard::reject()
+{
+ m_files.clear();
+ Wizard::reject();
+}
+
+void BaseFileWizard::generateFileList()
+{
+ QString errorMessage;
+ m_files = m_factory->generateFiles(this, &errorMessage);
+ if (m_files.empty()) {
+ QMessageBox::critical(parentWidget(), tr("File Generation Failure"), errorMessage);
+ reject();
+ }
+}
+
+} // namespace Core