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.
7 * \author Lars Gullik Bjønnes
8 * \author Jean-Marc Lasgouttes
10 * \author André Pönitz
12 * Full author contact details are available in file CREDITS.
15 #ifndef PARAGRAPH_PIMPL_H
16 #define PARAGRAPH_PIMPL_H
18 #include "paragraph.h"
22 #include "ParagraphParameters.h"
24 #include <boost/scoped_ptr.hpp>
33 class Paragraph::Pimpl {
36 Pimpl(Paragraph * owner);
37 /// "Copy constructor"
38 Pimpl(Pimpl const &, Paragraph * owner);
43 /// look up change at given pos
44 Change const & lookupChange(pos_type pos) const;
45 /// is there a change within the given range ?
46 bool isChanged(pos_type start, pos_type end) const;
47 /// will the paragraph be physically merged with the next
48 /// one if the imaginary end-of-par character is logically deleted?
49 bool isMergedOnEndOfParDeletion(bool trackChanges) const;
50 /// set change for the entire par
51 void setChange(Change const & change);
52 /// set change at given pos
53 void setChange(pos_type pos, Change const & change);
54 /// accept changes within the given range
55 void acceptChanges(BufferParams const & bparams, pos_type start, pos_type end);
56 /// reject changes within the given range
57 void rejectChanges(BufferParams const & bparams, pos_type start, pos_type end);
60 value_type getChar(pos_type pos) const;
62 void insertChar(pos_type pos, value_type c, Change const & change);
64 void insertInset(pos_type pos, InsetBase * inset, Change const & change);
65 /// (logically) erase the char at pos; return true if it was actually erased
66 bool eraseChar(pos_type pos, bool trackChanges);
67 /// (logically) erase the given range; return the number of chars actually erased
68 int eraseChars(pos_type start, pos_type end, bool trackChanges);
70 InsetBase * inset_owner;
72 /** A font entry covers a range of positions. Notice that the
73 entries in the list are inserted in random order.
74 I don't think it's worth the effort to implement a more effective
75 datastructure, because the number of different fonts in a paragraph
77 Nevertheless, I decided to store fontlist using a sorted vector:
78 fontlist = { {pos_1,font_1} , {pos_2,font_2} , ... } where
79 pos_1 < pos_2 < ..., font_{i-1} != font_i for all i,
80 and font_i covers the chars in positions pos_{i-1}+1,...,pos_i
81 (font_1 covers the chars 0,...,pos_1) (Dekel)
86 FontTable(pos_type p, LyXFont const & f)
90 pos_type pos() const { return pos_; }
92 void pos(pos_type p) { pos_ = p; }
94 LyXFont const & font() const { return font_; }
96 void font(LyXFont const & f) { font_ = f;}
98 /// End position of paragraph this font attribute covers
100 /** Font. Interpretation of the font values:
101 If a value is LyXFont::INHERIT_*, it means that the font
102 attribute is inherited from either the layout of this
103 paragraph or, in the case of nested paragraphs, from the
104 layout in the environment one level up until completely
106 The values LyXFont::IGNORE_* and LyXFont::TOGGLE are NOT
107 allowed in these font tables.
112 friend class matchFT;
116 /// used by lower_bound and upper_bound
117 int operator()(FontTable const & a, FontTable const & b) const {
118 return a.pos() < b.pos();
123 typedef std::vector<FontTable> FontList;
127 /// Output the surrogate pair formed by \p c and \p next to \p os.
128 /// \return the number of characters written.
129 int latexSurrogatePair(odocstream & os, value_type c, value_type next,
131 /// Output a space in appropriate formatting (or a surrogate pair
132 /// if the next character is a combining character).
133 /// \return whether a surrogate pair was output.
134 bool simpleTeXBlanks(BufferParams const &, Encoding const &,
135 odocstream &, TexRow & texrow,
137 unsigned int & column,
138 LyXFont const & font,
139 LyXLayout const & style);
141 void simpleTeXSpecialChars(Buffer const &, BufferParams const &,
142 Encoding const &, odocstream &,
143 TexRow & texrow, OutputParams const &,
144 LyXFont & running_font,
146 LyXFont const & outerfont,
148 Change::Type & running_change,
149 LyXLayout const & style,
151 unsigned int & column, value_type const c);
154 void validate(LaTeXFeatures & features,
155 LyXLayout const & layout) const;
160 static unsigned int paragraph_id;
162 ParagraphParameters params;
166 pos_type size() const { return owner_->size(); }
167 /// match a string against a particular point in the paragraph
168 bool isTextAt(std::string const & str, pos_type pos) const;
170 /// for recording and looking up changes