]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_nestinset.C
fix bug 2139 (creation of two consecutives, but different script insets)
[lyx.git] / src / mathed / math_nestinset.C
index 3f1e5a808ca07030152b68130ecfab8ae79751cc..d597bebeb069cd2242277bb6f57a426a7bf55824 100644 (file)
@@ -30,6 +30,7 @@
 #include "math_symbolinset.h"
 #include "math_support.h"
 #include "math_unknowninset.h"
+#include "ref_inset.h"
 
 #include "BufferView.h"
 #include "CutAndPaste.h"
@@ -56,7 +57,6 @@
 using lyx::cap::copySelection;
 using lyx::cap::grabAndEraseSelection;
 using lyx::cap::cutSelection;
-using lyx::cap::pasteSelection;
 using lyx::cap::replaceSelection;
 using lyx::cap::selClearOrDel;
 
@@ -415,7 +415,8 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                size_t n = 0;
                istringstream is(cmd.argument);
                is >> n;
-               pasteSelection(cur, n);
+               string const selection = lyx::cap::getSelection(cur.buffer(), n);
+               cur.niceInsert(selection);
                cur.clearSelection(); // bug 393
                cur.bv().switchKeyMap();
                finishUndo();
@@ -427,6 +428,7 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                cutSelection(cur, true, true);
                cur.message(_("Cut"));
                // Prevent stale position >= size crash
+               // Probably not necessary anymore, see eraseSelection (gb 2005-10-09)
                cur.normalize();
                break;
 
@@ -614,7 +616,11 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
 
        case LFUN_DELETE_WORD_BACKWARD:
        case LFUN_BACKSPACE:
-               recordUndo(cur, Undo::ATOMIC);
+               if (cur.pos() == 0)
+                       // delete whole cell
+                       recordUndoInset(cur, Undo::ATOMIC);
+               else
+                       recordUndo(cur, Undo::ATOMIC);
                cur.backspace();
                break;
 
@@ -622,8 +628,6 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_DELETE:
                recordUndo(cur);
                cur.erase();
-               cmd = FuncRequest(LFUN_FINISHED_LEFT);
-               cur.undispatched();
                break;
 
        case LFUN_ESCAPE:
@@ -649,11 +653,22 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                break;
 
        case LFUN_SELFINSERT:
-               recordUndo(cur);
                if (cmd.argument.size() != 1) {
+                       recordUndo(cur);
                        cur.insert(cmd.argument);
                        break;
                }
+               // Don't record undo steps if we are in macro mode and
+               // cmd.argument is the next character of the macro name.
+               // Otherwise we'll get an invalid cursor if we undo after
+               // the macro was finished and the macro is a known command,
+               // e.g. sqrt. LCursor::macroModeClose replaces in this case
+               // the MathUnknownInset with name "frac" by an empty
+               // MathFracInset -> a pos value > 0 is invalid.
+               // A side effect is that an undo before the macro is finished
+               // undoes the complete macro, not only the last character.
+               if (!cur.inMacroMode())
+                       recordUndo(cur);
                if (!interpret(cur, cmd.argument[0])) {
                        cmd = FuncRequest(LFUN_FINISHED_RIGHT);
                        cur.undispatched();
@@ -857,7 +872,10 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                int cell(0);
                if (cmd.argument == "\\root")
                        cell = 1;
-               if (ar.size() == 1 && (ar[0].nucleus()->asNestInset())) {
+               // 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);
@@ -867,34 +885,14 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_DIALOG_SHOW_NEW_INSET: {
                string const & name = cmd.argument;
                string data;
-#if 0
                if (name == "ref") {
                        RefInset tmp(name);
                        data = tmp.createDialogStr(name);
                }
-#endif
                cur.bv().owner()->getDialogs().show(name, data, 0);
                break;
        }
 
-       case LFUN_INSET_APPLY: {
-               string const name = cmd.getArg(0);
-               InsetBase * base = cur.bv().owner()->getDialogs().getOpenInset(name);
-
-               if (base) {
-                       FuncRequest fr(LFUN_INSET_MODIFY, cmd.argument);
-                       base->dispatch(cur, fr);
-                       break;
-               }
-               MathArray ar;
-               if (createMathInset_fromDialogStr(cmd.argument, ar)) {
-                       cur.insert(ar);
-                       break;
-               }
-               cur.undispatched();
-               break;
-       }
-
        default:
                MathDimInset::doDispatch(cur, cmd);
                break;
@@ -1027,8 +1025,7 @@ void MathNestInset::lfunMousePress(LCursor & cur, FuncRequest & cmd)
        //lyxerr << "## lfunMousePress: buttons: " << cmd.button() << endl;
        if (cmd.button() == mouse_button::button1) {
                //lyxerr << "## lfunMousePress: setting cursor to: " << cur << endl;
-               cur.resetAnchor();
-               cur.bv().cursor() = cur;
+               cur.bv().mouseSetCursor(cur);
        }
 
        if (cmd.button() == mouse_button::button2) {
@@ -1251,6 +1248,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 {