]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.h
* filetools.[Ch]: Make functions that start with a capital
[lyx.git] / src / paragraph.h
index fec3d79c7bca768f88c725381d4f9b125ff3f171..f3c3700025dbd9abfca3ba99f5ace62cedcc1cfe 100644 (file)
@@ -26,8 +26,6 @@
 
 #include "support/types.h"
 
-#include <boost/assert.hpp>
-
 #include <string>
 
 class Buffer;
@@ -46,7 +44,20 @@ class OutputParams;
 class PainterInfo;
 class ParagraphParameters;
 class TexRow;
-class UpdatableInset;
+
+
+class FontSpan {
+public:
+       /// Invalid font span containing no character
+       FontSpan() : first(0), last(-1) {}
+       /// Span including first and last
+       FontSpan(lyx::pos_type f, lyx::pos_type l) : first(f), last(l) {}
+
+public:
+       /// Range including first and last.
+       lyx::pos_type first, last;
+};
+
 
 /// A Paragraph holds all text, attributes and insets in a text paragraph
 class Paragraph  {
@@ -75,7 +86,6 @@ public:
        Paragraph & operator=(Paragraph const &);
        ///
        ~Paragraph();
-
        ///
        int id() const;
 
@@ -97,10 +107,10 @@ public:
        ///
        std::string const asString(Buffer const &, bool label) const;
        ///
-       std::string const Paragraph::asString(Buffer const & buffer,
-                                             lyx::pos_type beg,
-                                             lyx::pos_type end,
-                                             bool label) const;
+       std::string const asString(Buffer const & buffer,
+                                  lyx::pos_type beg,
+                                  lyx::pos_type end,
+                                  bool label) const;
        ///
        std::string const asString(Buffer const &,
                                   OutputParams const & runparams,
@@ -134,7 +144,7 @@ public:
                                  lyx::depth_type depth) const;
 
        /// Can we drop the standard paragraph wrapper?
-       bool Paragraph::emptyTag() const;
+       bool emptyTag() const;
 
        /// Get the id of the paragraph, usefull for docbook and linuxdoc
        std::string getID(Buffer const & buf,
@@ -163,9 +173,9 @@ public:
        void makeSameLayout(Paragraph const & par);
 
        ///
-       void setInsetOwner(UpdatableInset * inset);
+       void setInsetOwner(InsetBase * inset);
        ///
-       UpdatableInset * inInset() const;
+       InsetBase * inInset() const;
        ///
        InsetBase::Code ownerCode() const;
        ///
@@ -215,14 +225,17 @@ public:
        /// set change at pos
        void setChange(lyx::pos_type pos, Change::Type type);
 
+       /// set full change at pos
+       void setChangeFull(lyx::pos_type pos, Change change);
+
        /// accept change
        void acceptChange(lyx::pos_type start, lyx::pos_type end);
 
        /// reject change
        void rejectChange(lyx::pos_type start, lyx::pos_type end);
 
-       /// mark whole par as erased
-       void markErased();
+       /// mark whole par as erased or not
+       void markErased(bool erased);
 
        /// Paragraphs can contain "manual labels", for example, Description
        /// environment. The text for this user-editable label is stored in
@@ -263,7 +276,7 @@ public:
        LyXFont const
        getFontSettings(BufferParams const &, lyx::pos_type pos) const;
        ///
-       LyXFont const getFirstFontSettings() const;
+       LyXFont const getFirstFontSettings(BufferParams const &) const;
 
        /** Get fully instantiated font. If pos == -1, use the layout
            font attached to this paragraph.
@@ -280,20 +293,16 @@ public:
                                   LyXFont const & outerfont) const;
        /**
         * The font returned by the above functions is the same in a
-        * span of characters. This method will return the last position
-        * in the paragraph for which that font is the same.
-        * This can be used to avoid unnecessary calls to getFont.
+        * span of characters. This method will return the first and
+        * the last positions in the paragraph for which that font is
+        * the same. This can be used to avoid unnecessary calls to
+   * getFont.
         */
-       lyx::pos_type getEndPosOfFontSpan(lyx::pos_type pos) const;
+       FontSpan fontSpan(lyx::pos_type pos) const;
        ///
        /// this is a bottleneck.
-       value_type getChar(lyx::pos_type pos) const
-       {
-               BOOST_ASSERT(pos >= 0);
-               BOOST_ASSERT(pos < int(text_.size()));
-               return text_[pos];
-       }
-       ///
+       value_type getChar(lyx::pos_type pos) const { return text_[pos]; }
+       /// Get the char, but mirror all bracket characters if it is right-to-left
        value_type getUChar(BufferParams const &, lyx::pos_type pos) const;
        /// The position must already exist.
        void setChar(lyx::pos_type pos, value_type c);
@@ -308,33 +317,40 @@ public:
                    LyXFont const & font);
        ///
        void insertChar(lyx::pos_type pos, value_type c,
-                       Change change = Change(Change::INSERTED));
+                       Change change = Change::INSERTED);
        ///
        void insertChar(lyx::pos_type pos, value_type c,
-               LyXFont const &, Change change = Change(Change::INSERTED));
-       ///
-       bool checkInsertChar(LyXFont &);
+               LyXFont const &, Change change = Change::INSERTED);
        ///
        void insertInset(lyx::pos_type pos, InsetBase * inset,
-                        Change change = Change(Change::INSERTED));
+                        Change change = Change::INSERTED);
        ///
        void insertInset(lyx::pos_type pos, InsetBase * inset,
-               LyXFont const &, Change change = Change(Change::INSERTED));
+               LyXFont const &, Change change = Change::INSERTED);
        ///
        bool insetAllowed(InsetBase_code code);
        ///
-       InsetBase * getInset(lyx::pos_type pos);
+       InsetBase * getInset(lyx::pos_type pos) {
+               return insetlist.get(pos);
+       }
        ///
-       InsetBase const * getInset(lyx::pos_type pos) const;
+       InsetBase const * getInset(lyx::pos_type pos) const {
+               return insetlist.get(pos);
+       }
 
        ///
-       bool isHfill(lyx::pos_type pos) const;
+       bool isHfill(lyx::pos_type pos) const {
+       return isInset(pos)
+               && getInset(pos)->lyxCode() == InsetBase::HFILL_CODE;
+       }
        /// hinted by profiler
-       bool isInset(lyx::pos_type pos) const { return getChar(pos) == static_cast<value_type>(META_INSET); }
+       bool isInset(lyx::pos_type pos) const {
+               return getChar(pos) == static_cast<value_type>(META_INSET);
+       }
        ///
        bool isNewline(lyx::pos_type pos) const;
-       ///
-       bool isSeparator(lyx::pos_type pos) const;
+       /// return true if the char is a word separator
+       bool isSeparator(lyx::pos_type pos) const { return getChar(pos) == ' '; }
        ///
        bool isLineSeparator(lyx::pos_type pos) const;
        /// True if the character/inset at this point can be part of a word
@@ -344,7 +360,7 @@ public:
        /// returns -1 if inset not found
        int getPositionOfInset(InsetBase const * inset) const;
 
-       ///
+       /// Returns the number of line breaks and white-space stripped at the start
        int stripLeadingSpaces();
 
        /// return true if we allow multiple spaces
@@ -352,7 +368,7 @@ public:
 
        /// return true if we allow this par to stay empty
        bool allowEmpty() const;
-       ////
+       ///
        unsigned char transformChar(unsigned char c, lyx::pos_type pos) const;
        ///
        ParagraphParameters & params();
@@ -360,53 +376,62 @@ public:
        ParagraphParameters const & params() const;
 
        ///
-       Row & getRow(lyx::pos_type pos);
+       Row & getRow(lyx::pos_type pos, bool boundary);
        ///
-       Row const & getRow(lyx::pos_type pos) const;
+       Row const & getRow(lyx::pos_type pos, bool boundary) const;
        ///
        size_t pos2row(lyx::pos_type pos) const;
 
-       ///
-       InsetList insetlist;
-
        /// total height of paragraph
        unsigned int height() const { return dim_.height(); }
        /// total width of paragraph, may differ from workwidth
        unsigned int width() const { return dim_.width(); }
+       /// ascend of paragraph above baseline
        unsigned int ascent() const { return dim_.ascent(); }
+       /// descend of paragraph below baseline
        unsigned int descent() const { return dim_.descent(); }
-       ///
+       /// LyXText updates the rows using this access point
        RowList & rows() { return rows_; }
-       ///
+       /// The painter and others use this
        RowList const & rows() const { return rows_; }
+       ///
+       RowSignature & rowSignature() const { return rowSignature_; }
 
-       // compute paragraph metrics    
-       void metrics(MetricsInfo & mi, Dimension & dim, LyXText & text);
-       // draw paragraph
-       void draw(PainterInfo & pi, int x, int y, LyXText & text) const;
-       /// dump some information
+       /// LyXText::redoParagraph updates this
+       Dimension & dim() { return dim_; }
+
+       /// dump some information to lyxerr
        void dump() const;
 
+public:
+       ///
+       InsetList insetlist;
+
+private:
        /// cached dimensions of paragraph
        Dimension dim_;
 
-private:
        ///
        mutable RowList rows_;
+       ///
+       mutable RowSignature rowSignature_;
+
        ///
        LyXLayout_ptr layout_;
-       /// keeping this here instead of in the pimpl makes LyX >10% faster
-       // for average tasks as buffer loading/switching etc.
+       /**
+        * Keeping this here instead of in the pimpl makes LyX >10% faster
+        * for average tasks as buffer loading/switching etc.
+        */
        TextContainer text_;
        /// end of label
        lyx::pos_type begin_of_body_;
 
+       /// Pimpl away stuff
        class Pimpl;
        ///
        friend class Paragraph::Pimpl;
        ///
        Pimpl * pimpl_;
-
 };