commit 0cb85e920666e8a47cb74ce96711fdcae8168862
Author: Guillaume Munch <[email protected]>
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();