X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetTabular.h;h=96db31a934a7be437137145ef5374f3cf9f191e9;hb=2203d7aa0a8e9d64666498fb26eb17f699c2f52b;hp=5cf3d7eb3deac7915b087557c3fca708638e2646;hpb=7e3ebd9864b81b050dc56a212fde9b699716ebbb;p=lyx.git diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index 5cf3d7eb3d..96db31a934 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -4,34 +4,22 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * \author Matthias Ettrich - * \author André Pönitz - * \author Jürgen Vigna + * \author André Pönitz + * \author Jürgen Vigna + * \author Edwin Leuven + * \author Uwe Stöhr * * Full author contact details are available in file CREDITS. */ - -// This is Juergen's rewrite of the tabular (table) support. - // Things to think of when designing the new tabular support: // - color support (colortbl, color) // - decimal alignment (dcloumn) // - custom lines (hhline) -// - rotation -// - multicolumn -// - multirow // - column styles -// This is what I have written about tabular support in the LyX3-Tasks file: -// -// o rewrite of table code. Should probably be written as some -// kind of an inset. [Done] -// o enhance longtable support - -// Lgb - #ifndef INSET_TABULAR_H #define INSET_TABULAR_H @@ -40,7 +28,7 @@ #include "Layout.h" #include "Length.h" -#include +#include "support/shared_ptr.h" #include #include @@ -48,7 +36,6 @@ namespace lyx { class Buffer; -class BufferParams; class BufferView; class CompletionList; class CursorSlice; @@ -56,6 +43,7 @@ class InsetTableCell; class FuncStatus; class Lexer; class Paragraph; +class XHTMLStream; namespace frontend { class Painter; } @@ -84,12 +72,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, @@ -100,6 +96,8 @@ public: /// ALIGN_BLOCK, /// + ALIGN_DECIMAL, + /// VALIGN_TOP, /// VALIGN_BOTTOM, @@ -120,6 +118,8 @@ public: /// MULTICOLUMN, /// + MULTIROW, + /// SET_ALL_LINES, /// UNSET_ALL_LINES, @@ -164,7 +164,9 @@ public: /// SET_SPECIAL_COLUMN, /// - SET_SPECIAL_MULTI, + SET_SPECIAL_MULTICOLUMN, + /// + SET_SPECIAL_MULTIROW, /// SET_BOOKTABS, /// @@ -178,6 +180,20 @@ public: /// SET_BORDER_LINES, /// + TABULAR_VALIGN_TOP, + /// + TABULAR_VALIGN_MIDDLE, + /// + TABULAR_VALIGN_BOTTOM, + /// + LONGTABULAR_ALIGN_LEFT, + /// + LONGTABULAR_ALIGN_CENTER, + /// + LONGTABULAR_ALIGN_RIGHT, + /// + SET_DECIMAL_POINT, + /// LAST_ACTION }; /// @@ -187,7 +203,11 @@ public: /// CELL_BEGIN_OF_MULTICOLUMN, /// - CELL_PART_OF_MULTICOLUMN + CELL_PART_OF_MULTICOLUMN, + /// + CELL_BEGIN_OF_MULTIROW, + /// + CELL_PART_OF_MULTIROW }; /// @@ -195,9 +215,19 @@ public: /// LYX_VALIGN_TOP = 0, /// - LYX_VALIGN_BOTTOM = 1, + LYX_VALIGN_MIDDLE = 1, + /// + LYX_VALIGN_BOTTOM = 2 + + }; + /// + enum HAlignment { + /// + LYX_LONGTABULAR_ALIGN_LEFT = 0, + /// + LYX_LONGTABULAR_ALIGN_CENTER = 1, /// - LYX_VALIGN_MIDDLE = 2 + LYX_LONGTABULAR_ALIGN_RIGHT = 2 }; enum BoxType { @@ -235,7 +265,7 @@ public: static const idx_type npos = static_cast(-1); /// constructor - Tabular(Buffer const &, col_type columns_arg, row_type rows_arg); + Tabular(Buffer * buf, col_type columns_arg, row_type rows_arg); /// Returns true if there is a topline, returns false if not bool topLine(idx_type cell) const; @@ -246,27 +276,26 @@ 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 getAdditionalHeight(row_type row) const; + int interRowSpace(row_type row) const; /// - int getAdditionalWidth(idx_type cell) const; + int interColumnSpace(idx_type cell) const; /* returns the maximum over all rows */ /// - int columnWidth(idx_type cell) const; + int cellWidth(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; @@ -275,10 +304,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); @@ -316,9 +341,9 @@ public: /// Length const getPWidth(idx_type cell) const; /// - int cellWidth(idx_type cell) const; + int textHOffset(idx_type cell) const; /// - int getBeginningOfTextInCell(idx_type cell) const; + int textVOffset(idx_type cell) const; /// void appendRow(idx_type cell); /// @@ -332,44 +357,46 @@ public: /// void copyColumn(col_type); /// - bool isFirstCellInRow(idx_type cell) const; - /// idx_type getFirstCellInRow(row_type row) const; /// - bool isLastCellInRow(idx_type cell) const; - /// idx_type getLastCellInRow(row_type row) const; /// - idx_type numberOfCellsInRow(idx_type cell) const; + idx_type numberOfCellsInRow(row_type row) const; /// void write(std::ostream &) const; /// void read(Lexer &); /// int latex(odocstream &, OutputParams const &) const; - // + /// int docbook(odocstream & os, OutputParams const &) const; /// + docstring xhtml(XHTMLStream & os, OutputParams const &) const; + /// void plaintext(odocstream &, OutputParams const & runparams, int const depth, bool onlydata, char_type delim) const; /// bool isMultiColumn(idx_type cell) const; /// - bool isMultiColumnReal(idx_type cell) const; + idx_type setMultiColumn(idx_type cell, idx_type number); /// - void setMultiColumn(idx_type cell, idx_type number); - /// - idx_type unsetMultiColumn(idx_type cell); // returns number of new cells + void unsetMultiColumn(idx_type cell); /// bool isPartOfMultiColumn(row_type row, col_type column) const; /// + bool isPartOfMultiRow(row_type row, col_type column) const; + /// + bool isMultiRow(idx_type cell) const; + /// + idx_type setMultiRow(idx_type cell, idx_type number); + /// + void unsetMultiRow(idx_type cell); + /// row_type cellRow(idx_type cell) const; /// 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; @@ -420,15 +447,17 @@ public: /// bool haveLTLastFoot() const; /// + bool haveLTCaption() const; + /// // 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; @@ -442,7 +471,7 @@ public: class CellData { public: /// - CellData(Buffer const &); + CellData(Buffer *); /// CellData(CellData const &); /// @@ -456,9 +485,17 @@ public: /// int multicolumn; /// + int multirow; + /// 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; /// @@ -476,7 +513,7 @@ public: /// Length p_width; // this is only set for multicolumn!!! /// - boost::shared_ptr inset; + shared_ptr inset; }; CellData & cellInfo(idx_type cell) const; /// @@ -537,6 +574,8 @@ public: Length p_width; /// docstring align_special; + /// + docstring decimal_point; }; /// typedef std::vector column_vector; @@ -557,8 +596,12 @@ public: bool use_booktabs; /// bool rotate; + /// + VAlignment tabular_valignment; // // for long tabulars + /// + HAlignment longtabular_alignment; // bool is_long_tabular; /// endhead data @@ -571,7 +614,7 @@ public: ltType endlastfoot; /// - void init(Buffer const &, row_type rows_arg, + void init(Buffer *, row_type rows_arg, col_type columns_arg); /// void updateIndexes(); @@ -582,17 +625,19 @@ public: /// idx_type columnSpan(idx_type cell) const; /// + idx_type rowSpan(idx_type cell) const; + /// BoxType useParbox(idx_type cell) const; /// // helper function for Latex returns number of newlines /// - int TeXTopHLine(odocstream &, row_type row) const; + int TeXTopHLine(odocstream &, row_type row, std::string const lang) const; /// - int TeXBottomHLine(odocstream &, row_type row) const; + int TeXBottomHLine(odocstream &, row_type row, std::string const lang) const; /// - int TeXCellPreamble(odocstream &, idx_type cell, bool & ismulticol) const; + int TeXCellPreamble(odocstream &, idx_type cell, bool & ismulticol, bool & ismultirow) const; /// - int TeXCellPostamble(odocstream &, idx_type cell, bool ismulticol) const; + int TeXCellPostamble(odocstream &, idx_type cell, bool ismulticol, bool ismultirow) const; /// int TeXLongtableHeaderFooter(odocstream &, OutputParams const &) const; /// @@ -616,14 +661,16 @@ public: bool onlydata) const; /// auxiliary function for docbook int docbookRow(odocstream & os, row_type, OutputParams const &) const; + /// + docstring xhtmlRow(XHTMLStream & xs, row_type, OutputParams const &) const; /// change associated Buffer - void setBuffer(Buffer const & buffer) { buffer_ = &buffer; } + void setBuffer(Buffer & buffer); /// retrieve associated Buffer - Buffer const & buffer() const { return *buffer_; } + Buffer & buffer() const { return *buffer_; } private: - Buffer const * buffer_; + Buffer * buffer_; }; // Tabular @@ -633,7 +680,7 @@ class InsetTableCell : public InsetText { public: /// - InsetTableCell(Buffer const & buf); + InsetTableCell(Buffer * buf); /// InsetCode lyxCode() const { return CELL_CODE; } /// @@ -643,6 +690,13 @@ public: 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(); @@ -673,14 +727,21 @@ private: // --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; } }; @@ -688,10 +749,13 @@ class InsetTabular : public Inset { public: /// - InsetTabular(Buffer const &, row_type rows = 1, + InsetTabular(Buffer *, row_type rows = 1, col_type columns = 1); /// ~InsetTabular(); + /// + void setBuffer(Buffer & buffer); + /// static void string2params(std::string const &, InsetTabular &); /// @@ -707,9 +771,9 @@ public: /// void drawSelection(PainterInfo & pi, int x, int y) const; /// - docstring editMessage() const; + bool editable() const { return true; } /// - EDITABLE editable() const { return HIGHLY_EDITABLE; } + bool hasSettings() const { return true; } /// bool insetAllowed(InsetCode code) const; /// @@ -721,7 +785,7 @@ public: insets that may contain several paragraphs */ bool noFontChange() const { return true; } /// - DisplayType display() const { return tabular.is_long_tabular ? AlignCenter : Inline; } + DisplayType display() const; /// int latex(odocstream &, OutputParams const &) const; /// @@ -729,6 +793,8 @@ public: /// int docbook(odocstream &, OutputParams const &) const; /// + docstring xhtml(XHTMLStream &, OutputParams const &) const; + /// void validate(LaTeXFeatures & features) const; /// InsetCode lyxCode() const { return TABULAR_CODE; } @@ -742,25 +808,21 @@ 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; /// set the change for the entire inset void setChange(Change const & change); /// accept the changes within the inset - void acceptChanges(BufferParams const & bparams); + void acceptChanges(); /// reject the changes within the inset - void rejectChanges(BufferParams const & bparams); + void rejectChanges(); // this should return true if we have a "normal" cell, otherwise false. // "normal" means without width set! @@ -769,9 +831,8 @@ public: /// virtual bool forcePlainLayout(idx_type cell = 0) const; /// - virtual bool usePlainLayout() { return true; } - /// - void addPreview(graphics::PreviewLoader &) const; + void addPreview(DocIterator const & inset_pos, + graphics::PreviewLoader &) const; /// lock cell with given index void edit(Cursor & cur, bool front, EntryDirection entry_from); @@ -782,9 +843,11 @@ public: /// Inset * editXY(Cursor & cur, int x, int y); /// can we go further down on mouse click? - bool descendable() const { return true; } - // Update the counters of this inset and of its contents - void updateLabels(ParIterator const &); + bool descendable(BufferView const &) const { return true; } + /// Update the counters of this inset and of its contents + void updateBuffer(ParIterator const &, UpdateType); + /// + void addToToc(DocIterator const &); /// bool completionSupported(Cursor const &) const; @@ -804,14 +867,21 @@ public: bool insertCompletion(Cursor & cur, docstring const & s, bool finished); /// void completionPosAndDim(Cursor const &, int & x, int & y, Dimension & dim) const; + /// + 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 + /// descending into the insets + docstring asString(idx_type stidx, idx_type enidx, bool intoInsets = true); + /// Returns whether the cell in the specified row and column is selected. + bool isCellSelected(Cursor & cur, row_type row, col_type col) const; // // Public structures and variables /// @@ -831,7 +901,7 @@ private: /// void drawCellLines(frontend::Painter &, int x, int y, row_type row, - idx_type cell, bool erased) const; + idx_type cell, Change const & change) const; /// void setCursorFromCoordinates(Cursor & cur, int x, int y) const; @@ -846,8 +916,6 @@ private: /// void resetPos(Cursor & cur) const; /// - void removeTabularRow(); - /// bool copySelection(Cursor & cur); /// bool pasteClipboard(Cursor & cur); @@ -858,8 +926,6 @@ private: col_type & cs, col_type & ce) const; /// bool insertPlaintextString(BufferView &, docstring const & buf, bool usePaste); - /// are we operating on several cells? - bool tablemode(Cursor & cur) const; /// return the "Manhattan distance" to nearest corner int dist(BufferView &, idx_type cell, int x, int y) const; @@ -882,6 +948,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