- if (updaterefs) {
- Buffer::References & refs = buffer().references(old_label);
- Buffer::References::iterator it = refs.begin();
- Buffer::References::iterator end = refs.end();
- for (; it != end; ++it) {
- buffer().undo().recordUndo(it->second);
- it->first->setParam("reference", label);
+ // This handles undo groups automagically
+ UndoGroupHelper ugh(&buffer());
+ if (cursor)
+ cursor->recordUndo();
+ bool const changes = buffer().masterParams().track_changes;
+ if (changes) {
+ // With change tracking, we insert a new label and
+ // delete the old one
+ InsetCommandParams p(LABEL_CODE, "label");
+ p["name"] = label;
+ string const data = InsetCommand::params2string(p);
+ lyx::dispatch(FuncRequest(LFUN_INSET_INSERT, data));
+ lyx::dispatch(FuncRequest(LFUN_CHAR_DELETE_FORWARD));
+ } else
+ setParam("name", label);
+ updateReferences(old_label, label, changes);
+}
+
+
+void InsetLabel::updateReferences(docstring const & old_label,
+ docstring const & new_label, bool const changes)
+{
+ UndoGroupHelper ugh(nullptr);
+ if (changes) {
+ // With change tracking, we insert a new ref and
+ // delete the old one
+ lyx::dispatch(FuncRequest(LFUN_MASTER_BUFFER_FORALL,
+ "inset-forall Ref inset-modify ref changetarget "
+ + old_label + " " + new_label));
+ } else {
+ 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 = p.first->asInsetCommand();
+ ref->setParam("reference", new_label);
+ }