* 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:
Stefan Schimanski 2008-03-04 14:49:03 +00:00
parent a84ae5899d
commit 501763cafa
4 changed files with 37 additions and 20 deletions

View File

@ -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);

View File

@ -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);
};
///

View File

@ -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);
}

View File

@ -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:
///