// -*- C++ -*-
-/* This file is part of
- * ======================================================
- *
- * LyX, The Document Processor
- *
- * Copyright 1995 Matthias Ettrich
- * Copyright 1995-2001 The LyX Team.
+/**
+ * \file paragraph_pimpl.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * ====================================================== */
+ * \author Lars Gullik Bjønnes
+ * \author Jean-Marc Lasgouttes
+ * \author John Levon
+ * \author André Pönitz
+ *
+ * Full author contact details are available in file CREDITS.
+ */
#ifndef PARAGRAPH_PIMPL_H
#define PARAGRAPH_PIMPL_H
-#ifdef __GNUG__
-#pragma interface
-#endif
-
#include "paragraph.h"
+
+#include "changes.h"
+#include "lyxfont.h"
#include "ParagraphParameters.h"
-#include <boost/array.hpp>
-struct Paragraph::Pimpl {
+#include <boost/scoped_ptr.hpp>
+
+
+namespace lyx {
+
+class LyXLayout;
+
+
+class Paragraph::Pimpl {
+public:
///
Pimpl(Paragraph * owner);
- /// Copy constructor
- Pimpl(Pimpl const &, Paragraph * owner, bool same_ids = false);
- ///
- Paragraph::size_type size() const {
- return text.size();
- }
- ///
- void clear();
- ///
- void setContentsFromPar(Paragraph const * par);
- ///
- Paragraph::value_type
- getChar(Paragraph::size_type pos) const;
- ///
- void setChar(Paragraph::size_type pos, Paragraph::value_type c);
- ///
- void insertChar(Paragraph::size_type pos,
- Paragraph::value_type c,
- LyXFont const & font);
- ///
- void insertInset(Paragraph::size_type pos,
- Inset * inset,
- LyXFont const & font);
+ /// "Copy constructor"
+ Pimpl(Pimpl const &, Paragraph * owner);
+
+ //
+ // Change tracking
+ //
+ /// look up change at given pos
+ Change const lookupChange(pos_type pos) const;
+ /// is there a change within the given range ?
+ bool isChanged(pos_type start, pos_type end) const;
+ /// will the paragraph be physically merged with the next
+ /// one if the imaginary end-of-par character is logically deleted?
+ bool isMergedOnEndOfParDeletion(bool trackChanges) const;
+ /// set change for the entire par
+ void setChange(Change const & change);
+ /// set change at given pos
+ void setChange(pos_type pos, Change const & change);
+ /// accept changes within the given range
+ void acceptChanges(pos_type start, pos_type end);
+ /// reject changes within the given range
+ void rejectChanges(pos_type start, pos_type end);
+
///
- void erase(Paragraph::size_type pos);
+ value_type getChar(pos_type pos) const;
///
- LyXFont const realizeFont(LyXFont const & font,
- BufferParams const & bparams) const;
+ void insertChar(pos_type pos, value_type c, Change const & change);
///
- Inset * inset_owner;
+ void insertInset(pos_type pos, InsetBase * inset, Change const & change);
+ /// (logically) erase the char at pos; return true if it was actually erased
+ bool eraseChar(pos_type pos, bool trackChanges);
+ /// (logically) erase the given range; return the number of chars actually erased
+ int eraseChars(pos_type start, pos_type end, bool trackChanges);
///
- boost::array<int, 10> counter_;
+ InsetBase * inset_owner;
- ///
- friend struct matchIT;
- ///
- struct matchIT {
- /// used by lower_bound and upper_bound
- inline
- int operator()(Paragraph::InsetTable const & a,
- Paragraph::InsetTable const & b) const {
- return a.pos < b.pos;
- }
- };
/** A font entry covers a range of positions. Notice that the
entries in the list are inserted in random order.
I don't think it's worth the effort to implement a more effective
and font_i covers the chars in positions pos_{i-1}+1,...,pos_i
(font_1 covers the chars 0,...,pos_1) (Dekel)
*/
- struct FontTable {
+ class FontTable {
+ public:
///
- FontTable(size_type p, LyXFont const & f)
- : pos_(p)
- {
- font_ = container.get(f);
- }
+ FontTable(pos_type p, LyXFont const & f)
+ : pos_(p), font_(f)
+ {}
///
- size_type pos() const { return pos_; }
+ pos_type pos() const { return pos_; }
///
- void pos(size_type p) { pos_ = p; }
+ void pos(pos_type p) { pos_ = p; }
///
- LyXFont const & font() const { return *font_; }
+ LyXFont const & font() const { return font_; }
///
- void font(LyXFont const & f) { font_ = container.get(f);}
+ void font(LyXFont const & f) { font_ = f;}
private:
/// End position of paragraph this font attribute covers
- size_type pos_;
+ pos_type pos_;
/** Font. Interpretation of the font values:
- If a value is LyXFont::INHERIT_*, it means that the font
+ If a value is LyXFont::INHERIT_*, it means that the font
attribute is inherited from either the layout of this
- paragraph or, in the case of nested paragraphs, from the
- layout in the environment one level up until completely
+ paragraph or, in the case of nested paragraphs, from the
+ layout in the environment one level up until completely
resolved.
- The values LyXFont::IGNORE_* and LyXFont::TOGGLE are NOT
+ The values LyXFont::IGNORE_* and LyXFont::TOGGLE are NOT
allowed in these font tables.
*/
- boost::shared_ptr<LyXFont> font_;
- ///
- static ShareContainer<LyXFont> container;
+ LyXFont font_;
};
///
- friend struct matchFT;
+ friend class matchFT;
///
- struct matchFT {
+ class matchFT {
+ public:
/// used by lower_bound and upper_bound
- inline
- int operator()(Paragraph::Pimpl::FontTable const & a,
- Paragraph::Pimpl::FontTable const & b) const {
+ int operator()(FontTable const & a, FontTable const & b) const {
return a.pos() < b.pos();
}
};
typedef std::vector<FontTable> FontList;
///
FontList fontlist;
+
///
- Paragraph * TeXDeeper(Buffer const *, BufferParams const &,
- std::ostream &, TexRow & texrow);
- ///
- void simpleTeXBlanks(std::ostream &, TexRow & texrow,
- size_type const i,
- int & column, LyXFont const & font,
+ void simpleTeXBlanks(odocstream &, TexRow & texrow,
+ pos_type const i,
+ unsigned int & column,
+ LyXFont const & font,
LyXLayout const & style);
///
- void simpleTeXSpecialChars(Buffer const *, BufferParams const &,
- std::ostream &, TexRow & texrow,
- bool moving_arg,
+ void simpleTeXSpecialChars(Buffer const &, BufferParams const &,
+ odocstream &, TexRow & texrow,
+ OutputParams const &,
LyXFont & font, LyXFont & running_font,
- LyXFont & basefont, bool & open_font,
+ LyXFont & basefont,
+ LyXFont const & outerfont,
+ bool & open_font,
+ Change::Type & running_change,
LyXLayout const & style,
- size_type & i,
- int & column, value_type const c);
+ pos_type & i,
+ unsigned int & column, value_type const c);
+
///
- Paragraph * getParFromID(int id) const;
+ void validate(LaTeXFeatures & features,
+ LyXLayout const & layout) const;
+
///
unsigned int id_;
///
static unsigned int paragraph_id;
///
ParagraphParameters params;
+
private:
+ ///
+ pos_type size() const { return owner_->size(); }
/// match a string against a particular point in the paragraph
- bool isTextAt(string const & str, Paragraph::size_type pos);
-
+ bool isTextAt(std::string const & str, pos_type pos) const;
+
+ /// for recording and looking up changes
+ Changes changes_;
+
/// Who owns us?
Paragraph * owner_;
- ///
- TextContainer text;
};
+
+} // namespace lyx
+
#endif