MathData::MathData(Buffer * buf, const_iterator from, const_iterator to)
- : base_type(from, to), buffer_(buf)
+ : base_type(from, to), minasc_(0), mindes_(0), slevel_(0),
+ sshift_(0), kerning_(0), buffer_(buf)
{}
dim.asc = 0;
dim.wid = 0;
Dimension d;
- CoordCacheBase<Inset> & coords = mi.base.bv->coordCache().insets();
+ CoordCache::Insets & coords = mi.base.bv->coordCache().insets();
for (pos_type i = 0, n = size(); i != n; ++i) {
MathAtom const & at = operator[](i);
at->metrics(mi, d);
continue;
FontInfo font = mi.base.font;
- augmentFont(font, from_ascii("mathnormal"));
+ augmentFont(font, "mathnormal");
dim.wid += mathed_string_width(font, completion);
}
// Cache the dimension.
if (inlineCompletionPos.inMathed())
inlineCompletionData = &inlineCompletionPos.cell();
- CoordCacheBase<Inset> & coords = pi.base.bv->coordCache().insets();
+ CoordCache::Insets & coords = pi.base.bv->coordCache().insets();
for (size_t i = 0, n = size(); i != n; ++i) {
MathAtom const & at = operator[](i);
coords.add(at.nucleus(), x, y);
if (completion.length() == 0)
continue;
FontInfo f = pi.base.font;
- augmentFont(f, from_ascii("mathnormal"));
+ augmentFont(f, "mathnormal");
// draw the unique and the non-unique completion part
// Note: this is not time-critical as it is
if (oldDisplayMode == MathMacro::DISPLAY_NORMAL
&& (macroInset->arity() != macroNumArgs
|| macroInset->optionals() != macroOptionals
- || newDisplayMode == MathMacro::DISPLAY_UNFOLDED)) {
-
+ || newDisplayMode == MathMacro::DISPLAY_UNFOLDED))
detachMacroParameters(cur, i);
- // FIXME: proper anchor handling, this removes the selection
- if (cur)
- cur->clearSelection();
- }
// the macro could have been copied while resizing this
macroInset = operator[](i).nucleus()->asMacro();
attachMacroParameters(cur, i, macroNumArgs, macroOptionals,
fromInitToNormalMode, interactive, appetite);
- if (cur) {
- // FIXME: proper anchor handling, this removes the selection
+ if (cur)
cur->updateInsets(&cur->bottom().inset());
- cur->clearSelection();
- }
}
// Give macro the chance to adapt to new situation.
void MathData::detachMacroParameters(DocIterator * cur, const size_type macroPos)
{
MathMacro * macroInset = operator[](macroPos).nucleus()->asMacro();
+ // We store this now, because the inset pointer will be invalidated in the scond loop below
+ size_t const optionals = macroInset->optionals();
// detach all arguments
vector<MathData> detachedArgs;
// only [] after the last non-empty argument can be dropped later
size_t lastNonEmptyOptional = 0;
- for (size_t l = 0; l < detachedArgs.size() && l < macroInset->optionals(); ++l) {
+ for (size_t l = 0; l < detachedArgs.size() && l < optionals; ++l) {
if (!detachedArgs[l].empty())
lastNonEmptyOptional = l;
}
// optional arguments to be put back?
pos_type p = macroPos + 1;
size_t j = 0;
- for (; j < detachedArgs.size() && j < macroInset->optionals(); ++j) {
+ // We do not want to use macroInset below, the insert() call in
+ // the loop will invalidate it.
+ macroInset = 0;
+ for (; j < detachedArgs.size() && j < optionals; ++j) {
// another non-empty parameter follows?
bool canDropEmptyOptional = j >= lastNonEmptyOptional;
int MathData::pos2x(BufferView const * bv, size_type pos) const
-{
- return pos2x(bv, pos, 0);
-}
-
-
-int MathData::pos2x(BufferView const * bv, size_type pos, int glue) const
{
int x = 0;
size_type target = min(pos, size());
- CoordCacheBase<Inset> const & coords = bv->coordCache().getInsets();
+ CoordCache::Insets const & coords = bv->coordCache().getInsets();
for (size_type i = 0; i < target; ++i) {
const_iterator it = begin() + i;
- if ((*it)->getChar() == ' ')
- x += glue;
//lyxerr << "char: " << (*it)->getChar()
// << "width: " << (*it)->width() << endl;
x += coords.dim((*it).nucleus()).wid;
MathData::size_type MathData::x2pos(BufferView const * bv, int targetx) const
-{
- return x2pos(bv, targetx, 0);
-}
-
-
-MathData::size_type MathData::x2pos(BufferView const * bv, int targetx, int glue) const
{
const_iterator it = begin();
int lastx = 0;
int currx = 0;
- CoordCacheBase<Inset> const & coords = bv->coordCache().getInsets();
+ CoordCache::Insets const & coords = bv->coordCache().getInsets();
// find first position after targetx
for (; currx < targetx && it != end(); ++it) {
lastx = currx;
- if ((*it)->getChar() == ' ')
- currx += glue;
currx += coords.dim((*it).nucleus()).wid;
}