]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.h
hyperref support for tex2lyx
[lyx.git] / src / Cursor.h
index 44d3d8292bf6bdc95b26959805bc213fb60085c8..0e01c63b51f48548ae6d6f26f6282f45304a4cc3 100644 (file)
@@ -36,19 +36,18 @@ class Encoding;
 
 
 /// The cursor class describes the position of a cursor within a document.
-
-// The public inheritance should go in favour of a suitable data member
-// (or maybe private inheritance) at some point of time.
 class Cursor : public DocIterator
 {
 public:
        /// create the cursor of a BufferView
        explicit Cursor(BufferView & bv);
 
+       /// returns true if we made a decision
+       bool getStatus(FuncRequest const & cmd, FuncStatus & flag) const;
        /// dispatch from innermost inset upwards
        void dispatch(FuncRequest const & cmd);
        /// get the resut of the last dispatch
-       DispatchResult result() const;
+       DispatchResult const & result() const;
        /// add a new cursor slice
        void push(Inset & inset);
        /// add a new cursor slice, place cursor at front (move backwards)
@@ -63,7 +62,7 @@ public:
        void leaveInset(Inset const & inset);
        /// sets cursor part
        void setCursor(DocIterator const & it);
-       /// sets the cursor to the anchor
+       /// sets the cursor to the normalized selection anchor
        void setCursorToAnchor();
 
        ///
@@ -82,6 +81,10 @@ public:
        /// do we have a multiline selection?
        bool selIsMultiLine() const 
                { return selection_ && selBegin().pit() != selEnd().pit(); }
+       /// 
+       void setWordSelection(bool set) { word_selection_ = set; }
+       ///
+       bool wordSelection() { return word_selection_; }
        /// did we place the anchor?
        bool mark() const { return mark_; }
        /// did we place the anchor?
@@ -108,7 +111,7 @@ public:
         */
        bool selHandle(bool selecting);
        ///
-       docstring selectionAsString(bool label) const;
+       docstring selectionAsString(bool with_label) const;
        ///
        docstring currentState() const;
 
@@ -195,7 +198,11 @@ public:
        int textTargetOffset() const;
 
        /// access to normalized selection anchor
-       CursorSlice anchor() const;
+       CursorSlice normalAnchor() const;
+       // FIXME: this can't be a const & and a const function because
+       // LFUN_TAB_* wants to move the real anchor.
+       /// access to real selection anchor
+       DocIterator & realAnchor();
        /// sets anchor to cursor position
        void resetAnchor();
        /// access to owning BufferView
@@ -221,8 +228,14 @@ public:
        void undispatched();
        /// the event was already dispatched
        void dispatched();
-       /// Set which update should be done
-       void updateFlags(Update::flags f);
+       /// Set which screen update should be done
+       void screenUpdateFlags(Update::flags f);
+       /// Forces an updateBuffer() call
+       void forceBufferUpdate();
+       /// Removes any pending updateBuffer() call
+       void clearBufferUpdate();
+       /// Do we need to call updateBuffer()?
+       bool needBufferUpdate() const;
        /**
         * don't call update() when done
         *
@@ -231,9 +244,9 @@ public:
         * not need to be re-drawn and all entries in the coord cache stay
         * valid (and there are no other things to put in the coord cache).
         * This is a fairly rare event as well and only some optimization.
-        * Not using noUpdate() should never be wrong.
+        * Not using noScreenUpdate() should never be wrong.
         */
-       void noUpdate();
+       void noScreenUpdate();
        /// fix cursor in circumstances that should never happen.
        /// \retval true if a fix occured.
        bool fixIfBroken();
@@ -267,7 +280,8 @@ public:
        void recordUndo(UndoKind kind = ATOMIC_UNDO) const;
 
        /// Convenience: prepare undo for the inset containing the cursor
-       void recordUndoInset(UndoKind kind = ATOMIC_UNDO) const;
+       void recordUndoInset(UndoKind kind = ATOMIC_UNDO,
+                            Inset const * inset = 0) const;
 
        /// Convenience: prepare undo for the whole buffer
        void recordUndoFullDocument() const;
@@ -279,18 +293,20 @@ public:
        void checkBufferStructure();
 
 public:
-       ///
-       BufferView * bv_;
 //private:
-       /// the anchor position
-       DocIterator anchor_;
        
        ///
-       DispatchResult disp_;
+       DocIterator const & beforeDispatchCursor() const { return beforeDispatchCursor_; }
        ///
-       DocIterator const & beforeDispatchCursor() { return beforeDispatchCursor_; }
-       
+       void saveBeforeDispatchPosXY();
+
 private:
+       ///
+       BufferView * bv_;
+       /// the anchor position
+       DocIterator anchor_;
+       ///
+       mutable DispatchResult disp_;
        /**
         * The target x position of the cursor. This is used for when
         * we have text like :
@@ -310,6 +326,8 @@ private:
        bool selection_;
        /// are we on the way to get one?
        bool mark_;
+       /// are we in word-selection mode? This is set when double clicking.
+       bool word_selection_;
        /// If true, we are behind the previous char, otherwise we are in front
        // of the next char. This only make a difference when we are in front
        // of a big inset spanning a whole row and computing coordinates for
@@ -317,6 +335,10 @@ private:
        bool logicalpos_;
        /// position before dispatch started
        DocIterator beforeDispatchCursor_;
+       /// cursor screen coordinates before dispatch started
+       int beforeDispatchPosX_;
+       int beforeDispatchPosY_;
+
 
 // FIXME: make them private.
 public:
@@ -375,7 +397,8 @@ public:
        ///
        void niceInsert(MathAtom const & at);
        ///
-       void niceInsert(docstring const & str, Parse::flags f = Parse::NORMAL);
+       void niceInsert(docstring const & str, Parse::flags f = Parse::NORMAL,
+                       bool enter = true);
 
        /// in pixels from top of screen
        void setScreenPos(int x, int y);