4 * Purpose: Declaration of interaction classes for mathed
5 * Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
6 * Created: January 1996
7 * Description: MathCursor control all user interaction
9 * Dependencies: Xlib, XForms
11 * Copyright: 1996, Alejandro Aguilar Sierra
13 * You are free to use and modify this code under the terms of
14 * the GNU General Public Licence version 2 or later.
24 #include "math_inset.h"
28 class InsetFormulaBase;
30 class MathPainterInfo;
31 class MathUnknownInset;
36 [Have a look at math_inset.h first]
38 The MathCursor is different from the kind of cursor used in the Outer
39 World. It contains a stack of MathCursorPositions, each of which is made
40 up of a inset pointer, an index and a position offset, marking a path from
41 this formula's mathHullInset to the current position.
48 /// short of anything else reasonable
49 typedef MathInset::size_type size_type;
50 /// type for cursor positions within a cell
51 typedef MathInset::pos_type pos_type;
52 /// type for cell indices
53 typedef MathInset::idx_type idx_type;
54 /// type for row numbers
55 typedef MathInset::row_type row_type;
56 /// type for column numbers
57 typedef MathInset::col_type col_type;
58 /// how to store a cursor
59 typedef std::vector<MathCursorPos> cursor_type;
62 explicit MathCursor(InsetFormulaBase *, bool left);
66 void insert(MathAtom const &);
68 void insert(MathArray const &);
70 void paste(MathArray const &);
72 void paste(MathGridInset const & data);
77 /// called for LFUN_HOME etc
78 bool home(bool sel = false);
79 /// called for LFUN_END etc
80 bool end(bool sel = false);
81 /// called for LFUN_RIGHT and LFUN_RIGHTSEL
82 bool right(bool sel = false);
83 /// called for LFUN_LEFT etc
84 bool left(bool sel = false);
85 /// called for LFUN_UP etc
86 bool up(bool sel = false);
87 /// called for LFUN_DOWN etc
88 bool down(bool sel = false);
89 /// Put the cursor in the first position
91 /// Put the cursor in the last position
93 /// move to next cell in current inset
95 /// move to previous cell in current inset
100 void plainInsert(MathAtom const &);
102 void niceInsert(MathAtom const &);
106 /// in pixels from top of screen
107 void setPos(int x, int y);
108 /// in pixels from top of screen
109 void getPos(int & x, int & y);
111 MathInset * par() const;
112 /// return the next enclosing grid inset and the cursor's index in it
113 MathGridInset * enclosingGrid(idx_type & idx) const;
114 /// return the next enclosing hull inset and the cursor's index in it
115 MathHullInset * enclosingHull(idx_type & idx) const;
116 /// go up to enclosing grid
117 void popToEnclosingGrid();
118 /// go up to the hull inset
119 void popToEnclosingHull();
121 InsetFormulaBase * formula() const;
122 /// current offset in the current cell
123 pos_type pos() const;
125 idx_type idx() const;
126 /// size of current cell
127 size_type size() const;
131 bool interpret(string const &);
133 bool interpret(char);
136 /// interpret name a name of a macro
137 void macroModeClose();
138 /// are we currently typing the name of a macro?
139 MathUnknownInset * inMacroMode() const;
140 /// are we currently typing '#1' or '#2' or...?
141 bool inMacroArgMode() const;
142 /// are we in math mode (1), text mode (-1) or unsure?
143 MathInset::mode_type currentMode() const;
145 // Local selection methods
147 bool selection() const;
157 void selHandle(bool);
162 /// clears or deletes selection depending on lyxrc setting
163 void selClearOrDel();
165 void selGet(MathArray & ar);
167 void drawSelection(MathPainterInfo & pain) const;
169 void handleNest(MathAtom const & at);
170 /// splits cells and shifts right part to the next cell
172 /// splits line and insert new row of cell
174 /// read contents of line into an array
175 void readLine(MathArray & ar) const;
176 /// remove this as soon as LyXFunc::getStatus is "localized"
177 string getLastCode() const { return "mathnormal"; }
179 void pullArg(bool goright);
181 bool isInside(MathInset const *) const;
187 col_type hullCol() const;
189 row_type hullRow() const;
191 col_type gridCol() const;
193 row_type gridRow() const;
195 /// make sure cursor position is valid
197 /// mark current cursor trace for redraw
200 UpdatableInset * asHyperActiveInset() const;
202 /// enter a MathInset
203 void push(MathAtom & par);
204 /// enter a MathInset from the front
205 void pushLeft(MathAtom & par);
206 /// enter a MathInset from the back
207 void pushRight(MathAtom & par);
208 /// leave current MathInset to the left
210 /// leave current MathInset to the left
214 MathArray & array() const;
216 MathXArray & xarray() const;
218 bool hasPrevAtom() const;
220 bool hasNextAtom() const;
222 MathAtom const & prevAtom() const;
224 MathAtom & prevAtom();
226 MathAtom const & nextAtom() const;
228 MathAtom & nextAtom();
230 /// returns the selection
231 void getSelection(MathCursorPos &, MathCursorPos &) const;
232 /// returns the normalized anchor of the selection
233 MathCursorPos normalAnchor() const;
235 /// reference to the last item of the path, i.e. "The Cursor"
236 MathCursorPos & cursor();
237 /// reference to the last item of the path, i.e. "The Cursor"
238 MathCursorPos const & cursor() const;
239 /// how deep are we nested?
240 unsigned depth() const;
243 int dispatch(string const & cmd);
244 /// describe the situation
246 /// dump selection information for debugging
247 void seldump(char const * str) const;
248 /// dump selection information for debugging
249 void dump(char const * str) const;
251 void setSelection(cursor_type const & where, size_type n);
255 void insert(string const & str);
256 /// lock/unlock inset
259 /// hack for reveal codes
262 void handleExtern(string const & arg);
265 friend class Selection;
269 /// moves cursor index one cell to the left
271 /// moves cursor index one cell to the right
273 /// moves cursor to beginning first cell of current line
275 /// moves cursor to end of last cell of current line
277 /// moves cursor position one cell to the left
279 /// moves cursor position one cell to the right
281 /// moves position somehow up or down
282 bool goUpDown(bool up);
283 /// moves position into box
284 bool bruteFind(int xo, int yo, int xlow, int xhigh, int ylow, int yhigh);
287 /// grab grid marked by anchor and current cursor
288 MathGridInset grabSelection() const;
289 /// erase the selected part and re-sets the cursor
290 void eraseSelection();
292 MathGridInset grabAndEraseSelection();
295 string macroName() const;
297 MathInset::difference_type macroNamePos() const;
298 /// can we enter the inset?
299 bool openable(MathAtom const &, bool selection) const;
300 /// write access to cursor cell position
302 /// write access to cursor cell index
305 /// path of positions the cursor had to go if it were leaving each inset
307 /// path of positions the anchor had to go if it were leaving each inset
308 mutable cursor_type Anchor_;
309 /// pointer to enclsing LyX inset
310 InsetFormulaBase * formula_;
312 /// text code of last char entered
313 //MathTextCodes lastcode_;
314 /// do we allow autocorrection
316 /// do we currently select
318 /// are we entering a macro name?
320 /// are we targeting a certain x coordinate, if so, which one?
324 extern MathCursor * mathcursor;
325 void releaseMathCursor(BufferView * bv);