X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetTabular.h;h=1c97c173aaee7af8e41d9ed6781885ceea671b16;hb=a3c84666b2dbfc75c9a80cf4f94612149cb2b570;hp=ce56ba0988f901f3012606a5a6bcbee6e0a477b2;hpb=8918e5df3716769fa6b81139b1dc14bbaa0cd36d;p=lyx.git diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index ce56ba0988..1c97c173aa 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -25,10 +25,9 @@ #include "Inset.h" #include "InsetText.h" -#include "Layout.h" #include "Length.h" -#include +#include "support/shared_ptr.h" #include #include @@ -38,19 +37,84 @@ namespace lyx { class Buffer; class BufferView; class CompletionList; +class Cursor; class CursorSlice; -class InsetTableCell; class FuncStatus; class Lexer; +class OutputParams; class Paragraph; class XHTMLStream; -namespace frontend { class Painter; } +/// +class InsetTableCell : public InsetText +{ +public: + /// + InsetTableCell(Buffer * buf); + /// + InsetCode lyxCode() const { return CELL_CODE; } + /// + Inset * clone() { return new InsetTableCell(*this); } + /// + bool getStatus(Cursor & cur, FuncRequest const & cmd, + FuncStatus & status) const; + /// + void toggleFixedWidth(bool fw) { isFixedWidth = fw; } + /// + 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; +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 + // layout changes and paragraph customization are allowed---that is, + // we need it in forcePlainLayout() and allowParagraphCustomization(). + // Unfortunately, that information is not readily available in + // InsetTableCell. In the case of multicolumn cells, it is present + // in CellData, and so would be available here if CellData were to + // become a member of InsetTableCell. But in the other case, it isn't + // even available there, but is held in Tabular::ColumnData. + // So, the present solution uses this boolean to track the information + // we need to track, and tries to keep it updated. This is not ideal, + // but the other solutions are no better. These are: + // (i) Keep a pointer in InsetTableCell to the table; + // (ii) Find the table by iterating over the Buffer's insets. + // Solution (i) raises the problem of updating the pointer when an + // InsetTableCell is copied, and we'd therefore need a copy constructor + // in InsetTabular and then in Tabular, which seems messy, given how + // complicated those classes are. Solution (ii) involves a lot of + // iterating, since this information is needed quite often, and so may + // be quite slow. + // So, well, if someone can do better, please do! + // --rgh + /// + bool isFixedWidth; + // FIXME: Here the thoughts from the comment above also apply. + /// + LyXAlignment contentAlign; + /// should paragraph indendation be omitted in any case? + bool neverIndent() const { return true; } + /// + LyXAlignment contentAlignment() const { return contentAlign; } + /// + virtual bool usePlainLayout() const { return true; } + /// + virtual bool forcePlainLayout(idx_type = 0) const; + /// + virtual bool allowParagraphCustomization(idx_type = 0) const; + /// Is the width forced to some value? + bool hasFixedWidth() const { return isFixedWidth; } +}; -class InsetTabular; -class Cursor; -class OutputParams; // // A helper struct for tables @@ -72,12 +136,20 @@ public: /// COPY_COLUMN, /// - TOGGLE_LINE_TOP, + SET_LINE_TOP, /// - TOGGLE_LINE_BOTTOM, + SET_LINE_BOTTOM, /// - TOGGLE_LINE_LEFT, + SET_LINE_LEFT, /// + SET_LINE_RIGHT, + ///FIXME: remove + TOGGLE_LINE_TOP, + ///FIXME: remove + TOGGLE_LINE_BOTTOM, + ///FIXME: remove + TOGGLE_LINE_LEFT, + ///FIXME: remove TOGGLE_LINE_RIGHT, /// ALIGN_LEFT, @@ -88,6 +160,8 @@ public: /// ALIGN_BLOCK, /// + ALIGN_DECIMAL, + /// VALIGN_TOP, /// VALIGN_BOTTOM, @@ -108,8 +182,16 @@ public: /// MULTICOLUMN, /// + SET_MULTICOLUMN, + /// + UNSET_MULTICOLUMN, + /// MULTIROW, /// + SET_MULTIROW, + /// + UNSET_MULTIROW, + /// SET_ALL_LINES, /// UNSET_ALL_LINES, @@ -152,12 +234,14 @@ public: /// TOGGLE_LTCAPTION, /// + SET_LTCAPTION, + /// + UNSET_LTCAPTION, + /// SET_SPECIAL_COLUMN, /// SET_SPECIAL_MULTICOLUMN, /// - SET_SPECIAL_MULTIROW, - /// SET_BOOKTABS, /// UNSET_BOOKTABS, @@ -182,6 +266,8 @@ public: /// LONGTABULAR_ALIGN_RIGHT, /// + SET_DECIMAL_POINT, + /// LAST_ACTION }; /// @@ -264,13 +350,6 @@ public: /// Returns true if there is a topline, returns false if not bool rightLine(idx_type cell) const; - /// - bool topAlreadyDrawn(idx_type cell) const; - /// - bool leftAlreadyDrawn(idx_type cell) const; - /// - bool isLastRow(idx_type cell) const; - /// return space occupied by the second horizontal line and /// interline space above row \p row in pixels int interRowSpace(row_type row) const; @@ -279,14 +358,18 @@ public: /* returns the maximum over all rows */ /// - int columnWidth(idx_type cell) const; + int cellWidth(idx_type cell) const; /// - int rowHeight(idx_type cell) const; + int cellHeight(idx_type cell) const; /// int width() const; /// int height() const; /// + row_type nrows() const {return row_info.size();} + /// + col_type ncols() const {return column_info.size();} + /// int rowAscent(row_type row) const; /// int rowDescent(row_type row) const; @@ -295,10 +378,6 @@ public: /// void setRowDescent(row_type row, int height); /// - void setCellWidth(idx_type cell, int new_width); - /// - void setAllLines(idx_type cell, bool line); - /// void setTopLine(idx_type cell, bool line); /// void setBottomLine(idx_type cell, bool line); @@ -336,8 +415,6 @@ public: /// Length const getPWidth(idx_type cell) const; /// - int cellWidth(idx_type cell) const; - /// int textHOffset(idx_type cell) const; /// int textVOffset(idx_type cell) const; @@ -376,9 +453,7 @@ public: /// bool isMultiColumn(idx_type cell) const; /// - bool isMultiColumnReal(idx_type cell) const; - /// - void setMultiColumn(idx_type cell, idx_type number); + idx_type setMultiColumn(idx_type cell, idx_type number); /// void unsetMultiColumn(idx_type cell); /// @@ -388,7 +463,7 @@ public: /// bool isMultiRow(idx_type cell) const; /// - void setMultiRow(idx_type cell, idx_type number); + idx_type setMultiRow(idx_type cell, idx_type number); /// void unsetMultiRow(idx_type cell); /// @@ -396,8 +471,6 @@ public: /// col_type cellColumn(idx_type cell) const; /// - col_type cellRightColumn(idx_type cell) const; - /// void setRotateCell(idx_type cell, bool); /// bool getRotateCell(idx_type cell) const; @@ -452,13 +525,13 @@ public: /// // end longtable support /// - boost::shared_ptr cellInset(idx_type cell) const; + shared_ptr cellInset(idx_type cell) const; /// - boost::shared_ptr cellInset(row_type row, + shared_ptr cellInset(row_type row, col_type column) const; /// void setCellInset(row_type row, col_type column, - boost::shared_ptr) const; + shared_ptr) const; /// Search for \param inset in the tabular, with the /// void validate(LaTeXFeatures &) const; @@ -491,6 +564,12 @@ public: LyXAlignment alignment; /// VAlignment valignment; + /// width of the part before the decimal + int decimal_hoffset; + /// width of the decimal part + int decimal_width; + /// + int voffset; /// bool top_line; /// @@ -508,7 +587,7 @@ public: /// Length p_width; // this is only set for multicolumn!!! /// - boost::shared_ptr inset; + shared_ptr inset; }; CellData & cellInfo(idx_type cell) const; /// @@ -569,6 +648,8 @@ public: Length p_width; /// docstring align_special; + /// + docstring decimal_point; }; /// typedef std::vector column_vector; @@ -613,8 +694,6 @@ public: void updateIndexes(); /// bool setFixedWidth(row_type r, col_type c); - /// - void updateContentAlignment(row_type r, col_type c); /// return true of update is needed bool updateColumnWidths(); /// @@ -670,76 +749,6 @@ private: }; // Tabular -/// -class InsetTableCell : public InsetText -{ -public: - /// - InsetTableCell(Buffer * buf); - /// - InsetCode lyxCode() const { return CELL_CODE; } - /// - Inset * clone() { return new InsetTableCell(*this); } - /// - bool getStatus(Cursor & cur, FuncRequest const & cmd, - FuncStatus & status) const; - /// - void toggleFixedWidth(bool fw) { isFixedWidth = fw; } - /// - 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; -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 - // layout changes and paragraph customization are allowed---that is, - // we need it in forcePlainLayout() and allowParagraphCustomization(). - // Unfortunately, that information is not readily available in - // InsetTableCell. In the case of multicolumn cells, it is present - // in CellData, and so would be available here if CellData were to - // become a member of InsetTableCell. But in the other case, it isn't - // even available there, but is held in Tabular::ColumnData. - // So, the present solution uses this boolean to track the information - // we need to track, and tries to keep it updated. This is not ideal, - // but the other solutions are no better. These are: - // (i) Keep a pointer in InsetTableCell to the table; - // (ii) Find the table by iterating over the Buffer's insets. - // Solution (i) raises the problem of updating the pointer when an - // InsetTableCell is copied, and we'd therefore need a copy constructor - // in InsetTabular and then in Tabular, which seems messy, given how - // complicated those classes are. Solution (ii) involves a lot of - // iterating, since this information is needed quite often, and so may - // be quite slow. - // So, well, if someone can do better, please do! - // --rgh - /// - bool isFixedWidth; - // FIXME: Here the thoughts from the comment above also apply. - /// - LyXAlignment contentAlign; - /// should paragraph indendation be omitted in any case? - bool neverIndent() const { return true; } - /// - LyXAlignment contentAlignment() const { return contentAlign; } - /// - virtual bool usePlainLayout() const { return true; } - /// - virtual bool forcePlainLayout(idx_type = 0) const; - /// - virtual bool allowParagraphCustomization(idx_type = 0) const; - /// Is the width forced to some value? - bool hasFixedWidth() const { return isFixedWidth; } -}; - - class InsetTabular : public Inset { public: @@ -803,16 +812,12 @@ public: /// void tabularFeatures(Cursor & cur, Tabular::Feature feature, std::string const & val = std::string()); - /// - void openLayoutDialog(BufferView *) const; - /// - bool showInsetDialog(BufferView *) const; /// number of cells size_t nargs() const { return tabular.numberofcells; } /// - boost::shared_ptr cell(idx_type) const; + shared_ptr cell(idx_type) const; /// - boost::shared_ptr cell(idx_type); + shared_ptr cell(idx_type); /// Text * getText(int) const; @@ -844,7 +849,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 updateLabels(ParIterator const &, UpdateType); + void updateBuffer(ParIterator const &, UpdateType); /// void addToToc(DocIterator const &); @@ -870,9 +875,9 @@ public: virtual bool usePlainLayout() const { return true; } /// - virtual InsetTabular * asInsetTabular() { return this; } + InsetTabular * asInsetTabular() { return this; } /// - virtual InsetTabular const * asInsetTabular() const { return this; } + InsetTabular const * asInsetTabular() const { return this; } /// bool isRightToLeft(Cursor & cur) const; /// writes the cells between stidx and enidx as a string, optionally @@ -899,8 +904,8 @@ private: Inset * clone() const { return new InsetTabular(*this); } /// - void drawCellLines(frontend::Painter &, int x, int y, row_type row, - idx_type cell, Change const & change) const; + void drawCellLines(PainterInfo &, int x, int y, row_type row, + idx_type cell) const; /// void setCursorFromCoordinates(Cursor & cur, int x, int y) const; @@ -915,8 +920,6 @@ private: /// void resetPos(Cursor & cur) const; /// - void removeTabularRow(); - /// bool copySelection(Cursor & cur); /// bool pasteClipboard(Cursor & cur); @@ -949,6 +952,9 @@ private: std::string const featureAsString(Tabular::Feature feature); +/// Split cell on decimal symbol +InsetTableCell splitCell(InsetTableCell & head, docstring const decimal_sym, bool & hassep); + } // namespace lyx #endif // INSET_TABULAR_H