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_defs.h"
25 #include "math_inset.h"
29 class InsetFormulaBase;
35 [Have a look at math_inset.h first]
37 The MathCursor is different from the kind of cursor used in the Outer
38 World. It contains a stack of MathCursorPositions, each of which is made
39 up of a inset pointer, an index and a position offset, marking a path from
40 this formula's mathHullInset to the current position.
47 /// short of anything else reasonable
48 typedef MathInset::size_type size_type;
49 /// type for cursor positions within a cell
50 typedef MathInset::pos_type pos_type;
51 /// type for cell indices
52 typedef MathInset::idx_type idx_type;
53 /// type for row numbers
54 typedef MathInset::row_type row_type;
55 /// type for column numbers
56 typedef MathInset::col_type col_type;
57 /// how to store a cursor
58 typedef std::vector<MathCursorPos> cursor_type;
61 explicit MathCursor(InsetFormulaBase *, bool left);
63 void insert(MathAtom const &);
65 void insert(MathArray const &);
67 void paste(MathArray const &);
72 /// called for LFUN_HOME etc
73 void home(bool sel = false);
74 /// called for LFUN_END etc
75 void end(bool sel = false);
76 /// called for LFUN_RIGHT and LFUN_RIGHTSEL
77 bool right(bool sel = false);
78 /// called for LFUN_LEFT etc
79 bool left(bool sel = false);
80 /// called for LFUN_UP etc
81 bool up(bool sel = false);
82 /// called for LFUN_DOWN etc
83 bool down(bool sel = false);
84 /// Put the cursor in the first position
86 /// Put the cursor in the last position
88 /// move to next cell in current inset
90 /// move to previous cell in current inset
95 void plainInsert(MathAtom const &);
97 void niceInsert(MathAtom const &);
101 /// in pixels from top of screen
102 void setPos(int x, int y);
103 /// in pixels from top of screen
104 void getPos(int & x, int & y);
106 MathInset * par() const;
107 /// return the next enclosing grid inset and the cursor's index in it
108 MathGridInset * enclosingGrid(idx_type &) const;
110 InsetFormulaBase * formula();
111 /// current offset in the current cell
112 pos_type pos() const;
114 idx_type idx() const;
115 /// size of current cell
116 size_type size() const;
120 bool interpret(string const &);
122 bool interpret(char);
125 /// interpret name a name of a macro
126 void macroModeClose();
127 /// are we currently typing the name of a macro?
128 bool inMacroMode() const;
129 /// are we currently typing '#1' or '#2' or...?
130 bool inMacroArgMode() const;
132 // Local selection methods
134 bool selection() const;
144 void selHandle(bool);
150 void selGet(MathArray & ar);
152 void drawSelection(Painter & pain) const;
154 void handleFont(MathTextCodes t);
156 void handleDelim(string const & l, string const & r);
158 void handleNest(MathInset * p);
159 /// splits cells and shifts right part to the next cell
161 /// splits line and insert new row of cell
163 /// read contents of line into an array
164 void readLine(MathArray & ar) const;
165 /// remove this as soon as LyXFunc::getStatus is "localized"
166 MathTextCodes getLastCode() const { return lastcode_; }
168 void pullArg(bool goright);
170 bool isInside(MathInset const *) const;
172 MathTextCodes nextCode() const;
178 col_type hullCol() const;
180 row_type hullRow() const;
182 col_type gridCol() const;
184 row_type gridRow() const;
186 /// make sure cursor position is valid
188 /// mark current cursor trace for redraw
191 UpdatableInset * asHyperActiveInset() const;
193 /// enter a MathInset
194 void push(MathAtom & par);
195 /// enter a MathInset from the front
196 void pushLeft(MathAtom & par);
197 /// enter a MathInset from the back
198 void pushRight(MathAtom & par);
199 /// leave current MathInset to the left
201 /// leave current MathInset to the left
205 MathArray & array() const;
207 MathXArray & xarray() const;
209 bool hasPrevAtom() const;
211 bool hasNextAtom() const;
213 MathAtom const & prevAtom() const;
215 MathAtom & prevAtom();
217 MathAtom const & nextAtom() const;
219 MathAtom & nextAtom();
221 /// returns the selection
222 void getSelection(MathCursorPos &, MathCursorPos &) const;
223 /// returns the normalized anchor of the selection
224 MathCursorPos normalAnchor() const;
226 /// reference to the last item of the path, i.e. "The Cursor"
227 MathCursorPos & cursor();
228 /// reference to the last item of the path, i.e. "The Cursor"
229 MathCursorPos const & cursor() const;
231 /// describe the situation
233 /// dump selection information for debugging
234 void seldump(char const * str) const;
235 /// dump selection information for debugging
236 void dump(char const * str) const;
238 void stripFromLastEqualSign();
240 void setSelection(cursor_type const & where, size_type n);
244 /// hack for reveal codes
249 friend class Selection;
252 /// moves cursor position one cell to the left
254 /// moves cursor position one cell to the right
256 /// moves cursor index one cell to the left
258 /// moves cursor index one cell to the right
260 /// moves position somehow up or down
261 bool goUpDown(bool up);
262 /// moves position into box
263 bool bruteFind(int xo, int yo, int xlow, int xhigh, int ylow, int yhigh);
266 string macroName() const;
268 MathInset::difference_type macroNamePos() const;
270 void insert(char, MathTextCodes t);
271 /// can we enter the inset?
272 bool openable(MathAtom const &, bool selection) const;
273 /// write access to cursor cell position
275 /// write access to cursor cell index
278 /// path of positions the cursor had to go if it were leving each inset
280 /// path of positions the anchor had to go if it were leving each inset
281 mutable cursor_type Anchor_;
282 /// pointer to enclsing LyX inset
283 InsetFormulaBase * formula_;
284 /// text code of last char entered
285 MathTextCodes lastcode_;
287 /// do we currently select
291 extern MathCursor * mathcursor;