- }
-
- selection_possible = true;
- screen->HideCursor();
-
- // Right button mouse click on a table
- if (button == 3 &&
- (text->cursor.par->table ||
- text->MouseHitInTable(xpos, ypos + screen->first))) {
- // Set the cursor to the press-position
- text->SetCursorFromCoordinates(xpos, ypos + screen->first);
- bool doit = true;
-
- // Only show the table popup if the hit is in
- // the table, too
- if (!text->HitInTable(text->cursor.row, xpos))
- doit = false;
-
- // Hit above or below the table?
- if (doit) {
- if (!text->selection) {
- screen->ToggleSelection();
- text->ClearSelection();
- text->FullRebreak();
- screen->Update();
- updateScrollbar();
+ cursor_par_prev = cursor_par->previous();
+ cursor_par_next = cursor_par->next();
+ }
+
+ // Iterate through the paragraphs removing autoDelete insets as we go.
+ // If the paragraph ends up empty after all the autoDelete insets are
+ // removed that paragraph will be removed by the next setCursor() call.
+ ParIterator it = buffer()->par_iterator_begin();
+ ParIterator end = buffer()->par_iterator_end();
+ for (; it != end; ++it) {
+ Paragraph * par = *it;
+ Paragraph * par_prev = par ? par->previous() : 0;
+ bool removed = false;
+
+ if (text->setCursor(this, par, 0)
+ && cursor_par == par_prev) {
+ // The previous setCursor line was deleted and that
+ // was the cursor_par line. This can only happen if an
+ // error box was the sole item on cursor_par.
+ // It is possible for cursor_par_prev to be stray if
+ // the line it pointed to only had a error box on it
+ // so we have to set it to a known correct value.
+ // This is often the same value it already had.
+ cursor_par_prev = par->previous();
+ if (cursor_par_prev) {
+ // '|' = par, '.' = cursor_par, 'E' = error box
+ // First step below may occur before while{}
+ // a |a a a a.
+ // E -> .E -> |.E -> . -> |b
+ // . b b |b
+ // b
+ cursor_par = cursor_par_prev;
+ cursor_pos = cursor_par_prev->size();
+ cursor_par_prev = cursor_par->previous();
+ // cursor_par_next remains the same
+ } else if (cursor_par_next) {
+ // First step below may occur before while{}
+ // .
+ // E -> |.E -> |. -> . -> .|a
+ // a a a |a
+ cursor_par = cursor_par_next;
+ cursor_pos = 0;
+ // cursor_par_prev remains unset
+ cursor_par_next = cursor_par->next();
+ } else {
+ // I can't find a way to trigger this
+ // so it should be unreachable code
+ // unless the buffer is corrupted.
+ lyxerr << "BufferView::removeAutoInsets() is bad\n";