add label/refs validation on pasting.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23407 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Spitzmüller 2008-03-03 09:35:26 +00:00
parent eef138f77b
commit ffc4554815
4 changed files with 42 additions and 15 deletions

View File

@ -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 (; 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));
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;
}
default:
break; // nothing
}
}
insertion.swap(in.paragraphs());

View File

@ -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:
///

View File

@ -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().

View File

@ -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);
};