X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.C;h=29ad13b273bf25b7c66faf71ff4e2a3b177c8199;hb=e7f4618bcce770369cf46335c2c7f0164b4b8857;hp=75a82063c8bafcf7ac5f7cb1c7b0049047a5dbeb;hpb=d6cc04e762b00bc3b31ccccb2683bf9119bc91b9;p=lyx.git diff --git a/src/BufferView.C b/src/BufferView.C index 75a82063c8..29ad13b273 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -63,7 +63,6 @@ #include "frontends/Alert.h" #include "frontends/FileDialog.h" #include "frontends/FontMetrics.h" -#include "frontends/Selection.h" #include "graphics/Previews.h" @@ -155,6 +154,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()) ); @@ -196,7 +208,8 @@ void BufferView::setBuffer(Buffer * b) cursor_.resetAnchor(); cursor_.setCursor(buffer_->getCursor().asDocIterator(&(buffer_->inset()))); cursor_.setSelection(); - theSelection().haveSelection(cursor_.selection()); + // do not set selection to the new buffer because we + // only paste recent selection. } } @@ -489,6 +502,9 @@ void BufferView::scrollDocView(int value) void BufferView::setCursorFromScrollbar() { + if (!buffer_) + return; + LyXText & t = buffer_->text(); int const height = 2 * defaultRowHeight(); @@ -500,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; @@ -576,7 +598,7 @@ void BufferView::switchKeyMap() if (!lyxrc.rtl_support) return; - if (getLyXText()->real_current_font.isRightToLeft()) { + if (cursor_.innerText()->real_current_font.isRightToLeft()) { if (intl_->keymap == Intl::PRIMARY) intl_->keyMapSec(); } else { @@ -660,8 +682,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) case LFUN_CHANGES_OUTPUT: { OutputParams runparams; - LaTeXFeatures features(*buffer_, buffer_->params(), runparams); - flag.enabled(buffer_ && features.isAvailable("dvipost")); + flag.enabled(buffer_ && LaTeXFeatures::isAvailable("dvipost")); flag.setOnOff(buffer_->params().outputChanges); break; } @@ -690,7 +711,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; @@ -704,30 +725,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: @@ -789,13 +814,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; } @@ -839,10 +864,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); @@ -853,26 +877,24 @@ bool BufferView::dispatch(FuncRequest const & cmd) showDialog("changes"); break; - case LFUN_ALL_CHANGES_ACCEPT: { + case LFUN_ALL_CHANGES_ACCEPT: + // select complete document cursor_.reset(buffer_->inset()); -#ifdef WITH_WARNINGS -#warning FIXME changes -#endif - while (findNextChange(this)) - getLyXText()->acceptChange(cursor_); - update(); + cursor_.selHandle(true); + buffer_->text().cursorBottom(cursor_); + // accept everything in a single step to support atomic undo + buffer_->text().acceptOrRejectChanges(cursor_, LyXText::ACCEPT); break; - } - case LFUN_ALL_CHANGES_REJECT: { + case LFUN_ALL_CHANGES_REJECT: + // select complete document cursor_.reset(buffer_->inset()); -#ifdef WITH_WARNINGS -#warning FIXME changes -#endif - while (findNextChange(this)) - getLyXText()->rejectChange(cursor_); + cursor_.selHandle(true); + buffer_->text().cursorBottom(cursor_); + // reject everything in a single step to support atomic undo + // Note: reject does not work recursively; the user may have to repeat the operation + buffer_->text().acceptOrRejectChanges(cursor_, LyXText::REJECT); break; - } case LFUN_WORD_FIND: find(this, cmd); @@ -995,10 +1017,10 @@ bool BufferView::dispatch(FuncRequest const & cmd) } default: - return false; + updateFlags = Update::None; } - return true; + return updateFlags; } @@ -1031,6 +1053,10 @@ void BufferView::clearSelection() { if (buffer_) { cursor_.clearSelection(); + // Clear the selection buffer. Otherwise a subsequent + // middle-mouse-button paste would use the selection buffer, + // not the more current external selection. + cap::clearSelection(); xsel_cache_.set = false; // The buffer did not really change, but this causes the // redraw we need because we cleared the selection above. @@ -1200,22 +1226,6 @@ void BufferView::gotoLabel(docstring const & label) } -LyXText * BufferView::getLyXText() -{ - LyXText * text = cursor_.innerText(); - BOOST_ASSERT(text); - return text; -} - - -LyXText const * BufferView::getLyXText() const -{ - LyXText const * text = cursor_.innerText(); - BOOST_ASSERT(text); - return text; -} - - TextMetrics const & BufferView::textMetrics(LyXText const * t) const { return const_cast(this)->textMetrics(t); @@ -1273,6 +1283,8 @@ bool BufferView::checkDepm(LCursor & cur, LCursor & old) if (!changed) return false; + updateLabels(*buffer_); + updateMetrics(false); buffer_->changed(); return true; @@ -1313,8 +1325,6 @@ bool BufferView::mouseSetCursor(LCursor & cur) cursor_.setCursor(dit); cursor_.clearSelection(); - // remember new position. - cursor_.setTargetX(); finishUndo(); return update; } @@ -1333,7 +1343,7 @@ void BufferView::putSelectionAt(DocIterator const & cur, cursor_.setSelection(cursor_, -length); } else cursor_.setSelection(cursor_, length); - theSelection().haveSelection(cursor_.selection()); + cap::saveSelection(cursor_); } }