void MacroData::expand(vector<MathData> const & args, MathData & to) const { updateData(); // Hack. Any inset with a cell would do. static InsetMathSqrt inset(0); inset.setBuffer(const_cast<Buffer &>(*buffer_)); // FIXME UNICODE asArray(display_.empty() ? definition_ : display_, inset.cell(0)); //lyxerr << "MathData::expand: args: " << args << endl; //lyxerr << "MathData::expand: ar: " << inset.cell(0) << endl; for (DocIterator it = doc_iterator_begin(buffer_, &inset); it; it.forwardChar()) { if (!it.nextInset()) continue; if (it.nextInset()->lyxCode() != MATH_MACROARG_CODE) continue; //it.cell().erase(it.pos()); //it.cell().insert(it.pos(), it.nextInset()->asInsetMath() size_t n = static_cast<MathMacroArgument*>(it.nextInset())->number(); if (n <= args.size()) { it.cell().erase(it.pos()); it.cell().insert(it.pos(), args[n - 1]); } } //lyxerr << "MathData::expand: res: " << inset.cell(0) << endl; to = inset.cell(0); }
void Undo::Private::doRecordUndo(UndoKind kind, DocIterator const & cell, pit_type first_pit, pit_type last_pit, CursorData const & cur_before, bool isFullBuffer, UndoElementStack & stack) { if (!group_level) { LYXERR0("There is no group open (creating one)"); ++group_id; } if (first_pit > last_pit) swap(first_pit, last_pit); // Undo::ATOMIC are always recorded (no overlapping there). // As nobody wants all removed character appear one by one when undoing, // we want combine 'similar' non-ATOMIC undo recordings to one. pit_type from = first_pit; pit_type end = cell.lastpit() - last_pit; if (!undo_finished_ && kind != ATOMIC_UNDO && !stack.empty() && samePar(stack.top().cell, cell) && stack.top().kind == kind && stack.top().from == from && stack.top().end == end) { // reset cur_after; it will be filled correctly by endUndoGroup. stack.top().cur_after = CursorData(); return; } if (isFullBuffer) LYXERR(Debug::UNDO, "Create full buffer undo element of group " << group_id); else LYXERR(Debug::UNDO, "Create undo element of group " << group_id); // create the position information of the Undo entry UndoElement undo(kind, cur_before, cell, from, end, 0, 0, buffer_.params(), isFullBuffer, buffer_.isClean(), group_id); // fill in the real data to be saved if (cell.inMathed()) { // simply use the whole cell MathData & ar = cell.cell(); undo.array = new MathData(ar.buffer(), ar.begin(), ar.end()); } else { // some more effort needed here as 'the whole cell' of the // main Text _is_ the whole document. // record the relevant paragraphs Text const * text = cell.text(); LBUFERR(text); ParagraphList const & plist = text->paragraphs(); ParagraphList::const_iterator first = plist.begin(); advance(first, first_pit); ParagraphList::const_iterator last = plist.begin(); advance(last, last_pit + 1); undo.pars = new ParagraphList(first, last); } // push the undo entry to undo stack stack.push(undo); //lyxerr << "undo record: " << stack.top() << endl; }