From: Jürgen Vigna Date: Mon, 2 Oct 2000 15:20:53 +0000 (+0000) Subject: Fixes to insettabular/text. X-Git-Tag: 1.6.10~21946 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=2b300d130c21037e9ae9cb547024be53111d2014;p=features.git Fixes to insettabular/text. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1070 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/ChangeLog b/ChangeLog index a8b5113dfd..723b91cb57 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2000-10-02 Juergen Vigna + + * src/insets/insettabular.C (LocalDispatch): fixed selection code, + now you can type or do stuff inside the table-cell also when in dummy + position, fixed visible cursor. + + * src/insets/insettext.C (Edit): fixing cursor-view position. + + * src/lyxfunc.C (Dispatch): use * text variable so that it can + be used for equal functions in lyxfunc and insettext. + + * src/text.C (GetVisibleRow): fixed a small clear_area bug. + 2000-10-02 John Levon * src/frontends/gnome/FormCitation.h: diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 35145299ee..8b00bf278d 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -526,6 +526,7 @@ bool InsetTabular::UnlockInsetInInset(BufferView * bv, UpdatableInset * inset, the_locking_inset = 0; if (lr) moveRight(bv, false); + ShowInsetCursor(bv, false); UpdateLocal(bv, CELL, false); return true; } @@ -719,6 +720,7 @@ UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView * bv, int action, sel_pos_start = sel_pos_end = cursor.pos(); sel_cell_start = sel_cell_end = actcell; the_locking_inset=0; + ShowInsetCursor(bv); result = DISPATCHED; return result; } @@ -728,22 +730,24 @@ UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView * bv, int action, HideInsetCursor(bv); result=DISPATCHED; switch (action) { - // Normal chars not handled here - case -1: - break; // --- Cursor Movements --------------------------------------------- case LFUN_RIGHTSEL: if (tabular->IsLastCellInRow(actcell) && !cellstart(cursor.pos())) break; moveRight(bv, false); - sel_pos_end = cursor.pos(); +#if 0 if (!cellstart(cursor.pos())) { + sel_pos_end = cursor.pos(); if (tabular->right_column_of_cell(sel_cell_start) > tabular->right_column_of_cell(actcell)) sel_cell_end = actcell+1; else sel_cell_end = actcell; } +#else + sel_pos_end = cursor.pos(); + sel_cell_end = actcell; +#endif UpdateLocal(bv, SELECTION, false); break; case LFUN_RIGHT: @@ -757,14 +761,19 @@ UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView * bv, int action, if (tabular->IsFirstCellInRow(actcell) && cellstart(cursor.pos())) break; moveLeft(bv, false); - sel_pos_end = cursor.pos(); +#if 0 if (cellstart(cursor.pos())) { + sel_pos_end = cursor.pos(); if (tabular->column_of_cell(sel_cell_start) >= tabular->column_of_cell(actcell)) sel_cell_end = actcell; else sel_cell_end = actcell-1; } +#else + sel_pos_end = cursor.pos(); + sel_cell_end = actcell; +#endif UpdateLocal(bv, SELECTION, false); break; case LFUN_LEFT: @@ -884,15 +893,28 @@ UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView * bv, int action, UpdateLocal(bv, INIT, true); break; default: + // we try to activate the actual inset and put this event down to + // the insets dispatch function. result = UNDISPATCHED; + if (the_locking_inset) + break; + if (ActivateCellInset(bv)) { + result=the_locking_inset->LocalDispatch(bv, action, arg); + if (result == DISPATCHED_NOUPDATE) + return result; + else if (result == DISPATCHED) { + the_locking_inset->ToggleInsetCursor(bv); + UpdateLocal(bv, CELL, false); + the_locking_inset->ToggleInsetCursor(bv); + return result; + } else { + result = UNDISPATCHED; + } + } break; } if (result!=FINISHED) { if (!the_locking_inset) { -#if 0 - if (ocell != actcell) - bview->getOwner()->getPopups().updateFormTabular(); -#endif ShowInsetCursor(bv); } } else @@ -990,7 +1012,7 @@ void InsetTabular::ToggleInsetCursor(BufferView * bv) } -void InsetTabular::ShowInsetCursor(BufferView * bv) +void InsetTabular::ShowInsetCursor(BufferView * bv, bool show) { if (!cursor_visible) { LyXFont font; // = GetFont(par, cursor.pos); @@ -998,7 +1020,8 @@ void InsetTabular::ShowInsetCursor(BufferView * bv) int const asc = lyxfont::maxAscent(font); int const desc = lyxfont::maxDescent(font); bv->fitLockedInsetCursor(cursor.x(), cursor.y(), asc, desc); - bv->showLockedInsetCursor(cursor.x(), cursor.y(), asc, desc); + if (show) + bv->showLockedInsetCursor(cursor.x(), cursor.y(), asc, desc); cursor_visible = true; } } @@ -1115,12 +1138,12 @@ UpdatableInset::RESULT InsetTabular::moveRight(BufferView * bv, bool lock) if (tabular->IsLastCell(actcell)) return FINISHED; ++actcell; - cursor.pos((cursor.pos() + 1) % 2); + cursor.pos(0); } else if (lock) { if (ActivateCellInset(bv)) return DISPATCHED; } else { // before the inset - cursor.pos((cursor.pos() + 1) % 2); + cursor.pos(1); } resetPos(bv); return DISPATCHED_NOUPDATE; @@ -1129,17 +1152,17 @@ UpdatableInset::RESULT InsetTabular::moveRight(BufferView * bv, bool lock) UpdatableInset::RESULT InsetTabular::moveLeft(BufferView * bv, bool lock) { - if (!cursor.pos()) { - if (!actcell) - return FINISHED; - cursor.pos(0); - } - cursor.pos((cursor.pos() - 1) % 2); - if (!cellstart(cursor.pos())) { + if (cellstart(cursor.pos()) && !actcell) + return FINISHED; + if (cellstart(cursor.pos())) { --actcell; + cursor.pos(1); } else if (lock) { // behind the inset + cursor.pos(0); if (ActivateCellInset(bv, 0, 0, 0, true)) return DISPATCHED; + } else { + cursor.pos(0); } resetPos(bv); return DISPATCHED_NOUPDATE; @@ -1173,9 +1196,6 @@ bool InsetTabular::moveNextCell(BufferView * bv) if (tabular->IsLastCell(actcell)) return false; ++actcell; - cursor.pos((cursor.pos() + 1) % 2); - if (!cellstart(cursor.pos())) - cursor.pos((cursor.pos() + 1) % 2); resetPos(bv); return true; } @@ -1186,9 +1206,6 @@ bool InsetTabular::movePrevCell(BufferView * bv) if (!actcell) // first cell return false; --actcell; - cursor.pos((cursor.pos() - 1) % 2); - if (cellstart(cursor.pos())) - cursor.pos((cursor.pos() - 1) % 2); resetPos(bv); return true; } @@ -1566,7 +1583,7 @@ bool InsetTabular::ActivateCellInset(BufferView * bv, int x, int y, int button, } inset_x = cursor.x() - top_x + tabular->GetBeginningOfTextInCell(actcell); inset_y = cursor.y(); - inset->Edit(bv, x - inset_x, y - inset_y, button); + inset->Edit(bv, x, y - inset_y, button); if (!the_locking_inset) return false; UpdateLocal(bv, CELL, false); diff --git a/src/insets/insettabular.h b/src/insets/insettabular.h index 9d54ffcdd1..6a5862f91b 100644 --- a/src/insets/insettabular.h +++ b/src/insets/insettabular.h @@ -186,7 +186,7 @@ private: void DrawCellSelection(Painter &, int x, int baseline, int row, int column, int cell) const; /// - void ShowInsetCursor(BufferView *); + void ShowInsetCursor(BufferView *, bool show=true); /// void HideInsetCursor(BufferView *); /// diff --git a/src/insets/insettext.C b/src/insets/insettext.C index bf2221af91..ddf5d153f9 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -336,7 +336,9 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, } TEXT(bv)->refresh_y = 0; TEXT(bv)->status = LyXText::UNCHANGED; - if ((drawFrame == ALWAYS) || ((drawFrame == LOCKED) && locked)) { + if ((need_update != CURSOR_PAR) && + ((drawFrame == ALWAYS) || ((drawFrame == LOCKED) && locked))) + { pain.rectangle(top_x + 1, baseline - insetAscent + 1, width(bv, f) - 1, insetAscent + insetDescent - 1, frame_color); @@ -467,6 +469,7 @@ void InsetText::Edit(BufferView * bv, int x, int y, unsigned int button) y+TEXT(bv)->first+insetAscent); TEXT(bv)->sel_cursor = TEXT(bv)->cursor; bv->text->FinishUndo(); + ShowInsetCursor(bv); UpdateLocal(bv, FULL, false); } @@ -769,6 +772,7 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_RIGHT: result = moveRight(bv); bv->text->FinishUndo(); + TEXT(bv)->ClearSelection(); UpdateLocal(bv, CURSOR, false); break; case LFUN_LEFTSEL: @@ -780,6 +784,7 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_LEFT: bv->text->FinishUndo(); result= moveLeft(bv); + TEXT(bv)->ClearSelection(); UpdateLocal(bv, CURSOR, false); break; case LFUN_DOWNSEL: @@ -791,6 +796,7 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_DOWN: bv->text->FinishUndo(); result = moveDown(bv); + TEXT(bv)->ClearSelection(); UpdateLocal(bv, CURSOR, false); break; case LFUN_UPSEL: @@ -802,6 +808,7 @@ InsetText::LocalDispatch(BufferView * bv, case LFUN_UP: bv->text->FinishUndo(); result = moveUp(bv); + TEXT(bv)->ClearSelection(); UpdateLocal(bv, CURSOR, false); break; case LFUN_HOME: diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 8b4e13d497..4a98793117 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -685,10 +685,9 @@ string const LyXFunc::Dispatch(int ac, } } - // If in math mode pass the control to - // the math inset [asierra060396] - if (owner->view()->available() && - owner->view()->the_locking_inset) { + LyXText * text = 0; + if (owner->view()->available() && owner->view()->the_locking_inset) { + text = owner->view()->the_locking_inset->getLyXText(owner->view()); UpdatableInset::RESULT result; if ((action > 1) || ((action == LFUN_UNKNOWN_ACTION) && (keyseq.length >= -1))) @@ -774,6 +773,9 @@ string const LyXFunc::Dispatch(int ac, } } + if (!text) + text = owner->view()->text; + switch(action) { // --- Misc ------------------------------------------- case LFUN_WORDFINDFORWARD : @@ -1456,22 +1458,26 @@ string const LyXFunc::Dispatch(int ac, case LFUN_UPCASE_WORD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->ChangeWordCase(owner->view(), - LyXText::text_uppercase); + text->ChangeWordCase(owner->view(), LyXText::text_uppercase); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); break; case LFUN_LOWCASE_WORD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->ChangeWordCase(owner->view(), - LyXText::text_lowercase); + text->ChangeWordCase(owner->view(), LyXText::text_lowercase); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); break; case LFUN_CAPITALIZE_WORD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->ChangeWordCase(owner->view(), - LyXText::text_capitalization); + text->ChangeWordCase(owner->view(), + LyXText::text_capitalization); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); break; @@ -1689,27 +1695,31 @@ string const LyXFunc::Dispatch(int ac, break; case LFUN_WORDRIGHT: - if(!owner->view()->text->mark_set) + if(!text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) - owner->view()->text->CursorLeftOneWord(owner->view()); + if (text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) + text->CursorLeftOneWord(owner->view()); else - owner->view()->text->CursorRightOneWord(owner->view()); + text->CursorRightOneWord(owner->view()); owner->view()->text->FinishUndo(); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); moveCursorUpdate(false); owner->showState(); break; case LFUN_WORDLEFT: - if(!owner->view()->text->mark_set) + if(!text->mark_set) owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) - owner->view()->text->CursorRightOneWord(owner->view()); + if (text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) + text->CursorRightOneWord(owner->view()); else - owner->view()->text->CursorLeftOneWord(owner->view()); + text->CursorLeftOneWord(owner->view()); owner->view()->text->FinishUndo(); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); moveCursorUpdate(false); owner->showState(); break; @@ -1885,18 +1895,19 @@ string const LyXFunc::Dispatch(int ac, break; case LFUN_SETMARK: - if(owner->view()->text->mark_set) { + if(text->mark_set) { owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); setMessage(N_("Mark removed")); } else { owner->view()->beforeChange(); - owner->view()->text->mark_set = 1; + text->mark_set = 1; owner->view()->update(BufferView::SELECT|BufferView::FITCUR); setMessage(N_("Mark set")); } - owner->view()->text->sel_cursor = - owner->view()->text->cursor; + text->sel_cursor = text->cursor; + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); break; case LFUN_DELETE: @@ -1963,7 +1974,9 @@ string const LyXFunc::Dispatch(int ac, /* -------> Delete word forward. */ case LFUN_DELETE_WORD_FORWARD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->DeleteWordForward(owner->view()); + text->DeleteWordForward(owner->view()); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); moveCursorUpdate(false); owner->showState(); @@ -1972,7 +1985,9 @@ string const LyXFunc::Dispatch(int ac, /* -------> Delete word backward. */ case LFUN_DELETE_WORD_BACKWARD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->DeleteWordBackward(owner->view()); + text->DeleteWordBackward(owner->view()); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); moveCursorUpdate(false); owner->showState(); @@ -1981,7 +1996,9 @@ string const LyXFunc::Dispatch(int ac, /* -------> Kill to end of line. */ case LFUN_DELETE_LINE_FORWARD: owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->DeleteLineForward(owner->view()); + text->DeleteLineForward(owner->view()); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE); moveCursorUpdate(false); break; @@ -1990,9 +2007,10 @@ string const LyXFunc::Dispatch(int ac, case LFUN_MARK_OFF: owner->view()->beforeChange(); owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->sel_cursor = - owner->view()->text->cursor; + text->sel_cursor = text->cursor; setMessage(N_("Mark off")); + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); break; /* -------> Set mark on. */ @@ -2000,8 +2018,9 @@ string const LyXFunc::Dispatch(int ac, owner->view()->beforeChange(); owner->view()->text->mark_set = 1; owner->view()->update(BufferView::SELECT|BufferView::FITCUR); - owner->view()->text->sel_cursor = - owner->view()->text->cursor; + text->sel_cursor = text->cursor; + if (text->inset_owner) + owner->view()->updateInset(text->inset_owner, true); setMessage(N_("Mark on")); break; diff --git a/src/text.C b/src/text.C index 9457af664d..519b775982 100644 --- a/src/text.C +++ b/src/text.C @@ -2992,7 +2992,8 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset, if (cleared) { clear_area = true; } else if (clear_area) { - int w = (inset_owner ? inset_owner->width(bview, font) : ww); +#warning Should be fixed with a lyxinset::clear_width(bv, font) function! (Jug) + int w = (inset_owner ? inset_owner->width(bview, font)-2 : ww); pain.fillRectangle(x_offset, y_offset, w, row_ptr->height()); } else if (inset != 0) { int h = row_ptr->baseline() - inset->ascent(bview, font);