X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=d017db0cae115dfcad8ff041461c2607e582a59c;hb=2de30c62f8d671a8c8d4d52a6a7310e2c5ca84de;hp=cb7ea79050ca0a22d9afeabe25a20e0ff30941ab;hpb=6642152e6610f1e885babfaeb3c99bd0004916fc;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index cb7ea79050..d017db0cae 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -1411,7 +1411,11 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) case LFUN_PARAGRAPH_GOTO: { int const id = convert(cmd.getArg(0)); - int const pos = convert(cmd.getArg(1)); + pos_type const pos = convert(cmd.getArg(1)); + if (id < 0) + break; + string const str_id_end = cmd.getArg(2); + string const str_pos_end = cmd.getArg(3); int i = 0; for (Buffer * b = &buffer_; i == 0 || b != &buffer_; b = theBufferList().next(b)) { @@ -1428,10 +1432,20 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) << b->absFileName() << "'."); if (b == &buffer_) { - // Set the cursor - cur.pos() = pos; - mouseSetCursor(cur); - dr.screenUpdate(Update::Force | Update::FitCursor); + bool success; + if (str_id_end.empty() || str_pos_end.empty()) { + // Set the cursor + cur.pos() = pos; + mouseSetCursor(cur); + success = true; + } else { + int const id_end = convert(str_id_end); + pos_type const pos_end = convert(str_pos_end); + success = setCursorFromEntries({id, pos}, + {id_end, pos_end}); + } + if (success) + dr.screenUpdate(Update::Force | Update::FitCursor); } else { // Switch to other buffer view and resend cmd lyx::dispatch(FuncRequest( @@ -2329,36 +2343,35 @@ int BufferView::scrollUp(int offset) } -void BufferView::setCursorFromRow(int row) +bool BufferView::setCursorFromRow(int row) { - setCursorFromRow(row, buffer_.texrow()); + TexRow::TextEntry start, end; + tie(start,end) = buffer_.texrow().getEntriesFromRow(row); + LYXERR(Debug::LATEX, + "setCursorFromRow: for row " << row << ", TexRow has found " + "start (id=" << start.id << ",pos=" << start.pos << "), " + "end (id=" << end.id << ",pos=" << end.pos << ")"); + return setCursorFromEntries(start, end); } -void BufferView::setCursorFromRow(int row, TexRow const & texrow) +bool BufferView::setCursorFromEntries(TexRow::TextEntry start, + TexRow::TextEntry end) { - DocIterator start, end; - tie(start,end) = texrow.getDocIteratorFromRow(row, buffer_); - // we need to make sure that the DocIterators - // we got back are valid, because the buffer may well - // have changed since we last generated the LaTeX. - if (!start) { - LYXERR(Debug::LATEX, - "setCursorFromRow: invalid position for row " << row); - frontend::Alert::error(_("Inverse Search Failed"), - _("Invalid position requested by inverse search.\n" - "You may need to update the viewed document.")); - return; - } + DocIterator dit_start, dit_end; + tie(dit_start,dit_end) = + TexRow::getDocIteratorsFromEntries(start, end, buffer_); + if (!dit_start) + return false; // Setting selection start d->cursor_.clearSelection(); - setCursor(start); + setCursor(dit_start); // Setting selection end - if (end) { + if (dit_end) { d->cursor_.resetAnchor(); - setCursorSelectionTo(end); + setCursorSelectionTo(dit_end); } - recenter(); + return true; } @@ -2791,19 +2804,7 @@ Point BufferView::coordOffset(DocIterator const & dit) const } // remember width for the case that sl.inset() is positioned in an RTL inset - if (i && dit[i - 1].text()) { - // If this Inset is inside a Text Inset, retrieve the Dimension - // from the containing text instead of using Inset::dimension() which - // might not be implemented. - // 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 = coordCache().getInsets().dim(&sl.inset()); - lastw = dim.wid; - } else { - Dimension const dim = sl.inset().dimension(*this); - lastw = dim.wid; - } + lastw = sl.inset().dimension(*this).wid; //lyxerr << "Cursor::getPos, i: " // << i << " x: " << xx << " y: " << y << endl; @@ -2878,7 +2879,7 @@ bool BufferView::paragraphVisible(DocIterator const & dit) const void BufferView::cursorPosAndHeight(Point & p, int & h) const { Cursor const & cur = cursor(); - Font const font = cur.getFont(); + Font const font = cur.real_current_font; frontend::FontMetrics const & fm = theFontMetrics(font); int const asc = fm.maxAscent(); int const des = fm.maxDescent();