]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph_pimpl.h
hopefully fix tex2lyx linking.
[lyx.git] / src / paragraph_pimpl.h
index 628f20d5e9e976d4055674968a438f2f245a4280..efb347c2494dfbdc341c305c42a8c9b325ec72cb 100644 (file)
@@ -1,69 +1,70 @@
 // -*- 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);
+       /// "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;
+        /// 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 insertInset(Paragraph::size_type pos,
-                        Inset * inset,
-                        LyXFont const & font);
+       value_type getChar(pos_type pos) const;
        ///
-       void erase(Paragraph::size_type pos);
+       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
@@ -75,45 +76,41 @@ struct Paragraph::Pimpl {
            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();
                }
        };
@@ -122,36 +119,51 @@ struct Paragraph::Pimpl {
        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(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