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);
134 MathArray & cell(int);
136 MathArray const & cell(int) const;
138 MathXArray & xcell(int);
140 MathXArray const & xcell(int) const;
153 virtual int ncols() const { return 1; }
155 virtual int nrows() const { return 1; }
157 virtual int col(int) const { return 0; }
159 virtual int row(int) const { return 0; }
161 virtual void addRow(int) {}
163 virtual void delRow(int) {}
165 virtual void addCol(int) {}
167 virtual void delCol(int) {}
170 virtual void UserSetSize(MathStyles &) {}
173 void GetXY(int & x, int & y) const;
175 bool covers(int x, int y) const;
176 /// Identifies ScriptInsets
177 virtual bool isUpDownInset() const { return false; }
178 /// Identifies BigopInsets
179 virtual bool isBigopInset() const { return false; }
181 virtual bool isActive() const { return nargs() > 0; }
185 void push_back(MathInset *);
187 void push_back(unsigned char ch, MathTextCodes fcode);
192 void Validate(LaTeXFeatures & features) const;
195 static int workwidth;
200 MathInsetTypes objtype;
208 void size(MathStyles s);
214 typedef std::vector<MathXArray> cells_type;
216 * The contents of the inset are contained here.
217 * Each inset is build from a number of insets.
223 /// Cursor start position in pixels from the document top
229 std::ostream & operator<<(std::ostream &, MathInset const &);