X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.C;h=ff3b47924018f876f07d04a52d8774abce6ac1c8;hb=0da3d53269a49c66b24615d24e20e441dcf7c07e;hp=06bae06ca3259d96b1841eaf7d4be5ce9d6e13ef;hpb=dbe93457cd49ad09c01691831bb59af93fe25556;p=lyx.git diff --git a/src/BufferView.C b/src/BufferView.C index 06bae06ca3..ff3b479240 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -155,6 +155,19 @@ void BufferView::setBuffer(Buffer * b) // 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(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()) ); @@ -278,13 +291,6 @@ bool BufferView::loadLyXFile(FileName const & filename, bool tolastfiles) } -void BufferView::reload() -{ - if (theBufferList().close(buffer_, false)) - loadLyXFile(FileName(buffer_->fileName())); -} - - void BufferView::resize() { if (!buffer_) @@ -358,15 +364,30 @@ bool BufferView::update(Update::flags flags) // 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; @@ -481,6 +502,9 @@ void BufferView::scrollDocView(int value) void BufferView::setCursorFromScrollbar() { + if (!buffer_) + return; + LyXText & t = buffer_->text(); int const height = 2 * defaultRowHeight(); @@ -492,10 +516,16 @@ void BufferView::setCursorFromScrollbar() 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; @@ -610,8 +640,8 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) 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()); @@ -682,7 +712,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) } -bool BufferView::dispatch(FuncRequest const & cmd) +Update::flags BufferView::dispatch(FuncRequest const & cmd) { //lyxerr << BOOST_CURRENT_FUNCTION // << [ cmd = " << cmd << "]" << endl; @@ -696,30 +726,34 @@ bool BufferView::dispatch(FuncRequest const & cmd) << " 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: @@ -727,14 +761,14 @@ bool BufferView::dispatch(FuncRequest const & cmd) 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: @@ -781,13 +815,13 @@ bool BufferView::dispatch(FuncRequest const & cmd) 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; } @@ -831,10 +865,9 @@ bool BufferView::dispatch(FuncRequest const & cmd) 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); @@ -851,8 +884,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) #warning FIXME changes #endif while (findNextChange(this)) - getLyXText()->acceptChange(cursor_); - update(); + getLyXText()->acceptOrRejectChanges(cursor_, LyXText::ACCEPT); break; } @@ -862,7 +894,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) #warning FIXME changes #endif while (findNextChange(this)) - getLyXText()->rejectChange(cursor_); + getLyXText()->acceptOrRejectChanges(cursor_, LyXText::REJECT); break; } @@ -987,10 +1019,10 @@ bool BufferView::dispatch(FuncRequest const & cmd) } default: - return false; + updateFlags = Update::None; } - return true; + return updateFlags; } @@ -1091,7 +1123,8 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0) // 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: // @@ -1244,8 +1277,6 @@ void BufferView::setCursor(DocIterator const & dit) dit[i].inset().edit(cursor_, true); cursor_.setCursor(dit); - // remember new position. - cursor_.setTargetX(); cursor_.selection() = false; } @@ -1266,6 +1297,8 @@ bool BufferView::checkDepm(LCursor & cur, LCursor & old) if (!changed) return false; + updateLabels(*buffer_); + updateMetrics(false); buffer_->changed(); return true; @@ -1287,7 +1320,24 @@ bool BufferView::mouseSetCursor(LCursor & cur) 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 <