]> git.lyx.org Git - features.git/commitdiff
Fixes to insettabular/text.
authorJürgen Vigna <jug@sad.it>
Mon, 2 Oct 2000 15:20:53 +0000 (15:20 +0000)
committerJürgen Vigna <jug@sad.it>
Mon, 2 Oct 2000 15:20:53 +0000 (15:20 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1070 a592a061-630c-0410-9148-cb99ea01b6c8

ChangeLog
src/insets/insettabular.C
src/insets/insettabular.h
src/insets/insettext.C
src/lyxfunc.C
src/text.C

index a8b5113dfd47f35eca9e5d99d27724614f067bc5..723b91cb577a8036b16feb6eee76bece9c1828a7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2000-10-02  Juergen Vigna  <jug@sad.it>
+
+       * 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  <moz@compsoc.man.ac.uk>
 
        * src/frontends/gnome/FormCitation.h:
index 35145299ee3a68097e34d3b8cf9d85057b1bf0bd..8b00bf278dfacf8bfa39da12a263e8764b6c875b 100644 (file)
@@ -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);
index 9d54ffcdd123cca4d164c7580a3e954b05998438..6a5862f91b318936ec14105b85af7e54a711c41f 100644 (file)
@@ -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 *);
     ///
index bf2221af918dc3afd68d4b240635d110bfc22454..ddf5d153f9e59c54239bf9544ec08afebbc3ee58 100644 (file)
@@ -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:
index 8b4e13d4975b1efb7c5d051a581a6a7ff2ae8944..4a9879311767e1421301250bb8d0c74cbc87d6f4 100644 (file)
@@ -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;
                
index 9457af664d9c44801b168f35f2128c0ead438dee..519b7759827a491b7a445d38b2172e619ff5cf50 100644 (file)
@@ -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);