diff --git a/src/BufferView.C b/src/BufferView.C index 028466fc42..68a19e76b2 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -83,9 +83,9 @@ void BufferView::redraw() } -void BufferView::fitCursor() +bool BufferView::fitCursor() { - pimpl_->fitCursor(); + return pimpl_->fitCursor(); } diff --git a/src/BufferView.h b/src/BufferView.h index bb1a72c3a3..72bbc4c1dc 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -64,7 +64,7 @@ public: /// void redraw(); /// - void fitCursor(); + bool fitCursor(); /// void update(); // @@ -169,7 +169,7 @@ public: /// 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); /// diff --git a/src/BufferView2.C b/src/BufferView2.C index da33665c27..fa9456ea50 100644 --- a/src/BufferView2.C +++ b/src/BufferView2.C @@ -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()) { 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(); + return true; + } } + return false; } diff --git a/src/ChangeLog b/src/ChangeLog index 84747d7dd7..f3487eeac4 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,15 @@ 2002-03-29 Juergen Vigna + * 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 call the edit() as it is not needed (and wrong) IMO. (workAreaButtonPress): set the screen_first variable before evt. diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index 60dfe91d89..20c9268229 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,8 +1,14 @@ 2002-03-29 Juergen Vigna + * insettext.C (updateLocal): fixes to fitCursor calls when locking/ + unlocking inset. + + * insettabular.C (edit): call fitCursor(). + * insettext.C (insetButtonPress): change behaviour of no_selection to the one in the BufferView selection_possible and fix the spurious selection bug with it. + (localDispatch): revoke selection on BREAK... functions. 2002-03-28 Jean-Marc Lasgouttes diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 11e692028a..b4496156bc 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -578,6 +578,7 @@ void InsetTabular::edit(BufferView * bv, bool front) lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl; return; } + finishUndo(); locked = true; the_locking_inset = 0; inset_x = 0; @@ -588,7 +589,7 @@ void InsetTabular::edit(BufferView * bv, bool front) actcell = tabular->GetNumberOfCells() - 1; clearSelection(); resetPos(bv); - finishUndo(); + bv->fitCursor(); } @@ -1276,7 +1277,10 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action, } if (result < FINISHED) { if (!the_locking_inset) { -// showInsetCursor(bv); + if (bv->fitCursor()) + updateLocal(bv, FULL, false); + if (locked) + showInsetCursor(bv); } } else bv->unlockInset(this); @@ -1454,14 +1458,18 @@ void InsetTabular::hideInsetCursor(BufferView * bv) void InsetTabular::fitInsetCursor(BufferView * bv) const { if (the_locking_inset) { + int old_first_y = bv->text->first_y; the_locking_inset->fitInsetCursor(bv); + if (old_first_y != bv->text->first_y) + need_update = FULL; return; } LyXFont font; int const asc = lyxfont::maxAscent(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; } diff --git a/src/insets/insettext.C b/src/insets/insettext.C index e44b51aba4..3ceb4f4881 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -618,16 +618,17 @@ void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty) const } lt->fullRebreak(bv); setUpdateStatus(bv, what); - bool flag = (((need_update != CURSOR) && (need_update != NONE)) || - (lt->status() != LyXText::UNCHANGED) || lt->selection.set()); + bool flag = mark_dirty || + (((need_update != CURSOR) && (need_update != NONE)) || + (lt->status() != LyXText::UNCHANGED) || lt->selection.set()); if (!lt->selection.set()) lt->selection.cursor = lt->cursor; if (clear) lt = 0; + if (locked && (need_update & CURSOR) && bv->fitCursor()) + need_update |= FULL; if (flag) bv->updateInset(const_cast(this), mark_dirty); - else - bv->fitCursor(); if (need_update == CURSOR) need_update = NONE; @@ -681,7 +682,6 @@ void InsetText::edit(BufferView * bv, int x, int y, unsigned int button) font.setLanguage(bv->getParentLanguage(this)); setFont(bv, font, false); } -// showInsetCursor(bv); if (clear) lt = 0; @@ -689,6 +689,7 @@ void InsetText::edit(BufferView * bv, int x, int y, unsigned int button) if (drawFrame_ == LOCKED) code = CURSOR|DRAW_FRAME; updateLocal(bv, code, false); + showInsetCursor(bv); // Tell the paragraph dialog that we've entered an insettext. bv->owner()->getDialogs()->updateParagraph(); @@ -733,13 +734,13 @@ void InsetText::edit(BufferView * bv, bool front) font.setLanguage(bv->getParentLanguage(this)); setFont(bv, font, false); } -// showInsetCursor(bv); if (clear) lt = 0; int code = CURSOR; if (drawFrame_ == LOCKED) code = CURSOR|DRAW_FRAME; 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) { - no_selection = false; + no_selection = true; // use this to check mouse motion for selection! 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 = 0; } - if (inset) - no_selection = true; + if (!inset) + no_selection = false; if (bv->theLockingInset()) { 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) { - if (no_selection || ((mouse_x == x) && (mouse_y == y))) - return; if (the_locking_inset) { the_locking_inset->insetMotionNotify(bv, x - inset_x, y - inset_y,state); return; } + + if (no_selection || ((mouse_x == x) && (mouse_y == y))) + return; + bool clear = false; if (!lt) { lt = getLyXText(bv); @@ -1147,6 +1150,7 @@ InsetText::localDispatch(BufferView * bv, #ifdef WITH_WARNINGS #warning I changed this to always return Dispatched maybe it is wrong (20011001 Jug) #endif + updateLocal(bv, CURSOR, false); return result; } } @@ -1322,7 +1326,7 @@ InsetText::localDispatch(BufferView * bv, break; } lt->breakParagraph(bv, 0); - updwhat = FULL; + updwhat = CURSOR | FULL; updflag = true; break; case LFUN_BREAKPARAGRAPHKEEPLAYOUT: @@ -1331,7 +1335,7 @@ InsetText::localDispatch(BufferView * bv, break; } lt->breakParagraph(bv, 1); - updwhat = FULL; + updwhat = CURSOR | FULL; updflag = true; break; @@ -1343,7 +1347,7 @@ InsetText::localDispatch(BufferView * bv, setUndo(bv, Undo::INSERT, lt->cursor.par(), lt->cursor.par()->next()); lt->insertChar(bv, Paragraph::META_NEWLINE); - updwhat = CURSOR_PAR; + updwhat = CURSOR | CURSOR_PAR; updflag = true; } break; @@ -1454,6 +1458,9 @@ InsetText::localDispatch(BufferView * bv, if (result >= FINISHED) bv->unlockInset(this); + + if (result == DISPATCHED_NOUPDATE && (need_update & FULL)) + result = DISPATCHED; return result; } @@ -1771,7 +1778,8 @@ void InsetText::fitInsetCursor(BufferView * bv) const int const asc = lyxfont::maxAscent(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; } diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 63afaf34d7..af1d9f9571 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -922,6 +922,8 @@ string const LyXFunc::dispatch(kb_action action, string argument) TEXT()->cursorUp(owner->view()); moveCursorUpdate(true, false); owner->showState(); + } else { + owner->view()->update(TEXT(), BufferView::SELECT|BufferView::FITCUR); } goto exit_with_message; } else if (result == UpdatableInset::FINISHED_DOWN) { diff --git a/src/screen.C b/src/screen.C index e3d27a5d08..66df051f80 100644 --- a/src/screen.C +++ b/src/screen.C @@ -522,10 +522,11 @@ void LyXScreen::toggleToggle(LyXText * text, BufferView * bv, - text->toggle_end_cursor.row()->baseline() + 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), - static_cast(text->first_y + owner.height()))-y_offset; + static_cast(text->first_y + owner.height()))-offset; int const top = min(max(top_tmp, text->first_y), - static_cast(text->first_y + owner.height()))-y_offset; + static_cast(text->first_y + owner.height()))-offset; drawFromTo(text, bv, top - text->first_y, bottom - text->first_y, y_offset,