From: Jürgen Spitzmüller Date: Mon, 3 Mar 2008 09:35:26 +0000 (+0000) Subject: add label/refs validation on pasting. X-Git-Tag: 1.6.10~5933 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=ffc4554815531a9039c027cdc9ade143c048ce86;p=features.git add label/refs validation on pasting. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23407 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 77652d611d..7e980ddd6a 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -37,6 +37,7 @@ #include "Undo.h" #include "insets/InsetFlex.h" +#include "insets/InsetCommand.h" #include "insets/InsetGraphics.h" #include "insets/InsetGraphicsParams.h" #include "insets/InsetTabular.h" @@ -212,14 +213,36 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, // 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)); + + switch (it->lyxCode()) { + + case LABEL_CODE: { + // check for duplicates + InsetCommand & lab = static_cast(*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(*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)); + default: + break; // nothing + } } insertion.swap(in.paragraphs()); diff --git a/src/insets/InsetCommand.h b/src/insets/InsetCommand.h index 96090bacb5..96e523a3ce 100644 --- a/src/insets/InsetCommand.h +++ b/src/insets/InsetCommand.h @@ -85,6 +85,8 @@ public: /// 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: /// diff --git a/src/insets/InsetLabel.cpp b/src/insets/InsetLabel.cpp index 606474b5d5..2f3f13d60e 100644 --- a/src/insets/InsetLabel.cpp +++ b/src/insets/InsetLabel.cpp @@ -49,7 +49,7 @@ void InsetLabel::validate() } -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; @@ -68,11 +68,13 @@ void InsetLabel::update(docstring const & 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(). diff --git a/src/insets/InsetLabel.h b/src/insets/InsetLabel.h index f051a38add..7fe8a0c290 100644 --- a/src/insets/InsetLabel.h +++ b/src/insets/InsetLabel.h @@ -53,14 +53,14 @@ public: 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); };