X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCursor.cpp;h=43984de9c80c78b01f2adceacbed16b06d8870fd;hb=bf56e2c8e1afa857cd5e313c19948040e41b8227;hp=4e63734155a302e6a4b7abc2e8de48de6e0eaf99;hpb=5cdbaf51ee73e23b9c0dfd6e8a9aa5fea1d798de;p=lyx.git diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 4e63734155..43984de9c8 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -194,13 +194,37 @@ void Cursor::reset() } -// this (intentionally) does neither touch anchor nor selection status void Cursor::setCursor(DocIterator const & cur) { DocIterator::operator=(cur); } +void Cursor::setCursorSelectionTo(DocIterator dit) +{ + size_t i = 0; + // normalise dit + while (i < dit.depth() && i < anchor_.depth() && dit[i] == anchor_[i]) + ++i; + if (i != dit.depth()) { + // otherwise the cursor is already normal + if (i == anchor_.depth()) + // dit is a proper extension of the anchor_ + dit.cutOff(i - 1); + else if (i + 1 < dit.depth()) { + // one has dit[i] != anchor_[i] but either dit[i-1] == anchor_[i-1] + // or i == 0. Remove excess. + dit.cutOff(i); + if (dit[i] > anchor_[i]) + // place dit after the inset it was in + ++dit.pos(); + } + } + setCursor(dit); + setSelection(); +} + + void Cursor::setCursorToAnchor() { if (selection()) { @@ -1426,8 +1450,9 @@ bool Cursor::macroModeClose() InsetMathNest * const in = inset().asInsetMath()->asNestInset(); if (in && in->interpretString(*this, s)) return true; - MathAtom atom = buffer()->getMacro(name, *this, false) ? - MathAtom(new MathMacro(buffer(), name)) : createInsetMath(name, buffer()); + bool const user_macro = buffer()->getMacro(name, *this, false); + MathAtom atom = user_macro ? MathAtom(new MathMacro(buffer(), name)) + : createInsetMath(name, buffer()); // try to put argument into macro, if we just inserted a macro bool macroArg = false; @@ -1449,16 +1474,23 @@ bool Cursor::macroModeClose() else if (atom.nucleus()->nargs() > 0) atom.nucleus()->cell(0).append(selection); - if (in->currentMode() == Inset::TEXT_MODE + MathWordList const & words = mathedWordList(); + MathWordList::const_iterator it = words.find(name); + bool keep_mathmode = it != words.end() && (it->second.inset == "font" + || it->second.inset == "oldfont" + || it->second.inset == "mbox"); + bool ert_macro = !user_macro && it == words.end() && atomAsMacro; + + if (in && in->currentMode() == Inset::TEXT_MODE && atom.nucleus()->currentMode() == Inset::MATH_MODE - && name != from_ascii("ensuremath")) { + && name != from_ascii("ensuremath") && !ert_macro) { MathAtom at(new InsetMathEnsureMath(buffer())); at.nucleus()->cell(0).push_back(atom); niceInsert(at); posForward(); - } else if (in->currentMode() == Inset::MATH_MODE + } else if (in && in->currentMode() == Inset::MATH_MODE && atom.nucleus()->currentMode() == Inset::TEXT_MODE - && name != from_ascii("text")) { + && !keep_mathmode) { MathAtom at = createInsetMath("text", buffer()); at.nucleus()->cell(0).push_back(atom); niceInsert(at); @@ -1584,7 +1616,7 @@ void Cursor::normalize() << pos() << ' ' << lastpos() << " in idx: " << idx() << " in atom: '"; odocstringstream os; - otexrowstream ots(os, false); + otexrowstream ots(os); WriteStream wi(ots, false, true, WriteStream::wsDefault); inset().asInsetMath()->write(wi); lyxerr << to_utf8(os.str()) << endl; @@ -2089,6 +2121,7 @@ Font Cursor::getFont() const // The logic here should more or less match to the // Cursor::setCurrentFont logic, i.e. the cursor height should // give a hint what will happen if a character is entered. + // FIXME: this is not the case, what about removing this method ? (see #10478). // HACK. far from being perfect...