X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathMacro.h;h=6e795237e197d2b50480c9b69d6f0e19cde108f0;hb=5fdc577badb1cb133d6a0dc7d831bb1f82576adb;hp=e3fdde91de8ee572806b29a5f387c01f6355515a;hpb=417139f4da6532c278d3744f191b33804ee26ea0;p=lyx.git diff --git a/src/mathed/MathMacro.h b/src/mathed/MathMacro.h index e3fdde91de..6e795237e1 100644 --- a/src/mathed/MathMacro.h +++ b/src/mathed/MathMacro.h @@ -27,10 +27,20 @@ public: /// A macro can be built from an existing template MathMacro(Buffer * buf, docstring const & name); /// + MathMacro(MathMacro const &); + /// + MathMacro & operator=(MathMacro const &); + /// + ~MathMacro(); + /// virtual MathMacro * asMacro() { return this; } /// virtual MathMacro const * asMacro() const { return this; } /// + /// If the macro is in normal edit mode, dissolve its contents in + /// the row. Otherwise, just insert the inset. + bool addToMathRow(MathRow &, MetricsInfo & mi) const; + /// void draw(PainterInfo & pi, int x, int y) const; /// draw selection background void drawSelection(PainterInfo & pi, int x, int y) const; @@ -39,6 +49,8 @@ public: { drawMarkers2(pi, x, y); } /// void metrics(MetricsInfo & mi, Dimension & dim) const; + /// was the macro in edit mode when computing metrics? + bool editMetrics(BufferView const * bv) const; /// int kerning(BufferView const * bv) const; /// get cursor position @@ -56,7 +68,7 @@ public: /// virtual bool notifyCursorLeaves(Cursor const & old, Cursor & cur); - + /// Remove cell (starting from 0) void removeArgument(pos_type pos); /// Insert empty cell (starting from 0) @@ -64,6 +76,8 @@ public: /// void validate(LaTeXFeatures &) const; + /// + mode_type currentMode() const; /// void write(WriteStream & os) const; @@ -92,7 +106,7 @@ public: 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, @@ -101,34 +115,35 @@ public: }; /// - DisplayMode displayMode() const { return displayMode_; } + DisplayMode displayMode() const; /// - bool extraBraces() const { return displayMode_ == DISPLAY_NORMAL && arity() > 0; } + bool extraBraces() const; /// docstring name() const; + /// FIXME: Often dangling. + MacroData const * macro() const; + /// + docstring macroName() const; + /// Level of nesting in macros (including this one) + int nesting() const; /// bool validName() const; /// - size_t arity() const { - if (displayMode_ == DISPLAY_NORMAL ) - return cells_.size(); - else - return 0; - } - + size_t arity() const; + /// - size_t optionals() const { return optionals_; } + size_t optionals() const; /// - void setOptionals(int n) { - if (n <= int(nargs())) - optionals_ = n; - } + void setOptionals(int n); /// Return the maximal number of arguments the macro is greedy for. - size_t appetite() const { return appetite_; } + size_t appetite() const; /// InsetCode lyxCode() const { return MATH_MACRO_CODE; } + /// This is not used for display; however whether it is mathrel determines + /// how to split equations intelligently. + MathClass mathClass() const; //override protected: friend class MathData; @@ -142,56 +157,36 @@ protected: /// update macro definition void updateMacro(MacroContext const & mc); /// check if macro definition changed, argument changed etc. and adapt - void updateRepresentation(Cursor * cur, MacroContext const & mc, UpdateType); + void updateRepresentation(Cursor * cur, MacroContext const & mc, + UpdateType, int nesting); /// 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: + /// Math mode for output and display. UNDECIDED for user macros: they could + /// be either. + mode_type modeToEnsure() const; + /// This function is needed for now because of two shortfalls of the current + /// implementation: the macro() pointer is often dangling, in which case we + /// fall back to a backup copy, and the macro is not known at inset + /// creation, in which case we fall back to the global macro with this name. + MacroData const * macroBackup() const; /// virtual Inset * clone() const; /// bool editMode(BufferView const * bv) const; - - /// name of macro - docstring name_; - /// current display mode - DisplayMode displayMode_; - /// expanded macro with ArgumentProxies - MathData expanded_; - /// macro definition with #1,#2,.. insets - 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_; + + /// + class Private; + /// + Private * d; /// update lock to avoid loops class UpdateLocker; friend class UpdateLocker; - bool isUpdating_; - /// maximal number of arguments the macro is greedy for - size_t appetite_; public: ///