X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathData.cpp;h=8fcf7466e34c825cfbe07f7badab5ca09befa1ee;hb=55a3dd7b346d29a52ba305a4558e9e380ef50f47;hp=7474632caeff1aa8f73c0b8d02aeaf07b7138e4c;hpb=0c2902d0c063bed05fe990ddd3e1c963cfd9ebef;p=lyx.git diff --git a/src/mathed/MathData.cpp b/src/mathed/MathData.cpp index 7474632cae..8fcf7466e3 100644 --- a/src/mathed/MathData.cpp +++ b/src/mathed/MathData.cpp @@ -46,8 +46,8 @@ using namespace std; namespace lyx { -MathData::MathData(const_iterator from, const_iterator to) - : base_type(from, to) +MathData::MathData(Buffer * buf, const_iterator from, const_iterator to) + : base_type(from, to), buffer_(buf) {} @@ -252,7 +252,7 @@ void MathData::metrics(MetricsInfo & mi, Dimension & dim) const } Cursor & cur = mi.base.bv->cursor(); - const_cast(this)->updateMacros(&cur, mi.macrocontext); + const_cast(this)->updateMacros(&cur, mi.macrocontext, InternalUpdate); DocIterator const & inlineCompletionPos = mi.base.bv->inlineCompletionPos(); MathData const * inlineCompletionData = 0; @@ -377,13 +377,34 @@ void MathData::drawT(TextPainter & pain, int x, int y) const } -void MathData::updateMacros(Cursor * cur, MacroContext const & mc) +void MathData::updateBuffer(ParIterator const & it, UpdateType utype) { + // pass down + for (size_t i = 0, n = size(); i != n; ++i) { + MathAtom & at = operator[](i); + at.nucleus()->updateBuffer(it, utype); + } +} + + +void MathData::updateMacros(Cursor * cur, MacroContext const & mc, + UpdateType utype) +{ + // If we are editing a macro, we cannot update it immediately, + // otherwise wrong undo steps will be recorded (bug 6208). + InsetMath const * inmath = cur ? cur->inset().asInsetMath() : 0; + MathMacro const * inmacro = inmath ? inmath->asMacro() : 0; + docstring const edited_name = inmacro ? inmacro->name() : docstring(); + // go over the array and look for macros for (size_t i = 0; i < size(); ++i) { MathMacro * macroInset = operator[](i).nucleus()->asMacro(); - if (!macroInset || macroInset->name_[0] == '^' - || macroInset->name_[0] == '_') + if (!macroInset || macroInset->name_.empty() + || macroInset->name_[0] == '^' + || macroInset->name_[0] == '_' + || (macroInset->name() == edited_name + && macroInset->displayMode() == + MathMacro::DISPLAY_UNFOLDED)) continue; // get macro @@ -408,6 +429,9 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc) || newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) { detachMacroParameters(cur, i); + // FIXME: proper anchor handling, this removes the selection + if (cur) + cur->clearSelection(); } // the macro could have been copied while resizing this @@ -461,12 +485,12 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc) if (inset->asScriptInset()) inset = inset->asScriptInset()->nuc()[0].nucleus(); LASSERT(inset->asMacro(), /**/); - inset->asMacro()->updateRepresentation(); + inset->asMacro()->updateRepresentation(cur, mc, utype); } } -void MathData::detachMacroParameters(Cursor * cur, const size_type macroPos) +void MathData::detachMacroParameters(DocIterator * cur, const size_type macroPos) { MathMacro * macroInset = operator[](macroPos).nucleus()->asMacro(); @@ -523,7 +547,7 @@ void MathData::detachMacroParameters(Cursor * cur, const size_type macroPos) for (size_t q = 0; q < arg.size(); ++q) { if (arg[q]->getChar() == ']') { // put brace - brace = new InsetMathBrace(); + brace = new InsetMathBrace(buffer_); break; } } @@ -584,11 +608,8 @@ void MathData::detachMacroParameters(Cursor * cur, const size_type macroPos) ++(*cur)[curMacroSlice - 1].pos(); } - if (cur) { - // FIXME: proper anchor handling, this removes the selection - cur->clearSelection(); + if (cur) cur->updateInsets(&cur->bottom().inset()); - } } @@ -604,7 +625,7 @@ void MathData::attachMacroParameters(Cursor * cur, size_t p = macroPos + 1; vector detachedArgs; MathAtom scriptToPutAround; - + // find cursor slice again of this MathData int thisSlice = -1; if (cur) @@ -612,7 +633,7 @@ void MathData::attachMacroParameters(Cursor * cur, int thisPos = -1; if (thisSlice != -1) thisPos = (*cur)[thisSlice].pos(); - + // find arguments behind the macro if (!interactiveInit) { collectOptionalParameters(cur, macroOptionals, detachedArgs, p, @@ -620,27 +641,34 @@ void MathData::attachMacroParameters(Cursor * cur, } collectParameters(cur, macroNumArgs, detachedArgs, p, scriptToPutAround, macroPos, thisPos, thisSlice, appetite); - + // attach arguments back to macro inset macroInset->attachArguments(detachedArgs, macroNumArgs, macroOptionals); - + // found tail script? E.g. \foo{a}b^x if (scriptToPutAround.nucleus()) { + InsetMathScript * scriptInset = + scriptToPutAround.nucleus()->asScriptInset(); + // In the math parser we remove empty braces in the base + // of a script inset, but we have to restore them here. + if (scriptInset->nuc().empty()) { + MathData ar; + scriptInset->nuc().push_back( + MathAtom(new InsetMathBrace(ar))); + } // put macro into a script inset - scriptToPutAround.nucleus()->asScriptInset()->nuc()[0] - = operator[](macroPos); + scriptInset->nuc()[0] = operator[](macroPos); operator[](macroPos) = scriptToPutAround; // go into the script inset nucleus if (cur && thisPos == int(macroPos)) cur->append(0, 0); - + // get pointer to "deep" copied macro inset - InsetMathScript * scriptInset - = operator[](macroPos).nucleus()->asScriptInset(); + scriptInset = operator[](macroPos).nucleus()->asScriptInset(); macroInset = scriptInset->nuc()[0].nucleus()->asMacro(); } - + // remove them from the MathData erase(begin() + macroPos + 1, begin() + p); @@ -651,7 +679,7 @@ void MathData::attachMacroParameters(Cursor * cur, // fix cursor if right of p if (thisPos >= int(p)) (*cur)[thisSlice].pos() -= p - (macroPos + 1); - + // was the macro inset just inserted interactively and was now folded // and the cursor is just behind? if ((*cur)[thisSlice].pos() == int(macroPos + 1) @@ -672,6 +700,7 @@ void MathData::collectOptionalParameters(Cursor * cur, size_t & pos, MathAtom & scriptToPutAround, const pos_type macroPos, const int thisPos, const int thisSlice) { + Buffer * buf = cur ? cur->buffer() : 0; // insert optional arguments? while (params.size() < numOptionalParams && pos < size() @@ -709,7 +738,7 @@ void MathData::collectOptionalParameters(Cursor * cur, } // add everything between [ and ] as optional argument - MathData optarg(begin() + pos + 1, begin() + right); + MathData optarg(buf, begin() + pos + 1, begin() + right); // a brace? bool brace = false;