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)
{
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) {
}
fitCursor();
+ update();
}
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;
}
text->init(bv_);
update();
+ bv_->cursor().updatePos();
fitCursor();
switchKeyMap();
// 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();
-2004-04-03 Alfredo Braunstein <abraunst@lyx.org>
-
- * BufferView_pimpl.C (fitCursor): oversight
-
-2004-04-03 Alfredo Braunstein <abraunst@lyx.org>
-
- * 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 <abraunst@lyx.org>
* text3.C (getStatus): add LFUN_BEGINNINGBUF
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)
{}
clear();
push_back(CursorSlice(inset));
anchor_ = DocIterator(inset);
+ cached_y_ = 0;
clearTargetX();
selection_ = false;
mark_ = false;
}
+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()) {
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.
}
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
DispatchResult disp_;
private:
+ ///
+ int cached_y_;
/**
* The target x position of the cursor. This is used for when
* we have text like :
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;
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)
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