X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftabular.C;h=a2cac72c8799463b0ed11de612856f8b1e98d8c2;hb=501f1dd61b6c0beb927151ecf331f78848261b59;hp=e5f64586a42a204cfc1676edefc8d9714ac650b3;hpb=53e8fb60009c249535022dc3e2130ae1c900922b;p=lyx.git diff --git a/src/tabular.C b/src/tabular.C index e5f64586a4..a2cac72c87 100644 --- a/src/tabular.C +++ b/src/tabular.C @@ -1,13 +1,13 @@ /* This file is part of - * ====================================================== - * + * ====================================================== + * * LyX, The Document Processor - * + * * Copyright 2000-2002 The LyX Team. * * @author: Jürgen Vigna * - * ====================================================== + * ====================================================== */ #include @@ -25,7 +25,7 @@ #include "layout.h" #include "buffer.h" #include "BufferView.h" -#include "Painter.h" +#include "frontends/Painter.h" #include "LaTeXFeatures.h" #include "insets/insettabular.h" #include "insets/insettext.h" @@ -35,11 +35,12 @@ #include "frontends/Alert.h" #include "gettext.h" #include "tabular_funcs.h" -#include "lyxtextclasslist.h" +#include "lyxlex.h" #include #include +using std::abs; using std::ostream; using std::istream; using std::getline; @@ -76,7 +77,7 @@ LyXTabular::cellstruct::cellstruct(BufferParams const & bg) } -LyXTabular::rowstruct::rowstruct() +LyXTabular::rowstruct::rowstruct() { top_line = true; bottom_line = false; @@ -90,7 +91,7 @@ LyXTabular::rowstruct::rowstruct() } -LyXTabular::columnstruct::columnstruct() +LyXTabular::columnstruct::columnstruct() { left_line = true; right_line = false; @@ -120,7 +121,7 @@ LyXTabular::LyXTabular(BufferParams const & bp, LyXTabular::LyXTabular(BufferParams const & bp, InsetTabular * inset, LyXTabular const & lt, - bool same_id) + bool same_id) { owner_ = inset; cur_cell = -1; @@ -196,9 +197,9 @@ LyXTabular * LyXTabular::clone(BufferParams const & bp, } -/* activates all lines and sets all widths to 0 */ +/* activates all lines and sets all widths to 0 */ void LyXTabular::Init(BufferParams const & bp, - int rows_arg, int columns_arg, LyXTabular const * lt) + int rows_arg, int columns_arg, LyXTabular const * lt) { rows_ = rows_arg; columns_ = columns_arg; @@ -227,7 +228,7 @@ void LyXTabular::Init(BufferParams const & bp, calculate_width_of_column(i); } column_info.back().right_line = true; - + calculate_width_of_tabular(); rowofcell = vector(); @@ -241,7 +242,7 @@ void LyXTabular::Init(BufferParams const & bp, void LyXTabular::AppendRow(BufferParams const & bp, int cell) { ++rows_; - + int row = row_of_cell(cell); row_vector::iterator rit = row_info.begin() + row; @@ -269,7 +270,9 @@ void LyXTabular::AppendRow(BufferParams const & bp, int cell) cell_info = c_info; ++row; for (int j = 0; j < columns_; ++j) { - cell_info[row][j].inset.clear(); + cell_info[row][j].inset.clear(false); + if (bp.tracking_changes) + cell_info[row][j].inset.markNew(true); } #endif Reinit(); @@ -279,7 +282,7 @@ void LyXTabular::AppendRow(BufferParams const & bp, int cell) void LyXTabular::DeleteRow(int row) { if (rows_ == 1) return; // Not allowed to delete last row - + row_info.erase(row_info.begin() + row); //&row_info[row]); cell_info.erase(cell_info.begin() + row); //&cell_info[row]); --rows_; @@ -290,7 +293,7 @@ void LyXTabular::DeleteRow(int row) void LyXTabular::AppendColumn(BufferParams const & bp, int cell) { ++columns_; - + cell_vvector c_info = cell_vvector(rows_, cell_vector(columns_, cellstruct(bp))); int const column = column_of_cell(cell); @@ -320,8 +323,9 @@ void LyXTabular::AppendColumn(BufferParams const & bp, int cell) cell_info = c_info; //++column; for (int i = 0; i < rows_; ++i) { - //cell_info[i][column].inset.clear(); - cell_info[i][column + 1].inset.clear(); + cell_info[i][column + 1].inset.clear(false); + if (bp.tracking_changes) + cell_info[i][column + 1].inset.markNew(true); } Reinit(); } @@ -333,7 +337,7 @@ void LyXTabular::DeleteColumn(int column) //if (!(columns_ - 1)) //return; if (columns_ == 1) return; // Not allowed to delete last column - + column_info.erase(column_info.begin() + column); for (int i = 0; i < rows_; ++i) { cell_info[i].erase(cell_info[i].begin() + column); @@ -359,7 +363,7 @@ void LyXTabular::Reinit(bool reset_widths) } } } - + for (int i = 0; i < columns_; ++i) { calculate_width_of_column(i); } @@ -438,11 +442,11 @@ int LyXTabular::NumberOfCellsInRow(int cell) const } -/* returns 1 if there is a topline, returns 0 if not */ +/* returns 1 if there is a topline, returns 0 if not */ bool LyXTabular::TopLine(int cell, bool onlycolumn) const { int const row = row_of_cell(cell); - + if (!onlycolumn && IsMultiColumn(cell)) return cellinfo_of_cell(cell)->top_line; return row_info[row].top_line; @@ -471,7 +475,7 @@ bool LyXTabular::LeftLine(int cell, bool onlycolumn) const #ifdef SPECIAL_COLUM_HANDLING if (cellinfo_of_cell(cell)->align_special.empty()) return cellinfo_of_cell(cell)->left_line; - return prefixIs(frontStrip(cellinfo_of_cell(cell)->align_special), "|"); + return prefixIs(ltrim(cellinfo_of_cell(cell)->align_special), "|"); #else return cellinfo_of_cell(cell)->left_line; #endif @@ -479,7 +483,7 @@ bool LyXTabular::LeftLine(int cell, bool onlycolumn) const #ifdef SPECIAL_COLUM_HANDLING if (column_info[column_of_cell(cell)].align_special.empty()) return column_info[column_of_cell(cell)].left_line; - return prefixIs(frontStrip(column_info[column_of_cell(cell)].align_special), "|"); + return prefixIs(ltrim(column_info[column_of_cell(cell)].align_special), "|"); #else return column_info[column_of_cell(cell)].left_line; #endif @@ -494,7 +498,7 @@ bool LyXTabular::RightLine(int cell, bool onlycolumn) const #ifdef SPECIAL_COLUM_HANDLING if (cellinfo_of_cell(cell)->align_special.empty()) return cellinfo_of_cell(cell)->right_line; - return suffixIs(strip(cellinfo_of_cell(cell)->align_special), "|"); + return suffixIs(rtrim(cellinfo_of_cell(cell)->align_special), "|"); #else return cellinfo_of_cell(cell)->right_line; #endif @@ -502,7 +506,7 @@ bool LyXTabular::RightLine(int cell, bool onlycolumn) const #ifdef SPECIAL_COLUM_HANDLING if (column_info[column_of_cell(cell)].align_special.empty()) return column_info[right_column_of_cell(cell)].right_line; - return suffixIs(strip(column_info[column_of_cell(cell)].align_special), "|"); + return suffixIs(rtrim(column_info[column_of_cell(cell)].align_special), "|"); #else return column_info[right_column_of_cell(cell)].right_line; #endif @@ -602,7 +606,7 @@ int LyXTabular::GetAdditionalWidth(int cell) const } -// returns the maximum over all rows +// returns the maximum over all rows int LyXTabular::GetWidthOfColumn(int cell) const { int const column1 = column_of_cell(cell); @@ -621,17 +625,17 @@ int LyXTabular::GetWidthOfTabular() const } -/* returns 1 if a complete update is necessary, otherwise 0 */ +/* returns 1 if a complete update is necessary, otherwise 0 */ bool LyXTabular::SetWidthOfMulticolCell(int cell, int new_width) { if (!IsMultiColumn(cell)) return false; - + int const row = row_of_cell(cell); int const column1 = column_of_cell(cell); int const column2 = right_column_of_cell(cell); int const old_val = cell_info[row][column2].width_of_cell; - + // first set columns to 0 so we can calculate the right width for (int i = column1; i <= column2; ++i) { cell_info[row][i].width_of_cell = 0; @@ -675,13 +679,13 @@ void LyXTabular::recalculateMulticolumnsOfColumn(int column) { int const cellno = cell_info[row][column].cellno; SetWidthOfMulticolCell(cellno, - GetWidthOfCell(cellno)-(2 * WIDTH_OF_LINE)); + GetWidthOfCell(cellno)-(2 * WIDTH_OF_LINE)); } } } -/* returns 1 if a complete update is necessary, otherwise 0 */ +/* returns 1 if a complete update is necessary, otherwise 0 */ bool LyXTabular::SetWidthOfCell(int cell, int new_width) { int const row = row_of_cell(cell); @@ -750,8 +754,9 @@ bool LyXTabular::SetColumnPWidth(int cell, LyXLength const & width) int const j = column_of_cell(cell); column_info[j].p_width = width; - if (flag) // do this only if there is a width - SetAlignment(cell, LYX_ALIGN_LEFT); + // This should not ne necessary anymore + // if (flag) // do this only if there is a width + // SetAlignment(cell, LYX_ALIGN_LEFT); for (int i = 0; i < rows_; ++i) { int c = GetCellNumber(i, j); flag = !GetPWidth(c).zero(); // because of multicolumns! @@ -775,7 +780,7 @@ bool LyXTabular::SetMColumnPWidth(int cell, LyXLength const & width) bool LyXTabular::SetAlignSpecial(int cell, string const & special, - LyXTabular::Feature what) + LyXTabular::Feature what) { if (what == SET_SPECIAL_MULTI) cellinfo_of_cell(cell)->align_special = special; @@ -902,7 +907,7 @@ int LyXTabular::GetWidthOfCell(int cell) const int LyXTabular::GetBeginningOfTextInCell(int cell) const { int x = 0; - + switch (GetAlignment(cell)) { case LYX_ALIGN_CENTER: x += (GetWidthOfColumn(cell) - GetWidthOfCell(cell)) / 2; @@ -911,10 +916,10 @@ int LyXTabular::GetBeginningOfTextInCell(int cell) const x += GetWidthOfColumn(cell) - GetWidthOfCell(cell); // + GetAdditionalWidth(cell); break; - default: /* LYX_ALIGN_LEFT: nothing :-) */ + default: /* LYX_ALIGN_LEFT: nothing :-) */ break; } - + // the LaTeX Way :-( x += WIDTH_OF_LINE; return x; @@ -952,7 +957,7 @@ bool LyXTabular::calculate_width_of_column(int column) { int const old_column_width = column_info[column].width_of_column; int maximum = 0; - + for (int i = 0; i < rows_; ++i) { maximum = max(cell_info[i][column].width_of_cell, maximum); } @@ -1204,8 +1209,8 @@ void LyXTabular::ReadNew(Buffer const * buf, istream & is, Init(buf->params, rows_arg, columns_arg); l_getline(is, line); if (!prefixIs(line, " got" << - line << ")" << endl; + lyxerr << "Wrong tabular format (expected got" + << line << ')' << endl; return; } getTokenValue(line, "rotate", rotate); @@ -1244,8 +1249,8 @@ void LyXTabular::ReadNew(Buffer const * buf, istream & is, for (int j = 0; j < columns_; ++j) { l_getline(is,line); if (!prefixIs(line," got" << - line << ")" << endl; + lyxerr << "Wrong tabular format (expected got" + << line << ')' << endl; return; } getTokenValue(line, "alignment", column_info[j].alignment); @@ -1259,8 +1264,8 @@ void LyXTabular::ReadNew(Buffer const * buf, istream & is, for (int i = 0; i < rows_; ++i) { l_getline(is, line); if (!prefixIs(line, " got" << - line << ")" << endl; + lyxerr << "Wrong tabular format (expected got" + << line << ')' << endl; return; } getTokenValue(line, "topline", row_info[i].top_line); @@ -1273,8 +1278,8 @@ void LyXTabular::ReadNew(Buffer const * buf, istream & is, for (int j = 0; j < columns_; ++j) { l_getline(is, line); if (!prefixIs(line, " got" << - line << ")" << endl; + lyxerr << "Wrong tabular format (expected got" + << line << ')' << endl; return; } getTokenValue(line, "multicolumn", cell_info[i][j].multicolumn); @@ -1294,15 +1299,15 @@ void LyXTabular::ReadNew(Buffer const * buf, istream & is, l_getline(is, line); } if (!prefixIs(line, "")) { - lyxerr << "Wrong tabular format (expected got" << - line << ")" << endl; + lyxerr << "Wrong tabular format (expected got" + << line << ')' << endl; return; } } l_getline(is, line); if (!prefixIs(line, "")) { - lyxerr << "Wrong tabular format (expected got" << - line << ")" << endl; + lyxerr << "Wrong tabular format (expected got" + << line << ')' << endl; return; } } @@ -1314,7 +1319,7 @@ void LyXTabular::ReadNew(Buffer const * buf, istream & is, void LyXTabular::OldFormatRead(BufferParams const & bp, - LyXLex & lex, string const & fl) + LyXLex & lex, string const & fl) { int version; int i; @@ -1330,7 +1335,7 @@ void LyXTabular::OldFormatRead(BufferParams const & bp, int e = 0; int f = 0; int g = 0; - + istream & is = lex.getStream(); string s(fl); if (s.length() > 8) @@ -1395,7 +1400,7 @@ void LyXTabular::OldFormatRead(BufferParams const & bp, #else // ignore is buggy but we will use it later (Lgb) is.ignore(); // skip '"' -#endif +#endif getline(is, s1, '"'); #if 1 is >> ch; // skip '"' @@ -1448,7 +1453,8 @@ void LyXTabular::OldFormatRead(BufferParams const & bp, Paragraph * par = new Paragraph; Paragraph * return_par = 0; - par->layout(textclasslist[bp.textclass].defaultLayoutName()); + par->layout(bp.getLyXTextClass().defaultLayout()); + string tmptok; int pos = 0; Paragraph::depth_type depth = 0; @@ -1461,14 +1467,11 @@ void LyXTabular::OldFormatRead(BufferParams const & bp, if (token.empty()) continue; if (token == "\\layout" - || token == "\\end_float" - || token == "\\end_deeper") { + || token == "\\end_float" // this should not exist anymore + || token == "\\end_inset" // as it is substituted by this + || token == "\\end_deeper") + { lex.pushToken(token); -#ifndef NO_COMPABILITY - // Here we need to insert the inset_ert_contents into the last - // cell of the tabular. - owner_->bufferOwner()->insertErtContents(par, pos); -#endif break; } if (owner_->bufferOwner()->parseSingleLyXformat2Token(lex, par, @@ -1543,15 +1546,25 @@ LyXTabular::cellstruct * LyXTabular::cellinfo_of_cell(int cell) const } -void LyXTabular::SetMultiColumn(int cell, int number) +void LyXTabular::SetMultiColumn(Buffer const * buffer, int cell, int number) { cellinfo_of_cell(cell)->multicolumn = CELL_BEGIN_OF_MULTICOLUMN; cellinfo_of_cell(cell)->alignment = column_info[column_of_cell(cell)].alignment; cellinfo_of_cell(cell)->top_line = row_info[row_of_cell(cell)].top_line; cellinfo_of_cell(cell)->bottom_line = row_info[row_of_cell(cell)].bottom_line; + cellinfo_of_cell(cell)->right_line = column_info[column_of_cell(cell+number-1)].right_line; +#if 1 + for (int i = 1; i < number; ++i) { + cellinfo_of_cell(cell+i)->multicolumn = CELL_PART_OF_MULTICOLUMN; + cellinfo_of_cell(cell)->inset.appendParagraphs(buffer->params, + cellinfo_of_cell(cell+i)->inset.paragraph()); + cellinfo_of_cell(cell+i)->inset.clear(false); + } +#else for (number--; number > 0; --number) { cellinfo_of_cell(cell+number)->multicolumn = CELL_PART_OF_MULTICOLUMN; } +#endif set_row_column_number_info(); } @@ -1576,9 +1589,9 @@ int LyXTabular::UnsetMultiColumn(int cell) { int const row = row_of_cell(cell); int column = column_of_cell(cell); - + int result = 0; - + if (cell_info[row][column].multicolumn == CELL_BEGIN_OF_MULTICOLUMN) { cell_info[row][column].multicolumn = CELL_NORMAL; ++column; @@ -1978,7 +1991,7 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const os << cellinfo_of_cell(cell)->align_special << "}{"; } else { if (LeftLine(cell) && - (IsFirstCellInRow(cell) || + (IsFirstCellInRow(cell) || (!IsMultiColumn(cell-1) && !LeftLine(cell, true) && !RightLine(cell-1, true)))) { @@ -1987,16 +2000,18 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const if (!GetPWidth(cell).zero()) { switch (GetVAlignment(cell)) { case LYX_VALIGN_TOP: - os << "p"; + os << 'p'; break; case LYX_VALIGN_CENTER: - os << "m"; + os << 'm'; break; case LYX_VALIGN_BOTTOM: - os << "b"; + os << 'b'; break; } - os << "{" << GetPWidth(cell).asLatexString() << '}'; + os << '{' + << GetPWidth(cell).asLatexString() + << '}'; } else { switch (GetAlignment(cell)) { case LYX_ALIGN_LEFT: @@ -2022,13 +2037,13 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const os << "\\parbox["; switch (GetVAlignment(cell)) { case LYX_VALIGN_TOP: - os << "t"; + os << 't'; break; case LYX_VALIGN_CENTER: - os << "c"; + os << 'c'; break; case LYX_VALIGN_BOTTOM: - os << "b"; + os << 'b'; break; } os << "]{" << GetPWidth(cell).asLatexString() << "}{"; @@ -2036,13 +2051,13 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const os << "\\begin{minipage}["; switch (GetVAlignment(cell)) { case LYX_VALIGN_TOP: - os << "t"; + os << 't'; break; case LYX_VALIGN_CENTER: - os << "m"; + os << 'm'; break; case LYX_VALIGN_BOTTOM: - os << "b"; + os << 'b'; break; } os << "]{" << GetPWidth(cell).asLatexString() << "}\n"; @@ -2058,7 +2073,7 @@ int LyXTabular::TeXCellPostamble(ostream & os, int cell) const // usual cells if (GetUsebox(cell) == BOX_PARBOX) - os << "}"; + os << '}'; else if (GetUsebox(cell) == BOX_MINIPAGE) { os << "%\n\\end{minipage}"; ret += 2; @@ -2075,7 +2090,7 @@ int LyXTabular::TeXCellPostamble(ostream & os, int cell) const int LyXTabular::TeXLongtableHeaderFooter(ostream & os, Buffer const * buf, - bool fragile, bool fp) const + bool fragile, bool fp) const { if (!is_long_tabular) return 0; @@ -2175,7 +2190,7 @@ bool LyXTabular::isValidRow(int const row) const int LyXTabular::TeXRow(ostream & os, int const i, Buffer const * buf, - bool fragile, bool fp) const + bool fragile, bool fp) const { int ret = 0; int cell = GetCellNumber(i, 0); @@ -2188,13 +2203,13 @@ int LyXTabular::TeXRow(ostream & os, int const i, Buffer const * buf, InsetText * inset = GetCellInset(cell); bool rtl = inset->paragraph()->isRightToLeftPar(buf->params) && - inset->paragraph()->size() > 0 && GetPWidth(cell).zero(); + !inset->paragraph()->empty() && GetPWidth(cell).zero(); if (rtl) os << "\\R{"; ret += inset->latex(buf, os, fragile, fp); if (rtl) - os << "}"; + os << '}'; ret += TeXCellPostamble(os, cell); if (!IsLastCellInRow(cell)) { // not last cell in row @@ -2203,7 +2218,7 @@ int LyXTabular::TeXRow(ostream & os, int const i, Buffer const * buf, } ++cell; } - os << "\\\\\n"; + os << "\\tabularnewline\n"; ++ret; ret += TeXBottomHLine(os, i); return ret; @@ -2230,22 +2245,39 @@ int LyXTabular::latex(Buffer const * buf, for (int i = 0; i < columns_; ++i) { if (!column_info[i].align_special.empty()) { os << column_info[i].align_special; - } else { + } else { if (column_info[i].left_line) os << '|'; if (!column_info[i].p_width.zero()) { + switch (column_info[i].alignment) { + case LYX_ALIGN_LEFT: + os << ">{\\raggedright}"; + break; + case LYX_ALIGN_RIGHT: + os << ">{\\raggedleft}"; + break; + case LYX_ALIGN_CENTER: + os << ">{\\centering}"; + break; + case LYX_ALIGN_NONE: + case LYX_ALIGN_BLOCK: + case LYX_ALIGN_LAYOUT: + case LYX_ALIGN_SPECIAL: + break; + } + switch (column_info[i].valignment) { case LYX_VALIGN_TOP: - os << "p"; + os << 'p'; break; case LYX_VALIGN_CENTER: - os << "m"; + os << 'm'; break; case LYX_VALIGN_BOTTOM: - os << "b"; + os << 'b'; break; } - os << "{" + os << '{' << column_info[i].p_width.asLatexString() << '}'; } else { @@ -2254,8 +2286,8 @@ int LyXTabular::latex(Buffer const * buf, os << 'l'; break; case LYX_ALIGN_RIGHT: - os << 'r'; - break; + os << 'r'; + break; default: os << 'c'; break; @@ -2269,7 +2301,7 @@ int LyXTabular::latex(Buffer const * buf, ++ret; ret += TeXLongtableHeaderFooter(os, buf, fragile, fp); - + //+--------------------------------------------------------------------- //+ the single row and columns (cells) + //+--------------------------------------------------------------------- @@ -2305,7 +2337,7 @@ int LyXTabular::docbookRow(Buffer const * buf, ostream & os, int row) const { int ret = 0; int cell = GetFirstCellInRow(row); - + os << "\n"; for (int j = 0; j < columns_; ++j) { if (IsPartOfMultiColumn(row, j)) @@ -2335,24 +2367,25 @@ int LyXTabular::docbookRow(Buffer const * buf, ostream & os, int row) const case LYX_VALIGN_CENTER: os << "middle"; } - os << "\""; + os << '"'; if (IsMultiColumn(cell)) { os << " namest=\"col" << j << "\" "; - os << "nameend=\"col" << j + cells_in_multicolumn(cell) - 1<< "\""; + os << "nameend=\"col" << j + cells_in_multicolumn(cell) - 1<< '"'; } - os << ">"; - ret += GetCellInset(cell)->docbook(buf, os); + os << '>'; + ret += GetCellInset(cell)->docbook(buf, os, true); os << "\n"; ++cell; } os << "\n"; return ret; -} +} -int LyXTabular::docBook(Buffer const * buf, ostream & os) const +int LyXTabular::docbook(Buffer const * buf, ostream & os, + bool /*mixcont*/) const { int ret = 0; @@ -2362,7 +2395,7 @@ int LyXTabular::docBook(Buffer const * buf, ostream & os) const os << "\n"; - + for (int i = 0; i < columns_; ++i) { os << "\n"; + os << "\n"; ++ret; } // output footer info @@ -2436,7 +2469,7 @@ int LyXTabular::docBook(Buffer const * buf, ostream & os) const // ASCII export function and helpers //-- int LyXTabular::asciiTopHLine(ostream & os, int row, - vector const & clen) const + vector const & clen) const { int const fcell = GetFirstCellInRow(row); int const n = NumberOfCellsInRow(fcell) + fcell; @@ -2483,7 +2516,7 @@ int LyXTabular::asciiTopHLine(ostream & os, int row, int LyXTabular::asciiBottomHLine(ostream & os, int row, - vector const & clen) const + vector const & clen) const { int const fcell = GetFirstCellInRow(row); int const n = NumberOfCellsInRow(fcell) + fcell; @@ -2530,9 +2563,9 @@ int LyXTabular::asciiBottomHLine(ostream & os, int row, int LyXTabular::asciiPrintCell(Buffer const * buf, ostream & os, - int cell, int row, int column, - vector const & clen, - bool onlydata) const + int cell, int row, int column, + vector const & clen, + bool onlydata) const { ostringstream sstr; int ret = GetCellInset(cell)->ascii(buf, sstr, 0); @@ -2541,7 +2574,7 @@ int LyXTabular::asciiPrintCell(Buffer const * buf, ostream & os, os << sstr.str(); return ret; } - + if (LeftLine(cell)) os << "| "; else @@ -2568,11 +2601,9 @@ int LyXTabular::asciiPrintCell(Buffer const * buf, ostream & os, break; } - for (unsigned int i = 0; i < len1; ++i) - os << " "; - os << sstr.str(); - for (unsigned int i = 0; i < len2; ++i) - os << " "; + os << string(len1, ' ') + << sstr.str() + << string(len2, ' '); if (RightLine(cell)) os << " |"; else @@ -2678,7 +2709,7 @@ int LyXTabular::GetCellFromInset(Inset const * inset, int maybe_cell) const << "this is not a cell of the tabular!" << endl; return -1; } - + const int save_cur_cell = cur_cell; int cell = cur_cell; if (GetCellInset(cell) != inset) { @@ -2687,7 +2718,7 @@ int LyXTabular::GetCellFromInset(Inset const * inset, int maybe_cell) const cell = -1; } } - + if (cell == -1) { for (cell = GetNumberOfCells(); cell >= 0; --cell) { if (GetCellInset(cell) == inset) @@ -2696,7 +2727,7 @@ int LyXTabular::GetCellFromInset(Inset const * inset, int maybe_cell) const lyxerr[Debug::INSETTEXT] << "LyXTabular::GetCellFromInset: " << "cell=" << cell - << ", cur_cell=" << save_cur_cell + << ", cur_cell=" << save_cur_cell << ", maybe_cell=" << maybe_cell << endl; // We should have found a cell at this point @@ -2705,19 +2736,22 @@ int LyXTabular::GetCellFromInset(Inset const * inset, int maybe_cell) const << "Cell not found!" << endl; } } - + return cell; } void LyXTabular::Validate(LaTeXFeatures & features) const { + features.require("NeedTabularnewline"); if (IsLongTabular()) features.require("longtable"); if (NeedRotating()) features.require("rotating"); for (int cell = 0; cell < numberofcells; ++cell) { - if (GetVAlignment(cell) != LYX_VALIGN_TOP) + if ( (GetVAlignment(cell) != LYX_VALIGN_TOP) || + ( !(GetPWidth(cell).zero())&&!(IsMultiColumn(cell)) ) + ) features.require("array"); GetCellInset(cell)->validate(features); } @@ -2737,7 +2771,7 @@ vector const LyXTabular::getLabelList() const return label_list; } - + LyXTabular::BoxType LyXTabular::UseParbox(int cell) const { Paragraph * par = GetCellInset(cell)->paragraph();