mouse_position_cache_(),
bookmark_edit_position_(-1), gui_(0),
horiz_scroll_offset_(0)
- {}
+ {
+ xsel_cache_.set = false;
+ }
///
ScrollbarParameters scrollbarParameters_;
}
-bool BufferView::fitCursor()
+bool BufferView::needsFitCursor() const
{
if (cursorStatus(d->cursor_) == CUR_INSIDE) {
frontend::FontMetrics const & fm =
// Now do the first drawing step if needed. This consists on updating
// the CoordCache in updateMetrics().
// The second drawing step is done in WorkArea::redraw() if needed.
+ // FIXME: is this still true now that Buffer::changed() is used all over?
// Case when no explicit update is requested.
if (!flags) {
if (flags == Update::FitCursor
|| flags == (Update::Decoration | Update::FitCursor)) {
// tell the frontend to update the screen if needed.
- if (fitCursor()) {
+ if (needsFitCursor()) {
showCursor();
return;
}
return;
}
// no screen update is needed in principle, but this
- // could change if cursor row needs scrolling.
+ // could change if cursor row needs horizontal scrolling.
d->update_strategy_ = NoScreenUpdate;
buffer_.changed(false);
return;
// This is done at draw() time. So we need a redraw!
buffer_.changed(false);
- if (fitCursor()) {
+ if (needsFitCursor()) {
// The cursor is off screen so ensure it is visible.
// refresh it:
showCursor();
// paragraph position which is computed at draw() time.
// So we need a redraw!
buffer_.changed(false);
- if (fitCursor())
+ if (needsFitCursor())
showCursor();
}
}
-/** Return the change status at cursor position, taking in account the
+/** Return the change status at cursor position, taking into account the
* status at each level of the document iterator (a table in a deleted
* footnote is deleted).
* When \param outer is true, the top slice is not looked at.
// 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();
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) {
Buffer const * buf = *it;
// find label
- Toc & toc = buf->tocBackend().toc("label");
- TocIterator toc_it = toc.begin();
- TocIterator end = toc.end();
+ shared_ptr<Toc> toc = buf->tocBackend().toc("label");
+ TocIterator toc_it = toc->begin();
+ TocIterator end = toc->end();
for (; toc_it != end; ++toc_it) {
if (label == toc_it->str()) {
lyx::dispatch(toc_it->action());
d->cursor_.setCursor(dit);
d->cursor_.setSelection(false);
+ d->cursor_.setCurrentFont();
// FIXME
// It seems on general grounds as if this is probably needed, but
// it is not yet clear.
// 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);
}
-void BufferView::checkCursorScrollOffset(PainterInfo & pi)
+void BufferView::checkCursorScrollOffset()
{
CursorSlice rowSlice = d->cursor_.bottom();
TextMetrics const & tm = textMetrics(rowSlice.text());
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.
// 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;
// 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_) {