summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2009-07-17 17:19:23 +0200
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>2009-07-17 17:19:23 +0200
commit9f14b79cc609c878023b3d00bca0a6c8ce24283f (patch)
tree6fa61a382c0d13e00bf28002963057895f7eccbd /src/plugins
parentb799f32b967b9cb5a91631736ef5f035308beaa8 (diff)
downloadqt-creator-9f14b79cc609c878023b3d00bca0a6c8ce24283f.tar.gz
Add a clone wizard for version control (base classes + git/svn).
Task-number: 244831
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/git/clonewizard.cpp91
-rw-r--r--src/plugins/git/clonewizard.h58
-rw-r--r--src/plugins/git/clonewizardpage.cpp83
-rw-r--r--src/plugins/git/clonewizardpage.h56
-rw-r--r--src/plugins/git/git.pro8
-rw-r--r--src/plugins/git/gitclient.cpp44
-rw-r--r--src/plugins/git/gitclient.h3
-rw-r--r--src/plugins/git/gitcommand.cpp29
-rw-r--r--src/plugins/git/gitcommand.h8
-rw-r--r--src/plugins/git/gitplugin.cpp75
-rw-r--r--src/plugins/git/gitplugin.h8
-rw-r--r--src/plugins/subversion/checkoutwizard.cpp88
-rw-r--r--src/plugins/subversion/checkoutwizard.h58
-rw-r--r--src/plugins/subversion/checkoutwizardpage.cpp60
-rw-r--r--src/plugins/subversion/checkoutwizardpage.h49
-rw-r--r--src/plugins/subversion/checkoutwizardpage.ui84
-rw-r--r--src/plugins/subversion/subversion.pro11
-rw-r--r--src/plugins/subversion/subversionplugin.cpp3
-rw-r--r--src/plugins/vcsbase/basecheckoutwizard.cpp150
-rw-r--r--src/plugins/vcsbase/basecheckoutwizard.h92
-rw-r--r--src/plugins/vcsbase/basecheckoutwizardpage.cpp139
-rw-r--r--src/plugins/vcsbase/basecheckoutwizardpage.h87
-rw-r--r--src/plugins/vcsbase/basecheckoutwizardpage.ui77
-rw-r--r--src/plugins/vcsbase/checkoutjobs.cpp137
-rw-r--r--src/plugins/vcsbase/checkoutjobs.h95
-rw-r--r--src/plugins/vcsbase/checkoutprogresswizardpage.cpp118
-rw-r--r--src/plugins/vcsbase/checkoutprogresswizardpage.h84
-rw-r--r--src/plugins/vcsbase/checkoutprogresswizardpage.ui25
-rw-r--r--src/plugins/vcsbase/checkoutwizarddialog.cpp93
-rw-r--r--src/plugins/vcsbase/checkoutwizarddialog.h69
-rw-r--r--src/plugins/vcsbase/vcsbase.pro18
-rw-r--r--src/plugins/vcsbase/vcsbaseconstants.h2
32 files changed, 1890 insertions, 112 deletions
diff --git a/src/plugins/git/clonewizard.cpp b/src/plugins/git/clonewizard.cpp
new file mode 100644
index 0000000000..252534ec4b
--- /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 0000000000..2a1c0ff3b5
--- /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 0000000000..6f78ab278f
--- /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 0000000000..4d8797e6f0
--- /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 8b9a6171e8..618b7810b4 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 0486522fd1..6b900a5d8f 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 ce65fd7786..cfe1426967 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 7e16fc3864..6374328633 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 a9c95bd663..e589789b39 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 90f1926194..8359329819 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 d5c935a555..d473697cd9 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 0000000000..5285b704c3
--- /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 0000000000..fbc9c1e1d3
--- /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 0000000000..a6440250c0
--- /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 0000000000..9fe01007ec
--- /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 0000000000..74e5ed5069
--- /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 985a32648e..b046bec886 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 21c3e5b9a3..e25750fe21 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 0000000000..384fea0a05
--- /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 0000000000..a8091b2002
--- /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 0000000000..565da4052e
--- /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 0000000000..2130c1944b
--- /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 0000000000..46b1edfaf7
--- /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 0000000000..1c19bfe7b3
--- /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 0000000000..fd1925648d
--- /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 0000000000..ff727cac2d
--- /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 0000000000..971bb29e90
--- /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 0000000000..dc47d3b5c9
--- /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 0000000000..23cac1009d
--- /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 0000000000..624cacf03b
--- /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 be345d2ad5..1465c9db7f 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 3362be5d49..82a9dff01e 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