X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_inset.h;h=bd97f31d3375a9d0d950336ef4d9642296ad447c;hb=51e0c8bd1f265913a64fb46bc61fcfdb26f02303;hp=1deccae3228ad4873bc4d1175be7fa620c5c234a;hpb=abb623f7872ba960a92a6d069dcb6aa5add0d8b0;p=lyx.git diff --git a/src/mathed/math_inset.h b/src/mathed/math_inset.h index 1deccae322..bd97f31d33 100644 --- a/src/mathed/math_inset.h +++ b/src/mathed/math_inset.h @@ -8,391 +8,222 @@ * * Dependencies: Xlib, XForms * - * Copyright: (c) 1996, 1997 Alejandro Aguilar Sierra + * Copyright: 1996, 1997 Alejandro Aguilar Sierra * - * Version: 0.8beta, Mathed & Lyx project. + * Version: 0.8beta, Math & Lyx project. * * You are free to use and modify this code under the terms of * the GNU General Public Licence version 2 or later. */ -// Note: These math insets are internal to Mathed and are not derived +// Note: These math insets are internal to Math and are not derived // from lyx inset. -#ifndef MATH_INSET -#define MATH_INSET +#ifndef MATH_INSET_H +#define MATH_INSET_H + +#include #ifdef __GNUG__ #pragma interface #endif -#include "math_defs.h" -#include "symbol_def.h" #include "LString.h" +#include "symbol_def.h" +#include "xarray.h" +/** Abstract base class for all math objects. + A math insets is for use of the math editor only, it isn't a + general LyX inset. It's used to represent all the math objects. + The formulaInset (a LyX inset) encapsulates a math inset. +*/ -/** - Functions or LaTeX names for objects that I don't know how to draw. - */ -class MathFuncInset: public MathedInset { -public: - /// - MathFuncInset(char const * nm, - short ot = LM_OT_FUNC, short st = LM_ST_TEXT); - /// - ~MathFuncInset(); - /// - MathedInset * Clone(); - /// - void draw(Painter &, int, int); - /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY - /// - void Write(string & file); -#endif - /// - void Metrics(); - /// - inline bool GetLimits() const; -protected: - /// - int ln; - /// - bool lims; - /// - char * fname; -}; +class LaTeXFeatures; -/// Accents -class MathAccentInset: public MathedInset { -public: - /// - MathAccentInset(byte, MathedTextCodes, int, short st = LM_ST_TEXT); - /// - MathAccentInset(MathedInset *, int, short st = LM_ST_TEXT); - /// - ~MathAccentInset(); - /// - MathedInset * Clone(); - /// - void draw(Painter &, int, int); - /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY - /// - void Write(string & file); -#endif - /// - void Metrics(); - /// - int getAccentCode() const { return code; } - -protected: - /// - byte c; +class MathInset { +public: /// - MathedTextCodes fn; - /// - int code; - /// - MathedInset * inset; - /// - int dh, dy; -}; + explicit MathInset(string const & nm = string()); + /// the virtual base destructor + virtual ~MathInset() {} -/// -class MathDotsInset: public MathedInset { -public: + /// draw the object, sets xo_ and yo_ cached values + virtual void draw(Painter &, int x, int baseline) = 0; + /// write LaTeX and Lyx code + virtual void write(std::ostream &, bool fragile) const = 0; + /// write normalized content + virtual void writeNormal(std::ostream &) const; + /// reproduce itself + virtual MathInset * clone() const = 0; + /// appends itself with macro arguments substituted + virtual void substitute(MathArray & array, MathMacro const & macro) const; + /// compute the size of the object, sets ascend_, descend_ and width_ + virtual void metrics(MathStyles st) = 0; + /// + virtual int ascent() const; /// - MathDotsInset(char const *, int, short st = LM_ST_TEXT); + virtual int descent() const; /// - MathedInset * Clone(); + virtual int width() const; /// - void draw(Painter &, int, int); + virtual int height() const; /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY + string const & name() const; /// - void Write(string & file); -#endif - /// - void Metrics(); -protected: + virtual void setName(string const & n); /// - int dh, code; -}; + virtual MathStyles size() const; + /// Where should we go when we press the up cursor key? + virtual bool idxUp(int & idx, int & pos) const; + /// The down key + virtual bool idxDown(int & idx, int & pos) const; + /// The left key + virtual bool idxLeft(int & idx, int & pos) const; + /// The right key + virtual bool idxRight(int & idx, int & pos) const; -/// Smart spaces -class MathSpaceInset: public MathedInset { -public: - /// - MathSpaceInset(int sp, short ot = LM_OT_SPACE, short st = LM_ST_TEXT); - /// - MathedInset * Clone(); - /// - void draw(Painter &, int, int); - /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY - /// - void Write(string & file); -#endif - /// - inline void Metrics(); - /// - inline void SetSpace(int sp); - /// - int GetSpace() { return space; } -protected: - /// - int space; -}; + /// Move one physical cell up + virtual bool idxNext(int & idx, int & pos) const; + /// Move one physical cell down + virtual bool idxPrev(int & idx, int & pos) const; + /// Target pos when we enter the inset from the left by pressing "Right" + virtual bool idxFirst(int & idx, int & pos) const; + /// Target pos when we enter the inset from the left by pressing "Up" + virtual bool idxFirstUp(int & idx, int & pos) const; + /// Target pos when we enter the inset from the left by pressing "Down" + virtual bool idxFirstDown(int & idx, int & pos) const; -/// big operators -class MathBigopInset: public MathedInset { -public: - /// - MathBigopInset(char const *, int, short st = LM_ST_TEXT); - /// - MathedInset * Clone(); - /// - void draw(Painter &, int, int); - /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY - /// - void Write(string & file); -#endif - /// - void Metrics(); - /// - inline bool GetLimits() const; - /// - inline void SetLimits(bool); -protected: - /// - int lims; - /// - int sym; -}; + /// Target pos when we enter the inset from the right by pressing "Left" + virtual bool idxLast(int & idx, int & pos) const; + /// Target pos when we enter the inset from the right by pressing "Up" + virtual bool idxLastUp(int & idx, int & pos) const; + /// Target pos when we enter the inset from the right by pressing "Down" + virtual bool idxLastDown(int & idx, int & pos) const; - -//------- All editable insets must be derived from MathParInset. - -/// -class MathSqrtInset: public MathParInset { -public: - /// - MathSqrtInset(short st = LM_ST_TEXT); - /// - MathedInset * Clone(); - /// - void draw(Painter &, int x, int baseline); - /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY - /// - void Write(string & file); -#endif - /// - void Metrics(); - /// - bool Inside(int, int); -private: - /// - int hmax, wbody; -}; + /// Where should we go if we press home? + virtual bool idxHome(int & idx, int & pos) const; + /// Where should we go if we press end? + virtual bool idxEnd(int & idx, int & pos) const; + /// Delete a cell and move cursor + // the return value indicates whether the cursor should leave the inset + // and/or the whole inset should be deleted + virtual void idxDelete(int & idx, bool & popit, bool & deleteit); + // deletes a cell range and moves the cursor + virtual void idxDeleteRange(int from, int to); + // returns list of cell indices that are "between" from and to for + // selection purposes + virtual std::vector idxBetween(int from, int to) const; -/// Fraction like objects (frac, stackrel, binom) -class MathFracInset: public MathParInset { -public: - /// - MathFracInset(short ot = LM_OT_FRAC); /// - ~MathFracInset(); - /// - MathedInset * Clone(); - /// - void draw(Painter &, int x, int baseline); - /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY - /// - void Write(string & file); -#endif - /// - void Metrics(); - - /** This does the same that SetData(LyxArrayBase*) but for both - numerator and denominator at once. - */ - void SetData(LyxArrayBase *, LyxArrayBase *); - /// - void SetData(LyxArrayBase *); - /// - void GetXY(int & x, int & y) const; - /// - void SetFocus(int, int); + virtual int nargs() const; + /// - bool Inside(int, int); + virtual MathArray & cell(int); /// - LyxArrayBase * GetData(); + virtual MathArray const & cell(int) const; /// - bool setArgumentIdx(int i); // was bool Up/down(void); + virtual MathXArray & xcell(int); /// - int getArgumentIdx() { return int(idx); } + virtual MathXArray const & xcell(int) const; + /// - int getMaxArgumentIdx() { return 1; } + virtual int xo() const; /// - void SetStyle(short); -protected: + virtual int yo() const; /// - short idx; + virtual void xo(int tx); /// - MathParInset * den; + virtual void yo(int ty); /// - int w0, w1, des0, dh; -}; - -/// A delimiter -class MathDelimInset: public MathParInset { -public: /// - MathDelimInset(int, int, short st = LM_ST_TEXT); + virtual int ncols() const { return 1; } /// - MathedInset * Clone(); + virtual int nrows() const { return 1; } /// - void draw(Painter &, int, int); + virtual int col(int) const { return 0; } /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY + virtual int row(int) const { return 0; } /// - void Write(string & file); -#endif + virtual void addRow(int) {} /// - void Metrics(); -protected: + virtual void delRow(int) {} /// - int left, right; + virtual void addCol(int) {} /// - int dw, dh; -}; - + virtual void delCol(int) {} -/// Decorations over (below) a math object -class MathDecorationInset: public MathParInset { -public: - /// - MathDecorationInset(int, short st = LM_ST_TEXT); - /// - MathedInset * Clone(); /// - void draw(Painter &, int, int); + virtual void userSetSize(MathStyles &) {} + /// - void Write(ostream &); -#ifndef USE_OSTREAM_ONLY + virtual void getXY(int & x, int & y) const; /// - void Write(string & file); -#endif + virtual bool covers(int x, int y) const; + /// identifies things that can get scripts + virtual bool isScriptable() const { return false; } + /// identifies ScriptInsets + virtual bool isScriptInset() const { return false; } + /// identifies SpaceInsets + virtual bool isSpaceInset() const { return false; } + /// identifies GridInsets + virtual bool isGrid() const { return false; } + /// identifies ArrayInsets + virtual bool isArray() const { return false; } + /// identifies Charinsets + virtual bool isCharInset() const { return false; } /// - void Metrics(); + virtual bool isActive() const { return nargs() > 0; } /// - inline bool GetLimits() const; -protected: + virtual char getChar() const { return 0; } + /// - int deco; + virtual void push_back(MathInset *); /// - bool upper; + virtual void push_back(unsigned char ch, MathTextCodes fcode); /// - int dw, dh, dy; -}; - - -// -------------------- Inline functions --------------------- - - -inline -MathFuncInset::~MathFuncInset() -{ - if (fname && GetType() == LM_OT_UNDEF) delete[] fname; -} - - -inline -bool MathFuncInset::GetLimits() const -{ - return bool(lims && (GetStyle() == LM_ST_DISPLAY)); -} - - -inline -void MathFuncInset::Write(ostream & os) -{ - os << "\\" << name << ' '; -} - - -#ifndef USE_OSTREAM_ONLY -inline -void MathFuncInset::Write(string & file) -{ - file += '\\'; - file += name; - file += ' '; -} -#endif - - -inline -void MathSpaceInset::Metrics() -{ - width = space ? space * 2 : 2; - if (space > 3) width *= 2; - if (space == 5) width *= 2; - width += 4; - ascent = 4; descent = 0; -} - - -inline -void MathSpaceInset::SetSpace(int sp) -{ - space = sp; - Metrics(); -} + virtual void dump() const; + /// + virtual void validate(LaTeXFeatures & features) const; -inline -bool MathBigopInset::GetLimits() const -{ - // Default case - if (lims < 0) { - return sym != LM_int && sym != LM_oint && GetStyle() == LM_ST_DISPLAY; - } - - // Custom - return lims > 0; -} + /// + static int workwidth; + /// the inherited text style + virtual MathTextCodes code() const; + /// + virtual void code(MathTextCodes t); -inline -void MathBigopInset::SetLimits(bool ls) -{ - lims = ls ? 1 : 0; -} +protected: + /// usually the LaTeX name of the thingy + string name_; + /// the width of this inset as computed by metrics() + int width_; + /// + int ascent_; + /// + int descent_; + /// + void size(MathStyles s); + /// the used font size + MathStyles size_; + /// the inherited text style + MathTextCodes code_; +private: + /// the following are used for positioning the cursor with the mouse + /// cached cursor start position in pixels from the document left + int xo_; + /// cached cursor start position in pixels from the document top + int yo_; +}; -inline -bool MathDecorationInset::GetLimits() const -{ - return deco == LM_underbrace || deco == LM_overbrace; -} +std::ostream & operator<<(std::ostream &, MathInset const &); #endif