+void InsetLabel::initView()
+{
+ // This seems to be used only for inset creation.
+ // Therefore we do not update refs here, since this would
+ // erroneously change refs from existing duplicate labels
+ // (#8141).
+ updateLabel(getParam("name"));
+}
+
+
+void InsetLabel::uniqueLabel(docstring & label) const
+{
+ docstring const new_label = label;
+ int i = 1;
+ while (buffer().insetLabel(label)) {
+ label = new_label + '-' + convert<docstring>(i);
+ ++i;
+ }
+ if (label != new_label) {
+ // Warn the user that the label has been changed to something else.
+ frontend::Alert::warning(_("Label names must be unique!"),
+ bformat(_("The label %1$s already exists,\n"
+ "it will be changed to %2$s."), new_label, label));
+ }
+}
+
+
+void InsetLabel::updateLabel(docstring const & new_label)
+{
+ docstring label = new_label;
+ uniqueLabel(label);
+ setParam("name", label);
+}
+
+
+void InsetLabel::updateLabelAndRefs(docstring const & new_label,
+ Cursor * cursor)
+{
+ docstring const old_label = getParam("name");
+ docstring label = new_label;
+ uniqueLabel(label);
+ if (label == old_label)
+ return;
+
+ buffer().undo().beginUndoGroup();
+ 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();
+ mi->changeTarget(new_label);
+ } else {
+ InsetCommand * ref = it->first->asInsetCommand();
+ ref->setParam("reference", new_label);
+ }
+ }
+}
+
+