]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
Remove the rest of LFUN_THEOREM_INSERT.
[lyx.git] / src / Cursor.cpp
index 531b7bc0bf3e570b3f3bf4179520609b145beb9e..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());
@@ -362,6 +363,7 @@ void Cursor::pop()
 void Cursor::push(Inset & p)
 {
        push_back(CursorSlice(p));
+       p.setBuffer(bv_->buffer());
 }
 
 
@@ -985,6 +987,8 @@ void Cursor::plainInsert(MathAtom const & t)
 {
        cell().insert(pos(), t);
        ++pos();
+       inset().setBuffer(bv_->buffer());
+       inset().initView();
 }
 
 
@@ -1018,12 +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);
+               insert(MathAtom(inset0));
+       else {
+               text()->insertInset(*this, inset0);
+               inset0->setBuffer(bv_->buffer());
+               inset0->initView();
+       }
 }
 
 
@@ -1201,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());
@@ -1218,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;
 }
 
@@ -1625,7 +1660,6 @@ docstring Cursor::selectionAsString(bool label) const
                return docstring();
 
        if (inTexted()) {
-               Buffer const & buffer = bv().buffer();
                ParagraphList const & pars = text()->paragraphs();
 
                // should be const ...
@@ -1635,22 +1669,22 @@ docstring Cursor::selectionAsString(bool label) const
                size_t const endpos = selEnd().pos();
 
                if (startpit == endpit)
-                       return pars[startpit].asString(buffer, startpos, endpos, label);
+                       return pars[startpit].asString(startpos, endpos, label);
 
                // First paragraph in selection
                docstring result = pars[startpit].
-                       asString(buffer, startpos, pars[startpit].size(), label)
+                       asString(startpos, pars[startpit].size(), label)
                                 + parbreak(pars[startpit]);
 
                // The paragraphs in between (if any)
                for (pit_type pit = startpit + 1; pit != endpit; ++pit) {
                        Paragraph const & par = pars[pit];
-                       result += par.asString(buffer, 0, par.size(), label)
+                       result += par.asString(0, par.size(), label)
                                  + parbreak(pars[pit]);
                }
 
                // Last paragraph in selection
-               result += pars[endpit].asString(buffer, 0, endpos, label);
+               result += pars[endpit].asString(0, endpos, label);
 
                return result;
        }
@@ -1778,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;
        }
        
@@ -1826,7 +1860,7 @@ void Cursor::setCurrentFont()
        // get font
        BufferParams const & bufparams = buffer().params();
        current_font = par.getFontSettings(bufparams, cpos);
-       real_current_font = tm.getDisplayFont(cpit, cpos);
+       real_current_font = tm.displayFont(cpit, cpos);
 
        // special case for paragraph end
        if (cs.pos() == lastpos()