X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetTabular.h;h=87114ec367bb23cf0d668c2f28a8ff44c59e71ef;hb=79cf3f5ec1088e7de988e889247ec300d42fb70b;hp=c989c3464865750cafc34456af4af0334064e5ae;hpb=fadde98eb3423ead6800291341787c48a3670ef9;p=lyx.git diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index c989c34648..87114ec367 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -10,6 +10,7 @@ * \author Jürgen Vigna * \author Edwin Leuven * \author Uwe Stöhr + * \author Scott Kostyshak * * Full author contact details are available in file CREDITS. */ @@ -23,16 +24,15 @@ #ifndef INSET_TABULAR_H #define INSET_TABULAR_H -#include "Inset.h" #include "InsetText.h" -#include "Layout.h" #include "Length.h" -#include "support/shared_ptr.h" - +#include #include +#include #include + namespace lyx { class Buffer; @@ -56,30 +56,40 @@ public: /// InsetCode lyxCode() const { return CELL_CODE; } /// - Inset * clone() { return new InsetTableCell(*this); } + Inset * clone() const { return new InsetTableCell(*this); } /// bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const; /// void toggleFixedWidth(bool fw) { isFixedWidth = fw; } /// + void toggleMultiCol(bool m) { isMultiColumn = m; } + /// + void toggleMultiRow(bool m) { isMultiRow = m; } + /// 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; + /// + void metrics(MetricsInfo &, Dimension &) 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 + // These booleans are supposed to track whether the cell has had its + // width explicitly set and whether it is part of a multicolumn, respectively. + // 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 + // 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 @@ -89,16 +99,20 @@ private: // 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 + // 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 + // 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; + /// + bool isMultiColumn; + /// + bool isMultiRow; // FIXME: Here the thoughts from the comment above also apply. /// LyXAlignment contentAlign; @@ -108,12 +122,16 @@ private: 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? + bool allowMultiPar() const { return !isMultiRow && (!isMultiColumn || isFixedWidth); } }; @@ -137,6 +155,14 @@ public: /// COPY_COLUMN, /// + MOVE_COLUMN_RIGHT, + /// + MOVE_COLUMN_LEFT, + /// + MOVE_ROW_DOWN, + /// + MOVE_ROW_UP, + /// SET_LINE_TOP, /// SET_LINE_BOTTOM, @@ -193,10 +219,14 @@ public: /// UNSET_MULTIROW, /// + SET_MROFFSET, + /// SET_ALL_LINES, /// UNSET_ALL_LINES, /// + TOGGLE_LONGTABULAR, + /// SET_LONGTABULAR, /// UNSET_LONGTABULAR, @@ -205,6 +235,8 @@ public: /// SET_MPWIDTH, /// + TOGGLE_VARWIDTH_COLUMN, + /// SET_ROTATE_TABULAR, /// UNSET_ROTATE_TABULAR, @@ -232,6 +264,7 @@ public: UNSET_LTLASTFOOT, /// SET_LTNEWPAGE, + UNSET_LTNEWPAGE, /// TOGGLE_LTCAPTION, /// @@ -243,7 +276,7 @@ public: /// SET_SPECIAL_MULTICOLUMN, /// - SET_SPECIAL_MULTIROW, + TOGGLE_BOOKTABS, /// SET_BOOKTABS, /// @@ -271,6 +304,8 @@ public: /// SET_DECIMAL_POINT, /// + SET_TABULAR_WIDTH, + /// LAST_ACTION }; /// @@ -295,7 +330,7 @@ public: LYX_VALIGN_MIDDLE = 1, /// LYX_VALIGN_BOTTOM = 2 - + }; /// enum HAlignment { @@ -313,7 +348,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 { @@ -403,10 +463,18 @@ 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 toggleVarwidth(idx_type, bool const); + /// + bool setMROffset(Cursor &, idx_type, Length const &); + /// void setAlignSpecial(idx_type cell, docstring const & special, Feature what); /// @@ -415,24 +483,37 @@ 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 getMROffset(idx_type cell) const; + /// int textHOffset(idx_type cell) const; /// int textVOffset(idx_type cell) const; /// - void appendRow(idx_type cell); + void appendRow(row_type row); /// void deleteRow(row_type row); /// - void copyRow(row_type); + void copyRow(row_type row); + /// + void insertRow(row_type row, bool copy); /// - void appendColumn(idx_type cell); + void moveColumn(col_type col, ColDirection direction); + /// + 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); + /// + void insertColumn(col_type column, bool copy); /// idx_type getFirstCellInRow(row_type row) const; /// @@ -444,19 +525,26 @@ public: /// void read(Lexer &); /// - int latex(odocstream &, OutputParams const &) const; + void latex(otexstream &, OutputParams const &) const; /// int docbook(odocstream & os, OutputParams const &) const; /// docstring xhtml(XHTMLStream & os, OutputParams const &) const; /// - void plaintext(odocstream &, + 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; /// - idx_type setMultiColumn(idx_type cell, idx_type number); + bool hasMultiColumn(col_type cell) const; + /// + bool hasVarwidthColumn() const; + /// + bool isVTypeColumn(col_type cell) const; + /// + idx_type setMultiColumn(Cursor & cur, idx_type cell, idx_type number, + bool const right_border); /// void unsetMultiColumn(idx_type cell); /// @@ -466,7 +554,11 @@ public: /// bool isMultiRow(idx_type cell) const; /// - idx_type setMultiRow(idx_type cell, idx_type number); + bool hasMultiRow(row_type r) const; + /// + idx_type setMultiRow(Cursor & cur, idx_type cell, idx_type number, + bool const bottom_border, + LyXAlignment const halign); /// void unsetMultiRow(idx_type cell); /// @@ -474,9 +566,9 @@ public: /// 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; /// @@ -485,7 +577,9 @@ public: 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); @@ -494,8 +588,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; @@ -512,38 +604,48 @@ public: /// bool getLTNewPage(row_type row) const; /// - idx_type setLTCaption(row_type row, bool what); + idx_type setLTCaption(Cursor & cur, row_type row, bool what); /// bool ltCaption(row_type row) const; /// - bool haveLTHead() const; + bool haveLTHead(bool withcaptions = true) const; /// - bool haveLTFirstHead() const; + bool haveLTFirstHead(bool withcaptions = true) const; /// - bool haveLTFoot() const; + bool haveLTFoot(bool withcaptions = true) const; /// - bool haveLTLastFoot() const; + bool haveLTLastFoot(bool withcaptions = true) const; /// - bool haveLTCaption() const; + bool haveLTCaption(CaptionType captiontype = CAPTION_ANY) const; /// // end longtable support - /// - shared_ptr cellInset(idx_type cell) const; - /// - shared_ptr cellInset(row_type row, - col_type column) const; + + //@{ + /// 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, - shared_ptr) const; + std::shared_ptr); /// Search for \param inset in the tabular, with the /// void validate(LaTeXFeatures &) const; -//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. + + //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: @@ -552,9 +654,7 @@ public: /// CellData(CellData const &); /// - CellData & operator=(CellData); - /// - void swap(CellData & rhs); + CellData & operator=(CellData const &); /// idx_type cellno; /// @@ -564,6 +664,8 @@ public: /// int multirow; /// + Length mroffset; + /// LyXAlignment alignment; /// VAlignment valignment; @@ -584,15 +686,18 @@ public: /// BoxType usebox; /// - bool rotate; + int rotate; /// docstring align_special; /// Length p_width; // this is only set for multicolumn!!! /// - shared_ptr inset; + std::shared_ptr inset; }; - CellData & cellInfo(idx_type cell) const; + /// + CellData const & cellInfo(idx_type cell) const; + /// + CellData & cellInfo(idx_type cell); /// typedef std::vector cell_vector; /// @@ -653,6 +758,8 @@ public: docstring align_special; /// docstring decimal_point; + /// + bool varwidth; }; /// typedef std::vector column_vector; @@ -668,11 +775,13 @@ 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; // @@ -698,53 +807,59 @@ public: /// bool setFixedWidth(row_type r, col_type c); /// return true of update is needed - bool updateColumnWidths(); + bool updateColumnWidths(MetricsInfo & mi); /// idx_type columnSpan(idx_type cell) const; /// idx_type rowSpan(idx_type cell) const; /// - BoxType useParbox(idx_type cell) const; + BoxType useBox(idx_type cell) const; /// - // helper function for Latex returns number of newlines + // helper function for Latex /// - int TeXTopHLine(odocstream &, row_type row, std::string const lang) const; + void TeXTopHLine(otexstream &, row_type row, std::string const & lang, + std::list) const; /// - int TeXBottomHLine(odocstream &, row_type row, std::string const lang) const; + void TeXBottomHLine(otexstream &, row_type row, std::string const & lang, + std::list) const; /// - int TeXCellPreamble(odocstream &, idx_type cell, bool & ismulticol, bool & ismultirow) const; + void TeXCellPreamble(otexstream &, idx_type cell, bool & ismulticol, bool & ismultirow, + bool const bidi) const; /// - int TeXCellPostamble(odocstream &, idx_type cell, bool ismulticol, bool ismultirow) 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 &) const; + docstring xhtmlRow(XHTMLStream & xs, row_type, OutputParams const &, + bool header = false) const; /// change associated Buffer void setBuffer(Buffer & buffer); /// retrieve associated Buffer - Buffer & buffer() const { return *buffer_; } + Buffer const & buffer() const { return *buffer_; } + /// retrieve associated Buffer + Buffer & buffer() { return *buffer_; } private: Buffer * buffer_; @@ -778,6 +893,8 @@ public: /// void drawSelection(PainterInfo & pi, int x, int y) const; /// + void drawBackground(PainterInfo & pi, int x, int y) const; + /// bool editable() const { return true; } /// bool hasSettings() const { return true; } @@ -787,16 +904,23 @@ public: 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; /// - 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; /// @@ -806,21 +930,23 @@ public: /// InsetCode lyxCode() const { return TABULAR_CODE; } /// - docstring contextMenu(BufferView const & bv, int x, int y) const; + 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()); /// number of cells size_t nargs() const { return tabular.numberofcells; } /// - shared_ptr cell(idx_type) const; + std::shared_ptr cell(idx_type) const; /// - shared_ptr cell(idx_type); + std::shared_ptr cell(idx_type); /// Text * getText(int) const; @@ -854,7 +980,8 @@ public: /// Update the counters of this inset and of its contents void updateBuffer(ParIterator const &, UpdateType); /// - void addToToc(DocIterator const &); + void addToToc(DocIterator const & di, bool output_active, + UpdateType utype, TocBackend & backend) const; /// bool completionSupported(Cursor const &) const; @@ -876,6 +1003,9 @@ public: 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; } @@ -889,6 +1019,8 @@ public: /// 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 /// @@ -900,12 +1032,20 @@ 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); } + /// + 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; + /// void drawCellLines(PainterInfo &, int x, int y, row_type row, idx_type cell) const; @@ -913,7 +1053,7 @@ private: void setCursorFromCoordinates(Cursor & cur, int x, int y) const; /// - void moveNextCell(Cursor & cur, + void moveNextCell(Cursor & cur, EntryDirection entry_from = ENTRY_DIRECTION_IGNORE); /// void movePrevCell(Cursor & cur, @@ -921,7 +1061,7 @@ private: /// int cellXPos(idx_type cell) const; /// - void resetPos(Cursor & cur) const; + int cellYPos(idx_type cell) const; /// bool copySelection(Cursor & cur); /// @@ -939,14 +1079,11 @@ private: /// 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_; + /// true when selecting rows with the mouse bool rowselect_; /// true when selecting columns with the mouse @@ -956,7 +1093,7 @@ private: std::string const featureAsString(Tabular::Feature feature); /// Split cell on decimal symbol -InsetTableCell splitCell(InsetTableCell & head, docstring const decimal_sym, bool & hassep); +InsetTableCell splitCell(InsetTableCell & head, docstring const & decimal_sym, bool & hassep); } // namespace lyx