diff options
Diffstat (limited to 'src/plugins/coreplugin/basefilewizard.cpp')
-rw-r--r-- | src/plugins/coreplugin/basefilewizard.cpp | 136 |
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 |