4 * Purpose: Declaration of insets for mathed
5 * Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
6 * Created: January 1996
7 * Description: Math paragraph and objects for a WYSIWYG math editor.
9 * Dependencies: Xlib, XForms
11 * Copyright: 1996, 1997 Alejandro Aguilar Sierra
13 * Version: 0.8beta, Math & Lyx project.
15 * You are free to use and modify this code under the terms of
16 * the GNU General Public Licence version 2 or later.
19 // Note: These math insets are internal to Math and are not derived
32 #include "symbol_def.h"
35 /** Abstract base class for all math objects.
36 A math insets is for use of the math editor only, it isn't a
37 general LyX inset. It's used to represent all the math objects.
38 The formulaInset (a LyX inset) encapsulates a math inset.
46 /** A math inset has a name (usually its LaTeX name),
51 (int na = 0, string const & nm = string(), MathInsetTypes ot = LM_OT_SIMPLE);
53 /// The virtual base destructor
54 virtual ~MathInset() {}
57 virtual void draw(Painter &, int x, int baseline) = 0;
58 /// Write LaTeX and Lyx code
59 virtual void Write(std::ostream &, bool fragile) const = 0;
60 /// Write normalized content
61 virtual void WriteNormal(std::ostream &) const;
63 virtual MathInset * clone() const = 0;
64 /// Appends itself with macro arguments substituted
65 virtual void substitute(MathArray & array, MathMacro const & macro) const;
66 /// Compute the size of the object
67 virtual void Metrics(MathStyles st, int = 0, int = 0) = 0;
69 virtual int ascent() const;
71 virtual int descent() const;
73 virtual int width() const;
75 virtual int height() const;
77 virtual int limits() const;
79 virtual void limits(int);
81 string const & name() const;
83 MathInsetTypes GetType() const;
84 //Man: Avoid to use these functions if it's not strictly necessary
86 virtual void SetType(MathInsetTypes t);
88 virtual void SetName(string const & n);
90 MathStyles size() const;
92 /// Where should we go when we press the up cursor key?
93 virtual bool idxUp(int & idx, int & pos) const;
95 virtual bool idxDown(int & idx, int & pos) const;
97 virtual bool idxLeft(int & idx, int & pos) const;
99 virtual bool idxRight(int & idx, int & pos) const;
101 /// Move one physical cell up
102 virtual bool idxNext(int & idx, int & pos) const;
103 /// Move one physical cell down
104 virtual bool idxPrev(int & idx, int & pos) const;
106 /// Target pos when we enter the inset from the left by pressing "Right"
107 virtual bool idxFirst(int & idx, int & pos) const;
108 /// Target pos when we enter the inset from the left by pressing "Up"
109 virtual bool idxFirstUp(int & idx, int & pos) const;
110 /// Target pos when we enter the inset from the left by pressing "Down"
111 virtual bool idxFirstDown(int & idx, int & pos) const;
113 /// Target pos when we enter the inset from the right by pressing "Left"
114 virtual bool idxLast(int & idx, int & pos) const;
115 /// Target pos when we enter the inset from the right by pressing "Up"
116 virtual bool idxLastUp(int & idx, int & pos) const;
117 /// Target pos when we enter the inset from the right by pressing "Down"
118 virtual bool idxLastDown(int & idx, int & pos) const;
120 /// Where should we go if we press home?
121 virtual bool idxHome(int & idx, int & pos) const;
122 /// Where should we go if we press end?
123 virtual bool idxEnd(int & idx, int & pos) const;
125 /// Delete a cell and move cursor
126 // the return value indicates whether the cursor should leave the inset
127 // and/or the whole inset should be deleted
128 virtual void idxDelete(int & idx, bool & popit, bool & deleteit);
129 // deletes a cell range and moves the cursor
130 virtual void idxDeleteRange(int from, int to);
131 // returns list of cell indices that are "between" from and to for
133 virtual std::vector<int> idxBetween(int from, int to) const;
139 MathArray & cell(int);
141 MathArray const & cell(int) const;
143 MathXArray & xcell(int);
145 MathXArray const & xcell(int) const;
158 virtual int ncols() const { return 1; }
160 virtual int nrows() const { return 1; }
162 virtual int col(int) const { return 0; }
164 virtual int row(int) const { return 0; }
166 virtual void addRow(int) {}
168 virtual void delRow(int) {}
170 virtual void addCol(int) {}
172 virtual void delCol(int) {}
175 virtual void UserSetSize(MathStyles &) {}
178 void GetXY(int & x, int & y) const;
180 bool covers(int x, int y) const;
181 /// Identifies ScriptInsets
182 virtual bool isUpDownInset() const { return false; }
183 /// Identifies BigopInsets
184 virtual bool isBigopInset() const { return false; }
186 virtual bool isActive() const { return nargs() > 0; }
190 void push_back(MathInset *);
192 void push_back(unsigned char ch, MathTextCodes fcode);
197 void Validate(LaTeXFeatures & features) const;
200 static int workwidth;
205 MathInsetTypes objtype;
213 void size(MathStyles s);
219 typedef std::vector<MathXArray> cells_type;
221 * The contents of the inset are contained here.
222 * Each inset is build from a number of insets.
228 /// Cursor start position in pixels from the document top
234 std::ostream & operator<<(std::ostream &, MathInset const &);