]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
Fix bug #9813
[lyx.git] / src / BufferView.cpp
index d87109548120cee5a7d5d37a1b96f745b4ede233..663618af36f185d7d08439c72294763bf0b3abf8 100644 (file)
@@ -234,7 +234,9 @@ struct BufferView::Private
                mouse_position_cache_(),
                bookmark_edit_position_(-1), gui_(0),
                horiz_scroll_offset_(0)
-       {}
+       {
+               xsel_cache_.set = false;
+       }
 
        ///
        ScrollbarParameters scrollbarParameters_;
@@ -2247,6 +2249,15 @@ void BufferView::mouseEventDispatch(FuncRequest const & cmd0)
 
        // Build temporary cursor.
        Inset * inset = d->text_metrics_[&buffer_.text()].editXY(cur, cmd.x(), cmd.y());
+       if (inset) {
+               // If inset is not editable, cur.pos() might point behind the
+               // inset (depending on cmd.x(), cmd.y()). This is needed for
+               // editing to fix bug 9628, but e.g. the context menu needs a
+               // cursor in front of the inset.
+               if (inset->hasSettings() &&
+                   cur.nextInset() != inset && cur.prevInset() == inset)
+                       cur.backwardPos();
+       }
 
        // Put anchor at the same position.
        cur.resetAnchor();
@@ -2354,13 +2365,19 @@ int BufferView::scrollUp(int offset)
 
 
 void BufferView::setCursorFromRow(int row)
+{
+       setCursorFromRow(row, buffer_.texrow());
+}
+
+
+void BufferView::setCursorFromRow(int row, TexRow const & texrow)
 {
        int tmpid;
        int tmppos;
        pit_type newpit = 0;
        pos_type newpos = 0;
 
-       buffer_.texrow().getIdFromRow(row, tmpid, tmppos);
+       texrow.getIdFromRow(row, tmpid, tmppos);
 
        bool posvalid = (tmpid != -1);
        if (posvalid) {
@@ -2830,8 +2847,7 @@ Point BufferView::coordOffset(DocIterator const & dit) const
                        // FIXME (Abdel 23/09/2007): this is a bit messy because of the
                        // elimination of Inset::dim_ cache. This coordOffset() method needs
                        // to be rewritten in light of the new design.
-                       Dimension const & dim = parMetrics(dit[i - 1].text(),
-                               dit[i - 1].pit()).insetDimension(&sl.inset());
+                       Dimension const & dim = coordCache().getInsets().dim(&sl.inset());
                        lastw = dim.wid;
                } else {
                        Dimension const dim = sl.inset().dimension(*this);
@@ -2970,7 +2986,7 @@ void BufferView::setCurrentRowSlice(CursorSlice const & rowSlice)
 }
 
 
-void BufferView::checkCursorScrollOffset(PainterInfo & pi)
+void BufferView::checkCursorScrollOffset()
 {
        CursorSlice rowSlice = d->cursor_.bottom();
        TextMetrics const & tm = textMetrics(rowSlice.text());
@@ -2981,8 +2997,7 @@ void BufferView::checkCursorScrollOffset(PainterInfo & pi)
                return;
        ParagraphMetrics const & pm = tm.parMetrics(rowSlice.pit());
        Row const & row = pm.getRow(rowSlice.pos(),
-                                   d->cursor_.boundary()
-                                   && rowSlice == d->cursor_.top());
+                                   d->cursor_.boundary() && rowSlice == d->cursor_.top());
        rowSlice.pos() = row.pos();
 
        // Set the row on which the cursor lives.
@@ -2993,7 +3008,8 @@ void BufferView::checkCursorScrollOffset(PainterInfo & pi)
 
        // Horizontal scroll offset of the cursor row in pixels
        int offset = d->horiz_scroll_offset_;
-       int const MARGIN = Length(2, Length::EM).inPixels(pi.base);
+       int const MARGIN = 2 * theFontMetrics(d->cursor_.real_current_font).em();
+       //lyxerr << "cur_x=" << cur_x << ", offset=" << offset << ", margin=" << MARGIN << endl;
        if (cur_x < offset + MARGIN) {
                // scroll right
                offset = cur_x - MARGIN;
@@ -3034,7 +3050,7 @@ void BufferView::draw(frontend::Painter & pain)
 
        // Check whether the row where the cursor lives needs to be scrolled.
        // Update the drawing strategy if needed.
-       checkCursorScrollOffset(pi);
+       checkCursorScrollOffset();
 
        switch (d->update_strategy_) {