1 /* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */ 2 3 /* libmwaw 4 * Version: MPL 2.0 / LGPLv2+ 5 * 6 * The contents of this file are subject to the Mozilla Public License Version 7 * 2.0 (the "License"); you may not use this file except in compliance with 8 * the License or as specified alternatively below. You may obtain a copy of 9 * the License at http://www.mozilla.org/MPL/ 10 * 11 * Software distributed under the License is distributed on an "AS IS" basis, 12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 13 * for the specific language governing rights and limitations under the 14 * License. 15 * 16 * Major Contributor(s): 17 * Copyright (C) 2002 William Lachance (wrlach@gmail.com) 18 * Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net) 19 * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch) 20 * Copyright (C) 2006, 2007 Andrew Ziem 21 * Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr) 22 * 23 * 24 * All Rights Reserved. 25 * 26 * For minor contributions see the git repository. 27 * 28 * Alternatively, the contents of this file may be used under the terms of 29 * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"), 30 * in which case the provisions of the LGPLv2+ are applicable 31 * instead of those above. 32 */ 33 34 /* 35 * Structure to store and construct a table from an unstructured list 36 * of cell 37 * 38 */ 39 40 #ifndef MWAW_TABLE 41 # define MWAW_TABLE 42 43 #include <iostream> 44 #include <vector> 45 46 #include "libmwaw_internal.hxx" 47 48 #include "MWAWCell.hxx" 49 50 /** a class used to recreate the table structure using cell informations, .... */ 51 class MWAWTable 52 { 53 public: 54 //! an enum used to indicate what the list of entries which are filled 55 enum DataSet { 56 CellPositionBit=1, BoxBit=2, SizeBit=4, TableDimBit=8, TablePosToCellBit=0x10 57 }; 58 /** an enum do define the table alignment. 59 60 \note Paragraph means using the default alignment, left page alignment and use left margin */ 61 enum Alignment { 62 Paragraph, Left, Center, Right 63 }; 64 //! the constructor MWAWTable(uint32_t givenData=BoxBit)65 explicit MWAWTable(uint32_t givenData=BoxBit) 66 : m_givenData(givenData) 67 , m_setData(givenData) 68 , m_mergeBorders(true) 69 , m_cellsList() 70 , m_numRows(0) 71 , m_numCols(0) 72 , m_rowsSize() 73 , m_colsSize() 74 , m_alignment(Paragraph) 75 , m_leftMargin(0) 76 , m_rightMargin(0) 77 , m_posToCellId() 78 , m_hasExtraLines(false) 79 { 80 } 81 82 //! the destructor 83 virtual ~MWAWTable(); 84 85 //! add a new cells add(std::shared_ptr<MWAWCell> cell)86 void add(std::shared_ptr<MWAWCell> cell) 87 { 88 if (!cell) { 89 MWAW_DEBUG_MSG(("MWAWTable::add: must be called with a cell\n")); 90 return; 91 } 92 m_cellsList.push_back(cell); 93 } 94 //! returns true if we need to merge borders mergeBorders() const95 bool mergeBorders() const 96 { 97 return m_mergeBorders; 98 } 99 //! sets the merge borders' value setMergeBorders(bool val)100 bool setMergeBorders(bool val) 101 { 102 return m_mergeBorders=val; 103 } 104 /** defines the current alignment 105 \note: leftMargin,rightMargin are given in Points */ setAlignment(Alignment align,float leftMargin=0,float rightMargin=0)106 void setAlignment(Alignment align, float leftMargin=0, float rightMargin=0) 107 { 108 m_alignment = align; 109 m_leftMargin = leftMargin; 110 m_rightMargin = rightMargin; 111 } 112 //! returns the number of cell numCells() const113 int numCells() const 114 { 115 return int(m_cellsList.size()); 116 } 117 /** returns the row size if defined (in point) */ getRowsSize() const118 std::vector<float> const &getRowsSize() const 119 { 120 return m_rowsSize; 121 } 122 /** define the row size (in point) */ setRowsSize(std::vector<float> const & rSize)123 void setRowsSize(std::vector<float> const &rSize) 124 { 125 m_rowsSize=rSize; 126 } 127 /** returns the columns size if defined (in point) */ getColsSize() const128 std::vector<float> const &getColsSize() const 129 { 130 return m_colsSize; 131 } 132 /** define the columns size (in point) */ setColsSize(std::vector<float> const & cSize)133 void setColsSize(std::vector<float> const &cSize) 134 { 135 m_colsSize=cSize; 136 } 137 138 //! returns the i^th cell 139 std::shared_ptr<MWAWCell> get(int id); 140 141 /** try to build the table structures */ 142 bool updateTable(); 143 /** returns true if the table has extralines */ hasExtraLines()144 bool hasExtraLines() 145 { 146 if (!updateTable()) return false; 147 return m_hasExtraLines; 148 } 149 150 /** try to send the table 151 152 Note: either send the table ( and returns true ) or do nothing. 153 */ 154 bool sendTable(MWAWListenerPtr listener, bool inFrame=true); 155 156 /** try to send the table as basic text */ 157 bool sendAsText(MWAWListenerPtr listener); 158 159 // interface with the content listener 160 161 //! adds the table properties to propList 162 void addTablePropertiesTo(librevenge::RVNGPropertyList &propList) const; 163 164 protected: 165 //! convert a cell position in a posToCellId's position getCellIdPos(int col,int row) const166 int getCellIdPos(int col, int row) const 167 { 168 if (col<0||col>=int(m_numCols)) 169 return -1; 170 if (row<0||row>=int(m_numRows)) 171 return -1; 172 return col*int(m_numRows)+row; 173 } 174 //! create the correspondance list, ... 175 bool buildStructures(); 176 /** compute the rows and the cells size */ 177 bool buildDims(); 178 /** a function which fills to posToCellId vector using the cell position */ 179 bool buildPosToCellId(); 180 //! send extra line 181 void sendExtraLines(MWAWListenerPtr listener) const; 182 183 protected: 184 /** a int to indicate what data are given in entries*/ 185 uint32_t m_givenData; 186 /** a int to indicate what data are been reconstruct*/ 187 uint32_t m_setData; 188 /** do we need to merge cell borders ( default yes) */ 189 bool m_mergeBorders; 190 /** the list of cells */ 191 std::vector<std::shared_ptr<MWAWCell> > m_cellsList; 192 /** the number of rows ( set by buildPosToCellId ) */ 193 size_t m_numRows; 194 /** the number of cols ( set by buildPosToCellId ) */ 195 size_t m_numCols; 196 /** the final row size (in point) */ 197 std::vector<float> m_rowsSize; 198 /** the final col size (in point) */ 199 std::vector<float> m_colsSize; 200 /** the table alignment */ 201 Alignment m_alignment; 202 /** the left margin in point */ 203 float m_leftMargin; 204 /** the right margin in point */ 205 float m_rightMargin; 206 207 /** a vector used to store an id corresponding to each cell */ 208 std::vector<int> m_posToCellId; 209 /** true if we need to send extra lines */ 210 bool m_hasExtraLines; 211 }; 212 213 #endif 214 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab: 215