if (label == old_label)
return;
- buffer().undo().beginUndoGroup();
+ // This handles undo groups automagically
+ UndoGroupHelper ugh(&buffer());
if (cursor)
cursor->recordUndo();
setParam("name", label);
updateReferences(old_label, label);
- buffer().undo().endUndoGroup();
}
void InsetLabel::updateReferences(docstring const & old_label,
docstring const & new_label)
{
- Buffer::References const & refs = buffer().references(old_label);
- Buffer::References::const_iterator it = refs.begin();
- Buffer::References::const_iterator end = refs.end();
- for (; it != end; ++it) {
- buffer().undo().recordUndo(CursorData(it->second));
- if (it->first->lyxCode() == MATH_REF_CODE) {
- InsetMathRef * mi = it->first->asInsetMath()->asRefInset();
+ UndoGroupHelper ugh;
+ for (auto const & p: buffer().references(old_label)) {
+ ugh.resetBuffer(p.second.buffer());
+ CursorData(p.second).recordUndo();
+ if (p.first->lyxCode() == MATH_REF_CODE) {
+ InsetMathRef * mi = p.first->asInsetMath()->asRefInset();
mi->changeTarget(new_label);
} else {
- InsetCommand * ref = it->first->asInsetCommand();
+ InsetCommand * ref = p.first->asInsetCommand();
ref->setParam("reference", new_label);
}
}
if (utype == OutputUpdate) {
// save info on the active counter
- Counters const & cnts =
+ Counters const & cnts =
buffer().masterBuffer()->params().documentClass().counters();
active_counter_ = cnts.currentCounter();
Language const * lang = par->getParLanguage(buffer().params());
}
-void InsetLabel::addToToc(DocIterator const & cpit, bool output_active) const
+void InsetLabel::addToToc(DocIterator const & cpit, bool output_active,
+ UpdateType, TocBackend & backend) const
{
docstring const & label = getParam("name");
- Toc & toc = buffer().tocBackend().toc("label");
+ shared_ptr<Toc> toc = backend.toc("label");
if (buffer().insetLabel(label) != this) {
- toc.push_back(TocItem(cpit, 0, screen_label_, output_active));
- return;
- }
- toc.push_back(TocItem(cpit, 0, screen_label_, output_active));
- Buffer::References const & refs = buffer().references(label);
- Buffer::References::const_iterator it = refs.begin();
- Buffer::References::const_iterator end = refs.end();
- for (; it != end; ++it) {
- DocIterator const ref_pit(it->second);
- if (it->first->lyxCode() == MATH_REF_CODE)
- toc.push_back(TocItem(ref_pit, 1,
- it->first->asInsetMath()->asRefInset()->screenLabel(),
- output_active));
- else
- toc.push_back(TocItem(ref_pit, 1,
- static_cast<InsetRef *>(it->first)->screenLabel(),
- output_active));
+ toc->push_back(TocItem(cpit, 0, screen_label_, output_active));
+ } else {
+ toc->push_back(TocItem(cpit, 0, screen_label_, output_active));
+ for (auto const & p : buffer().references(label)) {
+ DocIterator const ref_pit(p.second);
+ if (p.first->lyxCode() == MATH_REF_CODE)
+ toc->push_back(TocItem(ref_pit, 1,
+ p.first->asInsetMath()->asRefInset()->screenLabel(),
+ output_active));
+ else
+ toc->push_back(TocItem(ref_pit, 1,
+ static_cast<InsetRef *>(p.first)->getTOCString(),
+ output_active));
+ }
}
}
case LFUN_LABEL_COPY_AS_REFERENCE:
enabled = true;
break;
+ case LFUN_INSET_MODIFY:
+ if (cmd.getArg(0) == "changetype") {
+ // this is handled by InsetCommand,
+ // but not by InsetLabel.
+ enabled = false;
+ break;
+ }
+ // no "changetype":
+ // fall through
default:
return InsetCommand::getStatus(cur, cmd, status);
}
{
// FIXME XHTML
// Unfortunately, the name attribute has been deprecated, so we have to use
- // id here to get the document to validate as XHTML 1.1. This will cause a
+ // id here to get the document to validate as XHTML 1.1. This will cause a
// problem with some browsers, though, I'm sure. (Guess which!) So we will
- // have to figure out what to do about this later.
- string const attr = "id=\"" + html::cleanAttr(to_utf8(getParam("name"))) + "\"";
- xs << html::CompTag("a", attr);
+ // have to figure out what to do about this later.
+ docstring const attr = "id=\"" + html::cleanAttr(getParam("name")) + '"';
+ xs << html::CompTag("a", to_utf8(attr));
return docstring();
}