X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_macro.C;h=9983cf5f78b523af9c7425a1a17867bf75460d45;hb=d359dd8fca52c4f0100f7cf4bf636113c5c4e49f;hp=9dcf8a9aecca0fc0924507df3575e2d843546b95;hpb=e9baa06e515a764ed6193a7f99d3e6ff06fe6122;p=lyx.git diff --git a/src/mathed/math_macro.C b/src/mathed/math_macro.C index 9dcf8a9aec..9983cf5f78 100644 --- a/src/mathed/math_macro.C +++ b/src/mathed/math_macro.C @@ -1,7 +1,7 @@ /* * File: math_macro.C - * Purpose: Implementation of macro class for mathed - * Author: Alejandro Aguilar Sierra + * Purpose: Implementation of macro class for mathed + * Author: Alejandro Aguilar Sierra * Created: November 1996 * Description: WYSIWYG math macros * @@ -19,26 +19,30 @@ #endif #include "math_macro.h" -#include "array.h" +#include "math_support.h" +#include "math_extern.h" +#include "math_macrotable.h" +#include "math_macrotemplate.h" +#include "math_mathmlstream.h" +#include "math_streamstr.h" #include "support/lstrings.h" #include "support/LAssert.h" #include "debug.h" -#include "mathed/support.h" -#include "mathed/math_cursor.h" -#include "math_macrotable.h" -#include "math_macrotemplate.h" -#include "Painter.h" #include "LaTeXFeatures.h" -using std::endl; -MathMacro::MathMacro(MathMacroTemplate const & t) - : MathNestInset(t.numargs()), tmplate_(&t) +using std::max; + + +MathMacro::MathMacro(string const & name) + : MathNestInset(MathMacroTable::provide(name)->asMacroTemplate()->numargs()), + tmplate_(MathMacroTable::provide(name)) {} -MathMacro::MathMacro(MathMacro const & t) - : MathNestInset(t), tmplate_(t.tmplate_) // don't copy 'expanded_'! +MathMacro::MathMacro(MathMacro const & m) + : MathNestInset(m), + tmplate_(m.tmplate_) // don't copy 'expanded_'! {} @@ -49,88 +53,106 @@ MathInset * MathMacro::clone() const } -const char * MathMacro::name() const +string const & MathMacro::name() const +{ + return tmplate_->asMacroTemplate()->name(); +} + + +bool MathMacro::defining() const +{ + return 0; + //return mathcursor && mathcursor->formula()->getInsetName() == name(); +} + + +void MathMacro::expand() const { - return tmplate_->name().c_str(); + expanded_ = tmplate_->xcell(tmplate_->cell(1).empty() ? 0 : 1); } -void MathMacro::metrics(MathStyles st) const +void MathMacro::metrics(MathMetricsInfo & mi) const { - if (mathcursor && mathcursor->isInside(this)) { - expanded_ = tmplate_->xcell(0); - expanded_.metrics(st); - size_ = st; + augmentFont(font_, "lyxtex"); + mi_ = mi; + + if (defining()) { + mathed_string_dim(font_, name(), ascent_, descent_, width_); + return; + } + + if (editing()) { + expand(); + expanded_.metrics(mi_); width_ = expanded_.width() + 4; ascent_ = expanded_.ascent() + 2; descent_ = expanded_.descent() + 2; - width_ += mathed_string_width(LM_TC_TEXTRM, size_, name()) + 10; + width_ += mathed_string_width(font_, name()) + 10; int lasc; int ldes; int lwid; - mathed_string_dim(LM_TC_TEXTRM, size_, "#1: ", lasc, ldes, lwid); + mathed_string_dim(font_, "#1: ", lasc, ldes, lwid); for (idx_type i = 0; i < nargs(); ++i) { MathXArray const & c = xcell(i); - c.metrics(st); - width_ = std::max(width_, c.width() + lwid); - descent_ += std::max(c.ascent(), lasc) + 5; - descent_ += std::max(c.descent(), ldes) + 5; + c.metrics(mi_); + width_ = max(width_, c.width() + lwid); + descent_ += max(c.ascent(), lasc) + 5; + descent_ += max(c.descent(), ldes) + 5; } - } else { - expanded_ = tmplate_->xcell(0); - expanded_.data_.substitute(*this); - expanded_.metrics(st); - size_ = st; - width_ = expanded_.width() + 6; - ascent_ = expanded_.ascent() + 3; - descent_ = expanded_.descent() + 3; + return; } + + expand(); + expanded_.data().substitute(*this); + expanded_.metrics(mi_); + width_ = expanded_.width(); + ascent_ = expanded_.ascent(); + descent_ = expanded_.descent(); } -void MathMacro::draw(Painter & pain, int x, int y) const +void MathMacro::draw(MathPainterInfo & pi, int x, int y) const { - xo(x); - yo(y); + metrics(mi_); - metrics(size()); + LyXFont texfont; + augmentFont(texfont, "lyxtex"); - //LColor::color col; - - if (mathcursor && mathcursor->isInside(this)) { + if (defining()) { + drawStr(pi, texfont, x, y, name()); + return; + } + if (editing()) { int h = y - ascent() + 2 + expanded_.ascent(); - drawStr(pain, LM_TC_TEXTRM, size(), x + 3, h, name()); + drawStr(pi, font_, x + 3, h, name()); - int const w = mathed_string_width(LM_TC_TEXTRM, size(), name()); - expanded_.draw(pain, x + w + 12, h); + int const w = mathed_string_width(font_, name()); + expanded_.draw(pi, x + w + 12, h); h += expanded_.descent(); int lasc; int ldes; int lwid; - mathed_string_dim(LM_TC_TEXTRM, size_, "#1: ", lasc, ldes, lwid); + mathed_string_dim(font_, "#1: ", lasc, ldes, lwid); for (idx_type i = 0; i < nargs(); ++i) { MathXArray const & c = xcell(i); - h += std::max(c.ascent(), lasc) + 5; - c.draw(pain, x + lwid, h); + h += max(c.ascent(), lasc) + 5; + c.draw(pi, x + lwid, h); char str[] = "#1:"; str[1] += static_cast(i); - drawStr(pain, LM_TC_TEX, size(), x + 3, h, str); - h += std::max(c.descent(), ldes) + 5; + drawStr(pi, texfont, x + 3, h, str); + h += max(c.descent(), ldes) + 5; } - //col = LColor::red; - } else { - expanded_.draw(pain, x + 3, y); - //col = LColor::black; + return; } - //if (nargs() > 0) - // pain.rectangle(x + 1, y - ascent() + 1, width() - 2, height() - 2, col); + expanded_.draw(pi, x, y); } @@ -139,62 +161,83 @@ void MathMacro::dump() const MathMacroTable::dump(); lyxerr << "\n macro: '" << this << "'\n"; lyxerr << " name: '" << name() << "'\n"; - lyxerr << " template: '" << tmplate_ << "'\n"; - lyxerr << " template: '" << *tmplate_ << "'\n"; - lyxerr << endl; + lyxerr << " template: '"; + WriteStream wi(lyxerr); + tmplate_->write(wi); + lyxerr << "'\n"; } -void MathMacro::write(std::ostream & os, bool fragile) const + +bool MathMacro::idxUpDown(idx_type & idx, bool up) const { - os << '\\' << name(); - for (idx_type i = 0; i < nargs(); ++i) { - os << '{'; - cell(i).write(os, fragile); - os << '}'; - } - if (nargs() == 0) - os << ' '; + pos_type pos; + return + up ? MathNestInset::idxLeft(idx, pos) : MathNestInset::idxRight(idx, pos); } -void MathMacro::writeNormal(std::ostream & os) const +bool MathMacro::idxLeft(idx_type &, pos_type &) const { - os << "[macro " << name() << " "; - for (idx_type i = 0; i < nargs(); ++i) { - cell(i).writeNormal(os); - os << ' '; - } - os << "] "; + return false; } -bool MathMacro::idxUp(idx_type & idx, pos_type & pos) const +bool MathMacro::idxRight(idx_type &, pos_type &) const { - return MathNestInset::idxLeft(idx, pos); + return false; } -bool MathMacro::idxDown(idx_type & idx, pos_type & pos) const +void MathMacro::validate(LaTeXFeatures & features) const { - return MathNestInset::idxRight(idx, pos); + if (name() == "binom" || name() == "mathcircumflex") + features.require(name()); + //MathInset::validate(features); } -bool MathMacro::idxLeft(idx_type &, pos_type &) const +void MathMacro::maplize(MapleStream & os) const { - return false; + updateExpansion(); + ::maplize(expanded_.data(), os); } -bool MathMacro::idxRight(idx_type &, pos_type &) const +void MathMacro::mathmlize(MathMLStream & os) const { - return false; + updateExpansion(); + ::mathmlize(expanded_.data(), os); } -void MathMacro::validate(LaTeXFeatures & features) const +void MathMacro::octavize(OctaveStream & os) const { - if (name() == "binom") - features.binom = true; - //MathInset::validate(features); + updateExpansion(); + ::octavize(expanded_.data(), os); +} + + +void MathMacro::normalize(NormalStream & os) const +{ + os << "[macro " << name() << " "; + for (idx_type i = 0; i < nargs(); ++i) + os << cell(i) << ' '; + os << ']'; +} + + +void MathMacro::write(WriteStream & os) const +{ + os << '\\' << name(); + for (idx_type i = 0; i < nargs(); ++i) + os << '{' << cell(i) << '}'; + if (nargs() == 0) + os << ' '; +} + + +void MathMacro::updateExpansion() const +{ + expand(); + expanded_.data().substitute(*this); }