MWAWTable.hxx
Go to the documentation of this file.
00001 /* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
00002 
00003 /* libmwaw
00004 * Version: MPL 2.0 / LGPLv2+
00005 *
00006 * The contents of this file are subject to the Mozilla Public License Version
00007 * 2.0 (the "License"); you may not use this file except in compliance with
00008 * the License or as specified alternatively below. You may obtain a copy of
00009 * the License at http://www.mozilla.org/MPL/
00010 *
00011 * Software distributed under the License is distributed on an "AS IS" basis,
00012 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00013 * for the specific language governing rights and limitations under the
00014 * License.
00015 *
00016 * Major Contributor(s):
00017 * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
00018 * Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net)
00019 * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
00020 * Copyright (C) 2006, 2007 Andrew Ziem
00021 * Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr)
00022 *
00023 *
00024 * All Rights Reserved.
00025 *
00026 * For minor contributions see the git repository.
00027 *
00028 * Alternatively, the contents of this file may be used under the terms of
00029 * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
00030 * in which case the provisions of the LGPLv2+ are applicable
00031 * instead of those above.
00032 */
00033 
00034 /*
00035  * Structure to store and construct a table from an unstructured list
00036  * of cell
00037  *
00038  */
00039 
00040 #ifndef MWAW_TABLE
00041 #  define MWAW_TABLE
00042 
00043 #include <iostream>
00044 #include <vector>
00045 
00046 #include "libmwaw_internal.hxx"
00047 
00048 #include "MWAWCell.hxx"
00049 
00050 class MWAWTable;
00051 
00053 class MWAWTable
00054 {
00055 public:
00057   enum DataSet {
00058     CellPositionBit=1, BoxBit=2, SizeBit=4, TableDimBit=8, TablePosToCellBit=0x10
00059   };
00063   enum Alignment {
00064     Paragraph, Left, Center, Right
00065   };
00067   MWAWTable(uint32_t givenData=BoxBit) :
00068     m_givenData(givenData), m_setData(givenData), m_mergeBorders(true), m_cellsList(),
00069     m_numRows(0), m_numCols(0), m_rowsSize(), m_colsSize(), m_alignment(Paragraph), m_leftMargin(0), m_rightMargin(0),
00070     m_posToCellId(), m_hasExtraLines(false) {}
00071 
00073   virtual ~MWAWTable();
00074 
00076   void add(shared_ptr<MWAWCell> cell) {
00077     if (!cell) {
00078       MWAW_DEBUG_MSG(("MWAWTable::add: must be called with a cell\n"));
00079       return;
00080     }
00081     m_cellsList.push_back(cell);
00082   }
00084   bool mergeBorders() const {
00085     return m_mergeBorders;
00086   }
00088   bool setMergeBorders(bool val) {
00089     return m_mergeBorders=val;
00090   }
00093   void setAlignment(Alignment align, float leftMargin=0, float rightMargin=0) {
00094     m_alignment = align;
00095     m_leftMargin = leftMargin;
00096     m_rightMargin = rightMargin;
00097   }
00099   int numCells() const {
00100     return int(m_cellsList.size());
00101   }
00103   std::vector<float> const &getRowsSize() const {
00104     return m_rowsSize;
00105   }
00107   void setRowsSize(std::vector<float> const &rSize) {
00108     m_rowsSize=rSize;
00109   }
00111   std::vector<float> const &getColsSize() const {
00112     return m_colsSize;
00113   }
00115   void setColsSize(std::vector<float> const &cSize) {
00116     m_colsSize=cSize;
00117   }
00118 
00120   shared_ptr<MWAWCell> get(int id);
00121 
00123   bool updateTable();
00125   bool hasExtraLines() {
00126     if (!updateTable()) return false;
00127     return m_hasExtraLines;
00128   }
00129 
00134   bool sendTable(MWAWContentListenerPtr listener, bool inFrame=true);
00135 
00137   bool sendAsText(MWAWContentListenerPtr listener);
00138 
00139   // interface with the content listener
00140 
00142   void addTablePropertiesTo(WPXPropertyList &propList, WPXPropertyListVector &columns) const;
00143 
00144 protected:
00146   int getCellIdPos(int col, int row) const {
00147     if (col<0||col>=int(m_numCols))
00148       return -1;
00149     if (row<0||row>=int(m_numRows))
00150       return -1;
00151     return col*int(m_numRows)+row;
00152   }
00154   bool buildStructures();
00156   bool buildDims();
00158   bool buildPosToCellId();
00160   void sendExtraLines(MWAWContentListenerPtr listener) const;
00161 
00162 protected:
00164   uint32_t m_givenData;
00166   uint32_t m_setData;
00168   bool m_mergeBorders;
00170   std::vector<shared_ptr<MWAWCell> > m_cellsList;
00172   size_t m_numRows;
00174   size_t m_numCols;
00176   std::vector<float> m_rowsSize;
00178   std::vector<float> m_colsSize;
00180   Alignment m_alignment;
00182   float m_leftMargin;
00184   float m_rightMargin;
00185 
00187   std::vector<int> m_posToCellId;
00189   bool m_hasExtraLines;
00190 };
00191 
00192 #endif