X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathMacro.h;h=b389e272e4b2f3aa4ff3bad1799c19876f4d03ef;hb=0f1fdaaa97e9fe01f0e97ca56f0e2380ba248a7e;hp=8e9f1b23d051560462e892d7340cc94058b988a7;hpb=d0d7d0103aed0b300807be54224ba7cd324c1ff5;p=lyx.git diff --git a/src/mathed/MathMacro.h b/src/mathed/MathMacro.h index 8e9f1b23d0..b389e272e4 100644 --- a/src/mathed/MathMacro.h +++ b/src/mathed/MathMacro.h @@ -5,7 +5,7 @@ * Licence details can be found in the file COPYING. * * \author Alejandro Aguilar Sierra - * \author André Pönitz + * \author André Pönitz * * Full author contact details are available in file CREDITS. */ @@ -13,82 +13,179 @@ #ifndef MATH_MACRO_H #define MATH_MACRO_H -#include "InsetMathNest.h" -#include "MathData.h" #include "InsetMathNest.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, int numargs); + MathMacro(Buffer * buf, docstring const & name); /// - void draw(PainterInfo & pi, int x, int y) const; + MathMacro(MathMacro const &); + /// + MathMacro & operator=(MathMacro const &); + /// + ~MathMacro(); /// - void drawExpanded(PainterInfo & pi, int x, int y) const; + 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); } /// - bool metrics(MetricsInfo & mi, Dimension & dim) const; + 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 front, EntryDirection entry_from); + /// Inset * editXY(Cursor & cur, int x, int y); - /// target pos when we enter the inset from the left by pressing "Right" + + /// target pos when we enter the inset while moving forward bool idxFirst(Cursor &) const; - /// target pos when we enter the inset from the right by pressing "Left" + /// target pos when we enter the inset while moving backwards bool idxLast(Cursor &) const; + /// - bool idxUpDown(Cursor & cur, bool up) const; - /// - virtual bool notifyCursorLeaves(Cursor &); - /// - docstring name() const; - /// - void setExpansion(MathData const & exp, MathData const & args) const; + virtual bool notifyCursorLeaves(Cursor const & old, Cursor & cur); + + /// 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 normalize(NormalStream & os) const; /// void maple(MapleStream &) const; /// + void maxima(MaximaStream &) const; + /// + void mathematica(MathematicaStream &) const; + /// void mathmlize(MathStream &) const; /// + void htmlize(HtmlStream &) const; + /// void octave(OctaveStream &) const; /// void infoize(odocstream &) const; /// void infoize2(odocstream &) const; -private: - virtual std::auto_ptr doClone() 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 + }; + /// - void updateExpansion() const; + DisplayMode displayMode() const; - /// 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; + /// - mutable bool editing_; -}; + docstring name() const; + /// + docstring macroName() const; + /// + bool validName() const; + /// + size_t arity() const; + + /// + size_t optionals() const; + /// + void setOptionals(int n); + /// Return the maximal number of arguments the macro is greedy for. + size_t appetite() const; + /// + InsetCode lyxCode() const { return MATH_MACRO_CODE; } + +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, int appetite = -1); + /// 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 * cur, MacroContext const & mc, UpdateType); + /// 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(); + /// + bool editMetrics(BufferView const * bv) const; +private: + /// + virtual Inset * clone() const; + /// + bool editMode(BufferView const * bv) const; + /// + class Private; + /// + Private * d; + /// update lock to avoid loops + class UpdateLocker; + friend class UpdateLocker; + +public: + /// + bool completionSupported(Cursor const &) const; + /// + bool inlineCompletionSupported(Cursor const & cur) const; + /// + bool automaticInlineCompletion() const; + /// + bool automaticPopupCompletion() const; + /// + CompletionList const * createCompletionList(Cursor const & cur) const; + /// + docstring completionPrefix(Cursor const & cur) const; + /// + bool insertCompletion(Cursor & cur, docstring const & s, bool finished); + /// + void completionPosAndDim(Cursor const &, int & x, int & y, Dimension & dim) const; +}; } // namespace lyx #endif