mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-26 22:17:41 +00:00
change tracking:
Better change time handling. Quote from Changes.C: 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. To avoid that every keystroke results in a separate change, a tolerance interval of 5 minutes is used. That means if there are two adjacent changes that only differ in their change time with abs(ct1 - ct2) < 300 sec, they will be merged (and the later change time is preserved). Technically, the check for equality (or similarity) is made in operator==(...). The merging of similar changes happens in method merge(). Resolve FIXMEs for LyX & LaTeX output. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15569 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
213c04d0a5
commit
ae1346990b
@ -23,12 +23,33 @@ namespace lyx {
|
||||
|
||||
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. To avoid that every keystroke results in a separate change, a
|
||||
* tolerance interval of 5 minutes is used. That means if there are two adjacent
|
||||
* changes that only differ in their change time with abs(ct1 - ct2) < 300 sec,
|
||||
* they will be merged (and the later change time is preserved).
|
||||
* Technically, the check for equality (or similarity) is made in operator==(...).
|
||||
* The merging of similar changes happens in method merge().
|
||||
*/
|
||||
|
||||
bool operator==(Change const & l, Change const & r)
|
||||
{
|
||||
return l.type == r.type && l.author == r.author
|
||||
&& l.changetime == r.changetime;
|
||||
if (l.type != r.type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (l.type == Change::UNCHANGED) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return l.author == r.author
|
||||
// both changes made within 5 minutes?
|
||||
&& abs(l.changetime - r.changetime) < 300;
|
||||
}
|
||||
|
||||
|
||||
@ -87,11 +108,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;
|
||||
@ -282,6 +298,8 @@ void Changes::merge()
|
||||
<< (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 +312,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 +325,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 +346,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 +358,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,21 +371,14 @@ 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;
|
||||
os << "\n\\change_inserted " << change.author
|
||||
<< " " << t << "\n";
|
||||
<< " " << change.changetime << "\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ public:
|
||||
DELETED // deleted text
|
||||
};
|
||||
|
||||
explicit Change(Type t, int a = 0, time_type ct = 0)
|
||||
explicit Change(Type t, int a = 0, time_type ct = current_time())
|
||||
: type(t), author(a), changetime(ct) {}
|
||||
|
||||
Type type;
|
||||
@ -73,12 +73,12 @@ public:
|
||||
|
||||
/// output latex to mark a transition between two change types
|
||||
/// returns length of text outputted
|
||||
static int latexMarkChange(odocstream & os, Change::Type old,
|
||||
Change::Type change, bool const & output);
|
||||
static int latexMarkChange(odocstream & os, Change::Type oldChangeType,
|
||||
Change::Type changeType, bool const & output);
|
||||
|
||||
/// output .lyx file format for transitions between changes
|
||||
static void lyxMarkChange(std::ostream & os, int & column,
|
||||
time_type curtime, Change const & old, Change const & change);
|
||||
Change const & old, Change const & change);
|
||||
|
||||
private:
|
||||
class Range {
|
||||
|
@ -153,13 +153,12 @@ void Paragraph::write(Buffer const & buf, ostream & os,
|
||||
LyXFont font1(LyXFont::ALL_INHERIT, bparams.language);
|
||||
|
||||
Change running_change = Change(Change::UNCHANGED);
|
||||
time_type const curtime = current_time();
|
||||
|
||||
int column = 0;
|
||||
for (pos_type i = 0; i <= size(); ++i) {
|
||||
|
||||
Change change = pimpl_->lookupChange(i);
|
||||
Changes::lyxMarkChange(os, column, curtime, running_change, change);
|
||||
Changes::lyxMarkChange(os, column, running_change, change);
|
||||
running_change = change;
|
||||
|
||||
if (i == size())
|
||||
|
@ -2360,7 +2360,6 @@ string LyXText::currentState(LCursor & cur)
|
||||
os << to_utf8(_("Change: ")) << a.name();
|
||||
if (!a.email().empty())
|
||||
os << " (" << a.email() << ")";
|
||||
if (change.changetime)
|
||||
os << to_utf8(_(" at ")) << ctime(&change.changetime);
|
||||
os << " : ";
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user