]> git.lyx.org Git - lyx.git/commitdiff
* add appetite concept to the math macro to restrict the number of parameter which...
authorStefan Schimanski <sts@lyx.org>
Tue, 4 Mar 2008 14:49:03 +0000 (14:49 +0000)
committerStefan Schimanski <sts@lyx.org>
Tue, 4 Mar 2008 14:49:03 +0000 (14:49 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23448 a592a061-630c-0410-9148-cb99ea01b6c8

src/mathed/MathData.cpp
src/mathed/MathData.h
src/mathed/MathMacro.cpp
src/mathed/MathMacro.h

index 75562ba87dc39f8257ad0b0660d2fe57087e95a0..e4a8f49e08eed3db718098a2a6c9586b21f7a638 100644 (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);
index 56da42ca38456831c7f79a9096ff3bb243750c4a..a57d674dbb46ba2a914032cfe576ee328345a450 100644 (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);
 };
 
 ///
index 96e75ae414178279a2fdbf0ffc2b8dce5f98d18c..37c393e01014de2f76573dce245b8158efccd9eb 100644 (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);
 }
 
 
index dae4d8099c08edb028efcc2fd177278d8b60c210..f78aee1ba71c02a8ce38dfa4fa153bbdce3fcfcd 100644 (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:
        ///