From a96cc1a33244ff6150173811a23839d44da2b6e1 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Fri, 9 Jul 2010 12:22:58 +0200
Subject: [PATCH] VCS[Perforce]: Add a setting to automatically open files

when attempting to save a file under Perforce.

Reviewed-by: con
Task-number: QTCREATORBUG-1823
---
 .../editormanager/editormanager.cpp           | 21 +++++++++++++------
 src/plugins/coreplugin/iversioncontrol.h      | 15 +++++++++++++
 src/plugins/perforce/perforcesettings.cpp     | 19 +++++++++++++++--
 src/plugins/perforce/perforcesettings.h       |  3 +++
 .../perforce/perforceversioncontrol.cpp       |  8 +++++++
 src/plugins/perforce/perforceversioncontrol.h |  1 +
 src/plugins/perforce/settingspage.cpp         |  2 ++
 src/plugins/perforce/settingspage.ui          | 17 +++++++--------
 src/plugins/qt4projectmanager/qt4nodes.cpp    |  2 +-
 9 files changed, 70 insertions(+), 18 deletions(-)

diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index a9eb40b6868..ab04d11f7ff 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -1389,13 +1389,22 @@ EditorManager::ReadOnlyAction
                                       QWidget *parent,
                                       bool displaySaveAsButton)
 {
+    // Version Control: If automatic open is desired, open right away.
+    bool promptVCS = false;
+    if (versionControl && versionControl->supportsOperation(IVersionControl::OpenOperation)) {
+        if (versionControl->settingsFlags() & IVersionControl::AutoOpen)
+            return RO_OpenVCS;
+        promptVCS = true;
+    }
+
+    // Create message box.
     QMessageBox msgBox(QMessageBox::Question, tr("File is Read Only"),
-                       tr("The file %1 is read only.").arg(QDir::toNativeSeparators(fileName)),
+                       tr("The file <i>%1</i> is read only.").arg(QDir::toNativeSeparators(fileName)),
                        QMessageBox::Cancel, parent);
 
-    QPushButton *sccButton = 0;
-    if (versionControl && versionControl->supportsOperation(IVersionControl::OpenOperation))
-        sccButton = msgBox.addButton(tr("Open with VCS (%1)").arg(versionControl->displayName()), QMessageBox::AcceptRole);
+    QPushButton *vcsButton = 0;
+    if (promptVCS)
+        vcsButton = msgBox.addButton(tr("Open with VCS (%1)").arg(versionControl->displayName()), QMessageBox::AcceptRole);
 
     QPushButton *makeWritableButton =  msgBox.addButton(tr("Make writable"), QMessageBox::AcceptRole);
 
@@ -1403,11 +1412,11 @@ EditorManager::ReadOnlyAction
     if (displaySaveAsButton)
         saveAsButton = msgBox.addButton(tr("Save as ..."), QMessageBox::ActionRole);
 
-    msgBox.setDefaultButton(sccButton ? sccButton : makeWritableButton);
+    msgBox.setDefaultButton(vcsButton ? vcsButton : makeWritableButton);
     msgBox.exec();
 
     QAbstractButton *clickedButton = msgBox.clickedButton();
-    if (clickedButton == sccButton)
+    if (clickedButton == vcsButton)
         return RO_OpenVCS;
     if (clickedButton == makeWritableButton)
         return RO_MakeWriteable;
diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h
index 0cd29f94388..c402c1fb77c 100644
--- a/src/plugins/coreplugin/iversioncontrol.h
+++ b/src/plugins/coreplugin/iversioncontrol.h
@@ -34,13 +34,20 @@
 
 #include <QtCore/QObject>
 #include <QtCore/QString>
+#include <QtCore/QFlags>
 
 namespace Core {
 
 class CORE_EXPORT IVersionControl : public QObject
 {
     Q_OBJECT
+    Q_ENUMS(SettingsFlag Operation)
 public:
+    enum SettingsFlag {
+        AutoOpen = 0x1
+    };
+    Q_DECLARE_FLAGS(SettingsFlags, SettingsFlag)
+
     enum Operation {
         AddOperation, DeleteOperation, OpenOperation, MoveOperation,
         CreateRepositoryOperation,
@@ -76,6 +83,12 @@ public:
      */
     virtual bool vcsOpen(const QString &fileName) = 0;
 
+    /*!
+     * Returns settings.
+     */
+
+    virtual SettingsFlags settingsFlags() const { return 0; }
+
     /*!
      * Called after a file has been added to a project If the version control
      * needs to know which files it needs to track you should reimplement this
@@ -137,6 +150,8 @@ signals:
     // virtual bool sccManaged(const QString &filename) = 0;
 };
 
+Q_DECLARE_OPERATORS_FOR_FLAGS(Core::IVersionControl::SettingsFlags)
+
 } // namespace Core
 
 #endif // IVERSIONCONTROL_H
diff --git a/src/plugins/perforce/perforcesettings.cpp b/src/plugins/perforce/perforcesettings.cpp
index 745f6ab1a67..7cf1f8712d3 100644
--- a/src/plugins/perforce/perforcesettings.cpp
+++ b/src/plugins/perforce/perforcesettings.cpp
@@ -46,6 +46,7 @@ static const char *portKeyC = "Port";
 static const char *clientKeyC = "Client";
 static const char *userKeyC = "User";
 static const char *promptToSubmitKeyC = "PromptForSubmit";
+static const char *autoOpenKeyC = "PromptToOpen";
 static const char *timeOutKeyC = "TimeOut";
 static const char *logCountKeyC = "LogCount";
 
@@ -68,7 +69,8 @@ Settings::Settings() :
     logCount(defaultLogCount),
     defaultEnv(true),
     timeOutS(defaultTimeOutS),
-    promptToSubmit(true)
+    promptToSubmit(true),
+    autoOpen(true)
 {
 }
 
@@ -78,7 +80,8 @@ bool Settings::equals(const Settings &rhs) const
             && logCount == rhs.logCount
             && p4Command == rhs.p4Command && p4Port == rhs.p4Port
             && p4Client == rhs.p4Client && p4User == rhs.p4User
-            && timeOutS == rhs.timeOutS && promptToSubmit == rhs.promptToSubmit;
+            && timeOutS == rhs.timeOutS && promptToSubmit == rhs.promptToSubmit
+            && autoOpen == rhs.autoOpen;
 };
 
 QStringList Settings::commonP4Arguments() const
@@ -115,6 +118,7 @@ void PerforceSettings::fromSettings(QSettings *settings)
     m_settings.timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt();
     m_settings.promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool();
     m_settings.logCount = settings->value(QLatin1String(logCountKeyC), int(defaultLogCount)).toInt();
+    m_settings.autoOpen = settings->value(QLatin1String(autoOpenKeyC), true).toBool();
     settings->endGroup();
 }
 
@@ -129,6 +133,7 @@ void PerforceSettings::toSettings(QSettings *settings) const
     settings->setValue(QLatin1String(timeOutKeyC), m_settings.timeOutS);
     settings->setValue(QLatin1String(promptToSubmitKeyC), m_settings.promptToSubmit);
     settings->setValue(QLatin1String(logCountKeyC), m_settings.logCount);
+    settings->setValue(QLatin1String(autoOpenKeyC), m_settings.autoOpen);
     settings->endGroup();
 }
 
@@ -180,6 +185,16 @@ void PerforceSettings::setPromptToSubmit(bool p)
     m_settings.promptToSubmit = p;
 }
 
+bool PerforceSettings::autoOpen() const
+{
+    return m_settings.autoOpen;
+}
+
+void PerforceSettings::setAutoOpen(bool b)
+{
+    m_settings.autoOpen = b;
+}
+
 QString PerforceSettings::topLevel() const
 {
     return m_topLevel;
diff --git a/src/plugins/perforce/perforcesettings.h b/src/plugins/perforce/perforcesettings.h
index 803645237fa..cdb1ee0675b 100644
--- a/src/plugins/perforce/perforcesettings.h
+++ b/src/plugins/perforce/perforcesettings.h
@@ -61,6 +61,7 @@ struct Settings {
     bool defaultEnv;
     int timeOutS;
     bool promptToSubmit;
+    bool autoOpen;
 };
 
 inline bool operator==(const Settings &s1, const Settings &s2) { return s1.equals(s2); }
@@ -122,6 +123,8 @@ public:
     bool defaultEnv() const;
     bool promptToSubmit() const;
     void setPromptToSubmit(bool p);
+    bool autoOpen() const;
+    void setAutoOpen(bool p);
 
     // Return basic arguments, including -d and server connection parameters.
     QStringList commonP4Arguments(const QString &workingDir) const;
diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp
index 2dc414f59cd..0f0a5e81905 100644
--- a/src/plugins/perforce/perforceversioncontrol.cpp
+++ b/src/plugins/perforce/perforceversioncontrol.cpp
@@ -70,6 +70,14 @@ bool PerforceVersionControl::vcsOpen(const QString &fileName)
     return m_plugin->vcsOpen(fi.absolutePath(), fi.fileName());
 }
 
+Core::IVersionControl::SettingsFlags PerforceVersionControl::settingsFlags() const
+{
+    SettingsFlags rc;
+    if (m_plugin->settings().autoOpen())
+        rc|= AutoOpen;
+    return rc;
+};
+
 bool PerforceVersionControl::vcsAdd(const QString &fileName)
 {
     const QFileInfo fi(fileName);
diff --git a/src/plugins/perforce/perforceversioncontrol.h b/src/plugins/perforce/perforceversioncontrol.h
index 1e14cd2810f..b3a01f7a6c0 100644
--- a/src/plugins/perforce/perforceversioncontrol.h
+++ b/src/plugins/perforce/perforceversioncontrol.h
@@ -50,6 +50,7 @@ public:
 
     virtual bool supportsOperation(Operation operation) const;
     virtual bool vcsOpen(const QString &fileName);
+    virtual SettingsFlags settingsFlags() const;
     virtual bool vcsAdd(const QString &fileName);
     virtual bool vcsDelete(const QString &filename);
     virtual bool vcsMove(const QString &from, const QString &to);
diff --git a/src/plugins/perforce/settingspage.cpp b/src/plugins/perforce/settingspage.cpp
index 5bdfe0f5478..47fa6c9d24b 100644
--- a/src/plugins/perforce/settingspage.cpp
+++ b/src/plugins/perforce/settingspage.cpp
@@ -85,6 +85,7 @@ Settings SettingsPageWidget::settings() const
     settings.timeOutS = m_ui.timeOutSpinBox->value();
     settings.logCount = m_ui.logCountSpinBox->value();
     settings.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked();
+    settings.autoOpen = m_ui.autoOpenCheckBox->isChecked();
     return settings;
 }
 
@@ -98,6 +99,7 @@ void SettingsPageWidget::setSettings(const PerforceSettings &s)
     m_ui.logCountSpinBox->setValue(s.logCount());
     m_ui.timeOutSpinBox->setValue(s.timeOutS());
     m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit());
+    m_ui.autoOpenCheckBox->setChecked(s.autoOpen());
 }
 
 void SettingsPageWidget::setStatusText(const QString &t)
diff --git a/src/plugins/perforce/settingspage.ui b/src/plugins/perforce/settingspage.ui
index 6f270415089..e62622038ba 100644
--- a/src/plugins/perforce/settingspage.ui
+++ b/src/plugins/perforce/settingspage.ui
@@ -2,14 +2,6 @@
 <ui version="4.0">
  <class>Perforce::Internal::SettingsPage</class>
  <widget class="QWidget" name="Perforce::Internal::SettingsPage">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>437</width>
-    <height>407</height>
-   </rect>
-  </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QGroupBox" name="configGroupBox">
@@ -25,7 +17,7 @@
        </widget>
       </item>
       <item row="0" column="1">
-       <widget class="Utils::PathChooser" name="pathChooser"/>
+       <widget class="Utils::PathChooser" name="pathChooser" native="true"/>
       </item>
      </layout>
     </widget>
@@ -134,6 +126,13 @@
         </property>
        </widget>
       </item>
+      <item row="3" column="0" colspan="2">
+       <widget class="QCheckBox" name="autoOpenCheckBox">
+        <property name="text">
+         <string>Automatically open files when editing</string>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index 9d91bf4effd..bd2b15dc517 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -674,7 +674,7 @@ bool Qt4PriFileNode::priFileWritable(const QString &path)
     switch (Core::EditorManager::promptReadOnlyFile(path, versionControl, core->mainWindow(), false)) {
     case Core::EditorManager::RO_OpenVCS:
         if (!versionControl->vcsOpen(path)) {
-            QMessageBox::warning(core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with SCC."));
+            QMessageBox::warning(core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with VCS."));
             return false;
         }
         break;
-- 
GitLab