X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_nestinset.C;h=d597bebeb069cd2242277bb6f57a426a7bf55824;hb=6a36d26356348d9e5f6ff63febe321d06c2e40ed;hp=136d9529c21eea440156d172cf9f50b37cce6f1a;hpb=66d2b93f7c7544b8c7069ed4803e9a092b0c88be;p=lyx.git diff --git a/src/mathed/math_nestinset.C b/src/mathed/math_nestinset.C index 136d9529c2..d597bebeb0 100644 --- a/src/mathed/math_nestinset.C +++ b/src/mathed/math_nestinset.C @@ -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; @@ -626,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: @@ -653,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(); @@ -861,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); @@ -871,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; @@ -1031,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) { @@ -1255,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 {