]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Stupid bug fix.
[lyx.git] / src / insets / InsetTabular.cpp
index 516e8b97fef08e7c0fc91f7c936b82ef2d7583df..959fc257d81633c0574484a20f8f930cf8ede1fd 100644 (file)
 #include "frontends/Painter.h"
 #include "frontends/Selection.h"
 
-#include "support/lassert.h"
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/docstream.h"
 #include "support/FileName.h"
 #include "support/gettext.h"
+#include "support/lassert.h"
 #include "support/lstrings.h"
 
 #include <boost/scoped_ptr.hpp>
@@ -472,7 +472,7 @@ string const featureAsString(Tabular::Feature feature)
 /////////////////////////////////////////////////////////////////////
 
 
-Tabular::CellData::CellData(Buffer const & buf, Tabular const & table)
+Tabular::CellData::CellData(Buffer & buf)
        : cellno(0),
          width(0),
          multicolumn(Tabular::CELL_NORMAL),
@@ -484,7 +484,7 @@ Tabular::CellData::CellData(Buffer const & buf, Tabular const & table)
          right_line(false),
          usebox(BOX_NONE),
          rotate(false),
-         inset(new InsetTableCell(buf, this, &table))
+         inset(new InsetTableCell(buf))
 {
        inset->setBuffer(const_cast<Buffer &>(buf));
        inset->paragraphs().back().setLayout(buf.params().documentClass().emptyLayout());
@@ -507,17 +507,14 @@ Tabular::CellData::CellData(CellData const & cs)
          p_width(cs.p_width),
          inset(dynamic_cast<InsetTableCell *>(cs.inset->clone()))
 {
-       inset->setCellData(this);
 }
 
-
 Tabular::CellData & Tabular::CellData::operator=(CellData cs)
 {
        swap(cs);
        return *this;
 }
 
-
 void Tabular::CellData::swap(CellData & rhs)
 {
        std::swap(cellno, rhs.cellno);
@@ -567,20 +564,32 @@ Tabular::ltType::ltType()
 {}
 
 
-Tabular::Tabular(Buffer const & buffer, row_type rows_arg, col_type columns_arg)
+Tabular::Tabular(Buffer & buffer, row_type rows_arg, col_type columns_arg)
 {
        init(buffer, rows_arg, columns_arg);
 }
 
 
+void Tabular::setBuffer(Buffer & buffer)
+{
+       buffer_ = &buffer;
+       size_t row_count = row_info.size();
+       size_t column_count = column_info.size();
+       // set silly default lines
+       for (row_type i = 0; i < row_count; ++i)
+               for (col_type j = 0; j < column_count; ++j)
+                       cell_info[i][j].inset->setBuffer(*buffer_);
+}
+
+
 // activates all lines and sets all widths to 0
-void Tabular::init(Buffer const & buf, row_type rows_arg,
+void Tabular::init(Buffer & buf, row_type rows_arg,
                      col_type columns_arg)
 {
        buffer_ = &buf;
        row_info = row_vector(rows_arg);
        column_info = column_vector(columns_arg);
-       cell_info = cell_vvector(rows_arg, cell_vector(columns_arg, CellData(buf, *this)));
+       cell_info = cell_vvector(rows_arg, cell_vector(columns_arg, CellData(buf)));
        row_info.reserve(10);
        column_info.reserve(10);
        cell_info.reserve(100);
@@ -593,6 +602,7 @@ void Tabular::init(Buffer const & buf, row_type rows_arg,
        // set silly default lines
        for (row_type i = 0; i < row_count; ++i)
                for (col_type j = 0; j < column_count; ++j) {
+                       cell_info[i][j].inset->setBuffer(*buffer_);
                        cell_info[i][j].top_line = true;
                        cell_info[i][j].left_line = true;
                        cell_info[i][j].bottom_line = i == 0 || i == row_count - 1;
@@ -618,7 +628,7 @@ void Tabular::appendRow(idx_type const cell)
        for (row_type i = 0; i < nrows - 1; ++i)
                swap(cell_info[i], old[i]);
 
-       cell_info = cell_vvector(nrows, cell_vector(ncols, CellData(buffer(), *this)));
+       cell_info = cell_vvector(nrows, cell_vector(ncols, CellData(buffer())));
 
        for (row_type i = 0; i <= row; ++i)
                swap(cell_info[i], old[i]);
@@ -680,7 +690,7 @@ void Tabular::appendColumn(idx_type const cell)
 
        for (row_type r = 0; r < nrows; ++r) {
                cell_info[r].insert(cell_info[r].begin() + c + 1, 
-                       CellData(buffer(), *this));
+                       CellData(buffer()));
                if (cell_info[r][c].multicolumn == CELL_BEGIN_OF_MULTICOLUMN)
                        cell_info[r][c + 1].multicolumn = CELL_PART_OF_MULTICOLUMN;
                else
@@ -764,6 +774,7 @@ void Tabular::updateIndexes()
                                continue;
                        rowofcell[i] = row;
                        columnofcell[i] = column;
+                       setFixedWidth(row, column);
                        ++i;
                }
 }
@@ -957,6 +968,7 @@ namespace {
 void toggleFixedWidth(Cursor & cur, InsetTableCell * inset, bool fixedWidth)
 {
        inset->setAutoBreakRows(fixedWidth);
+       inset->toggleFixedWidth(fixedWidth);
        if (fixedWidth)
                return;
 
@@ -997,6 +1009,18 @@ void Tabular::setColumnPWidth(Cursor & cur, idx_type cell,
 }
 
 
+bool Tabular::setFixedWidth(row_type r, col_type c)
+{
+       if (!column_info[c].p_width.zero() ||
+                               (cell_info[r][c].multicolumn != CELL_NORMAL && 
+                               !cell_info[r][c].p_width.zero())) {
+               cell_info[r][c].inset->toggleFixedWidth(true);
+               return true;
+       }
+       return false;
+}
+
+
 bool Tabular::setMColumnPWidth(Cursor & cur, idx_type cell,
                Length const & width)
 {
@@ -1220,7 +1244,7 @@ Tabular::col_type Tabular::cellColumn(idx_type cell) const
        if (cell >= numberofcells)
                return column_info.size() - 1;
        if (cell == npos)
-               return 0;
+               return 0;       
        return columnofcell[cell];
 }
 
@@ -1407,9 +1431,11 @@ void Tabular::read(Lexer & lex)
                        getTokenValue(line, "rotate", cell_info[i][j].rotate);
                        getTokenValue(line, "usebox", cell_info[i][j].usebox);
                        getTokenValue(line, "width", cell_info[i][j].p_width);
+                       setFixedWidth(i,j);
                        getTokenValue(line, "special", cell_info[i][j].align_special);
                        l_getline(is, line);
                        if (prefixIs(line, "\\begin_inset")) {
+                               cell_info[i][j].inset->setBuffer(*buffer_);
                                cell_info[i][j].inset->read(lex);
                                l_getline(is, line);
                        }
@@ -1865,7 +1891,6 @@ int Tabular::TeXCellPreamble(odocstream & os, idx_type cell, bool & ismulticol)
                && leftLine(cellIndex(r, nextcol));
        bool coldouble = colright && nextcolleft;
        bool celldouble = rightLine(cell) && nextcellleft;
-       bool prevcellright = c > 0 && rightLine(cellIndex(r, c - 1));
        ismulticol = isMultiColumn(cell) 
                || (c == 0 && colleft != leftLine(cell))
                || ((colright || nextcolleft) && !rightLine(cell) && !nextcellleft)
@@ -1873,7 +1898,7 @@ int Tabular::TeXCellPreamble(odocstream & os, idx_type cell, bool & ismulticol)
                || (coldouble != celldouble);
        if (ismulticol) {
                os << "\\multicolumn{" << columnSpan(cell) << "}{";
-               if (leftLine(cell) || prevcellright)
+               if (c ==0 && leftLine(cell))
                        os << '|';
                if (!cellInfo(cell).align_special.empty()) {
                        os << cellInfo(cell).align_special;
@@ -2642,33 +2667,6 @@ void Tabular::setCellInset(row_type row, col_type column,
 {
        CellData & cd = cell_info[row][column];
        cd.inset = ins;
-       // reset the InsetTableCell's pointers
-       ins->setCellData(&cd);
-       ins->setTabular(this);
-}
-
-
-Tabular::idx_type Tabular::cellFromInset(Inset const * inset) const
-{
-       // is this inset part of the tabular?
-       if (!inset) {
-               lyxerr << "Error: this is not a cell of the tabular!" << endl;
-               LASSERT(false, /**/);
-       }
-
-       for (idx_type cell = 0, n = numberofcells; cell < n; ++cell)
-               if (cellInset(cell).get() == inset) {
-                       LYXERR(Debug::INSETTEXT, "Tabular::cellFromInset: "
-                               << "cell=" << cell);
-                       return cell;
-               }
-
-       // We should have found a cell at this point
-       lyxerr << "Tabular::cellFromInset: Cell of inset "
-               << inset << " not found!" << endl;
-       LASSERT(false, /**/);
-       // shut up compiler
-       return 0;
 }
 
 
@@ -2711,24 +2709,19 @@ Tabular::BoxType Tabular::useParbox(idx_type cell) const
 //
 /////////////////////////////////////////////////////////////////////
 
-InsetTableCell::InsetTableCell(Buffer const & buf,
-       Tabular::CellData const * cell, Tabular const * table)
-       : InsetText(buf), cell_data_(cell), table_(table)
+InsetTableCell::InsetTableCell(Buffer & buf)
+       : InsetText(buf), isFixedWidth(false)
 {}
 
 
-bool InsetTableCell::forceEmptyLayout(idx_type) const
+bool InsetTableCell::forcePlainLayout(idx_type) const
 {
-       LASSERT(table_, /**/);
-       LASSERT(cell_data_, /**/);
-       return table_->getPWidth(cell_data_->cellno).zero();
+       return !isFixedWidth;
 }
 
 bool InsetTableCell::allowParagraphCustomization(idx_type) const
 {
-       LASSERT(table_, /**/);
-       LASSERT(cell_data_, /**/);
-       return !table_->getPWidth(cell_data_->cellno).zero();
+       return isFixedWidth;
 }
 
 bool InsetTableCell::getStatus(Cursor & cur, FuncRequest const & cmd,
@@ -2737,7 +2730,7 @@ bool InsetTableCell::getStatus(Cursor & cur, FuncRequest const & cmd,
        bool enabled;
        switch (cmd.action) {
        case LFUN_LAYOUT:
-               enabled = !forceEmptyLayout();
+               enabled = !forcePlainLayout();
                break;
        case LFUN_LAYOUT_PARAGRAPH:
                enabled = allowParagraphCustomization();
@@ -2755,19 +2748,18 @@ bool InsetTableCell::getStatus(Cursor & cur, FuncRequest const & cmd,
 //
 /////////////////////////////////////////////////////////////////////
 
-InsetTabular::InsetTabular(Buffer const & buf, row_type rows,
+InsetTabular::InsetTabular(Buffer & buf, row_type rows,
                           col_type columns)
        : tabular(buf, max(rows, row_type(1)), max(columns, col_type(1))), scx_(0), 
        rowselect_(false), colselect_(false)
 {
-       setBuffer(const_cast<Buffer &>(buf)); // FIXME: remove later
+       setBuffer(buf); // FIXME: remove later
 }
 
 
 InsetTabular::InsetTabular(InsetTabular const & tab)
        : Inset(tab), tabular(tab.tabular),  scx_(0)
 {
-       setBuffer(const_cast<Buffer &>(tab.buffer())); // FIXME: remove later
 }
 
 
@@ -3456,8 +3448,8 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_FONT_FRAK:
        case LFUN_FONT_TYPEWRITER:
        case LFUN_FONT_SANS:
-       case LFUN_FONT_FREE_APPLY:
-       case LFUN_FONT_FREE_UPDATE:
+       case LFUN_TEXTSTYLE_APPLY:
+       case LFUN_TEXTSTYLE_UPDATE:
        case LFUN_FONT_SIZE:
        case LFUN_FONT_UNDERLINE:
        case LFUN_LANGUAGE:
@@ -4542,14 +4534,7 @@ bool InsetTabular::copySelection(Cursor & cur)
        while (paste_tabular->column_info.size() > columns)
                paste_tabular->deleteColumn(columns);
 
-       // We clear all the InsetTableCell pointers, since they
-       // might now become invalid and there is no point in having
-       // them point to temporary things in paste_tabular.
-       for (row_type i = 0; i < paste_tabular->row_info.size(); ++i)
-               for (col_type j = 0; j < paste_tabular->column_info.size(); ++j) {
-                       paste_tabular->cellInset(i,j)->setCellData(0);
-                       paste_tabular->cellInset(i,j)->setTabular(0);
-               }
+       paste_tabular->setBuffer(tabular.buffer());
 
        odocstringstream os;
        OutputParams const runparams(0);
@@ -4592,8 +4577,6 @@ bool InsetTabular::pasteClipboard(Cursor & cur)
                        }
                        shared_ptr<InsetTableCell> inset(
                                new InsetTableCell(*paste_tabular->cellInset(r1, c1)));
-                       // note that setCellInset will call InsetTableCell::setCellData()
-                       // and InsetTableCell::setTabular()
                        tabular.setCellInset(r2, c2, inset);
                        // FIXME: change tracking (MG)
                        inset->setChange(Change(cur.buffer().params().trackChanges ?
@@ -4698,7 +4681,7 @@ bool InsetTabular::allowParagraphCustomization(idx_type cell) const
 }
 
 
-bool InsetTabular::forceEmptyLayout(idx_type cell) const
+bool InsetTabular::forcePlainLayout(idx_type cell) const
 {
        return !tabular.getPWidth(cell).zero();
 }