]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
InsetTabular.cpp: output the caption for docbook
[lyx.git] / src / insets / InsetTabular.cpp
index e644b90fc8802fc59f239c1657b6f7ed17f188a4..daf4a3634b73d9777087592c3becf31e2fc77eb2 100644 (file)
@@ -730,8 +730,7 @@ void Tabular::deleteColumn(col_type const column)
        if (column_info.size() == 1)
                return;
 
-       column_info.erase(column_info.begin() + column);
-       size_t row_count = row_info.size();
+       size_t const row_count = row_info.size();
        for (row_type i = 0; i < row_count; ++i) {
                // Care about multicolumn cells
                if (column + 1 < column_info.size() &&
@@ -741,6 +740,7 @@ void Tabular::deleteColumn(col_type const column)
                }
                cell_info[i].erase(cell_info[i].begin() + column);
        }
+       column_info.erase(column_info.begin() + column);
        updateIndexes();
 }
 
@@ -1022,12 +1022,10 @@ void Tabular::setColumnPWidth(Cursor & cur, idx_type cell,
 bool Tabular::setFixedWidth(row_type r, col_type c)
 {
        bool const multicol = cell_info[r][c].multicolumn != CELL_NORMAL;
-       if ((!column_info[c].p_width.zero() && !multicol)
-           || (multicol && !cell_info[r][c].p_width.zero())) {
-               cell_info[r][c].inset->toggleFixedWidth(true);
-               return true;
-       }
-       return false;
+       bool const fixed_width = (!column_info[c].p_width.zero() && !multicol)
+             || (multicol && !cell_info[r][c].p_width.zero());
+       cell_info[r][c].inset->toggleFixedWidth(fixed_width);
+       return fixed_width;
 }
 
 
@@ -1747,13 +1745,20 @@ Tabular::idx_type Tabular::setLTCaption(row_type row, bool what)
 {
        idx_type i = getFirstCellInRow(row);
        if (what) {
-               setMultiColumn(i, column_info.size());
+               setMultiColumn(i, numberOfCellsInRow(i));
                setTopLine(i, false);
                setBottomLine(i, false);
                setLeftLine(i, false);
                setRightLine(i, false);
-       } else
+               // When a row is set as caption, then also insert a caption. Otherwise
+               // the LaTeX output is broken, when the user don't add a caption.
+               dispatch(FuncRequest(LFUN_CAPTION_INSERT));
+       } else {
                unsetMultiColumn(i);
+               // FIXME: when unsetting a caption row, also all existing captions
+               // in this row must be dissolved, see (bug 5754)
+               // dispatch(FuncRequest(LFUN_INSET_DISSOLVE, "caption-insert"));
+       }
        row_info[row].caption = what;
        return i;
 }
@@ -1765,6 +1770,15 @@ bool Tabular::ltCaption(row_type row) const
 }
 
 
+bool Tabular::haveLTCaption() const
+{
+       for (row_type i = 0; i < row_info.size(); ++i)
+               if (row_info[i].caption)
+                       return true;
+       return false;
+}
+
+
 // end longtable support functions
 
 void Tabular::setRowAscent(row_type row, int height)
@@ -2075,44 +2089,55 @@ int Tabular::TeXLongtableHeaderFooter(odocstream & os,
                return 0;
 
        int ret = 0;
-       // output header info
-       if (haveLTHead()) {
-               if (endhead.topDL) {
+       // caption handling
+       // the caption must be output befrore the headers
+       if (haveLTCaption()) {
+               for (row_type i = 0; i < row_info.size(); ++i) {
+                       if (row_info[i].caption) {
+                               ret += TeXRow(os, i, runparams);
+                       }
+               }
+       }
+       // output first header info
+       // first header must be output before the header, otherwise the
+       // correct caption placement becomes really wierd
+       if (haveLTFirstHead()) {
+               if (endfirsthead.topDL) {
                        os << "\\hline\n";
                        ++ret;
                }
                for (row_type i = 0; i < row_info.size(); ++i) {
-                       if (row_info[i].endhead) {
+                       if (row_info[i].endfirsthead) {
                                ret += TeXRow(os, i, runparams);
                        }
                }
-               if (endhead.bottomDL) {
+               if (endfirsthead.bottomDL) {
                        os << "\\hline\n";
                        ++ret;
                }
-               os << "\\endhead\n";
+               os << "\\endfirsthead\n";
                ++ret;
-               if (endfirsthead.empty) {
+       }
+       // output header info
+       if (haveLTHead()) {
+               if (!haveLTFirstHead()) {
                        os << "\\endfirsthead\n";
                        ++ret;
                }
-       }
-       // output firstheader info
-       if (haveLTFirstHead()) {
-               if (endfirsthead.topDL) {
+               if (endhead.topDL) {
                        os << "\\hline\n";
                        ++ret;
                }
                for (row_type i = 0; i < row_info.size(); ++i) {
-                       if (row_info[i].endfirsthead) {
+                       if (row_info[i].endhead) {
                                ret += TeXRow(os, i, runparams);
                        }
                }
-               if (endfirsthead.bottomDL) {
+               if (endhead.bottomDL) {
                        os << "\\hline\n";
                        ++ret;
                }
-               os << "\\endfirsthead\n";
+               os << "\\endhead\n";
                ++ret;
        }
        // output footer info
@@ -2132,7 +2157,7 @@ int Tabular::TeXLongtableHeaderFooter(odocstream & os,
                }
                os << "\\endfoot\n";
                ++ret;
-               if (endlastfoot.empty) {
+               if (!haveLTLastFoot()) {
                        os << "\\endlastfoot\n";
                        ++ret;
                }
@@ -2163,8 +2188,9 @@ bool Tabular::isValidRow(row_type row) const
 {
        if (!is_long_tabular)
                return true;
-       return !row_info[row].endhead && !row_info[row].endfirsthead &&
-                       !row_info[row].endfoot && !row_info[row].endlastfoot;
+       return !row_info[row].endhead && !row_info[row].endfirsthead
+               && !row_info[row].endfoot && !row_info[row].endlastfoot
+               && !row_info[row].caption;
 }
 
 
@@ -2488,11 +2514,12 @@ int Tabular::docbook(odocstream & os, OutputParams const & runparams) const
        //+---------------------------------------------------------------------
 
        // output header info
-       if (haveLTHead() || haveLTFirstHead()) {
+       if (haveLTHead() || haveLTFirstHead()|| haveLTCaption()) {
                os << "<thead>\n";
                ++ret;
                for (row_type i = 0; i < row_info.size(); ++i) {
-                       if (row_info[i].endhead || row_info[i].endfirsthead) {
+                       if (row_info[i].endhead || row_info[i].endfirsthead
+                               || row_info[i].caption) {
                                ret += docbookRow(os, i, runparams);
                        }
                }
@@ -3083,11 +3110,11 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
                            || y - a > bv->workHeight()) {
                                pi.pain.setDrawingEnabled(false);
                                cell(idx)->draw(pi, cx, y);
-                               drawCellLines(pi.pain, nx, y, i, idx, pi.erased_);
+                               drawCellLines(pi.pain, nx, y, i, idx, pi.change_);
                                pi.pain.setDrawingEnabled(original_drawing_state);
                        } else {
                                cell(idx)->draw(pi, cx, y);
-                               drawCellLines(pi.pain, nx, y, i, idx, pi.erased_);
+                               drawCellLines(pi.pain, nx, y, i, idx, pi.change_);
                        }
                        nx += tabular.columnWidth(idx);
                        ++idx;
@@ -3156,16 +3183,16 @@ void InsetTabular::drawSelection(PainterInfo & pi, int x, int y) const
 
 
 void InsetTabular::drawCellLines(Painter & pain, int x, int y,
-                                row_type row, idx_type cell, bool erased) const
+                                row_type row, idx_type cell, Change const & change) const
 {
        int x2 = x + tabular.columnWidth(cell);
        bool on_off = false;
-       ColorCode col = Color_tabularline;
-       ColorCode onoffcol = Color_tabularonoffline;
+       Color col = Color_tabularline;
+       Color onoffcol = Color_tabularonoffline;
 
-       if (erased) {
-               col = Color_deletedtext;
-               onoffcol = Color_deletedtext;
+       if (change.changed()) {
+               col = change.color();
+               onoffcol = change.color();
        }
 
        if (!tabular.topAlreadyDrawn(cell)) {
@@ -3886,15 +3913,27 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                        status.setOnOff(convert<int>(argument) == tabular.getUsebox(cur.idx()));
                        break;
 
-               case Tabular::SET_LTFIRSTHEAD:
-                       status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt));
+               // every row can only be one thing:
+               // either a footer or header or caption
+               case Tabular::SET_LTFIRSTHEAD:                  
+                       status.setEnabled(sel_row_start == sel_row_end
+                               && !tabular.getRowOfLTHead(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTFoot(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTLastFoot(sel_row_start, dummyltt)
+                               && !tabular.ltCaption(sel_row_start));
+                       status.setOnOff(tabular.getRowOfLTFirstHead(sel_row_start, dummyltt));
                        break;
 
                case Tabular::UNSET_LTFIRSTHEAD:
-                       status.setOnOff(!tabular.getRowOfLTHead(sel_row_start, dummyltt));
+                       status.setOnOff(!tabular.getRowOfLTFirstHead(sel_row_start, dummyltt));
                        break;
 
                case Tabular::SET_LTHEAD:
+                       status.setEnabled(sel_row_start == sel_row_end
+                               && !tabular.getRowOfLTFirstHead(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTFoot(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTLastFoot(sel_row_start, dummyltt)
+                               && !tabular.ltCaption(sel_row_start));
                        status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt));
                        break;
 
@@ -3903,6 +3942,11 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                        break;
 
                case Tabular::SET_LTFOOT:
+                       status.setEnabled(sel_row_start == sel_row_end
+                               && !tabular.getRowOfLTFirstHead(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTHead(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTLastFoot(sel_row_start, dummyltt)
+                               && !tabular.ltCaption(sel_row_start));
                        status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt));
                        break;
 
@@ -3911,11 +3955,16 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                        break;
 
                case Tabular::SET_LTLASTFOOT:
-                       status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt));
+                       status.setEnabled(sel_row_start == sel_row_end
+                               && !tabular.getRowOfLTFirstHead(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTHead(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTFoot(sel_row_start, dummyltt)
+                               && !tabular.ltCaption(sel_row_start));
+                       status.setOnOff(tabular.getRowOfLTLastFoot(sel_row_start, dummyltt));
                        break;
 
                case Tabular::UNSET_LTLASTFOOT:
-                       status.setOnOff(!tabular.getRowOfLTFoot(sel_row_start, dummyltt));
+                       status.setOnOff(!tabular.getRowOfLTLastFoot(sel_row_start, dummyltt));
                        break;
 
                case Tabular::SET_LTNEWPAGE:
@@ -3923,7 +3972,11 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                        break;
 
                case Tabular::TOGGLE_LTCAPTION:
-                       status.setEnabled(sel_row_start == sel_row_end);
+                       status.setEnabled(sel_row_start == sel_row_end
+                               && !tabular.getRowOfLTFirstHead(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTHead(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTFoot(sel_row_start, dummyltt)
+                               && !tabular.getRowOfLTLastFoot(sel_row_start, dummyltt));
                        status.setOnOff(tabular.ltCaption(sel_row_start));
                        break;