// -*- C++ -*- /** * \file MathMacro.h * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * * \author Alejandro Aguilar Sierra * \author André Pönitz * * Full author contact details are available in file CREDITS. */ #ifndef MATH_MACRO_H #define MATH_MACRO_H #include "InsetMathNest.h" #include "InsetMathSqrt.h" #include "MacroTable.h" #include "MathData.h" #include namespace lyx { /// This class contains the data for a macro. class MathMacro : public InsetMathNest { public: /// A macro can be built from an existing template MathMacro(docstring const & name); /// virtual MathMacro * asMacro() { return this; } /// virtual MathMacro const * asMacro() const { return this; } /// void draw(PainterInfo & pi, int x, int y) const; /// draw selection background void drawSelection(PainterInfo & pi, int x, int y) const; /// draw decorations. void drawDecoration(PainterInfo & pi, int x, int y) const { drawMarkers2(pi, x, y); } /// void metrics(MetricsInfo & mi, Dimension & dim) const; /// int kerning(BufferView const * bv) const; /// get cursor position void cursorPos(BufferView const & bv, CursorSlice const & sl, bool boundary, int & x, int & y) const; /// void edit(Cursor & cur, bool left); /// Inset * editXY(Cursor & cur, int x, int y); /// target pos when we enter the inset while moving forward bool idxFirst(Cursor &) const; /// target pos when we enter the inset while moving backwards bool idxLast(Cursor &) const; /// virtual bool notifyCursorLeaves(Cursor &); /// Remove cell (starting from 0) void removeArgument(pos_type pos); /// Insert empty cell (starting from 0) void insertArgument(pos_type pos); /// void validate(LaTeXFeatures &) const; /// void write(WriteStream & os) const; /// void maple(MapleStream &) const; /// void mathmlize(MathStream &) const; /// void octave(OctaveStream &) const; /// void infoize(odocstream &) const; /// void infoize2(odocstream &) const; /// fold the macro in the next metrics call void fold(Cursor & cur); /// unfold the macro in the next metrics call void unfold(Cursor & cur); /// will it be folded or unfolded in the next metric call? bool folded() const; enum DisplayMode { DISPLAY_INIT, DISPLAY_INTERACTIVE_INIT, DISPLAY_UNFOLDED, DISPLAY_NORMAL, }; /// DisplayMode displayMode() const { return displayMode_; } /// bool extraBraces() const { return displayMode_ == DISPLAY_NORMAL && arity() > 0; } /// docstring name() const; /// bool validName() const; /// size_t arity() const { if (displayMode_ == DISPLAY_NORMAL ) return cells_.size(); else return 0; } /// size_t optionals() const { return optionals_; } /// void setOptionals(int n) { if (n <= int(nargs())) optionals_ = n; } protected: friend class MathData; friend class ArgumentProxy; friend class Cursor; /// update the display mode (should only be called after detaching arguments) void setDisplayMode(DisplayMode mode); /// compute the next display mode DisplayMode computeDisplayMode() const; /// update macro definition void updateMacro(MacroContext const & mc); /// check if macro definition changed, argument changed etc. and adapt void updateRepresentation(Cursor const * bvCur); /// empty macro, put arguments into args, possibly strip arity-attachedArgsNum_ empty ones. /// Includes the optional arguments. void detachArguments(std::vector & args, bool strip); /// attach arguments (maybe less than arity at the end of an MathData), /// including the optional ones (even if it can be empty here) void attachArguments(std::vector const & args, size_t arity, int optionals); /// MacroData const * macro() { return macro_; } /// bool editMetrics(BufferView const * bv) const; private: /// virtual Inset * clone() const; /// bool editMode(BufferView const * bv) const; /// name of macro docstring name_; /// current display mode DisplayMode displayMode_; /// expanded macro with ArgumentProxies InsetMathSqrt expanded_; /// editing look of macro MathData definition_; /// number of arguments that were really attached size_t attachedArgsNum_; /// optional argument attached? (only in DISPLAY_NORMAL mode) size_t optionals_; /// fold mode to be set in next metrics call? bool nextFoldMode_; /// if macro_ == true, then here is a copy of the macro /// don't use it for locking MacroData macroBackup_; /// if macroNotFound_ == false, then here is a reference to the macro /// this might invalidate after metrics was called MacroData const * macro_; /// mutable std::map editing_; /// std::string requires_; /// update macro representation bool needsUpdate_; }; } // namespace lyx #endif