X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fcursor.h;h=1ec6255b0b8ee38b220ec36607e04eead5e542d3;hb=9ee46b846e5e84ad40ceda4f4af94aeb86cd90a2;hp=6654f1660b3c316d9a8c888ab9ddfcd18abb3289;hpb=ec4ab8ce18418999b547368d1d2bbf546bec1e7b;p=lyx.git diff --git a/src/cursor.h b/src/cursor.h index 6654f1660b..1ec6255b0b 100644 --- a/src/cursor.h +++ b/src/cursor.h @@ -18,44 +18,45 @@ #include #include -class UpdatableInset; -class DispatchResult; +class Buffer; +class BufferView; class FuncStatus; class FuncRequest; -class InsetTabular; +class Point; +class LyXFont; // these should go -class MathHullInset; class MathUnknownInset; -class MathGridInset; +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 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); + /// dispatch from innermost inset upwards + void dispatch(FuncRequest const & cmd); + /// get the resut of the last dispatch + DispatchResult result() const; /// add a new cursor slice - void push(InsetBase * inset); + void push(InsetBase & inset); /// add a new cursor slice, place cursor on left end - void pushLeft(InsetBase * inset); + void pushLeft(InsetBase & inset); /// pop one level off the cursor void pop(); /// pop one slice off the cursor stack and go left 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 @@ -71,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 & selBegin(); - /// access start of selection - CursorSlice const & selBegin() const; - /// access end of selection - CursorSlice & selEnd(); + CursorSlice selBegin() const; /// access end of selection - CursorSlice const & selEnd() 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); + CursorSlice selEnd() const; + /// access start of selection + DocIterator selectionBegin() const; + /// access start of selection + 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; /// @@ -122,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 @@ -140,55 +118,77 @@ 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)? int currentMode(); - /// reset cursor - void reset(); + /// reset cursor bottom to the beginning of the given inset + // (sort of 'chroot' environment...) + void reset(InsetBase &); /// for spellchecking void replaceWord(std::string const & replacestring); - /// update our view - void update(); - /// set dispatch result - void dispatched(dispatch_result_t res); - /// assume 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(); - /// don't pop cursor to the level where the LFUN was handled - void noPop(); + /// fix cursor in circumstances that should never happen + void fixIfBroken(); /// output friend std::ostream & operator<<(std::ostream & os, LCursor const & cur); + 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 : @@ -202,12 +202,17 @@ private: * shorter than x() */ int x_target_; - // do we have a selection? + /// do we have a selection? bool selection_; - // are we on the way to get one? + /// are we on the way to get one? bool mark_; - /// - bool nopop_; + /// 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 @@ -250,44 +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); - /// - MathHullInset * formula() const; /// 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(); @@ -305,10 +293,6 @@ public: /// moves position somehow up or down bool goUpDown(bool up); - /// moves position closest to (x, y) in given box - bool bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh); - /// moves position closest to (x, y) in current cell - void bruteFind2(int x, int y); /// the name of the macro we are currently inputting std::string macroName(); @@ -316,6 +300,11 @@ public: int macroNamePos(); /// can we enter the inset? bool openable(MathAtom const &) const; + /// + Encoding const * getEncoding() const; + /// font at cursor position + LyXFont getFont() const; }; + #endif // LYXCURSOR_H