X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathFrac.cpp;h=ac2d894e091c118f82564876dcce950ef007bca3;hb=b5acd0389165ad9b10a8414353bb9652e1289568;hp=aef7818e5ddc7bf86e86f12a3859e52e72064602;hpb=cd95a4bae8cc2a134597369a3cf8b6ea4ddf74e4;p=lyx.git diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp index aef7818e5d..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; } @@ -92,7 +94,7 @@ bool InsetMathFrac::idxForward(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; } @@ -110,7 +112,7 @@ bool InsetMathFrac::idxBackward(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; } @@ -131,8 +133,8 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const 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, UP_SHAPE); @@ -140,8 +142,8 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const 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); @@ -160,14 +162,12 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const 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); } @@ -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) {} @@ -506,10 +502,8 @@ void InsetMathBinom::metrics(MetricsInfo & mi, Dimension & dim) const 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; 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; + } } @@ -550,6 +558,15 @@ void InsetMathBinom::normalize(NormalStream & os) const } +void InsetMathBinom::validate(LaTeXFeatures & features) const +{ + if (kind_ == BINOM) { + features.require("binom"); + InsetMathNest::validate(features); + } +} + + ///////////////////////////////////////////////////////////////////// // // InsetMathDBinom @@ -580,10 +597,8 @@ void InsetMathDBinom::metrics(MetricsInfo & mi, Dimension & dim) const 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); } @@ -650,10 +665,8 @@ void InsetMathTBinom::metrics(MetricsInfo & mi, Dimension & dim) const 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); }