X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fcursor.h;h=e99a8a06bd4e16ba32c5e91988ea2e5cdae4e1d5;hb=005545f28100fd30afa22313d6e3b1b67aa9a857;hp=8f8a78db99e0bd2d86a2b97753f8d664da3569f4;hpb=67f9c9fdae42211aa3ff8d0c6f62485bd721d8eb;p=lyx.git diff --git a/src/cursor.h b/src/cursor.h index 8f8a78db99..e99a8a06bd 100644 --- a/src/cursor.h +++ b/src/cursor.h @@ -12,89 +12,48 @@ #ifndef CURSOR_H #define CURSOR_H -#include "cursor_slice.h" +#include "dispatchresult.h" +#include "dociterator.h" #include #include +class Buffer; class BufferView; -class UpdatableInset; -class MathAtom; -class DispatchResult; +class FuncStatus; class FuncRequest; -class InsetTabular; -class LyXText; -class Paragraph; - // these should go -class MathHullInset; -class PainterInfo; class MathUnknownInset; -class MathGridInset; - - -// only needed for gcc 2.95, remove when support terminated - - -template -bool ptr_cmp(A const * a, B const * b) -{ -return a == b; -} +class Encoding; -// this is used for traversing math insets -typedef std::vector CursorBase; -/// move on one step -void increment(CursorBase &); -/// -CursorBase ibegin(InsetBase * p); -/// -CursorBase iend(InsetBase * p); +/// The cursor class describes the position of a cursor within a document. - -/** - * The cursor class describes the position of a cursor within a document. - */ - -class LCursor { +// The public inheritance should go in favour of a suitable data member +// (or maybe private inheritance) at some point of time. +class LCursor : public DocIterator { public: - /// type for cell number in inset - typedef CursorSlice::idx_type idx_type; - /// type for paragraph numbers positions within a cell - typedef CursorSlice::par_type par_type; - /// type for cursor positions within a cell - typedef CursorSlice::pos_type pos_type; - /// type for row indices - typedef CursorSlice::row_type row_type; - /// type for col indices - typedef CursorSlice::col_type col_type; - /// 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); + /// 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(); - /// restrict cursor nesting to given size - void pop(int depth); - /// 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(); } - /// depth of current slice - int currentDepth() const { return current_; } + /// sets cursor part + void setCursor(DocIterator const & it, bool sel); // // selection @@ -110,101 +69,26 @@ public: /// void setSelection(); /// set selection at given position - void setSelection(CursorBase 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; + CursorSlice selBegin() const; /// access end of selection - CursorSlice & selEnd(); - /// 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; /// void paste(std::string const & data); + /// + std::string currentState(); - // - // access to the 'current' cursor slice - // - /// the containing inset - InsetBase * inset() const { return current().inset(); } - /// return the cell of the inset this cursor is in - idx_type idx() const { return current().idx(); } - /// return the cell of the inset this cursor is in - idx_type & idx() { return current().idx(); } - /// return the last possible cell in this inset - idx_type lastidx() const { return current().lastidx(); } - /// return the paragraph this cursor is in - par_type par() const { return current().par(); } - /// return the paragraph this cursor is in - par_type & par() { return current().par(); } - /// return the last possible paragraph in this inset - par_type lastpar() const; - /// return the position within the paragraph - pos_type pos() const { return current().pos(); } - /// return the position within the paragraph - pos_type & pos() { return current().pos(); } - /// return the last position within the paragraph - pos_type lastpos() const; - /// return the display row of the cursor with in the current par - row_type crow() const; - /// return the display row of the cursor with in the current par - row_type lastcrow() const; - - /// return the number of embedded cells - size_t nargs() const; - /// return the number of embedded cells - size_t ncols() const; - /// return the number of embedded cells - size_t nrows() const; - /// return the grid row of the current cell - row_type row() const; - /// return the grid row of the current cell - col_type col() const; - /// the inset just behind the cursor - InsetBase * nextInset(); - /// the inset just in front of the cursor - InsetBase * prevInset(); - - // - // math-specific part - // - /// return the mathed cell this cursor is in - MathArray const & cell() const; - /// return the mathed cell this cursor is in - MathArray & cell(); - /// the mathatom left of the cursor - MathAtom const & prevAtom() const; - /// the mathatom left of the cursor - MathAtom & prevAtom(); - /// the mathatom right of the cursor - MathAtom const & nextAtom() const; - /// the mathatom right of the cursor - MathAtom & nextAtom(); /// auto-correct mode bool autocorrect() const { return autocorrect_; } /// auto-correct mode @@ -213,27 +97,6 @@ public: bool macromode() const { return macromode_; } /// are we entering a macro name? bool & macromode() { return macromode_; } - - // - // text-specific part - /// - bool boundary() const { return current().boundary(); } - /// - bool & boundary() { return current().boundary(); } - /// - Paragraph & paragraph(); - /// - Paragraph const & paragraph() const; - /// - LyXText * text() const; - /// - InsetBase * innerInsetOfType(int code) const; - /// - InsetTabular * innerInsetTabular() const; - /// - LyXText * innerText() const; - /// - CursorSlice const & innerTextSlice() const; /// returns x,y position void getPos(int & x, int & y) const; /// returns cursor dimension @@ -247,6 +110,13 @@ public: /// move one step to the right bool posRight(); + /// insert an inset + void insert(InsetBase *); + /// insert a single char + void insert(char c); + /// insert a string + void insert(std::string const & str); + /// write acess to target x position of cursor int & x_target(); /// return target x position of cursor @@ -254,39 +124,44 @@ public: /// 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; - /// get some interesting description of current position - void info(std::ostream & os); + 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); + /// the event was not (yet) dispatched + void undispatched(); + /// the event was already dispatched + void dispatched(); + /// don't call update() when done + void noUpdate(); /// output friend std::ostream & operator<<(std::ostream & os, LCursor const & cur); + public: + /// + BufferView * bv_; //private: - /// mainly used as stack, but wee need random access - std::vector cursor_; /// the anchor position - std::vector anchor_; + DocIterator anchor_; -private: - /// - BufferView * bv_; - /// current slice - int current_; /// - int cached_y_; + DispatchResult disp_; + +private: /** * The target x position of the cursor. This is used for when * we have text like : @@ -300,9 +175,9 @@ 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_; // @@ -327,20 +202,10 @@ public: void insert(MathAtom const &); /// void insert(MathArray const &); - /// - void insert2(std::string const &); /// return false for empty math insets bool erase(); /// return false for empty math insets bool backspace(); - /// called for LFUN_HOME etc - bool home(); - /// called for LFUN_END etc - bool end(); - /// called for LFUN_RIGHT and LFUN_RIGHTSEL - bool right(); - /// called for LFUN_LEFT etc - bool left(); /// called for LFUN_UP etc bool up(); /// called for LFUN_DOWN etc @@ -358,53 +223,25 @@ public: 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 current cell - /// - bool script(bool); - /// - bool interpret(char); + /// current offset in the top cell /// interpret name a name of a macro void 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(); - - /// - void insert(char c); - /// - void insert(std::string const & str); - /// lock/unlock inset - void lockToggle(); - /// hack for reveal codes void markInsert(); void markErase(); @@ -413,39 +250,30 @@ public: /// split font inset etc void handleFont(std::string const & font); - void releaseMathCursor(); - /// are we in mathed? - bool inMathed() const; - /// are we in texted? - bool inTexted() const; - /// display a message void message(std::string const & msg) const; /// display an error message void errorMessage(std::string const & msg) const; + /// + std::string getPossibleLabel(); -private: - /// moves cursor index one cell to the left - bool idxLeft(); - /// moves cursor index one cell to the right - bool idxRight(); - /// moves cursor to end of last cell of current line - bool idxLineLast(); /// 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); - /// are we in a nucleus of a script inset? - bool inNucleus(); /// the name of the macro we are currently inputting std::string macroName(); /// where in the curent cell does the macro name start? int macroNamePos(); /// can we enter the inset? - bool openable(MathAtom const &); + 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); }; #endif // LYXCURSOR_H