X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fchanges.C;h=1ad18c6bf29048537b13eca6de4c4b2d8cd202c5;hb=c4320d24cd2d29c2e77958b4a8fd44f2bd587ca7;hp=66ca308ce990c633f70c9dc1e351d252d2157ff1;hpb=f29d236e84b34a0ad5b3c696fb46ba053fe76310;p=lyx.git diff --git a/src/changes.C b/src/changes.C index 66ca308ce9..1ad18c6bf2 100644 --- a/src/changes.C +++ b/src/changes.C @@ -21,14 +21,41 @@ namespace lyx { +using std::abs; using std::endl; using std::string; +using std::max; + +/* + * Class Change has a changetime field that specifies the exact time at which + * a specific change was made. The change time is used as a guidance for the + * user while editing his document. Presently, it is not considered for LaTeX + * export. + * When merging two adjacent changes, the changetime is not considered, + * only the equality of the change type and author is checked (in method + * isSimilarTo(...)). If two changes are in fact merged (in method merge()), + * the later change time is preserved. + */ + +bool Change::isSimilarTo(Change const & change) +{ + if (type != change.type) { + return false; + } + + if (type == Change::UNCHANGED) { + return true; + } + + return author == change.author; +} bool operator==(Change const & l, Change const & r) { - return l.type == r.type && l.author == r.author - && l.changetime == r.changetime; + return l.type == r.type && + l.author == r.author && + l.changetime == r.changetime; } @@ -87,11 +114,6 @@ void Changes::set(Change const & change, pos_type const start, pos_type const en ChangeTable::iterator it = table_.begin(); for (; it != table_.end(); ) { - // find super change, check for equal types, and do nothing - if (it->range.contains(newRange) && it->change.type == change.type) { - return; - } - // current change starts like or follows new change if (it->range.start >= start) { break; @@ -218,7 +240,6 @@ Change const Changes::lookup(pos_type const pos) const return it->change; } - BOOST_ASSERT(false && "missing changes for pos"); return Change(Change::UNCHANGED); } @@ -229,44 +250,38 @@ bool Changes::isChanged(pos_type const start, pos_type const end) const ChangeTable::const_iterator const itend = table_.end(); for (; it != itend; ++it) { - if (lyxerr.debugging(Debug::CHANGES)) { - lyxerr[Debug::CHANGES] << "Looking for " << start << "," - << end << " in " << it->range.start << "," - << it->range.end << "of type " << it->change.type << endl; - } - - if (it->range.intersects(Range(start, end)) - && it->change.type != Change::UNCHANGED) { + if (it->range.intersects(Range(start, end))) { if (lyxerr.debugging(Debug::CHANGES)) { - lyxerr[Debug::CHANGES] << "Found intersection of " - << start << "," << end << " with " - << it->range.start << "," << it->range.end - << " of type " << it->change.type << endl; + lyxerr[Debug::CHANGES] << "found intersection of range (" + << start << ", " << end << ") with (" + << it->range.start << ", " << it->range.end + << ") of type " << it->change.type << endl; } return true; } } - return false; } void Changes::merge() { - if (lyxerr.debugging(Debug::CHANGES)) - lyxerr[Debug::CHANGES] << "Starting merge" << endl; + if (lyxerr.debugging(Debug::CHANGES)) { + lyxerr[Debug::CHANGES] << "merging changes..." << endl; + } ChangeTable::iterator it = table_.begin(); while (it != table_.end()) { if (lyxerr.debugging(Debug::CHANGES)) { - lyxerr[Debug::CHANGES] << "Range of type " << it->change.type << " is " - << it->range.start << "," << it->range.end << endl; + lyxerr[Debug::CHANGES] << " found change of type " << it->change.type + << " and range (" << it->range.start << ", " << it->range.end + << ")" << endl; } if (it->range.start == it->range.end) { if (lyxerr.debugging(Debug::CHANGES)) { - lyxerr[Debug::CHANGES] << "Removing empty range for pos " + lyxerr[Debug::CHANGES] << " removing empty range for pos " << it->range.start << endl; } @@ -279,15 +294,15 @@ void Changes::merge() if (it + 1 == table_.end()) break; - if (it->change == (it + 1)->change) { + if (it->change.isSimilarTo((it + 1)->change) && it->range.end == (it + 1)->range.start) { if (lyxerr.debugging(Debug::CHANGES)) { - lyxerr[Debug::CHANGES] << "Merging equal ranges " - << it->range.start << "," << it->range.end - << " and " << (it + 1)->range.start << "," - << (it + 1)->range.end << endl; + lyxerr[Debug::CHANGES] << " merging ranges (" << it->range.start << ", " + << it->range.end << ") and (" << (it + 1)->range.start << ", " + << (it + 1)->range.end << ")" << endl; } - (it + 1)->range.start = it->range.start; + (it + 1)->change.changetime = max(it->change.changetime, + (it + 1)->change.changetime); table_.erase(it); // start again it = table_.begin(); @@ -296,16 +311,14 @@ void Changes::merge() ++it; } - - lyxerr[Debug::CHANGES] << "Merge ended" << endl; } int Changes::latexMarkChange(odocstream & os, - Change::Type const old, Change::Type const change, + Change::Type const oldChangeType, Change::Type const changeType, bool const & output) { - if (!output || old == change) + if (!output || oldChangeType == changeType) return 0; static docstring const start(from_ascii("\\changestart{}")); @@ -315,19 +328,19 @@ int Changes::latexMarkChange(odocstream & os, int column = 0; - if (old == Change::DELETED) { + if (oldChangeType == Change::DELETED) { os << soff; column += soff.length(); } - switch (change) { + switch (changeType) { case Change::UNCHANGED: os << end; column += end.length(); break; case Change::DELETED: - if (old == Change::UNCHANGED) { + if (oldChangeType == Change::UNCHANGED) { os << start; column += start.length(); } @@ -336,7 +349,7 @@ int Changes::latexMarkChange(odocstream & os, break; case Change::INSERTED: - if (old == Change::UNCHANGED) { + if (oldChangeType == Change::UNCHANGED) { os << start; column += start.length(); } @@ -348,7 +361,6 @@ int Changes::latexMarkChange(odocstream & os, void Changes::lyxMarkChange(std::ostream & os, int & column, - time_type const curtime, Change const & old, Change const & change) { if (old == change) @@ -362,23 +374,16 @@ void Changes::lyxMarkChange(std::ostream & os, int & column, break; case Change::DELETED: { - time_type t = change.changetime; - if (!t) - t = curtime; os << "\n\\change_deleted " << change.author - << " " << t << "\n"; - + << " " << change.changetime << "\n"; break; } - case Change::INSERTED: { - time_type t = change.changetime; - if (!t) - t = curtime; + case Change::INSERTED: { os << "\n\\change_inserted " << change.author - << " " << t << "\n"; + << " " << change.changetime << "\n"; break; - } + } } }