commit 0cb85e920666e8a47cb74ce96711fdcae8168862 Author: Guillaume Munch <g...@lyx.org> Date: Wed Mar 1 22:03:44 2017 +0100
Disable edition when external modifications are detected Introduce a distinction between being read-only and having the read-only flag. A buffer is read-only if either it has been externally modified or if it has the read-only flag. --- src/Buffer.cpp | 18 ++++++++++++------ src/Buffer.h | 6 +++++- src/BufferView.cpp | 5 ++++- src/LyXVC.cpp | 4 ++-- src/VCBackend.cpp | 4 ++-- src/frontends/qt4/GuiView.cpp | 13 +++++++------ src/frontends/qt4/GuiWorkArea.cpp | 6 +++--- src/frontends/qt4/Menus.cpp | 4 ++-- 8 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 5c46fb3..b220ee3 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -2535,7 +2535,7 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag) switch (cmd.action()) { case LFUN_BUFFER_TOGGLE_READ_ONLY: - flag.setOnOff(isReadonly()); + flag.setOnOff(hasReadonlyFlag()); break; // FIXME: There is need for a command-line import. @@ -2659,7 +2659,7 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) dr.setMessage(log); } else - setReadonly(!isReadonly()); + setReadonly(!hasReadonlyFlag()); break; case LFUN_BUFFER_EXPORT: { @@ -3262,12 +3262,18 @@ void Buffer::setLayoutPos(string const & path) } -bool Buffer::isReadonly() const +bool Buffer::hasReadonlyFlag() const { return d->read_only; } +bool Buffer::isReadonly() const +{ + return hasReadonlyFlag() || notifiesExternalModification(); +} + + void Buffer::setParent(Buffer const * buffer) { // Avoids recursive include. @@ -4144,7 +4150,7 @@ void Buffer::moveAutosaveFile(support::FileName const & oldauto) const bool Buffer::autoSave() const { Buffer const * buf = d->cloned_buffer_ ? d->cloned_buffer_ : this; - if (buf->d->bak_clean || isReadonly()) + if (buf->d->bak_clean || hasReadonlyFlag()) return true; message(_("Autosaving current document...")); @@ -4541,7 +4547,7 @@ Buffer::ReadStatus Buffer::loadEmergency() ReadStatus const ret_llf = loadThisLyXFile(emergencyFile); bool const success = (ret_llf == ReadSuccess); if (success) { - if (isReadonly()) { + if (hasReadonlyFlag()) { Alert::warning(_("File is read-only"), bformat(_("An emergency file is successfully loaded, " "but the original file %1$s is marked read-only. " @@ -4604,7 +4610,7 @@ Buffer::ReadStatus Buffer::loadAutosave() ReadStatus const ret_llf = loadThisLyXFile(autosaveFile); // the file is not saved if we load the autosave file. if (ret_llf == ReadSuccess) { - if (isReadonly()) { + if (hasReadonlyFlag()) { Alert::warning(_("File is read-only"), bformat(_("A backup file is successfully loaded, " "but the original file %1$s is marked read-only. " diff --git a/src/Buffer.h b/src/Buffer.h index 7327de3..d483de9 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -471,9 +471,13 @@ public: /// thing from whichever Buffer it is called. ListOfBuffers allRelatives() const; - /// Is buffer read-only? + /// Is buffer read-only? True if it has either the read-only flag or the + /// externally modified flag. bool isReadonly() const; + /// Does the buffer have the read-only flag? + bool hasReadonlyFlag() const; + /// Set buffer read-only flag void setReadonly(bool flag = true); diff --git a/src/BufferView.cpp b/src/BufferView.cpp index d017db0..a6ae1d4 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -1028,7 +1028,10 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) if (buffer_.isReadonly() && !lyxaction.funcHasFlag(act, LyXAction::ReadOnly) && !lyxaction.funcHasFlag(act, LyXAction::NoBuffer)) { - flag.message(from_utf8(N_("Document is read-only"))); + if (buffer_.hasReadonlyFlag()) + flag.message(from_utf8(N_("Document is read-only"))); + else + flag.message(from_utf8(N_("Document has been modified externally"))); flag.setEnabled(false); return true; } diff --git a/src/LyXVC.cpp b/src/LyXVC.cpp index 3c4bbf8..97a0554 100644 --- a/src/LyXVC.cpp +++ b/src/LyXVC.cpp @@ -262,7 +262,7 @@ string LyXVC::checkOut() if (!vcs) return string(); //RCS allows checkOut only in ReadOnly mode - if (vcs->toggleReadOnlyEnabled() && !owner_->isReadonly()) + if (vcs->toggleReadOnlyEnabled() && !owner_->hasReadonlyFlag()) return string(); LYXERR(Debug::LYXVC, "LyXVC: checkOut"); @@ -335,7 +335,7 @@ string LyXVC::toggleReadOnly() } case VCS::NOLOCKING: Buffer * b = vcs->owner(); - bool const newstate = !b->isReadonly(); + bool const newstate = !b->hasReadonlyFlag(); string result = "LyXVC: toggle to "; result += (newstate ? "readonly" : "readwrite"); LYXERR(Debug::LYXVC, result); diff --git a/src/VCBackend.cpp b/src/VCBackend.cpp index 9f9a3ff..b395a0d 100644 --- a/src/VCBackend.cpp +++ b/src/VCBackend.cpp @@ -284,7 +284,7 @@ LyXVC::CommandResult RCS::checkIn(string const & msg, string & log) bool RCS::checkInEnabled() { - return owner_ && !owner_->isReadonly(); + return owner_ && !owner_->hasReadonlyFlag(); } @@ -326,7 +326,7 @@ string RCS::checkOut() bool RCS::checkOutEnabled() { - return owner_ && owner_->isReadonly(); + return owner_ && owner_->hasReadonlyFlag(); } diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index d990d79..52a783a 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -1138,7 +1138,7 @@ void GuiView::updateWindowTitle(GuiWorkArea * wa) // Tell Qt whether the current document is changed setWindowModified(!buf.isClean()); - if (buf.isReadonly()) + if (buf.hasReadonlyFlag()) read_only_->show(); else read_only_->hide(); @@ -2040,12 +2040,13 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) enable = doc_buffer && doc_buffer->lyxvc().checkOutEnabled(); break; case LFUN_VC_LOCKING_TOGGLE: - enable = doc_buffer && !doc_buffer->isReadonly() + enable = doc_buffer && !doc_buffer->hasReadonlyFlag() && doc_buffer->lyxvc().lockingToggleEnabled(); flag.setOnOff(enable && doc_buffer->lyxvc().locking()); break; case LFUN_VC_REVERT: - enable = doc_buffer && doc_buffer->lyxvc().inUse() && !doc_buffer->isReadonly(); + enable = doc_buffer && doc_buffer->lyxvc().inUse() + && !doc_buffer->hasReadonlyFlag(); break; case LFUN_VC_UNDO_LAST: enable = doc_buffer && doc_buffer->lyxvc().undoLastEnabled(); @@ -3112,7 +3113,7 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr) case LFUN_VC_COPY: { if (!buffer || !ensureBufferClean(buffer)) break; - if (buffer->lyxvc().inUse() && !buffer->isReadonly()) { + if (buffer->lyxvc().inUse() && !buffer->hasReadonlyFlag()) { if (buffer->lyxvc().isCheckInWithConfirmation()) { // Some changes are not yet committed. // We test here and not in getStatus(), since @@ -3141,7 +3142,7 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr) case LFUN_VC_CHECK_IN: if (!buffer || !ensureBufferClean(buffer)) break; - if (buffer->lyxvc().inUse() && !buffer->isReadonly()) { + if (buffer->lyxvc().inUse() && !buffer->hasReadonlyFlag()) { string log; LyXVC::CommandResult ret = buffer->lyxvc().checkIn(log); dr.setMessage(log); @@ -3165,7 +3166,7 @@ void GuiView::dispatchVC(FuncRequest const & cmd, DispatchResult & dr) case LFUN_VC_LOCKING_TOGGLE: LASSERT(buffer, return); - if (!ensureBufferClean(buffer) || buffer->isReadonly()) + if (!ensureBufferClean(buffer) || buffer->hasReadonlyFlag()) break; if (buffer->lyxvc().inUse()) { string res = buffer->lyxvc().lockingToggle(); diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp index dc6ee32..67d9494 100644 --- a/src/frontends/qt4/GuiWorkArea.cpp +++ b/src/frontends/qt4/GuiWorkArea.cpp @@ -1391,12 +1391,12 @@ void GuiWorkArea::updateWindowTitle() { Buffer const & buf = bufferView().buffer(); if (buf.fileName() != d->file_name_ - || buf.isReadonly() != d->read_only_ + || buf.hasReadonlyFlag() != d->read_only_ || buf.lyxvc().vcstatus() != d->vc_status_ || buf.isClean() != d->clean_ || buf.notifiesExternalModification() != d->externally_modified_) { d->file_name_ = buf.fileName(); - d->read_only_ = buf.isReadonly(); + d->read_only_ = buf.hasReadonlyFlag(); d->vc_status_ = buf.lyxvc().vcstatus(); d->clean_ = buf.isClean(); d->externally_modified_ = buf.notifiesExternalModification(); @@ -2074,7 +2074,7 @@ void TabWorkArea::updateTabTexts() if (!buf.fileName().empty() && !buf.isClean()) tab_text += "*"; QString tab_tooltip = it->abs(); - if (buf.isReadonly()) { + if (buf.hasReadonlyFlag()) { setTabIcon(tab_index, QIcon(getPixmap("images/", "emblem-readonly", "svgz,png"))); tab_tooltip = qt_("%1 (read only)").arg(tab_tooltip); } else diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp index a0eaa65..e510054 100644 --- a/src/frontends/qt4/Menus.cpp +++ b/src/frontends/qt4/Menus.cpp @@ -1221,7 +1221,7 @@ void MenuDefinition::expandFlexInsert( } } // FIXME This is a little clunky. - if (items_.empty() && type == InsetLayout::CUSTOM && !buf->isReadonly()) + if (items_.empty() && type == InsetLayout::CUSTOM && !buf->hasReadonlyFlag()) add(MenuItem(MenuItem::Help, qt_("No Custom Insets Defined!"))); } @@ -1412,7 +1412,7 @@ void MenuDefinition::expandToolbars() void MenuDefinition::expandBranches(Buffer const * buf) { - if (!buf || buf->isReadonly()) + if (!buf || buf->hasReadonlyFlag()) return; BufferParams const & master_params = buf->masterBuffer()->params();