X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathData.cpp;h=edd808945721cd071b2209ddd29d2ef264a8d78d;hb=6de3c19fd63f810eed90ef3bc4469faf28e949c2;hp=98f3e04bbd96d36c0864c7fa44c3baa0e550fa37;hpb=cf1f59dd4de7edce50a7aa660c199c69fa97f324;p=lyx.git diff --git a/src/mathed/MathData.cpp b/src/mathed/MathData.cpp index 98f3e04bbd..edd8089457 100644 --- a/src/mathed/MathData.cpp +++ b/src/mathed/MathData.cpp @@ -36,6 +36,7 @@ #include "frontends/FontMetrics.h" #include "frontends/Painter.h" +#include "support/gettext.h" #include "support/lassert.h" #include @@ -53,14 +54,14 @@ MathData::MathData(Buffer * buf, const_iterator from, const_iterator to) MathAtom & MathData::operator[](pos_type pos) { - LASSERT(pos < size(), /**/); + LBUFERR(pos < size()); return base_type::operator[](pos); } MathAtom const & MathData::operator[](pos_type pos) const { - LASSERT(pos < size(), /**/); + LBUFERR(pos < size()); return base_type::operator[](pos); } @@ -73,7 +74,7 @@ void MathData::insert(size_type pos, MathAtom const & t) void MathData::insert(size_type pos, MathData const & ar) { - LASSERT(pos <= size(), /**/); + LBUFERR(pos <= size()); base_type::insert(begin() + pos, ar.begin(), ar.end()); } @@ -215,6 +216,7 @@ void MathData::touch() const } +#if 0 namespace { bool isInside(DocIterator const & it, MathData const & ar, @@ -229,7 +231,7 @@ bool isInside(DocIterator const & it, MathData const & ar, } } - +#endif void MathData::metrics(MetricsInfo & mi, Dimension & dim) const @@ -252,7 +254,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; @@ -280,7 +282,9 @@ void MathData::metrics(MetricsInfo & mi, Dimension & dim) const if (completion.length() == 0) continue; - dim.wid += mathed_string_width(mi.base.font, completion); + FontInfo font = mi.base.font; + augmentFont(font, from_ascii("mathnormal")); + dim.wid += mathed_string_width(font, completion); } // Cache the dimension. mi.base.bv->coordCache().arrays().add(this, dim); @@ -328,6 +332,7 @@ void MathData::draw(PainterInfo & pi, int x, int y) const if (completion.length() == 0) continue; FontInfo f = pi.base.font; + augmentFont(f, from_ascii("mathnormal")); // draw the unique and the non-unique completion part // Note: this is not time-critical as it is @@ -336,13 +341,13 @@ void MathData::draw(PainterInfo & pi, int x, int y) const docstring s1 = completion.substr(0, uniqueTo); docstring s2 = completion.substr(uniqueTo); - if (s1.size() > 0) { + if (!s1.empty()) { f.setColor(Color_inlinecompletion); pi.pain.text(x, y, s1, f); x += mathed_string_width(f, s1); } - if (s2.size() > 0) { + if (!s2.empty()) { f.setColor(Color_nonunique_inlinecompletion); pi.pain.text(x, y, s2, f); x += mathed_string_width(f, s2); @@ -387,7 +392,8 @@ void MathData::updateBuffer(ParIterator const & it, UpdateType utype) } -void MathData::updateMacros(Cursor * cur, MacroContext const & mc) +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). @@ -483,8 +489,8 @@ void MathData::updateMacros(Cursor * cur, MacroContext const & mc) InsetMath * inset = operator[](i).nucleus(); if (inset->asScriptInset()) inset = inset->asScriptInset()->nuc()[0].nucleus(); - LASSERT(inset->asMacro(), /**/); - inset->asMacro()->updateRepresentation(); + LASSERT(inset->asMacro(), continue); + inset->asMacro()->updateRepresentation(cur, mc, utype); } } @@ -624,7 +630,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) @@ -632,7 +638,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, @@ -640,27 +646,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); @@ -671,7 +684,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)