X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathScript.cpp;h=fc72b6b078e1052002cd045701c607767e57ac40;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=ba2be2f729adddff8a17a16e66fabd886de89c64;hpb=43f6b1672b5ef442b4e9b7e4f7ea76dc14ac4fc8;p=lyx.git diff --git a/src/mathed/InsetMathScript.cpp b/src/mathed/InsetMathScript.cpp index ba2be2f729..fc72b6b078 100644 --- a/src/mathed/InsetMathScript.cpp +++ b/src/mathed/InsetMathScript.cpp @@ -10,25 +10,26 @@ #include +#include "InsetMathScript.h" + +#include "InsetMathBrace.h" +#include "InsetMathSymbol.h" +#include "MathData.h" +#include "MathStream.h" +#include "MathSupport.h" + #include "BufferView.h" #include "Cursor.h" #include "DispatchResult.h" #include "FuncRequest.h" #include "FuncStatus.h" -#include "InsetMathBrace.h" -#include "InsetMathFont.h" -#include "InsetMathScript.h" -#include "InsetMathSymbol.h" #include "LaTeXFeatures.h" -#include "MathData.h" -#include "MathStream.h" -#include "MathSupport.h" +#include "MetricsInfo.h" #include "support/debug.h" - +#include "support/gettext.h" #include "support/lassert.h" -#include using namespace std; @@ -48,7 +49,7 @@ InsetMathScript::InsetMathScript(Buffer * buf, bool up) InsetMathScript::InsetMathScript(Buffer * buf, MathAtom const & at, bool up) : InsetMathNest(buf, 2), cell_1_is_up_(up), limits_(0) { - LASSERT(nargs() >= 1, /**/); + LATTEST(nargs() >= 1); cell(0).push_back(at); } @@ -91,7 +92,7 @@ MathData const & InsetMathScript::down() const { if (nargs() == 3) return cell(2); - LASSERT(nargs() > 1, /**/); + LBUFERR(nargs() > 1); return cell(1); } @@ -100,21 +101,21 @@ MathData & InsetMathScript::down() { if (nargs() == 3) return cell(2); - LASSERT(nargs() > 1, /**/); + LBUFERR(nargs() > 1); return cell(1); } MathData const & InsetMathScript::up() const { - LASSERT(nargs() > 1, /**/); + LBUFERR(nargs() > 1); return cell(1); } MathData & InsetMathScript::up() { - LASSERT(nargs() > 1, /**/); + LBUFERR(nargs() > 1); return cell(1); } @@ -148,31 +149,6 @@ MathData & InsetMathScript::nuc() } -namespace { - -bool isAlphaSymbol(MathAtom const & at) -{ - if (at->asCharInset() || - (at->asSymbolInset() && - at->asSymbolInset()->isOrdAlpha())) - return true; - - if (at->asFontInset()) { - MathData const & ar = at->asFontInset()->cell(0); - for (size_t i = 0; i < ar.size(); ++i) { - if (!(ar[i]->asCharInset() || - (ar[i]->asSymbolInset() && - ar[i]->asSymbolInset()->isOrdAlpha()))) - return false; - } - return true; - } - return false; -} - -} // namespace anon - - int InsetMathScript::dy01(BufferView const & bv, int asc, int des, int what) const { int dasc = 0; @@ -248,17 +224,19 @@ int InsetMathScript::dy1(BufferView const & bv) const int InsetMathScript::dx0(BufferView const & bv) const { - LASSERT(hasDown(), /**/); + LASSERT(hasDown(), return 0); Dimension const dim = dimension(bv); - return hasLimits() ? (dim.wid - down().dimension(bv).width()) / 2 : nwid(bv); + return hasLimits() ? (dim.wid - down().dimension(bv).width()) / 2 + : nwid(bv) + min(nker(&bv), 0); } int InsetMathScript::dx1(BufferView const & bv) const { - LASSERT(hasUp(), /**/); + LASSERT(hasUp(), return 0); Dimension const dim = dimension(bv); - return hasLimits() ? (dim.wid - up().dimension(bv).width()) / 2 : nwid(bv) + nker(&bv); + return hasLimits() ? (dim.wid - up().dimension(bv).width()) / 2 + : nwid(bv) + max(nker(&bv), 0); } @@ -289,21 +267,36 @@ int InsetMathScript::ndes(BufferView const & bv) const int InsetMathScript::nker(BufferView const * bv) const { - if (!nuc().empty()) { - int kerning = nuc().kerning(bv); - return kerning > 0 ? kerning : 0; - } + if (!nuc().empty()) + return nuc().kerning(bv); return 0; } +MathClass InsetMathScript::mathClass() const +{ + // FIXME: this is a hack, since the class will not be correct if + // the nucleus has several elements or if the last element is a math macro + // or a macro argument proxy. + // The correct implementation would require to linearize the nucleus. + if (nuc().empty()) + return MC_ORD; + else { + // return the class of last element since this is the one that counts. + MathClass mc = nuc().back()->mathClass(); + return (mc == MC_UNKNOWN) ? MC_ORD : mc; + } +} + + void InsetMathScript::metrics(MetricsInfo & mi, Dimension & dim) const { + Changer dummy2 = mi.base.changeEnsureMath(); Dimension dim0; Dimension dim1; Dimension dim2; cell(0).metrics(mi, dim0); - ScriptChanger dummy(mi.base); + Changer dummy = mi.base.changeScript(); if (nargs() > 1) cell(1).metrics(mi, dim1); if (nargs() > 2) @@ -327,9 +320,9 @@ void InsetMathScript::metrics(MetricsInfo & mi, Dimension & dim) const dim.wid = max(dim.wid, dimdown.width()); } else { if (hasUp()) - dim.wid = max(dim.wid, nker(mi.base.bv) + dimup.width()); + dim.wid = max(dim.wid, max(nker(mi.base.bv), 0) + dimup.width()); if (hasDown()) - dim.wid = max(dim.wid, dimdown.width()); + dim.wid = max(dim.wid, min(nker(mi.base.bv), 0) + dimdown.width()); dim.wid += nwid(bv); } int na = nasc(bv); @@ -344,12 +337,12 @@ void InsetMathScript::metrics(MetricsInfo & mi, Dimension & dim) const dim.des = max(nd, des); } else dim.des = nd; - metricsMarkers(dim); } void InsetMathScript::draw(PainterInfo & pi, int x, int y) const { + Changer dummy2 = pi.base.changeEnsureMath(); BufferView & bv = *pi.base.bv; if (!nuc().empty()) nuc().draw(pi, x + dxx(bv), y); @@ -358,12 +351,11 @@ void InsetMathScript::draw(PainterInfo & pi, int x, int y) const if (editing(&bv)) pi.draw(x + dxx(bv), y, char_type('.')); } - ScriptChanger dummy(pi.base); + Changer dummy = pi.base.changeScript(); if (hasUp()) up().draw(pi, x + dx1(bv), y - dy1(bv)); if (hasDown()) down().draw(pi, x + dx0(bv), y + dy0(bv)); - drawMarkers(pi, x, y); } @@ -465,9 +457,7 @@ Inset::idx_type InsetMathScript::idxOfScript(bool up) const return (cell_1_is_up_ == up) ? 1 : 0; if (nargs() == 3) return up ? 1 : 2; - LASSERT(false, /**/); - // Silence compiler - return 0; + LASSERT(false, return 0); } @@ -623,21 +613,18 @@ void InsetMathScript::mathematica(MathematicaStream & os) const } -// FIXME XHTML -// It may be worth trying to output munder, mover, and munderover -// in certain cases, e.g., for display formulas. But then we would -// need to know if we're in a display formula. void InsetMathScript::mathmlize(MathStream & os) const { bool d = hasDown() && !down().empty(); bool u = hasUp() && !up().empty(); + bool l = hasLimits(); if (u && d) - os << MTag("msubsup"); + os << MTag(l ? "munderover" : "msubsup"); else if (u) - os << MTag("msup"); + os << MTag(l ? "mover" : "msup"); else if (d) - os << MTag("msub"); + os << MTag(l ? "munder" : "msub"); if (!nuc().empty()) os << MTag("mrow") << nuc() << ETag("mrow"); @@ -647,11 +634,11 @@ void InsetMathScript::mathmlize(MathStream & os) const if (u && d) os << MTag("mrow") << down() << ETag("mrow") << MTag("mrow") << up() << ETag("mrow") - << ETag("msubsup"); + << ETag(l ? "munderover" : "msubsup"); else if (u) - os << MTag("mrow") << up() << ETag("mrow") << ETag("msup"); + os << MTag("mrow") << up() << ETag("mrow") << ETag(l ? "mover" : "msup"); else if (d) - os << MTag("mrow") << down() << ETag("mrow") << ETag("msub"); + os << MTag("mrow") << down() << ETag("mrow") << ETag(l ? "munder" : "msub"); }