]> git.lyx.org Git - features.git/blobdiff - src/cursor.h
Part of IU.
[features.git] / src / cursor.h
index 35f858f09c5ae67592240b594c87d648cd18bfc3..d6537ffd5214b09da720ca6a638fb5d01ce10fd2 100644 (file)
@@ -22,8 +22,20 @@ class UpdatableInset;
 class MathAtom;
 class DispatchResult;
 class FuncRequest;
-class LyXText;
 class InsetTabular;
+class LyXText;
+class Paragraph;
+
+
+
+// this is used for traversing math insets
+typedef std::vector<CursorSlice> CursorBase;
+/// move on one step
+void increment(CursorBase &);
+///
+CursorBase ibegin(InsetBase * p);
+///
+CursorBase iend(InsetBase * p);
 
 
 /**
@@ -43,8 +55,6 @@ public:
        /// type for col indices
        typedef CursorSlice::col_type col_type;
 
-       /// create 'empty' cursor. REMOVE ME
-       LCursor();
        /// create the cursor of a BufferView
        explicit LCursor(BufferView & bv);
        /// dispatch from innermost inset upwards
@@ -55,48 +65,74 @@ public:
        void pop(int depth);
        /// pop one level off the cursor
        void pop();
-       /// access to cursor 'tip'
-       CursorSlice & top() { return cursor_.back(); }
-       /// access to cursor 'tip'
-       CursorSlice const & top() const { return cursor_.back(); }
+       /// access to current cursor slice
+       CursorSlice & current();
+       /// access to current cursor slice
+       CursorSlice const & current() const;
        /// how many nested insets do we have?
        size_t depth() const { return cursor_.size(); }
 
-       /// access to the topmost slice
+       //
+       // selection
+       //
+       /// selection active?
+       bool selection() const { return selection_; }
+       /// selection active?
+       bool & selection() { return selection_; }
+       /// did we place the anchor?
+       bool mark() const { return mark_; }
+       /// did we place the anchor?
+       bool & mark() { return mark_; }
+       ///
+       void setSelection();
+       ///
+       void clearSelection();
+       ///
+       CursorSlice & selStart();
+       ///
+       CursorSlice const & selStart() const;
+       ///
+       CursorSlice & selEnd();
+       ///
+       CursorSlice const & selEnd() const;
+
+       //
+       // access to the 'current' cursor slice
+       //
        /// the current inset
-       InsetBase * inset() const { return top().inset(); }
+       InsetBase * inset() const { return current().inset(); }
        /// return the text-ed cell this cursor is in
-       idx_type idx() const { return top().idx(); }
+       idx_type idx() const { return current().idx(); }
        /// return the text-ed cell this cursor is in
-       idx_type & idx() { return top().idx(); }
+       idx_type & idx() { return current().idx(); }
        /// return the paragraph this cursor is in
-       par_type par() const { return top().par(); }
+       par_type par() const { return current().par(); }
        /// return the paragraph this cursor is in
-       par_type & par() { return top().par(); }
+       par_type & par() { return current().par(); }
        /// return the position within the paragraph
-       pos_type pos() const { return top().pos(); }
+       pos_type pos() const { return current().pos(); }
        /// return the position within the paragraph
-       pos_type & pos() { return top().pos(); }
+       pos_type & pos() { return current().pos(); }
        /// return the last position within the paragraph
-       pos_type lastpos() const { return top().lastpos(); }
+       pos_type lastpos() const;
        /// return the number of embedded cells
-       size_t nargs() const { return top().nargs(); }
+       size_t nargs() const;
        /// return the number of embedded cells
-       size_t ncols() const { return top().ncols(); }
+       size_t ncols() const;
        /// return the number of embedded cells
-       size_t nrows() const { return top().nrows(); }
+       size_t nrows() const;
        /// return the grid row of the current cell
-       row_type row() const { return top().row(); }
+       row_type row() const;
        /// return the grid row of the current cell
-       col_type col() const { return top().col(); }
+       col_type col() const;
 
        //
        // math-specific part
        //
        /// return the mathed cell this cursor is in
-       MathArray const & cell() const { return top().cell(); }
+       MathArray const & cell() const;
        /// return the mathed cell this cursor is in
-       MathArray & cell() { return top().cell(); }
+       MathArray & cell();
        /// the mathatom left of the cursor
        MathAtom const & prevAtom() const;
        /// the mathatom left of the cursor
@@ -105,13 +141,25 @@ public:
        MathAtom const & nextAtom() const;
        /// the mathatom right of the cursor
        MathAtom & nextAtom();
+       /// auto-correct mode
+       bool autocorrect() const { return autocorrect_; }
+       /// auto-correct mode
+       bool & autocorrect() { return autocorrect_; }
+       /// are we entering a macro name?
+       bool macromode() const { return macromode_; }
+       /// are we entering a macro name?
+       bool & macromode() { return macromode_; }
 
        //
        // text-specific part
        ///
-       UpdatableInset * innerInset() const;
+       bool boundary() const { return current().boundary(); }
+       ///
+       Paragraph & paragraph();
+       ///
+       Paragraph const & paragraph() const;
        ///
-       UpdatableInset * innerInsetOfType(int code) const;
+       InsetBase * innerInsetOfType(int code) const;
        ///
        InsetTabular * innerInsetTabular() const;
        ///
@@ -129,24 +177,70 @@ public:
        /// move one step to the right
        bool posRight();
 
+       /// set target x position of cursor
+       void x_target(int x);
+       /// return target x position of cursor
+       int x_target() const;
+
+       /// access to selection anchor
+       CursorSlice & anchor();
+       /// access to selection anchor
+       CursorSlice const & anchor() const;
        /// cache the absolute coordinate from the top inset
        void updatePos();
        /// sets anchor to cursor position
        void resetAnchor(); 
        /// access to owning BufferView
        BufferView & bv() const; 
-       ///
-       friend std::ostream & operator<<(std::ostream &, LCursor const &);
+       /// get some interesting description of current position
+       void info(std::ostream & os);
+
+       /// output
+       friend std::ostream & operator<<(std::ostream & os, LCursor const & cur);
 public:
+//private:
        /// mainly used as stack, but wee need random access
        std::vector<CursorSlice> cursor_;
-       /// The
+       /// the anchor position
        std::vector<CursorSlice> anchor_;
-       ///
-       BufferView * bv_;
+
 private:
+       /// don't implement this
+       void operator=(LCursor const &);
+       /// don't implement this
+       LCursor(LCursor const &);
+
+       ///
+       BufferView * const bv_;
+       /// current slice
+       int current_;
        ///
        int cached_y_;
+       /**
+        * The target x position of the cursor. This is used for when
+        * we have text like :
+        *
+        * blah blah blah blah| blah blah blah
+        * blah blah blah
+        * blah blah blah blah blah blah
+        *
+        * When we move onto row 3, we would like to be vertically aligned
+        * with where we were in row 1, despite the fact that row 2 is
+        * shorter than x()
+        */
+       int x_target_;
+       // do we have a selection?
+       bool selection_;
+       // are we on the way to get one?
+       bool mark_;
+
+       //
+       // math specific stuff that could be promoted to "global" later
+       //
+       /// do we allow autocorrection
+       bool autocorrect_;
+       /// are we entering a macro name?
+       bool macromode_;
 };
 
 #endif // LYXCURSOR_H