using std::vector;
-/// This class is the value of a macro argument, technically
+/// This class is the value of a macro argument, technically
/// a wrapper of the cells of MathMacro.
class MathMacroArgumentValue : public InsetMath {
public:
///
- MathMacroArgumentValue(MathMacro const & mathMacro, size_t idx)
+ MathMacroArgumentValue(MathMacro const & mathMacro, size_t idx)
: mathMacro_(mathMacro), idx_(idx) {}
///
bool metrics(MetricsInfo & mi, Dimension & dim) const;
///
void draw(PainterInfo &, int x, int y) const;
-
+ ///
+ int kerning() const { return mathMacro_.cell(idx_).kerning(); }
+
private:
std::auto_ptr<Inset> doClone() const;
MathMacro const & mathMacro_;
};
-auto_ptr<Inset> MathMacroArgumentValue::doClone() const
+auto_ptr<Inset> MathMacroArgumentValue::doClone() const
{
return auto_ptr<Inset>(new MathMacroArgumentValue(*this));
}
-bool MathMacroArgumentValue::metrics(MetricsInfo & mi, Dimension & dim) const
+bool MathMacroArgumentValue::metrics(MetricsInfo & mi, Dimension & dim) const
{
// unlock outer macro in arguments, and lock it again later
MacroData const & macro = MacroTable::globalMacros().get(mathMacro_.name());
macro.unlock();
mathMacro_.cell(idx_).metrics(mi, dim);
macro.lock();
- metricsMarkers2(dim);
if (dim_ == dim)
return false;
dim_ = dim;
}
-void MathMacroArgumentValue::draw(PainterInfo & pi, int x, int y) const
+void MathMacroArgumentValue::draw(PainterInfo & pi, int x, int y) const
{
// unlock outer macro in arguments, and lock it again later
MacroData const & macro = MacroTable::globalMacros().get(mathMacro_.name());
bool MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
{
+ kerning_ = 0;
if (!MacroTable::globalMacros().has(name())) {
mathed_string_dim(mi.base.font, "Unknown: " + name(), dim);
} else {
MacroData const & macro = MacroTable::globalMacros().get(name());
-
+
if (macroBackup_ != macro)
updateExpansion();
-
+
if (macro.locked()) {
mathed_string_dim(mi.base.font, "Self reference: " + name(), dim);
} else if (editing(mi.base.bv)) {
macro.lock();
expanded_.metrics(mi, dim);
macro.unlock();
+ kerning_ = expanded_.kerning();
editing_ = false;
}
}
- metricsMarkers2(dim);
if (dim_ == dim)
return false;
dim_ = dim;
drawStrRed(pi, x, y, "Unknown: " + name());
} else {
MacroData const & macro = MacroTable::globalMacros().get(name());
-
+
// warm up cache
for (size_t i = 0; i < nargs(); ++i)
cell(i).setXY(*pi.base.bv, x, y);
-
+
if (macro.locked()) {
// FIXME UNICODE
drawStrRed(pi, x, y, "Self reference: " + name());
expanded_.draw(pi, x, y);
macro.unlock();
}
-
- // edit mode changed?
+
+ // edit mode changed?
if (editing_ != editing(pi.base.bv) || macroBackup_ != macro)
pi.base.bv->cursor().updateFlags(Update::Force);
}
- drawMarkers2(pi, x, y);
}
}
-bool MathMacro::idxFirst(Cursor & cur) const
+bool MathMacro::idxFirst(Cursor & cur) const
{
cur.updateFlags(Update::Force);
return InsetMathNest::idxFirst(cur);
}
-bool MathMacro::idxLast(Cursor & cur) const
+bool MathMacro::idxLast(Cursor & cur) const
{
cur.updateFlags(Update::Force);
return InsetMathNest::idxLast(cur);
}
+bool MathMacro::idxUpDown(Cursor & cur, bool up) const
+{
+ if (up) {
+ if (cur.idx() == 0)
+ return false;
+ --cur.idx();
+ } else {
+ if (cur.idx() + 1 >= nargs())
+ return false;
+ ++cur.idx();
+ }
+ cur.pos() = cell(cur.idx()).x2pos(cur.x_target());
+ return true;
+}
+
+
bool MathMacro::notifyCursorLeaves(Cursor & cur)
{
cur.updateFlags(Update::Force);
void MathMacro::updateExpansion() const
{
MacroData const & macro = MacroTable::globalMacros().get(name());
-
+
// create MathMacroArgumentValue object pointing to the cells of the macro
vector<MathData> values(nargs());
- for (size_t i = 0; i != nargs(); ++i)
+ for (size_t i = 0; i != nargs(); ++i)
values[i].insert(0, MathAtom(new MathMacroArgumentValue(*this, i)));
macro.expand(values, expanded_);
asArray(macro.def(), tmpl_);