#ifndef INSET_TABULAR_H
#define INSET_TABULAR_H
+#include "BufferParams.h"
#include "Changes.h"
#include "InsetText.h"
///
SET_INNER_LINES,
///
+ TOGGLE_INNER_LINES,
+ ///
+ TOGGLE_BORDER_LINES,
+ ///
+ TOGGLE_ALL_LINES,
+ ///
LAST_ACTION
};
///
/// If \p ignore_bt is true, we return the state as if booktabs was
/// not used
bool rightLine(idx_type cell, bool const ignore_bt = false) const;
+ /// Returns true if there is an outside border around the selection
+ bool outsideBorders(row_type sel_row_start, row_type sel_row_end,
+ col_type sel_col_start, col_type sel_col_end) const;
+ /// Returns true if there are inside lines in the selection
+ bool innerBorders(row_type sel_row_start, row_type sel_row_end,
+ col_type sel_col_start, col_type sel_col_end) const;
+ /// Sets the grid lines in the selection
+ /// if \p setLinesInnerOnly is true, outside borders are excluded
+ /// if \p setLines is true the lines are set otherwise they are unset
+ void setLines(row_type const sel_row_start, row_type const sel_row_end,
+ col_type const sel_col_start, col_type const sel_col_end,
+ bool setLinesInnerOnly, bool setLines);
/// Returns whether the top line is trimmed left and/or right
std::pair<bool, bool> topLineTrim(idx_type const cell) const;
/// Returns whether the bottom line is trimmed left and/or right
/// can return different things. this is because cellIndex(r,c)
/// returns the VISIBLE cell at r,c, which may be the same as the
/// cell at the previous row or column, if we're dealing with some
- /// multirow or multicell.
+ /// multirow or multicolumn.
std::shared_ptr<InsetTableCell> cellInset(idx_type cell);
std::shared_ptr<InsetTableCell> cellInset(row_type row, col_type column);
InsetTableCell const * cellInset(idx_type cell) const;
///
typedef std::vector<ColumnData> column_vector;
+private:
+ // Determines the style of borders, per row.
+ class XmlRowWiseBorders {
+ public:
+ // Whether to draw double bottom line.
+ bool completeBorder = true;
+
+ // Whether to draw booktabs' thicker lines.
+ bool completeBorderAbove = true;
+ bool completeBorderBelow = true;
+
+ // Size of the borders.
+ double borderBottomWidth = 1.0;
+ double borderBottomWidthComplete = 3.0;
+ double borderTopWidth = 1.0;
+ };
+
+public:
///
idx_type numberofcells;
///
///
BoxType useBox(idx_type cell) const;
///
- // helper function for Latex
- ///
- void TeXTopHLine(otexstream &, row_type row, std::list<col_type>,
- std::list<col_type>) const;
- ///
- void TeXBottomHLine(otexstream &, row_type row, std::list<col_type>,
- std::list<col_type>) const;
- ///
- void TeXCellPreamble(otexstream &, idx_type cell, bool & ismulticol, bool & ismultirow,
- bool const bidi) const;
- ///
- void TeXCellPostamble(otexstream &, idx_type cell, bool ismulticol, bool ismultirow) const;
- ///
- void TeXLongtableHeaderFooter(otexstream &, OutputParams const &, std::list<col_type>,
- std::list<col_type>) const;
+ bool hasNewlines(idx_type cell) const;
///
bool isValidRow(row_type const row) const;
///
void TeXRow(otexstream &, row_type const row,
OutputParams const &, std::list<col_type>, std::list<col_type>) const;
- ///
- // helper functions for plain text
- ///
- bool plaintextTopHLine(odocstringstream &, row_type row,
- std::vector<unsigned int> const &) const;
- ///
- bool plaintextBottomHLine(odocstringstream &, row_type row,
- std::vector<unsigned int> const &) const;
- ///
- void plaintextPrintCell(odocstringstream &,
- OutputParams const &,
- idx_type cell, row_type row, col_type column,
- std::vector<unsigned int> const &,
- bool onlydata, size_t max_length) const;
- /// auxiliary function for DocBook
- void docbookRow(XMLStream &, row_type, OutputParams const &,
- bool header = false) const;
- /// auxiliary function for DocBook: export this row as HTML
- void docbookRowAsHTML(XMLStream &, row_type, OutputParams const &,
- bool header) const;
- /// auxiliary function for DocBook: export this row as CALS
- void docbookRowAsCALS(XMLStream &, row_type, OutputParams const &) const;
- ///
- docstring xhtmlRow(XMLStream & xs, row_type, OutputParams const &,
- bool header = false) const;
/// change associated Buffer
void setBuffer(Buffer & buffer);
private:
Buffer * buffer_;
+ ///
+ // helper function for DocBook
+ ///
+ /// Determines whether the tabular item should be generated as DocBook or XHTML.
+ enum class XmlOutputFormat : bool {
+ XHTML = true,
+ DOCBOOK = false
+ };
+
+ /// Transforms the vertical alignment of the given cell as a prebaked XML attribute (for HTML and CALS).
+ std::string getHAlignAsXmlAttribute(idx_type cell, XmlOutputFormat output_format) const;
+ /// Transforms the vertical alignment of the given cell as a prebaked XML attribute (for HTML and CALS).
+ std::string getVAlignAsXmlAttribute(idx_type cell) const;
+
+ /// Helpers for XML tables (XHTML or DocBook).
+ docstring xmlRow(XMLStream & xs, row_type row, OutputParams const &,
+ bool header, XmlOutputFormat output_format,
+ BufferParams::TableOutput docbook_table_output = BufferParams::TableOutput::HTMLTable) const;
+ void xmlHeader(XMLStream & xs, OutputParams const &, XmlOutputFormat output_format) const;
+ void xmlFooter(XMLStream & xs, OutputParams const &, XmlOutputFormat output_format) const;
+ void xmlBody(XMLStream & xs, OutputParams const &, XmlOutputFormat output_format) const;
+ XmlRowWiseBorders computeXmlBorders(row_type row) const;
+ std::vector<std::string> computeCssStylePerCell(row_type row, col_type col, idx_type cell) const;
+
+ ///
+ // helper functions for plain text
+ ///
+ bool plaintextTopHLine(odocstringstream &, row_type row,
+ std::vector<unsigned int> const &) const;
+ ///
+ bool plaintextBottomHLine(odocstringstream &, row_type row,
+ std::vector<unsigned int> const &) const;
+ ///
+ void plaintextPrintCell(odocstringstream &,
+ OutputParams const &,
+ idx_type cell, row_type row, col_type column,
+ std::vector<unsigned int> const &,
+ bool onlydata, size_t max_length) const;
+
+ ///
+ // helper function for LaTeX
+ ///
+ void TeXTopHLine(otexstream &, row_type row, std::list<col_type>,
+ std::list<col_type>) const;
+ ///
+ void TeXBottomHLine(otexstream &, row_type row, std::list<col_type>,
+ std::list<col_type>) const;
+ ///
+ void TeXCellPreamble(otexstream &, idx_type cell, bool & ismulticol, bool & ismultirow,
+ bool const bidi) const;
+ ///
+ void TeXCellPostamble(otexstream &, idx_type cell, bool ismulticol, bool ismultirow) const;
+ ///
+ void TeXLongtableHeaderFooter(otexstream &, OutputParams const &, std::list<col_type>,
+ std::list<col_type>) const;
+
}; // Tabular
bool canTrackChanges() const override { return true; }
///
bool canPaintChange(BufferView const &) const override { return true; }
- /** returns false if, when outputting LaTeX, font changes should
- be closed before generating this inset. This is needed for
- insets that may contain several paragraphs */
+ ///
bool inheritFont() const override { return false; }
///
bool allowMultiPar() const override;
//
bool isTable() const override { return true; }
///
- RowFlags rowFlags() const override;
+ int rowFlags() const override;
///
void latex(otexstream &, OutputParams const &) const override;
///
///
docstring completionPrefix(Cursor const & cur) const override;
///
- bool insertCompletion(Cursor & cur, docstring const & s, bool finished) override;
+ bool insertCompletion(Cursor & cur, docstring const & s, bool /*finished*/) override;
///
void completionPosAndDim(Cursor const &, int & x, int & y, Dimension & dim) const override;
///