OSDN Git Service

VCS/Diff editors: Set readonly attributes correctly.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Mon, 7 Jun 2010 12:53:28 +0000 (14:53 +0200)
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>
Mon, 7 Jun 2010 12:53:28 +0000 (14:53 +0200)
Make VCS-generated editors read-only, enable editing
when opening a patch.
Make VCS-Editor non-read-only by default, add setter
for "Forced read-only" that makes it a temporary,
read-only file.

Task-number: QTCREATORBUG-1528
Reviewed-by: Thorbjorn Lindeijer <thorbjorn.lindeijer@nokia.com>
src/plugins/cvs/cvsplugin.cpp
src/plugins/git/gitclient.cpp
src/plugins/mercurial/mercurialclient.cpp
src/plugins/perforce/perforceplugin.cpp
src/plugins/subversion/subversionplugin.cpp
src/plugins/vcsbase/vcsbaseeditor.cpp
src/plugins/vcsbase/vcsbaseeditor.h
src/plugins/vcsbase/vcsbasetextdocument.cpp
src/plugins/vcsbase/vcsbasetextdocument.h

index 147c522..0c2e16d 100644 (file)
@@ -1075,6 +1075,7 @@ Core::IEditor * CVSPlugin::showOutputInEditor(const QString& title, const QStrin
         return 0;
     s.replace(QLatin1Char(' '), QLatin1Char('_'));
     e->setSuggestedFileName(s);
+    e->setForceReadOnly(true);
     if (!source.isEmpty())
         e->setSource(source);
     if (codec)
index 15e12d4..dd38c8c 100644 (file)
@@ -195,6 +195,7 @@ VCSBase::VCSBaseEditor
             rc->setCodec(VCSBase::VCSBaseEditor::getCodec(source));
     }
     m_core->editorManager()->activateEditor(outputEditor);
+    rc->setForceReadOnly(true);
     return rc;
 }
 
index caf4f0b..85eb7f4 100644 (file)
@@ -586,6 +586,7 @@ VCSBase::VCSBaseEditor *MercurialClient::createVCSEditor(const QString &kind, QS
     }
 
     core->editorManager()->activateEditor(outputEditor);
+    baseEditor->setForceReadOnly(true);
     return baseEditor;
 }
 
index eef5f68..c9d01fd 100644 (file)
@@ -1180,6 +1180,7 @@ Core::IEditor * PerforcePlugin::showOutputInEditor(const QString& title, const Q
     PerforceEditor *e = qobject_cast<PerforceEditor*>(editor->widget());
     if (!e)
         return 0;
+    e->setForceReadOnly(true);
     e->setSource(source);
     s.replace(QLatin1Char(' '), QLatin1Char('_'));
     e->setSuggestedFileName(s);
index a29483b..60173d2 100644 (file)
@@ -1120,6 +1120,7 @@ Core::IEditor * SubversionPlugin::showOutputInEditor(const QString& title, const
     SubversionEditor *e = qobject_cast<SubversionEditor*>(editor->widget());
     if (!e)
         return 0;
+    e->setForceReadOnly(true);
     s.replace(QLatin1Char(' '), QLatin1Char('_'));
     e->setSuggestedFileName(s);
     if (!source.isEmpty())
index 67b3e80..ad9745a 100644 (file)
@@ -82,7 +82,8 @@ public:
     Core::IEditor *duplicate(QWidget * /*parent*/) { return 0; }
     QString id() const { return m_id; }
 
-    bool isTemporary() const { return true; }
+    bool isTemporary() const { return m_temporary; }
+    void setTemporary(bool t) { m_temporary = t; }
 
 signals:
     void describeRequested(const QString &source, const QString &change);
@@ -91,12 +92,14 @@ signals:
 private:
     QString m_id;
     QList<int> m_context;
+    bool m_temporary;
 };
 
 VCSBaseEditorEditable::VCSBaseEditorEditable(VCSBaseEditor *editor,
                                              const VCSBaseEditorParameters *type)  :
     BaseTextEditorEditable(editor),
-    m_id(type->id)
+    m_id(type->id),
+    m_temporary(false)
 {
     Core::UniqueIDManager *uidm = Core::UniqueIDManager::instance();
     m_context << uidm->uniqueIdentifier(QLatin1String(type->context))
@@ -118,8 +121,6 @@ public:
     virtual QWidget *toolBar()                { return m_toolBar; }
     QComboBox *diffFileBrowseComboBox() const  { return m_diffFileBrowseComboBox; }
 
-    bool isTemporary() const { return true; }
-
 private:
     QToolBar *m_toolBar;
     QComboBox *m_diffFileBrowseComboBox;
@@ -181,7 +182,6 @@ VCSBaseEditor::VCSBaseEditor(const VCSBaseEditorParameters *type, QWidget *paren
     if (VCSBase::Constants::Internal::debug)
         qDebug() << "VCSBaseEditor::VCSBaseEditor" << type->type << type->id;
 
-    setReadOnly(true);
     viewport()->setMouseTracking(true);
     setBaseTextDocument(new Internal::VCSBaseTextDocument);
     setMimeType(QLatin1String(d->m_parameters->mimeType));
@@ -212,6 +212,23 @@ VCSBaseEditor::~VCSBaseEditor()
     delete d;
 }
 
+void VCSBaseEditor::setForceReadOnly(bool b)
+{
+    Internal::VCSBaseTextDocument *vbd = qobject_cast<Internal::VCSBaseTextDocument*>(baseTextDocument());
+    VCSBaseEditorEditable *eda = qobject_cast<VCSBaseEditorEditable *>(editableInterface());
+    QTC_ASSERT(vbd != 0 && eda != 0, return);
+    setReadOnly(b);
+    vbd->setForceReadOnly(b);
+    eda->setTemporary(b);
+}
+
+bool VCSBaseEditor::isForceReadOnly() const
+{
+    const Internal::VCSBaseTextDocument *vbd = qobject_cast<const Internal::VCSBaseTextDocument*>(baseTextDocument());
+    QTC_ASSERT(vbd, return false);
+    return vbd->isForceReadOnly();
+}
+
 QString VCSBaseEditor::source() const
 {
     return d->m_source;
@@ -502,7 +519,9 @@ void VCSBaseEditor::mouseDoubleClickEvent(QMouseEvent *e)
 
 void VCSBaseEditor::keyPressEvent(QKeyEvent *e)
 {
-    if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) {
+    // Do not intercept return in editable patches.
+    if (d->m_parameters->type == DiffOutput && isReadOnly()
+        && (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)) {
         jumpToChangeFromDiff(textCursor());
         return;
     }
index c606229..19aa82a 100644 (file)
@@ -105,6 +105,13 @@ public:
 
     virtual ~VCSBaseEditor();
 
+    /* Force read-only: Make it a read-only, temporary file.
+     * Should be set to true by version control views. It is not on
+     * by default since it should not  trigger when patches are opened as
+     * files. */
+    void setForceReadOnly(bool b);
+    bool isForceReadOnly() const;
+
     QString source() const;
     void setSource(const  QString &source);
 
index 3a5590e..6a409b8 100644 (file)
 
 using namespace VCSBase::Internal;
 
-VCSBaseTextDocument::VCSBaseTextDocument()
+VCSBaseTextDocument::VCSBaseTextDocument() :
+    m_forceReadOnly(false)
 {
 }
 
 bool VCSBaseTextDocument::isReadOnly() const
 {
-    return true;
+    return m_forceReadOnly ?
+            true :
+            TextEditor::BaseTextDocument::isReadOnly();
 }
 
 bool VCSBaseTextDocument::isModified() const
 {
-    return false;
+    return m_forceReadOnly ?
+            false :
+            TextEditor::BaseTextDocument::isModified();
+}
+
+void VCSBaseTextDocument::setForceReadOnly(bool b)
+{
+    m_forceReadOnly = b;
+}
+
+bool VCSBaseTextDocument::isForceReadOnly() const
+{
+    return m_forceReadOnly;
 }
index f7bdd40..46845f0 100644 (file)
@@ -44,6 +44,12 @@ public:
 
     bool isReadOnly() const;
     bool isModified() const;
+
+    void setForceReadOnly(bool b);
+    bool isForceReadOnly() const;
+
+private:
+    bool m_forceReadOnly;
 };
 
 } // namespace Internal