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();

Reply via email to