X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fchanges.C;h=e3cbdf5270299d1cea95552b1ac51fe12447fb7e;hb=35204f8f33d7400a5fefeffea533fb4cb4097211;hp=0a708c64bbc8c4c474d910f092470467de2a7bea;hpb=a127d540d3dfc4382f602092274a34bfbd13064d;p=lyx.git diff --git a/src/changes.C b/src/changes.C index 0a708c64bb..e3cbdf5270 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; @@ -275,13 +297,15 @@ void Changes::merge() if (it + 1 == table_.end()) break; - if (it->change == (it + 1)->change && it->range.end == (it + 1)->range.start) { + if (it->change.isSimilarTo((it + 1)->change) && it->range.end == (it + 1)->range.start) { if (lyxerr.debugging(Debug::CHANGES)) { 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(); @@ -294,11 +318,10 @@ void Changes::merge() int Changes::latexMarkChange(odocstream & os, - Change::Type const old, Change::Type const change, + Change::Type const oldChangeType, Change::Type const changeType, bool const & output) { - // FIXME: change tracking (MG) - if (!output || old == change) + if (!output || oldChangeType == changeType) return 0; static docstring const start(from_ascii("\\changestart{}")); @@ -308,19 +331,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(); } @@ -329,7 +352,7 @@ int Changes::latexMarkChange(odocstream & os, break; case Change::INSERTED: - if (old == Change::UNCHANGED) { + if (oldChangeType == Change::UNCHANGED) { os << start; column += start.length(); } @@ -341,10 +364,8 @@ int Changes::latexMarkChange(odocstream & os, void Changes::lyxMarkChange(std::ostream & os, int & column, - time_type const curtime, Change const & old, Change const & change) { - // FIXME: change tracking (MG) if (old == change) return; @@ -356,23 +377,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; - } + } } }