struct BufferView::Private
{
- Private(BufferView & bv): wh_(0), cursor_(bv),
+ Private(BufferView & bv) : update_strategy_(NoScreenUpdate),
+ wh_(0), cursor_(bv),
anchor_pit_(0), anchor_ypos_(0),
inlineCompletionUniqueChars_(0),
last_inset_(0), clickable_inset_(false),
iss >> opt;
flag.setEnabled(opt.repl_buf_name.empty()
|| !buffer_.isReadonly());
+ break;
}
- case LFUN_LABEL_GOTO: {
+ case LFUN_LABEL_GOTO:
flag.setEnabled(!cmd.argument().empty()
|| getInsetByCode<InsetRef>(cur, REF_CODE));
break;
- }
case LFUN_CHANGES_TRACK:
flag.setEnabled(true);
case LFUN_BUFFER_PARAMS_APPLY: {
DocumentClassConstPtr olddc = buffer_.params().documentClassPtr();
- cur.recordUndoFullDocument();
+ cur.recordUndoBufferParams();
istringstream ss(to_utf8(cmd.argument()));
Lexer lex;
lex.setStream(ss);
}
case LFUN_LAYOUT_MODULES_CLEAR: {
- cur.recordUndoFullDocument();
+ // FIXME: this modifies the document in cap::switchBetweenClasses
+ // without calling recordUndo. Fix this before using
+ // recordUndoBufferParams().
+ cur.recordUndoFullBuffer();
buffer_.params().clearLayoutModules();
makeDocumentClass();
dr.screenUpdate(Update::Force);
"conflicts with installed modules.");
break;
}
- cur.recordUndoFullDocument();
+ // FIXME: this modifies the document in cap::switchBetweenClasses
+ // without calling recordUndo. Fix this before using
+ // recordUndoBufferParams().
+ cur.recordUndoFullBuffer();
buffer_.params().addLayoutModule(argument);
makeDocumentClass();
dr.screenUpdate(Update::Force);
break;
// Save the old, possibly modular, layout for use in conversion.
- cur.recordUndoFullDocument();
+ // FIXME: this modifies the document in cap::switchBetweenClasses
+ // without calling recordUndo. Fix this before using
+ // recordUndoBufferParams().
+ cur.recordUndoFullBuffer();
buffer_.params().setBaseClass(argument);
makeDocumentClass();
dr.screenUpdate(Update::Force);
for (Buffer * b = &buffer_; i == 0 || b != &buffer_;
b = theBufferList().next(b)) {
- DocIterator dit = b->getParFromID(id);
- if (dit.atEnd()) {
+ Cursor cur(*this);
+ cur.setCursor(b->getParFromID(id));
+ if (cur.atEnd()) {
LYXERR(Debug::INFO, "No matching paragraph found! [" << id << "].");
++i;
continue;
}
- LYXERR(Debug::INFO, "Paragraph " << dit.paragraph().id()
+ LYXERR(Debug::INFO, "Paragraph " << cur.paragraph().id()
<< " found in buffer `"
<< b->absFileName() << "'.");
if (b == &buffer_) {
// Set the cursor
- dit.pos() = pos;
- setCursor(dit);
+ cur.pos() = pos;
+ mouseSetCursor(cur);
dr.screenUpdate(Update::Force | Update::FitCursor);
} else {
// Switch to other buffer view and resend cmd
Cursor old = cur;
bool const in_texted = cur.inTexted();
cur.setCursor(doc_iterator_begin(cur.buffer()));
+ if (cur != old)
+ notifyCursorLeavesOrEnters(old, cur);
cur.selHandle(false);
buffer_.changed(true);
updateHoveredInset();
if (!newL || oldL == newL)
break;
if (oldL->rightToLeft() == newL->rightToLeft()) {
- cur.recordUndoFullDocument();
+ cur.recordUndoFullBuffer();
buffer_.changeLanguage(oldL, newL);
cur.setCurrentFont();
dr.forceBufferUpdate();
// Set the row on which the cursor lives.
setCurrentRowSlice(rowSlice);
+ /** FIXME: the code below adds an extraneous computation of inset
+ * positions, and can therefore be bad for performance (think for
+ * example about a very large tabular inset. Redawing the row
+ * where it is means redrawing the whole screen).
+ *
+ * The bug that this fixes is the following: assume that there is
+ * a very large math inset. Upon entering the inset, when pressing
+ * `End', the row is not scrolled and the cursor is not visible. I
+ * am not sure why the extra row computation fixes the problem,
+ * actually.
+ *
+ * A proper fix should be found and this code should be removed.
+ */
// Force the recomputation of inset positions
bool const drawing = pi.pain.isDrawingEnabled();
pi.pain.setDrawingEnabled(false);
-d->horiz_scroll_offset_, 0);
rp.paintText();
pi.pain.setDrawingEnabled(drawing);
+ /** END of bad code */
// Current x position of the cursor in pixels
int const cur_x = getPos(d->cursor_).x_;
// Horizontal scroll offset of the cursor row in pixels
int offset = d->horiz_scroll_offset_;
- int const MARGIN = Length(2, Length::EM).inPixels(workWidth());
+ int const MARGIN = Length(2, Length::EM).inPixels(pi.base);
if (cur_x < offset + MARGIN) {
// scroll right
offset = cur_x - MARGIN;