+ ++last_paste;
+ }
+ }
+
+ return make_pair(PitPosPair(pit, pos), last_paste + 1);
+}
+
+
+PitPosPair eraseSelectionHelper(BufferParams const & params,
+ ParagraphList & pars,
+ pit_type startpit, pit_type endpit,
+ int startpos, int endpos, bool doclear)
+{
+ // Start of selection is really invalid.
+ if (startpit == pit_type(pars.size()) ||
+ (startpos > pars[startpit].size()))
+ return PitPosPair(endpit, endpos);
+
+ // Start and end is inside same paragraph
+ if (endpit == pit_type(pars.size()) || startpit == endpit) {
+ endpos -= pars[startpit].eraseChars(startpos, endpos, params.trackChanges);
+ return PitPosPair(endpit, endpos);
+ }
+
+ // A paragraph break has to be physically removed by merging, but
+ // only if either (1) change tracking is off, or (2) the para break
+ // is "blue"
+ for (pit_type pit = startpit; pit != endpit + 1;) {
+ // FIXME: Change tracking (MG)
+ bool const merge = !params.trackChanges ||
+ pars[pit].isInserted(pars[pit].size());
+ pos_type const left = ( pit == startpit ? startpos : 0 );
+ pos_type const right = ( pit == endpit ? endpos :
+ pars[pit].size() + 1 );
+ // Logical erase only:
+ pars[pit].eraseChars(left, right, false);
+ // Separate handling of para break:
+ if (merge && pit != endpit &&
+ (pit + 1 != endpit || pars[pit].hasSameLayout(pars[pit + 1]))) {
+ pos_type const thissize = pars[pit].size();
+ if (doclear)
+ pars[pit + 1].stripLeadingSpaces();
+ mergeParagraph(params, pars, pit);
+ --endpit;
+ if (pit == endpit)
+ endpos += thissize;
+ } else
+ ++pit;
+ }
+
+ // Ensure legal cursor pos:
+ endpit = startpit;
+ endpos = startpos;
+ return PitPosPair(endpit, endpos);
+}
+
+
+void copySelectionHelper(Buffer const & buf, ParagraphList & pars,
+ pit_type startpit, pit_type endpit,
+ int start, int end, textclass_type tc)
+{
+ BOOST_ASSERT(0 <= start && start <= pars[startpit].size());
+ BOOST_ASSERT(0 <= end && end <= pars[endpit].size());
+ BOOST_ASSERT(startpit != endpit || start <= end);
+
+ // Clone the paragraphs within the selection.
+ ParagraphList paragraphs(boost::next(pars.begin(), startpit),
+ boost::next(pars.begin(), endpit + 1));
+
+ ParagraphList::iterator it = paragraphs.begin();
+ ParagraphList::iterator it_end = paragraphs.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() == InsetBase::ERT_CODE) {
+ it->changeLanguage(buf.params(), latex_language,
+ buf.getLanguage());
+ }
+ it->setInsetOwner(0);