]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insettabular.C
Enable convertDefault.sh to run even if its executable bit is not set.
[lyx.git] / src / insets / insettabular.C
index c0019802996fc46eb5aca9a3397106ba922d917a..fc9b4834a284dd3366922c95cdc6047e3c6219b9 100644 (file)
@@ -5,7 +5,7 @@
  *
  * \author Jürgen Vigna
  *
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
  */
 
 #include <config.h>
@@ -32,6 +32,7 @@
 #include "undo_funcs.h"
 #include "WordLangTuple.h"
 #include "metricsinfo.h"
+#include "paragraph_funcs.h"
 
 #include "frontends/Alert.h"
 #include "frontends/Dialogs.h"
@@ -45,7 +46,6 @@
 #include <fstream>
 #include <algorithm>
 #include <cstdlib>
-#include <map>
 
 
 using namespace lyx::support;
@@ -92,7 +92,7 @@ TabularFeature tabularFeature[] =
        { LyXTabular::ALIGN_BLOCK, "align-block" },
        { LyXTabular::VALIGN_TOP, "valign-top" },
        { LyXTabular::VALIGN_BOTTOM, "valign-bottom" },
-       { LyXTabular::VALIGN_CENTER, "valign-center" },
+       { LyXTabular::VALIGN_MIDDLE, "valign-middle" },
        { LyXTabular::M_TOGGLE_LINE_TOP, "m-toggle-line-top" },
        { LyXTabular::M_TOGGLE_LINE_BOTTOM, "m-toggle-line-bottom" },
        { LyXTabular::M_TOGGLE_LINE_LEFT, "m-toggle-line-left" },
@@ -102,7 +102,7 @@ TabularFeature tabularFeature[] =
        { LyXTabular::M_ALIGN_CENTER, "m-align-center" },
        { LyXTabular::M_VALIGN_TOP, "m-valign-top" },
        { LyXTabular::M_VALIGN_BOTTOM, "m-valign-bottom" },
-       { LyXTabular::M_VALIGN_CENTER, "m-valign-center" },
+       { LyXTabular::M_VALIGN_MIDDLE, "m-valign-middle" },
        { LyXTabular::MULTICOLUMN, "multicolumn" },
        { LyXTabular::SET_ALL_LINES, "set-all-lines" },
        { LyXTabular::UNSET_ALL_LINES, "unset-all-lines" },
@@ -166,7 +166,6 @@ InsetTabular::InsetTabular(Buffer const & buf, int rows, int columns)
        oldcell = -1;
        actrow = actcell = 0;
        clearSelection();
-       need_update = INIT;
        in_reset_pos = 0;
        inset_x = 0;
        inset_y = 0;
@@ -184,7 +183,6 @@ InsetTabular::InsetTabular(InsetTabular const & tab)
        oldcell = -1;
        actrow = actcell = 0;
        clearSelection();
-       need_update = INIT;
        in_reset_pos = 0;
        inset_x = 0;
        inset_y = 0;
@@ -203,9 +201,9 @@ auto_ptr<InsetBase> InsetTabular::clone() const
 }
 
 
-Buffer const * InsetTabular::buffer() const
+Buffer const & InsetTabular::buffer() const
 {
-       return buffer_;
+       return *buffer_;
 }
 
 
@@ -222,21 +220,19 @@ void InsetTabular::buffer(Buffer * b)
 }
 
 
-void InsetTabular::write(Buffer const * buf, ostream & os) const
+void InsetTabular::write(Buffer const & buf, ostream & os) const
 {
        os << "Tabular" << endl;
        tabular.write(buf, os);
 }
 
 
-void InsetTabular::read(Buffer const * buf, LyXLex & lex)
+void InsetTabular::read(Buffer const & buf, LyXLex & lex)
 {
        bool const old_format = (lex.getString() == "\\LyXTable");
 
        tabular.read(buf, lex);
 
-       need_update = INIT;
-
        if (old_format)
                return;
 
@@ -258,7 +254,7 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
        //lyxerr << "InsetTabular::metrics: " << mi.base.bv << " width: " <<
        //      mi.base.textwidth << "\n";
        if (!mi.base.bv) {
-               lyxerr << "InsetTabular::metrics: need bv\n";
+               lyxerr << "InsetTabular::metrics: need bv" << endl;
                Assert(0);
        }
 
@@ -273,16 +269,9 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
 
 void InsetTabular::draw(PainterInfo & pi, int x, int y) const
 {
-       //lyxerr << "InsetTabular::draw: " << x << " " << y << "\n";
-       if (nodraw()) {
-               need_update = FULL;
-               return;
-       }
+       //lyxerr << "InsetTabular::draw: " << x << " " << y << endl;
 
        BufferView * bv = pi.base.bv;
-       int i;
-       int j;
-       int nx;
 
 #if 0
        UpdatableInset::draw(pi, x, y);
@@ -296,25 +285,24 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
        x += ADD_TO_TABULAR_WIDTH;
 
        int cell = 0;
-       int cx;
        first_visible_cell = -1;
-       for (i = 0; i < tabular.rows(); ++i) {
-               nx = x;
+       for (int i = 0; i < tabular.rows(); ++i) {
+               int nx = x;
                cell = tabular.getCellNumber(i, 0);
-               if (!((y + tabular.getDescentOfRow(i)) > 0) &&
-                       (y - tabular.getAscentOfRow(i)) < pi.pain.paperHeight())
+               if (y + tabular.getDescentOfRow(i) <= 0 &&
+                         y - tabular.getAscentOfRow(i) < pi.pain.paperHeight())
                {
-               y += tabular.getDescentOfRow(i) +
-                               tabular.getAscentOfRow(i + 1) +
-                               tabular.getAdditionalHeight(i + 1);
+                       y += tabular.getDescentOfRow(i) +
+                                       tabular.getAscentOfRow(i + 1) +
+                                       tabular.getAdditionalHeight(i + 1);
                        continue;
                }
-               for (j = 0; j < tabular.columns(); ++j) {
+               for (int j = 0; j < tabular.columns(); ++j) {
                        if (nx > bv->workWidth())
                                break;
                        if (tabular.isPartOfMultiColumn(i, j))
                                continue;
-                       cx = nx + tabular.getBeginningOfTextInCell(cell);
+                       int cx = nx + tabular.getBeginningOfTextInCell(cell);
                        if (first_visible_cell < 0)
                                first_visible_cell = cell;
                        if (hasSelection()) {
@@ -342,8 +330,6 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
                        tabular.getAscentOfRow(i + 1) +
                        tabular.getAdditionalHeight(i + 1);
        }
-
-       need_update = NONE;
 }
 
 
@@ -419,7 +405,7 @@ void InsetTabular::insetUnlock(BufferView * bv)
 {
        if (the_locking_inset) {
                the_locking_inset->insetUnlock(bv);
-               updateLocal(bv, CELL);
+               updateLocal(bv);
                the_locking_inset = 0;
        }
        actcell = 0;
@@ -427,27 +413,18 @@ void InsetTabular::insetUnlock(BufferView * bv)
        locked = false;
        if (scroll(false) || hasSelection()) {
                clearSelection();
-               if (scroll(false)) {
+               if (scroll(false))
                        scroll(bv, 0.0F);
-               }
-               updateLocal(bv, FULL);
+               updateLocal(bv);
        }
 }
 
 
-void InsetTabular::updateLocal(BufferView * bv, UpdateCodes what) const
+void InsetTabular::updateLocal(BufferView * bv) const
 {
-       lyxerr << "InsetTabular::updateLocal: " << what << "\n";
-       if (!locked && what == CELL)
-               what = FULL;
-       if (need_update < what) // only set this if it has greater update
-               need_update = what;
-       // Dirty Cast! (Lgb)
-       if (need_update != NONE) {
-               bv->updateInset(const_cast<InsetTabular *>(this));
-               if (locked)
-                       resetPos(bv);
-       }
+       bv->updateInset(this);
+       if (locked)
+               resetPos(bv);
 }
 
 
@@ -507,7 +484,7 @@ bool InsetTabular::unlockInsetInInset(BufferView * bv, UpdatableInset * inset,
                if (scroll(false))
                        scroll(bv, 0.0F);
 #endif
-               updateLocal(bv, CELL);
+               updateLocal(bv);
                // this has to be here otherwise we don't redraw the cell!
                the_locking_inset = 0;
                return true;
@@ -524,25 +501,6 @@ bool InsetTabular::unlockInsetInInset(BufferView * bv, UpdatableInset * inset,
 }
 
 
-bool InsetTabular::updateInsetInInset(BufferView * bv, InsetOld * inset)
-{
-       InsetOld * tl_inset = inset;
-       // look if this inset is really inside myself!
-       while(tl_inset->owner() && tl_inset->owner() != this)
-               tl_inset = tl_inset->owner();
-       // if we enter here it's not ower inset
-       if (!tl_inset->owner())
-               return false;
-       // we only have to do this if this is a subinset of our cells
-       if (tl_inset != inset) {
-               if (!static_cast<InsetText *>(tl_inset)->updateInsetInInset(bv, inset))
-                       return false;
-       }
-       updateLocal(bv, CELL);
-       return true;
-}
-
-
 int InsetTabular::insetInInsetY() const
 {
        if (!the_locking_inset)
@@ -583,11 +541,10 @@ void InsetTabular::lfunMousePress(FuncRequest const & cmd)
 
        if (hasSelection()) {
                clearSelection();
-               updateLocal(cmd.view(), FULL);
+               updateLocal(cmd.view());
        }
 
        int const ocell = actcell;
-       int const orow = actrow;
        BufferView * bv = cmd.view();
 
        if (!locked) {
@@ -597,19 +554,7 @@ void InsetTabular::lfunMousePress(FuncRequest const & cmd)
                inset_y = 0;
        }
        setPos(bv, cmd.x, cmd.y);
-       if (actrow != orow)
-               updateLocal(bv, NONE);
        clearSelection();
-#if 0
-       if (cmd.button() == mouse_button::button3) {
-               if ((ocell != actcell) && the_locking_inset) {
-                       the_locking_inset->insetUnlock(bv);
-                       updateLocal(bv, CELL);
-                       the_locking_inset = 0;
-               }
-               return;
-       }
-#endif
 
        bool const inset_hit = insetHit(bv, cmd.x, cmd.y);
 
@@ -624,7 +569,7 @@ void InsetTabular::lfunMousePress(FuncRequest const & cmd)
 
        if (the_locking_inset) {
                the_locking_inset->insetUnlock(bv);
-               updateLocal(bv, CELL);
+               updateLocal(bv);
                the_locking_inset = 0;
        }
 
@@ -642,7 +587,6 @@ void InsetTabular::lfunMousePress(FuncRequest const & cmd)
                cmd1.x -= inset_x;
                cmd1.y -= inset_y;
                the_locking_inset->localDispatch(cmd1);
-               return;
        }
 }
 
@@ -680,10 +624,10 @@ void InsetTabular::lfunMouseMotion(FuncRequest const & cmd)
        setPos(bv, cmd.x, cmd.y);
        if (!hasSelection()) {
                setSelection(actcell, actcell);
-               updateLocal(bv, FULL);
+               updateLocal(bv);
        } else if (old_cell != actcell) {
                setSelection(sel_cell_start, actcell);
-               updateLocal(bv, FULL);
+               updateLocal(bv);
        }
 }
 
@@ -772,10 +716,9 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                                movePrevCell(bv, old_locking_inset != 0);
                        clearSelection();
                        if (hs)
-                               updateLocal(bv, FULL);
-                       if (!the_locking_inset) {
+                               updateLocal(bv);
+                       if (!the_locking_inset)
                                return DISPATCHED_NOUPDATE;
-                       }
                        return result;
                // this to avoid compiler warnings.
                default:
@@ -791,11 +734,11 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                        int sc = scroll();
                        resetPos(bv);
                        if (sc != scroll()) { // inset has been scrolled
-                               updateLocal(bv, FULL);
+                               updateLocal(bv);
                        }
                        return result;
                } else if (result == DISPATCHED) {
-                       updateLocal(bv, CELL);
+                       updateLocal(bv);
                        return result;
                } else if (result == FINISHED_UP) {
                        action = LFUN_UP;
@@ -831,14 +774,14 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                        end = actcell;
                }
                setSelection(start, end);
-               updateLocal(bv, FULL);
+               updateLocal(bv);
                break;
        }
        case LFUN_RIGHT:
                result = moveRight(bv);
                clearSelection();
                if (hs)
-                       updateLocal(bv, FULL);
+                       updateLocal(bv);
                break;
        case LFUN_LEFTSEL: {
                int const start = hasSelection() ? sel_cell_start : actcell;
@@ -855,14 +798,14 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                        end = actcell;
                }
                setSelection(start, end);
-               updateLocal(bv, FULL);
+               updateLocal(bv);
                break;
        }
        case LFUN_LEFT:
                result = moveLeft(bv);
                clearSelection();
                if (hs)
-                       updateLocal(bv, FULL);
+                       updateLocal(bv);
                break;
        case LFUN_DOWNSEL: {
                int const start = hasSelection() ? sel_cell_start : actcell;
@@ -871,23 +814,22 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                // the current cell at the beginning
                if (hasSelection()) {
                        moveDown(bv, false);
-                       if ((ocell == sel_cell_end) ||
-                           (tabular.column_of_cell(ocell)>tabular.column_of_cell(actcell)))
+                       if (ocell == sel_cell_end ||
+                           tabular.column_of_cell(ocell) > tabular.column_of_cell(actcell))
                                setSelection(start, tabular.getCellBelow(sel_cell_end));
                        else
                                setSelection(start, tabular.getLastCellBelow(sel_cell_end));
                } else {
                        setSelection(start, start);
                }
-               updateLocal(bv, FULL);
+               updateLocal(bv);
        }
        break;
        case LFUN_DOWN:
                result = moveDown(bv, old_locking_inset != 0);
                clearSelection();
-               if (hs) {
-                       updateLocal(bv, FULL);
-               }
+               if (hs)
+                       updateLocal(bv);
                break;
        case LFUN_UPSEL: {
                int const start = hasSelection() ? sel_cell_start : actcell;
@@ -904,47 +846,39 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                } else {
                        setSelection(start, start);
                }
-               updateLocal(bv, FULL);
+               updateLocal(bv);
        }
        break;
        case LFUN_UP:
                result = moveUp(bv, old_locking_inset != 0);
                clearSelection();
                if (hs)
-                       updateLocal(bv, FULL);
+                       updateLocal(bv);
                break;
        case LFUN_NEXT: {
-               UpdateCodes code = CURSOR;
-               if (hs) {
+               if (hs)
                        clearSelection();
-                       code = FULL;
-               }
                int column = actcol;
                unlockInsetInInset(bv, the_locking_inset);
-               if (bv->text->top_y() + bv->painter().paperHeight() <
-                   (top_baseline + tabular.getHeightOfTabular()))
+               if (bv->top_y() + bv->painter().paperHeight() <
+                   top_baseline + tabular.getHeightOfTabular())
                        {
-                               bv->scrollDocView(bv->text->top_y() + bv->painter().paperHeight());
-                               code = FULL;
+                               bv->scrollDocView(bv->top_y() + bv->painter().paperHeight());
                                actcell = tabular.getCellBelow(first_visible_cell) + column;
                        } else {
                                actcell = tabular.getFirstCellInRow(tabular.rows() - 1) + column;
                        }
                resetPos(bv);
-               updateLocal(bv, code);
+               updateLocal(bv);
                break;
        }
        case LFUN_PRIOR: {
-               UpdateCodes code = CURSOR;
-               if (hs) {
+               if (hs)
                        clearSelection();
-                       code = FULL;
-               }
                int column = actcol;
                unlockInsetInInset(bv, the_locking_inset);
                if (top_baseline < 0) {
-                       bv->scrollDocView(bv->text->top_y() - bv->painter().paperHeight());
-                       code = FULL;
+                       bv->scrollDocView(bv->top_y() - bv->painter().paperHeight());
                        if (top_baseline > 0)
                                actcell = column;
                        else
@@ -953,7 +887,7 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                        actcell = column;
                }
                resetPos(bv);
-               updateLocal(bv, code);
+               updateLocal(bv);
                break;
        }
        // none of these make sense for insettabular,
@@ -1000,7 +934,7 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                if (tmpstr.empty())
                        break;
                if (insertAsciiString(bv, tmpstr, false))
-                       updateLocal(bv, INIT);
+                       updateLocal(bv);
                else
                        result = UNDISPATCHED;
                break;
@@ -1013,7 +947,7 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
        case LFUN_DELETE:
                recordUndo(bv, Undo::DELETE);
                cutSelection(bv->buffer()->params);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        case LFUN_COPY:
                if (!hasSelection())
@@ -1096,7 +1030,7 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                if (hasPasteBuffer()) {
                        recordUndo(bv, Undo::INSERT);
                        pasteSelection(bv);
-                       updateLocal(bv, INIT);
+                       updateLocal(bv);
                        break;
                }
                // ATTENTION: the function above has to be PASTE and PASTESELECTION!!!
@@ -1125,87 +1059,77 @@ InsetOld::RESULT InsetTabular::localDispatch(FuncRequest const & cmd)
                }
                // we try to activate the actual inset and put this event down to
                // the insets dispatch function.
-               if ((result == DISPATCHED) || the_locking_inset)
+               if (result == DISPATCHED || the_locking_inset)
                        break;
-               nodraw(true);
                if (activateCellInset(bv)) {
-                       // reset need_update setted in above function!
-                       need_update = NONE;
                        result = the_locking_inset->localDispatch(FuncRequest(bv, action, arg));
-                       if ((result == UNDISPATCHED) || (result >= FINISHED)) {
+                       if (result == UNDISPATCHED || result >= FINISHED) {
                                unlockInsetInInset(bv, the_locking_inset);
-                               nodraw(false);
                                // we need to update if this was requested before
-                               updateLocal(bv, NONE);
+                               updateLocal(bv);
                                return UNDISPATCHED;
-                       } else if (hs) {
-                               clearSelection();
-                               // so the below CELL is not set because this is higher
-                               // priority and we get a full redraw
-                               need_update = FULL;
                        }
-                       nodraw(false);
-                       updateLocal(bv, CELL);
+                       if (hs)
+                               clearSelection();
+                       updateLocal(bv);
                        return result;
                }
                break;
        }
        if (result < FINISHED) {
-               if (!the_locking_inset) {
-                       if (bv->fitCursor())
-                               updateLocal(bv, FULL);
-               }
+               if (!the_locking_inset && bv->fitCursor())
+                       updateLocal(bv);
        } else
                bv->unlockInset(this);
        return result;
 }
 
 
-int InsetTabular::latex(Buffer const * buf, ostream & os,
+int InsetTabular::latex(Buffer const & buf, ostream & os,
                        LatexRunParams const & runparams) const
 {
        return tabular.latex(buf, os, runparams);
 }
 
 
-int InsetTabular::ascii(Buffer const * buf, ostream & os, int ll) const
+int InsetTabular::ascii(Buffer const & buf, ostream & os, int ll) const
 {
        if (ll > 0)
-               return tabular.ascii(buf, os, (int)parOwner()->params().depth(),
-                                     false,0);
-       return tabular.ascii(buf, os, 0, false,0);
+               return tabular.ascii(buf, os, ownerPar(buf, this).params().depth(),
+                                     false, 0);
+       return tabular.ascii(buf, os, 0, false, 0);
 }
 
 
-int InsetTabular::linuxdoc(Buffer const * buf, ostream & os) const
+int InsetTabular::linuxdoc(Buffer const & buf, ostream & os) const
 {
        return tabular.linuxdoc(buf,os);
 }
 
 
-int InsetTabular::docbook(Buffer const * buf, ostream & os, bool mixcont) const
+int InsetTabular::docbook(Buffer const & buf, ostream & os, bool mixcont) const
 {
        int ret = 0;
        InsetOld * master;
 
        // if the table is inside a float it doesn't need the informaltable
        // wrapper. Search for it.
-       for(master = owner();
-           master && master->lyxCode() != InsetOld::FLOAT_CODE;
-           master = master->owner());
+       for (master = owner();
+            master && master->lyxCode() != InsetOld::FLOAT_CODE;
+            master = master->owner());
 
        if (!master) {
                os << "<informaltable>";
                if (mixcont)
                        os << endl;
-               ret++;
+               ++ret;
        }
-       ret+= tabular.docbook(buf, os, mixcont);
+       ret += tabular.docbook(buf, os, mixcont);
        if (!master) {
                os << "</informaltable>";
                if (mixcont)
                        os << endl;
-               ret++;
+               ++ret;
        }
        return ret;
 }
@@ -1223,8 +1147,7 @@ void InsetTabular::calculate_dimensions_of_cells(MetricsInfo & mi) const
        // 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 ;) (Jug?)
        // This is _really_ important (André)
-       if (need_update != INIT &&
-           the_locking_inset == &tabular.getCellInset(actcell)) {
+       if (the_locking_inset == &tabular.getCellInset(actcell)) {
                int maxAsc = 0;
                int maxDesc = 0;
                for (int j = 0; j < tabular.columns(); ++j) {
@@ -1244,7 +1167,6 @@ void InsetTabular::calculate_dimensions_of_cells(MetricsInfo & mi) const
 #endif
 
        int cell = -1;
-       bool changed = false;
        for (int i = 0; i < tabular.rows(); ++i) {
                int maxAsc = 0;
                int maxDesc = 0;
@@ -1259,13 +1181,11 @@ void InsetTabular::calculate_dimensions_of_cells(MetricsInfo & mi) const
                        tabular.getCellInset(cell).metrics(m, dim);
                        maxAsc  = max(maxAsc, dim.asc);
                        maxDesc = max(maxDesc, dim.des);
-                       changed = tabular.setWidthOfCell(cell, dim.wid) || changed;
+                       tabular.setWidthOfCell(cell, dim.wid);
                }
-               changed = tabular.setAscentOfRow(i, maxAsc + ADD_TO_HEIGHT) || changed;
-               changed = tabular.setDescentOfRow(i, maxDesc + ADD_TO_HEIGHT) || changed;
+               tabular.setAscentOfRow(i, maxAsc + ADD_TO_HEIGHT);
+               tabular.setDescentOfRow(i, maxDesc + ADD_TO_HEIGHT);
        }
-       //if (changed)
-       //      tabular.reinit();
 }
 
 
@@ -1303,20 +1223,16 @@ void InsetTabular::getCursorPos(BufferView * bv, int & x, int & y) const
 void InsetTabular::fitInsetCursor(BufferView * bv) const
 {
        if (the_locking_inset) {
-               int old_top_y = bv->text->top_y();
                the_locking_inset->fitInsetCursor(bv);
-               if (old_top_y != bv->text->top_y())
-                       need_update = FULL;
                return;
        }
-       LyXFont font;
 
+       LyXFont font;
        int const asc = font_metrics::maxAscent(font);
        int const desc = font_metrics::maxDescent(font);
        resetPos(bv);
 
-       if (bv->fitLockedInsetCursor(cursorx_, cursory_, asc, desc))
-               need_update = FULL;
+       bv->fitLockedInsetCursor(cursorx_, cursory_, asc, desc);
 }
 
 
@@ -1339,10 +1255,11 @@ 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; ++actcell) {
+
+       for (; !tabular.isLastCellInRow(actcell) && lx < x; ++actcell)
                lx += tabular.getWidthOfColumn(actcell + 1)
                        + tabular.getAdditionalWidth(actcell);
-       }
+
        cursorx_ = lx - tabular.getWidthOfColumn(actcell) + top_x + 2;
        resetPos(bv);
 }
@@ -1355,9 +1272,9 @@ int InsetTabular::getCellXPos(int cell) const
        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);
 }
 
@@ -1383,7 +1300,7 @@ void InsetTabular::resetPos(BufferView * bv) const
                        ++actrow;
                }
        }
-       if (!locked || nodraw()) {
+       if (!locked) {
                if (the_locking_inset)
                        inset_y = cursory_;
                return;
@@ -1396,38 +1313,38 @@ void InsetTabular::resetPos(BufferView * bv) const
        new_x += offset;
        cursorx_ = new_x;
 //    cursor.x(getCellXPos(actcell) + offset);
-       if ((actcol < tabular.columns() - 1) && scroll(false) &&
-               (tabular.getWidthOfTabular() < bv->workWidth()-20))
+       if (actcol < tabular.columns() - 1 && scroll(false) &&
+               tabular.getWidthOfTabular() < bv->workWidth()-20)
        {
                scroll(bv, 0.0F);
-               updateLocal(bv, FULL);
+               updateLocal(bv);
        } else if (the_locking_inset &&
                 tabular.getWidthOfColumn(actcell) > bv->workWidth() - 20)
        {
                int xx = cursorx_ - offset + bv->text->getRealCursorX();
-               if (xx > (bv->workWidth()-20)) {
+               if (xx > bv->workWidth()-20) {
                        scroll(bv, -(xx - bv->workWidth() + 60));
-                       updateLocal(bv, FULL);
+                       updateLocal(bv);
                } else if (xx < 20) {
                        if (xx < 0)
                                xx = -xx + 60;
                        else
                                xx = 60;
                        scroll(bv, xx);
-                       updateLocal(bv, FULL);
+                       updateLocal(bv);
                }
-       } else if ((cursorx_ - offset) > 20 &&
-                  (cursorx_ - offset + tabular.getWidthOfColumn(actcell))
-                  > (bv->workWidth() - 20)) {
+       } else if (cursorx_ - offset > 20 &&
+                  cursorx_ - offset + tabular.getWidthOfColumn(actcell)
+                  > bv->workWidth() - 20) {
                scroll(bv, -tabular.getWidthOfColumn(actcell) - 20);
-               updateLocal(bv, FULL);
-       } else if ((cursorx_ - offset) < 20) {
+               updateLocal(bv);
+       } else if (cursorx_ - offset < 20) {
                scroll(bv, 20 - cursorx_ + offset);
-               updateLocal(bv, FULL);
+               updateLocal(bv);
        } else if (scroll() && top_x > 20 &&
-                  (top_x + tabular.getWidthOfTabular()) > (bv->workWidth() - 20)) {
+                  (top_x + tabular.getWidthOfTabular()) > bv->workWidth() - 20) {
                scroll(bv, old_x - cursorx_);
-               updateLocal(bv, FULL);
+               updateLocal(bv);
        }
        if (the_locking_inset) {
                inset_x = cursorx_ - top_x + tabular.getBeginningOfTextInCell(actcell);
@@ -1600,7 +1517,7 @@ void InsetTabular::setFont(BufferView * bv, LyXFont const & font, bool tall,
                        unFreezeUndo();
                if (selectall)
                        clearSelection();
-               updateLocal(bv, INIT);
+               updateLocal(bv);
        }
        if (the_locking_inset)
                the_locking_inset->setFont(bv, font, tall);
@@ -1667,36 +1584,45 @@ void InsetTabular::tabularFeatures(BufferView * bv,
        LyXTabular::VAlignment setVAlign = LyXTabular::LYX_VALIGN_TOP;
 
        switch (feature) {
+
        case LyXTabular::M_ALIGN_LEFT:
        case LyXTabular::ALIGN_LEFT:
                setAlign = LYX_ALIGN_LEFT;
                break;
+
        case LyXTabular::M_ALIGN_RIGHT:
        case LyXTabular::ALIGN_RIGHT:
                setAlign = LYX_ALIGN_RIGHT;
                break;
+
        case LyXTabular::M_ALIGN_CENTER:
        case LyXTabular::ALIGN_CENTER:
                setAlign = LYX_ALIGN_CENTER;
                break;
+
        case LyXTabular::ALIGN_BLOCK:
                setAlign = LYX_ALIGN_BLOCK;
                break;
+
        case LyXTabular::M_VALIGN_TOP:
        case LyXTabular::VALIGN_TOP:
                setVAlign = LyXTabular::LYX_VALIGN_TOP;
                break;
+
        case LyXTabular::M_VALIGN_BOTTOM:
        case LyXTabular::VALIGN_BOTTOM:
                setVAlign = LyXTabular::LYX_VALIGN_BOTTOM;
                break;
-       case LyXTabular::M_VALIGN_CENTER:
-       case LyXTabular::VALIGN_CENTER:
-               setVAlign = LyXTabular::LYX_VALIGN_CENTER;
+
+       case LyXTabular::M_VALIGN_MIDDLE:
+       case LyXTabular::VALIGN_MIDDLE:
+               setVAlign = LyXTabular::LYX_VALIGN_MIDDLE;
                break;
+
        default:
                break;
        }
+
        if (hasSelection()) {
                getSelection(sel_row_start, sel_row_end, sel_col_start, sel_col_end);
        } else {
@@ -1711,6 +1637,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
        LyXTabular::ltType ltt;
 
        switch (feature) {
+
        case LyXTabular::SET_PWIDTH:
        {
                LyXLength const vallen(value);
@@ -1723,10 +1650,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                        // the insettext of the active cell (if any)
                        // until later (see InsetText::do_resize)
                        unlockInsetInInset(bv, the_locking_inset);
-
-                       for (int i = 0; i < tabular.rows(); ++i)
-                               tabular.getCellInset(i, column).resizeLyXText(bv);
-                       updateLocal(bv, INIT);
+                       bv->update();
                }
 
                if (vallen.zero()
@@ -1735,8 +1659,9 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                else if (!vallen.zero()
                         && tabular.getAlignment(actcell, true) != LYX_ALIGN_BLOCK)
                        tabularFeatures(bv, LyXTabular::ALIGN_BLOCK, string());
+               break;
        }
-       break;
+
        case LyXTabular::SET_MPWIDTH:
        {
                LyXLength const vallen(value);
@@ -1749,31 +1674,27 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                        // the insettext of the active cell (if any)
                        // until later (see InsetText::do_resize)
                        unlockInsetInInset(bv, the_locking_inset);
-
-                       for (int i = 0; i < tabular.rows(); ++i)
-                               tabular.getCellInset(i, column).resizeLyXText(bv);
-
-                       updateLocal(bv, INIT);
+                       updateLocal(bv);
                }
        }
        break;
        case LyXTabular::SET_SPECIAL_COLUMN:
        case LyXTabular::SET_SPECIAL_MULTI:
                tabular.setAlignSpecial(actcell,value,feature);
-               updateLocal(bv, FULL);
+               updateLocal(bv);
                break;
        case LyXTabular::APPEND_ROW:
                // append the row into the tabular
                unlockInsetInInset(bv, the_locking_inset);
                tabular.appendRow(bv->buffer()->params, actcell);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        case LyXTabular::APPEND_COLUMN:
                // append the column into the tabular
                unlockInsetInInset(bv, the_locking_inset);
                tabular.appendColumn(bv->buffer()->params, actcell);
                actcell = tabular.getCellNumber(row, column);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        case LyXTabular::DELETE_ROW:
                unlockInsetInInset(bv, the_locking_inset);
@@ -1784,7 +1705,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                        --sel_row_start;
                actcell = tabular.getCellNumber(sel_row_start, column);
                clearSelection();
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        case LyXTabular::DELETE_COLUMN:
                unlockInsetInInset(bv, the_locking_inset);
@@ -1795,7 +1716,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                        --sel_col_start;
                actcell = tabular.getCellNumber(row, sel_col_start);
                clearSelection();
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        case LyXTabular::M_TOGGLE_LINE_TOP:
                flag = false;
@@ -1807,7 +1728,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                                tabular.setTopLine(
                                        tabular.getCellNumber(i, j),
                                        lineSet, flag);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        }
 
@@ -1822,7 +1743,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                                        tabular.getCellNumber(i, j),
                                        lineSet,
                                        flag);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        }
 
@@ -1837,7 +1758,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                                        tabular.getCellNumber(i,j),
                                        lineSet,
                                        flag);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        }
 
@@ -1852,7 +1773,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                                        tabular.getCellNumber(i,j),
                                        lineSet,
                                        flag);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        }
 
@@ -1870,24 +1791,25 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                                        tabular.getCellNumber(i, j),
                                        setAlign,
                                        flag);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
+
        case LyXTabular::M_VALIGN_TOP:
        case LyXTabular::M_VALIGN_BOTTOM:
-       case LyXTabular::M_VALIGN_CENTER:
+       case LyXTabular::M_VALIGN_MIDDLE:
                flag = false;
        case LyXTabular::VALIGN_TOP:
        case LyXTabular::VALIGN_BOTTOM:
-       case LyXTabular::VALIGN_CENTER:
+       case LyXTabular::VALIGN_MIDDLE:
                for (int i = sel_row_start; i <= sel_row_end; ++i)
                        for (int j = sel_col_start; j <= sel_col_end; ++j)
                                tabular.setVAlignment(
                                        tabular.getCellNumber(i, j),
                                        setVAlign, flag);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
-       case LyXTabular::MULTICOLUMN:
-       {
+
+       case LyXTabular::MULTICOLUMN: {
                if (sel_row_start != sel_row_end) {
 #ifdef WITH_WARNINGS
 #warning Need I say it ? This is horrible.
@@ -1899,13 +1821,11 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                // just multicol for one Single Cell
                if (!hasSelection()) {
                        // check wether we are completly in a multicol
-                       if (tabular.isMultiColumn(actcell)) {
+                       if (tabular.isMultiColumn(actcell))
                                tabular.unsetMultiColumn(actcell);
-                               updateLocal(bv, INIT);
-                       } else {
+                       else
                                tabular.setMultiColumn(bv->buffer(), actcell, 1);
-                               updateLocal(bv, CELL);
-                       }
+                       updateLocal(bv);
                        break;
                }
                // we have a selection so this means we just add all this
@@ -1923,9 +1843,10 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                tabular.setMultiColumn(bv->buffer(), s_start, s_end - s_start + 1);
                actcell = s_start;
                clearSelection();
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
        }
+
        case LyXTabular::SET_ALL_LINES:
                setLines = true;
        case LyXTabular::UNSET_ALL_LINES:
@@ -1933,46 +1854,51 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                        for (int j = sel_col_start; j <= sel_col_end; ++j)
                                tabular.setAllLines(
                                        tabular.getCellNumber(i,j), setLines);
-               updateLocal(bv, INIT);
+               updateLocal(bv);
                break;
+
        case LyXTabular::SET_LONGTABULAR:
                tabular.setLongTabular(true);
-               updateLocal(bv, INIT); // because this toggles displayed
+               updateLocal(bv); // because this toggles displayed
                break;
+
        case LyXTabular::UNSET_LONGTABULAR:
                tabular.setLongTabular(false);
-               updateLocal(bv, INIT); // because this toggles displayed
+               updateLocal(bv); // because this toggles displayed
                break;
+
        case LyXTabular::SET_ROTATE_TABULAR:
                tabular.setRotateTabular(true);
                break;
+
        case LyXTabular::UNSET_ROTATE_TABULAR:
                tabular.setRotateTabular(false);
                break;
+
        case LyXTabular::SET_ROTATE_CELL:
                for (int i = sel_row_start; i <= sel_row_end; ++i)
                        for (int j = sel_col_start; j<=sel_col_end; ++j)
                                tabular.setRotateCell(
-                                       tabular.getCellNumber(i, j),
-                                       true);
+                                       tabular.getCellNumber(i, j), true);
                break;
+
        case LyXTabular::UNSET_ROTATE_CELL:
                for (int i = sel_row_start; i <= sel_row_end; ++i)
                        for (int j = sel_col_start; j <= sel_col_end; ++j)
                                tabular.setRotateCell(
                                        tabular.getCellNumber(i, j), false);
                break;
-       case LyXTabular::SET_USEBOX:
-       {
+
+       case LyXTabular::SET_USEBOX: {
                LyXTabular::BoxType val = LyXTabular::BoxType(strToInt(value));
                if (val == tabular.getUsebox(actcell))
                        val = LyXTabular::BOX_NONE;
                for (int i = sel_row_start; i <= sel_row_end; ++i)
                        for (int j = sel_col_start; j <= sel_col_end; ++j)
-                               tabular.setUsebox(
-                                       tabular.getCellNumber(i, j), val);
+                               tabular.setUsebox(tabular.getCellNumber(i, j), val);
                break;
        }
+
        case LyXTabular::UNSET_LTFIRSTHEAD:
                flag = false;
        case LyXTabular::SET_LTFIRSTHEAD:
@@ -1980,6 +1906,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                checkLongtableSpecial(ltt, value, flag);
                tabular.setLTHead(row, flag, ltt, true);
                break;
+
        case LyXTabular::UNSET_LTHEAD:
                flag = false;
        case LyXTabular::SET_LTHEAD:
@@ -1987,6 +1914,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                checkLongtableSpecial(ltt, value, flag);
                tabular.setLTHead(row, flag, ltt, false);
                break;
+
        case LyXTabular::UNSET_LTFOOT:
                flag = false;
        case LyXTabular::SET_LTFOOT:
@@ -1994,6 +1922,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                checkLongtableSpecial(ltt, value, flag);
                tabular.setLTFoot(row, flag, ltt, false);
                break;
+
        case LyXTabular::UNSET_LTLASTFOOT:
                flag = false;
        case LyXTabular::SET_LTLASTFOOT:
@@ -2001,12 +1930,13 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                checkLongtableSpecial(ltt, value, flag);
                tabular.setLTFoot(row, flag, ltt, true);
                break;
-       case LyXTabular::SET_LTNEWPAGE:
-       {
+
+       case LyXTabular::SET_LTNEWPAGE: {
                bool what = !tabular.getLTNewPage(row);
                tabular.setLTNewPage(row, what);
                break;
        }
+
        // dummy stuff just to avoid warnings
        case LyXTabular::LAST_ACTION:
                break;
@@ -2030,8 +1960,8 @@ bool InsetTabular::activateCellInset(BufferView * bv, int x, int y,
        inset.localDispatch(FuncRequest(bv, LFUN_INSET_EDIT, x,  y, button));
        if (!the_locking_inset)
                return false;
-       updateLocal(bv, CELL);
-       return (the_locking_inset != 0);
+       updateLocal(bv);
+       return the_locking_inset;
 }
 
 
@@ -2046,24 +1976,13 @@ bool InsetTabular::activateCellInsetAbs(BufferView * bv, int x, int y,
 
 bool InsetTabular::insetHit(BufferView *, int x, int) const
 {
-       return x + top_x
-               > cursorx_ + tabular.getBeginningOfTextInCell(actcell);
-}
-
-
-void InsetTabular::deleteLyXText(BufferView * bv, bool recursive) const
-{
-       resizeLyXText(bv, recursive);
+       return x + top_x > cursorx_ + tabular.getBeginningOfTextInCell(actcell);
 }
 
 
-void InsetTabular::resizeLyXText(BufferView * bv, bool force) const
+void InsetTabular::deleteLyXText(BufferView * /*bv*/, bool /*recursive*/) const
 {
-       if (force)
-               for(int i = 0; i < tabular.rows(); ++i)
-                       for(int j = 0; j < tabular.columns(); ++j)
-                               tabular.getCellInset(i, j).resizeLyXText(bv, true);
-       need_update = FULL;
+       //resizeLyXText(bv, recursive);
 }
 
 
@@ -2122,7 +2041,8 @@ FuncStatus InsetTabular::getStatus(string const & what) const
                return status.unknown(true);
        }
 
-       string const argument = ltrim(what.substr(tabularFeature[i].feature.length()));
+       string const argument
+               = ltrim(what.substr(tabularFeature[i].feature.length()));
 
        int sel_row_start;
        int sel_row_end;
@@ -2130,11 +2050,10 @@ FuncStatus InsetTabular::getStatus(string const & what) const
        LyXTabular::ltType dummyltt;
        bool flag = true;
 
-       if (hasSelection()) {
+       if (hasSelection())
                getSelection(sel_row_start, sel_row_end, dummy, dummy);
-       } else {
+       else
                sel_row_start = sel_row_end = tabular.row_of_cell(actcell);
-       }
 
        switch (action) {
        case LyXTabular::SET_PWIDTH:
@@ -2152,96 +2071,120 @@ FuncStatus InsetTabular::getStatus(string const & what) const
        case LyXTabular::MULTICOLUMN:
                status.setOnOff(tabular.isMultiColumn(actcell));
                break;
+
        case LyXTabular::M_TOGGLE_LINE_TOP:
                flag = false;
        case LyXTabular::TOGGLE_LINE_TOP:
                status.setOnOff(tabular.topLine(actcell, flag));
                break;
+
        case LyXTabular::M_TOGGLE_LINE_BOTTOM:
                flag = false;
        case LyXTabular::TOGGLE_LINE_BOTTOM:
                status.setOnOff(tabular.bottomLine(actcell, flag));
                break;
+
        case LyXTabular::M_TOGGLE_LINE_LEFT:
                flag = false;
        case LyXTabular::TOGGLE_LINE_LEFT:
                status.setOnOff(tabular.leftLine(actcell, flag));
                break;
+
        case LyXTabular::M_TOGGLE_LINE_RIGHT:
                flag = false;
        case LyXTabular::TOGGLE_LINE_RIGHT:
                status.setOnOff(tabular.rightLine(actcell, flag));
                break;
+
        case LyXTabular::M_ALIGN_LEFT:
                flag = false;
        case LyXTabular::ALIGN_LEFT:
                status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_LEFT);
                break;
+
        case LyXTabular::M_ALIGN_RIGHT:
                flag = false;
        case LyXTabular::ALIGN_RIGHT:
                status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_RIGHT);
                break;
+
        case LyXTabular::M_ALIGN_CENTER:
                flag = false;
        case LyXTabular::ALIGN_CENTER:
                status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_CENTER);
                break;
+
        case LyXTabular::ALIGN_BLOCK:
                status.disabled(tabular.getPWidth(actcell).zero());
                status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_BLOCK);
                break;
+
        case LyXTabular::M_VALIGN_TOP:
                flag = false;
        case LyXTabular::VALIGN_TOP:
                status.setOnOff(tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_TOP);
                break;
+
        case LyXTabular::M_VALIGN_BOTTOM:
                flag = false;
        case LyXTabular::VALIGN_BOTTOM:
                status.setOnOff(tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_BOTTOM);
                break;
-       case LyXTabular::M_VALIGN_CENTER:
+
+       case LyXTabular::M_VALIGN_MIDDLE:
                flag = false;
-       case LyXTabular::VALIGN_CENTER:
-               status.setOnOff(tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_CENTER);
+       case LyXTabular::VALIGN_MIDDLE:
+               status.setOnOff(tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_MIDDLE);
                break;
+
        case LyXTabular::SET_LONGTABULAR:
                status.setOnOff(tabular.isLongTabular());
                break;
+
        case LyXTabular::UNSET_LONGTABULAR:
                status.setOnOff(!tabular.isLongTabular());
                break;
+
        case LyXTabular::SET_ROTATE_TABULAR:
                status.setOnOff(tabular.getRotateTabular());
                break;
+
        case LyXTabular::UNSET_ROTATE_TABULAR:
                status.setOnOff(!tabular.getRotateTabular());
                break;
+
        case LyXTabular::SET_ROTATE_CELL:
                status.setOnOff(tabular.getRotateCell(actcell));
                break;
+
        case LyXTabular::UNSET_ROTATE_CELL:
                status.setOnOff(!tabular.getRotateCell(actcell));
                break;
+
        case LyXTabular::SET_USEBOX:
                status.setOnOff(strToInt(argument) == tabular.getUsebox(actcell));
                break;
+
        case LyXTabular::SET_LTFIRSTHEAD:
                status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt));
                break;
+
        case LyXTabular::SET_LTHEAD:
                status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt));
                break;
+
        case LyXTabular::SET_LTFOOT:
                status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt));
                break;
+
        case LyXTabular::SET_LTLASTFOOT:
                status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt));
                break;
+
        case LyXTabular::SET_LTNEWPAGE:
                status.setOnOff(tabular.getLTNewPage(sel_row_start));
                break;
+
        default:
                status.clear();
                status.disabled(true);
@@ -2270,37 +2213,41 @@ bool InsetTabular::copySelection(BufferView * bv)
        } else {
                sel_col_end = tabular.right_column_of_cell(sel_cell_end);
        }
-       int const columns = sel_col_end - sel_col_start + 1;
 
        int sel_row_start = tabular.row_of_cell(sel_cell_start);
        int sel_row_end = tabular.row_of_cell(sel_cell_end);
-       if (sel_row_start > sel_row_end) {
+       if (sel_row_start > sel_row_end)
                swap(sel_row_start, sel_row_end);
-       }
-       int const rows = sel_row_end - sel_row_start + 1;
 
        delete paste_tabular;
-       paste_tabular = new LyXTabular(bv->buffer()->params,
-                                      this, tabular); // rows, columns);
+       paste_tabular = new LyXTabular(bv->buffer()->params, this, tabular);
+
        for (int i = 0; i < sel_row_start; ++i)
                paste_tabular->deleteRow(0);
+
+       int const rows = sel_row_end - sel_row_start + 1;
        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 (int i = 0; i < sel_col_start; ++i)
                paste_tabular->deleteColumn(0);
+
+       int const columns = sel_col_end - sel_col_start + 1;
        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,
-                            (int)parOwner()->params().depth(), true, '\t');
-       bv->stuffClipboard(STRCONV(sstr.str()));
+       ostringstream os;
+       paste_tabular->ascii(*bv->buffer(), os,
+                            ownerPar(*bv->buffer(), this).params().depth(), true, '\t');
+       bv->stuffClipboard(STRCONV(os.str()));
        return true;
 }
 
@@ -2351,14 +2298,16 @@ bool InsetTabular::cutSelection(BufferParams const & bp)
        } else {
                sel_col_end = tabular.right_column_of_cell(sel_cell_end);
        }
+
        int sel_row_start = tabular.row_of_cell(sel_cell_start);
        int sel_row_end = tabular.row_of_cell(sel_cell_end);
-       if (sel_row_start > sel_row_end) {
+
+       if (sel_row_start > sel_row_end)
                swap(sel_row_start, sel_row_end);
-       }
-       if (sel_cell_start > sel_cell_end) {
+
+       if (sel_cell_start > sel_cell_end)
                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)
                        tabular.getCellInset(tabular.getCellNumber(i, j)).clear(bp.tracking_changes);
@@ -2372,14 +2321,6 @@ bool InsetTabular::isRightToLeft(BufferView * bv)
 }
 
 
-bool InsetTabular::nodraw() const
-{
-       if (!UpdatableInset::nodraw() && the_locking_inset)
-               return the_locking_inset->nodraw();
-       return UpdatableInset::nodraw();
-}
-
-
 int InsetTabular::scroll(bool recursive) const
 {
        int sx = UpdatableInset::scroll(false);
@@ -2399,17 +2340,15 @@ void InsetTabular::getSelection(int & srow, int & erow,
 
        srow = tabular.row_of_cell(start);
        erow = tabular.row_of_cell(end);
-       if (srow > erow) {
+       if (srow > erow)
                swap(srow, erow);
-       }
 
        scol = tabular.column_of_cell(start);
        ecol = tabular.column_of_cell(end);
-       if (scol > ecol) {
+       if (scol > ecol)
                swap(scol, ecol);
-       } else {
+       else
                ecol = tabular.right_column_of_cell(end);
-       }
 }
 
 
@@ -2448,16 +2387,12 @@ InsetOld * InsetTabular::getInsetFromID(int id_arg) const
 WordLangTuple const
 InsetTabular::selectNextWordToSpellcheck(BufferView * bv, float & value) const
 {
-       nodraw(true);
        if (the_locking_inset) {
                WordLangTuple word(the_locking_inset->selectNextWordToSpellcheck(bv, value));
-               if (!word.word().empty()) {
-                       nodraw(false);
+               if (!word.word().empty())
                        return word;
-               }
                if (tabular.isLastCell(actcell)) {
                        bv->unlockInset(const_cast<InsetTabular *>(this));
-                       nodraw(false);
                        return WordLangTuple();
                }
                ++actcell;
@@ -2466,7 +2401,6 @@ InsetTabular::selectNextWordToSpellcheck(BufferView * bv, float & value) const
        tabular.getCellInset(actcell)
                .localDispatch(FuncRequest(bv, LFUN_INSET_EDIT));
        WordLangTuple word(selectNextWordInt(bv, value));
-       nodraw(false);
        if (!word.word().empty())
                resetPos(bv);
        return word;
@@ -2502,13 +2436,6 @@ void InsetTabular::selectSelectedWord(BufferView * bv)
 }
 
 
-void InsetTabular::toggleSelection(BufferView * bv, bool kill_selection)
-{
-       if (the_locking_inset)
-               the_locking_inset->toggleSelection(bv, kill_selection);
-}
-
-
 void InsetTabular::markErased()
 {
        for (int cell = 0; cell < tabular.getNumberOfCells(); ++cell)
@@ -2520,7 +2447,7 @@ bool InsetTabular::nextChange(BufferView * bv, lyx::pos_type & length)
 {
        if (the_locking_inset) {
                if (the_locking_inset->nextChange(bv, length)) {
-                       updateLocal(bv, CELL);
+                       updateLocal(bv);
                        return true;
                }
                if (tabular.isLastCell(actcell))
@@ -2529,14 +2456,14 @@ bool InsetTabular::nextChange(BufferView * bv, lyx::pos_type & length)
        }
        InsetText & inset = tabular.getCellInset(actcell);
        if (inset.nextChange(bv, length)) {
-               updateLocal(bv, FULL);
+               updateLocal(bv);
                return true;
        }
        while (!tabular.isLastCell(actcell)) {
                ++actcell;
                InsetText & inset = tabular.getCellInset(actcell);
                if (inset.nextChange(bv, length)) {
-                       updateLocal(bv, FULL);
+                       updateLocal(bv);
                        return true;
                }
        }
@@ -2550,7 +2477,7 @@ bool InsetTabular::searchForward(BufferView * bv, string const & str,
        int cell = 0;
        if (the_locking_inset) {
                if (the_locking_inset->searchForward(bv, str, cs, mw)) {
-                       updateLocal(bv, CELL);
+                       updateLocal(bv);
                        return true;
                }
                if (tabular.isLastCell(actcell))
@@ -2559,14 +2486,14 @@ bool InsetTabular::searchForward(BufferView * bv, string const & str,
        }
        InsetText & inset = tabular.getCellInset(cell);
        if (inset.searchForward(bv, str, cs, mw)) {
-               updateLocal(bv, FULL);
+               updateLocal(bv);
                return true;
        }
        while (!tabular.isLastCell(cell)) {
                ++cell;
                InsetText & inset = tabular.getCellInset(cell);
                if (inset.searchForward(bv, str, cs, mw)) {
-                       updateLocal(bv, FULL);
+                       updateLocal(bv);
                        return true;
                }
        }
@@ -2580,7 +2507,7 @@ bool InsetTabular::searchBackward(BufferView * bv, string const & str,
        int cell = tabular.getNumberOfCells();
        if (the_locking_inset) {
                if (the_locking_inset->searchBackward(bv, str, cs, mw)) {
-                       updateLocal(bv, CELL);
+                       updateLocal(bv);
                        return true;
                }
                cell = actcell;
@@ -2590,7 +2517,7 @@ bool InsetTabular::searchBackward(BufferView * bv, string const & str,
                --cell;
                InsetText & inset = tabular.getCellInset(cell);
                if (inset.searchBackward(bv, str, cs, mw)) {
-                       updateLocal(bv, CELL);
+                       updateLocal(bv);
                        return true;
                }
        }
@@ -2619,7 +2546,9 @@ bool InsetTabular::forceDefaultParagraphs(InsetOld const * in) const
        // well we didn't obviously find it so maybe our owner knows more
        if (owner())
                return owner()->forceDefaultParagraphs(in);
-       // if we're here there is really something strange going on!!!
+
+       lyxerr << "If we're here there is really something strange going on!"
+              << endl;
        return false;
 }
 
@@ -2636,9 +2565,7 @@ bool InsetTabular::insertAsciiString(BufferView * bv, string const & buf,
        string::size_type len = buf.length();
        string::size_type p = 0;
 
-       while (p < len &&
-              ((p = buf.find_first_of("\t\n", p)) != string::npos))
-       {
+       while (p < len && (p = buf.find_first_of("\t\n", p)) != string::npos) {
                switch (buf[p]) {
                case '\t':
                        ++cols;
@@ -2785,9 +2712,8 @@ int InsetTabularMailer::string2params(string const & in, InsetTabular & inset)
        if (!lex.isOK())
                return -1;
 
-       Buffer const * const buffer = inset.buffer();
-       if (buffer)
-               inset.read(buffer, lex);
+       Buffer const & buffer = inset.buffer();
+       inset.read(buffer, lex);
 
        // We can't set the active cell, but we can tell the frontend
        // what it is.
@@ -2797,9 +2723,7 @@ int InsetTabularMailer::string2params(string const & in, InsetTabular & inset)
 
 string const InsetTabularMailer::params2string(InsetTabular const & inset)
 {
-       Buffer const * const buffer = inset.buffer();
-       if (!buffer)
-               return string();
+       Buffer const & buffer = inset.buffer();
 
        ostringstream data;
        data << name_ << " \\active_cell " << inset.getActCell() << '\n';