X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.C;h=d1d768ac36b652dc994091710f066efa08d17265;hb=35204f8f33d7400a5fefeffea533fb4cb4097211;hp=f09269112951c3a995a4ed7c8b79d6ee7cd15d26;hpb=2fe0529df8a06082d2aae38fd24b7de5ea18b10b;p=lyx.git diff --git a/src/BufferView.C b/src/BufferView.C index f092691129..d1d768ac36 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -339,7 +339,7 @@ bool BufferView::multiParSel() } -bool BufferView::update(Update::flags flags) +std::pair BufferView::update(Update::flags flags) { // This is close to a hot-path. if (lyxerr.debugging(Debug::DEBUG)) { @@ -353,22 +353,40 @@ bool BufferView::update(Update::flags flags) // Check needed to survive LyX startup if (!buffer_) - return false; + return make_pair(false, false); - lyxerr[Debug::WORKAREA] << "BufferView::update" << std::endl; + if (lyxerr.debugging(Debug::WORKAREA)) { + lyxerr[Debug::WORKAREA] << "BufferView::update" << std::endl; + } // Update macro store buffer_->buildMacros(); - // First drawing step - updateMetrics(flags & Update::SinglePar); - + // Now do the first drawing step if needed. This consists on updating + // the CoordCache in updateMetrics(). // The second drawing step is done in WorkArea::redraw() if needed. - bool const need_second_step = - (flags & (Update::Force | Update::FitCursor | Update::MultiParSel)) - && (fitCursor() || multiParSel()); - return need_second_step; + // Case when no explicit update is requested. + if (!(flags & (Update::SinglePar | Update::Force))) { + if (fitCursor() || multiParSel()) { + // a CoordCache update is needed + updateMetrics(false); + // tell the frontend to update the screen. + return make_pair(true, false); + } + // no need to do anything. + return make_pair(false, false); + } + + // We are now in the case (Update::SinglePar | Update::Force) + bool single_par = flags & Update::SinglePar; + updateMetrics(single_par); + + // Don't forget to do check for fitCursor() and multiParSel(). + fitCursor(); + multiParSel(); + + return make_pair(true, single_par); } @@ -388,11 +406,13 @@ void BufferView::updateScrollbar() offset_ref_ = 0; } - lyxerr[Debug::GUI] - << BOOST_CURRENT_FUNCTION - << " Updating scrollbar: height: " << t.paragraphs().size() - << " curr par: " << cursor_.bottom().pit() - << " default height " << defaultRowHeight() << endl; + if (lyxerr.debugging(Debug::GUI)) { + lyxerr[Debug::GUI] + << BOOST_CURRENT_FUNCTION + << " Updating scrollbar: height: " << t.paragraphs().size() + << " curr par: " << cursor_.bottom().pit() + << " default height " << defaultRowHeight() << endl; + } // It would be better to fix the scrollbar to understand // values in [0..1] and divide everything by wh @@ -723,21 +743,34 @@ bool BufferView::dispatch(FuncRequest const & cmd) case LFUN_PARAGRAPH_GOTO: { int const id = convert(to_utf8(cmd.argument())); - ParIterator par = buffer_->getParFromID(id); - if (par == buffer_->par_iterator_end()) { - lyxerr[Debug::INFO] << "No matching paragraph found! [" - << id << ']' << endl; - break; - } else { - lyxerr[Debug::INFO] << "Paragraph " << par->id() - << " found." << endl; + int i = 0; + for (Buffer * b = buffer_; i == 0 || b != buffer_; b = theBufferList().next(b)) { + ParIterator par = b->getParFromID(id); + if (par == b->par_iterator_end()) { + lyxerr[Debug::INFO] + << "No matching paragraph found! [" + << id << "]." << endl; + } else { + lyxerr[Debug::INFO] + << "Paragraph " << par->id() + << " found in buffer `" + << b->fileName() << "'." << endl; + + 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); + } + break; + } + ++i; } - - // Set the cursor - setCursor(makeDocIterator(par, 0)); - - update(); - switchKeyMap(); break; } @@ -989,7 +1022,7 @@ void BufferView::workAreaResize(int width, int height) } -bool BufferView::workAreaDispatch(FuncRequest const & cmd0) +std::pair BufferView::workAreaDispatch(FuncRequest const & cmd0) { //lyxerr << BOOST_CURRENT_FUNCTION << "[ cmd0 " << cmd0 << "]" << endl; @@ -997,26 +1030,21 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0) // LFUN_FILE_OPEN generated by drag-and-drop. FuncRequest cmd = cmd0; + // E.g. Qt mouse press when no buffer if (!buffer_) - return false; + return make_pair(false, false); LCursor cur(*this); cur.push(buffer_->inset()); cur.selection() = cursor_.selection(); - // Doesn't go through lyxfunc, so we need to update - // the layout choice etc. ourselves - - // E.g. Qt mouse press when no buffer - if (!buffer_) - return false; - // Either the inset under the cursor or the // surrounding LyXText will handle this event. // Build temporary cursor. cmd.y = min(max(cmd.y, -1), height_); InsetBase * inset = buffer_->text().editXY(cur, cmd.x, cmd.y); + //lyxerr << BOOST_CURRENT_FUNCTION // << " * hit inset at tip: " << inset << endl; //lyxerr << BOOST_CURRENT_FUNCTION @@ -1029,23 +1057,21 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0) // via the temp cursor. If the inset wishes to change the real // cursor it has to do so explicitly by using // cur.bv().cursor() = cur; (or similar) - if (inset) + if (inset) { inset->dispatch(cur, cmd); + } // Now dispatch to the temporary cursor. If the real cursor should // be modified, the inset's dispatch has to do so explicitly. if (!cur.result().dispatched()) cur.dispatch(cmd); - if (cur.result().dispatched()) { - // Redraw if requested or necessary. - if (cur.result().update()) - update(Update::FitCursor | Update::Force); - else - update(Update::FitCursor | Update::MultiParSel); - } + // Redraw if requested and necessary. + if (cur.result().dispatched() && cur.result().update()) + return update(cur.result().update()); - return true; + // When the above and the inner function are fixed, we can do this: + return make_pair(false, false); } @@ -1197,14 +1223,9 @@ ViewMetricsInfo const & BufferView::viewMetricsInfo() void BufferView::updateMetrics(bool singlepar) { - // FIXME (Abdel 19/10/2006): - // There's something fishy in tabular. The coord_cache_ is not - // correctly reconstructed when a character is trying to be inserted. - // Not clearing out the coord_cache_ fixes the crash but there is a - // bad side effect: buffer-begin and buffer-end do not update the screen. - // - // Remove old position cache - coord_cache_.clear(); + // Clear out the position cache in case of full screen redraw. + if (!singlepar) + coord_cache_.clear(); LyXText & buftext = buffer_->text(); pit_type size = int(buftext.paragraphs().size()); @@ -1365,6 +1386,7 @@ void BufferView::menuInsertLyXFile(string const & filenm) ErrorList & el = buffer_->errorList("Parse"); // Copy the inserted document error list into the current buffer one. el = buf.errorList("Parse"); + recordUndo(cursor_); cap::pasteParagraphList(cursor_, buf.paragraphs(), buf.params().textclass, el); res = _("Document %1$s inserted.");