InsetIterator const i_end = inset_iterator_end(in);
for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) {
- // Insets store buffer references so need updating.
+ // Even though this will also be done later, it has to be done here
+ // since, e.g., InsetLabel::updateCommand() is going to try to access
+ // the buffer() member.
it->setBuffer(const_cast<Buffer &>(buffer));
-
switch (it->lyxCode()) {
-
+
case LABEL_CODE: {
// check for duplicates
InsetCommand & lab = static_cast<InsetCommand &>(*it);
// merge the first par of the insertion with the current par
mergeParagraph(buffer.params(), pars, pit);
}
- //FIXME: We should call setBuffer() on each inserted paragraph.
- // instead, we call setBuffer() for the main inset at the beginning
- // of updateLabels()
-
- pit_type last_paste = pit + insertion.size() - 1;
// Store the new cursor position.
+ pit_type last_paste = pit + insertion.size() - 1;
+ pit_type startpit = pit;
pit = last_paste;
pos = pars[last_paste].size();
+ // FIXME Should we do it here, or should we let updateLabels() do it?
+ // Set paragraph buffers. It's important to do this right away
+ // before something calls Inset::buffer() and causes a crash.
+ for (pit_type p = startpit; p <= pit; ++p)
+ pars[p].setBuffer(const_cast<Buffer &>(buffer));
+
// Join (conditionally) last pasted paragraph with next one, i.e.,
// the tail of the spliced document paragraph
if (!empty && last_paste + 1 != pit_type(pars.size())) {
// ERT paragraphs have the Language latex_language.
// This is invalid outside of ERT, so we need to change it
// to the buffer language.
- if (it->ownerCode() == ERT_CODE || it->ownerCode() == LISTINGS_CODE) {
+ if (it->ownerCode() == ERT_CODE || it->ownerCode() == LISTINGS_CODE)
it->changeLanguage(buf.params(), latex_language, buf.language());
- }
+
it->setInsetOwner(0);
}
- // do not copy text (also nested in insets) which is marked as deleted
- acceptChanges(copy_pars, buf.params());
+ // do not copy text (also nested in insets) which is marked as deleted,
+ // unless the whole selection was deleted
+ if (!isFullyDeleted(copy_pars))
+ acceptChanges(copy_pars, buf.params());
DocumentClass * d = const_cast<DocumentClass *>(dc);
cutstack.push(make_pair(copy_pars, d));
copySelectionHelper(*cur.buffer(), pars, par, cur.selEnd().pit(),
pos, cur.selEnd().pos(),
cur.buffer()->params().documentClassPtr(), cutstack);
- dirtyTabularStack(false);
+
+ // Reset the dirty_tabular_stack_ flag only when something
+ // is copied to the clipboard (not to the selectionBuffer).
+ if (&cutstack == &theCuts)
+ dirtyTabularStack(false);
}
if (cur.inMathed()) {