]> git.lyx.org Git - lyx.git/blobdiff - src/tabular.C
get rid of LYX_LIBS
[lyx.git] / src / tabular.C
index d8623ee958b40acb5018c68e64e2df6cd81d88d2..de046eab704aa1c857b73908c6622541cd75f10e 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *           LyX, The Document Processor
  *      
- *           Copyright 2000-2001 The LyX Team.
+ *           Copyright 2000-2002 The LyX Team.
  *
  *           @author: Jürgen Vigna
  *
@@ -552,7 +552,7 @@ int LyXTabular::GetAdditionalHeight(int row) const
        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;
@@ -561,8 +561,8 @@ int LyXTabular::GetAdditionalHeight(int row) const
                        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;
@@ -620,14 +620,14 @@ bool LyXTabular::SetWidthOfMulticolCell(int cell, int new_width)
        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;
@@ -636,25 +636,36 @@ bool LyXTabular::SetWidthOfMulticolCell(int cell, int new_width)
        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));
+               }
+       }
 }
 
 
@@ -688,16 +699,11 @@ bool LyXTabular::SetWidthOfCell(int cell, int new_width)
                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;
@@ -885,7 +891,7 @@ int LyXTabular::GetBeginningOfTextInCell(int cell) const
 {
        int x = 0;
    
-       switch (GetAlignment(cell)){
+       switch (GetAlignment(cell)) {
        case LYX_ALIGN_CENTER:
                x += (GetWidthOfColumn(cell) - GetWidthOfCell(cell)) / 2;
                break;
@@ -1012,50 +1018,50 @@ void LyXTabular::Write(Buffer const * buf, ostream & os) const
           << ">\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";
@@ -1884,7 +1890,7 @@ int LyXTabular::TeXTopHLine(ostream & os, int row) const
                if (TopLine(i))
                        ++tmp;
        }
-       if (tmp == (n - fcell)){
+       if (tmp == (n - fcell)) {
                os << "\\hline ";
        } else if (tmp) {
                for (int i = fcell; i < n; ++i) {
@@ -1917,7 +1923,7 @@ int LyXTabular::TeXBottomHLine(ostream & os, int row) const
                if (BottomLine(i))
                        ++tmp;
        }
-       if (tmp == (n-fcell)){
+       if (tmp == (n - fcell)) {
                os << "\\hline";
        } else if (tmp) {
                for (int i = fcell; i < n; ++i) {
@@ -2036,7 +2042,7 @@ int LyXTabular::TeXCellPostamble(ostream & os, int cell) const
                os << "%\n\\end{minipage}";
                ret += 2;
        }
-       if (IsMultiColumn(cell)){
+       if (IsMultiColumn(cell)) {
                os << '}';
        }
        if (GetRotateCell(cell)) {
@@ -2357,48 +2363,44 @@ int LyXTabular::docBook(Buffer const * buf, ostream & os) const
        //+                      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                    +
        //+---------------------------------------------------------------------
@@ -2647,13 +2649,53 @@ InsetText * LyXTabular::GetCellInset(int row, int column) const
 }
 
 
+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);
@@ -2661,12 +2703,12 @@ void LyXTabular::Validate(LaTeXFeatures & features) const
 }
 
 
-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());