]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insettabular.C
prepare for 1.1.6pre2
[lyx.git] / src / insets / insettabular.C
index ada68fc0addece9da40e613d29f37b314b42aaa1..3636d99d7903110856b04d8374fcddc573840b5c 100644 (file)
@@ -53,7 +53,7 @@ using std::swap;
 
     
 struct tabular_features {
-    int action;
+    LyXTabular::Feature action;
     string feature;
 };
 
@@ -85,7 +85,6 @@ static tabular_features tabularFeatures[] =
     { LyXTabular::M_VALIGN_TOP, "m-valign-top" },
     { LyXTabular::M_VALIGN_BOTTOM, "m-valign-bottom" },
     { LyXTabular::M_VALIGN_CENTER, "m-valign-center" },
-    { LyXTabular::DELETE_TABULAR, "delete-tabular" },
     { LyXTabular::MULTICOLUMN, "multicolumn" },
     { LyXTabular::SET_ALL_LINES, "set-all-lines" },
     { LyXTabular::UNSET_ALL_LINES, "unset-all-lines" },
@@ -116,8 +115,8 @@ bool cellstart(LyXParagraph::size_type p)
 }
 
 
-InsetTabular::InsetTabular(Buffer * buf, int rows, int columns)
-       : buffer(buf)
+InsetTabular::InsetTabular(Buffer const & buf, int rows, int columns)
+       : buffer(&buf)
 {
     if (rows <= 0)
         rows = 1;
@@ -130,26 +129,24 @@ InsetTabular::InsetTabular(Buffer * buf, int rows, int columns)
     locked = no_selection = cursor_visible = false;
     cursor.x_fix(-1);
     oldcell = -1;
-    actcell = 0;
+    actrow = actcell = 0;
     cursor.pos(0);
-    sel_pos_start = sel_pos_end = sel_cell_start = sel_cell_end = 0;
-    dialogs_ = 0;
+    clearSelection();
     need_update = INIT;
 }
 
 
-InsetTabular::InsetTabular(InsetTabular const & tab, Buffer * buf)
-       : buffer(buf)
+InsetTabular::InsetTabular(InsetTabular const & tab, Buffer const & buf)
+       : buffer(&buf)
 {
     tabular = new LyXTabular(this, *(tab.tabular));
     the_locking_inset = 0;
     locked = no_selection = cursor_visible = false;
     cursor.x_fix(-1);
     oldcell = -1;
-    actcell = 0;
+    actrow = actcell = 0;
     cursor.pos(0);
     sel_pos_start = sel_pos_end = sel_cell_start = sel_cell_end = 0;
-    dialogs_ = 0;
     need_update = INIT;
 }
 
@@ -157,14 +154,13 @@ InsetTabular::InsetTabular(InsetTabular const & tab, Buffer * buf)
 InsetTabular::~InsetTabular()
 {
     delete tabular;
-    if (dialogs_)
-       dialogs_->hideTabular(this);
+    hideDialog();
 }
 
 
-Inset * InsetTabular::Clone() const
+Inset * InsetTabular::Clone(Buffer const & buf) const
 {
-    InsetTabular * t = new InsetTabular(*this, buffer);
+    InsetTabular * t = new InsetTabular(*this, buf);
     delete t->tabular;
     t->tabular = tabular->Clone(t);
     return t;
@@ -227,7 +223,7 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
                        float & x, bool cleared) const
 {
     Painter & pain = bv->painter();
-    int i, j, cell = 0;
+    int i, j;
     int nx;
     float cx;
 
@@ -255,45 +251,19 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
        return;
     bool dodraw;
     x += ADD_TO_TABULAR_WIDTH;
-    if (cleared || (need_update == FULL) || (need_update == CELL)) {
-       for(i = 0; i < tabular->rows(); ++i) {
+    if (cleared) {
+       int cell = 0;
+       for (i = 0; i < tabular->rows(); ++i) {
            nx = int(x);
            dodraw = ((baseline + tabular->GetDescentOfRow(i)) > 0) &&
-                   (baseline - tabular->GetAscentOfRow(i)) < pain.paperHeight();
-           for(j = 0; j < tabular->columns(); ++j) {
+                   (baseline - tabular->GetAscentOfRow(i))<pain.paperHeight();
+           for (j = 0; j < tabular->columns(); ++j) {
                if (tabular->IsPartOfMultiColumn(i, j))
                    continue;
                cx = nx + tabular->GetBeginningOfTextInCell(cell);
-               if (hasSelection())
-                   DrawCellSelection(pain, nx, baseline, i, j, cell);
-               if (dodraw && !cleared && locked && the_locking_inset) {
-                   if (the_locking_inset == tabular->GetCellInset(cell)) {
-                       LyXText::text_status st = bv->text->status;
-                       do {
-                           bv->text->status = st;
-                           if (need_update == CELL) {
-                               // clear before the inset
-                               pain.fillRectangle(
-                                   nx + 1,
-                                   baseline - tabular->GetAscentOfRow(i) + 1,
-                                   int(cx - nx - 1),
-                                   tabular->GetAscentOfRow(i) +
-                                   tabular->GetDescentOfRow(i) - 1);
-                               // clear behind the inset
-                               pain.fillRectangle(
-                                   int(cx + the_locking_inset->width(bv,font) + 1),
-                                   baseline - tabular->GetAscentOfRow(i) + 1,
-                                   tabular->GetWidthOfColumn(cell) -
-                                   tabular->GetBeginningOfTextInCell(cell) -
-                                   the_locking_inset->width(bv,font) - 1,
-                                   tabular->GetAscentOfRow(i) +
-                                   tabular->GetDescentOfRow(i) - 1);
-                           }
-                           tabular->GetCellInset(cell)->draw(
-                               bv, font, baseline, cx, false);
-                       } while(bv->text->status == LyXText::CHANGED_IN_DRAW);
-                   }
-               } else if (dodraw) {
+               if (dodraw) {
+                   if (hasSelection())
+                       DrawCellSelection(pain, nx, baseline, i, j, cell);
                    tabular->GetCellInset(cell)->draw(bv, font, baseline, cx,
                                                      cleared);
                    DrawCellLines(pain, nx, baseline, i, cell);
@@ -303,8 +273,103 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
            }
            baseline += tabular->GetDescentOfRow(i) +
                tabular->GetAscentOfRow(i + 1) +
-               tabular->GetAdditionalHeight(cell + 1);
+               tabular->GetAdditionalHeight(cell);
+       }
+    } else if (need_update == CELL) {
+       int cell = 0;
+       nx = int(x);
+       if (the_locking_inset) {
+           Inset * inset = tabular->GetCellInset(cell);
+           for (i = 0; (inset != the_locking_inset) && (i < tabular->rows());
+                ++i)
+           {
+               for (j = 0; (inset != the_locking_inset) && (j < tabular->columns()); ++j)
+               {
+                   if (tabular->IsPartOfMultiColumn(i, j))
+                       continue;
+                   nx += tabular->GetWidthOfColumn(cell);
+                   ++cell;
+                   inset = tabular->GetCellInset(cell);
+               }
+               if (tabular->row_of_cell(cell) > i) {
+                   nx = int(x);
+                   baseline += tabular->GetDescentOfRow(i) +
+                       tabular->GetAscentOfRow(i + 1) +
+                       tabular->GetAdditionalHeight(cell);
+               }
+           }
+       } else {
+           for (i = 0; (cell < actcell) && (i < tabular->rows()); ++i) {
+               for (j = 0; (cell < actcell) && (j < tabular->columns()); ++j) {
+                   if (tabular->IsPartOfMultiColumn(i, j))
+                       continue;
+                   nx += tabular->GetWidthOfColumn(cell);
+                   ++cell;
+               }
+               if (tabular->row_of_cell(cell) > i) {
+                   nx = int(x);
+                   baseline += tabular->GetDescentOfRow(i) +
+                       tabular->GetAscentOfRow(i + 1) +
+                       tabular->GetAdditionalHeight(cell);
+               }
+           }
+       }
+       i = tabular->row_of_cell(cell);
+       if (the_locking_inset != tabular->GetCellInset(cell)) {
+           lyxerr[Debug::INSETS] << "ERROR this shouldn't happen\n";
+           return;
+       }
+#if 0
+       LyXText::text_status st = bv->text->status;
+       do {
+           cx = nx + tabular->GetBeginningOfTextInCell(cell);
+           bv->text->status = st;
+           if (need_update == CELL) {
+               // clear before the inset
+               pain.fillRectangle(
+                   nx + 1,
+                   baseline - tabular->GetAscentOfRow(i) + 1,
+                   int(cx - nx - 1),
+                   tabular->GetAscentOfRow(i) +
+                   tabular->GetDescentOfRow(i) - 1);
+               // clear behind the inset
+               pain.fillRectangle(
+                   int(cx + the_locking_inset->width(bv,font) + 1),
+                   baseline - tabular->GetAscentOfRow(i) + 1,
+                   tabular->GetWidthOfColumn(cell) -
+                   tabular->GetBeginningOfTextInCell(cell) -
+                   the_locking_inset->width(bv,font) -
+                   tabular->GetAdditionalWidth(cell) - 1,
+                   tabular->GetAscentOfRow(i) +
+                   tabular->GetDescentOfRow(i) - 1);
+           }
+           tabular->GetCellInset(cell)->draw(bv,font,baseline, cx, false);
+       } while(bv->text->status == LyXText::CHANGED_IN_DRAW);
+#else
+       cx = nx + tabular->GetBeginningOfTextInCell(cell);
+       if (need_update == CELL) {
+           // clear before the inset
+           pain.fillRectangle(
+               nx + 1,
+               baseline - tabular->GetAscentOfRow(i) + 1,
+               int(cx - nx - 1),
+               tabular->GetAscentOfRow(i) +
+               tabular->GetDescentOfRow(i) - 1);
+           // clear behind the inset
+           pain.fillRectangle(
+               int(cx + the_locking_inset->width(bv,font) + 1),
+               baseline - tabular->GetAscentOfRow(i) + 1,
+               tabular->GetWidthOfColumn(cell) -
+               tabular->GetBeginningOfTextInCell(cell) -
+               the_locking_inset->width(bv,font) -
+               tabular->GetAdditionalWidth(cell) - 1,
+               tabular->GetAscentOfRow(i) +
+               tabular->GetDescentOfRow(i) - 1);
        }
+       tabular->GetCellInset(cell)->draw(bv,font,baseline, cx, false);
+       if (bv->text->status == LyXText::CHANGED_IN_DRAW)
+           return;
+#endif
     }
     x -= ADD_TO_TABULAR_WIDTH;
     x += width(bv, font);
@@ -384,9 +449,13 @@ void InsetTabular::update(BufferView * bv, LyXFont const & font, bool reinit)
            owner()->update(bv, font, true);
        return;
     }
-    if (the_locking_inset)
+    if (the_locking_inset) {
        the_locking_inset->update(bv, font, reinit);
-    switch(need_update) {
+//     resetPos(bv);
+//     inset_x = cursor.x() - top_x + tabular->GetBeginningOfTextInCell(actcell);
+//     inset_y = cursor.y();
+    }
+    switch (need_update) {
     case INIT:
     case FULL:
     case CELL:
@@ -418,7 +487,9 @@ void InsetTabular::Edit(BufferView * bv, int x, int y, unsigned int button)
     }
     locked = true;
     the_locking_inset = 0;
-    inset_pos = inset_x = inset_y = 0;
+    inset_pos = 0;
+    inset_x = 0;
+    inset_y = 0;
     setPos(bv, x, y);
     sel_pos_start = sel_pos_end = cursor.pos();
     sel_cell_start = sel_cell_end = actcell;
@@ -426,7 +497,7 @@ void InsetTabular::Edit(BufferView * bv, int x, int y, unsigned int button)
     if (InsetHit(bv, x, y)) {
        ActivateCellInset(bv, x, y, button);
     }
-    UpdateLocal(bv, NONE, false);
+//    UpdateLocal(bv, NONE, false);
 //    bv->getOwner()->getPopups().updateFormTabular();
 }
 
@@ -456,11 +527,14 @@ void InsetTabular::InsetUnlock(BufferView * bv)
 void InsetTabular::UpdateLocal(BufferView * bv, UpdateCodes what,
                               bool mark_dirty) const
 {
-    need_update = what;
+    if (need_update < what) // only set this if it has greater update
+       need_update = what;
     // Dirty Cast! (Lgb)
-    bv->updateInset(const_cast<InsetTabular *>(this), mark_dirty);
-    if (locked && (what != NONE))
-       resetPos(bv);
+    if (need_update != NONE) {
+       bv->updateInset(const_cast<InsetTabular *>(this), mark_dirty);
+       if (locked) // && (what != NONE))
+           resetPos(bv);
+    }
 }
 
 
@@ -506,6 +580,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;
     }
@@ -513,9 +588,8 @@ bool InsetTabular::UnlockInsetInInset(BufferView * bv, UpdatableInset * inset,
        if (inset->LyxCode() == TABULAR_CODE &&
            !the_locking_inset->GetFirstLockingInsetOfType(TABULAR_CODE))
        {
-           dialogs_ = bv->owner()->getDialogs();
-           dialogs_->updateTabular(this);
-           oldcell = actcell;
+               bv->owner()->getDialogs()->updateTabular(this);
+               oldcell = actcell;
        }
        return true;
     }
@@ -527,14 +601,16 @@ bool InsetTabular::UpdateInsetInInset(BufferView * bv, Inset * inset)
 {
     if (!the_locking_inset)
        return false;
-    if (the_locking_inset != inset)
-       return the_locking_inset->UpdateInsetInInset(bv, inset);
+    if (the_locking_inset != inset) {
+       if (!the_locking_inset->UpdateInsetInInset(bv, inset))
+           return false;
+    }
     UpdateLocal(bv, CELL, false);
     return true;
 }
 
 
-int InsetTabular::InsetInInsetY()
+unsigned int InsetTabular::InsetInInsetY()
 {
     if (!the_locking_inset)
        return 0;
@@ -569,8 +645,8 @@ bool InsetTabular::InsertInset(BufferView * bv, Inset * inset)
 
 void InsetTabular::InsetButtonPress(BufferView * bv, int x, int y, int button)
 {
-    if (hasSelection()) {
-       sel_pos_start = sel_pos_end = sel_cell_start = sel_cell_end = 0;
+    if (hasSelection() && (button != 3)) {
+       clearSelection();
        UpdateLocal(bv, SELECTION, false);
     }
     no_selection = false;
@@ -588,6 +664,8 @@ void InsetTabular::InsetButtonPress(BufferView * bv, int x, int y, int button)
     bool const inset_hit = InsetHit(bv, x, y);
 
     if ((ocell == actcell) && the_locking_inset && inset_hit) {
+       cursor.pos(0); // always before the inset!
+       resetPos(bv);
         the_locking_inset->InsetButtonPress(bv,
                                            x - inset_x, y - inset_y, button);
         return;
@@ -595,7 +673,7 @@ void InsetTabular::InsetButtonPress(BufferView * bv, int x, int y, int button)
        the_locking_inset->InsetUnlock(bv);
     }
     the_locking_inset = 0;
-    if (inset_hit && bv->the_locking_inset) {
+    if (inset_hit && bv->theLockingInset()) {
        if (ActivateCellInset(bv, x, y, button))
            the_locking_inset->InsetButtonPress(bv, x - inset_x,
                                                y - inset_y, button);
@@ -616,8 +694,7 @@ void InsetTabular::InsetButtonRelease(BufferView * bv,
                return;
            }
        }
-       dialogs_ = bv->owner()->getDialogs();
-        dialogs_->showTabular(this);
+       bv->owner()->getDialogs()->showTabular(this);
        return;
     }
     if (the_locking_inset) {
@@ -637,7 +714,7 @@ void InsetTabular::InsetMotionNotify(BufferView * bv, int x, int y, int button)
     }
     if (!no_selection) {
        HideInsetCursor(bv);
-       int const old_pos = sel_pos_end;
+       LyXParagraph::size_type const old_pos = sel_pos_end;
        int const old_cell = actcell;
 
        setPos(bv, x, y);
@@ -697,6 +774,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;
        }
@@ -706,22 +784,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:
@@ -735,14 +815,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:
@@ -815,28 +900,17 @@ UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView * bv, int action,
        if (hs)
            UpdateLocal(bv, SELECTION, false);
        break;
-#if 0
-    case LFUN_LAYOUT_TABLE:
-    {
-       dialogs_ = bv->owner()->getDialogs();
-        dialogs_->showTabular(this);
-    }
-    break;
-#else
-#warning Jürgen, have a look. Is this correct? (Lgb)
     case LFUN_LAYOUT_TABULAR:
     {
-       dialogs_ = bv->owner()->getDialogs();
-        dialogs_->showTabular(this);
+       bv->owner()->getDialogs()->showTabular(this);
     }
     break;
-#endif
     case LFUN_TABULAR_FEATURE:
        if (!TabularFeatures(bv, arg))
            result = UNDISPATCHED;
        break;
     case LFUN_CUT:
-       if (!copySelection())
+       if (!copySelection(bv))
            break;
        bv->text->SetUndo(bv->buffer(), Undo::DELETE,
 #ifndef NEW_INSETS
@@ -854,7 +928,7 @@ UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView * bv, int action,
        if (!hasSelection())
            break;
        bv->text->FinishUndo();
-       copySelection();
+       copySelection(bv);
        break;
     case LFUN_PASTE:
        if (!hasPasteBuffer())
@@ -872,15 +946,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, 0, 0, 0, !cellstart(cursor.pos()))) {
+           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
@@ -899,7 +986,7 @@ int InsetTabular::Latex(Buffer const * buf, ostream & os,
 int InsetTabular::Ascii(Buffer const * buf, ostream & os, int) const
 {
     // This should be changed to a real ascii export
-    return tabular->Latex(buf, os, false, false);
+    return tabular->Ascii(buf, os);
 }
 
 
@@ -909,9 +996,9 @@ int InsetTabular::Linuxdoc(Buffer const *, ostream &) const
 }
 
 
-int InsetTabular::DocBook(Buffer const *, ostream &) const
+int InsetTabular::DocBook(Buffer const * buf, ostream & os) const
 {
-    return 0;
+    return tabular->DocBook(buf,os);
 }
 
 
@@ -930,9 +1017,20 @@ bool InsetTabular::calculate_dimensions_of_cells(BufferView * bv,
     InsetText * inset;
     bool changed = false;
     
-    for(int i = 0; i < tabular->rows(); ++i) {
+    // if we have a locking_inset we should have to check only this cell for
+    // change so I'll try this to have a boost, but who knows ;)
+    if ((need_update != INIT) &&
+       (the_locking_inset == tabular->GetCellInset(actcell))) {
+       maxAsc = the_locking_inset->ascent(bv, font);
+       maxDesc = the_locking_inset->descent(bv, font);
+       changed = tabular->SetWidthOfCell(actcell, the_locking_inset->width(bv, font));
+       changed = tabular->SetAscentOfRow(actrow, maxAsc + ADD_TO_HEIGHT) || changed;
+       changed = tabular->SetDescentOfRow(actrow, maxDesc + ADD_TO_HEIGHT) || changed;
+       return changed;
+    }
+    for (int i = 0; i < tabular->rows(); ++i) {
        maxAsc = maxDesc = 0;
-       for(int j= 0; j < tabular->columns(); ++j) {
+       for (int j= 0; j < tabular->columns(); ++j) {
            if (tabular->IsPartOfMultiColumn(i,j))
                continue;
            ++cell;
@@ -950,7 +1048,8 @@ bool InsetTabular::calculate_dimensions_of_cells(BufferView * bv,
 }
 
 
-void InsetTabular::GetCursorPos(BufferView *, int & x, int & y) const
+void InsetTabular::GetCursorPos(BufferView *,
+                               int & x, int & y) const
 {
     x = cursor.x() - top_x;
     y = cursor.y();
@@ -977,7 +1076,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);
@@ -985,7 +1084,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;
     }
 }
@@ -1013,7 +1113,7 @@ void InsetTabular::setPos(BufferView * bv, int x, int y) const
     // first search the right row
     while((ly < y) && (actrow < tabular->rows())) {
         cursor.y(cursor.y() + tabular->GetDescentOfRow(actrow) +
-           tabular->GetAscentOfRow(actrow+1) +
+           tabular->GetAscentOfRow(actrow + 1) +
             tabular->GetAdditionalHeight(tabular->GetCellNumber(actrow + 1,
                                                                actcol)));
         ++actrow;
@@ -1024,9 +1124,19 @@ void InsetTabular::setPos(BufferView * bv, int x, int y) const
     // now search the right column
     int lx = tabular->GetWidthOfColumn(actcell) -
        tabular->GetAdditionalWidth(actcell);
-    for(; !tabular->IsLastCellInRow(actcell) && (lx < x);
+#if 0
+#warning Jürgen, can you rewrite this to _not_ use the sequencing operator. (Lgb)
+    for (; !tabular->IsLastCellInRow(actcell) && (lx < x);
        ++actcell,lx += tabular->GetWidthOfColumn(actcell) +
            tabular->GetAdditionalWidth(actcell - 1));
+#else
+    // Jürgen, you should check that this is correct. (Lgb)
+    for (; !tabular->IsLastCellInRow(actcell) && lx < x; ++actcell) {
+           lx += tabular->GetWidthOfColumn(actcell + 1)
+                   + tabular->GetAdditionalWidth(actcell);
+    }
+    
+#endif
     cursor.pos(0);
     resetPos(bv);
     if ((lx - (tabular->GetWidthOfColumn(actcell) / 2)) < x) {
@@ -1043,10 +1153,10 @@ int InsetTabular::getCellXPos(int cell) const
 {
     int c = cell;
 
-    for(; !tabular->IsFirstCellInRow(c); --c)
+    for (; !tabular->IsFirstCellInRow(c); --c)
        ;
     int lx = tabular->GetWidthOfColumn(cell);
-    for(; (c < cell); ++c) {
+    for (; c < cell; ++c) {
        lx += tabular->GetWidthOfColumn(c);
     }
     return (lx - tabular->GetWidthOfColumn(cell) + top_x);
@@ -1062,7 +1172,7 @@ void InsetTabular::resetPos(BufferView * bv) const
     int cell = 0;
     actrow = 0;
     cursor.y(0);
-    for(; (cell < actcell) && !tabular->IsLastRow(cell); ++cell) {
+    for (; (cell < actcell) && !tabular->IsLastRow(cell); ++cell) {
        if (tabular->IsLastCellInRow(cell)) {
            cursor.y(cursor.y() + tabular->GetDescentOfRow(actrow) +
                tabular->GetAscentOfRow(actrow + 1) +
@@ -1071,7 +1181,10 @@ void InsetTabular::resetPos(BufferView * bv) const
        }
     }
     static int const offset = ADD_TO_TABULAR_WIDTH + 2;
-    cursor.x(getCellXPos(actcell) + offset);
+    int new_x = getCellXPos(actcell);
+    new_x += offset;
+    cursor.x(new_x);
+//    cursor.x(getCellXPos(actcell) + offset);
     if (((cursor.x() - offset) > 20) &&
        ((cursor.x()-offset+tabular->GetWidthOfColumn(actcell)) >
         (bv->workWidth()-20)))
@@ -1089,9 +1202,9 @@ void InsetTabular::resetPos(BufferView * bv) const
     if ((!the_locking_inset ||
         !the_locking_inset->GetFirstLockingInsetOfType(TABULAR_CODE)) &&
        (actcell != oldcell)) {
-       dialogs_ = bv->owner()->getDialogs();
-        dialogs_->updateTabular(const_cast<InsetTabular *>(this));
-       oldcell = actcell;
+           InsetTabular * inset = const_cast<InsetTabular *>(this);
+           bv->owner()->getDialogs()->updateTabular(inset);
+           oldcell = actcell;
     }
 }
 
@@ -1102,12 +1215,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;
@@ -1116,17 +1229,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;
@@ -1160,9 +1273,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;
 }
@@ -1173,9 +1283,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;
 }
@@ -1196,10 +1303,10 @@ void InsetTabular::SetFont(BufferView * bv, LyXFont const & font, bool tall)
 
 bool InsetTabular::TabularFeatures(BufferView * bv, string const & what)
 {
-    int action = LyXTabular::LAST_ACTION;
+    LyXTabular::Feature action = LyXTabular::LAST_ACTION;
 
     int i = 0;
-    for(; tabularFeatures[i].action != LyXTabular::LAST_ACTION; ++i) {
+    for (; tabularFeatures[i].action != LyXTabular::LAST_ACTION; ++i) {
        string const tmp = tabularFeatures[i].feature;
            
        if (tmp == what.substr(0, tmp.length())) {
@@ -1219,18 +1326,20 @@ bool InsetTabular::TabularFeatures(BufferView * bv, string const & what)
 }
 
 
-void InsetTabular::TabularFeatures(BufferView * bv, int feature,
+void InsetTabular::TabularFeatures(BufferView * bv,
+                                  LyXTabular::Feature feature,
                                   string const & value)
 {
-    int
-       i, j,
-       sel_col_start,
-       sel_col_end,
-       sel_row_start,
-       sel_row_end,
-        setLines = 0,
-        setAlign = LYX_ALIGN_LEFT,
-        lineSet;
+    int i;
+    int j;
+    int sel_col_start;
+    int sel_col_end;
+    int sel_row_start;
+    int sel_row_end;
+    int setLines = 0;
+    LyXAlignment setAlign = LYX_ALIGN_LEFT;
+    LyXTabular::VAlignment setVAlign = LyXTabular::LYX_VALIGN_TOP;
+    int lineSet;
     bool what;
 
     switch (feature) {
@@ -1248,15 +1357,15 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
           break;
       case LyXTabular::M_VALIGN_TOP:
       case LyXTabular::VALIGN_TOP:
-          setAlign=LyXTabular::LYX_VALIGN_TOP;
+          setVAlign=LyXTabular::LYX_VALIGN_TOP;
           break;
       case LyXTabular::M_VALIGN_BOTTOM:
       case LyXTabular::VALIGN_BOTTOM:
-          setAlign=LyXTabular::LYX_VALIGN_BOTTOM;
+          setVAlign=LyXTabular::LYX_VALIGN_BOTTOM;
           break;
       case LyXTabular::M_VALIGN_CENTER:
       case LyXTabular::VALIGN_CENTER:
-          setAlign=LyXTabular::LYX_VALIGN_CENTER;
+          setVAlign=LyXTabular::LYX_VALIGN_CENTER;
           break;
       default:
           break;
@@ -1345,6 +1454,7 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
        if ((row+1) > tabular->rows())
            --row;
        actcell = tabular->GetCellNumber(row, column);
+       clearSelection();
        UpdateLocal(bv, INIT, true);
        break;
     case LyXTabular::DELETE_COLUMN:
@@ -1352,14 +1462,15 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
        if ((column+1) > tabular->columns())
            --column;
        actcell = tabular->GetCellNumber(row, column);
+       clearSelection();
        UpdateLocal(bv, INIT, true);
        break;
     case LyXTabular::M_TOGGLE_LINE_TOP:
        flag = false;
     case LyXTabular::TOGGLE_LINE_TOP:
        lineSet = !tabular->TopLine(actcell, flag);
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
+       for (i=sel_row_start; i<=sel_row_end; ++i)
+           for (j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetTopLine(tabular->GetCellNumber(i,j),lineSet, flag);
        UpdateLocal(bv, INIT, true);
        break;
@@ -1368,8 +1479,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
        flag = false;
     case LyXTabular::TOGGLE_LINE_BOTTOM:
        lineSet = !tabular->BottomLine(actcell, flag); 
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
+       for (i=sel_row_start; i<=sel_row_end; ++i)
+           for (j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetBottomLine(tabular->GetCellNumber(i,j),lineSet,
                                       flag);
        UpdateLocal(bv, INIT, true);
@@ -1379,8 +1490,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
        flag = false;
     case LyXTabular::TOGGLE_LINE_LEFT:
        lineSet = !tabular->LeftLine(actcell, flag);
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
+       for (i=sel_row_start; i<=sel_row_end; ++i)
+           for (j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetLeftLine(tabular->GetCellNumber(i,j),lineSet,
                                     flag);
        UpdateLocal(bv, INIT, true);
@@ -1390,8 +1501,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
        flag = false;
     case LyXTabular::TOGGLE_LINE_RIGHT:
        lineSet = !tabular->RightLine(actcell, flag);
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
+       for (i=sel_row_start; i<=sel_row_end; ++i)
+           for (j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetRightLine(tabular->GetCellNumber(i,j),lineSet,
                                      flag);
        UpdateLocal(bv, INIT, true);
@@ -1403,9 +1514,9 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
     case LyXTabular::ALIGN_LEFT:
     case LyXTabular::ALIGN_RIGHT:
     case LyXTabular::ALIGN_CENTER:
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
-               tabular->SetAlignment(tabular->GetCellNumber(i,j),setAlign,
+       for (i = sel_row_start; i <= sel_row_end; ++i)
+           for (j = sel_col_start; j <= sel_col_end; ++j)
+               tabular->SetAlignment(tabular->GetCellNumber(i, j), setAlign,
                                      flag);
        if (hasSelection())
            UpdateLocal(bv, INIT, true);
@@ -1419,10 +1530,10 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
     case LyXTabular::VALIGN_TOP:
     case LyXTabular::VALIGN_BOTTOM:
     case LyXTabular::VALIGN_CENTER:
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
-               tabular->SetVAlignment(tabular->GetCellNumber(i,j), setAlign,
-                                      flag);
+       for (i = sel_row_start; i <= sel_row_end; ++i)
+           for (j = sel_col_start; j <= sel_col_end; ++j)
+               tabular->SetVAlignment(tabular->GetCellNumber(i, j),
+                                      setVAlign, flag);
        if (hasSelection())
            UpdateLocal(bv, INIT, true);
        else
@@ -1471,8 +1582,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
     case LyXTabular::SET_ALL_LINES:
        setLines = 1;
     case LyXTabular::UNSET_ALL_LINES:
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
+       for (i=sel_row_start; i<=sel_row_end; ++i)
+           for (j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetAllLines(tabular->GetCellNumber(i,j), setLines);
        UpdateLocal(bv, INIT, true);
        break;
@@ -1491,13 +1602,13 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
        tabular->SetRotateTabular(false);
        break;
     case LyXTabular::SET_ROTATE_CELL:
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
+       for (i=sel_row_start; i<=sel_row_end; ++i)
+           for (j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetRotateCell(tabular->GetCellNumber(i,j),true);
        break;
     case LyXTabular::UNSET_ROTATE_CELL:
-       for(i = sel_row_start; i <= sel_row_end; ++i)
-           for(j = sel_col_start; j <= sel_col_end; ++j)
+       for (i = sel_row_start; i <= sel_row_end; ++i)
+           for (j = sel_col_start; j <= sel_col_end; ++j)
                tabular->SetRotateCell(tabular->GetCellNumber(i, j), false);
        break;
     case LyXTabular::SET_USEBOX:
@@ -1505,8 +1616,8 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
        LyXTabular::BoxType val = LyXTabular::BoxType(strToInt(value));
        if (val == tabular->GetUsebox(actcell))
            val = LyXTabular::BOX_NONE;
-       for(i = sel_row_start; i <= sel_row_end; ++i)
-           for(j = sel_col_start; j <= sel_col_end; ++j)
+       for (i = sel_row_start; i <= sel_row_end; ++i)
+           for (j = sel_col_start; j <= sel_col_end; ++j)
                tabular->SetUsebox(tabular->GetCellNumber(i, j), val);
        break;
     }
@@ -1526,6 +1637,9 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature,
        what = !tabular->GetLTNewPage(actcell);
        tabular->SetLTNewPage(actcell, what);
        break;
+    // dummy stuff just to avoid warnings
+    case LyXTabular::LAST_ACTION:
+       break;
     }
 }
 
@@ -1536,7 +1650,7 @@ bool InsetTabular::ActivateCellInset(BufferView * bv, int x, int y, int button,
     // the cursor.pos has to be before the inset so if it isn't now just
     // reset the curor pos first!
     if (!cellstart(cursor.pos())) {
-       cursor.pos((cursor.pos() - 1) % 2);
+       cursor.pos(0);
        resetPos(bv);
     }
     UpdatableInset * inset =
@@ -1559,16 +1673,16 @@ bool InsetTabular::ActivateCellInset(BufferView * bv, int x, int y, int button,
 bool InsetTabular::InsetHit(BufferView * bv, int x, int ) const
 {
     InsetText * inset = tabular->GetCellInset(actcell);
-    int x1 = x + top_x;
+    int const x1 = x + top_x;
 
     if (!cellstart(cursor.pos())) {
-       return (((x + top_x) < cursor.x()) &&
-               ((x + top_x) > (cursor.x() - inset->width(bv,
-                                                     LyXFont(LyXFont::ALL_SANE)))));
+       return ((x + top_x) < cursor.x() &&
+               (x + top_x) > (cursor.x() - inset->width(bv,
+                                                     LyXFont(LyXFont::ALL_SANE))));
     } else {
-       int x2 = cursor.x() + tabular->GetBeginningOfTextInCell(actcell);
-       return ((x1 > x2) &&
-               (x1 < (x2 + inset->width(bv, LyXFont(LyXFont::ALL_SANE)))));
+       int const x2 = cursor.x() + tabular->GetBeginningOfTextInCell(actcell);
+       return (x1 > x2 &&
+               x1 < (x2 + inset->width(bv, LyXFont(LyXFont::ALL_SANE))));
     }
 }
 
@@ -1590,7 +1704,7 @@ int InsetTabular::getMaxWidth(Painter & pain,
 {
     int const n = tabular->GetNumberOfCells();
     int cell = 0;
-    for(; cell < n; ++cell) {
+    for (; cell < n; ++cell) {
        if (tabular->GetCellInset(cell) == inset)
            break;
     }
@@ -1628,8 +1742,7 @@ void InsetTabular::OpenLayoutDialog(BufferView * bv) const
            return;
        }
     }
-    dialogs_ = bv->owner()->getDialogs();
-    dialogs_->showTabular(const_cast<InsetTabular *>(this));
+    bv->owner()->getDialogs()->showTabular(const_cast<InsetTabular *>(this));
 }
 
 //
@@ -1645,7 +1758,7 @@ LyXFunc::func_status InsetTabular::getStatus(string const & what) const
     LyXFunc::func_status status = LyXFunc::OK;
     
     int i = 0;
-    for(; tabularFeatures[i].action != LyXTabular::LAST_ACTION; ++i) {
+    for (; tabularFeatures[i].action != LyXTabular::LAST_ACTION; ++i) {
        string const tmp = tabularFeatures[i].feature;
        if (tmp == what.substr(0, tmp.length())) {                  
        //if (!strncmp(tabularFeatures[i].feature.c_str(), what.c_str(),
@@ -1859,7 +1972,7 @@ LyXFunc::func_status InsetTabular::getStatus(string const & what) const
 }
 
 
-bool InsetTabular::copySelection()
+bool InsetTabular::copySelection(BufferView * bv)
 {
     if (!hasSelection())
        return false;
@@ -1888,25 +2001,25 @@ bool InsetTabular::copySelection()
     }
     int rows = sel_row_end - sel_row_start + 1;
 
-    paste_tabular = new LyXTabular(this, rows, columns);
-    
-    if (sel_cell_start > sel_cell_end) {
-           //int tmp = sel_cell_start;
-           //sel_cell_start = sel_cell_end;
-           //sel_cell_end = tmp;
-       swap(sel_cell_start, sel_cell_end);
-    }
-    for(int i = sel_cell_start, j = 0; i <= sel_cell_end; ++i, ++j) {
-       while(paste_tabular->row_of_cell(j) <
-             (tabular->row_of_cell(i)-sel_row_start)) {
-           ++j;
-       }
-       while(paste_tabular->row_of_cell(j) >
-             (tabular->row_of_cell(i)-sel_row_start)) {
-           ++i;
-       }
-       *(paste_tabular->GetCellInset(j)) = *(tabular->GetCellInset(i));
-    }
+    paste_tabular = new LyXTabular(this, *tabular); // rows, columns);
+    int i;
+    for (i=0; i < sel_row_start; ++i)
+       paste_tabular->DeleteRow(0);
+    while(paste_tabular->rows() > rows)
+       paste_tabular->DeleteRow(rows);
+    paste_tabular->SetTopLine(0, true, true);
+    paste_tabular->SetBottomLine(paste_tabular->GetFirstCellInRow(rows-1),
+                                true, true);
+    for (i=0; i < sel_col_start; ++i)
+       paste_tabular->DeleteColumn(0);
+    while(paste_tabular->columns() > columns)
+       paste_tabular->DeleteColumn(columns);
+    paste_tabular->SetLeftLine(0, true, true);
+    paste_tabular->SetRightLine(paste_tabular->GetLastCellInRow(0),true, true);
+
+    ostringstream sstr;
+    paste_tabular->Ascii(bv->buffer(), sstr);
+    bv->stuffClipboard(sstr.str().c_str());
     return true;
 }
 
@@ -1915,7 +2028,7 @@ bool InsetTabular::pasteSelection(BufferView * bv)
 {
     if (!paste_tabular)
        return false;
-    for(int j=0, i=actcell; j<paste_tabular->GetNumberOfCells(); ++j,++i) {
+    for (int j=0, i=actcell; j<paste_tabular->GetNumberOfCells(); ++j,++i) {
        while (paste_tabular->row_of_cell(j) > tabular->row_of_cell(i)-actrow)
            ++i;
        if (tabular->GetNumberOfCells() <= i)
@@ -1962,8 +2075,8 @@ bool InsetTabular::cutSelection()
            //sel_cell_end = tmp;
        swap(sel_cell_start, sel_cell_end);
     }
-    for(int i = sel_row_start; i <= sel_row_end; ++i) {
-       for(int j = sel_col_start; j <= sel_col_end; ++j) {
+    for (int i = sel_row_start; i <= sel_row_end; ++i) {
+       for (int j = sel_col_start; j <= sel_col_end; ++j) {
            tabular->GetCellInset(tabular->GetCellNumber(i, j))->clear();
        }
     }