]> git.lyx.org Git - lyx.git/blobdiff - src/lyxtext.h
John's Layout Tabular UI improvements and Martins fixes to clearing the
[lyx.git] / src / lyxtext.h
index 87d6b78c4b69127129341faf36ee4f9ce8bfca03..8c6114ea6241f02b5b2536f47f266d30b3df5723 100644 (file)
 
 #include "lyxfont.h"
 #include "lyxcursor.h"
-#include "paragraph.h"
 #include "layout.h"
-#include "lyxrow.h"
-#include "vspace.h"
+#include "LColor.h"
+#include "insets/inset.h"
 
 class Buffer;
 class BufferParams;
 class BufferView;
 class InsetText;
+class Paragraph;
+class Row;
+class Spacing;
+class UpdatableInset;
+class VSpace;
 
 
 /**
@@ -47,10 +51,15 @@ public:
        };
        ///
        enum word_location {
-               /// the word around the cursor
+               // the word around the cursor, only if the cursor is
+               //not at a boundary
+               WHOLE_WORD_STRICT,
+               // the word around the cursor
                WHOLE_WORD,
                /// the word begining from the cursor position
                PARTIAL_WORD,
+               /// the word around the cursor or before the cursor
+               PREVIOUS_WORD,
                /// the next word (not yet used)
                NEXT_WORD
        };
@@ -88,13 +97,16 @@ public:
        int getRealCursorX(BufferView *) const;
        ///
        LyXFont const getFont(Buffer const *, Paragraph * par,
-                       Paragraph::size_type pos) const;
+               lyx::pos_type pos) const;
+       ///
+       LyXFont const getLayoutFont(Buffer const *, Paragraph * par) const;
+       ///
+       LyXFont const getLabelFont(Buffer const *, Paragraph * par) const;
        ///
        void setCharFont(Buffer const *, Paragraph * par,
-                        Paragraph::size_type pos, LyXFont const & font);
+                        lyx::pos_type pos, LyXFont const & font);
        void setCharFont(BufferView *, Paragraph * par,
-                        Paragraph::size_type pos,
-                        LyXFont const & font, bool toggleall);
+                        lyx::pos_type pos, LyXFont const & font, bool toggleall);
        /// returns a pointer to the very first Paragraph
        Paragraph * firstParagraph() const;
   
@@ -107,8 +119,9 @@ public:
        Paragraph * setLayout(BufferView *, LyXCursor & actual_cursor,
                                 LyXCursor & selection_start,
                                 LyXCursor & selection_end,
-                                LyXTextClass::size_type layout);
-       void setLayout(BufferView *, LyXTextClass::size_type layout);
+                                lyx::layout_type layout);
+       ///
+       void setLayout(BufferView *, lyx::layout_type layout);
        
        /// used in setlayout
        void makeFontEntriesLayoutSpecific(Buffer const *, Paragraph * par);
@@ -124,7 +137,7 @@ public:
 
        /** Get the depth at current cursor position
         */
-       int getDepth() const { return cursor.par()->getDepth(); }
+       int getDepth() const;
        
        /** set font over selection and make a total rebreak of those
          paragraphs.
@@ -144,6 +157,9 @@ public:
        
        ///
        void toggleFree(BufferView *, LyXFont const &, bool toggleall = false);
+
+       ///
+       string getStringToIndex(BufferView *);
        
        /** recalculates the heights of all previous rows of the
            specified paragraph.  needed, if the last characters font
@@ -165,10 +181,10 @@ public:
    
        /** Completes the insertion with a full rebreak.
            Returns true if something was broken. */
-        bool fullRebreak(BufferView *);
+       bool fullRebreak(BufferView *);
 
        ///
-       Row * need_break_row;
+       mutable Row * need_break_row;
        ///
        mutable int refresh_y;
        ///
@@ -180,10 +196,11 @@ public:
        ///
        mutable Row * refresh_row;
        ///
-       int refresh_pos;
+       lyx::pos_type refresh_pos;
 
        /// give and set the LyXText status
        text_status status() const;
+       ///
        void status(BufferView *, text_status) const;
 
 private:       
@@ -202,15 +219,20 @@ public:
        /** returns the column near the specified x-coordinate of the row 
         x is set to the real beginning of this column
         */ 
-       int getColumnNearX(BufferView *, Row * row,
-                          int & x, bool & boundary) const;
+       lyx::pos_type getColumnNearX(BufferView *, Row * row,
+                                           int & x, bool & boundary) const;
        
        /** returns a pointer to a specified row. y is set to the beginning
         of the row
         */
        Row * getRow(Paragraph * par,
-                    Paragraph::size_type pos, int & y) const;
-
+                    lyx::pos_type pos, int & y) const;
+       /** returns the firstrow, this could be done with the above too but
+           IMO it's stupid to have to allocate a dummy y all the time I need
+           the first row
+       */
+       Row * firstRow() { return firstrow; }
+                       
        /** returns the height of a default row, needed  for scrollbar
         */
        int defaultHeight() const;
@@ -224,9 +246,9 @@ public:
          Since the LyXText now has been moved from Buffer to BufferView
          it should not be absolutely needed to move the cursor...
          */
-       mutable LyXCursor cursor;
+       mutable LyXCursor cursor; // actual cursor position
 
-       /** The structrue that keeps track of the selections set. */
+       /** The structure that keeps track of the selections set. */
        struct Selection {
                Selection() 
                        : set_(false), mark_(false)
@@ -243,9 +265,10 @@ public:
                void mark(bool m) {
                        mark_ = m;
                }
-               LyXCursor cursor;
-               LyXCursor start;
-               LyXCursor end;
+               LyXCursor cursor; // temporary cursor to hold a cursor position
+                                 // until setSelection is called!
+               LyXCursor start;  // start of a REAL selection
+               LyXCursor end;    // end of a REAL selection
        private:
                bool set_; // former selection
                bool mark_; // former mark_set
@@ -253,25 +276,25 @@ public:
        };
        mutable Selection selection;
 
-       /// needed for the toggling
-       LyXCursor last_sel_cursor;
-       ///
-       LyXCursor toggle_cursor;
-       ///
-       LyXCursor toggle_end_cursor;
+       /// needed for the toggling (cursor position on last selection made)
+       mutable LyXCursor last_sel_cursor; 
+       /// needed for toggling the selection in screen.C
+       mutable LyXCursor toggle_cursor;
+       /// needed for toggling the selection in screen.C
+       mutable LyXCursor toggle_end_cursor;
    
        /// need the selection cursor:
        void setSelection(BufferView *);
        ///
-       void clearSelection(BufferView *) const;
+       void clearSelection() const;
        ///
-       string const selectionAsString(Buffer const *) const;
+       string const selectionAsString(Buffer const *, bool label) const;
        
        /// select the word we need depending on word_location
        void getWord(LyXCursor & from, LyXCursor & to, 
                     word_location const) const;
        /// just selects the word the cursor is in
-       void selectWord(BufferView *, word_location const = WHOLE_WORD);
+       void selectWord(BufferView *, word_location const);
        /// returns the inset at cursor (if it exists), 0 otherwise
        Inset * getInset() const;
 
@@ -280,21 +303,21 @@ public:
         to the beginning of this word. 
         With SelectSelectedWord can this be highlighted really
         */ 
-       string const selectNextWord(BufferView *, float & value) const;
+       string const selectNextWordToSpellcheck(BufferView *, float & value) const;
        ///
        void selectSelectedWord(BufferView *);
        ///
        void setCursor(BufferView *, Paragraph * par,
-                      Paragraph::size_type pos,
+                      lyx::pos_type pos,
                       bool setfont = true,
                       bool boundary = false) const;
        ///
        void setCursor(BufferView *, LyXCursor &, Paragraph * par,
-                      Paragraph::size_type pos,
+                      lyx::pos_type pos,
                       bool boundary = false) const;
        ///
        void setCursorIntern(BufferView *, Paragraph * par,
-                            Paragraph::size_type pos,
+                            lyx::pos_type pos,
                             bool setfont = true,
                             bool boundary = false) const;
        ///
@@ -302,10 +325,10 @@ public:
 
        ///
        bool isBoundary(Buffer const *, Paragraph * par,
-                       Paragraph::size_type pos) const;
+                       lyx::pos_type pos) const;
        ///
        bool isBoundary(Buffer const *, Paragraph * par,
-                        Paragraph::size_type pos,
+                        lyx::pos_type pos,
                         LyXFont const & font) const;
 
        ///
@@ -353,7 +376,7 @@ public:
        void deleteLineForward(BufferView *);
        ///
        bool selectWordWhenUnderCursor(BufferView *, 
-                                      word_location const = WHOLE_WORD);
+                                      word_location const);
        ///
        enum TextCase {
                ///
@@ -383,7 +406,7 @@ public:
        /// 
        void toggleInset(BufferView *);
        ///
-       void cutSelection(BufferView *, bool = true);
+       void cutSelection(BufferView *, bool doclear = true, bool realcut = true);
        ///
        void copySelection(BufferView *);
        ///
@@ -392,14 +415,6 @@ public:
        void copyEnvironmentType();
        ///
        void pasteEnvironmentType(BufferView *);
-       ///
-       void insertFootnote();
-       ///
-       void insertMarginpar();
-       ///
-       void insertFigure();
-       ///
-       void insertTabular();
 
        /** the DTP switches for paragraphs. LyX will store the top settings
         always in the first physical paragraph, the bottom settings in the
@@ -412,6 +427,7 @@ public:
                          bool pagebreak_top, bool pagebreak_bottom,
                          VSpace const & space_top,
                          VSpace const & space_bottom,
+                         Spacing const & spacing,
                          LyXAlignment align, 
                          string labelwidthstring,
                          bool noindent);
@@ -443,11 +459,9 @@ public:
        /// returns false if inset wasn't found
        bool updateInset(BufferView *, Inset *);
        ///
-       void checkParagraph(BufferView *, Paragraph * par,
-                           Paragraph::size_type pos);
+       void checkParagraph(BufferView *, Paragraph * par, lyx::pos_type pos);
        ///
-       int numberOfCell(Paragraph * par,
-                        Paragraph::size_type pos) const;
+       int numberOfCell(Paragraph * par, lyx::pos_type pos) const;
        ///
        void removeTableRow(LyXCursor & cursor) const;
        ///
@@ -457,11 +471,13 @@ public:
        ///
        int workWidth(BufferView *) const;
        ///
+       int workWidth(BufferView *, Inset * inset) const;
+       ///
        void computeBidiTables(Buffer const *, Row * row) const;
 
        /// Maps positions in the visual string to positions in logical string.
        inline
-       Paragraph::size_type log2vis(Paragraph::size_type pos) const {
+       lyx::pos_type log2vis(lyx::pos_type pos) const {
                if (bidi_start == -1)
                        return pos;
                else
@@ -470,7 +486,7 @@ public:
 
        /// Maps positions in the logical string to positions in visual string.
        inline
-       Paragraph::size_type vis2log(Paragraph::size_type pos) const {
+       lyx::pos_type vis2log(lyx::pos_type pos) const {
                if (bidi_start == -1)
                        return pos;
                else
@@ -478,7 +494,7 @@ public:
        }
        ///
        inline
-       Paragraph::size_type bidi_level(Paragraph::size_type pos) const {
+       lyx::pos_type bidi_level(lyx::pos_type pos) const {
                if (bidi_start == -1)
                        return 0;
                else
@@ -486,7 +502,7 @@ public:
        }       
        ///
        inline
-       bool bidi_InRange(Paragraph::size_type pos) const {
+       bool bidi_InRange(lyx::pos_type pos) const {
                return bidi_start == -1 ||
                        (bidi_start <= pos && pos <= bidi_end);
        }
@@ -500,12 +516,11 @@ private:
          Asger has learned that this should be a buffer-property instead
          Lgb has learned that 'char' is a lousy type for non-characters
          */
-       LyXTextClass::size_type copylayouttype;
+       lyx::layout_type copylayouttype;
 
        /** inserts a new row behind the specified row, increments
            the touched counters */
-       void insertRow(Row * row, Paragraph * par,
-                      Paragraph::size_type pos) const;
+       void insertRow(Row * row, Paragraph * par, lyx::pos_type pos) const;
        /** removes the row and reset the touched counters */
        void removeRow(Row * row) const;
 
@@ -535,7 +550,69 @@ private:
                            float & fill_label_hfill,
                            bool bidi = true) const;
 
-       ///
+       /// A struct used for drawing routines
+       struct DrawRowParams {
+               // the bufferview
+               BufferView * bv; 
+               // the row
+               Row * row;
+               // the painter to use
+               Painter * pain; 
+               // has the background been cleared
+               bool cleared;
+               /// x offset (e.g. for insets)
+               int xo;
+               /// y offset (e.g. for insets)
+               int yo;
+               /// FIXME
+               float x;
+               /// FIXME
+               int y;
+               /// the inset/view full width
+               int width;
+               /// hfill size
+               float hfill;
+               /// label hfill size
+               float label_hfill;
+               /// fill separator size
+               float separator;
+       };
+                
+       /// paint the background
+       bool paintRowBackground(DrawRowParams & p);
+       /// paint the selection background 
+       void paintRowSelection(DrawRowParams & p);
+
+       /// paint appendix marker
+       void paintRowAppendix(DrawRowParams & p);
+        
+       /// paint env depth bar 
+       void paintRowDepthBar(DrawRowParams & p);
+       /// get the on-screen size of the length marker
+       int getLengthMarkerHeight(BufferView * bv, VSpace const & vsp) const;
+       /// paint an added space marker
+       int drawLengthMarker(DrawRowParams & p, string const & str,
+               VSpace const & vsp, int start); 
+       /// paint a first row in a paragraph
+       void paintFirstRow(DrawRowParams & p);
+       /// paint a last row in a paragraph
+       void paintLastRow(DrawRowParams & p);
+       /// paint text
+       void paintRowText(DrawRowParams & p);
+       // fix the cursor `cur' after a characters has been deleted at `where'
+       // position. Called by deleteEmptyParagraphMechanism
+       void fixCursorAfterDelete(BufferView * bview,
+                                 LyXCursor & cur,
+                                 LyXCursor const & where) const;
+       
+       /// delete double space or empty paragraphs around old_cursor 
        void deleteEmptyParagraphMechanism(BufferView *,
                                           LyXCursor const & old_cursor) const;
 
@@ -553,18 +630,30 @@ private:
        
        ///
        int singleWidth(BufferView *, Paragraph * par,
-                       Paragraph::size_type pos) const;
+               lyx::pos_type pos) const;
        ///
        int singleWidth(BufferView *, Paragraph * par,
-                       Paragraph::size_type pos, char c) const;
-       ///
-       void draw(BufferView *, Row const * row,
-                 Paragraph::size_type & pos,
-                 int offset, float & x, bool cleared);
+               lyx::pos_type pos, char c) const;
+
+       /// draw normal chars
+       void drawChars(DrawRowParams & p, lyx::pos_type & vpos,
+               bool hebrew, bool arabic);
+       /// draw from arabic composed char
+       void drawArabicComposeChar(DrawRowParams & p, lyx::pos_type & vpos);
+       /// draw from hebrew composed char
+       void drawHebrewComposeChar(DrawRowParams & p, lyx::pos_type & vpos);
+       /// draw a mark for foreign language, starting from orig_x
+       void drawForeignMark(DrawRowParams & p, float const orig_x, LyXFont const & orig_font);
+       /// draw an inset 
+       void drawInset(DrawRowParams & p, lyx::pos_type const pos);
+       /// draw new line marker
+       void drawNewline(DrawRowParams & p, lyx::pos_type const pos);
+       /// draw text
+       void draw(DrawRowParams & p, lyx::pos_type & vpos);
 
        /// get the next breakpoint in a given paragraph
-       Paragraph::size_type nextBreakPoint(BufferView *, Row const * row,
-                                              int width) const;
+       lyx::pos_type nextBreakPoint(BufferView *, Row const * row, int width) const;
        /// returns the minimum space a row needs on the screen in pixel
        int fill(BufferView *, Row * row, int workwidth) const;
        
@@ -573,8 +662,7 @@ private:
        int labelFill(BufferView *, Row const * row) const;
 
        ///
-       Paragraph::size_type
-       beginningOfMainBody(Buffer const *, Paragraph const * par) const;
+       lyx::pos_type beginningOfMainBody(Buffer const *, Paragraph const * par) const;
        
        /** Returns the left beginning of the text.
          This information cannot be taken from the layouts-objekt, because
@@ -605,37 +693,39 @@ private:
          LaTeX
          */
        bool hfillExpansion(Buffer const *, Row const * row_ptr,
-                           Paragraph::size_type pos) const;
+                           lyx::pos_type pos) const;
+       /// 
+       LColor::color backgroundColor();
 
 
        ///
-       mutable std::vector<Paragraph::size_type> log2vis_list;
+       mutable std::vector<lyx::pos_type> log2vis_list;
 
        ///
-       mutable std::vector<Paragraph::size_type> vis2log_list;
+       mutable std::vector<lyx::pos_type> vis2log_list;
 
        ///
-       mutable std::vector<Paragraph::size_type> bidi_levels;
+       mutable std::vector<lyx::pos_type> bidi_levels;
 
        ///
-       mutable Paragraph::size_type bidi_start;
+       mutable lyx::pos_type bidi_start;
 
        ///
-       mutable Paragraph::size_type bidi_end;
+       mutable lyx::pos_type bidi_end;
 
        ///
        mutable bool bidi_same_direction;
 
        ///
        unsigned char transformChar(unsigned char c, Paragraph * par,
-                                   Paragraph::size_type pos) const;
+                                   lyx::pos_type pos) const;
 
        /** returns the paragraph position of the last character in the 
          specified row
          */
-       Paragraph::size_type rowLast(Row const * row) const;
+       lyx::pos_type rowLast(Row const * row) const;
        ///
-       Paragraph::size_type rowLastPrintable(Row const * row) const;
+       lyx::pos_type rowLastPrintable(Row const * row) const;
 
        ///
        void charInserted();
@@ -645,28 +735,9 @@ public:
        ///
        Paragraph * ownerParagraph() const;
        //
-       Paragraph * ownerParagraph(Paragraph *) const;
+       void ownerParagraph(Paragraph *) const;
        // set it searching first for the right owner using the paragraph id
-       Paragraph * ownerParagraph(int id, Paragraph *) const;
+       void ownerParagraph(int id, Paragraph *) const;
 };
 
-
-/* returns a pointer to the row near the specified y-coordinate
- * (relative to the whole text). y is set to the real beginning
- * of this row */
-inline
-Row * LyXText::getRowNearY(int & y) const
-{
-       // If possible we should optimize this method. (Lgb)
-       Row * tmprow = firstrow;
-       int tmpy = 0;
-       
-       while (tmprow->next() && tmpy + tmprow->height() <= y) {
-               tmpy += tmprow->height();
-               tmprow = tmprow->next();
-       }
-       
-       y = tmpy;   // return the real y
-       return tmprow;
-}
 #endif