X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetTabular.cpp;h=01ee12c516513731fb0d65f5fecd49d49e046bd7;hb=efa0f198;hp=49a9fdcb8add9d13901da52ffbc5db3ace59640e;hpb=b7fbcd0b30c016365798743c5f85b3f9c37fefa5;p=lyx.git diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 49a9fdcb8a..01ee12c516 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -1906,45 +1906,49 @@ bool Tabular::getLTNewPage(row_type row) const } -bool Tabular::haveLTHead() const +bool Tabular::haveLTHead(bool withcaptions) const { if (!is_long_tabular) return false; for (row_type i = 0; i < nrows(); ++i) - if (row_info[i].endhead) + if (row_info[i].endhead && + (withcaptions || !row_info[i].caption)) return true; return false; } -bool Tabular::haveLTFirstHead() const +bool Tabular::haveLTFirstHead(bool withcaptions) const { if (!is_long_tabular || endfirsthead.empty) return false; for (row_type r = 0; r < nrows(); ++r) - if (row_info[r].endfirsthead) + if (row_info[r].endfirsthead && + (withcaptions || !row_info[r].caption)) return true; return false; } -bool Tabular::haveLTFoot() const +bool Tabular::haveLTFoot(bool withcaptions) const { if (!is_long_tabular) return false; for (row_type r = 0; r < nrows(); ++r) - if (row_info[r].endfoot) + if (row_info[r].endfoot && + (withcaptions || !row_info[r].caption)) return true; return false; } -bool Tabular::haveLTLastFoot() const +bool Tabular::haveLTLastFoot(bool withcaptions) const { if (!is_long_tabular || endlastfoot.empty) return false; for (row_type r = 0; r < nrows(); ++r) - if (row_info[r].endlastfoot) + if (row_info[r].endlastfoot && + (withcaptions || !row_info[r].caption)) return true; return false; } @@ -1959,6 +1963,11 @@ Tabular::idx_type Tabular::setLTCaption(row_type row, bool what) setBottomLine(i, false); setLeftLine(i, false); setRightLine(i, false); + if (!row_info[row].endfirsthead && !row_info[row].endhead && + !row_info[row].endfoot && !row_info[row].endlastfoot) { + setLTHead(row, true, endfirsthead, true); + row_info[row].endfirsthead = true; + } } else { unsetMultiColumn(i); // When unsetting a caption row, also all existing @@ -1975,13 +1984,34 @@ bool Tabular::ltCaption(row_type row) const } -bool Tabular::haveLTCaption() const +bool Tabular::haveLTCaption(CaptionType captiontype) const { if (!is_long_tabular) return false; - for (row_type r = 0; r < nrows(); ++r) - if (row_info[r].caption) - return true; + for (row_type r = 0; r < nrows(); ++r) { + if (row_info[r].caption) { + switch (captiontype) { + case CAPTION_FIRSTHEAD: + if (row_info[r].endfirsthead) + return true; + break; + case CAPTION_HEAD: + if (row_info[r].endhead) + return true; + break; + case CAPTION_FOOT: + if (row_info[r].endfoot) + return true; + break; + case CAPTION_LASTFOOT: + if (row_info[r].endlastfoot) + return true; + break; + case CAPTION_ANY: + return true; + } + } + } return false; } @@ -2355,17 +2385,7 @@ void Tabular::TeXLongtableHeaderFooter(otexstream & os, if (!is_long_tabular) return; - // caption handling - // the caption must be output before the headers - if (haveLTCaption()) { - for (row_type r = 0; r < nrows(); ++r) { - if (row_info[r].caption) - TeXRow(os, r, runparams); - } - } // output first header info - // first header must be output before the header, otherwise the - // correct caption placement becomes really weird if (haveLTFirstHead()) { if (endfirsthead.topDL) os << "\\hline\n"; @@ -2487,7 +2507,7 @@ void Tabular::TeXRow(otexstream & os, row_type row, os << "\\textFR{"; else if (lang == "arabic_arabi") os << "\\textAR{"; - // currently, remaning RTL languages are + // currently, remaining RTL languages are // arabic_arabtex and hebrew else os << "\\R{"; @@ -2537,13 +2557,7 @@ void Tabular::TeXRow(otexstream & os, row_type row, os << " &\n"; } } - if (row_info[row].caption && !endfirsthead.empty && !haveLTFirstHead()) - // if no first header and no empty first header is used, - // the caption needs to be terminated by \endfirsthead - // (bug 6057) - os << "\\endfirsthead"; - else - os << "\\tabularnewline"; + os << "\\tabularnewline"; if (row_info[row].bottom_space_default) { if (use_booktabs) os << "\\addlinespace"; @@ -2809,6 +2823,7 @@ int Tabular::docbook(odocstream & os, OutputParams const & runparams) const //+--------------------------------------------------------------------- // output caption info + // The caption flag wins over head/foot if (haveLTCaption()) { os << "\n"; ++ret; @@ -2821,11 +2836,12 @@ int Tabular::docbook(odocstream & os, OutputParams const & runparams) const ++ret; } // output header info - if (haveLTHead() || haveLTFirstHead()) { + if (haveLTHead(false) || haveLTFirstHead(false)) { os << "\n"; ++ret; for (row_type r = 0; r < nrows(); ++r) { - if (row_info[r].endhead || row_info[r].endfirsthead) { + if ((row_info[r].endhead || row_info[r].endfirsthead) && + !row_info[r].caption) { ret += docbookRow(os, r, runparams); } } @@ -2833,11 +2849,12 @@ int Tabular::docbook(odocstream & os, OutputParams const & runparams) const ++ret; } // output footer info - if (haveLTFoot() || haveLTLastFoot()) { + if (haveLTFoot(false) || haveLTLastFoot(false)) { os << "\n"; ++ret; for (row_type r = 0; r < nrows(); ++r) { - if (row_info[r].endfoot || row_info[r].endlastfoot) { + if ((row_info[r].endfoot || row_info[r].endlastfoot) && + !row_info[r].caption) { ret += docbookRow(os, r, runparams); } } @@ -2943,6 +2960,7 @@ docstring Tabular::xhtml(XHTMLStream & xs, OutputParams const & runparams) const } xs << html::StartTag("div", "class='longtable' style='text-align: " + align + ";'") << html::CR(); + // The caption flag wins over head/foot if (haveLTCaption()) { xs << html::StartTag("div", "class='longtable-caption' style='text-align: " + align + ";'") << html::CR(); @@ -2956,30 +2974,32 @@ docstring Tabular::xhtml(XHTMLStream & xs, OutputParams const & runparams) const xs << html::StartTag("table") << html::CR(); // output header info - bool const havefirsthead = haveLTFirstHead(); + bool const havefirsthead = haveLTFirstHead(false); // if we have a first head, then we are going to ignore the // headers for the additional pages, since there aren't any // in XHTML. this test accomplishes that. - bool const havehead = !havefirsthead && haveLTHead(); + bool const havehead = !havefirsthead && haveLTHead(false); if (havehead || havefirsthead) { xs << html::StartTag("thead") << html::CR(); for (row_type r = 0; r < nrows(); ++r) { - if ((havefirsthead && row_info[r].endfirsthead) - || (havehead && row_info[r].endhead)) { + if (((havefirsthead && row_info[r].endfirsthead) || + (havehead && row_info[r].endhead)) && + !row_info[r].caption) { ret += xhtmlRow(xs, r, runparams, true); } } xs << html::EndTag("thead") << html::CR(); } // output footer info - bool const havelastfoot = haveLTLastFoot(); + bool const havelastfoot = haveLTLastFoot(false); // as before. - bool const havefoot = !havelastfoot && haveLTFoot(); + bool const havefoot = !havelastfoot && haveLTFoot(false); if (havefoot || havelastfoot) { xs << html::StartTag("tfoot") << html::CR(); for (row_type r = 0; r < nrows(); ++r) { - if ((havelastfoot && row_info[r].endlastfoot) - || (havefoot && row_info[r].endfoot)) { + if (((havelastfoot && row_info[r].endlastfoot) || + (havefoot && row_info[r].endfoot)) && + !row_info[r].caption) { ret += xhtmlRow(xs, r, runparams); } } @@ -4583,10 +4603,9 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; // every row can only be one thing: - // either a footer or header or caption + // either a footer or header case Tabular::SET_LTFIRSTHEAD: - status.setEnabled(sel_row_start == sel_row_end - && !tabular.ltCaption(sel_row_start)); + status.setEnabled(sel_row_start == sel_row_end); status.setOnOff(tabular.getRowOfLTFirstHead(sel_row_start, dummyltt)); break; @@ -4595,8 +4614,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; case Tabular::SET_LTHEAD: - status.setEnabled(sel_row_start == sel_row_end - && !tabular.ltCaption(sel_row_start)); + status.setEnabled(sel_row_start == sel_row_end); status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt)); break; @@ -4605,8 +4623,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; case Tabular::SET_LTFOOT: - status.setEnabled(sel_row_start == sel_row_end - && !tabular.ltCaption(sel_row_start)); + status.setEnabled(sel_row_start == sel_row_end); status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt)); break; @@ -4615,8 +4632,7 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, break; case Tabular::SET_LTLASTFOOT: - status.setEnabled(sel_row_start == sel_row_end - && !tabular.ltCaption(sel_row_start)); + status.setEnabled(sel_row_start == sel_row_end); status.setOnOff(tabular.getRowOfLTLastFoot(sel_row_start, dummyltt)); break; @@ -4628,22 +4644,39 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd, status.setOnOff(tabular.getLTNewPage(sel_row_start)); break; - // only one row can be the caption + // only one row in head/firsthead/foot/lasthead can be the caption // and a multirow cannot be set as caption case Tabular::SET_LTCAPTION: - case Tabular::UNSET_LTCAPTION: - case Tabular::TOGGLE_LTCAPTION: 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) - && (!tabular.haveLTCaption() - || tabular.ltCaption(sel_row_start)) + && (!tabular.getRowOfLTFirstHead(sel_row_start, dummyltt) + || !tabular.haveLTCaption(Tabular::CAPTION_FIRSTHEAD)) + && (!tabular.getRowOfLTHead(sel_row_start, dummyltt) + || !tabular.haveLTCaption(Tabular::CAPTION_HEAD)) + && (!tabular.getRowOfLTFoot(sel_row_start, dummyltt) + || !tabular.haveLTCaption(Tabular::CAPTION_FOOT)) + && (!tabular.getRowOfLTLastFoot(sel_row_start, dummyltt) + || !tabular.haveLTCaption(Tabular::CAPTION_LASTFOOT)) && !tabular.isMultiRow(sel_row_start)); status.setOnOff(tabular.ltCaption(sel_row_start)); break; + case Tabular::UNSET_LTCAPTION: + status.setEnabled(sel_row_start == sel_row_end && tabular.ltCaption(sel_row_start)); + break; + + case Tabular::TOGGLE_LTCAPTION: + status.setEnabled(sel_row_start == sel_row_end && (tabular.ltCaption(sel_row_start) + || ((!tabular.getRowOfLTFirstHead(sel_row_start, dummyltt) + || !tabular.haveLTCaption(Tabular::CAPTION_FIRSTHEAD)) + && (!tabular.getRowOfLTHead(sel_row_start, dummyltt) + || !tabular.haveLTCaption(Tabular::CAPTION_HEAD)) + && (!tabular.getRowOfLTFoot(sel_row_start, dummyltt) + || !tabular.haveLTCaption(Tabular::CAPTION_FOOT)) + && (!tabular.getRowOfLTLastFoot(sel_row_start, dummyltt) + || !tabular.haveLTCaption(Tabular::CAPTION_LASTFOOT))))); + status.setOnOff(tabular.ltCaption(sel_row_start)); + break; + case Tabular::SET_BOOKTABS: status.setOnOff(tabular.use_booktabs); break;