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
This commit is contained in:
Alfredo Braunstein 2004-04-02 22:43:14 +00:00
parent 9ae9abddf8
commit e4025acc32
8 changed files with 62 additions and 30 deletions

View File

@ -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();
}

View File

@ -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();

View File

@ -1,22 +1,4 @@
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

View File

@ -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.
}

View File

@ -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 :

View File

@ -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;

View File

@ -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)

View File

@ -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