X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathNest.cpp;h=179d7775f32015e04c08f234a806957d10fb669b;hb=d48e5330bee3218336fb443d726b625c84eacf10;hp=829bbc0a52188b8f4c4bf5caae43bc917eef725f;hpb=11e0d941a25a6e35427b561edb3c71934fac6d0a;p=lyx.git diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index 829bbc0a52..179d7775f3 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -40,6 +40,7 @@ #include "Bidi.h" #include "Buffer.h" +#include "BufferParams.h" #include "BufferView.h" #include "CoordCache.h" #include "Cursor.h" @@ -139,7 +140,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 +193,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 +210,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 +227,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 +238,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 +403,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,12 +579,12 @@ 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()); is >> n; - topaste = cap::selection(n); + topaste = cap::selection(n, buffer().params().documentClassPtr()); } cur.niceInsert(topaste, parseflg, false); cur.clearSelection(); // bug 393 @@ -729,13 +732,13 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_MOUSE_DOUBLE: case LFUN_MOUSE_TRIPLE: case LFUN_WORD_SELECT: - case LFUN_INSET_SELECT_ALL: cur.pos() = 0; 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: @@ -1004,7 +1007,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 @@ -1029,7 +1031,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_REGEXP_MODE: { InsetMath * im = cur.inset().asInsetMath(); if (im) { - InsetMathHull * i = im->asHullInset(); + InsetMathHull * i = im->asHullInset(); if (i && i->getType() == hullRegexp) { cur.message(_("Already in regular expression mode")); break; @@ -1080,13 +1082,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; @@ -1273,7 +1281,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) if (createInsetMath_fromDialogStr(cmd.argument(), ar)) { cur.recordUndoSelection(); cur.insert(ar); - cur.forceBufferUpdate(); + cur.forceBufferUpdate(); } else cur.undispatched(); break; @@ -1449,7 +1457,7 @@ bool InsetMathNest::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_CAPTION_INSERT: flag.setEnabled(false); break; - + case LFUN_SPACE_INSERT: { docstring const & name = cmd.argument(); if (name == "visible") @@ -1461,6 +1469,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; @@ -1536,7 +1551,7 @@ void InsetMathNest::lfunMousePress(Cursor & cur, FuncRequest & cmd) // cur.result().update(): don't overwrite previously set flags. cur.screenUpdateFlags(Update::Decoration | Update::FitCursor | cur.result().screenUpdate()); - } else if (cmd.button() == mouse_button::button2) { + } else if (cmd.button() == mouse_button::button2 && lyxrc.mouse_middlebutton_paste) { if (cap::selection()) { // See comment in Text::dispatch why we do this cap::copySelectionToStack(); @@ -1554,16 +1569,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(); } @@ -1609,9 +1637,8 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) } // do not finish macro for known * commands - MathWordList const & mwl = mathedWordList(); bool star_macro = c == '*' - && (mwl.find(name.substr(1) + "*") != mwl.end() + && (in_word_set(name.substr(1) + '*') || cur.buffer()->getMacro(name.substr(1) + "*", cur, true)); if (isAlphaASCII(c) || star_macro) { cur.activeMacro()->setName(name + docstring(1, c)); @@ -1637,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(); @@ -1674,6 +1701,13 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) new InsetMathBig(name.substr(1), delim))); 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 @@ -1697,7 +1731,7 @@ bool InsetMathNest::interpretChar(Cursor & cur, char_type const c) cur.autocorrect() = false; cur.message(_("Autocorrect Off ('!' to enter)")); return true; - } + } if (lyxrc.autocorrection_math && c == '!' && !cur.autocorrect()) { cur.autocorrect() = true; cur.message(_("Autocorrect On ( to exit)")); @@ -1738,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 @@ -2092,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")); @@ -2150,8 +2197,11 @@ MathCompletionList::MathCompletionList(Cursor const & cur) MathWordList::const_iterator it2; //lyxerr << "Globals completion commands: "; for (it2 = words.begin(); it2 != words.end(); ++it2) { - globals.push_back("\\" + (*it2).first); - //lyxerr << "\\" + (*it2).first << " "; + if (it2->second.inset != "macro") { + // macros are already read from MacroTable::globalMacros() + globals.push_back('\\' + it2->first); + //lyxerr << '\\' + it2->first << ' '; + } } //lyxerr << std::endl; sort(globals.begin(), globals.end());