]> git.lyx.org Git - lyx.git/blob - src/paragraph_pimpl.h
Remove last traces of the ShareContainer
[lyx.git] / src / paragraph_pimpl.h
1 // -*- C++ -*-
2 /**
3  * \file paragraph_pimpl.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Lars Gullik Bjønnes
8  * \author Jean-Marc Lasgouttes
9  * \author John Levon
10  * \author André Pönitz
11  *
12  * Full author contact details are available in file CREDITS.
13  */
14
15 #ifndef PARAGRAPH_PIMPL_H
16 #define PARAGRAPH_PIMPL_H
17
18 #include "paragraph.h"
19
20 #include "changes.h"
21 #include "lyxfont.h"
22 #include "ParagraphParameters.h"
23
24 #include <boost/scoped_ptr.hpp>
25
26 class LyXLayout;
27
28
29 class Paragraph::Pimpl {
30 public:
31         ///
32         Pimpl(Paragraph * owner);
33         /// "Copy constructor"
34         Pimpl(Pimpl const &, Paragraph * owner);
35         ///
36         void setContentsFromPar(Paragraph const & par);
37
38         //
39         // Change tracking
40         //
41         /// set tracking mode
42         void trackChanges(Change::Type type = Change::UNCHANGED);
43         /// stop tracking
44         void untrackChanges();
45         /// set all text as new for change mode
46         void cleanChanges();
47         /// look up change type at given pos
48         Change::Type lookupChange(lyx::pos_type pos) const;
49         /// look up change at given pos
50         Change const lookupChangeFull(lyx::pos_type pos) const;
51         /// is there a change in the given range ?
52         bool isChanged(lyx::pos_type start, lyx::pos_type end) const;
53         /// is there a non-addition in this range ?
54         bool isChangeEdited(lyx::pos_type start, lyx::pos_type end) const;
55         /// set change at pos
56         void setChange(lyx::pos_type pos, Change::Type type);
57         /// set full change at pos
58         void setChangeFull(lyx::pos_type pos, Change change);
59         /// mark as erased
60         void markErased(bool);
61         /// accept change
62         void acceptChange(lyx::pos_type start, lyx::pos_type end);
63         /// reject change
64         void rejectChange(lyx::pos_type start, lyx::pos_type end);
65         /// are we tracking changes ?
66         bool tracking() const { return changes_.get(); }
67
68         ///
69         value_type getChar(lyx::pos_type pos) const;
70         ///
71         void setChar(lyx::pos_type pos, value_type c);
72         ///
73         void insertChar(lyx::pos_type pos, value_type c, Change change);
74         ///
75         void insertInset(lyx::pos_type pos, InsetBase * inset, Change change);
76         /// definite erase
77         void eraseIntern(lyx::pos_type pos);
78         /// erase the given position. Returns true if it was actually erased
79         bool erase(lyx::pos_type pos);
80         /// erase the given range
81         int erase(lyx::pos_type start, lyx::pos_type end);
82         ///
83         InsetBase * inset_owner;
84
85         /** A font entry covers a range of positions. Notice that the
86             entries in the list are inserted in random order.
87             I don't think it's worth the effort to implement a more effective
88             datastructure, because the number of different fonts in a paragraph
89             is limited. (Asger)
90             Nevertheless, I decided to store fontlist using a sorted vector:
91             fontlist = { {pos_1,font_1} , {pos_2,font_2} , ... } where
92             pos_1 < pos_2 < ..., font_{i-1} != font_i for all i,
93             and font_i covers the chars in positions pos_{i-1}+1,...,pos_i
94             (font_1 covers the chars 0,...,pos_1) (Dekel)
95         */
96         class FontTable  {
97         public:
98                 ///
99                 FontTable(lyx::pos_type p, LyXFont const & f)
100                         : pos_(p), font_(f)
101                 {}
102                 ///
103                 lyx::pos_type pos() const { return pos_; }
104                 ///
105                 void pos(lyx::pos_type p) { pos_ = p; }
106                 ///
107                 LyXFont const & font() const { return font_; }
108                 ///
109                 void font(LyXFont const & f) { font_ = f;}
110         private:
111                 /// End position of paragraph this font attribute covers
112                 lyx::pos_type pos_;
113                 /** Font. Interpretation of the font values:
114                     If a value is LyXFont::INHERIT_*, it means that the font
115                     attribute is inherited from either the layout of this
116                     paragraph or, in the case of nested paragraphs, from the
117                     layout in the environment one level up until completely
118                     resolved.
119                     The values LyXFont::IGNORE_* and LyXFont::TOGGLE are NOT
120                     allowed in these font tables.
121                 */
122                 LyXFont font_;
123         };
124         ///
125         friend class matchFT;
126         ///
127         class matchFT {
128         public:
129                 /// used by lower_bound and upper_bound
130                 int operator()(FontTable const & a, FontTable const & b) const {
131                         return a.pos() < b.pos();
132                 }
133         };
134
135         ///
136         typedef std::vector<FontTable> FontList;
137         ///
138         FontList fontlist;
139
140         ///
141         void simpleTeXBlanks(std::ostream &, TexRow & texrow,
142                              lyx::pos_type const i,
143                              unsigned int & column,
144                              LyXFont const & font,
145                              LyXLayout const & style);
146         ///
147         void simpleTeXSpecialChars(Buffer const &, BufferParams const &,
148                                    std::ostream &, TexRow & texrow,
149                                    OutputParams const &,
150                                    LyXFont & font, LyXFont & running_font,
151                                    LyXFont & basefont,
152                                    LyXFont const & outerfont,
153                                    bool & open_font,
154                                    Change::Type & running_change,
155                                    LyXLayout const & style,
156                                    lyx::pos_type & i,
157                                    unsigned int & column, value_type const c);
158
159         ///
160         void validate(LaTeXFeatures & features,
161                       LyXLayout const & layout) const;
162
163         ///
164         unsigned int id_;
165         ///
166         static unsigned int paragraph_id;
167         ///
168         ParagraphParameters params;
169
170 private:
171         ///
172         lyx::pos_type size() const { return owner_->size(); }
173         /// match a string against a particular point in the paragraph
174         bool isTextAt(std::string const & str, lyx::pos_type pos) const;
175
176         /// for recording and looking up changes in revision tracking mode
177         boost::scoped_ptr<Changes> changes_;
178
179         /// Who owns us?
180         Paragraph * owner_;
181 };
182
183 #endif