]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.h
cosmetics. mainly replace #include "dostring.h" by #include "strfwd.h"
[lyx.git] / src / Paragraph.h
index 9a5bc37704aae39f73a324014e0586c9ce06e0d2..30c033b4875be3516646fe6dac79048e8be69c04 100644 (file)
 #ifndef PARAGRAPH_H
 #define PARAGRAPH_H
 
-#include "lyxlayout_ptr_fwd.h"
+#include "FontEnums.h"
+#include "LayoutPtr.h"
 
 #include "insets/InsetCode.h"
 
-#include "support/docstring.h"
-// FIXME: would be nice to forward declare odocstream instead of
-// including this:
-#include "support/docstream.h"
-
-#include <vector>
+#include "support/strfwd.h"
+#include "support/types.h"
 
 namespace lyx {
 
@@ -61,27 +58,21 @@ public:
        pos_type first, last;
 };
 
-
-/// A Paragraph holds all text, attributes and insets in a text paragraph
-/// \todo FIXME: any reference to ParagraphMetrics (including inheritance)
-/// should go in order to complete the Model/View separation of this class.
-class Paragraph  {
-public:
+///
+enum TextCase {
        ///
-       enum {
-               /// Note that this is 1 right now to avoid
-               /// crashes where getChar() is called wrongly
-               /// (returning 0) - if this was 0, then we'd
-               /// try getInset() and crash. We should fix
-               /// all these places.
-               //META_INSET = 1 // as in trunk
-               META_INSET = 0x200001  // above 0x10ffff, for ucs-4
-       };
+       text_lowercase = 0,
        ///
-       typedef char_type value_type;
+       text_capitalization = 1,
        ///
-       typedef std::vector<value_type> TextContainer;
+       text_uppercase = 2
+};
+
 
+/// A Paragraph holds all text, attributes and insets in a text paragraph
+class Paragraph
+{
+public:
        ///
        Paragraph();
        ///
@@ -93,7 +84,6 @@ public:
        ///
        int id() const;
 
-
        ///
        Language const * getParLanguage(BufferParams const &) const;
        ///
@@ -119,16 +109,7 @@ public:
        void validate(LaTeXFeatures &) const;
 
        ///
-       int startTeXParParams(BufferParams const &, odocstream &, TexRow &,
-                             bool) const;
-
-       ///
-       int endTeXParParams(BufferParams const &, odocstream &, TexRow &,
-                           bool) const;
-
-
-       ///
-       bool simpleTeXOnePar(Buffer const &, BufferParams const &,
+       bool latex(Buffer const &, BufferParams const &,
                             Font const & outerfont, odocstream &,
                             TexRow & texrow, OutputParams const &) const;
 
@@ -144,10 +125,6 @@ public:
                                   odocstream & os,
                                   OutputParams const & runparams) const;
 
-       /// Checks if the paragraph contains only text and no inset or font change.
-       bool onlyText(Buffer const & buf, Font const & outerfont,
-                     pos_type initial) const;
-
        /// Writes to stream the docbook representation
        void simpleDocBookOnePar(Buffer const & buf,
                                 odocstream &,
@@ -171,9 +148,9 @@ public:
        bool forceDefaultParagraphs() const;
 
        ///
-       pos_type size() const { return text_.size(); }
+       pos_type size() const;
        ///
-       bool empty() const { return text_.empty(); }
+       bool empty() const;
 
        ///
        LayoutPtr const & layout() const;
@@ -183,9 +160,6 @@ public:
        /// This is the item depth, only used by enumerate and itemize
        signed char itemdepth;
 
-       ///
-       InsetBibitem * bibitem() const;  // ale970302
-
        /// look up change at given pos
        Change const & lookupChange(pos_type pos) const;
 
@@ -250,6 +224,9 @@ public:
        /// (logically) erase the given range; return the number of chars actually erased
        int eraseChars(pos_type start, pos_type end, bool trackChanges);
 
+       ///
+       void resetFonts(Font const & font);
+
        /** Get uninstantiated font setting. Returns the difference
            between the characters font and the layoutfont.
            This is what is stored in the fonttable
@@ -263,8 +240,8 @@ public:
            font attached to this paragraph.
            If pos == -2, use the label font of the layout attached here.
            In all cases, the font is instantiated, i.e. does not have any
-           attributes with values Font::INHERIT, Font::IGNORE or
-           Font::TOGGLE.
+           attributes with values FONT_INHERIT, FONT_IGNORE or
+           FONT_TOGGLE.
        */
        Font const getFont(BufferParams const &, pos_type pos,
                              Font const & outerfont) const;
@@ -280,25 +257,30 @@ public:
         */
        FontSpan fontSpan(pos_type pos) const;
        ///
-       /// this is a bottleneck.
-       value_type getChar(pos_type pos) const { return text_[pos]; }
+       char_type getChar(pos_type pos) const;
        /// Get the char, but mirror all bracket characters if it is right-to-left
-       value_type getUChar(BufferParams const &, pos_type pos) const;
+       char_type getUChar(BufferParams const &, pos_type pos) const;
        /// pos <= size() (there is a dummy font change at the end of each par)
        void setFont(pos_type pos, Font const & font);
        /// Returns the height of the highest font in range
-       Font_size highestFontInRange(pos_type startpos,
-                                       pos_type endpos, Font_size def_size) const;
+       FontSize highestFontInRange(pos_type startpos,
+                                       pos_type endpos, FontSize def_size) const;
        ///
        void insert(pos_type pos, docstring const & str,
                    Font const & font, Change const & change);
+
        ///
-       void insertChar(pos_type pos, value_type c, bool trackChanges);
+       void appendString(docstring const & s, Font const & font,
+               Change const & change);
        ///
-       void insertChar(pos_type pos, value_type c,
+       void appendChar(char_type c, Font const & font, Change const & change);
+       ///
+       void insertChar(pos_type pos, char_type c, bool trackChanges);
+       ///
+       void insertChar(pos_type pos, char_type c,
                        Font const &, bool trackChanges);
        ///
-       void insertChar(pos_type pos, value_type c,
+       void insertChar(pos_type pos, char_type c,
                        Font const &, Change const & change);
        ///
        void insertInset(pos_type pos, Inset * inset,
@@ -326,22 +308,17 @@ public:
        bool isHfill(pos_type pos) const;
 
        /// hinted by profiler
-       bool isInset(pos_type pos) const {
-               return getChar(pos) == static_cast<value_type>(META_INSET);
-       }
+       bool isInset(pos_type pos) const;
        ///
        bool isNewline(pos_type pos) const;
        /// return true if the char is a word separator
-       bool isSeparator(pos_type pos) const { return getChar(pos) == ' '; }
+       bool isSeparator(pos_type pos) const;
        ///
        bool isLineSeparator(pos_type pos) const;
        /// True if the character/inset at this point can be part of a word.
        /// Note that digits in particular are considered as letters
        bool isLetter(pos_type pos) const;
 
-       /// returns -1 if inset not found
-       int getPositionOfInset(Inset const * inset) const;
-
        /// returns true if at least one line break or line separator has been deleted
        /// at the beginning of the paragraph (either physically or logically)
        bool stripLeadingSpaces(bool trackChanges);
@@ -367,24 +344,34 @@ public:
        /// was previously past that position. Return 0 otherwise.
        int checkBiblio(bool track_changes);
 
+       /// To resolve macros properly the paragraphs are numbered.
+       /// Every macro definition is stored with its paragraph number
+       /// as well. Only those macros with a smaller number become 
+       /// visible in a paragraph (plus those in the same paragraph, but
+       /// in an earlier inset.
+       unsigned int macrocontextPosition() const;
+       ///
+       void setMacrocontextPosition(unsigned int pos);
+
        /// For each author, set 'used' to true if there is a change
        /// by this author in the paragraph.
        void checkAuthors(AuthorList const & authorList);
 
-       /// return the number of InsetOptArg in a paragraph
-       int numberOfOptArgs() const;
-
-private:
        ///
-       LayoutPtr layout_;
-       /**
-        * 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
-       pos_type begin_of_body_;
+       void changeCase(BufferParams const & bparams, pos_type pos,
+               pos_type right, TextCase action);
+
+       /// find \param str string inside Paragraph.
+       /// \return true if the specified string is at the specified position
+       /// \param del specifies whether deleted strings in ct mode will be considered
+       bool find(
+               docstring const & str, ///< string to search
+               bool cs, ///<
+               bool mw, ///<
+               pos_type pos, ///< start from here.
+               bool del = true) const;
 
+private:
        /// Pimpl away stuff
        class Private;
        ///