+// -*- C++ -*-
/**
* \file changes.h
- * Copyright 2002 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * Record changes in a paragraph.
+ * \author John Levon
+ * \author Michael Gerz
+ *
+ * Full author contact details are available in file CREDITS.
*
- * \author John Levon <levon@movementarian.org>
+ * Record changes in a paragraph.
*/
#ifndef CHANGES_H
#define CHANGES_H
-#include "support/types.h"
+#include "support/docstream.h"
#include "support/lyxtime.h"
#include <vector>
-#include <iosfwd>
-#include <ctime>
-struct Change {
+
+namespace lyx {
+
+
+class Change {
+public:
/// the type of change
enum Type {
UNCHANGED, // no change
DELETED // deleted text
};
- Change(Type t = UNCHANGED, int a = 0, lyx::time_type ct = 0)
+ explicit Change(Type t, int a = 0, time_type ct = current_time())
: type(t), author(a), changetime(ct) {}
- Type type;
+ /// is the change similar to the given change such that both can be merged?
+ bool isSimilarTo(Change const & change);
+
+ Type type;
int author;
- lyx::time_type changetime;
+ time_type changetime;
};
-
+
bool operator==(Change const & l, Change const & r);
bool operator!=(Change const & l, Change const & r);
-
+
class Changes {
public:
-
- Changes(Change::Type type);
-
- ~Changes();
-
- Changes(Changes const &);
+ /// set the pos to the given change
+ void set(Change const & change, pos_type pos);
+ /// set the range (excluding end) to the given change
+ void set(Change const & change, pos_type start, pos_type end);
- /// reset "default" change type (for empty pars)
- void reset(Change::Type type) {
- empty_type_ = type;
- }
-
- /// set the position to the given change
- void set(Change change, lyx::pos_type pos);
-
- /// set the position to the given change
- void set(Change::Type, lyx::pos_type pos);
-
- /// set the range to the given change
- void set(Change::Type, lyx::pos_type start, lyx::pos_type end);
+ /// erase the entry at pos and adjust all range bounds past it
+ /// (assumes that a character was deleted at pos)
+ void erase(lyx::pos_type pos);
- /// set the range to the given change
- void set(Change, lyx::pos_type start, lyx::pos_type end);
+ /// insert a new entry at pos and adjust all range bounds past it
+ /// (assumes that a character was inserted at pos)
+ void insert(Change const & change, lyx::pos_type pos);
- /// mark the given change and adjust
- void record(Change, lyx::pos_type pos);
+ ///
- /// return the change type at the given position
- Change::Type lookup(lyx::pos_type pos) const;
+ /// return the change at the given pos
+ Change const lookup(pos_type pos) const;
- /// return the change at the given position
- Change const lookupFull(lyx::pos_type pos) const;
+ /// return true if there is a change in the given range (excluding end)
+ bool isChanged(pos_type start, pos_type end) const;
- /// return true if there is a change in the given range
- bool isChange(lyx::pos_type start, lyx::pos_type end) const;
+ ///
- /// return true if there is a deleted or unchanged range contained
- bool isChangeEdited(lyx::pos_type start, lyx::pos_type end) const;
-
- /// remove the given entry
- void erase(lyx::pos_type pos);
-
- /// output latex to mark a transition between two changetypes
+ /// output latex to mark a transition between two change types
/// returns length of text outputted
- static int latexMarkChange(std::ostream & os, Change::Type old, Change::Type change);
+ 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,
- lyx::time_type curtime, Change const & old, Change const & change);
-
+ Change const & old, Change const & change);
+
private:
- struct Range {
- Range(lyx::pos_type s, lyx::pos_type e)
+ class Range {
+ public:
+ Range(pos_type s, pos_type e)
: start(s), end(e) {}
// does this range contain r ?
bool contains(Range const & r) const;
// does this range contain pos ?
- bool contains(lyx::pos_type pos) const;
-
- // does this range contain pos, or can it be appended ?
- bool loose_contains(lyx::pos_type pos) const;
-
- // is this range contained within r ?
- bool contained(Range const & r) const;
+ bool contains(pos_type pos) const;
// do the ranges intersect ?
bool intersects(Range const & r) const;
-
- lyx::pos_type start;
- lyx::pos_type end;
+
+ pos_type start;
+ pos_type end; // Caution: end is not in the range!
};
-
+
friend bool operator==(Range const & r1, Range const & r2);
friend bool operator!=(Range const & r1, Range const & r2);
-
- struct ChangeRange {
- ChangeRange(lyx::pos_type s, lyx::pos_type e, Change c)
- : range(Range(s, e)), change(c) {}
- Range range;
+
+ class ChangeRange {
+ public:
+ ChangeRange(Change const & c, Range const & r)
+ : change(c), range(r) {}
+
Change change;
+ Range range;
};
-
- typedef std::vector<ChangeRange> ChangeTable;
- /// our table of changes
- ChangeTable table_;
-
- /// change type for an empty paragraph
- Change::Type empty_type_;
-
- /// handle a delete
- void del(Change change, ChangeTable::size_type pos);
-
- /// handle an add
- void add(Change change, ChangeTable::size_type pos);
-
- /// merge neighbouring ranges
+ /// merge equal changes with adjoining ranges
void merge();
- /// consistency check
- void check() const;
+ typedef std::vector<ChangeRange> ChangeTable;
+ /// table of changes, every row a change and range descriptor
+ ChangeTable table_;
};
+
+} // namespace lyx
+
#endif // CHANGES_H