]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.h
Fix bug #12795
[lyx.git] / src / insets / InsetTabular.h
index 0d4e7afee9d0e954e564e7f86f8fefec0e28bacd..5602984b3339be79d73199034f71ebdb36436489 100644 (file)
@@ -24,6 +24,7 @@
 #ifndef INSET_TABULAR_H
 #define INSET_TABULAR_H
 
+#include "BufferParams.h"
 #include "Changes.h"
 #include "InsetText.h"
 
@@ -341,6 +342,12 @@ public:
                ///
                SET_INNER_LINES,
                ///
+               TOGGLE_INNER_LINES,
+               ///
+               TOGGLE_BORDER_LINES,
+               ///
+               TOGGLE_ALL_LINES,
+               ///
                LAST_ACTION
        };
        ///
@@ -445,6 +452,18 @@ public:
        /// 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
@@ -683,7 +702,7 @@ public:
        /// 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;
@@ -831,6 +850,24 @@ public:
        ///
        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;
        ///
@@ -882,51 +919,12 @@ public:
        ///
        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);
@@ -938,6 +936,66 @@ public:
 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 prebaked CSS (for HTML tables in HTML output).
+       std::string getHAlignAsXmlAttribute(idx_type cell) const;
+       /// Transforms the vertical alignment of the given cell as a prebaked XML attribute (for CALS or HTML tables in DocBook).
+       std::string getHAlignAsCssAttribute(idx_type cell) const;
+       /// Transforms the vertical alignment of the given cell as prebaked CSS (for HTML tables in HTML output).
+       std::string getVAlignAsCssAttribute(idx_type cell) const;
+       /// Transforms the vertical alignment of the given cell as a prebaked XML attribute (for CALS or HTML tables in DocBook).
+       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
 
 
@@ -1072,7 +1130,7 @@ public:
        ///
        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;
        ///
@@ -1092,7 +1150,8 @@ public:
        docstring asString(idx_type stidx, idx_type enidx, bool intoInsets = true);
        ///
        ParagraphList asParList(idx_type stidx, idx_type enidx);
-
+       ///
+       bool confirmDeletion() const override { return true; }
        /// Returns whether the cell in the specified row and column is selected.
        bool isCellSelected(Cursor & cur, row_type row, col_type col) const;
        ///