X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathFrac.cpp;h=ac2d894e091c118f82564876dcce950ef007bca3;hb=b5acd0389165ad9b10a8414353bb9652e1289568;hp=0b832a83fcfea6931ca945a06070ad4e88018274;hpb=ed7a07e0078d7350554e71d215b6520ce78587a3;p=lyx.git diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp index 0b832a83fc..ac2d894e09 100644 --- a/src/mathed/InsetMathFrac.cpp +++ b/src/mathed/InsetMathFrac.cpp @@ -18,10 +18,12 @@ #include "MathData.h" #include "MathStream.h" #include "MathSupport.h" +#include "MetricsInfo.h" #include "TextPainter.h" #include "frontends/Painter.h" +using namespace std; namespace lyx { @@ -43,7 +45,7 @@ bool InsetMathFracBase::idxUpDown(Cursor & cur, bool up) const if (cur.idx() == target) return false; cur.idx() = target; - cur.pos() = cell(target).x2pos(cur.x_target()); + cur.pos() = cell(target).x2pos(&cur.bv(), cur.x_target()); return true; } @@ -79,7 +81,7 @@ InsetMathFrac const * InsetMathFrac::asFracInset() const } -bool InsetMathFrac::idxRight(Cursor & cur) const +bool InsetMathFrac::idxForward(Cursor & cur) const { InsetMath::idx_type target = 0; if (kind_ == UNIT || (kind_ == UNITFRAC && nargs() == 3)) { @@ -92,12 +94,12 @@ bool InsetMathFrac::idxRight(Cursor & cur) const if (cur.idx() == target) return false; cur.idx() = target; - cur.pos() = cell(target).x2pos(cur.x_target()); + cur.pos() = cell(target).x2pos(&cur.bv(), cur.x_target()); return true; } -bool InsetMathFrac::idxLeft(Cursor & cur) const +bool InsetMathFrac::idxBackward(Cursor & cur) const { InsetMath::idx_type target = 0; if (kind_ == UNIT || (kind_ == UNITFRAC && nargs() == 3)) { @@ -110,7 +112,7 @@ bool InsetMathFrac::idxLeft(Cursor & cur) const if (cur.idx() == target) return false; cur.idx() = target; - cur.pos() = cell(target).x2pos(cur.x_target()); + cur.pos() = cell(target).x2pos(&cur.bv(), cur.x_target()); return true; } @@ -121,27 +123,27 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const if (kind_ == UNIT || (kind_ == UNITFRAC && nargs() == 3)) { if (nargs() == 1) { - ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE); + ShapeChanger dummy2(mi.base.font, UP_SHAPE); cell(0).metrics(mi, dim0); dim.wid = dim0.width()+ 3; dim.asc = dim0.asc; dim.des = dim0.des; } else if (nargs() == 2) { cell(0).metrics(mi, dim0); - ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE); + ShapeChanger dummy2(mi.base.font, UP_SHAPE); cell(1).metrics(mi, dim1); dim.wid = dim0.width() + dim1.wid + 5; - dim.asc = std::max(dim0.asc, dim1.asc); - dim.des = std::max(dim0.des, dim1.des); + dim.asc = max(dim0.asc, dim1.asc); + dim.des = max(dim0.des, dim1.des); } else { cell(2).metrics(mi, dim2); - ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE); + ShapeChanger dummy2(mi.base.font, UP_SHAPE); FracChanger dummy(mi.base); cell(0).metrics(mi, dim0); cell(1).metrics(mi, dim1); dim.wid = dim0.width() + dim1.wid + dim2.wid + 10; - dim.asc = std::max(dim2.asc, dim0.height() + 5); - dim.des = std::max(dim2.des, dim1.height() - 5); + dim.asc = max(dim2.asc, dim0.height() + 5); + dim.des = max(dim2.des, dim1.height() - 5); } } else { FracChanger dummy(mi.base); @@ -155,19 +157,17 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const dim.asc = dim0.height() + 5; dim.des = dim1.height() - 5; } else if (kind_ == UNITFRAC) { - ShapeChanger dummy2(mi.base.font, Font::UP_SHAPE); + ShapeChanger dummy2(mi.base.font, UP_SHAPE); dim.wid = dim0.width() + dim1.wid + 5; dim.asc = dim0.height() + 5; dim.des = dim1.height() - 5; } else { - dim.wid = std::max(dim0.width(), dim1.wid) + 2; + dim.wid = max(dim0.width(), dim1.wid) + 2; dim.asc = dim0.height() + 2 + 5; dim.des = dim1.height() + 2 - 5; } } metricsMarkers(dim); - // Cache the inset dimension. - setDimCache(mi, dim); } @@ -179,15 +179,15 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const int m = x + dim.wid / 2; if (kind_ == UNIT || (kind_ == UNITFRAC && nargs() == 3)) { if (nargs() == 1) { - ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE); + ShapeChanger dummy2(pi.base.font, UP_SHAPE); cell(0).draw(pi, x + 1, y); } else if (nargs() == 2) { cell(0).draw(pi, x + 1, y); - ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE); + ShapeChanger dummy2(pi.base.font, UP_SHAPE); cell(1).draw(pi, x + dim0.width() + 5, y); } else { cell(2).draw(pi, x + 1, y); - ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE); + ShapeChanger dummy2(pi.base.font, UP_SHAPE); FracChanger dummy(pi.base); Dimension const dim1 = cell(1).dimension(*pi.base.bv); Dimension const dim2 = cell(2).dimension(*pi.base.bv); @@ -206,7 +206,7 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const cell(1).draw(pi, x + dim0.width() + 5, y + dim1.asc / 2); } else if (kind_ == UNITFRAC) { - ShapeChanger dummy2(pi.base.font, Font::UP_SHAPE); + ShapeChanger dummy2(pi.base.font, UP_SHAPE); cell(0).draw(pi, x + 2, y - dim0.des - 5); cell(1).draw(pi, x + dim0.width() + 5, @@ -242,13 +242,13 @@ void InsetMathFrac::metricsT(TextMetricsInfo const & mi, Dimension & dim) const Dimension dim0, dim1; cell(0).metricsT(mi, dim0); cell(1).metricsT(mi, dim1); - dim.wid = std::max(dim0.width(), dim1.wid); + dim.wid = max(dim0.width(), dim1.wid); dim.asc = dim0.height() + 1; dim.des = dim1.height(); } -void InsetMathFrac::drawT(TextPainter & pain, int x, int y) const +void InsetMathFrac::drawT(TextPainter & /*pain*/, int /*x*/, int /*y*/) const { // FIXME: BROKEN! /* @@ -368,11 +368,9 @@ void InsetMathDFrac::metrics(MetricsInfo & mi, Dimension & dim) const Dimension dim0, dim1; cell(0).metrics(mi, dim0); cell(1).metrics(mi, dim1); - dim.wid = std::max(dim0.wid, dim1.wid) + 2; + dim.wid = max(dim0.wid, dim1.wid) + 2; dim.asc = dim0.height() + 2 + 5; dim.des = dim1.height() + 2 - 5; - // Cache the inset dimension. - setDimCache(mi, dim); } @@ -428,11 +426,9 @@ void InsetMathTFrac::metrics(MetricsInfo & mi, Dimension & dim) const cell(0).metrics(mi, dim0); Dimension dim1; cell(1).metrics(mi, dim1); - dim.wid = std::max(dim0.width(), dim1.width()) + 2; + dim.wid = max(dim0.width(), dim1.width()) + 2; dim.asc = dim0.height() + 2 + 5; dim.des = dim1.height() + 2 - 5; - // Cache the inset dimension. - setDimCache(mi, dim); } @@ -476,8 +472,8 @@ void InsetMathTFrac::validate(LaTeXFeatures & features) const ///////////////////////////////////////////////////////////////////// -InsetMathBinom::InsetMathBinom(bool choose) - : choose_(choose) +InsetMathBinom::InsetMathBinom(Kind kind) + : kind_(kind) {} @@ -500,16 +496,14 @@ int InsetMathBinom::dw(int height) const void InsetMathBinom::metrics(MetricsInfo & mi, Dimension & dim) const { - ScriptChanger dummy(mi.base); + FracChanger dummy(mi.base); Dimension dim0, dim1; cell(0).metrics(mi, dim0); cell(1).metrics(mi, dim1); dim.asc = dim0.height() + 4 + 5; dim.des = dim1.height() + 4 - 5; - dim.wid = std::max(dim0.width(), dim1.wid) + 2 * dw(dim.height()) + 4; + dim.wid = max(dim0.width(), dim1.wid) + 2 * dw(dim.height()) + 4; metricsMarkers2(dim); - // Cache the inset dimension. - setDimCache(mi, dim); } @@ -518,29 +512,43 @@ void InsetMathBinom::draw(PainterInfo & pi, int x, int y) const Dimension const dim = dimension(*pi.base.bv); Dimension const & dim0 = cell(0).dimension(*pi.base.bv); Dimension const & dim1 = cell(1).dimension(*pi.base.bv); + docstring const bra = kind_ == BRACE ? from_ascii("{") : + kind_ == BRACK ? from_ascii("[") : from_ascii("("); + docstring const ket = kind_ == BRACE ? from_ascii("}") : + kind_ == BRACK ? from_ascii("]") : from_ascii(")"); int m = x + dim.width() / 2; - ScriptChanger dummy(pi.base); + FracChanger dummy(pi.base); cell(0).draw(pi, m - dim0.width() / 2, y - dim0.des - 3 - 5); cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + 3 - 5); - mathed_draw_deco(pi, x, y - dim.ascent(), dw(dim.height()), dim.height(), from_ascii("(")); + mathed_draw_deco(pi, x, y - dim.ascent(), dw(dim.height()), dim.height(), bra); mathed_draw_deco(pi, x + dim.width() - dw(dim.height()), y - dim.ascent(), - dw(dim.height()), dim.height(), from_ascii(")")); + dw(dim.height()), dim.height(), ket); drawMarkers2(pi, x, y); } bool InsetMathBinom::extraBraces() const { - return choose_; + return kind_ == CHOOSE || kind_ == BRACE || kind_ == BRACK; } void InsetMathBinom::write(WriteStream & os) const { - if (choose_) - os << '{' << cell(0) << " \\choose " << cell(1) << '}'; - else + switch (kind_) { + case BINOM: os << "\\binom{" << cell(0) << "}{" << cell(1) << '}'; + break; + case CHOOSE: + os << '{' << cell(0) << " \\choose " << cell(1) << '}'; + break; + case BRACE: + os << '{' << cell(0) << " \\brace " << cell(1) << '}'; + break; + case BRACK: + os << '{' << cell(0) << " \\brack " << cell(1) << '}'; + break; + } } @@ -549,4 +557,149 @@ void InsetMathBinom::normalize(NormalStream & os) const os << "[binom " << cell(0) << ' ' << cell(1) << ']'; } + +void InsetMathBinom::validate(LaTeXFeatures & features) const +{ + if (kind_ == BINOM) { + features.require("binom"); + InsetMathNest::validate(features); + } +} + + +///////////////////////////////////////////////////////////////////// +// +// InsetMathDBinom +// +///////////////////////////////////////////////////////////////////// + +Inset * InsetMathDBinom::clone() const +{ + return new InsetMathDBinom(*this); +} + + +int InsetMathDBinom::dw(int height) const +{ + int w = height / 5; + if (w > 15) + w = 15; + if (w < 6) + w = 6; + return w; +} + + +void InsetMathDBinom::metrics(MetricsInfo & mi, Dimension & dim) const +{ + Dimension dim0, dim1; + cell(0).metrics(mi, dim0); + cell(1).metrics(mi, dim1); + dim.asc = dim0.height() + 4 + 5; + dim.des = dim1.height() + 4 - 5; + dim.wid = max(dim0.width(), dim1.wid) + 2 * dw(dim.height()) + 4; + metricsMarkers2(dim); +} + + +void InsetMathDBinom::draw(PainterInfo & pi, int x, int y) const +{ + Dimension const dim = dimension(*pi.base.bv); + Dimension const & dim0 = cell(0).dimension(*pi.base.bv); + Dimension const & dim1 = cell(1).dimension(*pi.base.bv); + int m = x + dim.width() / 2; + cell(0).draw(pi, m - dim0.width() / 2, y - dim0.des - 3 - 5); + cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + 3 - 5); + mathed_draw_deco(pi, x, y - dim.ascent(), dw(dim.height()), dim.height(), from_ascii("(")); + mathed_draw_deco(pi, x + dim.width() - dw(dim.height()), y - dim.ascent(), + dw(dim.height()), dim.height(), from_ascii(")")); + drawMarkers2(pi, x, y); +} + + +docstring InsetMathDBinom::name() const +{ + return from_ascii("dbinom"); +} + +void InsetMathDBinom::mathmlize(MathStream & os) const +{ + os << MTag("mdbinom") << cell(0) << cell(1) << ETag("mdbinom"); +} + +void InsetMathDBinom::validate(LaTeXFeatures & features) const +{ + features.require("amsmath"); + InsetMathNest::validate(features); +} + + +///////////////////////////////////////////////////////////////////// +// +// InsetMathTBinom +// +///////////////////////////////////////////////////////////////////// + +Inset * InsetMathTBinom::clone() const +{ + return new InsetMathTBinom(*this); +} + + +int InsetMathTBinom::dw(int height) const +{ + int w = height / 5; + if (w > 15) + w = 15; + if (w < 6) + w = 6; + return w; +} + + +void InsetMathTBinom::metrics(MetricsInfo & mi, Dimension & dim) const +{ + StyleChanger dummy(mi.base, LM_ST_SCRIPT); + Dimension dim0, dim1; + cell(0).metrics(mi, dim0); + cell(1).metrics(mi, dim1); + dim.asc = dim0.height() + 4 + 5; + dim.des = dim1.height() + 4 - 5; + dim.wid = max(dim0.width(), dim1.wid) + 2 * dw(dim.height()) + 4; + metricsMarkers2(dim); +} + + +void InsetMathTBinom::draw(PainterInfo & pi, int x, int y) const +{ + StyleChanger dummy(pi.base, LM_ST_SCRIPT); + Dimension const dim = dimension(*pi.base.bv); + Dimension const & dim0 = cell(0).dimension(*pi.base.bv); + Dimension const & dim1 = cell(1).dimension(*pi.base.bv); + int m = x + dim.width() / 2; + cell(0).draw(pi, m - dim0.width() / 2, y - dim0.des - 3 - 5); + cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + 3 - 5); + mathed_draw_deco(pi, x, y - dim.ascent(), dw(dim.height()), dim.height(), from_ascii("(")); + mathed_draw_deco(pi, x + dim.width() - dw(dim.height()), y - dim.ascent(), + dw(dim.height()), dim.height(), from_ascii(")")); + drawMarkers2(pi, x, y); +} + + +docstring InsetMathTBinom::name() const +{ + return from_ascii("tbinom"); +} + +void InsetMathTBinom::mathmlize(MathStream & os) const +{ + os << MTag("mtbinom") << cell(0) << cell(1) << ETag("mtbinom"); +} + +void InsetMathTBinom::validate(LaTeXFeatures & features) const +{ + features.require("amsmath"); + InsetMathNest::validate(features); +} + } // namespace lyx