X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fchanges.h;h=967a9a6c8d7bc6308827ba632a311068b3c778b4;hb=cd4033aef3a3f1efdb5a676b8bab3d367f53a830;hp=ac378e59257916c61ee55c2b3e56b8a37224b0e8;hpb=ae87b945156585b080ed155919f64b80e48d7a04;p=lyx.git diff --git a/src/changes.h b/src/changes.h index ac378e5925..967a9a6c8d 100644 --- a/src/changes.h +++ b/src/changes.h @@ -1,24 +1,31 @@ +// -*- 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 + * Record changes in a paragraph. */ #ifndef CHANGES_H #define CHANGES_H -#include "support/types.h" +#include "support/docstream.h" #include "support/lyxtime.h" #include -#include -#include -struct Change { + +namespace lyx { + + +class Change { +public: /// the type of change enum Type { UNCHANGED, // no change @@ -26,125 +33,101 @@ struct 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; + // does this range contain r ? (inlined as the result of profiling) + bool contains(Range const & r) const { + return r.start >= start && r.end <= end; + } - // is this range contained within r ? - bool contained(Range const & r) const; + // does this range contain pos ? (inlined as the result of profiling) + bool contains(pos_type pos) const { + return pos >= start && pos < end; + } // 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 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 ChangeTable; + /// table of changes, every row a change and range descriptor + ChangeTable table_; }; + +} // namespace lyx + #endif // CHANGES_H