]> git.lyx.org Git - lyx.git/blobdiff - src/changes.C
LFUN_UNICODE_INSERT - unicode-insert
[lyx.git] / src / changes.C
index b92f15cb635f6e548353f6d5e3214456eb8ce96e..1a7f2cffb7ed722b933d4853a050f8fcbc751b53 100644 (file)
@@ -160,31 +160,51 @@ void Changes::set(Change const & change, pos_type const start, pos_type const en
 
 void Changes::erase(pos_type const pos)
 {
+       if (lyxerr.debugging(Debug::CHANGES)) {
+               lyxerr[Debug::CHANGES] << "Erasing change at position " << pos << endl;
+       }
+
        ChangeTable::iterator it = table_.begin();
        ChangeTable::iterator end = table_.end();
 
-       bool found = false;
-
        for (; it != end; ++it) {
-               Range & range(it->range);
-
-               if (lyxerr.debugging(Debug::CHANGES)) {
-                       lyxerr[Debug::CHANGES] << "era:Range of type " << it->change.type << " is "
-                               << it->range.start << "," << it->range.end << endl;
+               // range (pos,pos+x) becomes (pos,pos+x-1)
+               if (it->range.start > pos) {
+                       --(it->range.start);
                }
+               // range (pos-x,pos) stays (pos-x,pos)
+               if (it->range.end > pos) {
+                       --(it->range.end);
+               }
+       }
 
-               if (range.contains(pos)) {
-                       found = true;
-                       --range.end;
-                       continue;
+       merge();
+}
+
+
+void Changes::insert(Change const & change, lyx::pos_type pos)
+{
+       if (lyxerr.debugging(Debug::CHANGES)) {
+               lyxerr[Debug::CHANGES] << "Inserting change of type " << change.type
+                       << " at position " << pos << endl;
+       }
+
+       ChangeTable::iterator it = table_.begin();
+       ChangeTable::iterator end = table_.end();
+
+       for (; it != end; ++it) {
+               // range (pos,pos+x) becomes (pos+1,pos+x+1)
+               if (it->range.start >= pos) {
+                       ++(it->range.start);
                }
 
-               if (found) {
-                       --range.start;
-                       --range.end;
+               // range (pos-x,pos) stays as it is
+               if (it->range.end > pos) {
+                       ++(it->range.end);
                }
        }
-       merge();
+
+       set(change, pos, pos + 1); // set will call merge
 }
 
 
@@ -198,7 +218,6 @@ Change const Changes::lookup(pos_type const pos) const
                        return it->change;
        }
 
-       BOOST_ASSERT(false && "missing changes for pos");
        return Change(Change::UNCHANGED);
 }
 
@@ -209,44 +228,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;
                        }
 
@@ -259,14 +272,12 @@ void Changes::merge()
                if (it + 1 == table_.end())
                        break;
 
-               if (it->change == (it + 1)->change) {
+               if (it->change == (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;
                        table_.erase(it);
                        // start again
@@ -276,8 +287,6 @@ void Changes::merge()
 
                ++it;
        }
-
-       lyxerr[Debug::CHANGES] << "Merge ended" << endl;
 }
 
 
@@ -285,6 +294,7 @@ int Changes::latexMarkChange(odocstream & os,
                             Change::Type const old, Change::Type const change,
                             bool const & output)
 {
+       // FIXME: change tracking (MG)
        if (!output || old == change)
                return 0;
 
@@ -331,6 +341,7 @@ 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;