]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.h
New attempt on #9906: allow following hyperlinks via context menu.
[lyx.git] / src / insets / InsetTabular.h
index bdd21aff4e91c54758ead126e95db3bdbb8f561b..fd942049ba6d07c53d86acfb84610443196ca07b 100644 (file)
@@ -25,7 +25,8 @@
 #define INSET_TABULAR_H
 
 #include "InsetText.h"
-#include "Length.h"
+
+#include "support/Length.h"
 
 #include <climits>
 #include <iosfwd>
@@ -44,7 +45,7 @@ class FuncStatus;
 class Lexer;
 class OutputParams;
 class Paragraph;
-class XHTMLStream;
+class XMLStream;
 
 
 ///
@@ -52,7 +53,7 @@ class InsetTableCell : public InsetText
 {
 public:
        ///
-       InsetTableCell(Buffer * buf);
+       explicit InsetTableCell(Buffer * buf);
        ///
        InsetCode lyxCode() const { return CELL_CODE; }
        ///
@@ -63,23 +64,36 @@ public:
        ///
        void toggleFixedWidth(bool fw) { isFixedWidth = fw; }
        ///
+       void toggleMultiCol(bool m) { isMultiColumn = m; }
+       ///
+       void toggleMultiRow(bool m) { isMultiRow = m; }
+       ///
        void setContentAlignment(LyXAlignment al) {contentAlign = al; }
        /// writes the contents of the cell as a string, optionally
        /// descending into insets
        docstring asString(bool intoInsets = true);
        ///
-       docstring xhtml(XHTMLStream &, OutputParams const &) const;
+       docstring xhtml(XMLStream &, OutputParams const &) const;
+       ///
+       void docbook(XMLStream &, OutputParams const &) const;
        ///
        void addToToc(DocIterator const & di, bool output_active,
                                  UpdateType utype, TocBackend & backend) const;
+       ///
+       void metrics(MetricsInfo &, Dimension &) const;
+       /// Needs to be same as InsetTabular
+       bool inheritFont() const { return false; }
+       /// Can the cell contain several paragraphs?
+       bool allowMultiPar() const { return !isMultiRow && (!isMultiColumn || isFixedWidth); }
 private:
        /// unimplemented
        InsetTableCell();
        /// unimplemented
        void operator=(InsetTableCell const &);
        // FIXME
-       // This boolean is supposed to track whether the cell has had its
-       // width explicitly set. We need to know this to determine whether
+       // These booleans are supposed to track whether the cell has had its
+       // width explicitly set and whether it is part of a multicolumn, respectively.
+       // We need to know this to determine whether
        // layout changes and paragraph customization are allowed---that is,
        // we need it in forcePlainLayout() and allowParagraphCustomization().
        // Unfortunately, that information is not readily available in
@@ -102,10 +116,14 @@ private:
        // --rgh
        ///
        bool isFixedWidth;
+       ///
+       bool isMultiColumn;
+       ///
+       bool isMultiRow;
        // FIXME: Here the thoughts from the comment above also apply.
        ///
        LyXAlignment contentAlign;
-       /// should paragraph indendation be omitted in any case?
+       /// should paragraph indentation be omitted in any case?
        bool neverIndent() const { return true; }
        ///
        LyXAlignment contentAlignment() const { return contentAlign; }
@@ -119,12 +137,6 @@ private:
        virtual bool forceLocalFontSwitch() const;
        /// Is the width forced to some value?
        bool hasFixedWidth() const { return isFixedWidth; }
-       /// Can the cell contain several paragraphs?
-       /** FIXME this is wrong for multirows, that are limited to one
-        * paragraph. However, we cannot test for this (see the big
-        * comment above).
-        */
-       bool allowMultiPar() const { return isFixedWidth; }
 };
 
 
@@ -172,6 +184,22 @@ public:
                ///FIXME: remove
                TOGGLE_LINE_RIGHT,
                ///
+               SET_LTRIM_TOP,
+               ///
+               SET_RTRIM_TOP,
+               ///
+               SET_LTRIM_BOTTOM,
+               ///
+               SET_RTRIM_BOTTOM,
+               ///
+               TOGGLE_LTRIM_TOP,
+               ///
+               TOGGLE_RTRIM_TOP,
+               ///
+               TOGGLE_LTRIM_BOTTOM,
+               ///
+               TOGGLE_RTRIM_BOTTOM,
+               ///
                ALIGN_LEFT,
                ///
                ALIGN_RIGHT,
@@ -216,6 +244,8 @@ public:
                ///
                SET_ALL_LINES,
                ///
+               RESET_FORMAL_DEFAULT,
+               ///
                UNSET_ALL_LINES,
                ///
                TOGGLE_LONGTABULAR,
@@ -228,6 +258,8 @@ public:
                ///
                SET_MPWIDTH,
                ///
+               TOGGLE_VARWIDTH_COLUMN,
+               ///
                SET_ROTATE_TABULAR,
                ///
                UNSET_ROTATE_TABULAR,
@@ -297,6 +329,8 @@ public:
                ///
                SET_TABULAR_WIDTH,
                ///
+               SET_INNER_LINES,
+               ///
                LAST_ACTION
        };
        ///
@@ -339,7 +373,9 @@ public:
                ///
                BOX_PARBOX = 1,
                ///
-               BOX_MINIPAGE = 2
+               BOX_MINIPAGE = 2,
+               ///
+               BOX_VARWIDTH = 3
        };
 
        enum CaptionType {
@@ -398,9 +434,17 @@ public:
        /// Returns true if there is a topline, returns false if not
        bool bottomLine(idx_type cell) const;
        /// Returns true if there is a topline, returns false if not
-       bool leftLine(idx_type cell) const;
+       /// If \p ignore_bt is true, we return the state as if booktabs was
+       /// not used
+       bool leftLine(idx_type cell, bool const ignore_bt = false) const;
        /// Returns true if there is a topline, returns false if not
-       bool rightLine(idx_type cell) const;
+       /// 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 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
+       std::pair<bool, bool> bottomLineTrim(idx_type const cell) const;
 
        /// return space occupied by the second horizontal line and
        /// interline space above row \p row in pixels
@@ -434,6 +478,18 @@ public:
        ///
        void setBottomLine(idx_type cell, bool line);
        ///
+       void setTopLineLTrim(idx_type cell, bool val);
+       ///
+       void setBottomLineLTrim(idx_type cell, bool val);
+       ///
+       void setTopLineRTrim(idx_type cell, bool val);
+       ///
+       void setBottomLineRTrim(idx_type cell, bool val);
+       ///
+       void setTopLineTrim(idx_type cell, std::pair<bool, bool>);
+       ///
+       void setBottomLineTrim(idx_type cell, std::pair<bool, bool>);
+       ///
        void setLeftLine(idx_type cell, bool line);
        ///
        void setRightLine(idx_type cell, bool line);
@@ -460,6 +516,8 @@ public:
        ///
        bool setMColumnPWidth(Cursor &, idx_type, Length const &);
        ///
+       bool toggleVarwidth(idx_type, bool const);
+       ///
        bool setMROffset(Cursor &, idx_type, Length const &);
        ///
        void setAlignSpecial(idx_type cell, docstring const & special,
@@ -484,7 +542,7 @@ public:
        ///
        void appendRow(row_type row);
        ///
-       void deleteRow(row_type row);
+       void deleteRow(row_type row, bool const force = false);
        ///
        void copyRow(row_type row);
        ///
@@ -496,15 +554,19 @@ public:
        ///
        void appendColumn(col_type column);
        ///
-       void deleteColumn(col_type column);
+       void deleteColumn(col_type column, bool const force = false);
        ///
        void copyColumn(col_type column);
        ///
        void insertColumn(col_type column, bool copy);
        ///
-       idx_type getFirstCellInRow(row_type row) const;
+       idx_type getFirstCellInRow(row_type row, bool const ct = false) const;
+       ///
+       idx_type getLastCellInRow(row_type row, bool const ct = false) const;
+       ///
+       idx_type getFirstRow(bool const ct = false) const;
        ///
-       idx_type getLastCellInRow(row_type row) const;
+       idx_type getLastRow(bool const ct = false) const;
        ///
        idx_type numberOfCellsInRow(row_type row) const;
        ///
@@ -513,10 +575,10 @@ public:
        void read(Lexer &);
        ///
        void latex(otexstream &, OutputParams const &) const;
+       /// serialise the table in DocBook, according to buffer parameters
+       void docbook(XMLStream &, OutputParams const &) const;
        ///
-       int docbook(odocstream & os, OutputParams const &) const;
-       ///
-       docstring xhtml(XHTMLStream & os, OutputParams const &) const;
+       docstring xhtml(XMLStream &, OutputParams const &) const;
        ///
        void plaintext(odocstringstream &,
                       OutputParams const & runparams, int const depth,
@@ -526,7 +588,11 @@ public:
        ///
        bool hasMultiColumn(col_type cell) const;
        ///
-       idx_type setMultiColumn(idx_type cell, idx_type number,
+       bool hasVarwidthColumn() const;
+       ///
+       bool isVTypeColumn(col_type cell) const;
+       ///
+       idx_type setMultiColumn(Cursor & cur, idx_type cell, idx_type number,
                             bool const right_border);
        ///
        void unsetMultiColumn(idx_type cell);
@@ -539,7 +605,7 @@ public:
        ///
        bool hasMultiRow(row_type r) const;
        ///
-       idx_type setMultiRow(idx_type cell, idx_type number,
+       idx_type setMultiRow(Cursor & cur, idx_type cell, idx_type number,
                             bool const bottom_border,
                             LyXAlignment const halign);
        ///
@@ -587,7 +653,7 @@ public:
        ///
        bool getLTNewPage(row_type row) const;
        ///
-       idx_type setLTCaption(row_type row, bool what);
+       idx_type setLTCaption(Cursor & cur, row_type row, bool what);
        ///
        bool ltCaption(row_type row) const;
        ///
@@ -633,7 +699,7 @@ public:
        class CellData {
        public:
                ///
-               CellData(Buffer *);
+               explicit CellData(Buffer *);
                ///
                CellData(CellData const &);
                ///
@@ -667,6 +733,14 @@ public:
                ///
                bool right_line;
                ///
+               bool top_line_rtrimmed;
+               ///
+               bool top_line_ltrimmed;
+               ///
+               bool bottom_line_rtrimmed;
+               ///
+               bool bottom_line_ltrimmed;
+               ///
                BoxType usebox;
                ///
                int rotate;
@@ -720,6 +794,8 @@ public:
                bool newpage;
                /// caption
                bool caption;
+               ///
+               Change change;
        };
        ///
        typedef std::vector<RowData> row_vector;
@@ -741,6 +817,10 @@ public:
                docstring align_special;
                ///
                docstring decimal_point;
+               ///
+               bool varwidth;
+               ///
+               Change change;
        };
        ///
        typedef std::vector<ColumnData> column_vector;
@@ -788,30 +868,34 @@ public:
        ///
        bool setFixedWidth(row_type r, col_type c);
        /// return true of update is needed
-       bool updateColumnWidths();
+       bool updateColumnWidths(MetricsInfo & mi);
        ///
        idx_type columnSpan(idx_type cell) const;
        ///
        idx_type rowSpan(idx_type cell) const;
        ///
-       BoxType useParbox(idx_type cell) const;
+       BoxType useBox(idx_type cell) const;
        ///
        // helper function for Latex
        ///
-       void TeXTopHLine(otexstream &, row_type row, std::string const & lang) const;
+       void TeXTopHLine(otexstream &, row_type row, std::list<col_type>,
+                        std::list<col_type>) const;
        ///
-       void TeXBottomHLine(otexstream &, row_type row, std::string const & lang) 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) 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 &) const;
+       void TeXLongtableHeaderFooter(otexstream &, OutputParams const &, std::list<col_type>,
+                                     std::list<col_type>) const;
        ///
        bool isValidRow(row_type const row) const;
        ///
        void TeXRow(otexstream &, row_type const row,
-                   OutputParams const &) const;
+                   OutputParams const &, std::list<col_type>, std::list<col_type>) const;
        ///
        // helper functions for plain text
        ///
@@ -826,10 +910,16 @@ public:
                                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
-       int docbookRow(odocstream & os, row_type, OutputParams const &) const;
-       ///
-       docstring xhtmlRow(XHTMLStream & xs, row_type, OutputParams 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
@@ -884,25 +974,27 @@ public:
        bool canTrackChanges() const { return true; }
        ///
        bool canPaintChange(BufferView const &) const { return true; }
-       /** returns false if, when outputing LaTeX, font changes should
+       /** 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 { return false; }
        ///
+       bool allowMultiPar() const;
+       ///
        bool allowsCaptionVariation(std::string const &) const;
        //
        bool isTable() const { return true; }
        ///
-       DisplayType display() const;
+       RowFlags rowFlags() const;
        ///
        void latex(otexstream &, OutputParams const &) const;
        ///
        int plaintext(odocstringstream & ods, OutputParams const & op,
                      size_t max_length = INT_MAX) const;
        ///
-       int docbook(odocstream &, OutputParams const &) const;
+       void docbook(XMLStream &, OutputParams const &) const;
        ///
-       docstring xhtml(XHTMLStream &, OutputParams const &) const;
+       docstring xhtml(XMLStream &, OutputParams const &) const;
        ///
        void validate(LaTeXFeatures & features) const;
        ///
@@ -928,6 +1020,8 @@ public:
        ///
        Text * getText(int) const;
 
+       /// does the inset contain changes ?
+       bool isChanged() const;
        /// set the change for the entire inset
        void setChange(Change const & change);
        /// accept the changes within the inset
@@ -956,7 +1050,7 @@ public:
        /// can we go further down on mouse click?
        bool descendable(BufferView const &) const { return true; }
        /// Update the counters of this inset and of its contents
-       void updateBuffer(ParIterator const &, UpdateType);
+       void updateBuffer(ParIterator const &, UpdateType, bool const deleted = false);
        ///
        void addToToc(DocIterator const & di, bool output_active,
                                  UpdateType utype, TocBackend & backend) const;
@@ -994,6 +1088,8 @@ public:
        /// writes the cells between stidx and enidx as a string, optionally
        /// descending into the insets
        docstring asString(idx_type stidx, idx_type enidx, bool intoInsets = true);
+       ///
+       ParagraphList asParList(idx_type stidx, idx_type enidx);
 
        /// Returns whether the cell in the specified row and column is selected.
        bool isCellSelected(Cursor & cur, row_type row, col_type col) const;