Some more fixes to selection, fitCursor calls for InsetText/Tabular.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@3864 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Vigna 2002-03-29 15:49:45 +00:00
parent b45d1b31f5
commit 5e3b849ce7
9 changed files with 64 additions and 26 deletions

View File

@ -83,9 +83,9 @@ void BufferView::redraw()
} }
void BufferView::fitCursor() bool BufferView::fitCursor()
{ {
pimpl_->fitCursor(); return pimpl_->fitCursor();
} }

View File

@ -64,7 +64,7 @@ public:
/// ///
void redraw(); void redraw();
/// ///
void fitCursor(); bool fitCursor();
/// ///
void update(); void update();
// //
@ -169,7 +169,7 @@ public:
/// ///
void hideLockedInsetCursor(); void hideLockedInsetCursor();
/// ///
void fitLockedInsetCursor(int x, int y, int asc, int desc); bool fitLockedInsetCursor(int x, int y, int asc, int desc);
/// ///
int unlockInset(UpdatableInset * inset); int unlockInset(UpdatableInset * inset);
/// ///

View File

@ -587,13 +587,16 @@ void BufferView::hideLockedInsetCursor()
} }
void BufferView::fitLockedInsetCursor(int x, int y, int asc, int desc) bool BufferView::fitLockedInsetCursor(int x, int y, int asc, int desc)
{ {
if (theLockingInset() && available()) { if (theLockingInset() && available()) {
y += text->cursor.y() + theLockingInset()->insetInInsetY(); y += text->cursor.y() + theLockingInset()->insetInInsetY();
if (pimpl_->screen_->fitManualCursor(text, this, x, y, asc, desc)) if (pimpl_->screen_->fitManualCursor(text, this, x, y, asc, desc)) {
updateScrollbar(); updateScrollbar();
return true;
}
} }
return false;
} }

View File

@ -1,5 +1,15 @@
2002-03-29 Juergen Vigna <jug@sad.it> 2002-03-29 Juergen Vigna <jug@sad.it>
* lyxfunc.C (dispatch): add a missing fitCursor call.
* BufferView2.C (fitLockedInsetCursor): the inset needs to know if
it was scrolled by a cursor move, so return the bool status.
* BufferView.C (fitCursor): return the bool flag also to the outside
world as this is needed.
* screen.C (toggleToggle): don't subtract the offset if it's positive.
* BufferView_pimpl.C (workAreaButtonPress): just lock the inset don't * BufferView_pimpl.C (workAreaButtonPress): just lock the inset don't
call the edit() as it is not needed (and wrong) IMO. call the edit() as it is not needed (and wrong) IMO.
(workAreaButtonPress): set the screen_first variable before evt. (workAreaButtonPress): set the screen_first variable before evt.

View File

@ -1,8 +1,14 @@
2002-03-29 Juergen Vigna <jug@sad.it> 2002-03-29 Juergen Vigna <jug@sad.it>
* insettext.C (updateLocal): fixes to fitCursor calls when locking/
unlocking inset.
* insettabular.C (edit): call fitCursor().
* insettext.C (insetButtonPress): change behaviour of no_selection * insettext.C (insetButtonPress): change behaviour of no_selection
to the one in the BufferView selection_possible and fix the spurious to the one in the BufferView selection_possible and fix the spurious
selection bug with it. selection bug with it.
(localDispatch): revoke selection on BREAK... functions.
2002-03-28 Jean-Marc Lasgouttes <lasgouttes@freesurf.fr> 2002-03-28 Jean-Marc Lasgouttes <lasgouttes@freesurf.fr>

View File

@ -578,6 +578,7 @@ void InsetTabular::edit(BufferView * bv, bool front)
lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl; lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl;
return; return;
} }
finishUndo();
locked = true; locked = true;
the_locking_inset = 0; the_locking_inset = 0;
inset_x = 0; inset_x = 0;
@ -588,7 +589,7 @@ void InsetTabular::edit(BufferView * bv, bool front)
actcell = tabular->GetNumberOfCells() - 1; actcell = tabular->GetNumberOfCells() - 1;
clearSelection(); clearSelection();
resetPos(bv); resetPos(bv);
finishUndo(); bv->fitCursor();
} }
@ -1276,7 +1277,10 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
} }
if (result < FINISHED) { if (result < FINISHED) {
if (!the_locking_inset) { if (!the_locking_inset) {
// showInsetCursor(bv); if (bv->fitCursor())
updateLocal(bv, FULL, false);
if (locked)
showInsetCursor(bv);
} }
} else } else
bv->unlockInset(this); bv->unlockInset(this);
@ -1454,14 +1458,18 @@ void InsetTabular::hideInsetCursor(BufferView * bv)
void InsetTabular::fitInsetCursor(BufferView * bv) const void InsetTabular::fitInsetCursor(BufferView * bv) const
{ {
if (the_locking_inset) { if (the_locking_inset) {
int old_first_y = bv->text->first_y;
the_locking_inset->fitInsetCursor(bv); the_locking_inset->fitInsetCursor(bv);
if (old_first_y != bv->text->first_y)
need_update = FULL;
return; return;
} }
LyXFont font; LyXFont font;
int const asc = lyxfont::maxAscent(font); int const asc = lyxfont::maxAscent(font);
int const desc = lyxfont::maxDescent(font); int const desc = lyxfont::maxDescent(font);
bv->fitLockedInsetCursor(cursor_.x(), cursor_.y(), asc, desc); if (bv->fitLockedInsetCursor(cursor_.x(), cursor_.y(), asc, desc))
need_update = FULL;
} }

View File

@ -618,16 +618,17 @@ void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const
} }
lt->fullRebreak(bv); lt->fullRebreak(bv);
setUpdateStatus(bv, what); setUpdateStatus(bv, what);
bool flag = (((need_update != CURSOR) && (need_update != NONE)) || bool flag = mark_dirty ||
(lt->status() != LyXText::UNCHANGED) || lt->selection.set()); (((need_update != CURSOR) && (need_update != NONE)) ||
(lt->status() != LyXText::UNCHANGED) || lt->selection.set());
if (!lt->selection.set()) if (!lt->selection.set())
lt->selection.cursor = lt->cursor; lt->selection.cursor = lt->cursor;
if (clear) if (clear)
lt = 0; lt = 0;
if (locked && (need_update & CURSOR) && bv->fitCursor())
need_update |= FULL;
if (flag) if (flag)
bv->updateInset(const_cast<InsetText *>(this), mark_dirty); bv->updateInset(const_cast<InsetText *>(this), mark_dirty);
else
bv->fitCursor();
if (need_update == CURSOR) if (need_update == CURSOR)
need_update = NONE; need_update = NONE;
@ -681,7 +682,6 @@ void InsetText::edit(BufferView * bv, int x, int y, unsigned int button)
font.setLanguage(bv->getParentLanguage(this)); font.setLanguage(bv->getParentLanguage(this));
setFont(bv, font, false); setFont(bv, font, false);
} }
// showInsetCursor(bv);
if (clear) if (clear)
lt = 0; lt = 0;
@ -689,6 +689,7 @@ void InsetText::edit(BufferView * bv, int x, int y, unsigned int button)
if (drawFrame_ == LOCKED) if (drawFrame_ == LOCKED)
code = CURSOR|DRAW_FRAME; code = CURSOR|DRAW_FRAME;
updateLocal(bv, code, false); updateLocal(bv, code, false);
showInsetCursor(bv);
// Tell the paragraph dialog that we've entered an insettext. // Tell the paragraph dialog that we've entered an insettext.
bv->owner()->getDialogs()->updateParagraph(); bv->owner()->getDialogs()->updateParagraph();
@ -733,13 +734,13 @@ void InsetText::edit(BufferView * bv, bool front)
font.setLanguage(bv->getParentLanguage(this)); font.setLanguage(bv->getParentLanguage(this));
setFont(bv, font, false); setFont(bv, font, false);
} }
// showInsetCursor(bv);
if (clear) if (clear)
lt = 0; lt = 0;
int code = CURSOR; int code = CURSOR;
if (drawFrame_ == LOCKED) if (drawFrame_ == LOCKED)
code = CURSOR|DRAW_FRAME; code = CURSOR|DRAW_FRAME;
updateLocal(bv, code, false); updateLocal(bv, code, false);
showInsetCursor(bv);
} }
@ -918,7 +919,7 @@ bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset)
void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button) void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button)
{ {
no_selection = false; no_selection = true;
// use this to check mouse motion for selection! // use this to check mouse motion for selection!
mouse_x = x; mouse_x = x;
@ -953,8 +954,8 @@ void InsetText::insetButtonPress(BufferView * bv, int x, int y, int button)
the_locking_inset->insetUnlock(bv); the_locking_inset->insetUnlock(bv);
the_locking_inset = 0; the_locking_inset = 0;
} }
if (inset) if (!inset)
no_selection = true; no_selection = false;
if (bv->theLockingInset()) { if (bv->theLockingInset()) {
if (isHighlyEditableInset(inset)) { if (isHighlyEditableInset(inset)) {
@ -1057,13 +1058,15 @@ bool InsetText::insetButtonRelease(BufferView * bv, int x, int y, int button)
void InsetText::insetMotionNotify(BufferView * bv, int x, int y, int state) void InsetText::insetMotionNotify(BufferView * bv, int x, int y, int state)
{ {
if (no_selection || ((mouse_x == x) && (mouse_y == y)))
return;
if (the_locking_inset) { if (the_locking_inset) {
the_locking_inset->insetMotionNotify(bv, x - inset_x, the_locking_inset->insetMotionNotify(bv, x - inset_x,
y - inset_y,state); y - inset_y,state);
return; return;
} }
if (no_selection || ((mouse_x == x) && (mouse_y == y)))
return;
bool clear = false; bool clear = false;
if (!lt) { if (!lt) {
lt = getLyXText(bv); lt = getLyXText(bv);
@ -1147,6 +1150,7 @@ InsetText::localDispatch(BufferView * bv,
#ifdef WITH_WARNINGS #ifdef WITH_WARNINGS
#warning I changed this to always return Dispatched maybe it is wrong (20011001 Jug) #warning I changed this to always return Dispatched maybe it is wrong (20011001 Jug)
#endif #endif
updateLocal(bv, CURSOR, false);
return result; return result;
} }
} }
@ -1322,7 +1326,7 @@ InsetText::localDispatch(BufferView * bv,
break; break;
} }
lt->breakParagraph(bv, 0); lt->breakParagraph(bv, 0);
updwhat = FULL; updwhat = CURSOR | FULL;
updflag = true; updflag = true;
break; break;
case LFUN_BREAKPARAGRAPHKEEPLAYOUT: case LFUN_BREAKPARAGRAPHKEEPLAYOUT:
@ -1331,7 +1335,7 @@ InsetText::localDispatch(BufferView * bv,
break; break;
} }
lt->breakParagraph(bv, 1); lt->breakParagraph(bv, 1);
updwhat = FULL; updwhat = CURSOR | FULL;
updflag = true; updflag = true;
break; break;
@ -1343,7 +1347,7 @@ InsetText::localDispatch(BufferView * bv,
setUndo(bv, Undo::INSERT, setUndo(bv, Undo::INSERT,
lt->cursor.par(), lt->cursor.par()->next()); lt->cursor.par(), lt->cursor.par()->next());
lt->insertChar(bv, Paragraph::META_NEWLINE); lt->insertChar(bv, Paragraph::META_NEWLINE);
updwhat = CURSOR_PAR; updwhat = CURSOR | CURSOR_PAR;
updflag = true; updflag = true;
} }
break; break;
@ -1454,6 +1458,9 @@ InsetText::localDispatch(BufferView * bv,
if (result >= FINISHED) if (result >= FINISHED)
bv->unlockInset(this); bv->unlockInset(this);
if (result == DISPATCHED_NOUPDATE && (need_update & FULL))
result = DISPATCHED;
return result; return result;
} }
@ -1771,7 +1778,8 @@ void InsetText::fitInsetCursor(BufferView * bv) const
int const asc = lyxfont::maxAscent(font); int const asc = lyxfont::maxAscent(font);
int const desc = lyxfont::maxDescent(font); int const desc = lyxfont::maxDescent(font);
bv->fitLockedInsetCursor(cx(bv), cy(bv), asc, desc); if (bv->fitLockedInsetCursor(cx(bv), cy(bv), asc, desc))
need_update |= FULL;
} }

View File

@ -922,6 +922,8 @@ string const LyXFunc::dispatch(kb_action action, string argument)
TEXT()->cursorUp(owner->view()); TEXT()->cursorUp(owner->view());
moveCursorUpdate(true, false); moveCursorUpdate(true, false);
owner->showState(); owner->showState();
} else {
owner->view()->update(TEXT(), BufferView::SELECT|BufferView::FITCUR);
} }
goto exit_with_message; goto exit_with_message;
} else if (result == UpdatableInset::FINISHED_DOWN) { } else if (result == UpdatableInset::FINISHED_DOWN) {

View File

@ -522,10 +522,11 @@ void LyXScreen::toggleToggle(LyXText * text, BufferView * bv,
- text->toggle_end_cursor.row()->baseline() - text->toggle_end_cursor.row()->baseline()
+ text->toggle_end_cursor.row()->height(); + text->toggle_end_cursor.row()->height();
int const offset = y_offset < 0 ? y_offset : 0;
int const bottom = min(max(bottom_tmp, text->first_y), int const bottom = min(max(bottom_tmp, text->first_y),
static_cast<int>(text->first_y + owner.height()))-y_offset; static_cast<int>(text->first_y + owner.height()))-offset;
int const top = min(max(top_tmp, text->first_y), int const top = min(max(top_tmp, text->first_y),
static_cast<int>(text->first_y + owner.height()))-y_offset; static_cast<int>(text->first_y + owner.height()))-offset;
drawFromTo(text, bv, top - text->first_y, drawFromTo(text, bv, top - text->first_y,
bottom - text->first_y, y_offset, bottom - text->first_y, y_offset,