From 9f14b79cc609c878023b3d00bca0a6c8ce24283f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Fri, 17 Jul 2009 17:19:23 +0200 Subject: [PATCH] Add a clone wizard for version control (base classes + git/svn). Task-number: 244831 --- src/plugins/git/clonewizard.cpp | 91 +++++++++++ src/plugins/git/clonewizard.h | 58 +++++++ src/plugins/git/clonewizardpage.cpp | 83 ++++++++++ src/plugins/git/clonewizardpage.h | 56 +++++++ src/plugins/git/git.pro | 8 +- src/plugins/git/gitclient.cpp | 44 +++-- src/plugins/git/gitclient.h | 3 + src/plugins/git/gitcommand.cpp | 29 +--- src/plugins/git/gitcommand.h | 8 +- src/plugins/git/gitplugin.cpp | 75 +++------ src/plugins/git/gitplugin.h | 8 +- src/plugins/subversion/checkoutwizard.cpp | 88 ++++++++++ src/plugins/subversion/checkoutwizard.h | 58 +++++++ src/plugins/subversion/checkoutwizardpage.cpp | 60 +++++++ src/plugins/subversion/checkoutwizardpage.h | 49 ++++++ src/plugins/subversion/checkoutwizardpage.ui | 84 ++++++++++ src/plugins/subversion/subversion.pro | 11 +- src/plugins/subversion/subversionplugin.cpp | 3 + src/plugins/vcsbase/basecheckoutwizard.cpp | 150 ++++++++++++++++++ src/plugins/vcsbase/basecheckoutwizard.h | 92 +++++++++++ .../vcsbase/basecheckoutwizardpage.cpp | 139 ++++++++++++++++ src/plugins/vcsbase/basecheckoutwizardpage.h | 87 ++++++++++ src/plugins/vcsbase/basecheckoutwizardpage.ui | 77 +++++++++ src/plugins/vcsbase/checkoutjobs.cpp | 137 ++++++++++++++++ src/plugins/vcsbase/checkoutjobs.h | 95 +++++++++++ .../vcsbase/checkoutprogresswizardpage.cpp | 118 ++++++++++++++ .../vcsbase/checkoutprogresswizardpage.h | 84 ++++++++++ .../vcsbase/checkoutprogresswizardpage.ui | 25 +++ src/plugins/vcsbase/checkoutwizarddialog.cpp | 93 +++++++++++ src/plugins/vcsbase/checkoutwizarddialog.h | 69 ++++++++ src/plugins/vcsbase/vcsbase.pro | 18 ++- src/plugins/vcsbase/vcsbaseconstants.h | 2 + 32 files changed, 1890 insertions(+), 112 deletions(-) create mode 100644 src/plugins/git/clonewizard.cpp create mode 100644 src/plugins/git/clonewizard.h create mode 100644 src/plugins/git/clonewizardpage.cpp create mode 100644 src/plugins/git/clonewizardpage.h create mode 100644 src/plugins/subversion/checkoutwizard.cpp create mode 100644 src/plugins/subversion/checkoutwizard.h create mode 100644 src/plugins/subversion/checkoutwizardpage.cpp create mode 100644 src/plugins/subversion/checkoutwizardpage.h create mode 100644 src/plugins/subversion/checkoutwizardpage.ui create mode 100644 src/plugins/vcsbase/basecheckoutwizard.cpp create mode 100644 src/plugins/vcsbase/basecheckoutwizard.h create mode 100644 src/plugins/vcsbase/basecheckoutwizardpage.cpp create mode 100644 src/plugins/vcsbase/basecheckoutwizardpage.h create mode 100644 src/plugins/vcsbase/basecheckoutwizardpage.ui create mode 100644 src/plugins/vcsbase/checkoutjobs.cpp create mode 100644 src/plugins/vcsbase/checkoutjobs.h create mode 100644 src/plugins/vcsbase/checkoutprogresswizardpage.cpp create mode 100644 src/plugins/vcsbase/checkoutprogresswizardpage.h create mode 100644 src/plugins/vcsbase/checkoutprogresswizardpage.ui create mode 100644 src/plugins/vcsbase/checkoutwizarddialog.cpp create mode 100644 src/plugins/vcsbase/checkoutwizarddialog.h diff --git a/src/plugins/git/clonewizard.cpp b/src/plugins/git/clonewizard.cpp new file mode 100644 index 00000000000..252534ec4be --- /dev/null +++ b/src/plugins/git/clonewizard.cpp @@ -0,0 +1,91 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "clonewizard.h" +#include "clonewizardpage.h" +#include "gitplugin.h" +#include "gitclient.h" + +#include <vcsbase/checkoutjobs.h> +#include <utils/qtcassert.h> + +#include <QtGui/QIcon> + +namespace Git { +namespace Internal { + +CloneWizard::CloneWizard(QObject *parent) : + VCSBase::BaseCheckoutWizard(parent) +{ +} + +QIcon CloneWizard::icon() const +{ + return QIcon(); +} + +QString CloneWizard::description() const +{ + return tr("Clones a project from a git repository."); +} + +QString CloneWizard::name() const +{ + return tr("Git Checkout"); +} + +QWizardPage *CloneWizard::createParameterPage(const QString &path) +{ + CloneWizardPage *cwp = new CloneWizardPage; + cwp->setPath(path); + return cwp; +} + +QSharedPointer<VCSBase::AbstractCheckoutJob> CloneWizard::createJob(const QWizardPage *parameterPage, + QString *checkoutPath) +{ + // Collect parameters for the clone command. + const CloneWizardPage *cwp = qobject_cast<const CloneWizardPage *>(parameterPage); + QTC_ASSERT(cwp, return QSharedPointer<VCSBase::AbstractCheckoutJob>()) + const GitClient *client = GitPlugin::instance()->gitClient(); + QStringList args = client->binary(); + const QString workingDirectory = cwp->path(); + const QString directory = cwp->directory(); + *checkoutPath = workingDirectory + QLatin1Char('/') + directory; + args << QLatin1String("clone") << cwp->repository() << directory; + const QString binary = args.front(); + args.pop_front(); + + VCSBase::AbstractCheckoutJob *job = new VCSBase::ProcessCheckoutJob(binary, args, workingDirectory, + client->processEnvironment()); + return QSharedPointer<VCSBase::AbstractCheckoutJob>(job); +} + +} // namespace Internal +} // namespace Git diff --git a/src/plugins/git/clonewizard.h b/src/plugins/git/clonewizard.h new file mode 100644 index 00000000000..2a1c0ff3b55 --- /dev/null +++ b/src/plugins/git/clonewizard.h @@ -0,0 +1,58 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef CLONEWIZARD_H +#define CLONEWIZARD_H + +#include <vcsbase/basecheckoutwizard.h> + +namespace Git { +namespace Internal { + +class CloneWizard : public VCSBase::BaseCheckoutWizard +{ +public: + explicit CloneWizard(QObject *parent = 0); + + // IWizard + virtual QIcon icon() const; + virtual QString description() const; + virtual QString name() const; + +protected: + // BaseCheckoutWizard + virtual QWizardPage *createParameterPage(const QString &path); + virtual QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QWizardPage *parameterPage, + QString *checkoutPath); +}; + +} // namespace Internal +} // namespace Git + +#endif // CLONEWIZARD_H diff --git a/src/plugins/git/clonewizardpage.cpp b/src/plugins/git/clonewizardpage.cpp new file mode 100644 index 00000000000..6f78ab278f5 --- /dev/null +++ b/src/plugins/git/clonewizardpage.cpp @@ -0,0 +1,83 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "clonewizardpage.h" + +namespace Git { +namespace Internal { + +CloneWizardPage::CloneWizardPage(QWidget *parent) : + VCSBase::BaseCheckoutWizardPage(parent), + m_mainLinePostfix(QLatin1String("/mainline.git")), + m_gitPostFix(QLatin1String(".git")), + m_protocolDelimiter(QLatin1String("://")) +{ + setSubTitle(tr("Specify repository URL, checkout directory and path.")); + setRepositoryLabel(tr("Clone URL:")); +} + +QString CloneWizardPage::directoryFromRepository(const QString &urlIn) const +{ + /* Try to figure out a good directory name from something like: + * 'user@host:qt/qt.git', 'http://host/qt/qt.git' 'local repo' + * ------> 'qt' . */ + + QString url = urlIn.trimmed(); + const QChar slash = QLatin1Char('/'); + // remove host + const int protocolDelimiterPos = url.indexOf(m_protocolDelimiter); // "://" + const int startRepoSearchPos = protocolDelimiterPos == -1 ? 0 : protocolDelimiterPos + m_protocolDelimiter.size(); + int repoPos = url.indexOf(QLatin1Char(':'), startRepoSearchPos); + if (repoPos == -1) + repoPos = url.indexOf(slash, startRepoSearchPos); + if (repoPos != -1) + url.remove(0, repoPos + 1); + // Remove postfixes + if (url.endsWith(m_mainLinePostfix)) { + url.truncate(url.size() - m_mainLinePostfix.size()); + } else { + if (url.endsWith(m_gitPostFix)) { + url.truncate(url.size() - m_gitPostFix.size()); + } + } + // Check for equal parts, something like "qt/qt" -> "qt" + const int slashPos = url.indexOf(slash); + if (slashPos != -1 && slashPos == (url.size() - 1) / 2) { + if (url.leftRef(slashPos) == url.rightRef(slashPos)) + url.truncate(slashPos); + } + // fix invalid characters + const QChar dash = QLatin1Char('-'); + url.replace(slash, dash); + url.replace(QLatin1Char('.'), dash); + return url; +} + +} // namespace Internal +} // namespace Git diff --git a/src/plugins/git/clonewizardpage.h b/src/plugins/git/clonewizardpage.h new file mode 100644 index 00000000000..4d8797e6f0f --- /dev/null +++ b/src/plugins/git/clonewizardpage.h @@ -0,0 +1,56 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef CLONEWIZARDPAGE_H +#define CLONEWIZARDPAGE_H + +#include <vcsbase/basecheckoutwizardpage.h> + +namespace Git { +namespace Internal { + +class CloneWizardPage : public VCSBase::BaseCheckoutWizardPage +{ + Q_OBJECT +public: + CloneWizardPage(QWidget *parent = 0); + +protected: + virtual QString directoryFromRepository(const QString &r) const; + +private: + const QString m_mainLinePostfix; + const QString m_gitPostFix; + const QString m_protocolDelimiter; +}; + +} // namespace Internal +} // namespace Git +#endif // CLONEWIZARDPAGE_H + diff --git a/src/plugins/git/git.pro b/src/plugins/git/git.pro index 8b9a6171e88..618b7810b4e 100644 --- a/src/plugins/git/git.pro +++ b/src/plugins/git/git.pro @@ -21,7 +21,9 @@ HEADERS += gitplugin.h \ gitsettings.h \ branchdialog.h \ branchmodel.h \ - gitcommand.h + gitcommand.h \ + clonewizard.h \ + clonewizardpage.h SOURCES += gitplugin.cpp \ gitoutputwindow.cpp \ gitclient.cpp \ @@ -36,7 +38,9 @@ SOURCES += gitplugin.cpp \ gitsettings.cpp \ branchdialog.cpp \ branchmodel.cpp \ - gitcommand.cpp + gitcommand.cpp \ + clonewizard.cpp \ + clonewizardpage.cpp FORMS += changeselectiondialog.ui \ settingspage.ui \ gitsubmitpanel.ui \ diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 0486522fd1e..6b900a5d8f5 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -480,11 +480,7 @@ GitCommand *GitClient::createCommand(const QString &workingDirectory, GitOutputWindow *outputWindow = m_plugin->outputWindow(); - ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment(); - if (m_settings.adoptPath) - environment.set(QLatin1String("PATH"), m_settings.path); - - GitCommand* command = new GitCommand(m_binaryPath, workingDirectory, environment); + GitCommand* command = new GitCommand(binary(), workingDirectory, processEnvironment()); if (outputToWindow) { if (!editor) { // assume that the commands output is the important thing connect(command, SIGNAL(outputData(QByteArray)), this, SLOT(appendDataAndPopup(QByteArray))); @@ -527,6 +523,26 @@ void GitClient::appendAndPopup(const QString &text) m_plugin->outputWindow()->popup(false); } +// Return fixed arguments required to run +QStringList GitClient::binary() const +{ +#ifdef Q_OS_WIN + QStringList args; + args << QLatin1String("cmd.exe") << QLatin1String("/c") << m_binaryPath; + return args; +#else + return QStringList(m_binaryPath); +#endif +} + +QStringList GitClient::processEnvironment() const +{ + ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment(); + if (m_settings.adoptPath) + environment.set(QLatin1String("PATH"), m_settings.path); + return environment.toStringList(); +} + bool GitClient::synchronousGit(const QString &workingDirectory, const QStringList &arguments, QByteArray* outputText, @@ -541,19 +557,13 @@ bool GitClient::synchronousGit(const QString &workingDirectory, QProcess process; process.setWorkingDirectory(workingDirectory); + process.setEnvironment(processEnvironment()); - ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment(); - if (m_settings.adoptPath) - environment.set(QLatin1String("PATH"), m_settings.path); - process.setEnvironment(environment.toStringList()); - -#ifdef Q_OS_WIN - QStringList args; - args << "/c" << m_binaryPath << arguments; - process.start(QLatin1String("cmd.exe"), args); -#else - process.start(m_binaryPath, arguments); -#endif + QStringList args = binary(); + const QString executable = args.front(); + args.pop_front(); + args.append(arguments); + process.start(executable, arguments); process.closeWriteChannel(); if (!process.waitForFinished()) { diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index ce65fd77865..cfe14269671 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -135,6 +135,9 @@ public: GitSettings settings() const; void setSettings(const GitSettings &s); + QStringList binary() const; // Executable + basic arguments + QStringList processEnvironment() const; + static QString msgNoChangedFiles(); static const char *noColorOption; diff --git a/src/plugins/git/gitcommand.cpp b/src/plugins/git/gitcommand.cpp index 7e16fc3864e..6374328633d 100644 --- a/src/plugins/git/gitcommand.cpp +++ b/src/plugins/git/gitcommand.cpp @@ -44,15 +44,6 @@ namespace Git { namespace Internal { -// Convert environment to list, default to system one. -static inline QStringList environmentToList(const ProjectExplorer::Environment &environment) -{ - const QStringList list = environment.toStringList(); - if (!list.empty()) - return list; - return ProjectExplorer::Environment::systemEnvironment().toStringList(); -} - static QString msgTermination(int exitCode, const QString &binaryPath, const QStringList &args) { QString cmd = QFileInfo(binaryPath).baseName(); @@ -71,14 +62,16 @@ GitCommand::Job::Job(const QStringList &a, int t) : { } -GitCommand::GitCommand(const QString &binaryPath, - const QString &workingDirectory, - ProjectExplorer::Environment &environment) : - m_binaryPath(binaryPath), +GitCommand::GitCommand(const QStringList &binary, + const QString &workingDirectory, + const QStringList &environment) : + m_binaryPath(binary.front()), + m_basicArguments(binary), m_workingDirectory(workingDirectory), - m_environment(environmentToList(environment)), + m_environment(environment), m_reportTerminationMode(NoReport) { + m_basicArguments.pop_front(); } GitCommand::TerminationReportMode GitCommand::reportTerminationMode() const @@ -132,13 +125,7 @@ void GitCommand::run() if (Git::Constants::debug) qDebug() << "GitCommand::run" << j << '/' << count << m_jobs.at(j).arguments; -#ifdef Q_OS_WIN - QStringList args; - args << "/c" << m_binaryPath << m_jobs.at(j).arguments; - process.start(QLatin1String("cmd.exe"), args); -#else - process.start(m_binaryPath, m_jobs.at(j).arguments); -#endif + process.start(m_binaryPath, m_basicArguments + m_jobs.at(j).arguments); if(!process.waitForStarted()) { ok = false; error += QString::fromLatin1("Error: \"%1\" could not be started: %2").arg(m_binaryPath, process.errorString()); diff --git a/src/plugins/git/gitcommand.h b/src/plugins/git/gitcommand.h index a9c95bd6634..e589789b39b 100644 --- a/src/plugins/git/gitcommand.h +++ b/src/plugins/git/gitcommand.h @@ -30,9 +30,8 @@ #ifndef GITCOMMAND_H #define GITCOMMAND_H -#include <projectexplorer/environment.h> - #include <QtCore/QObject> +#include <QtCore/QStringList> namespace Git { namespace Internal { @@ -47,9 +46,9 @@ public: ReportStdout, // This assumes UTF8 ReportStderr }; - explicit GitCommand(const QString &binaryPath, + explicit GitCommand(const QStringList &binary, const QString &workingDirectory, - ProjectExplorer::Environment &environment); + const QStringList &environment); void addJob(const QStringList &arguments, int timeout); @@ -79,6 +78,7 @@ private: }; const QString m_binaryPath; + QStringList m_basicArguments; const QString m_workingDirectory; const QStringList m_environment; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 90f19261940..8359329819a 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -37,6 +37,7 @@ #include "gitsubmiteditor.h" #include "gitversioncontrol.h" #include "branchdialog.h" +#include "clonewizard.h" #include <coreplugin/icore.h> #include <coreplugin/coreconstants.h> @@ -139,10 +140,6 @@ GitPlugin::GitPlugin() : m_gitClient(0), m_outputWindow(0), m_changeSelectionDialog(0), - m_settingsPage(0), - m_coreListener(0), - m_submitEditorFactory(0), - m_versionControl(0), m_changeTmpFile(0), m_submitActionTriggered(false) { @@ -151,42 +148,6 @@ GitPlugin::GitPlugin() : GitPlugin::~GitPlugin() { - if (m_outputWindow) { - removeObject(m_outputWindow); - delete m_outputWindow; - m_outputWindow = 0; - } - - if (m_settingsPage) { - removeObject(m_settingsPage); - delete m_settingsPage; - m_settingsPage = 0; - } - - if (!m_editorFactories.empty()) { - foreach (Core::IEditorFactory* pf, m_editorFactories) - removeObject(pf); - qDeleteAll(m_editorFactories); - } - - if (m_coreListener) { - removeObject(m_coreListener); - delete m_coreListener; - m_coreListener = 0; - } - - if (m_submitEditorFactory) { - removeObject(m_submitEditorFactory); - delete m_submitEditorFactory; - m_submitEditorFactory = 0; - } - - if (m_versionControl) { - removeObject(m_versionControl); - delete m_versionControl; - m_versionControl = 0; - } - cleanChangeTmpFile(); delete m_gitClient; m_instance = 0; @@ -231,33 +192,30 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) m_core = Core::ICore::instance(); m_gitClient = new GitClient(this); - // Create the globalcontext list to register actions accordingly + // Create the globalco6664324b12a3339d18251df1cd69a1da06d1e2dcntext list to register actions accordingly QList<int> globalcontext; globalcontext << m_core->uniqueIDManager()->uniqueIdentifier(Core::Constants::C_GLOBAL); // Create the output Window m_outputWindow = new GitOutputWindow(); - addObject(m_outputWindow); + addAutoReleasedObject(m_outputWindow); // Create the settings Page - m_settingsPage = new SettingsPage(); - addObject(m_settingsPage); + addAutoReleasedObject(new SettingsPage()); static const char *describeSlot = SLOT(show(QString,QString)); const int editorCount = sizeof(editorParameters)/sizeof(VCSBase::VCSBaseEditorParameters); - for (int i = 0; i < editorCount; i++) { - m_editorFactories.push_back(new GitEditorFactory(editorParameters + i, m_gitClient, describeSlot)); - addObject(m_editorFactories.back()); - } + for (int i = 0; i < editorCount; i++) + addAutoReleasedObject(new GitEditorFactory(editorParameters + i, m_gitClient, describeSlot)); - m_coreListener = new CoreListener(this); - addObject(m_coreListener); + addAutoReleasedObject(new CoreListener(this)); - m_submitEditorFactory = new GitSubmitEditorFactory(&submitParameters); - addObject(m_submitEditorFactory); + addAutoReleasedObject(new GitSubmitEditorFactory(&submitParameters)); - m_versionControl = new GitVersionControl(m_gitClient); - addObject(m_versionControl); + GitVersionControl *versionControl = new GitVersionControl(m_gitClient); + addAutoReleasedObject(versionControl); + + addAutoReleasedObject(new CloneWizard); //register actions Core::ActionManager *actionManager = m_core->actionManager(); @@ -270,8 +228,8 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) gitContainer->menu()->setTitle(tr("&Git")); toolsContainer->addMenu(gitContainer); if (QAction *ma = gitContainer->menu()->menuAction()) { - ma->setEnabled(m_versionControl->isEnabled()); - connect(m_versionControl, SIGNAL(enabledChanged(bool)), ma, SLOT(setVisible(bool))); + ma->setEnabled(versionControl->isEnabled()); + connect(versionControl, SIGNAL(enabledChanged(bool)), ma, SLOT(setVisible(bool))); } Core::Command *command; @@ -888,4 +846,9 @@ void GitPlugin::setSettings(const GitSettings &s) m_gitClient->setSettings(s); } +GitClient *GitPlugin::gitClient() const +{ + return m_gitClient; +} + Q_EXPORT_PLUGIN(GitPlugin) diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h index d5c935a5558..d473697cd91 100644 --- a/src/plugins/git/gitplugin.h +++ b/src/plugins/git/gitplugin.h @@ -96,10 +96,11 @@ public: GitOutputWindow *outputWindow() const; - GitSettings settings() const; void setSettings(const GitSettings &s); + GitClient *gitClient() const; + public slots: void updateActions(); bool editorAboutToClose(Core::IEditor *editor); @@ -166,11 +167,6 @@ private: GitClient *m_gitClient; GitOutputWindow *m_outputWindow; ChangeSelectionDialog *m_changeSelectionDialog; - SettingsPage *m_settingsPage; - QList<Core::IEditorFactory*> m_editorFactories; - CoreListener *m_coreListener; - Core::IEditorFactory *m_submitEditorFactory; - Core::IVersionControl *m_versionControl; QString m_submitRepository; QStringList m_submitOrigCommitFiles; QStringList m_submitOrigDeleteFiles; diff --git a/src/plugins/subversion/checkoutwizard.cpp b/src/plugins/subversion/checkoutwizard.cpp new file mode 100644 index 00000000000..5285b704c3f --- /dev/null +++ b/src/plugins/subversion/checkoutwizard.cpp @@ -0,0 +1,88 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "checkoutwizard.h" +#include "checkoutwizardpage.h" +#include "subversionplugin.h" + +#include <vcsbase/checkoutjobs.h> +#include <utils/qtcassert.h> + +#include <QtGui/QIcon> + +namespace Subversion { +namespace Internal { + +CheckoutWizard::CheckoutWizard(QObject *parent) : + VCSBase::BaseCheckoutWizard(parent) +{ +} + +QIcon CheckoutWizard::icon() const +{ + return QIcon(); +} + +QString CheckoutWizard::description() const +{ + return tr("Check-out a project from a Subversion repository."); +} + +QString CheckoutWizard::name() const +{ + return tr("Subversion Checkout"); +} + +QWizardPage *CheckoutWizard::createParameterPage(const QString &path) +{ + CheckoutWizardPage *cwp = new CheckoutWizardPage; + cwp->setPath(path); + return cwp; +} + +QSharedPointer<VCSBase::AbstractCheckoutJob> CheckoutWizard::createJob(const QWizardPage *parameterPage, + QString *checkoutPath) +{ + // Collect parameters for the checkout command. + const CheckoutWizardPage *cwp = qobject_cast<const CheckoutWizardPage *>(parameterPage); + QTC_ASSERT(cwp, return QSharedPointer<VCSBase::AbstractCheckoutJob>()) + const SubversionSettings settings = SubversionPlugin::subversionPluginInstance()->settings(); + const QString binary = settings.svnCommand; + const QString directory = cwp->directory(); + QStringList args; + args << QLatin1String("checkout") << cwp->repository() << directory; + const QString workingDirectory = cwp->path(); + *checkoutPath = workingDirectory + QLatin1Char('/') + directory; + VCSBase::AbstractCheckoutJob *job = new VCSBase::ProcessCheckoutJob(binary, settings.addOptions(args), + workingDirectory); + return QSharedPointer<VCSBase::AbstractCheckoutJob>(job); +} + +} // namespace Internal +} // namespace Subversion diff --git a/src/plugins/subversion/checkoutwizard.h b/src/plugins/subversion/checkoutwizard.h new file mode 100644 index 00000000000..fbc9c1e1d36 --- /dev/null +++ b/src/plugins/subversion/checkoutwizard.h @@ -0,0 +1,58 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef CHECKOUTWIZARD_H +#define CHECKOUTWIZARD_H + +#include <vcsbase/basecheckoutwizard.h> + +namespace Subversion { +namespace Internal { + +class CheckoutWizard : public VCSBase::BaseCheckoutWizard +{ +public: + explicit CheckoutWizard(QObject *parent = 0); + + // IWizard + virtual QIcon icon() const; + virtual QString description() const; + virtual QString name() const; + +protected: + // BaseCheckoutWizard + virtual QWizardPage *createParameterPage(const QString &path); + virtual QSharedPointer<VCSBase::AbstractCheckoutJob> createJob(const QWizardPage *parameterPage, + QString *checkoutPath); +}; + +} // namespace Internal +} // namespace Subversion + +#endif // CHECKOUTWIZARD_H diff --git a/src/plugins/subversion/checkoutwizardpage.cpp b/src/plugins/subversion/checkoutwizardpage.cpp new file mode 100644 index 00000000000..a6440250c02 --- /dev/null +++ b/src/plugins/subversion/checkoutwizardpage.cpp @@ -0,0 +1,60 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "checkoutwizardpage.h" + +namespace Subversion { +namespace Internal { + +CheckoutWizardPage::CheckoutWizardPage(QWidget *parent) : + VCSBase::BaseCheckoutWizardPage(parent) +{ + setSubTitle(tr("Specify repository, checkout directory and path.")); + setRepositoryLabel(tr("Repository:")); +} + +QString CheckoutWizardPage::directoryFromRepository(const QString &repoIn) const +{ + /* Try to figure out a good directory name from something like: + * "svn://<server>/path1/project" -> project */ + + QString repo = repoIn.trimmed(); + const QChar slash = QLatin1Char('/'); + // remove host + const int slashPos = repo.lastIndexOf(slash); + if (slashPos != -1) + repo.remove(0, slashPos + 1); + // fix invalid characters + const QChar dash = QLatin1Char('-'); + repo.replace(QLatin1Char('.'), QLatin1Char('-')); + return repo; +} + +} // namespace Internal +} // namespace Subversion diff --git a/src/plugins/subversion/checkoutwizardpage.h b/src/plugins/subversion/checkoutwizardpage.h new file mode 100644 index 00000000000..9fe01007ec2 --- /dev/null +++ b/src/plugins/subversion/checkoutwizardpage.h @@ -0,0 +1,49 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef CHECKOUTWIZARDPAGE_H +#define CHECKOUTWIZARDPAGE_H + +#include <vcsbase/basecheckoutwizardpage.h> + +namespace Subversion { +namespace Internal { + +class CheckoutWizardPage : public VCSBase::BaseCheckoutWizardPage { + Q_OBJECT +public: + CheckoutWizardPage(QWidget *parent = 0); + +protected: + virtual QString directoryFromRepository(const QString &r) const; +}; + +} // namespace Internal +} // namespace Subversion +#endif // CHECKOUTWIZARDPAGE_H diff --git a/src/plugins/subversion/checkoutwizardpage.ui b/src/plugins/subversion/checkoutwizardpage.ui new file mode 100644 index 00000000000..74e5ed5069f --- /dev/null +++ b/src/plugins/subversion/checkoutwizardpage.ui @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Subversion::Internal::CheckoutWizardPage</class> + <widget class="QWizardPage" name="Subversion::Internal::CheckoutWizardPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>464</width> + <height>302</height> + </rect> + </property> + <property name="windowTitle"> + <string>WizardPage</string> + </property> + <property name="subTitle"> + <string>Specify path and repository URL.</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="repositoryLabel"> + <property name="text"> + <string>Clone URL:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="repositoryLineEdit"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="checkoutDirectoryLabel"> + <property name="text"> + <string>Checkout Directory:</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="pathLabel"> + <property name="text"> + <string>Path:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="Core::Utils::PathChooser" name="pathChooser"/> + </item> + <item row="1" column="1"> + <widget class="Core::Utils::ProjectNameValidatingLineEdit" name="checkoutDirectoryLineEdit"/> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>Core::Utils::ProjectNameValidatingLineEdit</class> + <extends>QLineEdit</extends> + <header location="global">utils/projectnamevalidatinglineedit.h</header> + </customwidget> + <customwidget> + <class>Core::Utils::PathChooser</class> + <extends>QWidget</extends> + <header location="global">utils/pathchooser.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/subversion/subversion.pro b/src/plugins/subversion/subversion.pro index 985a32648e1..b046bec8865 100644 --- a/src/plugins/subversion/subversion.pro +++ b/src/plugins/subversion/subversion.pro @@ -15,7 +15,9 @@ HEADERS += annotationhighlighter.h \ settingspage.h \ subversioneditor.h \ subversionsubmiteditor.h \ - subversionsettings.h + subversionsettings.h \ + checkoutwizard.h \ + checkoutwizardpage.h SOURCES += annotationhighlighter.cpp \ subversionplugin.cpp \ @@ -24,9 +26,12 @@ SOURCES += annotationhighlighter.cpp \ settingspage.cpp \ subversioneditor.cpp \ subversionsubmiteditor.cpp \ - subversionsettings.cpp + subversionsettings.cpp \ + checkoutwizard.cpp \ + checkoutwizardpage.cpp -FORMS += settingspage.ui +FORMS += settingspage.ui \ + checkoutwizardpage.ui RESOURCES += subversion.qrc diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 21c3e5b9a38..e25750fe217 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -36,6 +36,7 @@ #include "subversionsubmiteditor.h" #include "subversionconstants.h" #include "subversioncontrol.h" +#include "checkoutwizard.h" #include <vcsbase/basevcseditorfactory.h> #include <vcsbase/vcsbaseeditor.h> @@ -269,6 +270,8 @@ bool SubversionPlugin::initialize(const QStringList &arguments, QString *errorMe m_subversionOutputWindow = new SubversionOutputWindow(this); addAutoReleasedObject(m_subversionOutputWindow); + addAutoReleasedObject(new CheckoutWizard); + //register actions Core::ActionManager *ami = core->actionManager(); Core::ActionContainer *toolsContainer = ami->actionContainer(M_TOOLS); diff --git a/src/plugins/vcsbase/basecheckoutwizard.cpp b/src/plugins/vcsbase/basecheckoutwizard.cpp new file mode 100644 index 00000000000..384fea0a05b --- /dev/null +++ b/src/plugins/vcsbase/basecheckoutwizard.cpp @@ -0,0 +1,150 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "basecheckoutwizard.h" +#include "vcsbaseconstants.h" +#include "checkoutwizarddialog.h" +#include "checkoutjobs.h" + +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/session.h> + +#include <QtCore/QCoreApplication> +#include <QtCore/QFileInfo> +#include <QtCore/QDir> +#include <QtGui/QMessageBox> + +namespace VCSBase { + +struct BaseCheckoutWizardPrivate { + BaseCheckoutWizardPrivate() : dialog(0), parameterPage(0) {} + void clear(); + + Internal::CheckoutWizardDialog *dialog; + QWizardPage *parameterPage; + QString checkoutPath; +}; + +void BaseCheckoutWizardPrivate::clear() +{ + parameterPage = 0; + dialog = 0; + checkoutPath.clear(); +} + +BaseCheckoutWizard::BaseCheckoutWizard(QObject *parent) : + Core::IWizard(parent), + d(new BaseCheckoutWizardPrivate) +{ +} + +BaseCheckoutWizard::~BaseCheckoutWizard() +{ + delete d; +} + +Core::IWizard::Kind BaseCheckoutWizard::kind() const +{ + return Core::IWizard::ProjectWizard; +} + +QString BaseCheckoutWizard::category() const +{ + return QLatin1String(VCSBase::Constants::VCS_WIZARD_CATEGORY); +} + +QString BaseCheckoutWizard::trCategory() const +{ + return QCoreApplication::translate("VCSBase", VCSBase::Constants::VCS_WIZARD_CATEGORY); +} + +QStringList BaseCheckoutWizard::runWizard(const QString &path, QWidget *parent) +{ + // Create dialog and launch + d->parameterPage = createParameterPage(path); + Internal::CheckoutWizardDialog dialog(d->parameterPage, parent); + d->dialog = &dialog; + connect(&dialog, SIGNAL(progressPageShown()), this, SLOT(slotProgressPageShown())); + dialog.setWindowTitle(name()); + if (dialog.exec() != QDialog::Accepted) + return QStringList(); + // Now try to find the project file and open + const QString checkoutPath = d->checkoutPath; + d->clear(); + QString errorMessage; + const QString projectFile = openProject(checkoutPath, &errorMessage); + if (projectFile.isEmpty()) { + QMessageBox msgBox(QMessageBox::Warning, tr("Cannot Open Project"), + tr("Failed to open project in '%1'").arg(checkoutPath)); + msgBox.setDetailedText(errorMessage); + msgBox.exec(); + return QStringList(); + } + return QStringList(projectFile); +} + +QString BaseCheckoutWizard::openProject(const QString &path, QString *errorMessage) +{ + ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance(); + if (!pe) { + *errorMessage = tr("The Project Explorer is not available."); + return QString(); + } + + // Search the directory for project files + const QDir dir(path); + if (!dir.exists()) { + *errorMessage = tr("'%1' does not exist.").arg(path); // Should not happen + return QString(); + } + // Hardcoded: Find *.pro/Cmakefiles + QStringList patterns; + patterns << QLatin1String("*.pro") << QLatin1String("CMakeList.txt"); + QFileInfoList projectFiles = dir.entryInfoList(patterns, QDir::Files|QDir::NoDotAndDotDot|QDir::Readable); + if (projectFiles.empty()) { + *errorMessage = tr("No project files could be found (%1).").arg(patterns.join(QLatin1String(", "))); + return QString(); + } + // Open! + const QString projectFile = projectFiles.front().absoluteFilePath(); + if (!pe->openProject(projectFile)) { + *errorMessage = tr("Unable to open the project '%1'.").arg(projectFile); + return QString(); + } + return projectFile; +} + +void BaseCheckoutWizard::slotProgressPageShown() +{ + const QSharedPointer<AbstractCheckoutJob> job = createJob(d->parameterPage, &(d->checkoutPath)); + if (!job.isNull()) + d->dialog->start(job); +} + +} // namespace VCSBase diff --git a/src/plugins/vcsbase/basecheckoutwizard.h b/src/plugins/vcsbase/basecheckoutwizard.h new file mode 100644 index 00000000000..a8091b20024 --- /dev/null +++ b/src/plugins/vcsbase/basecheckoutwizard.h @@ -0,0 +1,92 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef BASECHECKOUTWIZARD_H +#define BASECHECKOUTWIZARD_H + +#include "vcsbase_global.h" +#include <coreplugin/dialogs/iwizard.h> + +#include <QtCore/QSharedPointer> + +QT_BEGIN_NAMESPACE +class QWizardPage; +QT_END_NAMESPACE + +namespace VCSBase { + +class AbstractCheckoutJob; +struct BaseCheckoutWizardPrivate; + +/* A Core::IWizard implementing a wizard for initially checking + * out a project using a version control system. + * Implements all of Core::IWizard with the exception of + * name()/description() and icon(). + * Pops up a QWizard consisting of a Parameter Page which is created + * by a virtual factory function and a progress + * page containing a log text. The factory function createJob() + * creates a job with the output connected to the log window, + * returning the path to the checkout. + * On success, the wizard tries to locate a project file + * and open it. + * BaseCheckoutWizardPage is provided as a convenience base class + * for parameter wizard pages. */ + +class VCSBASE_EXPORT BaseCheckoutWizard : public Core::IWizard +{ + Q_OBJECT + +public: + explicit BaseCheckoutWizard(QObject *parent = 0); + virtual ~BaseCheckoutWizard(); + + virtual Kind kind() const; + + virtual QString category() const; + virtual QString trCategory() const; + + virtual QStringList runWizard(const QString &path, QWidget *parent); + +protected: + virtual QWizardPage *createParameterPage(const QString &path) = 0; + virtual QSharedPointer<AbstractCheckoutJob> createJob(const QWizardPage *parameterPage, + QString *checkoutPath) = 0; + +private slots: + void slotProgressPageShown(); + +private: + QString openProject(const QString &path, QString *errorMessage); + + BaseCheckoutWizardPrivate *d; +}; + +} // namespace VCSBase + +#endif // BASECHECKOUTWIZARD_H diff --git a/src/plugins/vcsbase/basecheckoutwizardpage.cpp b/src/plugins/vcsbase/basecheckoutwizardpage.cpp new file mode 100644 index 00000000000..565da4052ea --- /dev/null +++ b/src/plugins/vcsbase/basecheckoutwizardpage.cpp @@ -0,0 +1,139 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "basecheckoutwizardpage.h" +#include "ui_basecheckoutwizardpage.h" + +namespace VCSBase { + +struct BaseCheckoutWizardPagePrivate { + BaseCheckoutWizardPagePrivate() : m_valid(false), m_directoryEdited(false) {} + + Ui::BaseCheckoutWizardPage ui; + bool m_valid; + bool m_directoryEdited; +}; + +BaseCheckoutWizardPage::BaseCheckoutWizardPage(QWidget *parent) : + QWizardPage(parent), + d(new BaseCheckoutWizardPagePrivate) +{ + d->ui.setupUi(this); + d->ui.pathChooser->setExpectedKind(Core::Utils::PathChooser::Directory); + connect(d->ui.pathChooser, SIGNAL(validChanged()), this, SLOT(slotChanged())); + connect(d->ui.checkoutDirectoryLineEdit, SIGNAL(validChanged()), + this, SLOT(slotChanged())); + connect(d->ui.repositoryLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotRepositoryChanged(QString))); + connect(d->ui.checkoutDirectoryLineEdit, SIGNAL(textEdited(QString)), this, SLOT(slotDirectoryEdited())); +} + +BaseCheckoutWizardPage::~BaseCheckoutWizardPage() +{ + delete d; +} + +void BaseCheckoutWizardPage::setRepositoryLabel(const QString &l) +{ + d->ui.repositoryLabel->setText(l); +} + +QString BaseCheckoutWizardPage::path() const +{ + return d->ui.pathChooser->path(); +} + +void BaseCheckoutWizardPage::setPath(const QString &p) +{ + d->ui.pathChooser->setPath(p); +} + +QString BaseCheckoutWizardPage::directory() const +{ + return d->ui.checkoutDirectoryLineEdit->text(); +} + +void BaseCheckoutWizardPage::setDirectory(const QString &dir) +{ + d->ui.checkoutDirectoryLineEdit->setText(dir); +} + +QString BaseCheckoutWizardPage::repository() const +{ + return d->ui.repositoryLineEdit->text().trimmed(); +} + +void BaseCheckoutWizardPage::setRepository(const QString &r) +{ + d->ui.repositoryLineEdit->setText(r); +} + +void BaseCheckoutWizardPage::slotRepositoryChanged(const QString &repo) +{ + /* Try to figure out a good directory name from something like: + * "svn://<server>/path1/project" -> project */ + if (d->m_directoryEdited) + return; + d->ui.checkoutDirectoryLineEdit->setText(directoryFromRepository(repo)); +} + +void BaseCheckoutWizardPage::slotDirectoryEdited() +{ + d->m_directoryEdited = true; +} + +void BaseCheckoutWizardPage::changeEvent(QEvent *e) +{ + QWizardPage::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + d->ui.retranslateUi(this); + break; + default: + break; + } +} + +bool BaseCheckoutWizardPage::isComplete() const +{ + return d->m_valid; +} + +void BaseCheckoutWizardPage::slotChanged() +{ + const bool valid = d->ui.pathChooser->isValid() + && d->ui.checkoutDirectoryLineEdit->isValid() + && !d->ui.repositoryLineEdit->text().isEmpty(); + + if (valid != d->m_valid) { + d->m_valid = valid; + emit completeChanged(); + } +} + +} // namespace VCSBase diff --git a/src/plugins/vcsbase/basecheckoutwizardpage.h b/src/plugins/vcsbase/basecheckoutwizardpage.h new file mode 100644 index 00000000000..2130c1944b0 --- /dev/null +++ b/src/plugins/vcsbase/basecheckoutwizardpage.h @@ -0,0 +1,87 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef VCSBASE_CHECKOUTWIZARDPAGE_H +#define VCSBASE_CHECKOUTWIZARDPAGE_H + +#include "vcsbase_global.h" + +#include <QtGui/QWizardPage> + +namespace VCSBase { + +namespace Ui { + class BaseCheckoutWizardPage; +} + +struct BaseCheckoutWizardPagePrivate; + +/* Base class for a parameter page of a checkout wizard. + * Let's the user specify the repository, a checkout directory and + * the path. Contains a virtual to derive the checkout directory + * from the repository as it is entered. */ + +class VCSBASE_EXPORT BaseCheckoutWizardPage : public QWizardPage { + Q_OBJECT +public: + BaseCheckoutWizardPage(QWidget *parent = 0); + ~BaseCheckoutWizardPage(); + + QString path() const; + void setPath(const QString &); + + QString directory() const; + void setDirectory(const QString &d); + + QString repository() const; + void setRepository(const QString &r); + + virtual bool isComplete() const; + +protected: + void changeEvent(QEvent *e); + + void setRepositoryLabel(const QString &l); + + /* Determine a checkout directory name from + * repository URL, that is, "protocol:/project" -> "project". */ + virtual QString directoryFromRepository(const QString &r) const = 0; + +private slots: + void slotRepositoryChanged(const QString &url); + void slotDirectoryEdited(); + void slotChanged(); + +private: + BaseCheckoutWizardPagePrivate *d; +}; + +} // namespace VCSBase + +#endif // VCSBASE_CHECKOUTWIZARDPAGE_H diff --git a/src/plugins/vcsbase/basecheckoutwizardpage.ui b/src/plugins/vcsbase/basecheckoutwizardpage.ui new file mode 100644 index 00000000000..46b1edfaf76 --- /dev/null +++ b/src/plugins/vcsbase/basecheckoutwizardpage.ui @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>VCSBase::BaseCheckoutWizardPage</class> + <widget class="QWizardPage" name="VCSBase::BaseCheckoutWizardPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>464</width> + <height>302</height> + </rect> + </property> + <property name="windowTitle"> + <string>WizardPage</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="repositoryLabel"/> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="repositoryLineEdit"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="checkoutDirectoryLabel"> + <property name="text"> + <string>Checkout Directory:</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="pathLabel"> + <property name="text"> + <string>Path:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="Core::Utils::PathChooser" name="pathChooser"/> + </item> + <item row="1" column="1"> + <widget class="Core::Utils::ProjectNameValidatingLineEdit" name="checkoutDirectoryLineEdit"/> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>Core::Utils::ProjectNameValidatingLineEdit</class> + <extends>QLineEdit</extends> + <header location="global">utils/projectnamevalidatinglineedit.h</header> + </customwidget> + <customwidget> + <class>Core::Utils::PathChooser</class> + <extends>QWidget</extends> + <header location="global">utils/pathchooser.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/vcsbase/checkoutjobs.cpp b/src/plugins/vcsbase/checkoutjobs.cpp new file mode 100644 index 00000000000..1c19bfe7b3d --- /dev/null +++ b/src/plugins/vcsbase/checkoutjobs.cpp @@ -0,0 +1,137 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "checkoutjobs.h" + +#include <QtCore/QDebug> + +enum { debug = 0 }; +namespace VCSBase { + +AbstractCheckoutJob::AbstractCheckoutJob(QObject *parent) : + QObject(parent) +{ +} + +struct ProcessCheckoutJobPrivate { + ProcessCheckoutJobPrivate(const QString &binary, + const QStringList &args, + const QString &workingDirectory, + const QStringList &env); + + QProcess process; + const QString binary; + const QStringList args; +}; + +ProcessCheckoutJobPrivate::ProcessCheckoutJobPrivate(const QString &b, + const QStringList &a, + const QString &workingDirectory, + const QStringList &env) : + binary(b), + args(a) +{ + if (!workingDirectory.isEmpty()) + process.setWorkingDirectory(workingDirectory); + if (!env.empty()) + process.setEnvironment(env); +} + +ProcessCheckoutJob::ProcessCheckoutJob(const QString &binary, + const QStringList &args, + const QString &workingDirectory, + const QStringList &env, + QObject *parent) : + AbstractCheckoutJob(parent), + d(new ProcessCheckoutJobPrivate(binary, args, workingDirectory, env)) +{ + if (debug) + qDebug() << "ProcessCheckoutJob" << binary << args << workingDirectory; + connect(&d->process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(slotError(QProcess::ProcessError))); + connect(&d->process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotFinished(int,QProcess::ExitStatus))); + connect(&d->process, SIGNAL(readyReadStandardOutput()), this, SLOT(slotOutput())); + d->process.setProcessChannelMode(QProcess::MergedChannels); + d->process.closeWriteChannel(); +} + +ProcessCheckoutJob::~ProcessCheckoutJob() +{ + delete d; +} + +void ProcessCheckoutJob::slotOutput() +{ + const QString s = QString::fromLocal8Bit(d->process.readAllStandardOutput()); + if (debug) + qDebug() << s; + emit output(s); +} + +void ProcessCheckoutJob::slotError(QProcess::ProcessError /* error */) +{ + emit failed(d->process.errorString()); +} + +void ProcessCheckoutJob::slotFinished (int exitCode, QProcess::ExitStatus exitStatus) +{ + if (debug) + qDebug() << "finished" << exitCode << exitStatus; + + switch (exitStatus) { + case QProcess::NormalExit: + emit output(tr("The process terminated with exit code %1.").arg(exitCode)); + if (exitCode == 0) { + emit succeeded(); + } else { + emit failed(tr("The process returned exit code %1.").arg(exitCode)); + } + break; + case QProcess::CrashExit: + emit failed(tr("The process terminated in an abnormal way.")); + break; + } +} + +void ProcessCheckoutJob::start() +{ + d->process.start(d->binary, d->args); +} + +void ProcessCheckoutJob::cancel() +{ + if (debug) + qDebug() << "ProcessCheckoutJob::start"; + + emit output(tr("Stopping...")); + d->process.terminate(); + if (!d->process.waitForFinished(5000)) + d->process.kill(); +} + +} // namespace VCSBase diff --git a/src/plugins/vcsbase/checkoutjobs.h b/src/plugins/vcsbase/checkoutjobs.h new file mode 100644 index 00000000000..fd1925648df --- /dev/null +++ b/src/plugins/vcsbase/checkoutjobs.h @@ -0,0 +1,95 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef CHECKOUTJOB_H +#define CHECKOUTJOB_H + +#include "vcsbase_global.h" + +#include <QtCore/QObject> +#include <QtCore/QStringList> +#include <QtCore/QProcess> + +QT_BEGIN_NAMESPACE +class QStringList; +class QByteArray; +QT_END_NAMESPACE + +namespace VCSBase { + +struct ProcessCheckoutJobPrivate; + +/* Abstract base class for a job creating an initial project checkout. + * It should be something that runs in the background producing log + * messages. */ + +class VCSBASE_EXPORT AbstractCheckoutJob : public QObject +{ + Q_OBJECT +public: + virtual void start() = 0; + virtual void cancel() = 0; + +protected: + explicit AbstractCheckoutJob(QObject *parent = 0); + +signals: + void succeeded(); + void failed(const QString &why); + void output(const QString &what); +}; + +/* Convenience implementation using a QProcess. */ + +class VCSBASE_EXPORT ProcessCheckoutJob : public AbstractCheckoutJob +{ + Q_OBJECT +public: + explicit ProcessCheckoutJob(const QString &binary, + const QStringList &args, + const QString &workingDirectory = QString(), + const QStringList &env = QStringList(), + QObject *parent = 0); + virtual ~ProcessCheckoutJob(); + + virtual void start(); + virtual void cancel(); + +private slots: + void slotError(QProcess::ProcessError error); + void slotFinished (int exitCode, QProcess::ExitStatus exitStatus); + void slotOutput(); + +private: + ProcessCheckoutJobPrivate *d; +}; + +} // namespace VCSBase + +#endif // CHECKOUTJOB_H diff --git a/src/plugins/vcsbase/checkoutprogresswizardpage.cpp b/src/plugins/vcsbase/checkoutprogresswizardpage.cpp new file mode 100644 index 00000000000..ff727cac2de --- /dev/null +++ b/src/plugins/vcsbase/checkoutprogresswizardpage.cpp @@ -0,0 +1,118 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "checkoutprogresswizardpage.h" +#include "checkoutjobs.h" +#include "ui_checkoutprogresswizardpage.h" + +#include <utils/qtcassert.h> + +#include <QtGui/QApplication> +#include <QtGui/QCursor> + +namespace VCSBase { +namespace Internal { + +CheckoutProgressWizardPage::CheckoutProgressWizardPage(QWidget *parent) : + QWizardPage(parent), + ui(new Ui::CheckoutProgressWizardPage), + m_state(Idle) +{ + ui->setupUi(this); +} + +CheckoutProgressWizardPage::~CheckoutProgressWizardPage() +{ + if (m_state == Running) // Paranoia! + QApplication::restoreOverrideCursor(); + delete ui; +} + +void CheckoutProgressWizardPage::start(const QSharedPointer<AbstractCheckoutJob> &job) +{ + QTC_ASSERT(m_state != Running, return) + m_job = job; + connect(job.data(), SIGNAL(output(QString)), ui->logPlainTextEdit, SLOT(appendPlainText(QString))); + connect(job.data(), SIGNAL(failed(QString)), this, SLOT(slotFailed(QString))); + connect(job.data(), SIGNAL(succeeded()), this, SLOT(slotSucceeded())); + QApplication::setOverrideCursor(Qt::WaitCursor); + ui->logPlainTextEdit->clear(); + setSubTitle(tr("Checkout started...")); + job->start(); + m_state = Running; + +} + +void CheckoutProgressWizardPage::slotFailed(const QString &why) +{ + ui->logPlainTextEdit->appendPlainText(why); + if (m_state == Running) { + m_state = Failed; + QApplication::restoreOverrideCursor(); + setSubTitle(tr("Failed.")); + emit terminated(false); + } +} + +void CheckoutProgressWizardPage::slotSucceeded() +{ + if (m_state == Running) { + m_state = Succeeded; + QApplication::restoreOverrideCursor(); + setSubTitle(tr("Succeeded.")); + emit completeChanged(); + emit terminated(true); + } +} + +void CheckoutProgressWizardPage::terminate() +{ + if (!m_job.isNull()) + m_job->cancel(); +} + +bool CheckoutProgressWizardPage::isComplete() const +{ + return m_state == Succeeded; +} + +void CheckoutProgressWizardPage::changeEvent(QEvent *e) +{ + QWizardPage::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +} // namespace Internal +} // namespace VCSBase diff --git a/src/plugins/vcsbase/checkoutprogresswizardpage.h b/src/plugins/vcsbase/checkoutprogresswizardpage.h new file mode 100644 index 00000000000..971bb29e901 --- /dev/null +++ b/src/plugins/vcsbase/checkoutprogresswizardpage.h @@ -0,0 +1,84 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef CHECKOUTPROGRESSWIZARDPAGE_H +#define CHECKOUTPROGRESSWIZARDPAGE_H + +#include <QtCore/QSharedPointer> +#include <QtGui/QWizardPage> + +namespace VCSBase { +class AbstractCheckoutJob; + +namespace Internal { + +namespace Ui { + class CheckoutProgressWizardPage; +} + +/* Page showing the progress of an initial project + * checkout. Turns complete when the job succeeds. */ + +class CheckoutProgressWizardPage : public QWizardPage { + Q_OBJECT + Q_DISABLE_COPY(CheckoutProgressWizardPage) + +public: + enum State { Idle, Running, Failed, Succeeded }; + + explicit CheckoutProgressWizardPage(QWidget *parent = 0); + ~CheckoutProgressWizardPage(); + + void start(const QSharedPointer<AbstractCheckoutJob> &job); + + virtual bool isComplete() const; + bool isRunning() const{ return m_state == Running; } + + void terminate(); + +signals: + void terminated(bool success); + +private slots: + void slotFailed(const QString &); + void slotSucceeded(); + +protected: + void changeEvent(QEvent *e); + +private: + Ui::CheckoutProgressWizardPage *ui; + QSharedPointer<AbstractCheckoutJob> m_job; + + State m_state; +}; + +} // namespace Internal +} // namespace VCSBase +#endif // CHECKOUTPROGRESSWIZARDPAGE_H diff --git a/src/plugins/vcsbase/checkoutprogresswizardpage.ui b/src/plugins/vcsbase/checkoutprogresswizardpage.ui new file mode 100644 index 00000000000..dc47d3b5c91 --- /dev/null +++ b/src/plugins/vcsbase/checkoutprogresswizardpage.ui @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>VCSBase::Internal::CheckoutProgressWizardPage</class> + <widget class="QWizardPage" name="VCSBase::Internal::CheckoutProgressWizardPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>264</width> + <height>200</height> + </rect> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QPlainTextEdit" name="logPlainTextEdit"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/vcsbase/checkoutwizarddialog.cpp b/src/plugins/vcsbase/checkoutwizarddialog.cpp new file mode 100644 index 00000000000..23cac1009d8 --- /dev/null +++ b/src/plugins/vcsbase/checkoutwizarddialog.cpp @@ -0,0 +1,93 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "checkoutwizarddialog.h" +#include "basecheckoutwizard.h" +#include "checkoutjobs.h" +#include "checkoutprogresswizardpage.h" + +#include <coreplugin/basefilewizard.h> + +#include <QtGui/QPushButton> + +namespace VCSBase { +namespace Internal { + +enum PageId { ParameterPageId, ProgressPageId }; + +CheckoutWizardDialog::CheckoutWizardDialog(QWizardPage *parameterPage, + QWidget *parent) : + QWizard(parent), + m_progressPage(new CheckoutProgressWizardPage) +{ + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + setPage(ParameterPageId, parameterPage); + setPage(ProgressPageId, m_progressPage); + connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(slotPageChanged(int))); + connect(m_progressPage, SIGNAL(terminated(bool)), this, SLOT(slotTerminated(bool))); + Core::BaseFileWizard::setupWizard(this); +} + +void CheckoutWizardDialog::slotPageChanged(int id) +{ + if (id == ProgressPageId) + emit progressPageShown(); +} + +void CheckoutWizardDialog::slotTerminated(bool success) +{ + // Allow to correct parameters + if (!success) + button(QWizard::BackButton)->setEnabled(true); +} + +void CheckoutWizardDialog::start(const QSharedPointer<AbstractCheckoutJob> &job) +{ + m_progressPage->start(job); + // No "back" available while running. + button(QWizard::BackButton)->setEnabled(false); +} + +const QWizardPage *CheckoutWizardDialog::parameterPage() const +{ + return page(ParameterPageId); +} + +void CheckoutWizardDialog::reject() +{ + // First click kills, 2nd closes + if (currentId() == ProgressPageId && m_progressPage->isRunning()) { + m_progressPage->terminate(); + } else { + QWizard::reject(); + } +} + +} // namespace Internal +} // namespace VCSBase diff --git a/src/plugins/vcsbase/checkoutwizarddialog.h b/src/plugins/vcsbase/checkoutwizarddialog.h new file mode 100644 index 00000000000..624cacf03b5 --- /dev/null +++ b/src/plugins/vcsbase/checkoutwizarddialog.h @@ -0,0 +1,69 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef CHECKOUTWIZARDDIALOG_H +#define CHECKOUTWIZARDDIALOG_H + +#include <QtCore/QSharedPointer> +#include <QtGui/QWizard> + +namespace VCSBase { +class AbstractCheckoutJob; + +namespace Internal { +class CheckoutProgressWizardPage; + +/* See BaseCheckoutWizard. + * Overwrites reject() to first kill the checkout + * and then close. */ + +class CheckoutWizardDialog : public QWizard { + Q_OBJECT +public: + CheckoutWizardDialog(QWizardPage *parameterPage, + QWidget *parent = 0); + + void start(const QSharedPointer<AbstractCheckoutJob> &job); + const QWizardPage *parameterPage() const; + +signals: + void progressPageShown(); + +private slots: + void slotPageChanged(int id); + void slotTerminated(bool success); + virtual void reject(); + +private: + CheckoutProgressWizardPage *m_progressPage; +}; + +} // namespace Internal +} // namespace VCSBase +#endif // CHECKOUTWIZARDDIALOG_H diff --git a/src/plugins/vcsbase/vcsbase.pro b/src/plugins/vcsbase/vcsbase.pro index be345d2ad54..1465c9db7f2 100644 --- a/src/plugins/vcsbase/vcsbase.pro +++ b/src/plugins/vcsbase/vcsbase.pro @@ -17,7 +17,12 @@ HEADERS += vcsbase_global.h \ submitfilemodel.h \ vcsbasesettings.h \ vcsbasesettingspage.h \ - nicknamedialog.h + nicknamedialog.h \ + basecheckoutwizard.h \ + checkoutwizarddialog.h \ + checkoutprogresswizardpage.h \ + checkoutjobs.h \ + basecheckoutwizardpage.h SOURCES += vcsbaseplugin.cpp \ baseannotationhighlighter.cpp \ @@ -31,11 +36,18 @@ SOURCES += vcsbaseplugin.cpp \ submitfilemodel.cpp \ vcsbasesettings.cpp \ vcsbasesettingspage.cpp \ - nicknamedialog.cpp + nicknamedialog.cpp \ + basecheckoutwizard.cpp \ + checkoutwizarddialog.cpp \ + checkoutprogresswizardpage.cpp \ + checkoutjobs.cpp \ + basecheckoutwizardpage.cpp RESOURCES += vcsbase.qrc FORMS += vcsbasesettingspage.ui \ - nicknamedialog.ui + nicknamedialog.ui \ + checkoutprogresswizardpage.ui \ + basecheckoutwizardpage.ui OTHER_FILES += VCSBase.pluginspec diff --git a/src/plugins/vcsbase/vcsbaseconstants.h b/src/plugins/vcsbase/vcsbaseconstants.h index 3362be5d497..82a9dff01ef 100644 --- a/src/plugins/vcsbase/vcsbaseconstants.h +++ b/src/plugins/vcsbase/vcsbaseconstants.h @@ -38,6 +38,8 @@ namespace Constants { const char * const VCS_SETTINGS_CATEGORY = QT_TRANSLATE_NOOP("VCSBase", "Version Control"); const char * const VCS_COMMON_SETTINGS_ID = QT_TRANSLATE_NOOP("VCSBase", "Common"); +const char * const VCS_WIZARD_CATEGORY = QT_TRANSLATE_NOOP("VCSBase", "Version Control"); + namespace Internal { enum { debug = 0 }; } // namespace Internal -- GitLab