+ // merge the empty par with the last par of the insertion
+ mergeParagraph(buffer.params(), pars,
+ pit + insertion.size() - 1);
+ } else {
+ pars.insert(pars.begin() + pit + 1, insertion.begin(),
+ insertion.end());
+
+ // merge the first par of the insertion with the current par
+ mergeParagraph(buffer.params(), pars, pit);
+ }
+
+ pit_type last_paste = pit + insertion.size() - 1;
+
+ // Store the new cursor position.
+ pit = last_paste;
+ pos = pars[last_paste].size();
+
+ // Maybe some pasting.
+ if (!empty && last_paste + 1 != pit_type(pars.size())) {
+ if (pars[last_paste + 1].hasSameLayout(pars[last_paste])) {
+ mergeParagraph(buffer.params(), pars, last_paste);
+ } else if (pars[last_paste + 1].empty()) {
+ pars[last_paste + 1].makeSameLayout(pars[last_paste]);
+ mergeParagraph(buffer.params(), pars, last_paste);
+ } else if (pars[last_paste].empty()) {
+ pars[last_paste].makeSameLayout(pars[last_paste + 1]);
+ mergeParagraph(buffer.params(), pars, last_paste);
+ } else {
+ pars[last_paste + 1].stripLeadingSpaces();
+ ++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)
+{
+ if (startpit == pit_type(pars.size()) ||
+ (startpos > pars[startpit].size()))
+ return PitPosPair(endpit, endpos);
+
+ if (endpit == pit_type(pars.size()) ||
+ startpit == endpit) {
+ endpos -= pars[startpit].erase(startpos, endpos);
+ return PitPosPair(endpit, endpos);
+ }
+
+ // clear end/begin fragments of the first/last par in selection
+ bool all_erased = true;
+
+ pars[startpit].erase(startpos, pars[startpit].size());
+ if (pars[startpit].size() != startpos)
+ all_erased = false;
+
+ endpos -= pars[endpit].erase(0, endpos);
+ if (endpos != 0)
+ all_erased = false;
+
+ // Loop through the deleted pars if any, erasing as needed
+ for (pit_type pit = startpit + 1; pit != endpit;) {
+ // "erase" the contents of the par
+ pars[pit].erase(0, pars[pit].size());
+ if (!pars[pit].size()) {
+ // remove the par if it's now empty
+ pars.erase(pars.begin() + pit);
+ --endpit;
+ } else {
+ ++pit;
+ all_erased = false;
+ }