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?
|
// arity changed or other reason to detach?
|
||||||
if (oldDisplayMode == MathMacro::DISPLAY_NORMAL
|
if (oldDisplayMode == MathMacro::DISPLAY_NORMAL
|
||||||
&& (macroInset->arity() != macroNumArgs
|
&& (macroInset->arity() != macroNumArgs
|
||||||
|| macroInset->optionals() != macroOptionals
|
|| macroInset->optionals() != macroOptionals
|
||||||
|| newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) {
|
|| newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) {
|
||||||
|
|
||||||
detachMacroParameters(cur, i);
|
detachMacroParameters(cur, i);
|
||||||
}
|
}
|
||||||
@ -414,7 +414,7 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc)
|
|||||||
|
|
||||||
// Cursor in \label?
|
// Cursor in \label?
|
||||||
if (newDisplayMode != MathMacro::DISPLAY_UNFOLDED
|
if (newDisplayMode != MathMacro::DISPLAY_UNFOLDED
|
||||||
&& oldDisplayMode == MathMacro::DISPLAY_UNFOLDED) {
|
&& oldDisplayMode == MathMacro::DISPLAY_UNFOLDED) {
|
||||||
// put cursor in front of macro
|
// put cursor in front of macro
|
||||||
if (cur) {
|
if (cur) {
|
||||||
int macroSlice = cur->find(macroInset);
|
int macroSlice = cur->find(macroInset);
|
||||||
@ -424,17 +424,18 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// update the display mode
|
// update the display mode
|
||||||
|
size_t appetite = macroInset->appetite();
|
||||||
macroInset->setDisplayMode(newDisplayMode);
|
macroInset->setDisplayMode(newDisplayMode);
|
||||||
|
|
||||||
// arity changed?
|
// arity changed?
|
||||||
if (newDisplayMode == MathMacro::DISPLAY_NORMAL
|
if (newDisplayMode == MathMacro::DISPLAY_NORMAL
|
||||||
&& (macroInset->arity() != macroNumArgs
|
&& (macroInset->arity() != macroNumArgs
|
||||||
|| macroInset->optionals() != macroOptionals)) {
|
|| macroInset->optionals() != macroOptionals)) {
|
||||||
// is it a virgin macro which was never attached to parameters?
|
// is it a virgin macro which was never attached to parameters?
|
||||||
bool fromInitToNormalMode
|
bool fromInitToNormalMode
|
||||||
= (oldDisplayMode == MathMacro::DISPLAY_INIT
|
= (oldDisplayMode == MathMacro::DISPLAY_INIT
|
||||||
|| oldDisplayMode == MathMacro::DISPLAY_INTERACTIVE_INIT)
|
|| oldDisplayMode == MathMacro::DISPLAY_INTERACTIVE_INIT)
|
||||||
&& newDisplayMode == MathMacro::DISPLAY_NORMAL;
|
&& newDisplayMode == MathMacro::DISPLAY_NORMAL;
|
||||||
|
|
||||||
// if the macro was entered interactively (i.e. not by paste or during
|
// if the macro was entered interactively (i.e. not by paste or during
|
||||||
// loading), it should not be greedy, but the cursor should
|
// loading), it should not be greedy, but the cursor should
|
||||||
@ -443,7 +444,7 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc)
|
|||||||
|
|
||||||
// attach parameters
|
// attach parameters
|
||||||
attachMacroParameters(cur, i, macroNumArgs, macroOptionals,
|
attachMacroParameters(cur, i, macroNumArgs, macroOptionals,
|
||||||
fromInitToNormalMode, interactive);
|
fromInitToNormalMode, interactive, appetite);
|
||||||
|
|
||||||
if (cur) {
|
if (cur) {
|
||||||
// FIXME: proper anchor handling, this removes the selection
|
// 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,
|
void MathData::attachMacroParameters(Cursor * cur,
|
||||||
const size_type macroPos, const size_type macroNumArgs,
|
const size_type macroPos, const size_type macroNumArgs,
|
||||||
const int macroOptionals, const bool fromInitToNormalMode,
|
const int macroOptionals, const bool fromInitToNormalMode,
|
||||||
const bool interactiveInit)
|
const bool interactiveInit, const size_t appetite)
|
||||||
{
|
{
|
||||||
MathMacro * macroInset = operator[](macroPos).nucleus()->asMacro();
|
MathMacro * macroInset = operator[](macroPos).nucleus()->asMacro();
|
||||||
|
|
||||||
@ -615,9 +616,9 @@ void MathData::attachMacroParameters(Cursor * cur,
|
|||||||
if (!interactiveInit) {
|
if (!interactiveInit) {
|
||||||
collectOptionalParameters(cur, macroOptionals, detachedArgs, p,
|
collectOptionalParameters(cur, macroOptionals, detachedArgs, p,
|
||||||
scriptToPutAround, macroPos, thisPos, thisSlice);
|
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
|
// attach arguments back to macro inset
|
||||||
macroInset->attachArguments(detachedArgs, macroNumArgs, macroOptionals);
|
macroInset->attachArguments(detachedArgs, macroNumArgs, macroOptionals);
|
||||||
@ -743,10 +744,14 @@ void MathData::collectOptionalParameters(Cursor * cur,
|
|||||||
void MathData::collectParameters(Cursor * cur,
|
void MathData::collectParameters(Cursor * cur,
|
||||||
const size_type numParams, vector<MathData> & params,
|
const size_type numParams, vector<MathData> & params,
|
||||||
size_t & pos, MathAtom & scriptToPutAround,
|
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
|
// insert normal arguments
|
||||||
while (params.size() < numParams
|
while (params.size() < numParams
|
||||||
|
&& params.size() - startSize < appetite
|
||||||
&& pos < size()
|
&& pos < size()
|
||||||
&& !scriptToPutAround.nucleus()) {
|
&& !scriptToPutAround.nucleus()) {
|
||||||
MathAtom & cell = operator[](pos);
|
MathAtom & cell = operator[](pos);
|
||||||
|
@ -177,7 +177,8 @@ private:
|
|||||||
///
|
///
|
||||||
void attachMacroParameters(Cursor * cur, const size_type macroPos,
|
void attachMacroParameters(Cursor * cur, const size_type macroPos,
|
||||||
const size_type macroNumArgs, const int macroOptionals,
|
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,
|
void collectOptionalParameters(Cursor * cur,
|
||||||
const size_type numOptionalParams, std::vector<MathData> & params,
|
const size_type numOptionalParams, std::vector<MathData> & params,
|
||||||
@ -187,7 +188,8 @@ private:
|
|||||||
void collectParameters(Cursor * cur,
|
void collectParameters(Cursor * cur,
|
||||||
const size_type numParams, std::vector<MathData> & params,
|
const size_type numParams, std::vector<MathData> & params,
|
||||||
size_t & pos, MathAtom & scriptToPutAround,
|
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)
|
MathMacro::MathMacro(docstring const & name)
|
||||||
: InsetMathNest(0), name_(name), displayMode_(DISPLAY_INIT),
|
: InsetMathNest(0), name_(name), displayMode_(DISPLAY_INIT),
|
||||||
attachedArgsNum_(0), optionals_(0), nextFoldMode_(true),
|
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) {
|
if (displayMode_ != mode) {
|
||||||
// transfer name if changing from or to DISPLAY_UNFOLDED
|
// transfer name if changing from or to DISPLAY_UNFOLDED
|
||||||
@ -464,6 +464,12 @@ void MathMacro::setDisplayMode(MathMacro::DisplayMode mode)
|
|||||||
displayMode_ = mode;
|
displayMode_ = mode;
|
||||||
needsUpdate_ = true;
|
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,6 +118,8 @@ public:
|
|||||||
if (n <= int(nargs()))
|
if (n <= int(nargs()))
|
||||||
optionals_ = n;
|
optionals_ = n;
|
||||||
}
|
}
|
||||||
|
/// Return the maximal number of arguments the macro is greedy for.
|
||||||
|
size_t appetite() const { return appetite_; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class MathData;
|
friend class MathData;
|
||||||
@ -125,7 +127,7 @@ protected:
|
|||||||
friend class Cursor;
|
friend class Cursor;
|
||||||
|
|
||||||
/// update the display mode (should only be called after detaching arguments)
|
/// 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
|
/// compute the next display mode
|
||||||
DisplayMode computeDisplayMode() const;
|
DisplayMode computeDisplayMode() const;
|
||||||
/// update macro definition
|
/// update macro definition
|
||||||
@ -175,6 +177,8 @@ private:
|
|||||||
std::string requires_;
|
std::string requires_;
|
||||||
/// update macro representation
|
/// update macro representation
|
||||||
bool needsUpdate_;
|
bool needsUpdate_;
|
||||||
|
/// maximal number of arguments the macro is greedy for
|
||||||
|
size_t appetite_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
|
Loading…
Reference in New Issue
Block a user