]> git.lyx.org Git - lyx.git/blobdiff - src/lyxparagraph.h
several changes and some new insets, read the Changelog
[lyx.git] / src / lyxparagraph.h
index 1d5937592199c2616e9468c42f22ae8df26cc8d1..00a76906f69bca326043ffe1bd81f721726ea24a 100644 (file)
 #include "support/block.h"
 #include "language.h"
 
+#define NEW_WAY 1
+
 class BufferParams;
 class LyXBuffer;
 class TexRow;
 struct LaTeXFeatures;
 class InsetBibKey;
+class BufferView;
 
 /// A LyXParagraph holds all text, attributes and insets in a text paragraph
 class LyXParagraph  {
@@ -55,6 +58,7 @@ public:
                ///
                MINIPAGE_ALIGN_BOTTOM
        };
+#ifndef NEW_INSETS
        ///
        enum META_KIND {
                ///
@@ -108,7 +112,7 @@ public:
                ///
                WIDE_TAB    // CFO-G, 971106
        };
-       
+#endif
        ///
        typedef char value_type;
        ///
@@ -125,16 +129,23 @@ public:
        ~LyXParagraph();
 
        ///
-       Language const * getParLanguage() const;
+       Language const * getParLanguage(BufferParams const &) const;
        ///
-       bool isRightToLeftPar() const;
+       bool isRightToLeftPar(BufferParams const &) const;
        ///
-       void ChangeLanguage(Language const * from, Language const * to);
+       void ChangeLanguage(BufferParams const & bparams,
+                           Language const * from, Language const * to);
+       ///
+       bool isMultiLingual(BufferParams const &);
+       ///
+
+       string String(Buffer const *, bool label);
        ///
-       bool isMultiLingual();
+       string String(Buffer const *, size_type beg, size_type end);
        
        ///
-       void writeFile(std::ostream &, BufferParams const &, char, char) const;
+       void writeFile(Buffer const *, std::ostream &, BufferParams const &,
+                      char, char) const;
        ///
        void validate(LaTeXFeatures &) const;
        
@@ -151,14 +162,18 @@ public:
        void read();
 
        ///
-       LyXParagraph * TeXOnePar(std::ostream &, TexRow & texrow,
+       LyXParagraph * TeXOnePar(Buffer const *, BufferParams const &,
+                                std::ostream &, TexRow & texrow,
+                                bool moving_arg,
                                 std::ostream & foot, TexRow & foot_texrow,
                                 int & foot_count);
        ///
-       bool SimpleTeXOnePar(std::ostream &, TexRow & texrow);
+       bool SimpleTeXOnePar(Buffer const *, BufferParams const &,
+                            std::ostream &, TexRow & texrow, bool moving_arg);
 
        ///
-       LyXParagraph * TeXEnvironment(std::ostream &, TexRow & texrow,
+       LyXParagraph * TeXEnvironment(Buffer const *, BufferParams const &,
+                                     std::ostream &, TexRow & texrow,
                                      std::ostream & foot, TexRow & foot_texrow,
                                      int & foot_count);
        ///
@@ -180,11 +195,13 @@ public:
 
        /** Check if the current paragraph is the last paragraph in a
            proof environment */
-       int GetEndLabel() const;
+       int GetEndLabel(BufferParams const &) const;
        ///
        Inset * InInset() { return inset_owner; }
        ///
-       void SetInsetOwner(Inset * i) { inset_owner = i; }
+       void SetInsetOwner(Inset * i);
+       ///
+       void deleteInsetsLyXText(BufferView *);
 private:
        ///
        TextContainer text;
@@ -210,10 +227,13 @@ public:
        
        /// 
        VSpace added_space_bottom;
+
+       ///
+       Spacing spacing;
        
        ///
        LyXTextClass::LayoutList::size_type layout;
-       
+#ifndef NEW_INSETS
        /**
          \begin{itemize}
          \item no footnote, closed footnote, 
@@ -225,7 +245,7 @@ public:
 
        /// footnote, margin, fig, tab
        footnote_kind footnotekind;
-   
+#endif
        //@Man: the LyX- DTP-switches
        //@{
        ///
@@ -354,9 +374,11 @@ public:
        ///
        char GetDepth() const;
        ///
-       void SetLayout(LyXTextClass::LayoutList::size_type new_layout);
+       void SetLayout(BufferParams const &,
+                      LyXTextClass::LayoutList::size_type new_layout);
        ///
-       void SetOnlyLayout(LyXTextClass::LayoutList::size_type new_layout);
+       void SetOnlyLayout(BufferParams const &,
+                          LyXTextClass::LayoutList::size_type new_layout);
        ///
        int GetFirstCounter(int i) const;
        ///
@@ -365,14 +387,14 @@ public:
        void Erase(size_type pos);
        /** the flag determines wether the layout should be copied
         */ 
-       void BreakParagraph(size_type pos, int flag);
+       void BreakParagraph(BufferParams const &, size_type pos, int flag);
        ///
-       void BreakParagraphConservative(size_type pos);
+       void BreakParagraphConservative(BufferParams const &, size_type pos);
        /** Get unistantiated font setting. Returns the difference
          between the characters font and the layoutfont.
          This is what is stored in the fonttable
         */
-       LyXFont GetFontSettings(size_type pos) const;
+       LyXFont GetFontSettings(BufferParams const &, size_type pos) const;
        ///
        LyXFont GetFirstFontSettings() const;
 
@@ -383,7 +405,7 @@ public:
          attributes with values LyXFont::INHERIT, LyXFont::IGNORE or 
          LyXFont::TOGGLE.
          */
-       LyXFont getFont(size_type pos) const;
+       LyXFont getFont(BufferParams const &, size_type pos) const;
        ///
        char GetChar(size_type pos);
        ///
@@ -402,8 +424,16 @@ public:
                                              size_type endpos) const;
        ///
        void InsertChar(size_type pos, char c);
+#ifdef NEW_WAY
+       ///
+       void InsertChar(size_type pos, char c, LyXFont const &);
+#endif
        ///
        void InsertInset(size_type pos, Inset * inset);
+#ifdef NEW_WAY
+       ///
+       void InsertInset(size_type pos, Inset * inset, LyXFont const &);
+#endif
        ///
        bool InsertInsetAllowed(Inset * inset);
        ///
@@ -411,15 +441,13 @@ public:
        ///
        Inset const * GetInset(size_type pos) const;
        ///
-       Inset * ReturnNextInsetPointer(size_type & pos);
-       ///
        void OpenFootnote(size_type pos);
        ///
        void CloseFootnote(size_type pos);
        /// important for cut and paste
-       void CopyIntoMinibuffer(size_type pos) const;
+       void CopyIntoMinibuffer(BufferParams const &, size_type pos) const;
        ///
-       void CutIntoMinibuffer(size_type pos);
+       void CutIntoMinibuffer(BufferParams const &, size_type pos);
        ///
        bool InsertFromMinibuffer(size_type pos);
 
@@ -450,7 +478,7 @@ public:
        /** paste this paragraph with the next one
          be carefull, this doesent make any check at all
          */ 
-       void PasteParagraph();
+       void PasteParagraph(BufferParams const &);
 
        /// used to remove the error messages
        int AutoDeleteInsets();
@@ -468,18 +496,7 @@ public:
        LyXParagraph * FirstSelfrowPar();
 
        ///
-       int ClearParagraph() {
-               int i = 0;
-               if (!IsDummy() && !table){
-                       while (Last()
-                              && (IsNewline(0) 
-                                  || IsLineSeparator(0))){
-                               Erase(0);
-                               ++i;
-                       }
-               }
-               return i;
-       }
+       int StripLeadingSpaces(LyXTextClassList::size_type tclass); 
        
        /** A paragraph following a footnote is a "dummy". A paragraph
          with a footnote in it is stored as three paragraphs:
@@ -492,21 +509,20 @@ public:
         /* If I set a PExtra Indent on one paragraph of a ENV_LIST-TYPE
            I have to set it on each of it's elements */
        ///
-        void SetPExtraType(int type, char const * width, char const * widthp);
-       ///
-        void UnsetPExtraType();
-#if 0
+        void SetPExtraType(BufferParams const &,
+                          int type, char const * width, char const * widthp);
        ///
-       bool RoffContTableRows(std::ostream &, size_type i, int actcell);
-#endif
+        void UnsetPExtraType(BufferParams const &);
        ///
        bool linuxDocConvertChar(char c, string & sgml_string);
        ///
-       void DocBookContTableRows(std::ostream &, string & extra,
+       void DocBookContTableRows(Buffer const *,
+                                 std::ostream &, string & extra,
                                  int & desc_on, size_type i,
                                  int current_cell_number, int & column);
        ///
-       void SimpleDocBookOneTablePar(std::ostream &, string & extra,
+       void SimpleDocBookOneTablePar(Buffer const *,
+                                     std::ostream &, string & extra,
                                      int & desc_on, int depth);
 private:
        ///
@@ -519,6 +535,8 @@ private:
                InsetTable(size_type p, Inset * i) { pos = p; inset = i;}
        };
        ///
+       friend struct matchIT;
+       ///
        struct matchIT {
                /// used by lower_bound
                inline
@@ -538,12 +556,15 @@ private:
          I don't think it's worth the effort to implement a more effective
          datastructure, because the number of different fonts in a paragraph
          is limited. (Asger)
+         Nevertheless, I decided to store fontlist using a sorted vector:
+         fontlist = { {pos_1,font_1} , {pos_2,font_2} , ... } where
+         pos_1 < pos_2 < ..., font_{i-1} != font_i for all i,
+         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  {
-               /// Start position of paragraph this font attribute covers
+               /// End position of paragraph this font attribute covers
                size_type pos;
-               /// Ending position of paragraph this font attribute covers
-               size_type pos_end;
                /** Font. Interpretation of the font values:
                If a value is LyXFont::INHERIT_*, it means that the font 
                attribute is inherited from either the layout of this
@@ -554,9 +575,28 @@ private:
                allowed in these font tables.
                */
                LyXFont font;
+               ///
+               FontTable(size_type p, LyXFont const & f) {pos = p; font = f;}
        };
+       friend struct matchFT;
        ///
-       typedef std::list<FontTable> FontList;
+       struct matchFT {
+               /// used by lower_bound
+               inline
+               int operator()(LyXParagraph::FontTable const & a,
+                              LyXParagraph::size_type pos) const {
+                       return a.pos < pos;
+               }
+               /// used by upper_bound
+               inline
+               int operator()(LyXParagraph::size_type pos,
+                              LyXParagraph::FontTable const & a) const {
+                       return pos < a.pos;
+               }
+       };
+
+       ///
+       typedef std::vector<FontTable> FontList;
        ///
        FontList fontlist;
        ///
@@ -564,18 +604,22 @@ private:
        ///
        InsetList insetlist;
        ///
-       LyXParagraph * TeXDeeper(std::ostream &, TexRow & texrow,
+       LyXParagraph * TeXDeeper(Buffer const *, BufferParams const &,
+                                std::ostream &, TexRow & texrow,
                                 std::ostream & foot, TexRow & foot_texrow,
                                 int & foot_count);
        ///
-       LyXParagraph * TeXFootnote(std::ostream &, TexRow & texrow,
+       LyXParagraph * TeXFootnote(Buffer const *, BufferParams const &,
+                                  std::ostream &, TexRow & texrow,
                                   std::ostream & foot, TexRow & foot_texrow,
                                   int & foot_count,
                                   bool parent_is_rtl);
        ///
-       bool SimpleTeXOneTablePar(std::ostream &, TexRow & texrow);
+       bool SimpleTeXOneTablePar(Buffer const *, BufferParams const &,
+                                 std::ostream &, TexRow & texrow);
        ///
-       bool TeXContTableRows(std::ostream &, size_type i,
+       bool TeXContTableRows(Buffer const *, BufferParams const &,
+                             std::ostream &, size_type i,
                              int current_cell_number,
                               int & column, TexRow & texrow);
        ///
@@ -584,7 +628,9 @@ private:
                             int & column, LyXFont const & font,
                             LyXLayout const & style);
        ///
-       void SimpleTeXSpecialChars(std::ostream &, TexRow & texrow,
+       void SimpleTeXSpecialChars(Buffer const *, BufferParams const &,
+                                  std::ostream &, TexRow & texrow,
+                                  bool moving_arg,
                                   LyXFont & font, LyXFont & running_font,
                                   LyXFont & basefont, bool & open_font,
                                   LyXLayout const & style,
@@ -594,6 +640,37 @@ private:
        unsigned int id_;
        ///
        static unsigned int paragraph_id;
+public:
+       class inset_iterator {
+       public:
+               inset_iterator() {}
+               inset_iterator(InsetList::iterator const & iter) : it(iter) {};
+               inset_iterator & operator++() {
+                       ++it;
+                       return *this;
+               }
+               Inset * operator*() { return (*it).inset; }
+               size_type getPos() {return (*it).pos; }
+               bool operator==(inset_iterator const & iter) const {
+                       return it == iter.it;
+               }
+               bool operator!=(inset_iterator const & iter) const {
+                       return it != iter.it;
+               }
+       private:
+               InsetList::iterator it;
+       };
+       ///
+       inset_iterator inset_iterator_begin() {
+               return inset_iterator(insetlist.begin());
+       }
+       ///
+       inset_iterator inset_iterator_end() {
+               return inset_iterator(insetlist.end());
+       }
+       ///
+       inset_iterator InsetIterator(size_type pos);
+
 };
 
 #endif