// -*- C++ -*-
-/* This file is part of
- * ======================================================
- *
- * LyX, The Document Processor
- *
- * Copyright 1995 Matthias Ettrich
- * Copyright 1995-2001 The LyX Team.
- *
- * ====================================================== */
+/**
+ * \file paragraph_pimpl.h
+ * Copyright 1995-2003 the LyX Team
+ * Read the file COPYING
+ */
#ifndef PARAGRAPH_PIMPL_H
#define PARAGRAPH_PIMPL_H
-#ifdef __GNUG__
-#pragma interface
-#endif
-
#include "paragraph.h"
#include "ParagraphParameters.h"
-#include <boost/array.hpp>
+#include "changes.h"
+#include "counters.h"
+
+#include <boost/scoped_ptr.hpp>
+
+class LyXLayout;
struct Paragraph::Pimpl {
///
///
Pimpl(Paragraph * owner);
/// Copy constructor
- Pimpl(Pimpl const &, Paragraph * owner, bool same_ids = false);
+ Pimpl(Pimpl const &, Paragraph * owner);
///
lyx::pos_type size() const {
return text.size();
}
///
+ bool empty() const {
+ return text.empty();
+ }
+ ///
void clear();
///
- void setContentsFromPar(Paragraph const * par);
+ void setContentsFromPar(Paragraph const & par);
+ /// set tracking mode
+ void trackChanges(Change::Type type = Change::UNCHANGED);
+ /// stop tracking
+ void untrackChanges();
+ /// set all text as new for change mode
+ void cleanChanges();
+ /// look up change type at given pos
+ Change::Type lookupChange(lyx::pos_type pos) const;
+ /// look up change at given pos
+ Change const lookupChangeFull(lyx::pos_type pos) const;
+ /// is there a change in the given range ?
+ bool isChanged(lyx::pos_type start, lyx::pos_type end) const;
+ /// is there a non-addition in this range ?
+ bool isChangeEdited(lyx::pos_type start, lyx::pos_type end) const;
+
+ /// set change at pos
+ void setChange(lyx::pos_type pos, Change::Type type);
+
+ /// mark as erased
+ void markErased();
+
+ /// accept change
+ void acceptChange(lyx::pos_type start, lyx::pos_type end);
+
+ /// reject change
+ void rejectChange(lyx::pos_type start, lyx::pos_type end);
+
+ /// are we tracking changes ?
+ bool tracking() const {
+ return changes_.get();
+ }
+
///
value_type getChar(lyx::pos_type pos) const;
///
void setChar(lyx::pos_type pos, value_type c);
///
- void insertChar(lyx::pos_type pos, value_type c, LyXFont const & font);
- ///
- void insertInset(lyx::pos_type pos, Inset * inset, LyXFont const & font);
- ///
- void erase(lyx::pos_type pos);
+ void insertChar(lyx::pos_type pos, value_type c, LyXFont const & font, Change change = Change(Change::INSERTED));
///
- LyXFont const realizeFont(LyXFont const & font,
- BufferParams const & bparams) const;
+ void insertInset(lyx::pos_type pos, InsetOld * inset, LyXFont const & font, Change change = Change(Change::INSERTED));
+ /// definite erase
+ void eraseIntern(lyx::pos_type pos);
+ /// erase the given position. Returns true if it was actually erased
+ bool erase(lyx::pos_type pos);
+ /// erase the given range
+ int erase(lyx::pos_type start, lyx::pos_type end);
///
- Inset * inset_owner;
- ///
- boost::array<int, 10> counter_;
+ UpdatableInset * inset_owner;
- ///
- friend struct matchIT;
- ///
- struct matchIT {
- /// used by lower_bound and upper_bound
- inline
- int operator()(InsetTable const & a, 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
/// End position of paragraph this font attribute covers
lyx::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_;
typedef std::vector<FontTable> FontList;
///
FontList fontlist;
- ///
- Paragraph * TeXDeeper(Buffer const *, BufferParams const &,
- std::ostream &, TexRow & texrow);
+
///
void simpleTeXBlanks(std::ostream &, TexRow & texrow,
lyx::pos_type const i,
- int & column, LyXFont const & font,
+ unsigned int & column,
+ LyXFont const & font,
LyXLayout const & style);
///
void simpleTeXSpecialChars(Buffer const *, BufferParams const &,
std::ostream &, TexRow & texrow,
- bool moving_arg,
+ LatexRunParams 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,
lyx::pos_type & i,
- int & column, value_type const c);
+ 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:
/// match a string against a particular point in the paragraph
- bool isTextAt(BufferParams const &,
- string const & str, lyx::pos_type pos);
-
+ bool isTextAt(string const & str, lyx::pos_type pos) const;
+
+ /// for recording and looking up changes in revision tracking mode
+ boost::scoped_ptr<Changes> changes_;
+
/// Who owns us?
Paragraph * owner_;
///