X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathColor.cpp;h=e3be8ff9bf9bf22efd0b8b389159f70bac59ba29;hb=4ed0312c51704780af1c452d3a82a84171b3725a;hp=c3358bfe34907c6c8e1d582df3a03ace9d103ca3;hpb=31059d1741933d95403e7f07ed033cae482f778b;p=lyx.git diff --git a/src/mathed/InsetMathColor.cpp b/src/mathed/InsetMathColor.cpp index c3358bfe34..e3be8ff9bf 100644 --- a/src/mathed/InsetMathColor.cpp +++ b/src/mathed/InsetMathColor.cpp @@ -3,63 +3,69 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author André Pönitz + * \author André Pönitz * * Full author contact details are available in file CREDITS. */ #include +#include "ColorSet.h" + #include "InsetMathColor.h" +#include "LaTeXFeatures.h" #include "MathData.h" #include "MathStream.h" #include "MathSupport.h" -#include "LaTeXFeatures.h" +#include "MetricsInfo.h" -#include "support/std_ostream.h" +#include "support/gettext.h" +#include "support/lstrings.h" +#include -namespace lyx { +using namespace lyx::support; -using std::auto_ptr; -using std::string; +namespace lyx { -InsetMathColor::InsetMathColor(bool oldstyle, LColor_color const & color) - : InsetMathNest(1), oldstyle_(oldstyle), - color_(from_utf8(lcolor.getLaTeXName(color))) +InsetMathColor::InsetMathColor(Buffer * buf, bool oldstyle, ColorCode color) + : InsetMathNest(buf, 1), oldstyle_(oldstyle), + color_(from_utf8(lcolor.getLaTeXName(color))), + current_mode_(UNDECIDED_MODE) {} -InsetMathColor::InsetMathColor(bool oldstyle, docstring const & color) - : InsetMathNest(1), oldstyle_(oldstyle), color_(color) +InsetMathColor::InsetMathColor(Buffer * buf, bool oldstyle, + docstring const & color) + : InsetMathNest(buf, 1), oldstyle_(oldstyle), color_(color), + current_mode_(UNDECIDED_MODE) {} -auto_ptr InsetMathColor::doClone() const +Inset * InsetMathColor::clone() const { - return auto_ptr(new InsetMathColor(*this)); + return new InsetMathColor(*this); } -bool InsetMathColor::metrics(MetricsInfo & mi, Dimension & dim) const +void InsetMathColor::metrics(MetricsInfo & mi, Dimension & dim) const { + current_mode_ = isTextFont(mi.base.fontname) ? TEXT_MODE : MATH_MODE; + Changer dummy = mi.base.changeEnsureMath(current_mode_); + cell(0).metrics(mi, dim); - metricsMarkers(dim); - if (dim_ == dim) - return false; - dim_ = dim; - return true; } void InsetMathColor::draw(PainterInfo & pi, int x, int y) const { - LColor_color origcol = pi.base.font.color(); + current_mode_ = isTextFont(pi.base.fontname) ? TEXT_MODE : MATH_MODE; + Changer dummy = pi.base.changeEnsureMath(current_mode_); + + ColorCode origcol = pi.base.font.color(); pi.base.font.setColor(lcolor.getFromLaTeXName(to_utf8(color_))); - cell(0).draw(pi, x + 1, y); + cell(0).draw(pi, x, y); pi.base.font.setColor(origcol); - drawMarkers(pi, x, y); - setPosCache(pi, x, y); } @@ -73,14 +79,67 @@ static bool normalcolor(docstring const & color) void InsetMathColor::validate(LaTeXFeatures & features) const { InsetMathNest::validate(features); - if (!normalcolor(color_)) - features.require("color"); + if (!normalcolor(color_)) { + switch (lcolor.getFromLaTeXName(to_utf8(color_))) { + case Color_brown: + case Color_darkgray: + case Color_gray: + case Color_lightgray: + case Color_lime: + case Color_olive: + case Color_orange: + case Color_pink: + case Color_purple: + case Color_teal: + case Color_violet: + features.require("xcolor"); + break; + default: + features.require("color"); + break; + } + } } -void InsetMathColor::write(WriteStream & os) const +void InsetMathColor::write(TeXMathStream & os) const { - if (normalcolor(color_)) + // We have to ensure correct spacing when the front and/or back + // atoms are not ordinary ones (bug 11827). + docstring const frontclass = class_to_string(cell(0).firstMathClass()); + docstring const backclass = class_to_string(cell(0).lastMathClass()); + bool adjchk = os.latex() && !os.inMathClass() && (normalcolor(color_) || oldstyle_); + bool adjust_front = frontclass != "mathord" && adjchk; + bool adjust_back = backclass != "mathord" && adjchk; + docstring const colswitch = + oldstyle_ ? from_ascii("{\\color{") + color_ + from_ascii("}") + : from_ascii("{\\normalcolor "); + + if (adjust_front && adjust_back) { + os << '\\' << frontclass << colswitch << cell(0).front() << '}'; + if (cell(0).size() > 2) { + os << colswitch; + for (size_t i = 1; i < cell(0).size() - 1; ++i) + os << cell(0)[i]; + os << '}'; + } + if (cell(0).size() > 1) + os << '\\' << backclass << colswitch << cell(0).back() << '}'; + } else if (adjust_front) { + os << '\\' << frontclass << colswitch << cell(0).front() << '}'; + if (cell(0).size() > 1) { + os << colswitch; + for (size_t i = 1; i < cell(0).size(); ++i) + os << cell(0)[i]; + os << '}'; + } + } else if (adjust_back) { + os << colswitch; + for (size_t i = 0; i < cell(0).size() - 1; ++i) + os << cell(0)[i]; + os << '}' << '\\' << backclass << colswitch << cell(0).back() + << '}'; + } else if (normalcolor(color_)) // reset to default color inside another color inset os << "{\\normalcolor " << cell(0) << '}'; else if (oldstyle_) @@ -98,7 +157,7 @@ void InsetMathColor::normalize(NormalStream & os) const void InsetMathColor::infoize(odocstream & os) const { - os << "Color: " << color_; + os << bformat(_("Color: %1$s"), color_); }