]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_nestinset.C
Get raising/lowering into super/subscripts of selection working (1.3
[lyx.git] / src / mathed / math_nestinset.C
index e5b88bab5e2b61266bb6a5b412391100277d32cb..3d54c3f35b9f77f7021e34e2b1b8647cd9959bc8 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: "
@@ -708,6 +712,7 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                        // do superscript if LyX handles
                        // deadkeys
                        recordUndo(cur, Undo::ATOMIC);
+                       safe_ = grabAndEraseSelection(cur);
                        script(cur, true);
                }
                break;
@@ -879,16 +884,8 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
 // math-insert only handles special math things like "matrix".
        case LFUN_INSERT_MATH: {
                recordUndo(cur, Undo::ATOMIC);
-               MathArray ar;
-               asArray(cmd.argument, ar);
-               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);
+               if (cmd.argument == "^" || cmd.argument == "_") {
+                       interpret(cur, cmd.argument[0]);
                } else
                        cur.niceInsert(cmd.argument);
                break;
@@ -1096,6 +1093,9 @@ void MathNestInset::lfunMouseRelease(LCursor & cur, FuncRequest & cmd)
 bool MathNestInset::interpret(LCursor & cur, char c)
 {
        //lyxerr << "interpret 2: '" << c << "'" << endl;
+       if (c == '^' || c == '_')
+               safe_ = grabAndEraseSelection(cur);
+
        cur.clearTargetX();
 
        // handle macroMode
@@ -1248,7 +1248,6 @@ bool MathNestInset::script(LCursor & cur, bool up)
        }
 
        cur.macroModeClose();
-       string safe = grabAndEraseSelection(cur);
        if (asScriptInset() && cur.idx() == 0) {
                // we are in a nucleus of a script inset, move to _our_ script
                MathScriptInset * inset = asScriptInset();
@@ -1279,9 +1278,9 @@ bool MathNestInset::script(LCursor & cur, bool up)
                cur.idx() = 1;
                cur.pos() = 0;
        }
-       //lyxerr << "pasting 1: safe:\n" << safe << endl;
-       cur.paste(safe);
+       //lyxerr << "inserting 1: safe:\n" << safe_ << endl;
+       cur.niceInsert(safe_);
        cur.resetAnchor();
-       //lyxerr << "pasting 2: safe:\n" << safe << endl;
+       //lyxerr << "inserting 2: safe:\n" << safe_ << endl;
        return true;
 }