/** * \file InsetFormulaMacro.cpp * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * * \author Alejandro Aguilar Sierra * \author André Pönitz * * Full author contact details are available in file CREDITS. */ #include #include "InsetFormulaMacro.h" #include "MathMacroTable.h" #include "MathMacroTemplate.h" #include "BufferView.h" #include "cursor.h" #include "debug.h" #include "gettext.h" #include "LColor.h" #include "lyxlex.h" #include "outputparams.h" #include "frontends/FontMetrics.h" #include "frontends/Painter.h" #include "support/lstrings.h" #include namespace lyx { using odocstream; using support::bformat; using std::string; using std::auto_ptr; using std::ostream; using std::endl; InsetFormulaMacro::InsetFormulaMacro() : InsetMathNest(2), name_("unknownA") {} InsetFormulaMacro::InsetFormulaMacro (string const & name, int nargs, string const & type) : InsetMathNest(2), name_(name) { MathMacroTable::create(MathAtom(new MathMacroTemplate(name, nargs, type))); } InsetFormulaMacro::InsetFormulaMacro(string const & s) : InsetMathNest(2), name_("unknownB") { std::istringstream is(s); read(is); } auto_ptr InsetFormulaMacro::clone() const { return auto_ptr(new InsetFormulaMacro(*this)); } void InsetFormulaMacro::write(Buffer const &, ostream & os) const { os << "FormulaMacro\n"; WriteStream wi(os, false, false); tmpl()->write(wi); } int InsetFormulaMacro::latex(Buffer const &, odocstream & os, OutputParams const & runparams) const { //lyxerr << "InsetFormulaMacro::latex" << endl; WriteStream wi(os, runparams.moving_arg, true); tmpl()->write(wi); return 2; } int InsetFormulaMacro::plaintext(Buffer const &, odocstream & os, OutputParams const &) const { odocstringstream oss; WriteStream wi(oss, false, true); tmpl()->write(wi); docstring const str = oss.str(); os << str; return str.size(); } int InsetFormulaMacro::docbook(Buffer const & buf, ostream & os, OutputParams const & runparams) const { return plaintext(buf, os, runparams); } void InsetFormulaMacro::read(Buffer const &, LyXLex & lex) { read(lex.getStream()); } void InsetFormulaMacro::read(std::istream & is) { auto_ptr p(new MathMacroTemplate(is)); name_ = p->name(); MathMacroTable::create(MathAtom(p.release())); } string InsetFormulaMacro::prefix() const { return to_utf8(bformat(_(" Macro: %1$s: "), lyx::from_utf8(name_))); } bool InsetFormulaMacro::metrics(MetricsInfo & mi, Dimension & dim) const { //lyxerr << "InsetFormulaMacro: " << this << " -- " << &tmpl() << endl; tmpl()->metrics(mi, dim); dim.asc += 5; dim.des += 5; dim.wid += 10 + theFontMetrics(mi.base.font).width(prefix()); bool const changed = dim_ != dim; dim_ = dim; return changed; } void InsetFormulaMacro::draw(PainterInfo & p, int x, int y) const { // label LyXFont font = p.base.font; font.setColor(LColor::math); PainterInfo pi(p.base.bv, p.pain); pi.base.style = LM_ST_TEXT; pi.base.font = font; int const a = y - dim_.asc + 1; int const w = dim_.wid - 2; int const h = dim_.height() - 2; // LColor::mathbg used to be "AntiqueWhite" but is "linen" now, too pi.pain.fillRectangle(x, a, w, h, LColor::mathmacrobg); pi.pain.rectangle(x, a, w, h, LColor::mathframe); #ifdef WITH_WARNINGS #warning FIXME #endif #if 0 LCursor & cur = p.base.bv->cursor(); if (cur.isInside(this)) cur.drawSelection(pi); #endif pi.pain.text(x + 2, y, prefix(), font); // body tmpl()->draw(pi, x + theFontMetrics(p.base.font).width(prefix()) + 5, y); setPosCache(pi, x, y); } MathAtom & InsetFormulaMacro::tmpl() const { return MathMacroTable::provide(name_); } } // namespace lyx