]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
Set correctly the spacing between atoms in MathData
[lyx.git] / src / Cursor.cpp
index 4e63734155a302e6a4b7abc2e8de48de6e0eaf99..43984de9c80c78b01f2adceacbed16b06d8870fd 100644 (file)
@@ -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...