X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView_pimpl.C;h=1c52d6e331492a1cd2398a980ab57fe763a184ee;hb=41ecabf5197a74719dd125e974b062184208c96b;hp=76aae37e595d80dc20ce9da8306d7e3f8b93f720;hpb=3c4af0ffbf73289dc6a1dd63fe9e90f41fa8b546;p=lyx.git diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index 76aae37e59..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,8 +75,10 @@ #include "support/types.h" #include +#include #include +#include using lyx::pos_type; @@ -96,6 +99,7 @@ using std::min; using std::max; using std::string; using std::mem_fun_ref; +using std::vector; extern BufferList bufferlist; @@ -119,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) { @@ -132,7 +136,6 @@ T * getInsetByCode(LCursor & cur, InsetBase::Code code) return inset; } - } // anon namespace @@ -473,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()); @@ -518,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_); - } } @@ -595,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; } @@ -604,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 @@ -653,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(); @@ -722,8 +730,7 @@ void BufferView::Pimpl::restorePosition(unsigned int i) if (par == buffer_->par_iterator_end()) return; - bv_->text()->setCursor(cursor_, par.pit(), - min(par->size(), saved_positions[i].par_pos)); + bv_->setCursor(makeDocIterator(par, min(par->size(), saved_positions[i].par_pos))); if (i > 0) owner_->message(bformat(_("Moved to bookmark %1$d"), i)); @@ -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,18 +973,28 @@ 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: + case LFUN_REFERENCE_GOTO: case LFUN_WORD_FIND: case LFUN_WORD_REPLACE: case LFUN_MARK_OFF: 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; @@ -1072,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 = @@ -1102,13 +1121,29 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd) } // Set the cursor - bv_->setCursor(par, 0); + bv_->setCursor(makeDocIterator(par, 0)); update(); switchKeyMap(); break; } + case LFUN_GOTOERROR: + bv_funcs::gotoInset(bv_, InsetBase::ERROR_CODE, false); + break; + + case LFUN_GOTONOTE: + bv_funcs::gotoInset(bv_, InsetBase::NOTE_CODE, false); + break; + + case LFUN_REFERENCE_GOTO: { + vector tmp; + tmp.push_back(InsetBase::LABEL_CODE); + tmp.push_back(InsetBase::REF_CODE); + bv_funcs::gotoInset(bv_, tmp, true); + break; + } + case LFUN_TRACK_CHANGES: trackChanges(); break; @@ -1181,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()) { @@ -1218,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(); @@ -1234,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); @@ -1246,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); @@ -1270,20 +1326,15 @@ ViewMetricsInfo BufferView::Pimpl::metrics() // Redo paragraphs below cursor if necessary int y2 = y0; - lyxerr << "y2 (1): " << y2 << endl; - while (y2 < bv.workHeight() && pit2 < int(npit) - 1) { + while (!singlepar && y2 < bv.workHeight() && pit2 < int(npit) - 1) { y2 += text->getPar(pit2).descent(); - lyxerr << "y2 (2): " << y2 << endl; ++pit2; text->redoParagraph(pit2); y2 += text->getPar(pit2).ascent(); - lyxerr << "y2 (3): " << y2 << endl; } // Take care of descent of last line y2 += text->getPar(pit2).descent(); - lyxerr << "text->getPar(pit2).descent(): " << text->getPar(pit2).descent() << endl; - lyxerr << "y2 (4): " << y2 << endl; // The coordinates of all these paragraphs are correct, cache them int y = y1; @@ -1293,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); }