]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
restore comment about boost::shared_ptr and dtor.
[lyx.git] / src / Cursor.cpp
index 05dfc5b9d3c45d22a2612d2e9cd0197c66459574..656fc7417cf2d62b852869c85bb84a96c7915bf9 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"
@@ -986,6 +987,8 @@ void Cursor::plainInsert(MathAtom const & t)
 {
        cell().insert(pos(), t);
        ++pos();
+       inset().setBuffer(bv_->buffer());
+       inset().initView();
 }
 
 
@@ -1024,10 +1027,11 @@ void Cursor::insert(Inset * inset0)
        BOOST_ASSERT(inset0);
        if (inMathed())
                insert(MathAtom(inset0));
-       else
+       else {
                text()->insertInset(*this, inset0);
-       inset().setBuffer(bv_->buffer());
-       inset().validate();
+               inset0->setBuffer(bv_->buffer());
+               inset0->initView();
+       }
 }
 
 
@@ -1205,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());
@@ -1222,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;
 }
 
@@ -1523,7 +1554,7 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
                if (pit() + 1 >= int(text()->paragraphs().size()) &&
                                row + 1 >= int(pm.rows().size()))
                        return false;
-       }       
+       }
 
        // with and without selection are handled differently
        if (!selection()) {
@@ -1556,7 +1587,10 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
                                top().pos() = min(tm.x2pos(pit(), row - 1, xo), top().lastpos());
                        } else if (pit() > 0) {
                                --pit();
-                               ParagraphMetrics const & pmcur = bv_->parMetrics(text(), pit());
+                               TextMetrics & tm = bv_->textMetrics(text());
+                               if (!tm.contains(pit()))
+                                       tm.newParMetricsUp();
+                               ParagraphMetrics const & pmcur = tm.parMetrics(pit());
                                top().pos() = min(tm.x2pos(pit(), pmcur.rows().size() - 1, xo), top().lastpos());
                        }
                } else {
@@ -1564,6 +1598,9 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
                                top().pos() = min(tm.x2pos(pit(), row + 1, xo), top().lastpos());
                        } else if (pit() + 1 < int(text()->paragraphs().size())) {
                                ++pit();
+                               TextMetrics & tm = bv_->textMetrics(text());
+                               if (!tm.contains(pit()))
+                                       tm.newParMetricsDown();
                                top().pos() = min(tm.x2pos(pit(), 0, xo), top().lastpos());
                        }
                }
@@ -1781,7 +1818,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;
        }
        
@@ -1919,7 +1956,7 @@ void Cursor::recordUndoSelection()
 
 void Cursor::checkBufferStructure()
 {
-       if (paragraph().layout()->toclevel == Layout::NOT_IN_TOC)
+       if (paragraph().layout().toclevel == Layout::NOT_IN_TOC)
                return;
        Buffer const * master = buffer().masterBuffer();
        master->tocBackend().updateItem(ParConstIterator(*this));