X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCursor.cpp;h=997f5d5535217dba5dc9a03e273e5ed6e1b8dfe1;hb=908afb8e971d210202b883480968305e30ae0699;hp=3fd2578f272707f21a6e1e3386c21ec75ceabfe6;hpb=4f3c3a794e36c3f53373ccdbd63c923660b892ff;p=lyx.git diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 3fd2578f27..997f5d5535 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -53,7 +53,7 @@ #include "mathed/MacroTable.h" #include "mathed/MathData.h" #include "mathed/MathFactory.h" -#include "mathed/MathMacro.h" +#include "mathed/InsetMathMacro.h" #include #include @@ -115,7 +115,7 @@ DocIterator bruteFind(Cursor const & c, int x, int y) } -} // namespace anon +} // namespace CursorData::CursorData() @@ -758,7 +758,7 @@ bool findNonVirtual(Row const & row, Row::const_iterator & cit, bool onleft) return cit != row.end() && !cit->isVirtual(); } -} +} // namespace void Cursor::getSurroundingPos(pos_type & left_pos, pos_type & right_pos) const { @@ -1057,7 +1057,7 @@ void Cursor::updateTextTargetOffset() } -void Cursor::info(odocstream & os) const +void Cursor::info(odocstream & os, bool devel_mode) const { for (int i = 1, n = depth(); i < n; ++i) { operator[](i).inset().infoize(os); @@ -1069,6 +1069,14 @@ void Cursor::info(odocstream & os) const if (inset) prevInset()->infoize2(os); } + if (devel_mode) { + InsetMath * math = inset().asInsetMath(); + if (math) + os << _(", Inset: ") << math->id(); + os << _(", Cell: ") << idx(); + os << _(", Position: ") << pos(); + } + } @@ -1431,12 +1439,12 @@ bool Cursor::macroModeClose() if (in && in->interpretString(*this, s)) return true; bool const user_macro = buffer()->getMacro(name, *this, false); - MathAtom atom = user_macro ? MathAtom(new MathMacro(buffer(), name)) + MathAtom atom = user_macro ? MathAtom(new InsetMathMacro(buffer(), name)) : createInsetMath(name, buffer()); // try to put argument into macro, if we just inserted a macro bool macroArg = false; - MathMacro * atomAsMacro = atom.nucleus()->asMacro(); + InsetMathMacro * atomAsMacro = atom.nucleus()->asMacro(); if (atomAsMacro) { // macros here are still unfolded (in init mode in fact). So // we have to resolve the macro here manually and check its arity @@ -1444,10 +1452,10 @@ bool Cursor::macroModeClose() MacroData const * data = buffer()->getMacro(atomAsMacro->name()); if (!selection.empty() && data && data->numargs() - data->optionals() > 0) { macroArg = true; - atomAsMacro->setDisplayMode(MathMacro::DISPLAY_INTERACTIVE_INIT, 1); + atomAsMacro->setDisplayMode(InsetMathMacro::DISPLAY_INTERACTIVE_INIT, 1); } else // non-greedy case. Do not touch the arguments behind - atomAsMacro->setDisplayMode(MathMacro::DISPLAY_INTERACTIVE_INIT, 0); + atomAsMacro->setDisplayMode(InsetMathMacro::DISPLAY_INTERACTIVE_INIT, 0); } // insert remembered selection into first argument of a non-macro @@ -1456,9 +1464,10 @@ bool Cursor::macroModeClose() 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 keep_mathmode = user_macro + || (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 @@ -1738,11 +1747,23 @@ bool Cursor::mathForward(bool word) LASSERT(inMathed(), return false); if (pos() < lastpos()) { if (word) { - // word: skip a group of insets with same math class + // word: skip a group of insets of the form X*(B*|R*|P*) (greedy + // match) where X is any math class, B is mathbin, R is mathrel, and + // P is mathpunct. Make sure that the following remains true: + // mathForward(true); mathBackward(true); mathForward(true) + // is the same as mathForward(true) and + // mathBackward(true); mathForward(true); mathBackward(true) + // is the same as mathBackward(true). MathClass mc = nextMath().mathClass(); do posForward(); while (pos() < lastpos() && mc == nextMath().mathClass()); + if (pos() < lastpos() && + ((mc = nextMath().mathClass()) == MC_BIN || + mc == MC_REL || mc == MC_PUNCT)) + do + posForward(); + while (pos() < lastpos() && mc == nextMath().mathClass()); } else if (openable(nextAtom())) { // single step: try to enter the next inset pushBackward(nextMath()); @@ -1767,11 +1788,17 @@ bool Cursor::mathBackward(bool word) LASSERT(inMathed(), return false); if (pos() > 0) { if (word) { - // word: skip a group of insets with same math class + // word: skip a group of insets. See the comment in mathForward. MathClass mc = prevMath().mathClass(); do posBackward(); while (pos() > 0 && mc == prevMath().mathClass()); + if (pos() > 0 && (mc == MC_BIN || mc == MC_REL || mc == MC_PUNCT)) { + mc = prevMath().mathClass(); + do + posBackward(); + while (pos() > 0 && mc == prevMath().mathClass()); + } } else if (openable(prevAtom())) { // single step: try to enter the preceding inset posBackward(); @@ -1961,6 +1988,8 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded) bool bound = false; top().pos() = tm.getPosNearX(real_next_row, xo, bound); boundary(bound); + // When selection==false, this is done by TextMetrics::editXY + setCurrentFont(); updateNeeded |= bv().checkDepm(*this, old); } @@ -2036,7 +2065,7 @@ docstring parbreak(Cursor const * cur) return os.str(); } -} +} // namespace docstring Cursor::selectionAsString(bool with_label) const @@ -2088,23 +2117,16 @@ docstring Cursor::selectionAsString(bool with_label) const } -docstring Cursor::currentState() const +docstring Cursor::currentState(bool devel_mode) const { if (inMathed()) { odocstringstream os; - info(os); -#ifdef DEVEL_VERSION - InsetMath * math = inset().asInsetMath(); - if (math) - os << _(", Inset: ") << math->id(); - os << _(", Cell: ") << idx(); - os << _(", Position: ") << pos(); -#endif + info(os, devel_mode); return os.str(); } if (inTexted()) - return text()->currentState(*this); + return text()->currentState(*this, devel_mode); return docstring(); }