X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=77ab989d193962f602d96435b8c0fbc1f41e0128;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=900114384f738d4f2f4cf8e126f43fd95978e16f;hpb=60e89213493cfb4b8b30dc00264db1ca42e0348a;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 900114384f..77ab989d19 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -351,8 +351,8 @@ BufferView::~BufferView() int BufferView::rightMargin() const { - // The value used to be hardcoded to 10, which is 2.5mm at 100dpi - int const default_margin = Length(2.5, Length::MM).inPixels(0); + // The value used to be hardcoded to 10, which is 0.1in at 100dpi + int const default_margin = Length(0.1, Length::IN).inPixels(0); // The additional test for the case the outliner is opened. if (!full_screen_ || !lyxrc.full_screen_limit || width_ < lyxrc.full_screen_width + 2 * default_margin) @@ -368,6 +368,13 @@ int BufferView::leftMargin() const } +int BufferView::inPixels(Length const & len) const +{ + Font const font = buffer().params().getFont(); + return len.inPixels(workWidth(), theFontMetrics(font).em()); +} + + bool BufferView::isTopScreen() const { return 0 == d->scrollbarParameters_.min; @@ -564,6 +571,12 @@ void BufferView::updateScrollbar() d->scrollbarParameters_.max -= minVisiblePart(); else d->scrollbarParameters_.max -= d->scrollbarParameters_.page_step; + + // 0 must be inside the range as it denotes the current position + if (d->scrollbarParameters_.max < 0) + d->scrollbarParameters_.max = 0; + if (d->scrollbarParameters_.min > 0) + d->scrollbarParameters_.min = 0; } @@ -1022,7 +1035,10 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) if (buffer_.isReadonly() && !lyxaction.funcHasFlag(act, LyXAction::ReadOnly) && !lyxaction.funcHasFlag(act, LyXAction::NoBuffer)) { - flag.message(from_utf8(N_("Document is read-only"))); + if (buffer_.hasReadonlyFlag()) + flag.message(from_utf8(N_("Document is read-only"))); + else + flag.message(from_utf8(N_("Document has been modified externally"))); flag.setEnabled(false); return true; } @@ -1405,7 +1421,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)) { @@ -1422,10 +1442,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( @@ -1517,14 +1547,8 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) docstring const data = find2string(searched_string, true, false, fw); bool found = lyxfind(this, FuncRequest(LFUN_WORD_FIND, data)); - if (found) { + if (found) dr.screenUpdate(Update::Force | Update::FitCursor); - cur.dispatched(); - dispatched = true; - } else { - cur.undispatched(); - dispatched = false; - } break; } @@ -1536,14 +1560,9 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, "findreplace")); break; } - if (lyxfind(this, req)) { + if (lyxfind(this, req)) dr.screenUpdate(Update::Force | Update::FitCursor); - cur.dispatched(); - dispatched = true; - } else { - cur.undispatched(); - dispatched = false; - } + d->search_request_cache_ = req; break; } @@ -1565,11 +1584,6 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) if (lyxreplace(this, cmd, has_deleted)) { dr.forceBufferUpdate(); dr.screenUpdate(Update::Force | Update::FitCursor); - cur.dispatched(); - dispatched = true; - } else { - cur.undispatched(); - dispatched = false; } break; } @@ -2339,58 +2353,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; } @@ -2484,6 +2475,18 @@ void BufferView::setCursor(DocIterator const & dit) } +void BufferView::setCursorSelectionTo(DocIterator const & dit) +{ + size_t const n = dit.depth(); + for (size_t i = 0; i < n; ++i) + dit[i].inset().edit(d->cursor_, true); + + d->cursor_.selection(true); + d->cursor_.setCursorSelectionTo(dit); + d->cursor_.setCurrentFont(); +} + + bool BufferView::checkDepm(Cursor & cur, Cursor & old) { // Would be wrong to delete anything if we have a selection. @@ -2511,7 +2514,7 @@ bool BufferView::checkDepm(Cursor & cur, Cursor & old) } -bool BufferView::mouseSetCursor(Cursor & cur, bool select) +bool BufferView::mouseSetCursor(Cursor & cur, bool const select) { LASSERT(&cur.bv() == this, return false); @@ -2529,27 +2532,23 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select) if (leftinset) d->cursor_.fixIfBroken(); - // FIXME: shift-mouse selection doesn't work well across insets. - bool const do_selection = - select && &d->cursor_.normalAnchor().inset() == &cur.inset(); - // do the dEPM magic if needed // FIXME: (1) move this to InsetText::notifyCursorLeaves? // FIXME: (2) if we had a working InsetText::notifyCursorLeaves, // the leftinset bool would not be necessary (badcursor instead). bool update = leftinset; - if (!do_selection && d->cursor_.inTexted()) - update |= checkDepm(cur, d->cursor_); - if (!do_selection) - d->cursor_.resetAnchor(); - d->cursor_.setCursor(cur); - d->cursor_.boundary(cur.boundary()); - if (do_selection) + if (select) { d->cursor_.setSelection(); - else + d->cursor_.setCursorSelectionTo(cur); + } else { + if (d->cursor_.inTexted()) + update |= checkDepm(cur, d->cursor_); + d->cursor_.resetAnchor(); + d->cursor_.setCursor(cur); d->cursor_.clearSelection(); - + } + d->cursor_.boundary(cur.boundary()); d->cursor_.finishUndo(); d->cursor_.setCurrentFont(); if (update) @@ -2815,19 +2814,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; @@ -2902,7 +2889,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();