]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
Remove the rest of LFUN_THEOREM_INSERT.
[lyx.git] / src / Cursor.cpp
index aa0a27ac1087e74d7c72f099b464d7fa69b7dbbb..397331f7a686c46fc21067ed47c965035a6b1fe4 100644 (file)
@@ -43,6 +43,7 @@
 #include "insets/InsetText.h"
 
 #include "mathed/InsetMath.h"
+#include "mathed/InsetMathBrace.h"
 #include "mathed/InsetMathScript.h"
 #include "mathed/MacroTable.h"
 #include "mathed/MathData.h"
@@ -300,7 +301,7 @@ void Cursor::dispatch(FuncRequest const & cmd0)
        
        // store some values to be used inside of the handlers
        beforeDispatchCursor_ = *this;
-       for (; depth(); pop()) {
+       for (; depth(); pop(), boundary(false)) {
                LYXERR(Debug::DEBUG, "Cursor::dispatch: cmd: "
                        << cmd0 << endl << *this);
                BOOST_ASSERT(pos() <= lastpos());
@@ -986,6 +987,8 @@ void Cursor::plainInsert(MathAtom const & t)
 {
        cell().insert(pos(), t);
        ++pos();
+       inset().setBuffer(bv_->buffer());
+       inset().initView();
 }
 
 
@@ -1019,13 +1022,16 @@ void Cursor::insert(MathAtom const & t)
 }
 
 
-void Cursor::insert(Inset * inset)
+void Cursor::insert(Inset * inset0)
 {
+       BOOST_ASSERT(inset0);
        if (inMathed())
-               insert(MathAtom(inset));
-       else
-               text()->insertInset(*this, inset);
-       inset->setBuffer(bv_->buffer());
+               insert(MathAtom(inset0));
+       else {
+               text()->insertInset(*this, inset0);
+               inset0->setBuffer(bv_->buffer());
+               inset0->initView();
+       }
 }
 
 
@@ -1203,6 +1209,8 @@ bool Cursor::macroModeClose()
                return false;
        InsetMathUnknown * p = activeMacro();
        p->finalize();
+       MathData selection;
+       asArray(p->selection(), selection);
        docstring const s = p->name();
        --pos();
        cell().erase(pos());
@@ -1220,12 +1228,37 @@ bool Cursor::macroModeClose()
        if (in && in->interpretString(*this, s))
                return true;
        MathAtom atom = createInsetMath(name);
+
+       // try to put argument into macro, if we just inserted a macro
+       bool macroArg = false;
        MathMacro * atomAsMacro = atom.nucleus()->asMacro();
        if (atomAsMacro) {
-               // make non-greedy, i.e. don't eat parameters from the right
-               atomAsMacro->setDisplayMode(MathMacro::DISPLAY_INTERACTIVE_INIT);
+               // macros here are still unfolded (in init mode in fact). So
+               // we have to resolve the macro here manually and check its arity
+               // to put the selection behind it if arity > 0.
+               MacroData const * data = buffer().getMacro(atomAsMacro->name());
+               if (selection.size() > 0 && data && data->numargs() - data->optionals() > 0) {
+                       macroArg = true;
+                       atomAsMacro->setDisplayMode(MathMacro::DISPLAY_INTERACTIVE_INIT, 1);
+               } else
+                       // non-greedy case. Do not touch the arguments behind
+                       atomAsMacro->setDisplayMode(MathMacro::DISPLAY_INTERACTIVE_INIT, 0);
        }
+
+       // insert remembered selection into first argument of a non-macro
+       else if (atom.nucleus()->nargs() > 0)
+               atom.nucleus()->cell(0).append(selection);
+       
        plainInsert(atom);
+
+       // finally put the macro argument behind, if needed
+       if (macroArg) {
+               if (selection.size() > 1)
+                       plainInsert(MathAtom(new InsetMathBrace(selection)));
+               else
+                       insert(selection);
+       }
+       
        return true;
 }
 
@@ -1779,7 +1812,7 @@ bool notifyCursorLeaves(Cursor const & old, Cursor & cur)
            && !cur.buffer().isClean()
            && cur.inTexted() && old.inTexted()
            && cur.pit() != old.pit()) {
-               old.paragraph().updateWords(old.buffer(), old.top());
+               old.paragraph().updateWords(old.top());
                return false;
        }