X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathMacro.h;h=050abe1849d4b2d3e432df0527c95fad91d0c08e;hb=565475a43917af9c52a3d9d8272e020160d0b971;hp=369819ec3636ad90776d0bbbafd76369db8f1ea5;hpb=ed858d73e57ce7aa89e38c1bc4d799362edb0227;p=lyx.git diff --git a/src/mathed/MathMacro.h b/src/mathed/MathMacro.h index 369819ec36..050abe1849 100644 --- a/src/mathed/MathMacro.h +++ b/src/mathed/MathMacro.h @@ -14,10 +14,9 @@ #define MATH_MACRO_H #include "InsetMathNest.h" -#include "MathData.h" -#include "InsetMathNest.h" +#include "InsetMathSqrt.h" #include "MacroTable.h" - +#include "MathData.h" namespace lyx { @@ -26,41 +25,48 @@ namespace lyx { class MathMacro : public InsetMathNest { public: /// A macro can be built from an existing template - MathMacro(docstring const & name, int numargs); + MathMacro(docstring const & name); /// - void draw(PainterInfo & pi, int x, int y) const; + virtual MathMacro * asMacro() { return this; } /// - void drawExpanded(PainterInfo & pi, int x, int y) const; + 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); } /// - bool metrics(MetricsInfo & mi, Dimension & dim) const; + void metrics(MetricsInfo & mi, Dimension & dim) const; + /// + int kerning() 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 from the left by pressing "Right" bool idxFirst(Cursor &) const; /// target pos when we enter the inset from the right by pressing "Left" bool idxLast(Cursor &) const; - /// - bool idxUpDown(Cursor & cur, bool up) const; + /// virtual bool notifyCursorLeaves(Cursor &); - /// - docstring name() const; - /// - int kerning() const { return kerning_; } - /// - void setExpansion(MathData const & exp, MathData const & args) const; + + /// 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; /// @@ -72,27 +78,106 @@ public: /// void infoize2(odocstream &) const; -private: - virtual Inset * clone() 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_NONGREEDY_INIT, + DISPLAY_UNFOLDED, + DISPLAY_NORMAL, + }; + /// - void updateExpansion() const; + DisplayMode displayMode() const { return displayMode_; } - /// name of macro - docstring name_; - /// the unexpanded macro defintition - mutable MathData tmpl_; - /// the macro substituted with our args - mutable MathData expanded_; /// - mutable MacroData macroBackup_; + bool extraBraces() const { return displayMode_ == DISPLAY_NORMAL && arity() > 0; } + + /// - mutable bool editing_; + docstring name() const; /// - mutable int kerning_; -}; - + 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(MetricsInfo const & mi) const; + /// update macro definition + void updateMacro(MetricsInfo & mi); + /// check if macro definition changed, argument changed etc. and adapt + void updateRepresentation(MetricsInfo & mi); + /// 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); + /// + bool editing() { return editing_; } + /// + MacroData const * macro() { return macro_; } +private: + /// + virtual Inset * clone() const; + /// the index of the cursor slice of the macro, or -1 if it is not edited + int cursorIdx(Cursor const & cur) const; + /// + bool editMode(Cursor const & cur) const; + + /// name of macro + docstring name_; + /// current display mode + DisplayMode displayMode_; + /// display mode before change + InsetMathSqrt expanded_; + /// number of arguments that were really attached + size_t attachedArgsNum_; + /// cursor position during last draw + idx_type previousCurIdx_; + /// 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_; + /// + bool editing_; + /// + std::string requires_; + /// update macro representation + bool needsUpdate_; +}; } // namespace lyx #endif