]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_nestinset.C
Fix to bug 2362: Deleting superscript also deletes subscript.
[lyx.git] / src / mathed / math_nestinset.C
index 45935465a0e09a377efbb59736da8312878134c0..0732cd20a1499da363655056a28a09263ceb8328 100644 (file)
@@ -51,6 +51,7 @@
 #include "frontends/Dialogs.h"
 #include "frontends/LyXView.h"
 #include "frontends/Painter.h"
+#include "frontends/nullpainter.h"
 
 #include <sstream>
 
@@ -219,9 +220,6 @@ void MathNestInset::draw(PainterInfo & pi, int x, int y) const
 
 void MathNestInset::drawSelection(PainterInfo & pi, int x, int y) const
 {
-       // FIXME: hack to get position cache warm
-       draw(pi, x, y);
-
        // this should use the x/y values given, not the cached values
        LCursor & cur = pi.base.bv->cursor();
        if (!cur.selection())
@@ -229,6 +227,12 @@ void MathNestInset::drawSelection(PainterInfo & pi, int x, int y) const
        if (!ptr_cmp(&cur.inset(), this))
                return;
 
+       // FIXME: hack to get position cache warm
+       static NullPainter nop;
+       PainterInfo pinop(pi);
+       pinop.pain = nop;
+       draw(pinop, x, y);
+
        CursorSlice s1 = cur.selBegin();
        CursorSlice s2 = cur.selEnd();
        //lyxerr << "MathNestInset::drawing selection: "
@@ -340,7 +344,7 @@ int MathNestInset::latex(Buffer const &, std::ostream & os,
 }
 
 
-void MathNestInset::notifyCursorLeaves(LCursor & /*cur*/)
+void MathNestInset::notifyCursorLeaves(LCursor & cur)
 {
 #ifdef WITH_WARNINGS
 #warning look here
@@ -669,7 +673,19 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                // undoes the complete macro, not only the last character.
                if (!cur.inMacroMode())
                        recordUndo(cur);
-               if (!interpret(cur, cmd.argument[0])) {
+
+               // spacial handling of space. If we insert an inset
+               // via macro mode, we want to put the cursor inside it
+               // if relevant. Think typing "\frac<space>".
+               if (cmd.argument[0] == ' ' 
+                   && cur.inMacroMode() && cur.macroName() != "\\"
+                   && cur.macroModeClose()) {
+                       MathAtom const atom = cur.prevAtom();
+                       if (atom->asNestInset() && atom->nargs() > 0) {
+                               cur.posLeft();
+                               cur.pushLeft(*cur.nextInset());
+                       }
+               } else if (!interpret(cur, cmd.argument[0])) {
                        cmd = FuncRequest(LFUN_FINISHED_RIGHT);
                        cur.undispatched();
                }
@@ -872,13 +888,7 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                int cell(0);
                if (cmd.argument == "\\root")
                        cell = 1;
-               // math macros are nest insets and may have 0 cells.
-               // handleNest would crash in this case.
-               if (ar.size() == 1 && (ar[0].nucleus()->asNestInset()) &&
-                   ar[0].nucleus()->nargs() > MathInset::idx_type(cell)) {
-                       cur.handleNest(ar[0], cell);
-               } else
-                       cur.niceInsert(cmd.argument);
+               cur.niceInsert(cmd.argument);
                break;
                }
 
@@ -1248,6 +1258,7 @@ bool MathNestInset::script(LCursor & cur, bool up)
                --cur.pos();
                MathScriptInset * inset = cur.nextAtom().nucleus()->asScriptInset();
                cur.push(*inset);
+               inset->ensure(up);
                cur.idx() = inset->idxOfScript(up);
                cur.pos() = cur.lastpos();
        } else {