X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetTabular.h;h=ddb02763fcb2a5e409156c77a36dba56eac5170d;hb=71b8019d56142397994e0ef2d4244ada51f199d5;hp=9f7ed5bb23e9641fd519f37c099628dff499f67a;hpb=ed58c7dcd9a68b6a9f69db24bc2127b403f00579;p=lyx.git diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index 9f7ed5bb23..ddb02763fc 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -4,68 +4,129 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Jürgen Vigna - * \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 + * \author Scott Kostyshak * * 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 -#ifndef INSETTABULAR_H -#define INSETTABULAR_H - -#include "Inset.h" #include "InsetText.h" -#include "Layout.h" #include "Length.h" -#include "MailInset.h" - -#include +#include #include +#include #include + namespace lyx { -class FuncStatus; -class Lexer; -class BufferView; class Buffer; -class BufferParams; -class Paragraph; +class BufferView; class CompletionList; +class Cursor; class CursorSlice; - -namespace frontend { class Painter; } +class FuncStatus; +class Lexer; +class OutputParams; +class Paragraph; +class XHTMLStream; -class InsetTabular; -class Cursor; -class OutputParams; +/// +class InsetTableCell : public InsetText +{ +public: + /// + InsetTableCell(Buffer * buf); + /// + InsetCode lyxCode() const { return CELL_CODE; } + /// + Inset * clone() const { 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; + /// + void addToToc(DocIterator const & di, bool output_active, + UpdateType utype, TocBackend & backend) 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; + /// + 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; } +}; -typedef InsetText InsetTableCell; // // A helper struct for tables @@ -87,12 +148,28 @@ public: /// COPY_COLUMN, /// - TOGGLE_LINE_TOP, + MOVE_COLUMN_RIGHT, /// - TOGGLE_LINE_BOTTOM, + MOVE_COLUMN_LEFT, /// - TOGGLE_LINE_LEFT, + MOVE_ROW_DOWN, + /// + MOVE_ROW_UP, + /// + SET_LINE_TOP, + /// + SET_LINE_BOTTOM, + /// + 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, @@ -103,6 +180,8 @@ public: /// ALIGN_BLOCK, /// + ALIGN_DECIMAL, + /// VALIGN_TOP, /// VALIGN_BOTTOM, @@ -123,10 +202,24 @@ public: /// MULTICOLUMN, /// + SET_MULTICOLUMN, + /// + UNSET_MULTICOLUMN, + /// + MULTIROW, + /// + SET_MULTIROW, + /// + UNSET_MULTIROW, + /// + SET_MROFFSET, + /// SET_ALL_LINES, /// UNSET_ALL_LINES, /// + TOGGLE_LONGTABULAR, + /// SET_LONGTABULAR, /// UNSET_LONGTABULAR, @@ -162,10 +255,19 @@ public: UNSET_LTLASTFOOT, /// SET_LTNEWPAGE, + UNSET_LTNEWPAGE, + /// + TOGGLE_LTCAPTION, + /// + SET_LTCAPTION, + /// + UNSET_LTCAPTION, /// SET_SPECIAL_COLUMN, /// - SET_SPECIAL_MULTI, + SET_SPECIAL_MULTICOLUMN, + /// + TOGGLE_BOOKTABS, /// SET_BOOKTABS, /// @@ -179,6 +281,24 @@ 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, + /// + SET_TABULAR_WIDTH, + /// + SET_INNER_LINES, + /// LAST_ACTION }; /// @@ -188,7 +308,11 @@ public: /// CELL_BEGIN_OF_MULTICOLUMN, /// - CELL_PART_OF_MULTICOLUMN + CELL_PART_OF_MULTICOLUMN, + /// + CELL_BEGIN_OF_MULTIROW, + /// + CELL_PART_OF_MULTIROW }; /// @@ -196,9 +320,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_VALIGN_MIDDLE = 2 + LYX_LONGTABULAR_ALIGN_CENTER = 1, + /// + LYX_LONGTABULAR_ALIGN_RIGHT = 2 }; enum BoxType { @@ -207,7 +341,32 @@ public: /// BOX_PARBOX = 1, /// - BOX_MINIPAGE = 2 + BOX_MINIPAGE = 2, + /// + BOX_VARWIDTH = 3 + }; + + enum CaptionType { + /// + CAPTION_FIRSTHEAD, + /// + CAPTION_HEAD, + /// + CAPTION_FOOT, + /// + CAPTION_LASTFOOT, + /// + CAPTION_ANY + }; + + enum RowDirection { + UP, + DOWN + }; + + enum ColDirection { + RIGHT, + LEFT }; class ltType { @@ -236,40 +395,41 @@ public: static const idx_type npos = static_cast(-1); /// constructor - Tabular(); - /// 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; /// 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; - - /// - bool topAlreadyDrawn(idx_type cell) const; - /// - bool leftAlreadyDrawn(idx_type cell) const; - /// - bool isLastRow(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; /// 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; @@ -278,10 +438,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); @@ -304,10 +460,16 @@ public: void setVAlignment(idx_type cell, VAlignment align, bool onlycolumn = false); /// + void setTabularWidth(Length const & l) { tabular_width = l; } + /// + Length tabularWidth() const { return tabular_width; } + /// void setColumnPWidth(Cursor &, idx_type, Length const &); /// bool setMColumnPWidth(Cursor &, idx_type, Length const &); /// + bool setMROffset(Cursor &, idx_type, Length const &); + /// void setAlignSpecial(idx_type cell, docstring const & special, Feature what); /// @@ -316,95 +478,99 @@ public: /// VAlignment getVAlignment(idx_type cell, bool onlycolumn = false) const; + /// The vertical offset of the table due to the vertical + /// alignment with respect to the baseline. + int offsetVAlignment() const; /// Length const getPWidth(idx_type cell) const; /// - Length const getColumnPWidth(idx_type cell) const; + Length const getMROffset(idx_type cell) const; /// - Length const getMColumnPWidth(idx_type cell) const; + int textHOffset(idx_type cell) const; /// - docstring const getAlignSpecial(idx_type cell, int what) const; + int textVOffset(idx_type cell) const; /// - int cellWidth(idx_type cell) const; + void appendRow(row_type row); /// - int getBeginningOfTextInCell(idx_type cell) const; + void deleteRow(row_type row); /// - void appendRow(idx_type cell); + void copyRow(row_type row); /// - void deleteRow(row_type row); + void insertRow(row_type row, bool copy); /// - void copyRow(row_type); + void moveColumn(col_type col, ColDirection direction); /// - void appendColumn(idx_type cell); + void moveRow(row_type row, RowDirection direction); + /// + void appendColumn(col_type column); /// void deleteColumn(col_type column); /// - void copyColumn(col_type); + void copyColumn(col_type column); /// - bool isFirstCellInRow(idx_type cell) const; + void insertColumn(col_type column, bool copy); /// idx_type getFirstCellInRow(row_type row) const; /// - bool isLastCellInRow(idx_type cell) const; - /// idx_type getLastCellInRow(row_type row) const; /// - idx_type cellCount() 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; - // + void latex(otexstream &, OutputParams const &) const; + /// int docbook(odocstream & os, OutputParams const &) const; /// - void plaintext(odocstream &, + docstring xhtml(XHTMLStream & os, OutputParams const &) const; + /// + void plaintext(odocstringstream &, OutputParams const & runparams, int const depth, - bool onlydata, char_type delim) const; + bool onlydata, char_type delim, size_t max_length = INT_MAX) const; /// bool isMultiColumn(idx_type cell) const; /// - bool isMultiColumnReal(idx_type cell) const; + bool hasMultiColumn(col_type cell) const; /// - void setMultiColumn(idx_type cell, idx_type number); + idx_type setMultiColumn(idx_type cell, idx_type number, + bool const right_border); /// - 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; /// - row_type cellRow(idx_type cell) const; + bool isPartOfMultiRow(row_type row, col_type column) const; /// - col_type cellColumn(idx_type cell) const; - /// - col_type cellRightColumn(idx_type cell) const; - /// - void setBookTabs(bool); + bool isMultiRow(idx_type cell) const; /// - bool useBookTabs() const; + bool hasMultiRow(row_type r) const; /// - void setLongTabular(bool); + idx_type setMultiRow(idx_type cell, idx_type number, + bool const bottom_border, + LyXAlignment const halign); /// - bool isLongTabular() const; + void unsetMultiRow(idx_type cell); /// - void setRotateTabular(bool); + row_type cellRow(idx_type cell) const; /// - bool getRotateTabular() const; + col_type cellColumn(idx_type cell) const; /// - void setRotateCell(idx_type cell, bool); + void setRotateCell(idx_type cell, int); /// - bool getRotateCell(idx_type cell) const; + int getRotateCell(idx_type cell) const; /// bool needRotating() const; /// bool isLastCell(idx_type cell) const; /// - idx_type getCellAbove(idx_type cell) const; - /// - idx_type getCellBelow(idx_type cell) const; + idx_type cellAbove(idx_type cell) const; /// + idx_type cellBelow(idx_type cell) const; + /// \return the index of the VISIBLE cell at row, column + /// this will be the same as the cell in the previous row, + /// e.g., if the cell is part of a multirow idx_type cellIndex(row_type row, col_type column) const; /// void setUsebox(idx_type cell, BoxType); @@ -413,8 +579,6 @@ public: // // Long Tabular Options support functions /// - bool checkLTType(row_type row, ltType const &) const; - /// void setLTHead(row_type row, bool flag, ltType const &, bool first); /// bool getRowOfLTHead(row_type row, ltType &) const; @@ -431,45 +595,57 @@ public: /// bool getLTNewPage(row_type row) const; /// - bool haveLTHead() const; + idx_type setLTCaption(row_type row, bool what); /// - bool haveLTFirstHead() const; + bool ltCaption(row_type row) const; /// - bool haveLTFoot() const; + bool haveLTHead(bool withcaptions = true) const; /// - bool haveLTLastFoot() const; + bool haveLTFirstHead(bool withcaptions = true) const; /// - // end longtable support + bool haveLTFoot(bool withcaptions = true) const; + /// + bool haveLTLastFoot(bool withcaptions = true) const; /// - boost::shared_ptr getCellInset(idx_type cell) const; + bool haveLTCaption(CaptionType captiontype = CAPTION_ANY) const; /// - boost::shared_ptr getCellInset(row_type row, - col_type column) const; + // end longtable support + + //@{ + /// there is a subtle difference between these two methods. + /// cellInset(r,c); + /// and + /// cellInset(cellIndex(r,c)); + /// 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. + std::shared_ptr cellInset(idx_type cell); + std::shared_ptr cellInset(row_type row, col_type column); + InsetTableCell const * cellInset(idx_type cell) const; + //@} /// void setCellInset(row_type row, col_type column, - boost::shared_ptr) const; + std::shared_ptr); /// Search for \param inset in the tabular, with the /// - idx_type getCellFromInset(Inset const * inset) const; - /// - row_type rowCount() const { return row_info.size(); } - /// - col_type columnCount() const { return column_info.size();} - /// void validate(LaTeXFeatures &) const; - /// -//private: + + //private: + // FIXME Now that cells have an InsetTableCell as their insets, rather + // than an InsetText, it'd be possible to reverse the relationship here, + // so that cell_vector was a vector rather than a + // vector, and an InsetTableCell had a CellData as a member, + // or perhaps just had its members as members. /// class CellData { public: /// - CellData(Buffer const &); + CellData(Buffer *); /// CellData(CellData const &); /// - CellData & operator=(CellData); - /// - void swap(CellData & rhs); + CellData & operator=(CellData const &); /// idx_type cellno; /// @@ -477,9 +653,19 @@ public: /// int multicolumn; /// + int multirow; + /// + Length mroffset; + /// 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; /// @@ -491,15 +677,18 @@ public: /// BoxType usebox; /// - bool rotate; + int rotate; /// docstring align_special; /// Length p_width; // this is only set for multicolumn!!! /// - boost::shared_ptr inset; + std::shared_ptr inset; }; - CellData & cellinfo_of_cell(idx_type cell) const; + /// + CellData const & cellInfo(idx_type cell) const; + /// + CellData & cellInfo(idx_type cell); /// typedef std::vector cell_vector; /// @@ -514,10 +703,6 @@ public: int ascent; /// int descent; - /// - bool top_line; - /// - bool bottom_line; /// Extra space between the top line and this row Length top_space; /// Ignore top_space if true and use the default top space @@ -541,6 +726,8 @@ public: bool endlastfoot; /// row for a newpage bool newpage; + /// caption + bool caption; }; /// typedef std::vector row_vector; @@ -555,15 +742,13 @@ public: /// VAlignment valignment; /// - bool left_line; - /// - bool right_line; - /// int width; /// Length p_width; /// docstring align_special; + /// + docstring decimal_point; }; /// typedef std::vector column_vector; @@ -579,13 +764,19 @@ public: /// column_vector column_info; /// - mutable cell_vvector cell_info; + cell_vvector cell_info; + /// + Length tabular_width; /// bool use_booktabs; /// - bool rotate; + int rotate; + /// + VAlignment tabular_valignment; // // for long tabulars + /// + HAlignment longtabular_alignment; // bool is_long_tabular; /// endhead data @@ -598,78 +789,89 @@ public: ltType endlastfoot; /// - void init(Buffer const &, row_type rows_arg, + void init(Buffer *, row_type rows_arg, col_type columns_arg); /// void updateIndexes(); - /// Returns true if a complete update is necessary, otherwise false - bool setWidthOfMulticolCell(idx_type cell, int new_width); - /// - void recalculateMulticolumnsOfColumn(col_type column); - /// Returns true if change - void calculate_width_of_column(col_type column); /// - bool calculate_width_of_column_NMC(col_type column); // no multi cells + bool setFixedWidth(row_type r, col_type c); + /// return true of update is needed + bool updateColumnWidths(); /// 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 + // helper function for Latex /// - int TeXTopHLine(odocstream &, row_type row) const; + void TeXTopHLine(otexstream &, row_type row, std::string const & lang, + std::list) const; /// - int TeXBottomHLine(odocstream &, row_type row) const; + void TeXBottomHLine(otexstream &, row_type row, std::string const & lang, + std::list) const; /// - int TeXCellPreamble(odocstream &, idx_type cell) const; + void TeXCellPreamble(otexstream &, idx_type cell, bool & ismulticol, bool & ismultirow, + bool const bidi) const; /// - int TeXCellPostamble(odocstream &, idx_type cell) const; + void TeXCellPostamble(otexstream &, idx_type cell, bool ismulticol, bool ismultirow) const; /// - int TeXLongtableHeaderFooter(odocstream &, OutputParams const &) const; + void TeXLongtableHeaderFooter(otexstream &, OutputParams const &, std::list) const; /// bool isValidRow(row_type const row) const; /// - int TeXRow(odocstream &, row_type const row, - OutputParams const &) const; + void TeXRow(otexstream &, row_type const row, + OutputParams const &, std::list) const; /// // helper functions for plain text /// - bool plaintextTopHLine(odocstream &, row_type row, + bool plaintextTopHLine(odocstringstream &, row_type row, std::vector const &) const; /// - bool plaintextBottomHLine(odocstream &, row_type row, + bool plaintextBottomHLine(odocstringstream &, row_type row, std::vector const &) const; /// - void plaintextPrintCell(odocstream &, + void plaintextPrintCell(odocstringstream &, OutputParams const &, idx_type cell, row_type row, col_type column, std::vector const &, - bool onlydata) 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 &, + bool header = false) const; /// change associated Buffer - void setBuffer(Buffer const & buffer) { buffer_ = &buffer; } + void setBuffer(Buffer & buffer); /// retrieve associated Buffer Buffer const & buffer() const { return *buffer_; } + /// retrieve associated Buffer + Buffer & buffer() { return *buffer_; } private: - Buffer const * buffer_; - - /// renumber cells after structural changes - void fixCellNums(); -}; + Buffer * buffer_; +}; // Tabular -class InsetTabular : public Inset { +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 &); + /// + static std::string params2string(InsetTabular const &); + /// void read(Lexer &); /// void write(std::ostream &) const; @@ -680,69 +882,79 @@ public: /// void drawSelection(PainterInfo & pi, int x, int y) const; /// - docstring editMessage() const; + void drawBackground(PainterInfo & pi, int x, int y) const; + /// + bool editable() const { return true; } /// - EDITABLE editable() const { return HIGHLY_EDITABLE; } + bool hasSettings() const { return true; } /// bool insetAllowed(InsetCode code) const; /// bool allowSpellCheck() const { return true; } /// bool canTrackChanges() const { return true; } - /** returns true if, when outputing LaTeX, font changes should + /// + bool canPaintChange(BufferView const &) const { return true; } + /** returns false if, when outputing LaTeX, font changes should be closed before generating this inset. This is needed for insets that may contain several paragraphs */ - bool noFontChange() const { return true; } + bool inheritFont() const { return false; } + /// + bool allowsCaptionVariation(std::string const &) const; + // + bool isTable() const { return true; } /// - DisplayType display() const { return tabular.isLongTabular() ? AlignCenter : Inline; } + DisplayType display() const; /// - int latex(odocstream &, OutputParams const &) const; + void latex(otexstream &, OutputParams const &) const; /// - int plaintext(odocstream &, OutputParams const &) const; + int plaintext(odocstringstream & ods, OutputParams const & op, + size_t max_length = INT_MAX) const; /// int docbook(odocstream &, OutputParams const &) const; /// + docstring xhtml(XHTMLStream &, OutputParams const &) const; + /// void validate(LaTeXFeatures & features) const; /// InsetCode lyxCode() const { return TABULAR_CODE; } + /// + std::string contextMenu(BufferView const &, int, int) const; + /// + std::string contextMenuName() const; /// 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 tabularFeatures(Cursor & cur, std::string const & what); - /// + /// 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()); - /// - void openLayoutDialog(BufferView *) const; - /// - bool showInsetDialog(BufferView *) const; /// number of cells - size_t nargs() const { return tabular.cellCount(); } + size_t nargs() const { return tabular.numberofcells; } /// - boost::shared_ptr cell(idx_type) const; + std::shared_ptr cell(idx_type) const; /// - boost::shared_ptr cell(idx_type); + std::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! /// should all paragraphs be output with "Standard" layout? virtual bool allowParagraphCustomization(idx_type cell = 0) const; /// - virtual bool forceEmptyLayout(idx_type cell = 0) const; - /// - virtual bool useEmptyLayout() { return true; } + virtual bool forcePlainLayout(idx_type cell = 0) const; /// - 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); @@ -753,9 +965,12 @@ 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 & di, bool output_active, + UpdateType utype, TocBackend & backend) const; /// bool completionSupported(Cursor const &) const; @@ -775,7 +990,26 @@ 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; } + /// + docstring layoutName() const { return from_ascii("Tabular"); } + + /// + InsetTabular * asInsetTabular() { 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; + /// + void setLayoutForHiddenCells(DocumentClass const & dc); // // Public structures and variables /// @@ -787,28 +1021,36 @@ private: /// void doDispatch(Cursor & cur, FuncRequest & cmd); /// - bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const; + bool getFeatureStatus(Cursor & cur, std::string const & s, + std::string const & argument, FuncStatus & status) const; /// - int scroll() const { return scx_; } + bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const; /// Inset * clone() const { return new InsetTabular(*this); } /// - void drawCellLines(frontend::Painter &, int x, int y, row_type row, - idx_type cell, bool erased) const; + bool hitSelectRow(BufferView const & bv, int x) const; /// - void setCursorFromCoordinates(Cursor & cur, int x, int y) 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; /// - void moveNextCell(Cursor & cur); + void drawCellLines(PainterInfo &, int x, int y, row_type row, + idx_type cell) const; + /// + void setCursorFromCoordinates(Cursor & cur, int x, int y) const; + /// - void movePrevCell(Cursor & cur); + void moveNextCell(Cursor & cur, + EntryDirection entry_from = ENTRY_DIRECTION_IGNORE); /// - int getCellXPos(idx_type cell) const; + void movePrevCell(Cursor & cur, + EntryDirection entry_from = ENTRY_DIRECTION_IGNORE); /// - void resetPos(Cursor & cur) const; + int cellXPos(idx_type cell) const; /// - void removeTabularRow(); + int cellYPos(idx_type cell) const; /// bool copySelection(Cursor & cur); /// @@ -816,54 +1058,32 @@ private: /// void cutSelection(Cursor & cur); /// - bool isRightToLeft(Cursor & cur) const; - /// void getSelection(Cursor & cur, row_type & rs, row_type & re, 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; /// return the cell nearest to x, y idx_type getNearestCell(BufferView &, int x, int y) const; - /// test the rotation state of the give cell range. + /// test the rotation state of the given cell range. bool oneCellHasRotationState(bool rotated, row_type row_start, row_type row_end, col_type col_start, col_type col_end) const; - /// - mutable idx_type first_visible_cell; - /// - mutable int scx_; -}; - -class InsetTabularMailer : public MailInset { -public: - /// - InsetTabularMailer(InsetTabular const & inset); - /// - virtual Inset & inset() const { return inset_; } - /// - virtual std::string const & name() const { return name_; } - /// - virtual std::string const inset2string(Buffer const &) const; - /// - static void string2params(std::string const &, InsetTabular &); - /// - static std::string const params2string(InsetTabular const &); -private: - /// - static std::string const name_; - /// - InsetTabular & inset_; + /// true when selecting rows with the mouse + bool rowselect_; + /// true when selecting columns with the mouse + bool colselect_; }; 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 +#endif // INSET_TABULAR_H