mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-23 10:18:50 +00:00
* add appetite concept to the math macro to restrict the number of parameter which are eaten greedily.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23448 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
a84ae5899d
commit
501763cafa
@ -402,9 +402,9 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc)
|
||||
|
||||
// arity changed or other reason to detach?
|
||||
if (oldDisplayMode == MathMacro::DISPLAY_NORMAL
|
||||
&& (macroInset->arity() != macroNumArgs
|
||||
|| macroInset->optionals() != macroOptionals
|
||||
|| newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) {
|
||||
&& (macroInset->arity() != macroNumArgs
|
||||
|| macroInset->optionals() != macroOptionals
|
||||
|| newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) {
|
||||
|
||||
detachMacroParameters(cur, i);
|
||||
}
|
||||
@ -414,7 +414,7 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc)
|
||||
|
||||
// Cursor in \label?
|
||||
if (newDisplayMode != MathMacro::DISPLAY_UNFOLDED
|
||||
&& oldDisplayMode == MathMacro::DISPLAY_UNFOLDED) {
|
||||
&& oldDisplayMode == MathMacro::DISPLAY_UNFOLDED) {
|
||||
// put cursor in front of macro
|
||||
if (cur) {
|
||||
int macroSlice = cur->find(macroInset);
|
||||
@ -424,17 +424,18 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc)
|
||||
}
|
||||
|
||||
// update the display mode
|
||||
size_t appetite = macroInset->appetite();
|
||||
macroInset->setDisplayMode(newDisplayMode);
|
||||
|
||||
// arity changed?
|
||||
if (newDisplayMode == MathMacro::DISPLAY_NORMAL
|
||||
&& (macroInset->arity() != macroNumArgs
|
||||
|| macroInset->optionals() != macroOptionals)) {
|
||||
&& (macroInset->arity() != macroNumArgs
|
||||
|| macroInset->optionals() != macroOptionals)) {
|
||||
// is it a virgin macro which was never attached to parameters?
|
||||
bool fromInitToNormalMode
|
||||
= (oldDisplayMode == MathMacro::DISPLAY_INIT
|
||||
|| oldDisplayMode == MathMacro::DISPLAY_INTERACTIVE_INIT)
|
||||
&& newDisplayMode == MathMacro::DISPLAY_NORMAL;
|
||||
|| oldDisplayMode == MathMacro::DISPLAY_INTERACTIVE_INIT)
|
||||
&& newDisplayMode == MathMacro::DISPLAY_NORMAL;
|
||||
|
||||
// if the macro was entered interactively (i.e. not by paste or during
|
||||
// loading), it should not be greedy, but the cursor should
|
||||
@ -443,7 +444,7 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc)
|
||||
|
||||
// attach parameters
|
||||
attachMacroParameters(cur, i, macroNumArgs, macroOptionals,
|
||||
fromInitToNormalMode, interactive);
|
||||
fromInitToNormalMode, interactive, appetite);
|
||||
|
||||
if (cur) {
|
||||
// FIXME: proper anchor handling, this removes the selection
|
||||
@ -593,7 +594,7 @@ void MathData::detachMacroParameters(Cursor * cur, const size_type macroPos)
|
||||
void MathData::attachMacroParameters(Cursor * cur,
|
||||
const size_type macroPos, const size_type macroNumArgs,
|
||||
const int macroOptionals, const bool fromInitToNormalMode,
|
||||
const bool interactiveInit)
|
||||
const bool interactiveInit, const size_t appetite)
|
||||
{
|
||||
MathMacro * macroInset = operator[](macroPos).nucleus()->asMacro();
|
||||
|
||||
@ -615,9 +616,9 @@ void MathData::attachMacroParameters(Cursor * cur,
|
||||
if (!interactiveInit) {
|
||||
collectOptionalParameters(cur, macroOptionals, detachedArgs, p,
|
||||
scriptToPutAround, macroPos, thisPos, thisSlice);
|
||||
collectParameters(cur, macroNumArgs, detachedArgs, p,
|
||||
scriptToPutAround, macroPos, thisPos, thisSlice);
|
||||
}
|
||||
collectParameters(cur, macroNumArgs, detachedArgs, p,
|
||||
scriptToPutAround, macroPos, thisPos, thisSlice, appetite);
|
||||
|
||||
// attach arguments back to macro inset
|
||||
macroInset->attachArguments(detachedArgs, macroNumArgs, macroOptionals);
|
||||
@ -743,10 +744,14 @@ void MathData::collectOptionalParameters(Cursor * cur,
|
||||
void MathData::collectParameters(Cursor * cur,
|
||||
const size_type numParams, vector<MathData> & params,
|
||||
size_t & pos, MathAtom & scriptToPutAround,
|
||||
const pos_type macroPos, const int thisPos, const int thisSlice)
|
||||
const pos_type macroPos, const int thisPos, const int thisSlice,
|
||||
const size_t appetite)
|
||||
{
|
||||
size_t startSize = params.size();
|
||||
|
||||
// insert normal arguments
|
||||
while (params.size() < numParams
|
||||
&& params.size() - startSize < appetite
|
||||
&& pos < size()
|
||||
&& !scriptToPutAround.nucleus()) {
|
||||
MathAtom & cell = operator[](pos);
|
||||
|
@ -177,7 +177,8 @@ private:
|
||||
///
|
||||
void attachMacroParameters(Cursor * cur, const size_type macroPos,
|
||||
const size_type macroNumArgs, const int macroOptionals,
|
||||
const bool fromInitToNormalMode, const bool interactiveInit);
|
||||
const bool fromInitToNormalMode, const bool interactiveInit,
|
||||
const size_t appetite);
|
||||
///
|
||||
void collectOptionalParameters(Cursor * cur,
|
||||
const size_type numOptionalParams, std::vector<MathData> & params,
|
||||
@ -187,7 +188,8 @@ private:
|
||||
void collectParameters(Cursor * cur,
|
||||
const size_type numParams, std::vector<MathData> & params,
|
||||
size_t & pos, MathAtom & scriptToPutAround,
|
||||
const pos_type macroPos, const int thisPos, const int thisSlice);
|
||||
const pos_type macroPos, const int thisPos, const int thisSlice,
|
||||
const size_t appetite);
|
||||
};
|
||||
|
||||
///
|
||||
|
@ -114,7 +114,7 @@ private:
|
||||
MathMacro::MathMacro(docstring const & name)
|
||||
: InsetMathNest(0), name_(name), displayMode_(DISPLAY_INIT),
|
||||
attachedArgsNum_(0), optionals_(0), nextFoldMode_(true),
|
||||
macro_(0), needsUpdate_(false)
|
||||
macro_(0), needsUpdate_(false), appetite_(9)
|
||||
{}
|
||||
|
||||
|
||||
@ -449,7 +449,7 @@ void MathMacro::drawSelection(PainterInfo & pi, int x, int y) const
|
||||
}
|
||||
|
||||
|
||||
void MathMacro::setDisplayMode(MathMacro::DisplayMode mode)
|
||||
void MathMacro::setDisplayMode(MathMacro::DisplayMode mode, int appetite)
|
||||
{
|
||||
if (displayMode_ != mode) {
|
||||
// transfer name if changing from or to DISPLAY_UNFOLDED
|
||||
@ -464,6 +464,12 @@ void MathMacro::setDisplayMode(MathMacro::DisplayMode mode)
|
||||
displayMode_ = mode;
|
||||
needsUpdate_ = true;
|
||||
}
|
||||
|
||||
// the interactive init mode is non-greedy by default
|
||||
if (appetite == -1)
|
||||
appetite_ = (mode == DISPLAY_INTERACTIVE_INIT) ? 0 : 9;
|
||||
else
|
||||
appetite_ = size_t(appetite);
|
||||
}
|
||||
|
||||
|
||||
|
@ -118,14 +118,16 @@ public:
|
||||
if (n <= int(nargs()))
|
||||
optionals_ = n;
|
||||
}
|
||||
|
||||
/// Return the maximal number of arguments the macro is greedy for.
|
||||
size_t appetite() const { return appetite_; }
|
||||
|
||||
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);
|
||||
void setDisplayMode(DisplayMode mode, int appetite = -1);
|
||||
/// compute the next display mode
|
||||
DisplayMode computeDisplayMode() const;
|
||||
/// update macro definition
|
||||
@ -142,7 +144,7 @@ protected:
|
||||
MacroData const * macro() { return macro_; }
|
||||
///
|
||||
bool editMetrics(BufferView const * bv) const;
|
||||
|
||||
|
||||
private:
|
||||
///
|
||||
virtual Inset * clone() const;
|
||||
@ -175,6 +177,8 @@ private:
|
||||
std::string requires_;
|
||||
/// update macro representation
|
||||
bool needsUpdate_;
|
||||
/// maximal number of arguments the macro is greedy for
|
||||
size_t appetite_;
|
||||
|
||||
public:
|
||||
///
|
||||
|
Loading…
Reference in New Issue
Block a user