]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insettabular.C
quick fix for commented out figures
[lyx.git] / src / insets / insettabular.C
index 4b20241341ac3190e34b12384c2bcc7300fce202..b4496156bc563170accf8f75e60dc3f75e8be368 100644 (file)
@@ -1,6 +1,6 @@
 /* This file is part of
  * ======================================================
- * 
+ *
  *           LyX, The Document Processor
  *
  *           Copyright 2001 The LyX Team.
@@ -16,6 +16,7 @@
 
 #include "insettabular.h"
 
+#include "lyx_cb.h"
 #include "buffer.h"
 #include "commandtags.h"
 #include "lyxfunc.h"
 #include "Painter.h"
 #include "font.h"
 #include "lyxtext.h"
-#include "lyx_gui_misc.h"
 #include "LyXView.h"
 #include "insets/insettext.h"
 #include "debug.h"
-#include "WorkArea.h"
 #include "gettext.h"
 #include "language.h"
 #include "BufferView.h"
@@ -136,7 +135,7 @@ InsetTabular::InsetTabular(Buffer const & buf, int rows, int columns)
                rows = 1;
        if (columns <= 0)
                columns = 1;
-       tabular.reset(new LyXTabular(this, rows, columns));
+       tabular.reset(new LyXTabular(buf.params, this, rows, columns));
        // for now make it always display as display() inset
        // just for test!!!
        the_locking_inset = 0;
@@ -157,7 +156,8 @@ InsetTabular::InsetTabular(InsetTabular const & tab, Buffer const & buf,
                                                   bool same_id)
        : UpdatableInset(tab, same_id), buffer(&buf)
 {
-       tabular.reset(new LyXTabular(this, *(tab.tabular), same_id));
+       tabular.reset(new LyXTabular(buf.params,
+                                    this, *(tab.tabular), same_id));
        the_locking_inset = 0;
        old_locking_inset = 0;
        locked = false;
@@ -261,13 +261,13 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
                x += static_cast<float>(scroll());
 #endif
        if (!cleared && ((need_update == INIT) || (need_update == FULL) ||
-                        (top_x != int(x)) || (top_baseline != baseline)))
+                        (top_x != int(x)) || (top_baseline != baseline)))
        {
                int h = ascent(bv, font) + descent(bv, font);
                int const tx = display() || !owner() ? 0 : top_x;
                int w =  tx ? width(bv, font) : pain.paperWidth();
                int ty = baseline - ascent(bv, font);
-       
+
                if (ty < 0)
                        ty = 0;
                if ((ty + h) > pain.paperHeight())
@@ -308,7 +308,7 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
                                if (hasSelection()) {
                                        drawCellSelection(pain, nx, baseline, i, j, cell);
                                }
-                               
+
                                tabular->GetCellInset(cell)->draw(bv, font, baseline, cx, cleared);
                                drawCellLines(pain, nx, baseline, i, cell);
                                nx += tabular->GetWidthOfColumn(cell);
@@ -376,7 +376,7 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
                //
                //  +--------------------+
                //  |         C          |   The rectangles are A, B and C
-               //  | A |------------| B |   below, origin top left (tx, ty), 
+               //  | A |------------| B |   below, origin top left (tx, ty),
                //  |   |  inset box |   |   dimensions w(idth), h(eight).
                //  +---+------------+---+   x grows rightward, y downward
                //  |         D          |
@@ -388,10 +388,10 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
 #endif
                        // clear before the inset
                        int tx, ty, w, h;
-                       tx = nx + 1; 
+                       tx = nx + 1;
                        ty = baseline - tabular->GetAscentOfRow(i) + 1;
                        w = int(cx - nx - 1);
-                       h = tabular->GetAscentOfRow(i) + 
+                       h = tabular->GetAscentOfRow(i) +
                                tabular->GetDescentOfRow(i) - 1;
                        pain.fillRectangle(tx, ty, w, h, backgroundColor());
                        // clear behind the inset
@@ -437,11 +437,11 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
 
 
 void InsetTabular::drawCellLines(Painter & pain, int x, int baseline,
-                                 int row, int cell) const
+                                int row, int cell) const
 {
        int x2 = x + tabular->GetWidthOfColumn(cell);
        bool on_off;
-       
+
        if (!tabular->TopAlreadyDrawed(cell)) {
                on_off = !tabular->TopLine(cell);
                pain.line(x, baseline - tabular->GetAscentOfRow(row),
@@ -483,12 +483,12 @@ void InsetTabular::drawCellSelection(Painter & pain, int x, int baseline,
        } else {
                ce = tabular->right_column_of_cell(sel_cell_end);
        }
-       
+
        int rs = tabular->row_of_cell(sel_cell_start);
        int re = tabular->row_of_cell(sel_cell_end);
        if (rs > re)
                swap(rs, re);
-       
+
        if ((column >= cs) && (column <= ce) && (row >= rs) && (row <= re)) {
                int w = tabular->GetWidthOfColumn(cell);
                int h = tabular->GetAscentOfRow(row) + tabular->GetDescentOfRow(row);
@@ -552,7 +552,7 @@ string const InsetTabular::editMessage() const
 void InsetTabular::edit(BufferView * bv, int x, int y, unsigned int button)
 {
        UpdatableInset::edit(bv, x, y, button);
-       
+
        if (!bv->lockInset(this)) {
                lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl;
                return;
@@ -573,11 +573,12 @@ void InsetTabular::edit(BufferView * bv, int x, int y, unsigned int button)
 void InsetTabular::edit(BufferView * bv, bool front)
 {
        UpdatableInset::edit(bv, front);
-       
+
        if (!bv->lockInset(this)) {
                lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl;
                return;
        }
+       finishUndo();
        locked = true;
        the_locking_inset = 0;
        inset_x = 0;
@@ -588,7 +589,7 @@ void InsetTabular::edit(BufferView * bv, bool front)
                actcell = tabular->GetNumberOfCells() - 1;
        clearSelection();
        resetPos(bv);
-       finishUndo();
+       bv->fitCursor();
 }
 
 
@@ -612,12 +613,14 @@ void InsetTabular::insetUnlock(BufferView * bv)
 
 
 void InsetTabular::updateLocal(BufferView * bv, UpdateCodes what,
-                               bool mark_dirty) const
+                              bool mark_dirty) const
 {
        if (what == INIT) {
                LyXFont font;
                calculate_dimensions_of_cells(bv, font, true);
        }
+       if (!locked && what == CELL)
+               what = FULL;
        if (need_update < what) // only set this if it has greater update
                need_update = what;
 #if 0 // maybe this should not be done!
@@ -692,7 +695,7 @@ bool InsetTabular::unlockInsetInInset(BufferView * bv, UpdatableInset * inset,
                        scroll(bv, 0.0F);
 #endif
                updateLocal(bv, CELL, false);
-               showInsetCursor(bv, false);
+//             showInsetCursor(bv, false);
                return true;
        }
        if (the_locking_inset->unlockInsetInInset(bv, inset, lr)) {
@@ -709,10 +712,16 @@ bool InsetTabular::unlockInsetInInset(BufferView * bv, UpdatableInset * inset,
 
 bool InsetTabular::updateInsetInInset(BufferView * bv, Inset * inset)
 {
-       if (!the_locking_inset)
+       Inset * 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;
-       if (the_locking_inset != inset) {
-               if (!the_locking_inset->updateInsetInInset(bv, inset))
+       // 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, false);
@@ -799,7 +808,9 @@ void InsetTabular::insetButtonPress(BufferView * bv, int x, int y, int button)
                return;
        }
        if (inset_hit && bv->theLockingInset()) {
-               if (activateCellInsetAbs(bv, x, y, button))
+               // only activate the Inset so that no internal inset is hit
+               // by this call. It should be only hit by the insetButtonPress call.
+               if (activateCellInsetAbs(bv, 0, 0, 0))
                        the_locking_inset->insetButtonPress(bv,
                                                            x - inset_x,
                                                            y - inset_y,
@@ -811,7 +822,7 @@ void InsetTabular::insetButtonPress(BufferView * bv, int x, int y, int button)
 
 
 bool InsetTabular::insetButtonRelease(BufferView * bv,
-                                      int x, int y, int button)
+                                     int x, int y, int button)
 {
        bool ret = false;
        if (the_locking_inset)
@@ -834,10 +845,10 @@ void InsetTabular::insetMotionNotify(BufferView * bv, int x, int y, int button)
                                                     button);
                return;
        }
+
        hideInsetCursor(bv);
 //     int const old_cell = actcell;
-       
+
        setPos(bv, x, y);
        if (!hasSelection()) {
                setSelection(actcell, actcell);
@@ -860,9 +871,9 @@ void InsetTabular::insetKeyPress(XKeyEvent * xke)
 
 UpdatableInset::RESULT
 InsetTabular::localDispatch(BufferView * bv, kb_action action,
-                            string const & arg)
+                           string const & arg)
 {
-       // We need to save the value of the_locking_inset as the call to 
+       // We need to save the value of the_locking_inset as the call to
        // the_locking_inset->LocalDispatch might unlock it.
        old_locking_inset = the_locking_inset;
        UpdatableInset::RESULT result =
@@ -939,7 +950,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
                        setSelection(start, actcell);
                        break;
                }
-               
+
                int end = actcell;
                // if we are starting a selection, only select
                // the current cell at the beginning
@@ -963,11 +974,11 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
                        setSelection(start, actcell);
                        break;
                }
+
                int end = actcell;
                // if we are starting a selection, only select
                // the current cell at the beginning
-               if (hasSelection()) { 
+               if (hasSelection()) {
                        moveLeft(bv, false);
                        end = actcell;
                }
@@ -1038,10 +1049,10 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
                }
                int column = actcol;
                unlockInsetInInset(bv, the_locking_inset);
-               if (bv->text->first + bv->painter().paperHeight() <
+               if (bv->text->first_y + bv->painter().paperHeight() <
                    (top_baseline + tabular->GetHeightOfTabular()))
                        {
-                               bv->scrollCB(bv->text->first + bv->painter().paperHeight());
+                               bv->scrollCB(bv->text->first_y + bv->painter().paperHeight());
                                code = FULL;
                                actcell = tabular->GetCellBelow(first_visible_cell) + column;
                        } else {
@@ -1060,7 +1071,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
                int column = actcol;
                unlockInsetInInset(bv, the_locking_inset);
                if (top_baseline < 0) {
-                       bv->scrollCB(bv->text->first - bv->painter().paperHeight());
+                       bv->scrollCB(bv->text->first_y - bv->painter().paperHeight());
                        code = FULL;
                        if (top_baseline > 0)
                                actcell = column;
@@ -1080,7 +1091,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
        case LFUN_NEXTSEL:
        case LFUN_WORDLEFT:
        case LFUN_WORDLEFTSEL:
-       case LFUN_WORDRIGHT: 
+       case LFUN_WORDRIGHT:
        case LFUN_WORDRIGHTSEL:
        case LFUN_DOWN_PARAGRAPH:
        case LFUN_DOWN_PARAGRAPHSEL:
@@ -1093,7 +1104,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
        case LFUN_END:
        case LFUN_ENDSEL:
        case LFUN_BEGINNINGBUF:
-       case LFUN_BEGINNINGBUFSEL: 
+       case LFUN_BEGINNINGBUFSEL:
        case LFUN_ENDBUF:
        case LFUN_ENDBUFSEL:
                break;
@@ -1104,12 +1115,26 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
                if (!tabularFeatures(bv, arg))
                        result = UNDISPATCHED;
                break;
+               // insert file functions
+       case LFUN_FILE_INSERT_ASCII_PARA:
+       case LFUN_FILE_INSERT_ASCII:
+       {
+               string tmpstr = getContentsOfAsciiFile(bv, arg, false);
+               if (tmpstr.empty())
+                       break;
+               if (insertAsciiString(bv, tmpstr, false))
+                       updateLocal(bv, INIT, true);
+               else
+                       result = UNDISPATCHED;
+               break;
+       }
+       // cut and paste functions
        case LFUN_CUT:
                if (!copySelection(bv))
                        break;
                setUndo(bv, Undo::DELETE,
-                       bv->text->cursor.par(),
-                       bv->text->cursor.par()->next());
+                       bv->text->cursor.par(),
+                       bv->text->cursor.par()->next());
                cutSelection();
                updateLocal(bv, INIT, true);
                break;
@@ -1122,9 +1147,9 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
        case LFUN_PASTESELECTION:
        {
                string const clip(bv->getClipboard());
-       
-               if (clip.empty())
+                       if (clip.empty())
                        break;
+#if 0
                if (clip.find('\t') != string::npos) {
                        int cols = 1;
                        int rows = 1;
@@ -1149,7 +1174,8 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
                        }
                        maxCols = max(cols, maxCols);
                        delete paste_tabular;
-                       paste_tabular = new LyXTabular(this, rows, maxCols);
+                       paste_tabular = new LyXTabular(bv->buffer()->params,
+                                                      this, rows, maxCols);
                        string::size_type op = 0;
                        int cell = 0;
                        int cells = paste_tabular->GetNumberOfCells();
@@ -1177,7 +1203,11 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
                        // check for the last cell if there is no trailing '\n'
                        if ((cell < cells) && (op < len))
                                paste_tabular->GetCellInset(cell)->setText(clip.substr(op, len-op));
-               } else {
+               } else
+#else
+               if (!insertAsciiString(bv, clip, true))
+#endif
+               {
                        // so that the clipboard is used and it goes on
                        // to default
                        // and executes LFUN_PASTESELECTION in insettext!
@@ -1188,8 +1218,8 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
        case LFUN_PASTE:
                if (hasPasteBuffer()) {
                        setUndo(bv, Undo::INSERT,
-                               bv->text->cursor.par(),
-                               bv->text->cursor.par()->next());
+                               bv->text->cursor.par(),
+                               bv->text->cursor.par()->next());
                        pasteSelection(bv);
                        updateLocal(bv, INIT, true);
                        break;
@@ -1247,7 +1277,10 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
        }
        if (result < FINISHED) {
                if (!the_locking_inset) {
-                       showInsetCursor(bv);
+                       if (bv->fitCursor())
+                               updateLocal(bv, FULL, false);
+                       if (locked)
+                               showInsetCursor(bv);
                }
        } else
                bv->unlockInset(this);
@@ -1256,7 +1289,7 @@ InsetTabular::localDispatch(BufferView * bv, kb_action action,
 
 
 int InsetTabular::latex(Buffer const * buf, ostream & os,
-                        bool fragile, bool fp) const
+                       bool fragile, bool fp) const
 {
        return tabular->latex(buf, os, fragile, fp);
 }
@@ -1266,7 +1299,7 @@ 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);
+                                     false,0);
        return tabular->ascii(buf, os, 0, false,0);
 }
 
@@ -1313,15 +1346,15 @@ void InsetTabular::validate(LaTeXFeatures & features) const
 
 
 bool InsetTabular::calculate_dimensions_of_cells(BufferView * bv,
-                                                 LyXFont const & font,
-                                                 bool reinit) const
+                                                LyXFont const & font,
+                                                bool reinit) const
 {
        int cell = -1;
        int maxAsc = 0;
        int maxDesc = 0;
        InsetText * inset;
        bool changed = false;
-       
+
        // 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) &&
@@ -1382,12 +1415,12 @@ void InsetTabular::toggleInsetCursor(BufferView * bv)
                the_locking_inset->toggleInsetCursor(bv);
                return;
        }
-       
+
        LyXFont font; // = the_locking_inset->GetFont(par, cursor.pos);
-       
+
        int const asc = lyxfont::maxAscent(font);
        int const desc = lyxfont::maxDescent(font);
-       
+
        if (isCursorVisible())
                bv->hideLockedInsetCursor();
        else
@@ -1402,7 +1435,7 @@ void InsetTabular::showInsetCursor(BufferView * bv, bool show)
                return;
        if (!isCursorVisible()) {
                LyXFont font; // = GetFont(par, cursor.pos);
-       
+
                int const asc = lyxfont::maxAscent(font);
                int const desc = lyxfont::maxDescent(font);
                bv->fitLockedInsetCursor(cursor_.x(), cursor_.y(), asc, desc);
@@ -1425,21 +1458,25 @@ void InsetTabular::hideInsetCursor(BufferView * bv)
 void InsetTabular::fitInsetCursor(BufferView * bv) const
 {
        if (the_locking_inset) {
+               int old_first_y = bv->text->first_y;
                the_locking_inset->fitInsetCursor(bv);
+               if (old_first_y != bv->text->first_y)
+                       need_update = FULL;
                return;
        }
        LyXFont font;
-       
+
        int const asc = lyxfont::maxAscent(font);
        int const desc = lyxfont::maxDescent(font);
-       bv->fitLockedInsetCursor(cursor_.x(), cursor_.y(), asc, desc);
+       if (bv->fitLockedInsetCursor(cursor_.x(), cursor_.y(), asc, desc))
+               need_update = FULL;
 }
 
 
 void InsetTabular::setPos(BufferView * bv, int x, int y) const
 {
        cursor_.y(0);
-       
+
        actcell = actrow = actcol = 0;
        int ly = tabular->GetDescentOfRow(actrow);
 
@@ -1468,7 +1505,7 @@ void InsetTabular::setPos(BufferView * bv, int x, int y) const
 int InsetTabular::getCellXPos(int cell) const
 {
        int c = cell;
-       
+
        for (; !tabular->IsFirstCellInRow(c); --c)
                ;
        int lx = tabular->GetWidthOfColumn(cell);
@@ -1481,7 +1518,9 @@ int InsetTabular::getCellXPos(int cell) const
 
 void InsetTabular::resetPos(BufferView * bv) const
 {
+#ifdef WITH_WARNINGS
 #warning This should be fixed in the right manner (20011128 Jug)
+#endif
        // fast hack to fix infinite repaintings!
        if (in_reset_pos)
                return;
@@ -1698,15 +1737,15 @@ bool InsetTabular::deletable() const
 
 
 void InsetTabular::setFont(BufferView * bv, LyXFont const & font, bool tall,
-                           bool selectall)
+                          bool selectall)
 {
        if (selectall) {
                setSelection(0, tabular->GetNumberOfCells() - 1);
        }
        if (hasSelection()) {
                setUndo(bv, Undo::EDIT,
-                       bv->text->cursor.par(),
-                       bv->text->cursor.par()->next());
+                       bv->text->cursor.par(),
+                       bv->text->cursor.par()->next());
                bool frozen = undo_frozen;
                if (!frozen)
                        freezeUndo();
@@ -1733,11 +1772,11 @@ void InsetTabular::setFont(BufferView * bv, LyXFont const & font, bool tall,
 bool InsetTabular::tabularFeatures(BufferView * bv, string const & what)
 {
        LyXTabular::Feature action = LyXTabular::LAST_ACTION;
-       
+
        int i = 0;
        for (; tabularFeature[i].action != LyXTabular::LAST_ACTION; ++i) {
                string const tmp = tabularFeature[i].feature;
-               
+
                if (tmp == what.substr(0, tmp.length())) {
                        //if (!compare(tabularFeatures[i].feature.c_str(), what.c_str(),
                        //tabularFeatures[i].feature.length())) {
@@ -1755,7 +1794,7 @@ bool InsetTabular::tabularFeatures(BufferView * bv, string const & what)
 }
 
 static void checkLongtableSpecial(LyXTabular::ltType & ltt,
-                                  string const & special, bool & flag)
+                                 string const & special, bool & flag)
 {
        if (special == "dl_above") {
                ltt.topDL = flag;
@@ -1774,8 +1813,8 @@ static void checkLongtableSpecial(LyXTabular::ltType & ltt,
 
 
 void InsetTabular::tabularFeatures(BufferView * bv,
-                                   LyXTabular::Feature feature,
-                                   string const & value)
+                                  LyXTabular::Feature feature,
+                                  string const & value)
 {
        int sel_col_start;
        int sel_col_end;
@@ -1820,20 +1859,20 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                sel_row_start = sel_row_end = tabular->row_of_cell(actcell);
        }
        setUndo(bv, Undo::FINISH,
-               bv->text->cursor.par(),
-               bv->text->cursor.par()->next());
+               bv->text->cursor.par(),
+               bv->text->cursor.par()->next());
 
        int row =  tabular->row_of_cell(actcell);
        int column = tabular->column_of_cell(actcell);
        bool flag = true;
        LyXTabular::ltType ltt;
-       
+
        switch (feature) {
        case LyXTabular::SET_PWIDTH:
        {
                LyXLength const vallen(value);
                LyXLength const & tmplen = tabular->GetColumnPWidth(actcell);
-               
+
                bool const update = (tmplen != vallen);
                tabular->SetColumnPWidth(actcell, vallen);
                if (update) {
@@ -1850,7 +1889,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
        {
                LyXLength const vallen(value);
                LyXLength const & tmplen = tabular->GetPWidth(actcell);
-               
+
                bool const update = (tmplen != vallen);
                tabular->SetMColumnPWidth(actcell, vallen);
                if (update) {
@@ -1870,13 +1909,13 @@ void InsetTabular::tabularFeatures(BufferView * bv,
        case LyXTabular::APPEND_ROW:
                // append the row into the tabular
                unlockInsetInInset(bv, the_locking_inset);
-               tabular->AppendRow(actcell);
+               tabular->AppendRow(bv->buffer()->params, actcell);
                updateLocal(bv, INIT, true);
                break;
        case LyXTabular::APPEND_COLUMN:
                // append the column into the tabular
                unlockInsetInInset(bv, the_locking_inset);
-               tabular->AppendColumn(actcell);
+               tabular->AppendColumn(bv->buffer()->params, actcell);
                actcell = tabular->GetCellNumber(row, column);
                updateLocal(bv, INIT, true);
                break;
@@ -1915,12 +1954,12 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                updateLocal(bv, INIT, true);
                break;
        }
-       
+
        case LyXTabular::M_TOGGLE_LINE_BOTTOM:
                flag = false;
        case LyXTabular::TOGGLE_LINE_BOTTOM:
        {
-               bool lineSet = !tabular->BottomLine(actcell, flag); 
+               bool lineSet = !tabular->BottomLine(actcell, flag);
                for (int i = sel_row_start; i <= sel_row_end; ++i)
                        for (int j = sel_col_start; j <= sel_col_end; ++j)
                                tabular->SetBottomLine(
@@ -1930,7 +1969,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                updateLocal(bv, INIT, true);
                break;
        }
-       
+
        case LyXTabular::M_TOGGLE_LINE_LEFT:
                flag = false;
        case LyXTabular::TOGGLE_LINE_LEFT:
@@ -1945,7 +1984,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                updateLocal(bv, INIT, true);
                break;
        }
-       
+
        case LyXTabular::M_TOGGLE_LINE_RIGHT:
                flag = false;
        case LyXTabular::TOGGLE_LINE_RIGHT:
@@ -1960,7 +1999,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                updateLocal(bv, INIT, true);
                break;
        }
-       
+
        case LyXTabular::M_ALIGN_LEFT:
        case LyXTabular::M_ALIGN_RIGHT:
        case LyXTabular::M_ALIGN_CENTER:
@@ -1993,8 +2032,8 @@ void InsetTabular::tabularFeatures(BufferView * bv,
        case LyXTabular::MULTICOLUMN:
        {
                if (sel_row_start != sel_row_end) {
-                       Alert::alert(_("Impossible Operation!"), 
-                                  _("Multicolumns can only be horizontally."), 
+                       Alert::alert(_("Impossible Operation!"),
+                                  _("Multicolumns can only be horizontally."),
                                   _("Sorry."));
                        return;
                }
@@ -2005,7 +2044,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                                tabular->UnsetMultiColumn(actcell);
                                updateLocal(bv, INIT, true);
                        } else {
-                               tabular->SetMultiColumn(actcell, 1);
+                               tabular->SetMultiColumn(bv->buffer(), actcell, 1);
                                updateLocal(bv, CELL, true);
                        }
                        return;
@@ -2022,7 +2061,7 @@ void InsetTabular::tabularFeatures(BufferView * bv,
                        s_start = sel_cell_start;
                        s_end = sel_cell_end;
                }
-               tabular->SetMultiColumn(s_start, s_end - s_start + 1);
+               tabular->SetMultiColumn(bv->buffer(), s_start, s_end - s_start + 1);
                actcell = s_start;
                clearSelection();
                updateLocal(bv, INIT, true);
@@ -2158,7 +2197,7 @@ bool InsetTabular::insetHit(BufferView *, int x, int) const
 int InsetTabular::getMaxWidthOfCell(BufferView * bv, int cell) const
 {
        LyXLength const len = tabular->GetPWidth(cell);
-       
+
        if (len.zero())
                return -1;
        return len.inPixels(latexTextWidth(bv), bv->text->defaultHeight());
@@ -2166,7 +2205,7 @@ int InsetTabular::getMaxWidthOfCell(BufferView * bv, int cell) const
 
 
 int InsetTabular::getMaxWidth(BufferView * bv,
-                              UpdatableInset const * inset) const
+                             UpdatableInset const * inset) const
 {
        int cell = tabular->GetCellFromInset(inset, actcell);
 
@@ -2175,13 +2214,13 @@ int InsetTabular::getMaxWidth(BufferView * bv,
                       << endl;
                return -1;
        }
-       
+
        int w = getMaxWidthOfCell(bv, cell);
        if (w > 0) {
                // because the inset then subtracts it's top_x and owner->x()
                w += (inset->x() - top_x);
        }
-       
+
        return w;
 }
 
@@ -2206,7 +2245,7 @@ void InsetTabular::resizeLyXText(BufferView * bv, bool force) const
 
 
 LyXText * InsetTabular::getLyXText(BufferView const * bv,
-                                   bool const recursive) const
+                                  bool const recursive) const
 {
        if (the_locking_inset)
                return the_locking_inset->getLyXText(bv, recursive);
@@ -2255,11 +2294,11 @@ FuncStatus InsetTabular::getStatus(string const & what) const
 {
        int action = LyXTabular::LAST_ACTION;
        FuncStatus status;
-       
+
        int i = 0;
        for (; tabularFeature[i].action != LyXTabular::LAST_ACTION; ++i) {
                string const tmp = tabularFeature[i].feature;
-               if (tmp == what.substr(0, tmp.length())) {                  
+               if (tmp == what.substr(0, tmp.length())) {
                        //if (!compare(tabularFeatures[i].feature.c_str(), what.c_str(),
                        //   tabularFeatures[i].feature.length())) {
                        action = tabularFeature[i].action;
@@ -2270,7 +2309,7 @@ FuncStatus InsetTabular::getStatus(string const & what) const
                status.clear();
                return status.unknown(true);
        }
-       
+
        string const argument = frontStrip(what.substr(tabularFeature[i].feature.length()));
 
        int sel_row_start;
@@ -2427,7 +2466,8 @@ bool InsetTabular::copySelection(BufferView * bv)
        int const rows = sel_row_end - sel_row_start + 1;
 
        delete paste_tabular;
-       paste_tabular = new LyXTabular(this, *tabular); // rows, columns);
+       paste_tabular = new LyXTabular(bv->buffer()->params,
+                                      this, *tabular); // rows, columns);
        for (int i = 0; i < sel_row_start; ++i)
                paste_tabular->DeleteRow(0);
        while (paste_tabular->rows() > rows)
@@ -2445,7 +2485,7 @@ bool InsetTabular::copySelection(BufferView * bv)
 
        ostringstream sstr;
        paste_tabular->ascii(bv->buffer(), sstr,
-                            (int)parOwner()->params().depth(), true, '\t');
+                            (int)parOwner()->params().depth(), true, '\t');
        bv->stuffClipboard(sstr.str().c_str());
        return true;
 }
@@ -2550,7 +2590,7 @@ void InsetTabular::getSelection(int & srow, int & erow,
 {
        int const start = hasSelection() ? sel_cell_start : actcell;
        int const end = hasSelection() ? sel_cell_end : actcell;
+
        srow = tabular->row_of_cell(start);
        erow = tabular->row_of_cell(end);
        if (srow > erow) {
@@ -2662,7 +2702,7 @@ string InsetTabular::selectNextWordInt(BufferView * bv, float & value) const
                bv->unlockInset(const_cast<InsetTabular *>(this));
                return string();
        }
-       
+
        // otherwise we have to lock the next inset and ask for it's selecttion
        UpdatableInset * inset =
                static_cast<UpdatableInset*>(tabular->GetCellInset(++actcell));
@@ -2690,7 +2730,7 @@ void InsetTabular::toggleSelection(BufferView * bv, bool kill_selection)
 
 
 bool InsetTabular::searchForward(BufferView * bv, string const & str,
-                                 bool cs, bool mw)
+                                bool cs, bool mw)
 {
        nodraw(true);
        if (the_locking_inset) {
@@ -2718,7 +2758,7 @@ bool InsetTabular::searchForward(BufferView * bv, string const & str,
 
 
 bool InsetTabular::searchBackward(BufferView * bv, string const & str,
-                               bool cs, bool mw)
+                              bool cs, bool mw)
 {
        nodraw(true);
        if (the_locking_inset) {
@@ -2749,7 +2789,10 @@ bool InsetTabular::insetAllowed(Inset::Code code) const
 {
        if (the_locking_inset)
                return the_locking_inset->insetAllowed(code);
-       return false;
+       // we return true here because if the inset is not locked someone
+       // wants to insert something in one of our insettexts and we generally
+       // allow to do so.
+       return true;
 }
 
 
@@ -2766,3 +2809,99 @@ bool InsetTabular::forceDefaultParagraphs(Inset const * in) const
        // if we're here there is really something strange going on!!!
        return false;
 }
+
+bool InsetTabular::insertAsciiString(BufferView * bv, string const & buf,
+                                    bool usePaste)
+{
+       if (buf.length() <= 0)
+               return true;
+       
+       int cols = 1;
+       int rows = 1;
+       int maxCols = 1;
+       string::size_type len = buf.length();
+       string::size_type p = 0;
+
+       while (p < len &&
+              ((p = buf.find_first_of("\t\n", p)) != string::npos))
+       {
+               switch (buf[p]) {
+               case '\t':
+                       ++cols;
+                       break;
+               case '\n':
+                       if ((p+1) < len)
+                               ++rows;
+                       maxCols = max(cols, maxCols);
+                       cols = 1;
+                       break;
+               }
+               ++p;
+       }
+       maxCols = max(cols, maxCols);
+       LyXTabular * loctab;
+       int cell = 0;
+       int ocol = 0;
+       int row = 0;
+       if (usePaste) {
+               delete paste_tabular;
+               paste_tabular = new LyXTabular(bv->buffer()->params,
+                                              this, rows, maxCols);
+               loctab = paste_tabular;
+               cols = 0;
+       } else {
+               loctab = tabular.get();
+               cell = actcell;
+               ocol = actcol;
+               row = actrow;
+       }
+       string::size_type op = 0;
+       int cells = loctab->GetNumberOfCells();
+       p = 0;
+       cols = ocol;
+       rows = loctab->rows();
+       int const columns = loctab->columns();
+       while ((cell < cells) && (p < len) && (row < rows) &&
+              (p = buf.find_first_of("\t\n", p)) != string::npos)
+       {
+               if (p >= len)
+                       break;
+               switch (buf[p]) {
+               case '\t':
+                       // we can only set this if we are not too far right
+                       if (cols < columns) {
+                               InsetText * ti = loctab->GetCellInset(cell);
+                               LyXFont const font = ti->getLyXText(bv)->
+                                       getFont(bv->buffer(), ti->paragraph(), 0);
+                               ti->setText(buf.substr(op, p-op), font);
+                               ++cols;
+                               ++cell;
+                       }
+                       break;
+               case '\n':
+                       // we can only set this if we are not too far right
+                       if (cols < columns) {
+                               InsetText * ti = loctab->GetCellInset(cell);
+                               LyXFont const font = ti->getLyXText(bv)->
+                                       getFont(bv->buffer(), ti->paragraph(), 0);
+                               ti->setText(buf.substr(op, p-op), font);
+                       }
+                       cols = ocol;
+                       ++row;
+                       if (row < rows)
+                               cell = loctab->GetCellNumber(row, cols);
+                       break;
+               }
+               ++p;
+               op = p;
+       }
+       // check for the last cell if there is no trailing '\n'
+       if ((cell < cells) && (op < len)) {
+               InsetText * ti = loctab->GetCellInset(cell);
+               LyXFont const font = ti->getLyXText(bv)->
+                       getFont(bv->buffer(), ti->paragraph(), 0);
+               ti->setText(buf.substr(op, len-op), font);
+       }
+
+       return true;
+}