From e4025acc328853a5b3967a3c1e4b193ca34ba341 Mon Sep 17 00:00:00 2001 From: Alfredo Braunstein Date: Fri, 2 Apr 2004 22:43:14 +0000 Subject: [PATCH] revert last commits. I've detected problems with it (i.e. it is not complete as is) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8593 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BufferView.C | 24 +++++++++++++++++++++++- src/BufferView_pimpl.C | 17 ++++++++--------- src/ChangeLog | 18 ------------------ src/cursor.C | 23 ++++++++++++++++++++++- src/cursor.h | 4 ++++ src/frontends/screen.C | 2 +- src/lyxfunc.C | 1 + src/text3.C | 3 +++ 8 files changed, 62 insertions(+), 30 deletions(-) diff --git a/src/BufferView.C b/src/BufferView.C index fff8a99f2b..e1176d8f32 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -379,10 +379,23 @@ void BufferView::setCursor(ParIterator const & par, lyx::pos_type pos) par[i].inset().edit(cursor(), true); cursor().setCursor(makeDocIterator(par, pos), false); - par[0].text()->redoParagraph(par[0].par()); } +/* +if the fitCursor call refers to some point in never-explored-land, then we +don't have y information in insets there, then we cannot even do an update +to get it (because we need the y infomation for setting top_y first). So +this is solved in putSelectionAt with: + +- setting top_y to the y of the outerPar (that has good info) +- calling update +- calling cursor().updatePos() +- then call fitCursor() + +Ab. +*/ + void BufferView::putSelectionAt(DocIterator const & cur, int length, bool backwards) { @@ -390,7 +403,15 @@ void BufferView::putSelectionAt(DocIterator const & cur, cursor().clearSelection(); + LyXText & text = *cur[0].text(); setCursor(par, cur.pos()); + + // hack for the chicken and egg problem + top_y(text.getPar(par.outerPar()).y); + + update(); + //text.setCursor(cursor(), cur.par(), cur.pos()); + cursor().updatePos(); if (length) { if (backwards) { @@ -403,6 +424,7 @@ void BufferView::putSelectionAt(DocIterator const & cur, } fitCursor(); + update(); } diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index c0d5b6ac62..20fefddfd6 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -358,12 +358,8 @@ void BufferView::Pimpl::setBuffer(Buffer * b) bool BufferView::Pimpl::fitCursor() { - // this is enough to get the right y cursor info for fitCursor - cursor_[0].text()->redoParagraph(cursor_[0].par()); - if (!screen().fitCursor(bv_)) return false; - updateScrollbar(); return true; } @@ -392,6 +388,7 @@ void BufferView::Pimpl::resizeCurrentBuffer() text->init(bv_); update(); + bv_->cursor().updatePos(); fitCursor(); switchKeyMap(); @@ -895,12 +892,14 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0) // If the request was dispatched the temp cursor should have been // in a way to be used as new 'real' cursor. - if (res.dispatched()) { + if (res.dispatched()) bv_->cursor() = cur; - // Redraw if requested or necessary. - if (fitCursor() || res.update()) - update(); - } + + // Redraw if requested or necessary. + if (res.update()) + update(); + if (fitCursor()) + update(); // see workAreaKeyPress cursor_timeout.restart(); diff --git a/src/ChangeLog b/src/ChangeLog index 53144b562d..399e48c7ab 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,22 +1,4 @@ -2004-04-03 Alfredo Braunstein - - * BufferView_pimpl.C (fitCursor): oversight - -2004-04-03 Alfredo Braunstein - - * cursor.[Ch] (LCursor): remove cached_y_ and updatePos - (getDim) remove outdated comment - - * BufferView_pimpl.C (fitCursor): call redoParagraph on the outer - cursor paragraph to obtain good cursor y info - (workAreaDispatch): remove unneeded update call - - * BufferView.C (setCursor): call redoParagraph, as some insets - could have been opened - (putSelectionAt): remove the double update and all that cleverness - (simplified and transfered to fitCursor where it belongs). - 2004-04-01 Alfredo Braunstein * text3.C (getStatus): add LFUN_BEGINNINGBUF diff --git a/src/cursor.C b/src/cursor.C index d731738c86..5b27a79b7c 100644 --- a/src/cursor.C +++ b/src/cursor.C @@ -84,7 +84,8 @@ void region(CursorSlice const & i1, CursorSlice const & i2, LCursor::LCursor(BufferView & bv) - : DocIterator(), bv_(&bv), anchor_(), x_target_(-1), + : DocIterator(), bv_(&bv), + anchor_(), cached_y_(0), x_target_(-1), selection_(false), mark_(false) {} @@ -94,6 +95,7 @@ void LCursor::reset(InsetBase & inset) clear(); push_back(CursorSlice(inset)); anchor_ = DocIterator(inset); + cached_y_ = 0; clearTargetX(); selection_ = false; mark_ = false; @@ -234,6 +236,15 @@ int LCursor::currentMode() } +void LCursor::updatePos() +{ + BOOST_ASSERT(!empty()); + if (size() > 1) + cached_y_ = bv().top_y() + back().inset().yo(); + //cached_y_ = back().inset().yo(); +} + + void LCursor::getDim(int & asc, int & des) const { if (inMathed()) { @@ -259,6 +270,16 @@ void LCursor::getPos(int & x, int & y) const y = 0; if (!empty()) inset().getCursorPos(back(), x, y); + // getCursorPos gives _screen_ coordinates. We need to add + // top_y to get document coordinates. This is hidden in cached_y_. + //y += cached_y_ - inset().yo(); + // The rest is non-obvious. The reason we have to have these + // extra computation is that the getCursorPos() calls rely + // on the inset's own knowledge of its screen position. + // If we scroll up or down in a big enough increment, + // inset->draw() is not called: this doesn't update + // inset.yo_, so getCursor() returns an old value. + // Ugly as you like. } diff --git a/src/cursor.h b/src/cursor.h index a3b0b3e75f..ad3cf1fbb8 100644 --- a/src/cursor.h +++ b/src/cursor.h @@ -149,6 +149,8 @@ public: CursorSlice & anchor(); /// access to selection anchor CursorSlice const & anchor() const; + /// cache the absolute coordinate from the top inset + void updatePos(); /// sets anchor to cursor position void resetAnchor(); /// access to owning BufferView @@ -185,6 +187,8 @@ public: DispatchResult disp_; private: + /// + int cached_y_; /** * The target x position of the cursor. This is used for when * we have text like : diff --git a/src/frontends/screen.C b/src/frontends/screen.C index 3317e00f9d..93f30487b8 100644 --- a/src/frontends/screen.C +++ b/src/frontends/screen.C @@ -214,7 +214,7 @@ bool LyXScreen::fitCursor(BufferView * bv) bv->cursor().getPos(x, y); bv->cursor().getDim(asc, desc); //lyxerr << "LyXScreen::fitCursor: x: " << x << " y: " << y - // << " top_y: " << top_y << endl; + // << " top_y: " << top_y << endl; bool const big_row = h / 4 < asc + desc && asc + desc < h; diff --git a/src/lyxfunc.C b/src/lyxfunc.C index da82260329..550b627fe3 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -1362,6 +1362,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) if (view()->available()) { view()->fitCursor(); view()->update(); + view()->cursor().updatePos(); // if we executed a mutating lfun, mark the buffer as dirty if (getStatus(cmd).enabled() && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer) diff --git a/src/text3.C b/src/text3.C index 99c28c9f4d..8fcea9ed27 100644 --- a/src/text3.C +++ b/src/text3.C @@ -1136,6 +1136,9 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) finishUndo(); cur.x_target() = cursorX(cur.top()); + if (bv->fitCursor()) + selection_possible = false; + // Insert primary selection with middle mouse // if there is a local selection in the current buffer, // insert this