3 * \file math_macrotemplate.h
4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Alejandro Aguilar Sierra
10 * Full author contact details are available in file CREDITS.
13 #ifndef MATH_MACROTEMPLATE_H
14 #define MATH_MACROTEMPLATE_H
16 #include "InsetMathNest.h"
17 #include "MacroTable.h"
20 #include "support/types.h"
25 /// This class contains the macro definition.
26 class MathMacroTemplate
: public InsetMathNest
{
31 MathMacroTemplate(docstring
const & name
, int nargs
, int optional
,
33 std::vector
<MathData
> const & optionalValues
= std::vector
<MathData
>(),
34 MathData
const & def
= MathData(),
35 MathData
const & display
= MathData());
37 explicit MathMacroTemplate(const docstring
& str
);
39 bool editable() const { return true; }
41 void edit(Cursor
& cur
, bool front
, EntryDirection entry_from
);
43 bool notifyCursorLeaves(Cursor
const & old
, Cursor
& cur
);
45 void read(Lexer
& lex
);
47 void write(std::ostream
& os
) const;
49 void write(WriteStream
& os
) const;
50 /// Output LaTeX code, but assume that the macro is not definied yet
51 /// if overwriteRedefinition is true
52 void write(WriteStream
& os
, bool overwriteRedefinition
) const;
54 int plaintext(odocstream
&, OutputParams
const &) const;
56 bool noFontChange() const { return true; }
59 docstring
name() const;
61 void getDefaults(std::vector
<docstring
> & defaults
) const;
63 docstring
definition() const;
65 docstring
displayDefinition() const;
67 size_t numArgs() const;
69 size_t numOptionals() const;
71 bool redefinition() const { return redefinition_
; }
73 MacroType
type() const { return type_
; }
75 /// check name and possible other formal properties
76 bool validMacro() const;
78 bool validName() const;
79 /// Remove everything from the name which makes it invalid
80 /// and return true iff it is valid.
81 bool fixNameAndCheckIfValid();
83 /// request "external features"
84 virtual void validate(LaTeXFeatures
&) const;
86 /// decide whether its a redefinition
87 void updateToContext(MacroContext
const & mc
) const;
90 void draw(PainterInfo
& pi
, int x
, int y
) const;
92 void metrics(MetricsInfo
& mi
, Dimension
& dim
) const;
93 /// identifies macro templates
94 MathMacroTemplate
* asMacroTemplate() { return this; }
95 /// identifies macro templates
96 MathMacroTemplate
const * asMacroTemplate() const { return this; }
98 InsetCode
lyxCode() const { return MATHMACRO_CODE
; }
100 void infoize(odocstream
& os
) const;
102 docstring
contextMenu(BufferView
const &, int, int) const;
105 virtual void doDispatch(Cursor
& cur
, FuncRequest
& cmd
);
106 /// do we want to handle this event?
107 bool getStatus(Cursor
& cur
, FuncRequest
const & cmd
,
108 FuncStatus
& status
) const;
111 friend class InsetLabelBox
;
112 friend class DisplayLabelBox
;
115 virtual Inset
* clone() const;
117 /// remove #n with from<=n<=to
118 void removeArguments(Cursor
& cur
, int from
, int to
);
119 /// shift every #n with from<=n, i.e. #n -> #(n-by)
120 void shiftArguments(size_t from
, int by
);
122 void insertParameter(Cursor
& cur
, int pos
, bool greedy
= false, bool addarg
= true);
124 void removeParameter(Cursor
& cur
, int pos
, bool greedy
= false);
126 void makeOptional(Cursor
& cur
);
128 void makeNonOptional(Cursor
& cur
);
130 idx_type
defIdx() const { return optionals_
+ 1; }
131 /// index of default value cell of optional parameter (#1 -> n=0)
132 idx_type
optIdx(idx_type n
) const { return n
+ 1; }
134 idx_type
displayIdx() const { return optionals_
+ 2; }
136 void updateLook() const;
137 /// look through the macro for #n arguments
138 int maxArgumentInDefinition() const;
139 /// add missing #n arguments up to \c maxArg
140 void insertMissingArguments(int maxArg
);
142 void changeArity(Cursor
& cur
, int newNumArg
);
143 /// find arguments in definition and adapt the arity accordingly
144 void commitEditChanges(Cursor
& cur
);
145 /// The representation of the macro template, with some holes to edit
146 mutable MathData look_
;
148 mutable int numargs_
;
150 mutable int argsInLook_
;
153 /// keeps the old optional default value when an
154 /// optional argument is disabled
155 std::vector
<MathData
> optionalValues_
;
157 /// (re)newcommand or def
158 mutable MacroType type_
;
159 /// defined before already?
160 mutable bool redefinition_
;
162 void createLook(int args
) const;
164 mutable bool lookOutdated_
;
165 /// true if in pre-calculations of metrics to get height of boxes
166 mutable bool premetrics_
;
168 mutable int labelBoxAscent_
;
170 mutable int labelBoxDescent_
;
172 bool premetrics() const { return premetrics_
; }
174 int commonLabelBoxAscent() const { return labelBoxAscent_
; }
176 int commonLabelBoxDescent() const { return labelBoxDescent_
; }