X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_cursor.h;h=96d0348085baebb5a80f0bfa5afc51de198e5ad9;hb=d359dd8fca52c4f0100f7cf4bf636113c5c4e49f;hp=60f76d2512e48fdc34e4fba853545558a22e4cd0;hpb=84b7ffa3473faa9cfe66a974d2e0a5f9d6641187;p=lyx.git diff --git a/src/mathed/math_cursor.h b/src/mathed/math_cursor.h index 60f76d2512..96d0348085 100644 --- a/src/mathed/math_cursor.h +++ b/src/mathed/math_cursor.h @@ -2,7 +2,7 @@ /* * File: math_cursor.h * Purpose: Declaration of interaction classes for mathed - * Author: Alejandro Aguilar Sierra + * Author: Alejandro Aguilar Sierra * Created: January 1996 * Description: MathCursor control all user interaction * @@ -10,8 +10,6 @@ * * Copyright: 1996, Alejandro Aguilar Sierra * - * Version: 0.8beta, Mathed & Lyx project. - * * You are free to use and modify this code under the terms of * the GNU General Public Licence version 2 or later. */ @@ -23,160 +21,307 @@ #pragma interface #endif -#include "math_xiter.h" +#include "math_inset.h" +#include "math_pos.h" +#include "LString.h" + +class InsetFormulaBase; +class MathPainterInfo; +class MathUnknownInset; +class Selection; + +/** -class MathFuncInset; -class MathParInset; -class Painter; +[Have a look at math_inset.h first] +The MathCursor is different from the kind of cursor used in the Outer +World. It contains a stack of MathCursorPositions, each of which is made +up of a inset pointer, an index and a position offset, marking a path from +this formula's mathHullInset to the current position. -/// This is the external interface of Mathed's subkernel -class MathedCursor { +*/ + + +class MathCursor { public: + /// short of anything else reasonable + typedef MathInset::size_type size_type; + /// type for cursor positions within a cell + typedef MathInset::pos_type pos_type; + /// type for cell indices + typedef MathInset::idx_type idx_type; + /// type for row numbers + typedef MathInset::row_type row_type; + /// type for column numbers + typedef MathInset::col_type col_type; + /// how to store a cursor + typedef std::vector cursor_type; + /// - explicit - MathedCursor(MathParInset * p); - /// - void Insert(byte, MathedTextCodes t = LM_TC_MIN); - /// - void Insert(MathedInset *, int t = LM_TC_INSET); - /// - void Home(); - /// - void End(); - /// - bool Right(bool sel = false); - /// - bool Left(bool sel = false); - /// - bool Up(bool sel = false); - /// - bool Down(bool sel = false); - /// - bool Pop(); - /// - bool Push(); - /// Pull out an argument from its container inset - bool pullArg(); - /// - void draw(Painter &, int x, int y); - /// - void Redraw(Painter &); - /// - void Delete(); - /// - void DelLine(); - /// - void SetPos(int, int); - /// - void GetPos(int & x, int & y); - /// - short GetFCode(); - /// - MathParInset * GetPar(); - /// - MathParInset * getCurrentPar() const; + explicit MathCursor(InsetFormulaBase *, bool left); /// - void SetPar(MathParInset *); + ~MathCursor(); /// - void Interpret(string const &); + void insert(MathAtom const &); /// - void SetSize(short); + void insert(MathArray const &); /// - void setNumbered(); + void paste(MathArray const &); /// - void setLabel(string const &); + void paste(MathGridInset const & data); /// - string const & getLabel() const; + void erase(); /// - bool Limits(); - /// Set accent: if argument = 0 it's considered consumed - void setAccent(int ac = 0); - /// Returns last accent - int getAccent() const; + void backspace(); + /// called for LFUN_HOME etc + void home(bool sel = false); + /// called for LFUN_END etc + void end(bool sel = false); + /// called for LFUN_RIGHT and LFUN_RIGHTSEL + bool right(bool sel = false); + /// called for LFUN_LEFT etc + bool left(bool sel = false); + /// called for LFUN_UP etc + bool up(bool sel = false); + /// called for LFUN_DOWN etc + bool down(bool sel = false); + /// Put the cursor in the first position + void first(); + /// Put the cursor in the last position + void last(); + /// move to next cell in current inset + void idxNext(); + /// move to previous cell in current inset + void idxPrev(); /// - bool IsEnd() const; - // Macro mode methods + void plainErase(); /// - void MacroModeOpen(); + void plainInsert(MathAtom const &); /// - void MacroModeClose(); + void niceInsert(MathAtom const &); + /// - bool InMacroMode(); - + void delLine(); + /// in pixels from top of screen + void setPos(int x, int y); + /// in pixels from top of screen + void getPos(int & x, int & y); + /// current inset + MathInset * par() const; + /// return the next enclosing grid inset and the cursor's index in it + MathGridInset * enclosingGrid(idx_type & idx) const; + /// return the next enclosing hull inset and the cursor's index in it + MathHullInset * enclosingHull(idx_type & idx) const; + /// go up to enclosing grid + void popToEnclosingGrid(); + /// go up to the hull inset + void popToEnclosingHull(); + /// + InsetFormulaBase * formula() const; + /// current offset in the current cell + pos_type pos() const; + /// current cell + idx_type idx() const; + /// size of current cell + size_type size() const; + /// + bool script(bool); + /// + bool interpret(string const &); + /// + bool interpret(char); + /// + bool toggleLimits(); + /// interpret name a name of a macro + void macroModeClose(); + /// are we currently typing the name of a macro? + MathUnknownInset * inMacroMode() const; + /// are we currently typing '#1' or '#2' or...? + bool inMacroArgMode() const; + /// are we in an mbox? + bool inMathMode() const; + // Local selection methods /// - bool Selection(); + bool selection() const; /// - void SelCopy(); + void selCopy(); /// - void SelCut(); + void selCut(); /// - void SelDel(); + void selDel(); /// - void SelPaste(); + void selPaste(); /// - void SelStart(); + void selHandle(bool); /// - void SelClear(); + void selStart(); /// - void SelBalance(); + void selClear(); + /// clears or deletes selection depending on lyxrc setting + void selClearOrDel(); /// - void SelGetArea(int ** xp, int ** yp, int & n); + void selGet(MathArray & ar); /// - void clearLastCode(); + void drawSelection(MathPainterInfo & pain) const; /// - void setLastCode(MathedTextCodes t); + void handleDelim(string const & l, string const & r); /// - void toggleLastCode(MathedTextCodes t); + void handleNest(MathInset * p); + /// splits cells and shifts right part to the next cell + void splitCell(); + /// splits line and insert new row of cell + void breakLine(); + /// read contents of line into an array + void readLine(MathArray & ar) const; + /// remove this as soon as LyXFunc::getStatus is "localized" + string getLastCode() const { return "mathnormal"; } /// - MathedTextCodes getLastCode() const; - -protected: + void pullArg(bool goright); /// - bool macro_mode; - /// - void MacroModeBack(); - /// - void MacroModeInsert(char); - - // Selection stuff + bool isInside(MathInset const *) const; /// - bool selection; + char valign() const; /// - int selpos; + char halign() const; /// - MathedXIter cursel; + col_type hullCol() const; /// - MathedXIter * anchor; + row_type hullRow() const; /// -// MathedArray *selarray; + col_type gridCol() const; /// - bool is_visible; + row_type gridRow() const; + + /// make sure cursor position is valid + void normalize(); + /// mark current cursor trace for redraw + void touch(); /// - long unsigned win; + UpdatableInset * asHyperActiveInset() const; + + /// enter a MathInset + void push(MathAtom & par); + /// enter a MathInset from the front + void pushLeft(MathAtom & par); + /// enter a MathInset from the back + void pushRight(MathAtom & par); + /// leave current MathInset to the left + bool popLeft(); + /// leave current MathInset to the left + bool popRight(); + /// - MathParInset * par; + MathArray & array() const; /// - MathedXIter * cursor; + MathXArray & xarray() const; /// - int xc; + bool hasPrevAtom() const; /// - int yc; + bool hasNextAtom() const; /// - void doAccent(byte c, MathedTextCodes t); + MathAtom const & prevAtom() const; /// - void doAccent(MathedInset * p); + MathAtom & prevAtom(); /// - int accent; + MathAtom const & nextAtom() const; /// - int nestaccent[8]; + MathAtom & nextAtom(); + + /// returns the selection + void getSelection(MathCursorPos &, MathCursorPos &) const; + /// returns the normalized anchor of the selection + MathCursorPos normalAnchor() const; + + /// reference to the last item of the path, i.e. "The Cursor" + MathCursorPos & cursor(); + /// reference to the last item of the path, i.e. "The Cursor" + MathCursorPos const & cursor() const; + /// how deep are we nested? + unsigned depth() const; + + /// local dispatcher + int dispatch(string const & cmd); + /// describe the situation + string info() const; + /// dump selection information for debugging + void seldump(char const * str) const; + /// dump selection information for debugging + void dump(char const * str) const; + /// moves on + void setSelection(cursor_type const & where, size_type n); + /// + void insert(char c); + /// + void insert(string const & str); + /// lock/unlock inset + void insetToggle(); + + /// hack for reveal codes + void markInsert(); + void markErase(); + void handleExtern(string const & arg); + /// - MathedTextCodes lastcode; - + friend class Selection; + + private: + /// moves cursor index one cell to the left + bool idxLeft(); + /// moves cursor index one cell to the right + bool idxRight(); + /// moves cursor to beginning first cell of current line + bool idxLineFirst(); + /// moves cursor to end of last cell of current line + bool idxLineLast(); + /// moves cursor position one cell to the left + bool posLeft(); + /// moves cursor position one cell to the right + bool posRight(); + /// moves position somehow up or down + bool goUpDown(bool up); + /// moves position into box + bool bruteFind(int xo, int yo, int xlow, int xhigh, int ylow, int yhigh); + + + /// grab grid marked by anchor and current cursor + MathGridInset grabSelection() const; + /// erase the selected part and re-sets the cursor + void eraseSelection(); + /// guess what + MathGridInset grabAndEraseSelection(); + + /// + string macroName() const; /// - MathFuncInset * imacro; + MathInset::difference_type macroNamePos() const; + /// can we enter the inset? + bool openable(MathAtom const &, bool selection) const; + /// write access to cursor cell position + pos_type & pos(); + /// write access to cursor cell index + idx_type & idx(); + + /// path of positions the cursor had to go if it were leaving each inset + cursor_type Cursor_; + /// path of positions the anchor had to go if it were leaving each inset + mutable cursor_type Anchor_; + /// pointer to enclsing LyX inset + InsetFormulaBase * formula_; + // Selection stuff + /// text code of last char entered + //MathTextCodes lastcode_; + /// do we allow autocorrection + bool autocorrect_; + /// do we currently select + bool selection_; + /// are we entering a macro name? + bool macromode_; + /// are we targeting a certain x coordinate, if so, which one? + int targetx_; }; +extern MathCursor * mathcursor; + #endif