diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 147c522ab5867ea06293a0c2edc33042f7cbc889..0c2e16d1ebf1a20721be75122a61c716ab2eb1ca 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -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) diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 15e12d441f9c6e6fc3f3d7b95287b9296bf5d423..dd38c8c189ab90c8c97963497dd2d80aa53089cf 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -195,6 +195,7 @@ VCSBase::VCSBaseEditor rc->setCodec(VCSBase::VCSBaseEditor::getCodec(source)); } m_core->editorManager()->activateEditor(outputEditor); + rc->setForceReadOnly(true); return rc; } diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index caf4f0bfc0a863b9a3714562975ee0360e753ee9..85eb7f4b43eea622650cd6cdee6e035a1e93097f 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -586,6 +586,7 @@ VCSBase::VCSBaseEditor *MercurialClient::createVCSEditor(const QString &kind, QS } core->editorManager()->activateEditor(outputEditor); + baseEditor->setForceReadOnly(true); return baseEditor; } diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp index eef5f6827b15f48b4be6eeba19e1028338743e29..c9d01fde7bd109984cd91bfea20582a22b5f7e7c 100644 --- a/src/plugins/perforce/perforceplugin.cpp +++ b/src/plugins/perforce/perforceplugin.cpp @@ -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); diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index a29483bd189843fe0701898aaaa19a6f148ea870..60173d28d061f6e26d6410a1349f30b25a621611 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -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()) diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 67b3e80901bc4ff33952fdba91284d45d929e3bd..ad9745a6b70510b7dedcce74fa23bda3ed38b583 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -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; } diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index c6062298bd37b668a086b480d77f4d36a51a1523..19aa82ab7af55a84c503268f19929d91ccd910be 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -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); diff --git a/src/plugins/vcsbase/vcsbasetextdocument.cpp b/src/plugins/vcsbase/vcsbasetextdocument.cpp index 3a5590e145d375afb74d78dd7a10aad180e2c563..6a409b8fb38515f23e0b0ad86c9bf90582c6aef5 100644 --- a/src/plugins/vcsbase/vcsbasetextdocument.cpp +++ b/src/plugins/vcsbase/vcsbasetextdocument.cpp @@ -31,16 +31,31 @@ 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; } diff --git a/src/plugins/vcsbase/vcsbasetextdocument.h b/src/plugins/vcsbase/vcsbasetextdocument.h index f7bdd403f1ca5639abc31fccf264284136093be5..46845f080449e31d144b9ea96726e1993576daa6 100644 --- a/src/plugins/vcsbase/vcsbasetextdocument.h +++ b/src/plugins/vcsbase/vcsbasetextdocument.h @@ -44,6 +44,12 @@ public: bool isReadOnly() const; bool isModified() const; + + void setForceReadOnly(bool b); + bool isForceReadOnly() const; + +private: + bool m_forceReadOnly; }; } // namespace Internal