#include "CutAndPaste.h"
+#include "BranchList.h"
#include "Buffer.h"
#include "buffer_funcs.h"
#include "BufferList.h"
#include "ParIterator.h"
#include "Undo.h"
-#include "insets/InsetFlex.h"
+#include "insets/InsetBranch.h"
#include "insets/InsetCommand.h"
+#include "insets/InsetFlex.h"
#include "insets/InsetGraphics.h"
#include "insets/InsetGraphicsParams.h"
#include "insets/InsetInclude.h"
#include "support/limited_stack.h"
#include "support/lstrings.h"
+#include "frontends/alert.h"
#include "frontends/Clipboard.h"
#include "frontends/Selection.h"
break;
}
+ case BRANCH_CODE: {
+ // check if branch is known to target buffer
+ // or its master
+ InsetBranch & br = static_cast<InsetBranch &>(*it);
+ docstring const name = br.branch();
+ if (name.empty())
+ break;
+ bool const is_child = (&buffer != buffer.masterBuffer());
+ BranchList branchlist = buffer.params().branchlist();
+ if ((!is_child && branchlist.find(name))
+ || (is_child && (branchlist.find(name)
+ || buffer.masterBuffer()->params().branchlist().find(name))))
+ break;
+ // FIXME: add an option to add the branch to the master's BranchList.
+ docstring text = bformat(
+ _("The pasted branch \"%1$s\" is undefined.\n"
+ "Do you want to add it to the document's branch list?"),
+ name);
+ if (frontend::Alert::prompt(_("Unknown branch"),
+ text, 0, 1, _("&Add"), _("&Don't Add")) != 0)
+ break;
+ lyx::dispatch(FuncRequest(LFUN_BRANCH_ADD, name));
+ break;
+ }
+
default:
break; // nothing
}
ParagraphList::iterator it_end = copy_pars.end();
for (; it != it_end; it++) {
- // 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)
- it->changeLanguage(buf.params(), latex_language, buf.language());
-
- it->setInsetOwner(0);
+ // Since we have a copy of the paragraphs, the insets
+ // do not have a proper buffer reference. It makes
+ // sense to add them temporarily, because the
+ // operations below depend on that (acceptChanges included).
+ it->setBuffer(const_cast<Buffer &>(buf));
+ // PassThru paragraphs have the Language
+ // latex_language. This is invalid for others, so we
+ // need to change it to the buffer language.
+ if (it->inInset().getLayout().isPassThru())
+ it->changeLanguage(buf.params(),
+ latex_language, buf.language());
}
- // do not copy text (also nested in insets) which is marked as deleted,
- // unless the whole selection was deleted
+ // 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());
+
+ // do some final cleanup now, to make sure that the paragraphs
+ // are not linked to something else.
+ it = copy_pars.begin();
+ for (; it != it_end; it++) {
+ it->setBuffer(*static_cast<Buffer *>(0));
+ it->setInsetOwner(0);
+ }
+
DocumentClass * d = const_cast<DocumentClass *>(dc);
cutstack.push(make_pair(copy_pars, d));
}
// character styles
InsetIterator const i_end = inset_iterator_end(in);
for (InsetIterator it = inset_iterator_begin(in); it != i_end; ++it) {
- InsetCollapsable * inset = it->asInsetCollapsable();
- if (!inset)
- continue;
- if (inset->lyxCode() != FLEX_CODE)
+ if (it->lyxCode() != FLEX_CODE)
// FIXME: Should we verify all InsetCollapsable?
continue;
- inset->setLayout(newone);
- if (!inset->undefined())
+ if (!it->undefined())
continue;
// The flex inset is undefined in newtc
docstring const s = bformat(_(
"Flex inset %1$s is "
"undefined because of class "
"conversion from\n%2$s to %3$s"),
- inset->name(), from_utf8(oldtc.name()),
+ it->name(), from_utf8(oldtc.name()),
from_utf8(newtc.name()));
// To warn the user that something had to be done.
errorlist.push_back(ErrorItem(
copySelectionHelper(*cur.buffer(), pars, par, cur.selEnd().pit(),
pos, cur.selEnd().pos(),
cur.buffer()->params().documentClassPtr(), cutstack);
+
+ // Reset the dirty_tabular_stack_ flag only when something
+ // is copied to the clipboard (not to the selectionBuffer).
if (&cutstack == &theCuts)
dirtyTabularStack(false);
}