]> git.lyx.org Git - lyx.git/blobdiff - src/cursor.h
Add GTK bibitem dialog
[lyx.git] / src / cursor.h
index ec1002aebc6a2e912831e2759df4c83d74029898..1ec6255b0b8ee38b220ec36607e04eead5e542d3 100644 (file)
 #include <iosfwd>
 #include <vector>
 
+class Buffer;
 class BufferView;
 class FuncStatus;
 class FuncRequest;
+class Point;
+class LyXFont;
 
 // these should go
 class MathUnknownInset;
-class MathGridInset;
 class Encoding;
 
 
@@ -32,16 +34,15 @@ class Encoding;
 
 // The public inheritance should go in favour of a suitable data member
 // (or maybe private inheritance) at some point of time.
-class LCursor : public DocumentIterator {
+class LCursor : public DocIterator {
 public:
        /// create the cursor of a BufferView
        explicit LCursor(BufferView & bv);
 
        /// dispatch from innermost inset upwards
-       DispatchResult dispatch(FuncRequest const & cmd);
-       /// are we willing to handle this event?
-       bool getStatus(FuncRequest const & cmd, FuncStatus & flag);
-
+       void dispatch(FuncRequest const & cmd);
+       /// get the resut of the last dispatch
+       DispatchResult result() const;
        /// add a new cursor slice
        void push(InsetBase & inset);
        /// add a new cursor slice, place cursor on left end
@@ -52,8 +53,10 @@ public:
        bool popLeft();
        /// pop one slice off the cursor stack and go right
        bool popRight();
+       /// make sure we are outside of given inset
+       void leaveInset(InsetBase const & inset);
        /// sets cursor part
-       void setCursor(DocumentIterator const & it, bool sel);
+       void setCursor(DocIterator const & it);
 
        //
        // selection
@@ -69,40 +72,19 @@ public:
        ///
        void setSelection();
        /// set selection at given position
-       void setSelection(DocumentIterator const & where, size_t n);
+       void setSelection(DocIterator const & where, size_t n);
        ///
        void clearSelection();
        /// access start of selection
-       CursorSlice const & selBegin() const;
+       CursorSlice selBegin() const;
        /// access end of selection
-       CursorSlice const & selEnd() const;
+       CursorSlice selEnd() const;
        /// access start of selection
-       DocumentIterator selectionBegin() const;
+       DocIterator selectionBegin() const;
        /// access start of selection
-       DocumentIterator selectionEnd() const;
-       ///
-       std::string grabSelection();
-       ///
-       void eraseSelection();
-       ///
-       std::string grabAndEraseSelection();
-       // other selection methods
-       ///
-       void selCopy();
-       ///
-       void selCut();
-       ///
-       void selDel();
-       /// pastes n-th element of cut buffer
-       void selPaste(size_t n);
+       DocIterator selectionEnd() const;
        ///
        void selHandle(bool selecting);
-       /// start selection
-       void selStart();
-       /// clear selection
-       void selClear();
-       /// clears or deletes selection depending on lyxrc setting
-       void selClearOrDel();
        //
        std::string selectionAsString(bool label) const;
        ///
@@ -120,8 +102,6 @@ public:
        bool & macromode() { return macromode_; }
        /// returns x,y position
        void getPos(int & x, int & y) const;
-       /// returns cursor dimension
-       void getDim(int & asc, int & desc) const;
 
        //
        // common part
@@ -138,23 +118,25 @@ public:
        /// insert a string
        void insert(std::string const & str);
 
+       /// in pixels from left of screen
+       int targetX() const;
        /// write acess to target x position of cursor
        int & x_target();
        /// return target x position of cursor
        int x_target() const;
+       /// set targetX in current position
+       void setTargetX();
        /// clear target x position of cursor
        void clearTargetX();
 
-       /// access to selection anchor
-       CursorSlice & anchor();
-       /// access to selection anchor
-       CursorSlice const & anchor() const;
-       /// cache the absolute coordinate from the top inset
-       void updatePos();
+       /// access to normalized selection anchor
+       CursorSlice anchor() const;
        /// sets anchor to cursor position
-       void resetAnchor(); 
+       void resetAnchor();
        /// access to owning BufferView
-       BufferView & bv() const; 
+       BufferView & bv() const;
+       /// access to owning Buffer
+       Buffer & buffer() const;
        /// get some interesting description of top position
        void info(std::ostream & os) const;
        /// are we in math mode (2), text mode (1) or unsure (0)?
@@ -164,12 +146,33 @@ public:
        void reset(InsetBase &);
        /// for spellchecking
        void replaceWord(std::string const & replacestring);
-       /// update our view
-       void update();
-       /// the event was not (yet) dispatched
+       /**
+        * the event was not (yet) dispatched.
+        *
+        * Should only be called by an inset's doDispatch() method. It means:
+        * I, the doDispatch() method of InsetFoo, hereby declare that I am
+        * not able to handle that request and trust my parent will do the
+        * Right Thing (even if my getStatus partner said that I can do it).
+        * It is sort of a kludge that should be used only rarely...
+        */
        void undispatched();
-       /// don't call update() when done
+       /// the event was already dispatched
+       void dispatched();
+       /// call update() when done
+       void needsUpdate();
+       /**
+        * don't call update() when done
+        *
+        * Should only be called by an inset's doDispatch() method. It means:
+        * I handled that request and I can reassure you that the screen does
+        * 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.
+        */
        void noUpdate();
+       /// fix cursor in circumstances that should never happen
+       void fixIfBroken();
 
        /// output
        friend std::ostream & operator<<(std::ostream & os, LCursor const & cur);
@@ -179,14 +182,13 @@ public:
        BufferView * bv_;
 //private:
        /// the anchor position
-       DocumentIterator anchor_;
-       
-       /// 
+       DocIterator anchor_;
+
+       ///
        DispatchResult disp_;
 
+
 private:
-       ///
-       int cached_y_;
        /**
         * The target x position of the cursor. This is used for when
         * we have text like :
@@ -204,6 +206,13 @@ private:
        bool selection_;
        /// are we on the way to get one?
        bool mark_;
+       /// 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
+       // displaying the cursor.
+       bool logicalpos_;
+
+private:
 
        //
        // math specific stuff that could be promoted to "global" later
@@ -246,42 +255,27 @@ public:
 
        /// in pixels from top of screen
        void setScreenPos(int x, int y);
-       /// in pixels from left of screen
-       int targetX() const;
-       /// return the next enclosing grid inset and the cursor's index in it
-       MathGridInset * enclosingGrid(idx_type & idx) const;
-       /// adjust anchor position after deletions/insertions
-       void adjust(pos_type from, int diff);
        /// current offset in the top cell
-       /// interpret name a name of a macro
-       void macroModeClose();
+
+       /// interpret name a name of a macro. Returns true if
+       /// something got inserted.
+       bool macroModeClose();
        /// are we currently typing the name of a macro?
        bool inMacroMode() const;
        /// get access to the macro we are currently typing
        MathUnknownInset * activeMacro();
-       /// are we currently typing '#1' or '#2' or...?
-       bool inMacroArgMode() const;
 
        /// replace selected stuff with at, placing the former
        // selection in given cell of atom
        void handleNest(MathAtom const & at, int cell = 0);
-       /// remove this as soon as LyXFunc::getStatus is "localized"
-       //inline std::string getLastCode() { return "mathnormal"; }
        ///
        bool isInside(InsetBase const *);
-       ///
-       char valign();
-       ///
-       char halign();
 
        /// make sure cursor position is valid
        void normalize();
        /// mark current cursor trace for redraw
        void touch();
 
-       /// returns the normalized anchor of the selection
-       CursorSlice normalAnchor();
-
        /// hack for reveal codes
        void markInsert();
        void markErase();
@@ -308,12 +302,9 @@ public:
        bool openable(MathAtom const &) const;
        ///
        Encoding const * getEncoding() const;
-
-private:
-       /// moves position closest to (x, y) in current cell
-       void bruteFind2(int x, int y);
-       /// moves position closest to (x, y) in given box
-       bool bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh);
+       /// font at cursor position
+       LyXFont getFont() const;
 };
 
+
 #endif // LYXCURSOR_H