namespace {
-void deleteSpaces(Paragraph & par, pos_type const from, pos_type to,
+/** delete num_spaces characters between from and to. Return the
+ * number of spaces that got physically deleted (not marked as
+ * deleted) */
+int deleteSpaces(Paragraph & par, pos_type const from, pos_type to,
int num_spaces, bool const trackChanges)
{
- if (!num_spaces)
- return;
+ if (num_spaces <= 0)
+ return 0;
// First, delete spaces marked as inserted
int pos = from;
}
// Then remove remaining spaces
+ int const psize = par.size();
par.eraseChars(from, from + num_spaces, trackChanges);
+ return psize - par.size();
}
}
//LYXERR(Debug::DEBUG, "DEPM: cur:\n" << cur << "old:\n" << old);
Paragraph & oldpar = old.paragraph();
+ bool const trackChanges = cur.buffer()->params().track_changes;
// We allow all kinds of "mumbo-jumbo" when freespacing.
if (oldpar.isFreeSpacing())
&& !oldpar.isDeleted(from - 1))
--from;
pos_type to = old.pos();
- while (to < oldpar.size() - 1
+ while (to < old.lastpos()
&& oldpar.isLineSeparator(to)
&& !oldpar.isDeleted(to))
++to;
int num_spaces = to - from;
-
- // If we are not at the extremity of the paragraph, keep one space
- if (from != to && from > 0 && to < oldpar.size())
+ // If we are not at the start of the paragraph, keep one space
+ if (from != to && from > 0)
--num_spaces;
// If cursor is inside range, keep one additional space
// Remove spaces and adapt cursor.
if (num_spaces > 0) {
- pos_type const oldsize = oldpar.size();
- deleteSpaces(oldpar, from, to, num_spaces,
- cur.buffer()->params().track_changes);
+ int const deleted =
+ deleteSpaces(oldpar, from, to, num_spaces, trackChanges);
// correct cur position
// FIXME: there can be other cursors pointing there, we should update them
if (same_par) {
if (cur[depth].pos() >= to)
- cur[depth].pos() -= oldsize - oldpar.size();
+ cur[depth].pos() -= deleted;
else if (cur[depth].pos() > from)
cur[depth].pos() = min(from + 1, old.lastpos());
need_anchor_change = true;
return true;
}
- if (oldpar.stripLeadingSpaces(cur.buffer()->params().track_changes)) {
+ if (oldpar.stripLeadingSpaces(trackChanges)) {
need_anchor_change = true;
// We return true here because the Paragraph contents changed and
// we need a redraw before further action is processed.
--num_spaces;
// Remove spaces if needed
- deleteSpaces(par, from , to, num_spaces, trackChanges);
+ int const deleted = deleteSpaces(par, from , to, num_spaces, trackChanges);
+ from = to - deleted;
}
// don't delete anything if this is the only remaining paragraph