X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetTabular.h;h=5602984b3339be79d73199034f71ebdb36436489;hb=8124e6c02ea1fd6779bb6c47ffe2bca2c8bd2d97;hp=30bc29930141be2c8828df95bd3459629f002801;hpb=d82adc625b13ae2f752492e598ac2a8aaad2690c;p=lyx.git diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index 30bc299301..5602984b33 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -24,9 +24,12 @@ #ifndef INSET_TABULAR_H #define INSET_TABULAR_H +#include "BufferParams.h" +#include "Changes.h" #include "InsetText.h" #include "support/Length.h" +#include "support/types.h" #include #include @@ -44,7 +47,6 @@ class CursorSlice; class FuncStatus; class Lexer; class OutputParams; -class Paragraph; class XMLStream; @@ -54,6 +56,9 @@ class InsetTableCell : public InsetText public: /// explicit InsetTableCell(Buffer * buf); + /// We need this since generation of the default is deprecated + /// (since we declare the assignment constuctor below). + InsetTableCell(InsetTableCell const & in) = default; /// InsetCode lyxCode() const override { return CELL_CODE; } /// @@ -64,11 +69,13 @@ public: /// void toggleFixedWidth(bool fw) { isFixedWidth = fw; } /// + void toggleVarWidth(bool vw) { isVarwidth = vw; } + /// void toggleMultiCol(bool m) { isMultiColumn = m; } /// void toggleMultiRow(bool m) { isMultiRow = m; } /// - void setContentAlignment(LyXAlignment al) {contentAlign = al; } + void setContentAlignment(LyXAlignment al) { contentAlign = al; } /// writes the contents of the cell as a string, optionally /// descending into insets docstring asString(bool intoInsets = true); @@ -85,11 +92,15 @@ public: bool inheritFont() const override { return false; } /// Can the cell contain several paragraphs? bool allowMultiPar() const override { return !isMultiRow && (!isMultiColumn || isFixedWidth); } + /// + bool canPaintChange(BufferView const &) const override { return false; } + /// This assures we never output \maketitle in table cells + bool isInTitle() const override { return true; } private: - /// unimplemented - InsetTableCell(); - /// unimplemented - void operator=(InsetTableCell const &); + /// + InsetTableCell() = delete; + /// + void operator=(InsetTableCell const &) = delete; // FIXME // These booleans are supposed to track whether the cell has had its // width explicitly set and whether it is part of a multicolumn, respectively. @@ -113,10 +124,12 @@ private: // iterating, since this information is needed quite often, and so may // be quite slow. // So, well, if someone can do better, please do! - // --rgh + // --rkh /// bool isFixedWidth; /// + bool isVarwidth; + /// bool isMultiColumn; /// bool isMultiRow; @@ -130,8 +143,6 @@ private: /// bool usePlainLayout() const override { return true; } /// - bool forcePlainLayout(idx_type = 0) const override; - /// bool allowParagraphCustomization(idx_type = 0) const override; /// bool forceLocalFontSwitch() const override; @@ -331,6 +342,12 @@ public: /// SET_INNER_LINES, /// + TOGGLE_INNER_LINES, + /// + TOGGLE_BORDER_LINES, + /// + TOGGLE_ALL_LINES, + /// LAST_ACTION }; /// @@ -417,12 +434,6 @@ public: bool empty; }; - /// type for row numbers - typedef size_t row_type; - /// type for column numbers - typedef size_t col_type; - /// type for cell indices - typedef size_t idx_type; /// index indicating an invalid position static const idx_type npos = static_cast(-1); @@ -441,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 topLineTrim(idx_type const cell) const; /// Returns whether the bottom line is trimmed left and/or right @@ -548,9 +571,11 @@ public: /// void insertRow(row_type row, bool copy); /// - void moveColumn(col_type col, ColDirection direction); + void moveColumn(col_type col_start, col_type col_end, + ColDirection direction); /// - void moveRow(row_type row, RowDirection direction); + void moveRow(row_type row_start, row_type row_end, + RowDirection direction); /// void appendColumn(col_type column); /// @@ -677,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 cellInset(idx_type cell); std::shared_ptr cellInset(row_type row, col_type column); InsetTableCell const * cellInset(idx_type cell) const; @@ -825,6 +850,24 @@ public: /// typedef std::vector 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; /// @@ -876,51 +919,12 @@ public: /// BoxType useBox(idx_type cell) const; /// - // helper function for Latex - /// - void TeXTopHLine(otexstream &, row_type row, std::list, - std::list) const; - /// - void TeXBottomHLine(otexstream &, row_type row, std::list, - std::list) 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, - std::list) 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, std::list) const; - /// - // helper functions for plain text - /// - bool plaintextTopHLine(odocstringstream &, row_type row, - std::vector const &) const; - /// - bool plaintextBottomHLine(odocstringstream &, row_type row, - std::vector const &) const; - /// - void plaintextPrintCell(odocstringstream &, - OutputParams const &, - idx_type cell, row_type row, col_type column, - std::vector 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); @@ -932,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 computeCssStylePerCell(row_type row, col_type col, idx_type cell) const; + + /// + // helper functions for plain text + /// + bool plaintextTopHLine(odocstringstream &, row_type row, + std::vector const &) const; + /// + bool plaintextBottomHLine(odocstringstream &, row_type row, + std::vector const &) const; + /// + void plaintextPrintCell(odocstringstream &, + OutputParams const &, + idx_type cell, row_type row, col_type column, + std::vector const &, + bool onlydata, size_t max_length) const; + + /// + // helper function for LaTeX + /// + void TeXTopHLine(otexstream &, row_type row, std::list, + std::list) const; + /// + void TeXBottomHLine(otexstream &, row_type row, std::list, + std::list) 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, + std::list) const; + }; // Tabular @@ -974,9 +1038,7 @@ public: 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; @@ -985,7 +1047,7 @@ public: // bool isTable() const override { return true; } /// - RowFlags rowFlags() const override; + int rowFlags() const override; /// void latex(otexstream &, OutputParams const &) const override; /// @@ -1034,8 +1096,6 @@ public: /// should all paragraphs be output with "Standard" layout? bool allowParagraphCustomization(idx_type cell = 0) const override; /// - bool forcePlainLayout(idx_type cell = 0) const override; - /// void addPreview(DocIterator const & inset_pos, graphics::PreviewLoader &) const override; @@ -1070,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; /// @@ -1090,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; ///