X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathNest.cpp;h=5bcab87f0fa40b9b884471237993d2a5aa469b82;hb=c9609fe56a2deb40f001503c2fd707c990a2e0e2;hp=860d265e53c205cf6d21b2827d15889957292d9c;hpb=1fa39e1f953434700f1af4fb2eb9b193dd1709df;p=lyx.git diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index 860d265e53..5bcab87f0f 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -139,7 +139,7 @@ void InsetMathNest::cursorPos(BufferView const & bv, // to touch all (math)inset's draw() methods. Right now, we'll store // absolute value, and make them here relative, only to make them // absolute again when actually drawing the cursor. What a mess. - LASSERT(&sl.inset() == this, /**/); + LASSERT(&sl.inset() == this, return); MathData const & ar = sl.cell(); CoordCache const & coord_cache = bv.coordCache(); if (!coord_cache.getArrays().has(&ar)) { @@ -192,7 +192,7 @@ void InsetMathNest::updateBuffer(ParIterator const & it, UpdateType utype) bool InsetMathNest::idxNext(Cursor & cur) const { - LASSERT(&cur.inset() == this, /**/); + LASSERT(&cur.inset() == this, return false); if (cur.idx() == cur.lastidx()) return false; ++cur.idx(); @@ -209,7 +209,7 @@ bool InsetMathNest::idxForward(Cursor & cur) const bool InsetMathNest::idxPrev(Cursor & cur) const { - LASSERT(&cur.inset() == this, /**/); + LASSERT(&cur.inset() == this, return false); if (cur.idx() == 0) return false; --cur.idx(); @@ -226,7 +226,7 @@ bool InsetMathNest::idxBackward(Cursor & cur) const bool InsetMathNest::idxFirst(Cursor & cur) const { - LASSERT(&cur.inset() == this, /**/); + LASSERT(&cur.inset() == this, return false); if (nargs() == 0) return false; cur.idx() = 0; @@ -237,7 +237,7 @@ bool InsetMathNest::idxFirst(Cursor & cur) const bool InsetMathNest::idxLast(Cursor & cur) const { - LASSERT(&cur.inset() == this, /**/); + LASSERT(&cur.inset() == this, return false); if (nargs() == 0) return false; cur.idx() = cur.lastidx(); @@ -402,6 +402,8 @@ void InsetMathNest::latex(otexstream & os, OutputParams const & runparams) const runparams.encoding); wi.canBreakLine(os.canBreakLine()); write(wi); + // Reset parbreak status after a math inset. + os.lastChar(0); os.canBreakLine(wi.canBreakLine()); int lf = wi.line(); @@ -576,7 +578,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) replaceSelection(cur); docstring topaste; if (cmd.argument().empty() && !theClipboard().isInternal()) - topaste = theClipboard().getAsText(); + topaste = theClipboard().getAsText(Clipboard::PlainTextType); else { size_t n = 0; idocstringstream is(cmd.argument()); @@ -706,6 +708,10 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) act == LFUN_UP_SELECT; cur.selHandle(select); + // handle autocorrect: + cur.autocorrect() = false; + cur.message(_("Autocorrect Off ('!' to enter)")); + // go up/down bool up = act == LFUN_UP || act == LFUN_UP_SELECT; bool successful = cur.upDownInMath(up); @@ -729,8 +735,9 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) cur.idx() = 0; cur.resetAnchor(); cur.setSelection(true); - cur.pos() = cur.lastpos(); cur.idx() = cur.lastidx(); + cur.pos() = cur.lastpos(); + cur.bv().cursor() = cur; break; case LFUN_PARAGRAPH_UP: @@ -806,7 +813,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) if (cur.pos() == 0) // May affect external cell: cur.recordUndoInset(); - else + else if (!cur.inMacroMode()) cur.recordUndoSelection(); // if the inset can not be removed from within, delete it if (!cur.backspace()) { @@ -848,14 +855,10 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_SELF_INSERT: if (cmd.argument().size() != 1) { - // use a group because interpretString() might - // record an extra undo step - cur.beginUndoGroup(); cur.recordUndoSelection(); docstring const arg = cmd.argument(); if (!interpretString(cur, arg)) cur.insert(arg); - cur.endUndoGroup(); break; } // Don't record undo steps if we are in macro mode and thus @@ -1003,7 +1006,6 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) cur.macroModeClose(); docstring const save_selection = grabAndEraseSelection(cur); selClearOrDel(cur); - //cur.plainInsert(MathAtom(new InsetMathMBox(cur.bv()))); if (currentMode() <= Inset::TEXT_MODE) cur.plainInsert(MathAtom(new InsetMathEnsureMath(buffer_))); else @@ -1079,13 +1081,19 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) cur.recordUndo(); unsigned int m = 1; unsigned int n = 1; - docstring name; + docstring name = from_ascii("matrix"); idocstringstream is(cmd.argument()); is >> m >> n >> name; if (m < 1) m = 1; if (n < 1) n = 1; + // check if we have a valid decoration + if (name != "pmatrix" && name != "bmatrix" + && name != "Bmatrix" && name != "vmatrix" + && name != "Vmatrix" && name != "matrix") + name = from_ascii("matrix"); + cur.niceInsert( MathAtom(new InsetMathAMSArray(buffer_, name, m, n))); break; @@ -1445,6 +1453,10 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd, flag.setEnabled(false); break; + case LFUN_CAPTION_INSERT: + flag.setEnabled(false); + break; + case LFUN_SPACE_INSERT: { docstring const & name = cmd.argument(); if (name == "visible") @@ -1456,6 +1468,13 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd, flag.setEnabled(!asHullInset()); break; + case LFUN_PASTE: { + docstring const & name = cmd.argument(); + if (name == "html" || name == "latex") + flag.setEnabled(false); + break; + } + default: ret = false; break; @@ -1549,16 +1568,29 @@ void InsetMathNest::lfunMousePress(Cursor & cur, FuncRequest & cmd) void InsetMathNest::lfunMouseMotion(Cursor & cur, FuncRequest & cmd) { // only select with button 1 - if (cmd.button() == mouse_button::button1) { - Cursor & bvcur = cur.bv().cursor(); - if (bvcur.realAnchor().hasPart(cur)) { - //lyxerr << "## lfunMouseMotion: cursor: " << cur << endl; - bvcur.setCursor(cur); - bvcur.setSelection(true); - //lyxerr << "MOTION " << bvcur << endl; - } else - cur.undispatched(); + if (cmd.button() != mouse_button::button1) + return; + + Cursor & bvcur = cur.bv().cursor(); + + // ignore motions deeper nested than the real anchor + if (!bvcur.realAnchor().hasPart(cur)) { + cur.undispatched(); + return; } + + CursorSlice old = bvcur.top(); + + // We continue with our existing selection or start a new one, so don't + // reset the anchor. + bvcur.setCursor(cur); + // Did we actually move? + if (cur.top() == old) + // We didn't move one iota, so no need to change selection status + // or update the screen. + cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor); + else + bvcur.setSelection(); } @@ -1632,7 +1664,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) cur.backspace(); cur.niceInsert(MathAtom(new InsetMathComment(buf))); } else if (c == '#') { - LASSERT(cur.activeMacro(), /**/); + LASSERT(cur.activeMacro(), return false); cur.activeMacro()->setName(name + docstring(1, c)); } else { cur.backspace(); @@ -1667,10 +1699,15 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) cur.cell().erase(cur.pos()); cur.plainInsert(MathAtom( new InsetMathBig(name.substr(1), delim))); - // end undo group that was opened before p was created - cur.endUndoGroup(); return true; } + } else if (name == "\\smash" && c == '[') { + // We can't use cur.macroModeClose() because + // it would create an InsetMathPhantom + InsetMathUnknown * p = cur.activeMacro(); + p->finalize(); + interpretChar(cur, c); + return true; } // leave macro mode and try again if necessary @@ -1711,13 +1748,11 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) //lyxerr << "starting with macro" << endl; bool reduced = cap::reduceSelectionToOneCell(cur); if (reduced || !cur.selection()) { + cur.recordUndoInset(); docstring const safe = cap::grabAndEraseSelection(cur); - if (!cur.inRegexped()) { - // open a group because interpretString() might - // record an extra undo step when finalizing - cur.beginUndoGroup(); + if (!cur.inRegexped()) cur.insert(MathAtom(new InsetMathUnknown(from_ascii("\\"), safe, false))); - } else + else cur.niceInsert(createInsetMath("backslash", buf)); } return true; @@ -1737,7 +1772,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) // but suppress direct insertion of two spaces in a row // the still allows typing 'a' and deleting the 'a', but // it is better than nothing... - if (!cur.pos() != 0 || cur.prevAtom()->getChar() != ' ') { + if (cur.pos() == 0 || cur.prevAtom()->getChar() != ' ') { cur.insert(c); // FIXME: we have to enable full redraw here because of the // visual box corners that define the inset. If we know for @@ -2072,7 +2107,7 @@ MathCompletionList::MathCompletionList(Cursor const & cur) } sort(locals.begin(), locals.end()); - if (globals.size() > 0) + if (!globals.empty()) return; // fill in global macros @@ -2091,8 +2126,21 @@ MathCompletionList::MathCompletionList(Cursor const & cur) globals.push_back(from_ascii("\\framebox")); globals.push_back(from_ascii("\\makebox")); globals.push_back(from_ascii("\\kern")); + globals.push_back(from_ascii("\\xhookrightarrow")); + globals.push_back(from_ascii("\\xhookleftarrow")); globals.push_back(from_ascii("\\xrightarrow")); + globals.push_back(from_ascii("\\xRightarrow")); + globals.push_back(from_ascii("\\xrightharpoondown")); + globals.push_back(from_ascii("\\xrightharpoonup")); + globals.push_back(from_ascii("\\xrightleftharpoons")); globals.push_back(from_ascii("\\xleftarrow")); + globals.push_back(from_ascii("\\xLeftarrow")); + globals.push_back(from_ascii("\\xleftharpoondown")); + globals.push_back(from_ascii("\\xleftharpoonup")); + globals.push_back(from_ascii("\\xleftrightarrow")); + globals.push_back(from_ascii("\\xLeftrightarrow")); + globals.push_back(from_ascii("\\xleftrightharpoons")); + globals.push_back(from_ascii("\\xmapsto")); globals.push_back(from_ascii("\\split")); globals.push_back(from_ascii("\\gathered")); globals.push_back(from_ascii("\\aligned")); @@ -2107,6 +2155,7 @@ MathCompletionList::MathCompletionList(Cursor const & cur) globals.push_back(from_ascii("\\root")); globals.push_back(from_ascii("\\tabular")); globals.push_back(from_ascii("\\stackrel")); + globals.push_back(from_ascii("\\stackrelthree")); globals.push_back(from_ascii("\\binom")); globals.push_back(from_ascii("\\choose")); globals.push_back(from_ascii("\\brace"));