lyx_mirror/src/mathed/InsetMathXYArrow.cpp
Guillaume Munch e2bc7ffae3 RefChanger
RefChanger temporarily assigns a value to a non-const reference of any
kind. RefChanger provides a flexible and uniform generalisation of the various
scope guards previously derived from the old Changer class in MetricsInfo.h.

As before, a temporary assignment lasts as long as the Changer object lives. But
the new Changer is movable. In particular, contorsions are no longer needed to
change a private field. Special code can be moved into the appropriate classes,
and it is no longer necessary to create a new class for each specific use.

Syntax change:

   FontSetChanger dummy(mi.base, value);
-> Changer dummy = mi.base.changeFontSet(value);

New function for generating arbitrary Changers:

  Changer dummy = make_change(ref, val, condition);

Bugfix:

* Fix the display of \displaystyle{\substack{\frac{xyz}{}}} (missing style
  change).
2016-06-13 08:46:15 +01:00

173 lines
3.3 KiB
C++

/**
* \file InsetMathXYArrow.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "InsetMathXYArrow.h"
#include "MathStream.h"
#include "MathSupport.h"
#include "frontends/Painter.h"
#include "support/debug.h"
using namespace std;
namespace lyx {
InsetMathXYArrow::InsetMathXYArrow()
: InsetMathNest(2), up_(false), target_(0)
{}
Inset * InsetMathXYArrow::clone() const
{
return new InsetMathXYArrow(*this);
}
InsetMathXYMatrix const * InsetMathXYArrow::targetMatrix() const
{
return target_;
}
MathData const & InsetMathXYArrow::targetCell() const
{
#if 0
InsetMathXYMatrix const * p = targetMatrix();
int x = 0;
int y = 0;
MathData const & t = cell(0);
for (MathData::const_iterator it = t.begin(); it != t.end(); ++it) {
switch ((*it)->getChar()) {
case 'l': --x; break;
case 'r': ++x; break;
case 'u': --y; break;
case 'd': ++y; break;
}
}
//lyxerr << "target: x: " << x << " y: " << y << endl;
InsetMath::idx_type n = mi_.idx + p->ncols() * y + x;
if (n >= p->nargs()) {
lyxerr << "source: n: " << mi_.idx << "\n"
<< "target: n: " << n << " out of range" << endl;
n = 0;
}
return p->cell(n);
#else
static MathData dummy;
return dummy;
#endif
}
MathData const & InsetMathXYArrow::sourceCell() const
{
#if 0
return targetMatrix()->cell(mi_.idx);
#else
static MathData dummy;
return dummy;
#endif
}
bool InsetMathXYArrow::metrics(MetricsInfo & mi) const
{
InsetMathNest::metrics(mi);
mi_ = mi;
Changer dummy = mi.base.changeFontSet(mi.base, "textrm");
#if 0
target_ = mi.inset ? mi.inset->asXYMatrixInset() : 0;
if (editing()) {
int w = mathed_string_width(mi.base.font, from_ascii("target: "));
width_ = w + max(dim0.width(), dim1.wid);
ascent_ = dim0.asc;
descent_ = dim0.des + dim1.height() + 10;
} else {
width_ = 0;
ascent_ = 0;
descent_ = 0;
//mathed_string_dim(font_, "X", ascent_, descent_, width_);
}
#endif
}
void InsetMathXYArrow::draw(PainterInfo & pi, int x, int y) const
{
metrics(mi_);
Changer dummy = pi.base.changeFontSet(pi.base, "textrm");
if (editing()) {
#if 0
int lasc;
int ldes;
int lwid;
mathed_string_dim(pi.base.font, "target: ", lasc, ldes, lwid);
cell(0).draw(pi, x + lwid, y);
pi.base.text(x + 3, y, "target");
y += max(dim0.des, ldes) + 5;
y += max(dim1.asc, lasc) + 5;
cell(1).draw(pi, x + lwid, y);
pi.base.text(x + 3, y, "label");
#endif
} else {
pi.pain.text(x, y, "X");
MathData const & s = sourceCell();
MathData const & t = targetCell();
pi.pain.line(s.xm(), s.ym(), t.xm(), t.ym(), Color_math);
cell(1).draw(pi, (s.xm() + t.xm())/2, (s.ym() + t.ym())/2);
}
}
void InsetMathXYArrow::write(WriteStream & os) const
{
MathEnsurer ensurer(os);
os << "\\ar";
if (!cell(0).empty())
os << '[' << cell(0) << ']';
if (!cell(1).empty())
os << (up_ ? '^' : '_') << '{' << cell(1) << '}';
os << " ";
}
void InsetMathXYArrow::normalize(NormalStream & os) const
{
os << "[xyarrow ";
InsetMathNest::normalize(os);
os << ']';
}
void InsetMathXYArrow::mathmlize(MathStream &) const
{
throw MathExportException();
}
void InsetMathXYArrow::htmlize(HtmlStream &) const
{
throw MathExportException();
}
} // namespace lyx