X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView_pimpl.C;h=1c52d6e331492a1cd2398a980ab57fe763a184ee;hb=41ecabf5197a74719dd125e974b062184208c96b;hp=2ed15ec3ceadf5bb93e0cf400275892437bd0f78;hpb=3f4d173edf668019f3620ab652ebb1de6d5e0e85;p=lyx.git diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index 2ed15ec3ce..1c52d6e331 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -51,6 +51,7 @@ #include "undo.h" #include "vspace.h" +#include "insets/insetbibtex.h" #include "insets/insetref.h" #include "insets/insettext.h" @@ -74,6 +75,7 @@ #include "support/types.h" #include +#include #include #include @@ -121,7 +123,7 @@ boost::signals::connection selectioncon; boost::signals::connection lostcon; -/// Get next inset of this class from current cursor position +/// Return an inset of this class if it exists at the current cursor position template T * getInsetByCode(LCursor & cur, InsetBase::Code code) { @@ -474,7 +476,7 @@ void BufferView::Pimpl::scrollDocView(int value) cur.clearSelection(); break; case bv_funcs::CUR_INSIDE: - int const y = bv_funcs::getPos(cur).y_; + int const y = bv_funcs::getPos(cur, cur.boundary()).y_; int const newy = min(last, max(y, first)); if (y != newy) { cur.reset(buffer_->inset()); @@ -519,10 +521,8 @@ void BufferView::Pimpl::workAreaKeyPress(LyXKeySymPtr key, * of the cursor. Note we cannot do this inside * dispatch() itself, because that's called recursively. */ - if (available()) { - cursor_timeout.restart(); + if (available()) screen().showCursor(*bv_); - } } @@ -596,7 +596,7 @@ bool BufferView::Pimpl::fitCursor() LyXFont const font = cursor_.getFont(); int const asc = font_metrics::maxAscent(font); int const des = font_metrics::maxDescent(font); - Point p = bv_funcs::getPos(cursor_); + Point const p = bv_funcs::getPos(cursor_, cursor_.boundary()); if (p.y_ - asc >= 0 && p.y_ + des < workarea().workHeight()) return false; } @@ -605,34 +605,42 @@ bool BufferView::Pimpl::fitCursor() } -void BufferView::Pimpl::update(bool fitcursor, bool forceupdate) +void BufferView::Pimpl::update(Update::flags flags) { - lyxerr << BOOST_CURRENT_FUNCTION - << "[fitcursor = " << fitcursor << ',' - << " forceupdate = " << forceupdate - << "] buffer: " << buffer_ << endl; + lyxerr[Debug::DEBUG] + << BOOST_CURRENT_FUNCTION + << "[fitcursor = " << (flags & Update::FitCursor) + << ", forceupdate = " << (flags & Update::Force) + << ", singlepar = " << (flags & Update::SinglePar) + << "] buffer: " << buffer_ << endl; // Check needed to survive LyX startup if (buffer_) { // Update macro store buffer_->buildMacros(); - // First drawing step CoordCache backup; std::swap(theCoords, backup); + + // This, together with doneUpdating(), verifies (using + // asserts) that screen redraw is not called from + // within itself. theCoords.startUpdating(); + // First drawing step ViewMetricsInfo vi = metrics(); + bool forceupdate(flags & Update::Force); - if (fitcursor && fitCursor()) { + if ((flags & Update::FitCursor) && fitCursor()) { forceupdate = true; - vi = metrics(); + vi = metrics(flags & Update::SinglePar); } if (forceupdate) { // Second drawing step screen().redraw(*bv_, vi); } else { - // Abort updating of the coord cache - just restore the old one + // Abort updating of the coord + // cache - just restore the old one std::swap(theCoords, backup); } } else @@ -654,8 +662,7 @@ void BufferView::Pimpl::cursorToggle() // have finished but are waiting to communicate this fact // to the rest of LyX. ForkedcallsController & fcc = ForkedcallsController::get(); - if (fcc.processesCompleted()) - fcc.handleCompletedProcesses(); + fcc.handleCompletedProcesses(); } cursor_timeout.restart(); @@ -759,8 +766,8 @@ void BufferView::Pimpl::center() bot.text()->redoParagraph(pit); Paragraph const & par = bot.text()->paragraphs()[pit]; anchor_ref_ = pit; - offset_ref_ = bv_funcs::coordOffset(cursor_).y_ + par.ascent() - - workarea().workHeight() / 2; + offset_ref_ = bv_funcs::coordOffset(cursor_, cursor_.boundary()).y_ + + par.ascent() - workarea().workHeight() / 2; } @@ -868,8 +875,7 @@ void BufferView::Pimpl::trackChanges() bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0) { - lyxerr << BOOST_CURRENT_FUNCTION - << "[ cmd0 " << cmd0 << "]" << endl; + //lyxerr << BOOST_CURRENT_FUNCTION << "[ cmd0 " << cmd0 << "]" << endl; // This is only called for mouse related events including // LFUN_FILE_OPEN generated by drag-and-drop. @@ -903,10 +909,10 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0) // Build temporary cursor. cmd.y = min(max(cmd.y,-1), workarea().workHeight()); InsetBase * inset = bv_->text()->editXY(cur, cmd.x, cmd.y); - lyxerr << BOOST_CURRENT_FUNCTION - << " * hit inset at tip: " << inset << endl; - lyxerr << BOOST_CURRENT_FUNCTION - << " * created temp cursor:" << cur << endl; + //lyxerr << BOOST_CURRENT_FUNCTION + // << " * hit inset at tip: " << inset << endl; + //lyxerr << BOOST_CURRENT_FUNCTION + // << " * created temp cursor:" << cur << endl; // Put anchor at the same position. cur.resetAnchor(); @@ -925,7 +931,10 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0) if (cur.result().dispatched()) { // Redraw if requested or necessary. - update(cur.result().update(), cur.result().update()); + if (cur.result().update()) + update(Update::FitCursor | Update::Force); + else + update(); } // See workAreaKeyPress @@ -964,7 +973,6 @@ FuncStatus BufferView::Pimpl::getStatus(FuncRequest const & cmd) case LFUN_FONT_STATE: case LFUN_INSERT_LABEL: case LFUN_BOOKMARK_SAVE: - case LFUN_REF_GOTO: case LFUN_GOTO_PARAGRAPH: case LFUN_GOTOERROR: case LFUN_GOTONOTE: @@ -975,10 +983,18 @@ FuncStatus BufferView::Pimpl::getStatus(FuncRequest const & cmd) case LFUN_MARK_ON: case LFUN_SETMARK: case LFUN_CENTER: + case LFUN_BIBDB_ADD: + case LFUN_BIBDB_DEL: case LFUN_WORDS_COUNT: flag.enabled(true); break; + case LFUN_LABEL_GOTO: { + flag.enabled(!cmd.argument.empty() + || getInsetByCode(cursor_, InsetBase::REF_CODE)); + break; + } + case LFUN_BOOKMARK_GOTO: flag.enabled(isSavedPosition(convert(cmd.argument))); break; @@ -1075,7 +1091,7 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd) restorePosition(convert(cmd.argument)); break; - case LFUN_REF_GOTO: { + case LFUN_LABEL_GOTO: { string label = cmd.argument; if (label.empty()) { InsetRef * inset = @@ -1200,6 +1216,26 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd) center(); break; + case LFUN_BIBDB_ADD: { + LCursor tmpcur = cursor_; + bv_funcs::findInset(tmpcur, InsetBase::BIBTEX_CODE, false); + InsetBibtex * inset = getInsetByCode(tmpcur, + InsetBase::BIBTEX_CODE); + if (inset) + inset->addDatabase(cmd.argument); + break; + } + + case LFUN_BIBDB_DEL: { + LCursor tmpcur = cursor_; + bv_funcs::findInset(tmpcur, InsetBase::BIBTEX_CODE, false); + InsetBibtex * inset = getInsetByCode(tmpcur, + InsetBase::BIBTEX_CODE); + if (inset) + inset->delDatabase(cmd.argument); + break; + } + case LFUN_WORDS_COUNT: { DocIterator from, to; if (cur.selection()) { @@ -1237,7 +1273,7 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd) } -ViewMetricsInfo BufferView::Pimpl::metrics() +ViewMetricsInfo BufferView::Pimpl::metrics(bool singlepar) { // Remove old position cache theCoords.clear(); @@ -1253,11 +1289,12 @@ ViewMetricsInfo BufferView::Pimpl::metrics() int pit2 = pit; size_t const npit = text->paragraphs().size(); - lyxerr << BOOST_CURRENT_FUNCTION - << " npit: " << npit - << " pit1: " << pit1 - << " pit2: " << pit2 - << endl; + lyxerr[Debug::DEBUG] + << BOOST_CURRENT_FUNCTION + << " npit: " << npit + << " pit1: " << pit1 + << " pit2: " << pit2 + << endl; // Rebreak anchor par text->redoParagraph(pit); @@ -1265,7 +1302,7 @@ ViewMetricsInfo BufferView::Pimpl::metrics() // Redo paragraphs above cursor if necessary int y1 = y0; - while (y1 > 0 && pit1 > 0) { + while (!singlepar && y1 > 0 && pit1 > 0) { y1 -= text->getPar(pit1).ascent(); --pit1; text->redoParagraph(pit1); @@ -1289,7 +1326,7 @@ ViewMetricsInfo BufferView::Pimpl::metrics() // Redo paragraphs below cursor if necessary int y2 = y0; - while (y2 < bv.workHeight() && pit2 < int(npit) - 1) { + while (!singlepar && y2 < bv.workHeight() && pit2 < int(npit) - 1) { y2 += text->getPar(pit2).descent(); ++pit2; text->redoParagraph(pit2); @@ -1307,10 +1344,11 @@ ViewMetricsInfo BufferView::Pimpl::metrics() y += text->getPar(pit).descent(); } - lyxerr << BOOST_CURRENT_FUNCTION - << " y1: " << y1 - << " y2: " << y2 - << endl; + lyxerr[Debug::DEBUG] + << BOOST_CURRENT_FUNCTION + << " y1: " << y1 + << " y2: " << y2 + << endl; - return ViewMetricsInfo(pit1, pit2, y1, y2); + return ViewMetricsInfo(pit1, pit2, y1, y2, singlepar); }