]> git.lyx.org Git - lyx.git/blob - src/changes.h
change tracking:
[lyx.git] / src / changes.h
1 // -*- C++ -*-
2 /**
3  * \file changes.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author John Levon
8  * \author Michael Gerz
9  *
10  * Full author contact details are available in file CREDITS.
11  *
12  * Record changes in a paragraph.
13  */
14
15 #ifndef CHANGES_H
16 #define CHANGES_H
17
18 #include "support/docstream.h"
19 #include "support/lyxtime.h"
20
21 #include <vector>
22
23
24 namespace lyx {
25
26
27 class Change {
28 public:
29         /// the type of change
30         enum Type {
31                 UNCHANGED, // no change
32                 INSERTED, // new text
33                 DELETED // deleted text
34         };
35
36         explicit Change(Type t, int a = 0, time_type ct = 0)
37                 : type(t), author(a), changetime(ct) {}
38
39         Type type;
40
41         int author;
42
43         time_type changetime;
44 };
45
46 bool operator==(Change const & l, Change const & r);
47 bool operator!=(Change const & l, Change const & r);
48
49 class Changes {
50 public:
51         /// set the pos to the given change
52         void set(Change const & change, pos_type pos);
53         /// set the range to the given change
54         void set(Change const & change, pos_type start, pos_type end);
55
56         /// return the change at the given position
57         Change const lookup(pos_type pos) const;
58
59         /// return true if there is a change in the given range
60         bool isChanged(pos_type start, pos_type end) const;
61
62         /// remove the given entry. This implies that a character was
63         /// deleted at pos, and will adjust all range bounds past it
64         void erase(pos_type pos);
65
66         /// output latex to mark a transition between two changetypes
67         /// returns length of text outputted
68         static int latexMarkChange(odocstream & os, Change::Type old,
69                 Change::Type change, bool const & output);
70
71         /// output .lyx file format for transitions between changes
72         static void lyxMarkChange(std::ostream & os, int & column,
73                 time_type curtime, Change const & old, Change const & change);
74
75 private:
76         class Range {
77         public:
78                 Range(pos_type s, pos_type e)
79                         : start(s), end(e) {}
80
81                 // does this range contain r ?
82                 bool contains(Range const & r) const;
83
84                 // does this range contain pos ?
85                 bool contains(pos_type pos) const;
86
87                 // do the ranges intersect ?
88                 bool intersects(Range const & r) const;
89
90                 pos_type start;
91                 pos_type end; // Caution: end is not in the range!
92         };
93
94         friend bool operator==(Range const & r1, Range const & r2);
95         friend bool operator!=(Range const & r1, Range const & r2);
96
97         class ChangeRange {
98         public:
99                 ChangeRange(Change const & c, Range const & r)
100                         : change(c), range(r) {}
101
102                 Change change;
103                 Range range;
104         };
105
106         /// merge neighbouring ranges, assuming that they are abutting
107         void merge();
108
109         typedef std::vector<ChangeRange> ChangeTable;
110
111         /// table of changes, every row a change and range descriptor
112         ChangeTable table_;
113 };
114
115
116 } // namespace lyx
117
118 #endif // CHANGES_H