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"
28 class MathUpDownInset;
30 class InsetFormulaBase;
35 /// Description of a position
36 struct MathCursorPos {
43 /// returns cell corresponding to this position
44 MathArray & cell() const;
45 /// returns cell corresponding to this position
46 MathArray & cell(int idx) const;
47 /// returns xcell corresponding to this position
48 MathXArray & xcell() const;
49 /// returns xcell corresponding to this position
50 MathXArray & xcell(int idx) const;
51 /// moves position on cell to the left
53 /// moves position on cell to the right
55 /// moves position on cell up
57 /// moves position on cell up
62 bool operator==(MathCursorPos const &, MathCursorPos const &);
64 bool operator<(MathCursorPos const &, MathCursorPos const &);
67 /// This is the external interface of Math's subkernel
71 explicit MathCursor(InsetFormulaBase *);
73 void insert(char, MathTextCodes t = LM_TC_MIN);
75 void insert(MathInset *);
77 void insert(MathArray const &);
83 bool Right(bool sel = false);
85 bool Left(bool sel = false);
87 bool Up(bool sel = false);
89 bool Down(bool sel = false);
90 /// Put the cursor in the first position
92 /// Put the cursor in the last position
102 /// This is in pixels from (maybe?) the top of inset
103 void SetPos(int, int);
105 void GetPos(int & x, int & y);
107 MathInset * par() const;
108 /// return the next enclosing par of the given type and the cursor's
110 MathInset * enclosing(MathInsetTypes, int &) const;
112 InsetFormulaBase const * formula();
116 void Interpret(string const &);
118 void SetSize(MathStyles);
122 // Macro mode methods
123 void MacroModeOpen();
125 void MacroModeClose();
127 bool InMacroMode() const;
129 // Local selection methods
131 bool Selection() const;
141 void SelHandle(bool);
147 void drawSelection(Painter & pain) const;
149 void clearLastCode();
151 void setLastCode(MathTextCodes t);
153 void handleFont(MathTextCodes t);
155 void handleAccent(string const & name, int code);
157 void handleDelim(int l, int r);
158 /// Splits cells and shifts right part to the next cell
160 /// Splits line and insert new row of cell
163 MathTextCodes getLastCode() const;
165 int idx() const { return cursor().idx_; }
171 void pullArg(bool goright);
173 bool isInside(MathInset *) const;
175 MathTextCodes nextCode() const;
177 MathTextCodes prevCode() const;
188 MathStyles style() const;
189 /// Make sure cursor position is valid
190 void normalize() const;
192 /// Enter a new MathInset from the front or the back
193 void push(MathInset * par, bool first);
194 /// Leave current MathInset
202 /// do we currently select
206 InsetFormulaBase * const formula_;
208 MathTextCodes lastcode;
211 MathArray & array() const;
213 MathXArray & xarray() const;
215 /// returns the first position of the (normalized) selection
216 MathCursorPos firstSelectionPos() const;
217 /// returns the last position of the (normalized) selection
218 MathCursorPos lastSelectionPos() const;
219 /// returns the selection
220 void getSelection(MathCursorPos &, MathCursorPos &) const;
221 /// returns the normalized anchor of the selection
222 MathCursorPos normalAnchor() const;
223 /// returns the normalized anchor of the selection
224 bool openable(MathInset *, bool selection, bool useupdown) const;
226 /// path of positions the cursor had to go if it were leving each inset
227 std::vector<MathCursorPos> Cursor_;
228 /// path of positions the anchor had to go if it were leving each inset
229 std::vector<MathCursorPos> Anchor_;
231 /// reference to the last item of the path
232 MathCursorPos & cursor();
234 MathCursorPos const & cursor() const;
240 MathInset * parInset(int i) const;
242 void seldump(char const * str) const;
244 void dump(char const * str) const;
252 bool nextIsInset() const;
254 bool prevIsInset() const;
256 void merge(MathArray const & arr);
258 MathInset * nextInset() const;
260 MathInset * prevInset() const;
262 MathUpDownInset * prevUpDownInset() const;
264 MathSpaceInset * prevSpaceInset() const;
267 MathFuncInset * imacro;
270 extern MathCursor * mathcursor;