X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathDelim.cpp;h=fb4f8f4d87c4a756f96e3d913ffac765b3338d11;hb=66fa801e74e1775b31008df548332436ce79e2e1;hp=a0f6aaad5d3a6b69de89588a5a405e27137fe91f;hpb=f497296c30e6da2f97b16da8ad1c9e96feffb16b;p=lyx.git diff --git a/src/mathed/InsetMathDelim.cpp b/src/mathed/InsetMathDelim.cpp index a0f6aaad5d..fb4f8f4d87 100644 --- a/src/mathed/InsetMathDelim.cpp +++ b/src/mathed/InsetMathDelim.cpp @@ -4,7 +4,7 @@ * Licence details can be found in the file COPYING. * * \author Alejandro Aguilar Sierra - * \author André Pönitz + * \author André Pönitz * * Full author contact details are available in file CREDITS. */ @@ -12,26 +12,28 @@ #include #include "InsetMathDelim.h" + #include "MathData.h" -#include "MathStream.h" +#include "MathFactory.h" #include "MathStream.h" #include "MathSupport.h" +#include "MetricsInfo.h" -#include "frontends/FontMetrics.h" +#include "LaTeXFeatures.h" -namespace lyx { +#include "support/docstring.h" +#include "frontends/FontMetrics.h" -using std::string; -using std::max; -using std::auto_ptr; +using namespace std; +namespace lyx { static docstring convertDelimToLatexName(docstring const & name) { if (name.size() == 1) { char_type const c = name[0]; - if (c == '<' || c == '(' || c == '[' || c == '.' + if (c == '<' || c == '(' || c == '[' || c == '.' || c == '>' || c == ')' || c == ']' || c == '/' || c == '|') return name; } @@ -39,27 +41,53 @@ static docstring convertDelimToLatexName(docstring const & name) } -InsetMathDelim::InsetMathDelim(docstring const & l, docstring const & r) - : InsetMathNest(1), left_(l), right_(r) +InsetMathDelim::InsetMathDelim(Buffer * buf, docstring const & l, + docstring const & r) + : InsetMathNest(buf, 1), left_(l), right_(r) {} -InsetMathDelim::InsetMathDelim - (docstring const & l, docstring const & r, MathArray const & ar) - : InsetMathNest(1), left_(l), right_(r) +InsetMathDelim::InsetMathDelim(Buffer * buf, docstring const & l, docstring const & r, + MathData const & ar) + : InsetMathNest(buf, 1), left_(l), right_(r) { cell(0) = ar; } -auto_ptr InsetMathDelim::doClone() const +Inset * InsetMathDelim::clone() const +{ + return new InsetMathDelim(*this); +} + + +void InsetMathDelim::validate(LaTeXFeatures & features) const { - return auto_ptr(new InsetMathDelim(*this)); + InsetMathNest::validate(features); + // The delimiters may be used without \left or \right as well. + // Therefore they are listed in lib/symbols, and if they have + // requirements, we need to add them here. + MathWordList const & words = mathedWordList(); + MathWordList::const_iterator it = words.find(left_); + if (it != words.end()) + { + string const req = it->second.requires; + if (!req.empty()) + features.require(req); + } + it = words.find(right_); + if (it != words.end()) + { + string const req = it->second.requires; + if (!req.empty()) + features.require(req); + } } void InsetMathDelim::write(WriteStream & os) const { + MathEnsurer ensurer(os); os << "\\left" << convertDelimToLatexName(left_) << cell(0) << "\\right" << convertDelimToLatexName(right_); } @@ -72,35 +100,33 @@ void InsetMathDelim::normalize(NormalStream & os) const } -bool InsetMathDelim::metrics(MetricsInfo & mi, Dimension & dim) const +void InsetMathDelim::metrics(MetricsInfo & mi, Dimension & dim) const { - cell(0).metrics(mi); + Dimension dim0; + cell(0).metrics(mi, dim0); Dimension t = theFontMetrics(mi.base.font).dimension('I'); int h0 = (t.asc + t.des) / 2; - int a0 = max(cell(0).ascent(), t.asc) - h0; - int d0 = max(cell(0).descent(), t.des) + h0; - dw_ = cell(0).height() / 5; + int a0 = max(dim0.asc, t.asc) - h0; + int d0 = max(dim0.des, t.des) + h0; + dw_ = dim0.height() / 5; if (dw_ > 8) dw_ = 8; if (dw_ < 4) dw_ = 4; - dim.wid = cell(0).width() + 2 * dw_ + 8; + dim.wid = dim0.width() + 2 * dw_ + 8; dim.asc = max(a0, d0) + h0; dim.des = max(a0, d0) - h0; - if (dim_ == dim) - return false; - dim_ = dim; - return true; } void InsetMathDelim::draw(PainterInfo & pi, int x, int y) const { - int const b = y - dim_.asc; + Dimension const dim = dimension(*pi.base.bv); + int const b = y - dim.asc; cell(0).draw(pi, x + dw_ + 4, y); - mathed_draw_deco(pi, x + 4, b, dw_, dim_.height(), left_); - mathed_draw_deco(pi, x + dim_.width() - dw_ - 4, - b, dw_, dim_.height(), right_); + mathed_draw_deco(pi, x + 4, b, dw_, dim.height(), left_); + mathed_draw_deco(pi, x + dim.width() - dw_ - 4, + b, dw_, dim.height(), right_); setPosCache(pi, x, y); } @@ -164,8 +190,14 @@ void InsetMathDelim::mathematica(MathematicaStream & os) const void InsetMathDelim::mathmlize(MathStream & os) const { - os << "" << cell(0) << ""; + os << "" << left_ << "" + << cell(0) << "" << right_ << ""; +} + + +void InsetMathDelim::htmlize(HtmlStream & os) const +{ + os << left_ << cell(0) << right_; }