*
* LyX, The Document Processor
*
- * Copyright 2000-2001 The LyX Team.
+ * Copyright 2000-2002 The LyX Team.
*
* @author: Jürgen Vigna
*
bool top = true;
bool bottom = true;
- for (int column = 0; column < columns_ - 1 && bottom; ++column) {
+ for (int column = 0; column < columns_ && bottom; ++column) {
switch (cell_info[row - 1][column].multicolumn) {
case LyXTabular::CELL_BEGIN_OF_MULTICOLUMN:
bottom = cell_info[row - 1][column].bottom_line;
bottom = row_info[row - 1].bottom_line;
}
}
- for (int column = 0; column < columns_ - 1 && top; ++column) {
- switch (cell_info[row][column].multicolumn){
+ for (int column = 0; column < columns_ && top; ++column) {
+ switch (cell_info[row][column].multicolumn) {
case LyXTabular::CELL_BEGIN_OF_MULTICOLUMN:
top = cell_info[row][column].top_line;
break;
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;
}
// set the width to MAX_WIDTH until width > 0
int width = (new_width + 2 * WIDTH_OF_LINE);
-
int i = column1;
for (; i < column2 && width > column_info[i].width_of_column; ++i) {
cell_info[row][i].width_of_cell = column_info[i].width_of_column;
if (width > 0) {
cell_info[row][i].width_of_cell = width;
}
+ if (old_val != cell_info[row][column2].width_of_cell) {
+ // in this case we have to recalculate all multicolumn cells which
+ // have this column as one of theirs but not as last one
+ recalculateMulticolumnsOfColumn(i);
+ }
return true;
}
-void LyXTabular::recalculateMulticolCells(int cell, int new_width)
+void LyXTabular::recalculateMulticolumnsOfColumn(int column)
{
- int const row = row_of_cell(cell);
- int const column1 = column_of_cell(cell);
- int const column2 = right_column_of_cell(cell);
-
- // first set columns to 0 so we can calculate the right width
- int i = column1;
- for (; i <= column2; ++i)
- cell_info[row][i].width_of_cell = 0;
- for (i = cell + 1; (i < numberofcells) && (!IsMultiColumn(i)); ++i)
- ;
- if (i < numberofcells)
- recalculateMulticolCells(i, GetWidthOfCell(i) - (2 * WIDTH_OF_LINE));
- SetWidthOfMulticolCell(cell, new_width);
+ // the last column does not have to be recalculated because all
+ // multicolumns will have here there last multicolumn cell which
+ // always will have the whole rest of the width of the cell.
+ if (column > (columns_ - 2))
+ return;
+ for(int row = 0; row < rows_; ++row) {
+ int mc = cell_info[row][column].multicolumn;
+ int nmc = cell_info[row][column+1].multicolumn;
+ // we only have to update multicolumns which do not have this
+ // column as their last column!
+ if (mc == CELL_BEGIN_OF_MULTICOLUMN ||
+ ((mc == CELL_PART_OF_MULTICOLUMN) &&
+ (nmc == CELL_PART_OF_MULTICOLUMN)))
+ {
+ int const cellno = cell_info[row][column].cellno;
+ SetWidthOfMulticolCell(cellno,
+ GetWidthOfCell(cellno)-(2 * WIDTH_OF_LINE));
+ }
+ }
}
width = (new_width + 2*WIDTH_OF_LINE + add_width);
cell_info[row][column1].width_of_cell = width;
tmp = calculate_width_of_column_NMC(column1);
+ if (tmp)
+ recalculateMulticolumnsOfColumn(column1);
}
if (tmp) {
- int i = 0;
- for (; i<columns_; ++i)
- calculate_width_of_column_NMC(i);
- for (i = 0; (i < numberofcells) && !IsMultiColumn(i); ++i)
- ;
- if (i < numberofcells)
- recalculateMulticolCells(i, GetWidthOfCell(i)-(2 * WIDTH_OF_LINE));
- for (i = 0; i < columns_; ++i)
+ for (int i = 0; i < columns_; ++i)
calculate_width_of_column(i);
calculate_width_of_tabular();
return true;
{
int x = 0;
- switch (GetAlignment(cell)){
+ switch (GetAlignment(cell)) {
case LYX_ALIGN_CENTER:
x += (GetWidthOfColumn(cell) - GetWidthOfCell(cell)) / 2;
break;
<< ">\n";
// global longtable options
os << "<features"
- << write_attribute("rotate", tostr(rotate))
- << write_attribute("islongtable", tostr(is_long_tabular))
- << write_attribute("firstHeadTopDL", tostr(endfirsthead.topDL))
- << write_attribute("firstHeadBottomDL", tostr(endfirsthead.bottomDL))
- << write_attribute("firstHeadEmpty", tostr(endfirsthead.empty))
- << write_attribute("headTopDL", tostr(endhead.topDL))
- << write_attribute("headBottomDL", tostr(endhead.bottomDL))
- << write_attribute("footTopDL", tostr(endfoot.topDL))
- << write_attribute("footBottomDL", tostr(endfoot.bottomDL))
- << write_attribute("lastFootTopDL", tostr(endlastfoot.topDL))
- << write_attribute("lastFootBottomDL", tostr(endlastfoot.bottomDL))
- << write_attribute("lastFootEmpty", tostr(endlastfoot.empty))
+ << write_attribute("rotate", rotate)
+ << write_attribute("islongtable", is_long_tabular)
+ << write_attribute("firstHeadTopDL", endfirsthead.topDL)
+ << write_attribute("firstHeadBottomDL", endfirsthead.bottomDL)
+ << write_attribute("firstHeadEmpty", endfirsthead.empty)
+ << write_attribute("headTopDL", endhead.topDL)
+ << write_attribute("headBottomDL", endhead.bottomDL)
+ << write_attribute("footTopDL", endfoot.topDL)
+ << write_attribute("footBottomDL", endfoot.bottomDL)
+ << write_attribute("lastFootTopDL", endlastfoot.topDL)
+ << write_attribute("lastFootBottomDL", endlastfoot.bottomDL)
+ << write_attribute("lastFootEmpty", endlastfoot.empty)
<< ">\n";
for (int j = 0; j < columns_; ++j) {
os << "<column"
- << write_attribute("alignment", tostr(column_info[j].alignment))
- << write_attribute("valignment", tostr(column_info[j].valignment))
- << write_attribute("leftline", tostr(column_info[j].left_line))
- << write_attribute("rightline", tostr(column_info[j].right_line))
+ << write_attribute("alignment", column_info[j].alignment)
+ << write_attribute("valignment", column_info[j].valignment)
+ << write_attribute("leftline", column_info[j].left_line)
+ << write_attribute("rightline", column_info[j].right_line)
<< write_attribute("width", column_info[j].p_width.asString())
<< write_attribute("special", column_info[j].align_special)
<< ">\n";
}
for (int i = 0; i < rows_; ++i) {
os << "<row"
- << write_attribute("topline", tostr(row_info[i].top_line))
- << write_attribute("bottomline", tostr(row_info[i].bottom_line))
- << write_attribute("endhead", tostr(row_info[i].endhead))
- << write_attribute("endfirsthead", tostr(row_info[i].endfirsthead))
- << write_attribute("endfoot", tostr(row_info[i].endfoot))
- << write_attribute("endlastfoot", tostr(row_info[i].endlastfoot))
- << write_attribute("newpage", tostr(row_info[i].newpage))
+ << write_attribute("topline", row_info[i].top_line)
+ << write_attribute("bottomline", row_info[i].bottom_line)
+ << write_attribute("endhead", row_info[i].endhead)
+ << write_attribute("endfirsthead", row_info[i].endfirsthead)
+ << write_attribute("endfoot", row_info[i].endfoot)
+ << write_attribute("endlastfoot", row_info[i].endlastfoot)
+ << write_attribute("newpage", row_info[i].newpage)
<< ">\n";
for (int j = 0; j < columns_; ++j) {
os << "<cell"
<< write_attribute("multicolumn", cell_info[i][j].multicolumn)
- << write_attribute("alignment", tostr(cell_info[i][j].alignment))
- << write_attribute("valignment", tostr(cell_info[i][j].valignment))
- << write_attribute("topline", tostr(cell_info[i][j].top_line))
- << write_attribute("bottomline", tostr(cell_info[i][j].bottom_line))
- << write_attribute("leftline", tostr(cell_info[i][j].left_line))
- << write_attribute("rightline", tostr(cell_info[i][j].right_line))
- << write_attribute("rotate", tostr(cell_info[i][j].rotate))
- << write_attribute("usebox", tostr(cell_info[i][j].usebox))
+ << write_attribute("alignment", cell_info[i][j].alignment)
+ << write_attribute("valignment", cell_info[i][j].valignment)
+ << write_attribute("topline", cell_info[i][j].top_line)
+ << write_attribute("bottomline", cell_info[i][j].bottom_line)
+ << write_attribute("leftline", cell_info[i][j].left_line)
+ << write_attribute("rightline", cell_info[i][j].right_line)
+ << write_attribute("rotate", cell_info[i][j].rotate)
+ << write_attribute("usebox", cell_info[i][j].usebox)
<< write_attribute("width", cell_info[i][j].p_width)
<< write_attribute("special", cell_info[i][j].align_special)
<< ">\n";
#ifndef NO_COMPABILITY
// Here we need to insert the inset_ert_contents into the last
// cell of the tabular.
- owner_->bufferOwner()->insertErtContents(par, pos, font);
+ owner_->bufferOwner()->insertErtContents(par, pos);
#endif
break;
}
if (TopLine(i))
++tmp;
}
- if (tmp == (n - fcell)){
+ if (tmp == (n - fcell)) {
os << "\\hline ";
} else if (tmp) {
for (int i = fcell; i < n; ++i) {
if (BottomLine(i))
++tmp;
}
- if (tmp == (n-fcell)){
+ if (tmp == (n - fcell)) {
os << "\\hline";
} else if (tmp) {
for (int i = fcell; i < n; ++i) {
os << "%\n\\end{minipage}";
ret += 2;
}
- if (IsMultiColumn(cell)){
+ if (IsMultiColumn(cell)) {
os << '}';
}
if (GetRotateCell(cell)) {
//+ Long Tabular case +
//+---------------------------------------------------------------------
-#warning Jose please have a look here I changed the longtable header/footer
-#warning ---- options so I had to disable the docbook code (Jug 20011219)
-#if 0
- if ( IsLongTabular() ) {
- // Header
- if(endhead.row || endfirsthead.row ) {
- os << "<thead>\n";
- if( endfirsthead.row ) {
- docbookRow( buf, os, endfirsthead.row - 1);
- }
- if( endhead.row && endhead.row != endfirsthead.row) {
- docbookRow(buf, os, endhead.row - 1);
+ // output header info
+ if (haveLTHead() || haveLTFirstHead()) {
+ os << "<thead>\n";
+ ++ret;
+ for (int i = 0; i < rows_; ++i) {
+ if (row_info[i].endhead || row_info[i].endfirsthead) {
+ ret += docbookRow(buf, os, i);
}
- os << "</thead>\n";
}
-
- // Footer
- if( endfoot.row || endlastfoot.row ) {
- os << "<tfoot>\n";
- if( endfoot.row ) {
- docbookRow( buf, os, endfoot.row - 1);
- }
- if( endlastfoot.row && endlastfoot.row != endfoot.row) {
- docbookRow( buf, os, endlastfoot.row - 1);
+ os << "<thead>\n";
+ ++ret;
+ }
+ // output footer info
+ if (haveLTFoot() || haveLTLastFoot()) {
+ os << "<tfoot>\n";
+ ++ret;
+ for (int i = 0; i < rows_; ++i) {
+ if (row_info[i].endfoot || row_info[i].endlastfoot) {
+ ret += docbookRow(buf, os, i);
}
- os << "</tfoot>\n";
}
+ os << "</tfoot>\n";
+ ++ret;
}
-#endif
+
//+---------------------------------------------------------------------
//+ the single row and columns (cells) +
//+---------------------------------------------------------------------
os << "<tbody>\n";
+ ++ret;
for (int i = 0; i < rows_; ++i) {
- if(!IsLongTabular() || (
- !row_info[i].endhead && !row_info[i].endfirsthead &&
- !row_info[i].endfoot && !row_info[i].endlastfoot)) {
- docbookRow( buf, os, i);
+ if (isValidRow(i)) {
+ ret += docbookRow(buf, os, i);
}
}
os << "</tbody>\n";
+ ++ret;
//+---------------------------------------------------------------------
//+ the closing of the tabular +
//+---------------------------------------------------------------------
}
+int LyXTabular::GetCellFromInset(Inset const * inset, int maybe_cell) const
+{
+ // is this inset part of the tabular?
+ if (!inset || inset->owner() != owner_) {
+ lyxerr[Debug::INSETTEXT]
+ << "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) {
+ cell = maybe_cell;
+ if (cell == -1 || GetCellInset(cell) != inset) {
+ cell = -1;
+ }
+ }
+
+ if (cell == -1) {
+ for (cell = GetNumberOfCells(); cell >= 0; --cell) {
+ if (GetCellInset(cell) == inset)
+ break;
+ }
+ lyxerr[Debug::INSETTEXT]
+ << "LyXTabular::GetCellFromInset: "
+ << "cell=" << cell
+ << ", cur_cell=" << save_cur_cell
+ << ", maybe_cell=" << maybe_cell
+ << endl;
+ // We should have found a cell at this point
+ if (cell == -1) {
+ lyxerr << "LyXTabular::GetCellFromInset: "
+ << "Cell not found!" << endl;
+ }
+ }
+
+ return cell;
+}
+
+
void LyXTabular::Validate(LaTeXFeatures & features) const
{
if (IsLongTabular())
features.require("longtable");
if (NeedRotating())
features.require("rotating");
- for (int cell = 0; !features.isRequired("array") && (cell < numberofcells); ++cell) {
+ for (int cell = 0; cell < numberofcells; ++cell) {
if (GetVAlignment(cell) != LYX_VALIGN_TOP)
features.require("array");
GetCellInset(cell)->validate(features);
}
-std::vector<string> const LyXTabular::getLabelList() const
+vector<string> const LyXTabular::getLabelList() const
{
- std::vector<string> label_list;
+ vector<string> label_list;
for (int i = 0; i < rows_; ++i)
for (int j = 0; j < columns_; ++j) {
- std::vector<string> const l =
+ vector<string> const l =
GetCellInset(i, j)->getLabelList();
label_list.insert(label_list.end(),
l.begin(), l.end());