]> git.lyx.org Git - lyx.git/blob - src/mathed/math_cursor.h
a653a4950b52ee7600df32960b40b80ccd731ff8
[lyx.git] / src / mathed / math_cursor.h
1 // -*- C++ -*-
2 /*
3  *  File:        math_cursor.h
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
8  *
9  *  Dependencies: Xlib, XForms
10  *
11  *  Copyright: 1996, Alejandro Aguilar Sierra
12  *
13  *   You are free to use and modify this code under the terms of
14  *   the GNU General Public Licence version 2 or later.
15  */
16
17 #ifndef MATH_CURSOR
18 #define MATH_CURSOR
19
20 #ifdef __GNUG__
21 #pragma interface
22 #endif
23
24 #include "math_inset.h"
25 #include "math_iterator.h"
26 #include "LString.h"
27
28 class InsetFormulaBase;
29 class BufferView;
30 class MathPainterInfo;
31 class MathUnknownInset;
32 class Selection;
33
34 /**
35
36 [Have a look at math_inset.h first]
37
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.
42
43 */
44
45
46 class MathCursor {
47 public:
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
59         ///
60         explicit MathCursor(InsetFormulaBase *, bool left);
61         ///
62         ~MathCursor();
63         ///
64         void insert(MathAtom const &);
65         ///
66         void insert(MathArray const &);
67         ///
68         void paste(MathArray const &);
69         ///
70         void paste(MathGridInset const & data);
71         ///
72         void erase();
73         ///
74         void backspace();
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
88         void first();
89         /// Put the cursor in the last position
90         void last();
91         /// move to next cell in current inset
92         void idxNext();
93         /// move to previous cell in current inset
94         void idxPrev();
95         ///
96         void plainErase();
97         ///
98         void plainInsert(MathAtom const &);
99         ///
100         void niceInsert(MathAtom const &);
101
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);
106         /// current inset
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);
118         ///
119         InsetFormulaBase * formula() const;
120         /// current offset in the current cell
121         pos_type pos() const;
122         /// current cell
123         idx_type idx() const;
124         /// size of current cell
125         size_type size() const;
126         ///
127         bool script(bool);
128         ///
129         bool interpret(string const &);
130         /// 
131         bool interpret(char);
132         ///
133         bool toggleLimits();
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;
146
147         // Local selection methods
148         ///
149         bool selection() const;
150         ///
151         void selCopy();
152         ///
153         void selCut();
154         ///
155         void selDel();
156         ///
157         void selPaste();
158         ///
159         void selHandle(bool);
160         ///
161         void selStart();
162         ///
163         void selClear();
164         /// clears or deletes selection depending on lyxrc setting
165         void selClearOrDel();
166         ///
167         void selGet(MathArray & ar);
168         ///
169         void drawSelection(MathPainterInfo & pain) const;
170         ///
171         void handleNest(MathAtom const & at);
172         /// remove this as soon as LyXFunc::getStatus is "localized"
173         string getLastCode() const { return "mathnormal"; }
174         ///
175         bool isInside(MathInset const *) const;
176         ///
177         char valign() const;
178         ///
179         char halign() const;
180         ///
181         col_type hullCol() const;
182         ///
183         row_type hullRow() const;
184         ///
185         col_type gridCol() const;
186         ///
187         row_type gridRow() const;
188
189         /// make sure cursor position is valid
190         void normalize();
191         /// mark current cursor trace for redraw
192         void touch();
193         ///
194         UpdatableInset * asHyperActiveInset() const;
195
196         /// enter a MathInset
197         void push(MathAtom & par);
198         /// enter a MathInset from the front
199         void pushLeft(MathAtom & par);
200         /// enter a MathInset from the back
201         void pushRight(MathAtom & par);
202         /// leave current MathInset to the left
203         bool popLeft();
204         /// leave current MathInset to the left
205         bool popRight();
206
207         ///
208         MathArray & array() const;
209         ///
210         bool hasPrevAtom() const;
211         ///
212         bool hasNextAtom() const;
213         ///
214         MathAtom const & prevAtom() const;
215         ///
216         MathAtom & prevAtom();
217         ///
218         MathAtom const & nextAtom() const;
219         ///
220         MathAtom & nextAtom();
221
222         /// returns the selection
223         void getSelection(MathCursorPos &, MathCursorPos &) const;
224         /// returns the normalized anchor of the selection
225         MathCursorPos normalAnchor() const;
226
227         /// reference to the last item of the path, i.e. "The Cursor"
228         MathCursorPos & cursor();
229         /// reference to the last item of the path, i.e. "The Cursor"
230         MathCursorPos const & cursor() const;
231         /// how deep are we nested?
232         unsigned depth() const;
233
234         /// local dispatcher
235         MathInset::result_type dispatch(FuncRequest const & cmd);
236         /// describe the situation
237         string info() const;
238         /// dump selection information for debugging
239         void seldump(char const * str) const;
240         /// dump selection information for debugging
241         void dump(char const * str) const;
242         /// moves on
243         void setSelection(MathIterator const & where, size_type n);
244         ///
245         void insert(char c);
246         ///
247         void insert(string const & str);
248         /// lock/unlock inset
249         void insetToggle();
250
251         /// hack for reveal codes
252         void markInsert();
253         void markErase();
254         void handleExtern(string const & arg);
255
256         ///
257         friend class Selection;
258
259
260 private:
261         /// injects content of a cell into parent
262         void pullArg();
263         /// moves cursor index one cell to the left
264         bool idxLeft();
265         /// moves cursor index one cell to the right
266         bool idxRight();
267         /// moves cursor to beginning first cell of current line
268         bool idxLineFirst();
269         /// moves cursor to end of last cell of current line
270         bool idxLineLast();
271         /// moves cursor position one cell to the left
272         bool posLeft();
273         /// moves cursor position one cell to the right
274         bool posRight();
275         /// moves position somehow up or down
276         bool goUpDown(bool up);
277         /// moves position into box
278         bool bruteFind(int xo, int yo, int xlow, int xhigh, int ylow, int yhigh);
279         /// are we in a nucleus of a script inset?
280         bool inNucleus() const;
281
282
283         /// grab grid marked by anchor and current cursor 
284         MathGridInset grabSelection() const;
285         /// erase the selected part and re-sets the cursor
286         void eraseSelection();
287         /// guess what
288         MathGridInset grabAndEraseSelection();
289
290         ///
291         string macroName() const;
292         ///
293         MathInset::difference_type macroNamePos() const;
294         /// can we enter the inset?
295         bool openable(MathAtom const &, bool selection) const;
296         /// write access to cursor cell position
297         pos_type & pos();
298         /// write access to cursor cell index
299         idx_type & idx();
300
301         /// path of positions the cursor had to go if it were leaving each inset
302         MathIterator Cursor_;
303         /// path of positions the anchor had to go if it were leaving each inset
304         mutable MathIterator Anchor_;
305         /// pointer to enclsing LyX inset
306         InsetFormulaBase * formula_;
307         // Selection stuff
308         /// text code of last char entered
309         //MathTextCodes lastcode_;
310         /// do we allow autocorrection
311         bool autocorrect_;
312         /// do we currently select
313         bool selection_;
314         /// are we entering a macro name?
315         bool macromode_;
316         /// are we targeting a certain x coordinate, if so, which one?
317         int targetx_;
318 };
319
320 extern MathCursor * mathcursor;
321 void releaseMathCursor(BufferView * bv);
322
323 #endif