#include <config.h>
#include "paragraph_pimpl.h"
+#include "paragraph.h"
#include "bufferparams.h"
#include "debug.h"
lyxerr[Debug::CHANGES] << "track changes for par "
<< id_ << " type " << type << endl;
changes_.reset(new Changes(type));
- changes_->set(type, 0, size());
+ changes_->set(type, 0, size() + 1);
}
}
-void Paragraph::Pimpl::cleanChanges()
+void Paragraph::Pimpl::cleanChanges(Paragraph::ChangeTracking ct)
{
- // if we're not tracking, we don't want to reset...
- if (!tracking())
+ // if the paragraph was not tracked and we don't know the buffer's
+ // change tracking state, we do nothing
+ if ((ct == Paragraph::trackingUnknown) && !tracking())
return;
+ // untrack everything if we are in a buffer where ct is disabled
+ else if (ct == Paragraph::trackingOff) {
+ untrackChanges();
+ return;
+ }
+
+ // in a buffer where ct is enabled, set everything to INSERTED
changes_.reset(new Changes(Change::INSERTED));
- changes_->set(Change::INSERTED, 0, size());
+ changes_->set(Change::INSERTED, 0, size() + 1);
}
}
-void Paragraph::Pimpl::setChange(pos_type pos, Change::Type type)
+void Paragraph::Pimpl::setChangeType(pos_type pos, Change::Type type)
{
if (!tracking())
return;
}
-Change::Type Paragraph::Pimpl::lookupChange(pos_type pos) const
+void Paragraph::Pimpl::setChange(pos_type pos, Change change)
{
if (!tracking())
- return Change::UNCHANGED;
+ return;
- return changes_->lookup(pos);
+ changes_->set(change, pos);
}
-Change const Paragraph::Pimpl::lookupChangeFull(pos_type pos) const
+Change const Paragraph::Pimpl::lookupChange(pos_type pos) const
{
if (!tracking())
return Change(Change::UNCHANGED);
- return changes_->lookupFull(pos);
+ return changes_->lookup(pos);
}
-void Paragraph::Pimpl::markErased()
+void Paragraph::Pimpl::markErased(bool erased)
{
BOOST_ASSERT(tracking());
- // FIXME: we should actually remove INSERTED chars.
- // difficult because owning insettexts/tabulars need
- // to update themselves when rows etc. change
- changes_->set(Change::DELETED, 0, size());
- changes_->reset(Change::DELETED);
+ if (erased) {
+ erase(0, size());
+ } else {
+ for (pos_type i = 0; i < size(); ++i) {
+ changes_->set(Change::UNCHANGED, i);
+ if (owner_->isInset(i))
+ owner_->getInset(i)->markErased(false);
+ }
+ }
}
return;
}
- lyxerr << "acceptchange" << endl;
+ lyxerr[Debug::CHANGES] << "acceptchange" << endl;
pos_type i = start;
for (; i < end; ++i) {
- switch (lookupChange(i)) {
+ switch (lookupChange(i).type) {
case Change::UNCHANGED:
break;
break;
case Change::DELETED:
- eraseIntern(i);
- changes_->erase(i);
- --end;
- --i;
+ // Suppress access to nonexistent
+ // "end-of-paragraph char":
+ if (i < size()) {
+ eraseIntern(i);
+ changes_->erase(i);
+ --end;
+ --i;
+ }
break;
}
}
- lyxerr << "endacceptchange" << endl;
+ lyxerr[Debug::CHANGES] << "endacceptchange" << endl;
changes_->reset(Change::UNCHANGED);
}
pos_type i = start;
for (; i < end; ++i) {
- switch (lookupChange(i)) {
+ switch (lookupChange(i).type) {
case Change::UNCHANGED:
break;
case Change::INSERTED:
- eraseIntern(i);
- changes_->erase(i);
- --end;
- --i;
+ if (i < size()) {
+ eraseIntern(i);
+ changes_->erase(i);
+ --end;
+ --i;
+ }
break;
case Change::DELETED:
changes_->set(Change::UNCHANGED, i);
+ // No real char at position size():
+ if (i < size() && owner_->isInset(i))
+ owner_->getInset(i)->markErased(false);
break;
}
}
bool Paragraph::Pimpl::erase(pos_type pos)
{
- BOOST_ASSERT(pos < size());
+ BOOST_ASSERT(pos <= size());
if (tracking()) {
- Change::Type changetype(changes_->lookup(pos));
- changes_->record(Change(Change::DELETED), pos);
+ Change::Type changetype(changes_->lookup(pos).type);
// only allow the actual removal if it was /new/ text
if (changetype != Change::INSERTED) {
- if (owner_->text_[pos] == Paragraph::META_INSET) {
- owner_->getInset(pos)->markErased();
- }
+ changes_->record(Change(Change::DELETED), pos);
+ if (pos < size() && owner_->isInset(pos))
+ owner_->getInset(pos)->markErased(true);
return false;
}
}
- eraseIntern(pos);
- return true;
+ // Don't physically access nonexistent end-of-paragraph char
+ if (pos < size()) {
+ eraseIntern(pos);
+ return true;
+ }
+
+ return false;
}
break;
}
- if (inset->isTextInset()) {
+ // output change tracking marks only if desired,
+ // if dvipost is installed,
+ // and with dvi/ps (other formats don't work)
+ LaTeXFeatures features(buf, bparams, runparams);
+ bool const output = bparams.output_changes
+ && runparams.flavor == OutputParams::LATEX
+ && features.isAvailable("dvipost");
+
+ if (inset->canTrackChanges()) {
column += Changes::latexMarkChange(os, running_change,
- Change::UNCHANGED);
+ Change::UNCHANGED, output);
running_change = Change::UNCHANGED;
}
if ((bparams.inputenc == "latin1" ||
bparams.inputenc == "latin9") ||
(bparams.inputenc == "auto" &&
- (font.language()->encoding()->LatexName()
+ (font.language()->encoding()->latexName()
== "latin1" ||
- font.language()->encoding()->LatexName()
+ font.language()->encoding()->latexName()
== "latin9"))) {
os << "\\ensuremath{"
<< c