]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
Make undo action no-ops when the buffer is read-only
[lyx.git] / src / BufferView.cpp
index 0f36dcab8476302ca1a6e2abcc4b01994ba44c5e..023301dd482e596d77e674ac597d9a022288304f 100644 (file)
@@ -583,7 +583,7 @@ void BufferView::processUpdateFlags(Update::flags flags)
 }
 
 
-void BufferView::updateScrollbar()
+void BufferView::updateScrollbarParameters()
 {
        if (height_ == 0 && width_ == 0)
                return;
@@ -1481,6 +1481,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                else {
                        dr.screenUpdate(Update::Force | Update::FitCursor);
                        dr.forceBufferUpdate();
+                       resetInlineCompletionPos();
                        if (buffer().params().citeEngine() != engine ||
                            buffer().params().citeEngineType() != enginetype)
                                buffer().invalidateCiteLabels();
@@ -1501,6 +1502,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                else {
                        dr.screenUpdate(Update::Force | Update::FitCursor);
                        dr.forceBufferUpdate();
+                       resetInlineCompletionPos();
                        if (buffer().params().citeEngine() != engine ||
                            buffer().params().citeEngineType() != enginetype)
                                buffer().invalidateCiteLabels();
@@ -1907,7 +1909,8 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                cur.setCursor(doc_iterator_begin(cur.buffer()));
                cur.selHandle(false);
                // Force an immediate computation of metrics because we need it below
-               updateMetrics();
+               if (scrolled)
+                       processUpdateFlags(Update::Force);
 
                d->text_metrics_[&buffer_.text()].editXY(cur, p.x_, p.y_,
                        true, act == LFUN_SCREEN_UP);
@@ -2063,21 +2066,22 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                // an arbitrary number to limit number of iterations
                const int max_iter = 100000;
                int iterations = 0;
-               Cursor & curs = d->cursor_;
-               Cursor const savecur = curs;
-               curs.reset();
-               if (!curs.nextInset())
-                       curs.forwardInset();
-               curs.beginUndoGroup();
-               while(curs && iterations < max_iter) {
-                       Inset * const ins = curs.nextInset();
+               Cursor & bvcur = d->cursor_;
+               Cursor const savecur = bvcur;
+               bvcur.reset();
+               if (!bvcur.nextInset())
+                       bvcur.forwardInset();
+               bvcur.beginUndoGroup();
+               while(bvcur && iterations < max_iter) {
+                       Inset * const ins = bvcur.nextInset();
                        if (!ins)
                                break;
                        docstring insname = ins->layoutName();
                        while (!insname.empty()) {
                                if (insname == name || name == from_utf8("*")) {
-                                       curs.recordUndo();
                                        lyx::dispatch(fr, dr);
+                                       // we do not want to remember selection here
+                                       bvcur.clearSelection();
                                        ++iterations;
                                        break;
                                }
@@ -2087,11 +2091,11 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                                insname = insname.substr(0, i);
                        }
                        // if we did not delete the inset, skip it
-                       if (!curs.nextInset() || curs.nextInset() == ins)
-                               curs.forwardInset();
+                       if (!bvcur.nextInset() || bvcur.nextInset() == ins)
+                               bvcur.forwardInset();
                }
-               curs = savecur;
-               curs.fixIfBroken();
+               bvcur = savecur;
+               bvcur.fixIfBroken();
                /** This is a dummy undo record only to remember the cursor
                 * that has just been set; this will be used on a redo action
                 * (see ticket #10097)
@@ -2099,8 +2103,8 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                 * FIXME: a better fix would be to have a way to set the
                 * cursor value directly, but I am not sure it is worth it.
                 */
-               curs.recordUndo();
-               curs.endUndoGroup();
+               bvcur.recordUndo();
+               bvcur.endUndoGroup();
                dr.screenUpdate(Update::Force);
                dr.forceBufferUpdate();
 
@@ -3388,15 +3392,12 @@ void BufferView::checkCursorScrollOffset()
 
        //lyxerr << "cur_x=" << cur_x << ", offset=" << offset << ", row.wid=" << row.width() << ", margin=" << MARGIN << endl;
 
-       if (offset != d->horiz_scroll_offset_)
+       if (offset != d->horiz_scroll_offset_) {
                LYXERR(Debug::PAINTING, "Horiz. scroll offset changed from "
                       << d->horiz_scroll_offset_ << " to " << offset);
-
-       if (d->update_strategy_ == NoScreenUpdate
-           && offset != d->horiz_scroll_offset_) {
-               // FIXME: if one uses SingleParUpdate, then home/end
-               // will not work on long rows. Why?
-               d->update_strategy_ = FullScreenUpdate;
+               row.changed(true);
+               if (d->update_strategy_ == NoScreenUpdate)
+                       d->update_strategy_ = SingleParUpdate;
        }
 
        d->horiz_scroll_offset_ = offset;
@@ -3481,7 +3482,7 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret)
 
        // The scrollbar needs an update.
        // FIXME: does it always? see ticket #11947.
-       updateScrollbar();
+       updateScrollbarParameters();
 
        // Normalize anchor for next time
        pair<pit_type, ParagraphMetrics const *> firstpm = tm.first();