]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
Cmake build: Adapt to compile after 0213e7b5c62f487bdddd95ff0b2de736f64b1dc3
[lyx.git] / src / BufferView.cpp
index fd2042ffde58e4be665fb2206fa8a3f6171efcde..41d85bf400058b651e67b374c7e2785087cc5cb9 100644 (file)
@@ -227,7 +227,8 @@ enum ScreenUpdateStrategy {
 
 struct BufferView::Private
 {
-       Private(BufferView & bv): wh_(0), cursor_(bv),
+       Private(BufferView & bv) : update_strategy_(NoScreenUpdate),
+               wh_(0), cursor_(bv),
                anchor_pit_(0), anchor_ypos_(0),
                inlineCompletionUniqueChars_(0),
                last_inset_(0), clickable_inset_(false),
@@ -1112,13 +1113,13 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                iss >> opt;
                flag.setEnabled(opt.repl_buf_name.empty()
                                || !buffer_.isReadonly());
+               break;
        }
 
-       case LFUN_LABEL_GOTO: {
+       case LFUN_LABEL_GOTO:
                flag.setEnabled(!cmd.argument().empty()
                    || getInsetByCode<InsetRef>(cur, REF_CODE));
                break;
-       }
 
        case LFUN_CHANGES_TRACK:
                flag.setEnabled(true);
@@ -1236,6 +1237,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
 
        string const argument = to_utf8(cmd.argument());
        Cursor & cur = d->cursor_;
+       Cursor old = cur;
 
        // Don't dispatch function that does not apply to internal buffers.
        if (buffer_.isInternal()
@@ -1414,20 +1416,21 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                for (Buffer * b = &buffer_; i == 0 || b != &buffer_;
                        b = theBufferList().next(b)) {
 
-                       DocIterator dit = b->getParFromID(id);
-                       if (dit.atEnd()) {
+                       Cursor cur(*this);
+                       cur.setCursor(b->getParFromID(id));
+                       if (cur.atEnd()) {
                                LYXERR(Debug::INFO, "No matching paragraph found! [" << id << "].");
                                ++i;
                                continue;
                        }
-                       LYXERR(Debug::INFO, "Paragraph " << dit.paragraph().id()
+                       LYXERR(Debug::INFO, "Paragraph " << cur.paragraph().id()
                                << " found in buffer `"
                                << b->absFileName() << "'.");
 
                        if (b == &buffer_) {
                                // Set the cursor
-                               dit.pos() = pos;
-                               setCursor(dit);
+                               cur.pos() = pos;
+                               mouseSetCursor(cur);
                                dr.screenUpdate(Update::Force | Update::FitCursor);
                        } else {
                                // Switch to other buffer view and resend cmd
@@ -1743,7 +1746,6 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        p = Point(0, 0);
                if (act == LFUN_SCREEN_DOWN && scrolled < height_)
                        p = Point(width_, height_);
-               Cursor old = cur;
                bool const in_texted = cur.inTexted();
                cur.setCursor(doc_iterator_begin(cur.buffer()));
                cur.selHandle(false);
@@ -2065,6 +2067,21 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
 
        buffer_.undo().endUndoGroup();
        dr.dispatched(dispatched);
+
+       // NOTE: The code below is copied from Cursor::dispatch. If you
+       // need to modify this, please update the other one too.
+
+       // notify insets we just entered/left
+       if (cursor() != old) {
+               old.beginUndoGroup();
+               old.fixIfBroken();
+               bool badcursor = notifyCursorLeavesOrEnters(old, cursor());
+               if (badcursor) {
+                       cursor().fixIfBroken();
+                       resetInlineCompletionPos();
+               }
+               old.endUndoGroup();
+       }
 }
 
 
@@ -2493,7 +2510,7 @@ bool BufferView::checkDepm(Cursor & cur, Cursor & old)
        d->cursor_ = cur;
 
        // we would rather not do this here, but it needs to be done before
-       // the changed() signal is sent.
+       // the changed() signal is sent.
        buffer_.updateBuffer();
 
        buffer_.changed(true);
@@ -2782,7 +2799,7 @@ Point BufferView::coordOffset(DocIterator const & dit) const
        int lastw = 0;
 
        // Addup contribution of nested insets, from inside to outside,
-       // keeping the outer paragraph for a special handling below
+       // keeping the outer paragraph for a special handling below
        for (size_t i = dit.depth() - 1; i >= 1; --i) {
                CursorSlice const & sl = dit[i];
                int xx = 0;
@@ -2970,6 +2987,19 @@ void BufferView::checkCursorScrollOffset(PainterInfo & pi)
        // Set the row on which the cursor lives.
        setCurrentRowSlice(rowSlice);
 
+       /** FIXME: the code below adds an extraneous computation of inset
+        * positions, and can therefore be bad for performance (think for
+        * example about a very large tabular inset. Redawing the row
+        * where it is means redrawing the whole screen).
+        *
+        * The bug that this fixes is the following: assume that there is
+        * a very large math inset. Upon entering the inset, when pressing
+        * `End', the row is not scrolled and the cursor is not visible. I
+        * am not sure why the extra row computation fixes the problem,
+        * actually.
+        *
+        * A proper fix should be found and this code should be removed.
+        */
        // Force the recomputation of inset positions
        bool const drawing = pi.pain.isDrawingEnabled();
        pi.pain.setDrawingEnabled(false);
@@ -2978,13 +3008,14 @@ void BufferView::checkCursorScrollOffset(PainterInfo & pi)
                      -d->horiz_scroll_offset_, 0);
        rp.paintText();
        pi.pain.setDrawingEnabled(drawing);
+       /** END of bad code */
 
        // Current x position of the cursor in pixels
        int const cur_x = getPos(d->cursor_).x_;
 
        // Horizontal scroll offset of the cursor row in pixels
        int offset = d->horiz_scroll_offset_;
-       int const MARGIN = Length(2, Length::EM).inPixels(workWidth());
+       int const MARGIN = Length(2, Length::EM).inPixels(pi.base);
        if (cur_x < offset + MARGIN) {
                // scroll right
                offset = cur_x - MARGIN;
@@ -3035,7 +3066,7 @@ void BufferView::draw(frontend::Painter & pain)
                LYXERR(Debug::PAINTING, "Strategy: NoScreenUpdate");
                pi.full_repaint = true;
                pi.pain.setDrawingEnabled(false);
-               tm.draw(pi, 0, y);
+               tm.draw(pi, 0, y);
                break;
 
        case SingleParUpdate:
@@ -3044,7 +3075,7 @@ void BufferView::draw(frontend::Painter & pain)
                // In general, only the current row of the outermost paragraph
                // will be redrawn. Particular cases where selection spans
                // multiple paragraph are correctly detected in TextMetrics.
-               tm.draw(pi, 0, y);
+               tm.draw(pi, 0, y);
                break;
 
        case DecorationUpdate: