From 9c8f4e30a7d4758293afe73392f9cc80f1154e80 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com>
Date: Thu, 19 Mar 2009 16:33:44 +0100
Subject: [PATCH] Allow specifying the name of a new generic project

The name is used as the base for files like [project].creator,
[project].files, etc. and is displayed in the Projects mode and the
Projects tree.
---
 src/libs/utils/basevalidatinglineedit.h       | 11 ++--
 src/libs/utils/filenamevalidatinglineedit.h   |  8 +++
 src/libs/utils/filewizardpage.cpp             | 14 ++--
 src/libs/utils/filewizardpage.h               | 18 +++--
 src/libs/utils/filewizardpage.ui              | 66 ++++++-------------
 src/libs/utils/pathchooser.h                  | 12 ++--
 .../genericprojectmanager/genericproject.cpp  |  9 +--
 .../genericprojectmanager/genericproject.h    |  1 -
 .../genericprojectnodes.cpp                   |  8 +--
 .../genericprojectnodes.h                     |  6 +-
 .../genericprojectwizard.cpp                  | 35 +++++-----
 .../genericprojectwizard.h                    | 26 +++++---
 src/plugins/qt4projectmanager/qt4nodes.h      |  9 ++-
 src/plugins/qt4projectmanager/qt4project.h    |  6 +-
 14 files changed, 123 insertions(+), 106 deletions(-)

diff --git a/src/libs/utils/basevalidatinglineedit.h b/src/libs/utils/basevalidatinglineedit.h
index 9dd8f8ec569..a57d04b49a3 100644
--- a/src/libs/utils/basevalidatinglineedit.h
+++ b/src/libs/utils/basevalidatinglineedit.h
@@ -39,7 +39,8 @@ namespace Utils {
 
 struct BaseValidatingLineEditPrivate;
 
-/* Base class for validating line edits that performs validation in a virtual
+/**
+ * Base class for validating line edits that performs validation in a virtual
  * validate() function to be implemented in derived classes.
  * When invalid, the text color will turn red and a tooltip will
  * contain the error message. This approach is less intrusive than a
@@ -47,9 +48,10 @@ struct BaseValidatingLineEditPrivate;
  *
  * The widget has a concept of an "initialText" which can be something like
  * "<Enter name here>". This results in state 'DisplayingInitialText', which
- * is not valid, but is not marked red. */
-
-class QWORKBENCH_UTILS_EXPORT BaseValidatingLineEdit : public QLineEdit {
+ * is not valid, but is not marked red.
+ */
+class QWORKBENCH_UTILS_EXPORT BaseValidatingLineEdit : public QLineEdit
+{
     Q_OBJECT
     Q_DISABLE_COPY(BaseValidatingLineEdit)
     Q_PROPERTY(QString initialText READ initialText WRITE setInitialText DESIGNABLE true)
@@ -97,4 +99,5 @@ private:
 
 } // namespace Utils
 } // namespace Core
+
 #endif // BASEVALIDATINGLINEEDIT_H
diff --git a/src/libs/utils/filenamevalidatinglineedit.h b/src/libs/utils/filenamevalidatinglineedit.h
index cf37757175a..60145bdf4ca 100644
--- a/src/libs/utils/filenamevalidatinglineedit.h
+++ b/src/libs/utils/filenamevalidatinglineedit.h
@@ -35,6 +35,10 @@
 namespace Core {
 namespace Utils {
 
+/**
+ * A control that let's the user choose a file name, based on a QLineEdit. Has
+ * some validation logic for embedding into QWizardPage.
+ */
 class QWORKBENCH_UTILS_EXPORT FileNameValidatingLineEdit : public BaseValidatingLineEdit
 {
     Q_OBJECT
@@ -47,6 +51,10 @@ public:
                                  bool allowDirectories = false,
                                  QString *errorMessage = 0);
 
+    /**
+     * Sets whether entering directories is allowed. This will enable the user
+     * to enter slashes in the filename. Default is off.
+     */
     bool allowDirectories() const;
     void setAllowDirectories(bool v);
 
diff --git a/src/libs/utils/filewizardpage.cpp b/src/libs/utils/filewizardpage.cpp
index 59f1bbc56ba..3fb0b79b8c2 100644
--- a/src/libs/utils/filewizardpage.cpp
+++ b/src/libs/utils/filewizardpage.cpp
@@ -30,10 +30,6 @@
 #include "filewizardpage.h"
 #include "ui_filewizardpage.h"
 
-#include <QtCore/QDebug>
-#include <QtCore/QDir>
-#include <QtGui/QMessageBox>
-
 namespace Core {
 namespace Utils {
 
@@ -103,6 +99,16 @@ bool FileWizardPage::isComplete() const
     return m_d->m_complete;
 }
 
+void FileWizardPage::setNameLabel(const QString &label)
+{
+    m_d->m_ui.nameLabel->setText(label);
+}
+
+void FileWizardPage::setPathLabel(const QString &label)
+{
+    m_d->m_ui.pathLabel->setText(label);
+}
+
 void FileWizardPage::slotValidChanged()
 {
     const bool newComplete = m_d->m_ui.pathChooser->isValid() && m_d->m_ui.nameLineEdit->isValid();
diff --git a/src/libs/utils/filewizardpage.h b/src/libs/utils/filewizardpage.h
index 657ec4f4efc..b41839e0bfc 100644
--- a/src/libs/utils/filewizardpage.h
+++ b/src/libs/utils/filewizardpage.h
@@ -39,10 +39,15 @@ namespace Utils {
 
 struct FileWizardPagePrivate;
 
-/* Standard wizard page for a single file letting the user choose name
- * and path. Sets the "FileNames" QWizard field. */
-
-class QWORKBENCH_UTILS_EXPORT FileWizardPage : public QWizardPage {
+/**
+ * Standard wizard page for a single file letting the user choose name
+ * and path. Sets the "FileNames" QWizard field.
+ *
+ * The name and path labels can be changed. By default they are simply "Name:"
+ * and "Path:".
+ */
+class QWORKBENCH_UTILS_EXPORT FileWizardPage : public QWizardPage
+{
     Q_OBJECT
     Q_DISABLE_COPY(FileWizardPage)
     Q_PROPERTY(QString path READ path WRITE setPath DESIGNABLE true)
@@ -56,7 +61,10 @@ public:
 
     virtual bool isComplete() const;
 
-    // Validate a base name  entry field (potentially containing extension)
+    void setNameLabel(const QString &label);
+    void setPathLabel(const QString &label);
+
+    // Validate a base name entry field (potentially containing extension)
     static bool validateBaseName(const QString &name, QString *errorMessage = 0);
 
 signals:
diff --git a/src/libs/utils/filewizardpage.ui b/src/libs/utils/filewizardpage.ui
index 2e614c6f552..98d0873128f 100644
--- a/src/libs/utils/filewizardpage.ui
+++ b/src/libs/utils/filewizardpage.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>400</width>
-    <height>300</height>
+    <width>196</width>
+    <height>68</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -16,52 +16,26 @@
   <property name="title">
    <string>Choose the location</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QWidget" name="widget" native="true">
-       <layout class="QFormLayout" name="formLayout">
-        <property name="fieldGrowthPolicy">
-         <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
-        </property>
-        <item row="0" column="0">
-         <widget class="QLabel" name="nameLabel">
-          <property name="text">
-           <string>Name:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="1">
-         <widget class="Core::Utils::FileNameValidatingLineEdit" name="nameLineEdit"/>
-        </item>
-        <item row="1" column="0">
-         <widget class="QLabel" name="pathLabel">
-          <property name="text">
-           <string>Path:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="1" column="1">
-         <widget class="Core::Utils::PathChooser" name="pathChooser" native="true"/>
-        </item>
-       </layout>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
+  <layout class="QFormLayout" name="formLayout">
+   <item row="0" column="0">
+    <widget class="QLabel" name="nameLabel">
+     <property name="text">
+      <string>Name:</string>
      </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>201</height>
-      </size>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="Core::Utils::FileNameValidatingLineEdit" name="nameLineEdit"/>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="pathLabel">
+     <property name="text">
+      <string>Path:</string>
      </property>
-    </spacer>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="Core::Utils::PathChooser" name="pathChooser" native="true"/>
    </item>
   </layout>
  </widget>
diff --git a/src/libs/utils/pathchooser.h b/src/libs/utils/pathchooser.h
index 99f23303715..04607ef700a 100644
--- a/src/libs/utils/pathchooser.h
+++ b/src/libs/utils/pathchooser.h
@@ -39,10 +39,10 @@ namespace Utils {
 
 struct PathChooserPrivate;
 
-/* A Control that let's the user choose a path, consisting of a QLineEdit and
- * a "Browse" button. Has some validation logic for embedding into
- * QWizardPage. */
-
+/**
+ * A control that let's the user choose a path, consisting of a QLineEdit and
+ * a "Browse" button. Has some validation logic for embedding into QWizardPage.
+ */
 class QWORKBENCH_UTILS_EXPORT PathChooser : public QWidget
 {
     Q_DISABLE_COPY(PathChooser)
@@ -74,12 +74,12 @@ public:
 
     QString path() const;
 
-    // Returns the suggested label title when used in a form layout
+    /** Returns the suggested label title when used in a form layout. */
     static QString label();
 
     virtual bool validatePath(const QString &path, QString *errorMessage = 0);
 
-    // Return the home directory, which needs some fixing under Windows.
+    /** Return the home directory, which needs some fixing under Windows. */
     static QString homePath();
 
 private:
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 9070dabd5ce..679e16f8959 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -31,6 +31,7 @@
 #include "genericprojectconstants.h"
 #include "genericmakestep.h"
 
+#include <projectexplorer/toolchain.h>
 #include <projectexplorer/projectexplorerconstants.h>
 #include <cpptools/cppmodelmanagerinterface.h>
 #include <extensionsystem/pluginmanager.h>
@@ -112,12 +113,12 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
       m_toolChain(0)
 {
     QFileInfo fileInfo(m_fileName);
-    const QString projectBaseName = fileInfo.baseName();
     QDir dir = fileInfo.dir();
 
-    m_filesFileName    = QFileInfo(dir, projectBaseName + QLatin1String(".files")).absoluteFilePath();
-    m_includesFileName = QFileInfo(dir, projectBaseName + QLatin1String(".includes")).absoluteFilePath();
-    m_configFileName   = QFileInfo(dir, projectBaseName + QLatin1String(".config")).absoluteFilePath();
+    m_projectName      = fileInfo.baseName();
+    m_filesFileName    = QFileInfo(dir, m_projectName + QLatin1String(".files")).absoluteFilePath();
+    m_includesFileName = QFileInfo(dir, m_projectName + QLatin1String(".includes")).absoluteFilePath();
+    m_configFileName   = QFileInfo(dir, m_projectName + QLatin1String(".config")).absoluteFilePath();
 
     m_file = new GenericProjectFile(this, fileName);
     m_rootNode = new GenericProjectNode(this, m_file);
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index a5f4abb7fb6..a332b43c99d 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -36,7 +36,6 @@
 #include <projectexplorer/project.h>
 #include <projectexplorer/projectnodes.h>
 #include <projectexplorer/buildstep.h>
-#include <projectexplorer/toolchain.h>
 #include <coreplugin/ifile.h>
 
 QT_BEGIN_NAMESPACE
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
index b6bde51ca46..016ada7f47a 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
@@ -30,12 +30,10 @@
 #include "genericprojectnodes.h"
 #include "genericproject.h"
 
+#include <coreplugin/ifile.h>
 #include <projectexplorer/projectexplorer.h>
 
-#include <QDir>
 #include <QFileInfo>
-#include <QSettings>
-#include <QtDebug>
 
 using namespace GenericProjectManager;
 using namespace GenericProjectManager::Internal;
@@ -44,7 +42,9 @@ GenericProjectNode::GenericProjectNode(GenericProject *project, Core::IFile *pro
     : ProjectExplorer::ProjectNode(QFileInfo(projectFile->fileName()).absolutePath()),
       m_project(project),
       m_projectFile(projectFile)
-{}
+{
+    setFolderName(QFileInfo(projectFile->fileName()).baseName());
+}
 
 GenericProjectNode::~GenericProjectNode()
 { }
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.h b/src/plugins/genericprojectmanager/genericprojectnodes.h
index 4b647a860e3..326e0ee3cec 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.h
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.h
@@ -30,11 +30,15 @@
 #ifndef GENERICPROJECTNODE_H
 #define GENERICPROJECTNODE_H
 
-#include <coreplugin/ifile.h>
 #include <projectexplorer/projectnodes.h>
+
 #include <QStringList>
 #include <QHash>
 
+namespace Core {
+class IFile;
+}
+
 namespace GenericProjectManager {
 namespace Internal {
 
diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.cpp b/src/plugins/genericprojectmanager/genericprojectwizard.cpp
index 289cbfd3434..7c3185e148b 100644
--- a/src/plugins/genericprojectmanager/genericprojectwizard.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectwizard.cpp
@@ -4,16 +4,17 @@
 #include <coreplugin/mimedatabase.h>
 #include <projectexplorer/projectexplorer.h>
 
+#include <utils/filenamevalidatinglineedit.h>
+#include <utils/filewizardpage.h>
 #include <utils/pathchooser.h>
 
 #include <QtCore/QDir>
 #include <QtCore/QtDebug>
 
-#include <QtGui/QWizard>
+#include <QtGui/QDirModel>
 #include <QtGui/QFormLayout>
 #include <QtGui/QListView>
 #include <QtGui/QTreeView>
-#include <QtGui/QDirModel>
 
 using namespace GenericProjectManager::Internal;
 using namespace Core::Utils;
@@ -94,14 +95,12 @@ GenericProjectWizardDialog::GenericProjectWizardDialog(QWidget *parent)
     setWindowTitle(tr("Import Existing Project"));
 
     // first page
-    QWizardPage *firstPage = new QWizardPage;
-    firstPage->setTitle(tr("Project"));
-
-    QFormLayout *layout = new QFormLayout(firstPage);
-    m_pathChooser = new PathChooser;
-    layout->addRow(tr("Source Directory:"), m_pathChooser);
+    m_firstPage = new FileWizardPage;
+    m_firstPage->setTitle(tr("Import Project"));
+    m_firstPage->setNameLabel(tr("Project name:"));
+    m_firstPage->setPathLabel(tr("Location:"));
 
-    m_firstPageId = addPage(firstPage);
+    addPage(m_firstPage);
 
 #if 0
     // second page
@@ -146,7 +145,14 @@ GenericProjectWizardDialog::~GenericProjectWizardDialog()
 { }
 
 QString GenericProjectWizardDialog::path() const
-{ return m_pathChooser->path(); }
+{
+    return m_firstPage->path();
+}
+
+QString GenericProjectWizardDialog::projectName() const
+{
+    return m_firstPage->name();
+}
 
 void GenericProjectWizardDialog::updateFilesView(const QModelIndex &current,
                                                  const QModelIndex &)
@@ -182,12 +188,11 @@ bool GenericProjectWizardDialog::validateCurrentPage()
 {
     using namespace Core::Utils;
 
-    if (currentId() == m_firstPageId) {
-        return ! m_pathChooser->path().isEmpty();
-
-    } else if (currentId() == m_secondPageId) {
+#if 0
+    if (currentId() == m_secondPageId) {
         return true;
     }
+#endif
 
     return QWizard::validateCurrentPage();
 }
@@ -271,7 +276,7 @@ Core::GeneratedFiles GenericProjectWizard::generateFiles(const QWizard *w,
     const GenericProjectWizardDialog *wizard = qobject_cast<const GenericProjectWizardDialog *>(w);
     const QString projectPath = wizard->path();
     const QDir dir(projectPath);
-    const QString projectName = QFileInfo(projectPath).baseName();
+    const QString projectName = wizard->projectName();
     const QString creatorFileName = QFileInfo(dir, projectName + QLatin1String(".creator")).absoluteFilePath();
     const QString filesFileName = QFileInfo(dir, projectName + QLatin1String(".files")).absoluteFilePath();
     const QString includesFileName = QFileInfo(dir, projectName + QLatin1String(".includes")).absoluteFilePath();
diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.h b/src/plugins/genericprojectmanager/genericprojectwizard.h
index c268ce5f2aa..73cf61e82c8 100644
--- a/src/plugins/genericprojectmanager/genericprojectwizard.h
+++ b/src/plugins/genericprojectmanager/genericprojectwizard.h
@@ -2,23 +2,31 @@
 #define GENERICPROJECTWIZARD_H
 
 #include <coreplugin/basefilewizard.h>
-#include <utils/pathchooser.h>
-#include <QWizard>
+
+#include <QtGui/QWizard>
 
 QT_BEGIN_NAMESPACE
-class QListView;
-class QTreeView;
+class QDir;
 class QDirModel;
+class QFileInfo;
+class QListView;
 class QModelIndex;
-class QDir;
 class QStringList;
-class QFileInfo;
+class QTreeView;
 QT_END_NAMESPACE
 
+namespace Core {
+namespace Utils {
+
+class FileWizardPage;
+
+} // namespace Utils
+} // namespace Core
+
 namespace GenericProjectManager {
 namespace Internal {
 
-class GenericProjectWizardDialog: public QWizard
+class GenericProjectWizardDialog : public QWizard
 {
     Q_OBJECT
 
@@ -27,6 +35,7 @@ public:
     virtual ~GenericProjectWizardDialog();
 
     QString path() const;
+    QString projectName() const;
 
 private Q_SLOTS:
     void updateFilesView(const QModelIndex &current,
@@ -37,10 +46,9 @@ protected:
     virtual bool validateCurrentPage();
 
 private:
-    int m_firstPageId;
     int m_secondPageId;
 
-    Core::Utils::PathChooser *m_pathChooser;
+    Core::Utils::FileWizardPage *m_firstPage;
 
     QTreeView *m_dirView;
     QDirModel *m_dirModel;
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index 7e663fc34b0..e94b08e67ae 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -98,7 +98,8 @@ class Qt4PriFileNode;
 class Qt4ProFileNode;
 
 // Implements ProjectNode for qt4 pro files
-class Qt4PriFileNode : public ProjectExplorer::ProjectNode {
+class Qt4PriFileNode : public ProjectExplorer::ProjectNode
+{
     Q_OBJECT
     Q_DISABLE_COPY(Qt4PriFileNode)
 public:
@@ -164,7 +165,8 @@ private:
 };
 
 // Implements ProjectNode for qt4 pro files
-class Qt4ProFileNode : public Qt4PriFileNode {
+class Qt4ProFileNode : public Qt4PriFileNode
+{
     Q_OBJECT
     Q_DISABLE_COPY(Qt4ProFileNode)
 public:
@@ -208,7 +210,8 @@ private:
     friend class Qt4NodeHierarchy;
 };
 
-class Qt4NodesWatcher : public ProjectExplorer::NodesWatcher {
+class Qt4NodesWatcher : public ProjectExplorer::NodesWatcher
+{
     Q_OBJECT
     Q_DISABLE_COPY(Qt4NodesWatcher)
 public:
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index df23a18ba36..3351d148134 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -78,8 +78,7 @@ class Qt4Manager;
 class Qt4Project;
 class Qt4RunStep;
 
-class Qt4ProjectFile
-    : public Core::IFile
+class Qt4ProjectFile : public Core::IFile
 {
     Q_OBJECT
 
@@ -108,8 +107,7 @@ private:
     QString m_filePath;
 };
 
-class Qt4Project
-  : public ProjectExplorer::Project
+class Qt4Project : public ProjectExplorer::Project
 {
     Q_OBJECT
 
-- 
GitLab