]> git.lyx.org Git - lyx.git/blobdiff - src/lyxparagraph.h
patch from dekel
[lyx.git] / src / lyxparagraph.h
index 661d9a2bca87c4c0a5c51ad7cb7e8f6705a53277..7852ca9dd5f6a111617ec412af1f86b1d93a311f 100644 (file)
@@ -5,7 +5,7 @@
  *           LyX, The Document Processor
  *      
  *         Copyright 1995 Matthias Ettrich
- *          Copyright 1995-1999 The LyX Team.
+ *          Copyright 1995-2000 The LyX Team.
  *
  * ====================================================== */
 
 #pragma interface
 #endif
 
-//#define NEW_TABLE 1
-
-#ifdef NEW_TABLE
-#include <list>
-#endif
-
 #include <vector>
+#include <list>
 
 #include "insets/lyxinset.h"
-#include "insets/insetbib.h"
 #include "table.h"
 #include "vspace.h"
 #include "layout.h"
 #include "support/block.h"
+#include "language.h"
 
 class BufferParams;
 class LyXBuffer;
 class TexRow;
 struct LaTeXFeatures;
+class InsetBibKey;
 
 /// A LyXParagraph holds all text, attributes and insets in a text paragraph
 class LyXParagraph  {
@@ -80,7 +76,7 @@ public:
                ///
                META_NEWLINE,
                ///
-               META_PROTECTED_SEPARATOR,
+               //META_PROTECTED_SEPARATOR,
                ///
                META_INSET
        };
@@ -113,18 +109,36 @@ public:
                WIDE_TAB    // CFO-G, 971106
        };
        
+       ///
+       typedef char value_type;
+       ///
+       typedef std::vector<value_type> TextContainer;
+       ///
+       typedef int size_type;
+
        ///
        LyXParagraph();
        /// this konstruktor inserts the new paragraph in a list
+       explicit
        LyXParagraph(LyXParagraph * par);
        /// the destruktors removes the new paragraph from the list
        ~LyXParagraph();
 
        ///
-       void writeFile(FILE *, BufferParams &, char, char);
-
+       Language const * getParLanguage() const;
        ///
-       void validate(LaTeXFeatures &);
+       bool isRightToLeftPar() const;
+       ///
+       void ChangeLanguage(Language const * from, Language const * to);
+       ///
+       bool isMultiLingual();
+       ///
+       string String(bool label);
+       
+       ///
+       void writeFile(std::ostream &, BufferParams const &, char, char) const;
+       ///
+       void validate(LaTeXFeatures &) const;
        
        ///
        int id() const {
@@ -137,25 +151,24 @@ public:
 
        ///
        void read();
-       
-       ///
-       void readSimpleWholeFile(FILE *);
 
        ///
-       LyXParagraph * TeXOnePar(string & file, TexRow & texrow,
-                               string & foot, TexRow & foot_texrow,
-                               int & foot_count);
+       LyXParagraph * TeXOnePar(std::ostream &, TexRow & texrow,
+                                bool moving_arg,
+                                std::ostream & foot, TexRow & foot_texrow,
+                                int & foot_count);
+       ///
+       bool SimpleTeXOnePar(std::ostream &, TexRow & texrow, bool moving_arg);
 
        ///
-       LyXParagraph * TeXEnvironment(string & file, TexRow & texrow,
-                                    string & foot, TexRow & foot_texrow,
-                                    int & foot_count);
-       
+       LyXParagraph * TeXEnvironment(std::ostream &, TexRow & texrow,
+                                     std::ostream & foot, TexRow & foot_texrow,
+                                     int & foot_count);
        ///
        LyXParagraph * Clone() const;
        
        ///
-       bool HasSameLayout(LyXParagraph const * par);
+       bool HasSameLayout(LyXParagraph const * par) const;
        
        ///
        void MakeSameLayout(LyXParagraph const * par);
@@ -168,22 +181,41 @@ public:
                        || dhook->GetDepth() != GetDepth());
        }
 
-
+       /** Check if the current paragraph is the last paragraph in a
+           proof environment */
+       int GetEndLabel() const;
        ///
-       typedef char value_type;
-       ///
-       typedef vector<value_type> TextContainer;
+       Inset * InInset() { return inset_owner; }
        ///
-       typedef int size_type;
+       void SetInsetOwner(Inset * i) { inset_owner = i; }
+private:
        ///
        TextContainer text;
+       ///
+       Inset * inset_owner;
+
+public:
        ///
        size_type size() const { return text.size(); }
+       ///
+       void fitToSize() {
+               text.resize(text.size());
+       }
+       void setContentsFromPar(LyXParagraph * par) {
+               text = par->text;
+       }
+       void clearContents() {
+               text.clear();
+       }
+       
        /// 
        VSpace added_space_top;
        
        /// 
        VSpace added_space_bottom;
+
+       ///
+       Spacing spacing;
        
        ///
        LyXTextClass::LayoutList::size_type layout;
@@ -295,6 +327,8 @@ public:
        LyXParagraph * PreviousBeforeFootnote();
        ///
        LyXParagraph * LastPhysicalPar();
+       ///
+       LyXParagraph const * LastPhysicalPar() const;
        
        ///
        LyXParagraph * FirstPhysicalPar();
@@ -313,7 +347,7 @@ public:
        ///
        int BeginningOfMainBody() const;
        ///
-       string GetLabestring() const;
+       string GetLabelstring() const;
        
        /// the next two functions are for the manual labels
        string GetLabelWidthString() const;
@@ -345,6 +379,9 @@ public:
          This is what is stored in the fonttable
         */
        LyXFont GetFontSettings(size_type pos) const;
+       ///
+       LyXFont GetFirstFontSettings() const;
+
        /** Get fully instantiated font. If pos == -1, use the layout
          font attached to this paragraph.
          If pos == -2, use the label font of the layout attached here.
@@ -357,6 +394,11 @@ public:
        char GetChar(size_type pos);
        ///
        char GetChar(size_type pos) const;
+       /// The position must already exist.
+       void SetChar(size_type pos, char c) {
+               text[pos] = c;
+       }
+       
        ///
        void SetFont(size_type pos, LyXFont const & font);
        ///
@@ -369,12 +411,12 @@ public:
        ///
        void InsertInset(size_type pos, Inset * inset);
        ///
+       bool InsertInsetAllowed(Inset * inset);
+       ///
        Inset * GetInset(size_type pos);
        ///
        Inset const * GetInset(size_type pos) const;
        ///
-       Inset * ReturnNextInsetPointer(size_type & pos);
-       ///
        void OpenFootnote(size_type pos);
        ///
        void CloseFootnote(size_type pos);
@@ -383,7 +425,7 @@ public:
        ///
        void CutIntoMinibuffer(size_type pos);
        ///
-       void InsertFromMinibuffer(size_type pos);
+       bool InsertFromMinibuffer(size_type pos);
 
        ///
        bool IsHfill(size_type pos) const;
@@ -430,14 +472,14 @@ public:
        LyXParagraph * FirstSelfrowPar();
 
        ///
-       int ClearParagraph(){
+       int ClearParagraph() {
                int i = 0;
                if (!IsDummy() && !table){
                        while (Last()
                               && (IsNewline(0) 
                                   || IsLineSeparator(0))){
                                Erase(0);
-                               i++;
+                               ++i;
                        }
                }
                return i;
@@ -449,10 +491,7 @@ public:
          one (or more) paragraphs with the footnote, and finally
          the a paragraph with the text after the footnote. Only the
          first paragraph keeps information  about layoutparameters, */
-       bool IsDummy() const{
-               return (footnoteflag == LyXParagraph::NO_FOOTNOTE && previous
-                       && previous->footnoteflag != LyXParagraph::NO_FOOTNOTE);
-       }
+       bool IsDummy() const;
 
         /* 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 */
@@ -460,19 +499,46 @@ public:
         void SetPExtraType(int type, char const * width, char const * widthp);
        ///
         void UnsetPExtraType();
+#if 0
        ///
-       bool RoffContTableRows(FILE * file, size_type i,
-                              int actcell);
-       ///
-       void DocBookContTableRows(string & file, string & extra, int & desc_on,
-                                 size_type i,
-                                 int current_cell_number, int & column);
+       bool RoffContTableRows(std::ostream &, size_type i, int actcell);
+#endif
        ///
        bool linuxDocConvertChar(char c, string & sgml_string);
        ///
-       void SimpleDocBookOneTablePar(string & file, string & extra,
+       void DocBookContTableRows(std::ostream &, string & extra,
+                                 int & desc_on, size_type i,
+                                 int current_cell_number, int & column);
+       ///
+       void SimpleDocBookOneTablePar(std::ostream &, string & extra,
                                      int & desc_on, int depth);
 private:
+       ///
+       struct InsetTable {
+               ///
+               size_type pos;
+               ///
+               Inset * inset;
+               ///
+               InsetTable(size_type p, Inset * i) { pos = p; inset = i;}
+       };
+       ///
+       friend struct matchIT;
+       ///
+       struct matchIT {
+               /// used by lower_bound
+               inline
+               int operator()(LyXParagraph::InsetTable const & a,
+                              LyXParagraph::size_type pos) const {
+                       return a.pos < pos;
+               }
+               /// used by upper_bound
+               inline
+               int operator()(LyXParagraph::size_type pos,
+                              LyXParagraph::InsetTable const & a) const {
+                       return pos < a.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
@@ -494,60 +560,38 @@ private:
                allowed in these font tables.
                */
                LyXFont font;
-#ifndef NEW_TABLE
-               /// Pointer to next font entry
-               FontTable * next;
-#endif
        };
        ///
-       struct InsetTable {
-               ///
-               size_type pos;
-               ///
-               Inset * inset;
-#ifndef NEW_TABLE
-               ///
-               InsetTable * next;
-#endif
-       };
-#ifdef NEW_TABLE
-       ///
-       typedef list<FontTable> FontList;
-       ///
-       typedef list<InsetTable> InsetList;
+       typedef std::list<FontTable> FontList;
        ///
        FontList fontlist;
        ///
-       InsetList insetlist;
-#else
+       typedef std::vector<InsetTable> InsetList;
        ///
-       FontTable * fonttable;
-       ///
-       InsetTable * insettable;
-#endif
-       ///
-       LyXParagraph * TeXDeeper(string & file, TexRow & texrow,
-                                  string & foot, TexRow & foot_texrow,
-                                  int & foot_count);
+       InsetList insetlist;
        ///
-       LyXParagraph * TeXFootnote(string & file, TexRow & texrow,
-                                  string & foot, TexRow & foot_texrow,
-                                  int & foot_count);
+       LyXParagraph * TeXDeeper(std::ostream &, TexRow & texrow,
+                                std::ostream & foot, TexRow & foot_texrow,
+                                int & foot_count);
        ///
-       bool SimpleTeXOnePar(string & file, TexRow & texrow);
+       LyXParagraph * TeXFootnote(std::ostream &, TexRow & texrow,
+                                  std::ostream & foot, TexRow & foot_texrow,
+                                  int & foot_count,
+                                  bool parent_is_rtl);
        ///
-       bool SimpleTeXOneTablePar(string & file, TexRow & texrow);
+       bool SimpleTeXOneTablePar(std::ostream &, TexRow & texrow);
        ///
-       bool TeXContTableRows(string & file, size_type i,
+       bool TeXContTableRows(std::ostream &, size_type i,
                              int current_cell_number,
                               int & column, TexRow & texrow);
        ///
-       void SimpleTeXBlanks(string & file, TexRow & texrow,
+       void SimpleTeXBlanks(std::ostream &, TexRow & texrow,
                             size_type const i,
                             int & column, LyXFont const & font,
                             LyXLayout const & style);
        ///
-       void SimpleTeXSpecialChars(string & file, TexRow & texrow,
+       void SimpleTeXSpecialChars(std::ostream &, TexRow & texrow,
+                                  bool moving_arg,
                                   LyXFont & font, LyXFont & running_font,
                                   LyXFont & basefont, bool & open_font,
                                   LyXLayout const & style,
@@ -557,5 +601,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