X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=d017db0cae115dfcad8ff041461c2607e582a59c;hb=2ebd535e99ebd1578209bf3e5890b06871e1dfeb;hp=ce8306105ab2760b7b80906695b477e8a70a6a8c;hpb=c9fc5bf1c69fb2a24e928a79be25e7415819aab1;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index ce8306105a..d017db0cae 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -495,9 +495,7 @@ void BufferView::processUpdateFlags(Update::flags flags) // updateMetrics() does not update paragraph position // This is done at draw() time. So we need a redraw! - // We pass true so that metrics are computed for the sake - // of having MacroData updated. - buffer_.changed(true); + buffer_.changed(false); if (needsFitCursor()) { // The cursor is off screen so ensure it is visible. @@ -1413,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)) { @@ -1430,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( @@ -2167,9 +2179,7 @@ void BufferView::updateHoveredInset() const // This event (moving without mouse click) is not passed further. // This should be changed if it is further utilized. - // We pass true so that metrics are computed for the sake - // of having MacroData updated. - buffer_.changed(true); + buffer_.changed(false); } } @@ -2333,58 +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) { - int tmpid; - int tmppos; - pit_type newpit = 0; - pos_type newpos = 0; - - texrow.getIdFromRow(row, tmpid, tmppos); - - bool posvalid = (tmpid != -1); - if (posvalid) { - // we need to make sure that the row and position - // we got back are valid, because the buffer may well - // have changed since we last generated the LaTeX. - DocIterator dit = buffer_.getParFromID(tmpid); - if (dit == doc_iterator_end(&buffer_)) - posvalid = false; - else if (dit.depth() > 1) { - // We are in an inset. - pos_type lastpos = dit.lastpos(); - dit.pos() = tmppos > lastpos ? lastpos : tmppos; - setCursor(dit); - recenter(); - return; - } else { - newpit = dit.pit(); - // now have to check pos. - newpos = tmppos; - Paragraph const & par = buffer_.text().getPar(newpit); - if (newpos > par.size()) { - LYXERR0("Requested position no longer valid."); - newpos = par.size() - 1; - } - } - } - if (!posvalid) { - frontend::Alert::error(_("Inverse Search Failed"), - _("Invalid position requested by inverse search.\n" - "You 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(dit_start); + // Setting selection end + if (dit_end) { + d->cursor_.resetAnchor(); + setCursorSelectionTo(dit_end); } - d->cursor_.reset(); - buffer_.text().setCursor(d->cursor_, newpit, newpos); - d->cursor_.selection(false); - d->cursor_.resetAnchor(); - recenter(); + return true; } @@ -2817,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; @@ -2904,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();