#include "Undo.h"
#include "insets/InsetFlex.h"
+#include "insets/InsetCommand.h"
#include "insets/InsetGraphics.h"
#include "insets/InsetGraphicsParams.h"
#include "insets/InsetTabular.h"
// A couple of insets store buffer references so need updating.
insertion.swap(in.paragraphs());
- ParIterator fpit = par_iterator_begin(in);
- ParIterator fend = par_iterator_end(in);
+ InsetIterator const i_end = inset_iterator_end(in);
+
+ for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) {
+
+ it->setBuffer(const_cast<Buffer &>(buffer));
+
+ switch (it->lyxCode()) {
+
+ case LABEL_CODE: {
+ // check for duplicates
+ InsetCommand & lab = static_cast<InsetCommand &>(*it);
+ docstring const oldname = lab.getParam("name");
+ lab.update(oldname, false);
+ docstring const newname = lab.getParam("name");
+ if (oldname != newname) {
+ // adapt the references
+ for (InsetIterator itt = inset_iterator_begin(in); itt != i_end; ++itt) {
+ if (itt->lyxCode() == REF_CODE) {
+ InsetCommand & ref = dynamic_cast<InsetCommand &>(*itt);
+ if (ref.getParam("reference") == oldname)
+ ref.setParam("reference", newname);
+ }
+ }
+ }
+ break;
+ }
- for (; fpit != fend; ++fpit) {
- InsetList::const_iterator it = fpit->insetList().begin();
- InsetList::const_iterator et = fpit->insetList().end();
- for (; it != et; ++it)
- it->inset->setBuffer(const_cast<Buffer &>(buffer));
+ default:
+ break; // nothing
+ }
}
insertion.swap(in.paragraphs());
/// Whether this is a command this inset can represent.
/// Not implemented here. Must be implemented in derived class.
static bool isCompatibleCommand(std::string const & cmd);
+ /// update label and references. Currently used by InsetLabel.
+ virtual void update(docstring const &, bool) {};
protected:
///
}
-void InsetLabel::update(docstring const & new_label)
+void InsetLabel::update(docstring const & new_label, bool updaterefs)
{
docstring const old_label = getParam("name");
docstring label = new_label;
setParam("name", 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)
- it->first->setParam("reference", label);
+ if (updaterefs) {
+ 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)
+ it->first->setParam("reference", label);
+ }
// We need an update of the Buffer reference cache. This is achieved by
// updateLabel().
void updateLabels(ParIterator const & it);
///
void addToToc(ParConstIterator const &) const;
+ ///
+ void update(docstring const & new_label, bool updaterefs = true);
protected:
///
void doDispatch(Cursor & cur, FuncRequest & cmd);
private:
///
Inset * clone() const { return new InsetLabel(*this); }
- ///
- void update(docstring const & new_label);
};