X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetTabular.h;h=5602984b3339be79d73199034f71ebdb36436489;hb=8124e6c02ea1fd6779bb6c47ffe2bca2c8bd2d97;hp=028da979694400dacf9ba5bf24e235d823f534ed;hpb=0fa4b7e736a6cc9c22620dcebbab457c219f79c8;p=lyx.git diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index 028da97969..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,40 +56,51 @@ 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 { return CELL_CODE; } + InsetCode lyxCode() const override { return CELL_CODE; } /// - Inset * clone() const { return new InsetTableCell(*this); } + Inset * clone() const override { return new InsetTableCell(*this); } /// bool getStatus(Cursor & cur, FuncRequest const & cmd, - FuncStatus & status) const; + FuncStatus & status) const override; /// 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); /// - docstring xhtml(XMLStream &, OutputParams const &) const; + docstring xhtml(XMLStream &, OutputParams const &) const override; /// - void docbook(XMLStream &, OutputParams const &) const; + void docbook(XMLStream &, OutputParams const &) const override; /// void addToToc(DocIterator const & di, bool output_active, - UpdateType utype, TocBackend & backend) const; + UpdateType utype, TocBackend & backend) const override; /// - void metrics(MetricsInfo &, Dimension &) const; + void metrics(MetricsInfo &, Dimension &) const override; /// Needs to be same as InsetTabular - bool inheritFont() const { return false; } + 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. @@ -111,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; @@ -122,21 +137,17 @@ private: /// LyXAlignment contentAlign; /// should paragraph indentation be omitted in any case? - bool neverIndent() const { return true; } + bool neverIndent() const override { return true; } /// - LyXAlignment contentAlignment() const { return contentAlign; } + LyXAlignment contentAlignment() const override { return contentAlign; } /// - virtual bool usePlainLayout() const { return true; } + bool usePlainLayout() const override { return true; } /// - virtual bool forcePlainLayout(idx_type = 0) const; + bool allowParagraphCustomization(idx_type = 0) const override; /// - virtual bool allowParagraphCustomization(idx_type = 0) const; - /// - virtual bool forceLocalFontSwitch() const; + bool forceLocalFontSwitch() const override; /// Is the width forced to some value? - bool hasFixedWidth() const { return isFixedWidth; } - /// Can the cell contain several paragraphs? - bool allowMultiPar() const { return !isMultiRow && (!isMultiColumn || isFixedWidth); } + bool hasFixedWidth() const override { return isFixedWidth; } }; @@ -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 @@ -944,143 +1008,141 @@ public: /// ~InsetTabular(); /// - void setBuffer(Buffer & buffer); + void setBuffer(Buffer & buffer) override; /// static void string2params(std::string const &, InsetTabular &); /// static std::string params2string(InsetTabular const &); /// - void read(Lexer &); + void read(Lexer &) override; /// - void write(std::ostream &) const; + void write(std::ostream &) const override; + /// + void metrics(MetricsInfo &, Dimension &) const override; + /// + void draw(PainterInfo & pi, int x, int y) const override; /// - void metrics(MetricsInfo &, Dimension &) const; + void drawSelection(PainterInfo & pi, int x, int y) const override; /// - void draw(PainterInfo & pi, int x, int y) const; + void drawBackground(PainterInfo & pi, int x, int y) const override; /// - void drawSelection(PainterInfo & pi, int x, int y) const; + bool editable() const override { return true; } /// - void drawBackground(PainterInfo & pi, int x, int y) const; + bool hasSettings() const override { return true; } /// - bool editable() const { return true; } + bool insetAllowed(InsetCode code) const override; /// - bool hasSettings() const { return true; } + bool allowSpellCheck() const override { return true; } /// - bool insetAllowed(InsetCode code) const; + bool canTrackChanges() const override { return true; } /// - bool allowSpellCheck() const { return true; } + bool canPaintChange(BufferView const &) const override { return true; } /// - bool canTrackChanges() const { return true; } + bool inheritFont() const override { return false; } /// - bool canPaintChange(BufferView const &) const { 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 { return false; } + bool allowMultiPar() const override; /// - bool allowsCaptionVariation(std::string const &) const; + bool allowsCaptionVariation(std::string const &) const override; // - bool isTable() const { return true; } + bool isTable() const override { return true; } /// - RowFlags rowFlags() const; + int rowFlags() const override; /// - void latex(otexstream &, OutputParams const &) const; + void latex(otexstream &, OutputParams const &) const override; /// int plaintext(odocstringstream & ods, OutputParams const & op, - size_t max_length = INT_MAX) const; + size_t max_length = INT_MAX) const override; /// - void docbook(XMLStream &, OutputParams const &) const; + void docbook(XMLStream &, OutputParams const &) const override; /// - docstring xhtml(XMLStream &, OutputParams const &) const; + docstring xhtml(XMLStream &, OutputParams const &) const override; /// - void validate(LaTeXFeatures & features) const; + void validate(LaTeXFeatures & features) const override; /// - InsetCode lyxCode() const { return TABULAR_CODE; } + InsetCode lyxCode() const override { return TABULAR_CODE; } /// - std::string contextMenu(BufferView const &, int, int) const; + std::string contextMenu(BufferView const &, int, int) const override; /// - std::string contextMenuName() const; + std::string contextMenuName() const override; /// get offset of this cursor slice relative to our upper left corner void cursorPos(BufferView const & bv, CursorSlice const & sl, - bool boundary, int & x, int & y) const; + bool boundary, int & x, int & y) const override; /// Executes a space-separated sequence of tabular-features requests void tabularFeatures(Cursor & cur, std::string const & what); /// Change a single tabular feature; does not handle undo. void tabularFeatures(Cursor & cur, Tabular::Feature feature, std::string const & val = std::string()); /// number of cells - size_t nargs() const { return tabular.numberofcells; } + size_t nargs() const override { return tabular.numberofcells; } /// std::shared_ptr cell(idx_type) const; /// std::shared_ptr cell(idx_type); /// - Text * getText(int) const; + Text * getText(int) const override; /// does the inset contain changes ? - bool isChanged() const; + bool isChanged() const override; /// set the change for the entire inset - void setChange(Change const & change); + void setChange(Change const & change) override; /// accept the changes within the inset - void acceptChanges(); + void acceptChanges() override; /// reject the changes within the inset - void rejectChanges(); + void rejectChanges() override; // this should return true if we have a "normal" cell, otherwise false. // "normal" means without width set! /// should all paragraphs be output with "Standard" layout? - virtual bool allowParagraphCustomization(idx_type cell = 0) const; - /// - virtual bool forcePlainLayout(idx_type cell = 0) const; + bool allowParagraphCustomization(idx_type cell = 0) const override; /// void addPreview(DocIterator const & inset_pos, - graphics::PreviewLoader &) const; + graphics::PreviewLoader &) const override; /// lock cell with given index - void edit(Cursor & cur, bool front, EntryDirection entry_from); + void edit(Cursor & cur, bool front, EntryDirection entry_from) override; /// get table row from x coordinate int rowFromY(Cursor & cur, int y) const; /// get table column from y coordinate int columnFromX(Cursor & cur, int x) const; /// - Inset * editXY(Cursor & cur, int x, int y); + Inset * editXY(Cursor & cur, int x, int y) override; /// can we go further down on mouse click? - bool descendable(BufferView const &) const { return true; } + bool descendable(BufferView const &) const override { return true; } /// Update the counters of this inset and of its contents - void updateBuffer(ParIterator const &, UpdateType, bool const deleted = false); + void updateBuffer(ParIterator const &, UpdateType, bool const deleted = false) override; /// void addToToc(DocIterator const & di, bool output_active, - UpdateType utype, TocBackend & backend) const; + UpdateType utype, TocBackend & backend) const override; /// - bool completionSupported(Cursor const &) const; + bool completionSupported(Cursor const &) const override; /// - bool inlineCompletionSupported(Cursor const & cur) const; + bool inlineCompletionSupported(Cursor const & cur) const override; /// - bool automaticInlineCompletion() const; + bool automaticInlineCompletion() const override; /// - bool automaticPopupCompletion() const; + bool automaticPopupCompletion() const override; /// - bool showCompletionCursor() const; + bool showCompletionCursor() const override; /// - CompletionList const * createCompletionList(Cursor const & cur) const; + CompletionList const * createCompletionList(Cursor const & cur) const override; /// - docstring completionPrefix(Cursor const & cur) const; + docstring completionPrefix(Cursor const & cur) const override; /// - bool insertCompletion(Cursor & cur, docstring const & s, bool finished); + bool insertCompletion(Cursor & cur, docstring const & s, bool /*finished*/) override; /// - void completionPosAndDim(Cursor const &, int & x, int & y, Dimension & dim) const; + void completionPosAndDim(Cursor const &, int & x, int & y, Dimension & dim) const override; /// - virtual bool usePlainLayout() const { return true; } + bool usePlainLayout() const override { return true; } /// - docstring layoutName() const { return from_ascii("Tabular"); } + docstring layoutName() const override { return from_ascii("Tabular"); } /// - InsetTabular * asInsetTabular() { return this; } + InsetTabular * asInsetTabular() override { return this; } /// - InsetTabular const * asInsetTabular() const { return this; } + InsetTabular const * asInsetTabular() const override { return this; } /// bool isRightToLeft(Cursor & cur) const; /// writes the cells between stidx and enidx as a string, optionally @@ -1088,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; /// @@ -1102,21 +1165,21 @@ private: /// InsetTabular(InsetTabular const &); /// - void doDispatch(Cursor & cur, FuncRequest & cmd); + void doDispatch(Cursor & cur, FuncRequest & cmd) override; /// bool getFeatureStatus(Cursor & cur, std::string const & s, std::string const & argument, FuncStatus & status) const; /// - bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const; + bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const override; /// - Inset * clone() const { return new InsetTabular(*this); } + Inset * clone() const override { return new InsetTabular(*this); } /// bool hitSelectRow(BufferView const & bv, int x) const; /// bool hitSelectColumn(BufferView const & bv, int y) const; /// Returns true if coordinates are on row/column selection zones - bool clickable(BufferView const &, int x, int y) const; + bool clickable(BufferView const &, int x, int y) const override; /// void drawCellLines(PainterInfo &, int x, int y, row_type row,