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"
25 #include "math_iterator.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 MathCursorPos, 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;
60 explicit MathCursor(InsetFormulaBase *, bool left);
64 void insert(MathAtom const &);
66 void insert(MathArray const &);
68 void paste(MathArray const &);
70 void paste(MathGridInset const & data);
75 /// called for LFUN_HOME etc
76 bool home(bool sel = false);
77 /// called for LFUN_END etc
78 bool end(bool sel = false);
79 /// called for LFUN_RIGHT and LFUN_RIGHTSEL
80 bool right(bool sel = false);
81 /// called for LFUN_LEFT etc
82 bool left(bool sel = false);
83 /// called for LFUN_UP etc
84 bool up(bool sel = false);
85 /// called for LFUN_DOWN etc
86 bool down(bool sel = false);
87 /// Put the cursor in the first position
89 /// Put the cursor in the last position
91 /// move to next cell in current inset
93 /// move to previous cell in current inset
98 void plainInsert(MathAtom const &);
100 void niceInsert(MathAtom const &);
102 /// in pixels from top of screen
103 void setPos(int x, int y);
104 /// in pixels from top of screen
105 void getPos(int & x, int & y);
107 MathInset * par() const;
108 /// return the next enclosing grid inset and the cursor's index in it
109 MathGridInset * enclosingGrid(idx_type & idx) const;
110 /// return the next enclosing hull inset and the cursor's index in it
111 MathHullInset * enclosingHull(idx_type & idx) const;
112 /// go up to enclosing grid
113 void popToEnclosingGrid();
114 /// go up to the hull inset
115 void popToEnclosingHull();
116 /// go up to the hull inset
117 void popToHere(MathInset const * p);
119 InsetFormulaBase * formula() const;
120 /// current offset in the current cell
121 pos_type pos() const;
123 idx_type idx() const;
124 /// size of current cell
125 size_type size() const;
129 bool interpret(string const &);
131 bool interpret(char);
134 /// interpret name a name of a macro
135 void macroModeClose();
136 /// are we currently typing the name of a macro?
137 bool inMacroMode() const;
138 /// get access to the macro we are currently typing
139 MathUnknownInset * activeMacro();
140 /// get access to the macro we are currently typing
141 MathUnknownInset const * activeMacro() const;
142 /// are we currently typing '#1' or '#2' or...?
143 bool inMacroArgMode() const;
144 /// are we in math mode (1), text mode (-1) or unsure?
145 MathInset::mode_type currentMode() const;
147 // Local selection methods
149 bool selection() const;
159 void selHandle(bool);
164 /// clears or deletes selection depending on lyxrc setting
165 void selClearOrDel();
167 void selGet(MathArray & ar);
169 void drawSelection(MathPainterInfo & pain) const;
171 void handleNest(MathAtom const & at);
172 /// remove this as soon as LyXFunc::getStatus is "localized"
173 string getLastCode() const { return "mathnormal"; }
175 bool isInside(MathInset const *) const;
181 /// make sure cursor position is valid
183 /// mark current cursor trace for redraw
186 UpdatableInset * asHyperActiveInset() const;
188 /// enter a MathInset
189 void push(MathAtom & par);
190 /// enter a MathInset from the front
191 void pushLeft(MathAtom & par);
192 /// enter a MathInset from the back
193 void pushRight(MathAtom & par);
194 /// leave current MathInset to the left
196 /// leave current MathInset to the left
200 MathArray & array() const;
202 bool hasPrevAtom() const;
204 bool hasNextAtom() const;
206 MathAtom const & prevAtom() const;
208 MathAtom & prevAtom();
210 MathAtom const & nextAtom() const;
212 MathAtom & nextAtom();
214 /// returns the selection
215 void getSelection(MathCursorPos &, MathCursorPos &) const;
216 /// returns the normalized anchor of the selection
217 MathCursorPos normalAnchor() const;
219 /// reference to the last item of the path, i.e. "The Cursor"
220 MathCursorPos & cursor();
221 /// reference to the last item of the path, i.e. "The Cursor"
222 MathCursorPos const & cursor() const;
223 /// how deep are we nested?
224 unsigned depth() const;
227 MathInset::result_type dispatch(FuncRequest const & cmd);
228 /// describe the situation
230 /// dump selection information for debugging
231 void seldump(char const * str) const;
232 /// dump selection information for debugging
233 void dump(char const * str) const;
235 void setSelection(MathIterator const & where, size_type n);
239 void insert(string const & str);
240 /// lock/unlock inset
243 /// hack for reveal codes
246 void handleExtern(string const & arg);
249 friend class Selection;
253 /// injects content of a cell into parent
255 /// moves cursor index one cell to the left
257 /// moves cursor index one cell to the right
259 /// moves cursor to beginning first cell of current line
261 /// moves cursor to end of last cell of current line
263 /// moves cursor position one cell to the left
265 /// moves cursor position one cell to the right
267 /// moves position somehow up or down
268 bool goUpDown(bool up);
269 /// moves position into box
270 bool bruteFind(int xo, int yo, int xlow, int xhigh, int ylow, int yhigh);
271 /// are we in a nucleus of a script inset?
272 bool inNucleus() const;
275 /// grab grid marked by anchor and current cursor
276 MathGridInset grabSelection() const;
277 /// erase the selected part and re-sets the cursor
278 void eraseSelection();
280 MathGridInset grabAndEraseSelection();
283 string macroName() const;
285 MathInset::difference_type macroNamePos() const;
286 /// can we enter the inset?
287 bool openable(MathAtom const &, bool selection) const;
288 /// write access to cursor cell position
290 /// write access to cursor cell index
293 /// path of positions the cursor had to go if it were leaving each inset
294 MathIterator Cursor_;
295 /// path of positions the anchor had to go if it were leaving each inset
296 mutable MathIterator Anchor_;
297 /// pointer to enclsing LyX inset
298 InsetFormulaBase * formula_;
300 /// text code of last char entered
301 //MathTextCodes lastcode_;
302 /// do we allow autocorrection
304 /// do we currently select
306 /// are we entering a macro name?
308 /// are we targeting a certain x coordinate, if so, which one?
312 extern MathCursor * mathcursor;
313 void releaseMathCursor(BufferView * bv);