// to this buffer later on.
buffer_->saveCursor(cursor_.selectionBegin(),
cursor_.selectionEnd());
+ // update bookmark pit of the current buffer before switch
+ for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i) {
+ BookmarksSection::Bookmark const & bm = LyX::ref().session().bookmarks().bookmark(i);
+ if (buffer()->fileName() != bm.filename.absFilename())
+ continue;
+ // if par_id or pit has been changed, reset par_pit and par_id
+ // see http://bugzilla.lyx.org/show_bug.cgi?id=3092
+ pit_type new_pit;
+ int new_id;
+ boost::tie(new_pit, new_id) = moveToPosition(bm.par_pit, bm.par_id, bm.par_pos);
+ if (bm.par_pit != new_pit || bm.par_id != new_id)
+ const_cast<BookmarksSection::Bookmark &>(bm).setPos(new_pit, new_id);
+ }
// current buffer is going to be switched-off, save cursor pos
LyX::ref().session().lastFilePos().save(FileName(buffer_->fileName()),
boost::tie(cursor_.pit(), cursor_.pos()) );
}
-void BufferView::reload()
-{
- if (theBufferList().close(buffer_, false))
- loadLyXFile(FileName(buffer_->fileName()));
-}
-
-
void BufferView::resize()
{
if (!buffer_)
// Case when no explicit update is requested.
if (!flags) {
// no need to redraw anything.
+ metrics_info_.update_strategy = NoScreenUpdate;
return false;
}
- if (flags == Update::FitCursor) {
+ if (flags == Update::Decoration) {
+ metrics_info_.update_strategy = DecorationUpdate;
+ return true;
+ }
+
+ if (flags == Update::FitCursor
+ || flags == (Update::Decoration | Update::FitCursor)) {
bool const fit_cursor = fitCursor();
- if (fit_cursor)
- updateMetrics(false);
// tell the frontend to update the screen if needed.
- return fit_cursor;
+ if (fit_cursor) {
+ updateMetrics(false);
+ return true;
+ }
+ if (flags & Update::Decoration) {
+ metrics_info_.update_strategy = DecorationUpdate;
+ return true;
+ }
+ // no screen update is needed.
+ metrics_info_.update_strategy = NoScreenUpdate;
+ return false;
}
bool full_metrics = flags & Update::Force;
void BufferView::setCursorFromScrollbar()
{
+ if (!buffer_)
+ return;
+
LyXText & t = buffer_->text();
int const height = 2 * defaultRowHeight();
switch (st) {
case bv_funcs::CUR_ABOVE:
+ // We reset the cursor because bv_funcs::status() does not
+ // work when the cursor is within mathed.
+ cur.reset(buffer_->inset());
t.setCursorFromCoordinates(cur, 0, first);
cur.clearSelection();
break;
case bv_funcs::CUR_BELOW:
+ // We reset the cursor because bv_funcs::status() does not
+ // work when the cursor is within mathed.
+ cur.reset(buffer_->inset());
t.setCursorFromCoordinates(cur, 0, last);
cur.clearSelection();
break;
flag.enabled(!buffer_->redostack().empty());
break;
case LFUN_FILE_INSERT:
- case LFUN_FILE_INSERT_ASCII_PARA:
- case LFUN_FILE_INSERT_ASCII:
+ case LFUN_FILE_INSERT_PLAINTEXT_PARA:
+ case LFUN_FILE_INSERT_PLAINTEXT:
case LFUN_BOOKMARK_SAVE:
// FIXME: Actually, these LFUNS should be moved to LyXText
flag.enabled(cursor_.inTexted());
}
-bool BufferView::dispatch(FuncRequest const & cmd)
+Update::flags BufferView::dispatch(FuncRequest const & cmd)
{
//lyxerr << BOOST_CURRENT_FUNCTION
// << [ cmd = " << cmd << "]" << endl;
<< " button[" << cmd.button() << ']'
<< endl;
+ // FIXME: this should not be possible.
+ if (!buffer_)
+ return Update::None;
+
LCursor & cur = cursor_;
+ // Default Update flags.
+ Update::flags updateFlags = Update::Force | Update::FitCursor;
switch (cmd.action) {
case LFUN_UNDO:
- if (buffer_) {
- cur.message(_("Undo"));
- cur.clearSelection();
- if (!textUndo(*this))
- cur.message(_("No further undo information"));
- update();
- switchKeyMap();
+ cur.message(_("Undo"));
+ cur.clearSelection();
+ if (!textUndo(*this)) {
+ cur.message(_("No further undo information"));
+ updateFlags = Update::None;
}
+ switchKeyMap();
break;
case LFUN_REDO:
- if (buffer_) {
- cur.message(_("Redo"));
- cur.clearSelection();
- if (!textRedo(*this))
- cur.message(_("No further redo information"));
- update();
- switchKeyMap();
+ cur.message(_("Redo"));
+ cur.clearSelection();
+ if (!textRedo(*this)) {
+ cur.message(_("No further redo information"));
+ updateFlags = Update::None;
}
+ switchKeyMap();
break;
case LFUN_FILE_INSERT:
menuInsertLyXFile(to_utf8(cmd.argument()));
break;
- case LFUN_FILE_INSERT_ASCII_PARA:
+ case LFUN_FILE_INSERT_PLAINTEXT_PARA:
// FIXME UNICODE
- insertAsciiFile(this, to_utf8(cmd.argument()), true);
+ insertPlaintextFile(this, to_utf8(cmd.argument()), true);
break;
- case LFUN_FILE_INSERT_ASCII:
+ case LFUN_FILE_INSERT_PLAINTEXT:
// FIXME UNICODE
- insertAsciiFile(this, to_utf8(cmd.argument()), false);
+ insertPlaintextFile(this, to_utf8(cmd.argument()), false);
break;
case LFUN_FONT_STATE:
if (b == buffer_) {
// Set the cursor
setCursor(makeDocIterator(par, 0));
- update();
switchKeyMap();
} else {
// Switch to other buffer view and resend cmd
theLyXFunc().dispatch(FuncRequest(
LFUN_BUFFER_SWITCH, b->fileName()));
theLyXFunc().dispatch(cmd);
+ updateFlags = Update::None;
}
break;
}
buffer_->params().trackChanges = !buffer_->params().trackChanges;
break;
- case LFUN_CHANGES_OUTPUT: {
+ case LFUN_CHANGES_OUTPUT:
buffer_->params().outputChanges = !buffer_->params().outputChanges;
break;
- }
case LFUN_CHANGE_NEXT:
findNextChange(this);
#warning FIXME changes
#endif
while (findNextChange(this))
- getLyXText()->acceptChange(cursor_);
- update();
+ getLyXText()->acceptOrRejectChanges(cursor_, LyXText::ACCEPT);
break;
}
#warning FIXME changes
#endif
while (findNextChange(this))
- getLyXText()->rejectChange(cursor_);
+ getLyXText()->acceptOrRejectChanges(cursor_, LyXText::REJECT);
break;
}
}
default:
- return false;
+ updateFlags = Update::None;
}
- return true;
+ return updateFlags;
}
// not expose the button for redraw. We adjust here the metrics dimension
// to enable a full redraw.
// FIXME: It is possible to redraw only the area around the button!
- if (need_redraw && metrics_info_.singlepar) {
+ if (need_redraw
+ && metrics_info_.update_strategy == SingleParUpdate) {
// FIXME: It should be possible to redraw only the area around
// the button by doing this:
//
dit[i].inset().edit(cursor_, true);
cursor_.setCursor(dit);
- // remember new position.
- cursor_.setTargetX();
cursor_.selection() = false;
}
if (!changed)
return false;
+ updateLabels(*buffer_);
+
updateMetrics(false);
buffer_->changed();
return true;
if (!badcursor && cursor_.inTexted())
checkDepm(cur, cursor_);
- cursor_ = cur;
+ // if the cursor was in an empty script inset and the new
+ // position is in the nucleus of the inset, notifyCursorLeaves
+ // will kill the script inset itself. So we check all the
+ // elements of the cursor to make sure that they are correct.
+ // For an example, see bug 2933:
+ // http://bugzilla.lyx.org/show_bug.cgi?id=2933
+ // The code below could maybe be moved to a DocIterator method.
+ //lyxerr << "cur before " << cur <<std::endl;
+ DocIterator dit(cur.inset());
+ dit.push_back(cur.bottom());
+ size_t i = 1;
+ while (i < cur.depth() && dit.nextInset() == &cur[i].inset()) {
+ dit.push_back(cur[i]);
+ ++i;
+ }
+ //lyxerr << "5 cur after" << dit <<std::endl;
+
+ cursor_.setCursor(dit);
cursor_.clearSelection();
// remember new position.
cursor_.setTargetX();
<< "size: " << size
<< endl;
- metrics_info_ = ViewMetricsInfo(pit1, pit2, y1, y2, singlepar, size);
+ metrics_info_ = ViewMetricsInfo(pit1, pit2, y1, y2,
+ singlepar? SingleParUpdate: FullScreenUpdate, size);
if (lyxerr.debugging(Debug::WORKAREA)) {
lyxerr[Debug::WORKAREA] << "BufferView::updateMetrics" << endl;