| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef WW8_TABLE_INFO_HXX |
| #define WW8_TABLE_INFO_HXX |
| #include <hash_map> |
| #include <string> |
| #include <map> |
| #include <vector> |
| #include <functional> |
| #include <boost/shared_ptr.hpp> |
| #include <sal/types.h> |
| #include <swrect.hxx> |
| |
| class SwTable; |
| class SwTableLine; |
| class SwTableBox; |
| class SwNode; |
| class SwWW8Writer; |
| class AttributeOutputBase; |
| |
| namespace ww8 |
| { |
| using namespace ::std; |
| |
| const unsigned int MAXTABLECELLS = 63; |
| |
| class WW8TableNodeInfo; |
| typedef boost::shared_ptr<SwRect> SwRectPtr; |
| typedef ::std::vector<const SwTableBox *> TableBoxVector; |
| typedef boost::shared_ptr<TableBoxVector> TableBoxVectorPtr; |
| typedef ::std::vector<sal_uInt32> GridCols; |
| typedef boost::shared_ptr<GridCols> GridColsPtr; |
| typedef ::std::vector<sal_Int32> RowSpans; |
| typedef boost::shared_ptr<RowSpans> RowSpansPtr; |
| typedef ::std::vector<sal_uInt32> Widths; |
| typedef boost::shared_ptr<Widths> WidthsPtr; |
| |
| class WW8TableNodeInfoInner |
| { |
| WW8TableNodeInfo * mpParent; |
| sal_uInt32 mnDepth; |
| sal_uInt32 mnCell; |
| sal_uInt32 mnRow; |
| sal_uInt32 mnShadowsBefore; |
| sal_uInt32 mnShadowsAfter; |
| bool mbEndOfLine; |
| bool mbEndOfCell; |
| bool mbFirstInTable; |
| bool mbVertMerge; |
| const SwTableBox * mpTableBox; |
| const SwTable * mpTable; |
| SwRect maRect; |
| |
| public: |
| typedef boost::shared_ptr<WW8TableNodeInfoInner> Pointer_t; |
| |
| WW8TableNodeInfoInner(WW8TableNodeInfo * pParent); |
| ~WW8TableNodeInfoInner(); |
| |
| void setDepth(sal_uInt32 nDepth); |
| void setCell(sal_uInt32 nCell); |
| void setRow(sal_uInt32 nRow); |
| void setShadowsBefore(sal_uInt32 nShadowsBefore); |
| void setShadowsAfter(sal_uInt32 nShadowsAfter); |
| void setEndOfLine(bool bEndOfLine); |
| void setEndOfCell(bool bEndOfCell); |
| void setFirstInTable(bool bFirstInTable); |
| void setVertMerge(bool bVertMErge); |
| void setTableBox(const SwTableBox * pTableBox); |
| void setTable(const SwTable * pTable); |
| void setRect(const SwRect & rRect); |
| |
| sal_uInt32 getDepth() const; |
| sal_uInt32 getCell() const; |
| sal_uInt32 getRow() const; |
| sal_uInt32 getShadowsBefore() const; |
| sal_uInt32 getShadowsAfter() const; |
| bool isEndOfCell() const; |
| bool isEndOfLine() const; |
| bool isFirstInTable() const; |
| bool isVertMerge() const; |
| const SwTableBox * getTableBox() const; |
| const SwTable * getTable() const; |
| const SwRect & getRect() const; |
| |
| const SwNode * getNode() const; |
| |
| TableBoxVectorPtr getTableBoxesOfRow(); |
| WidthsPtr getWidthsOfRow(); |
| GridColsPtr getGridColsOfRow(AttributeOutputBase & rBase); |
| RowSpansPtr getRowSpansOfRow(); |
| |
| string toString() const; |
| }; |
| |
| class CellInfo |
| { |
| SwRect m_aRect; |
| WW8TableNodeInfo * m_pNodeInfo; |
| unsigned long m_nFmtFrmWidth; |
| |
| public: |
| CellInfo(const SwRect & aRect, WW8TableNodeInfo * pNodeInfo); |
| |
| CellInfo(const CellInfo & aRectAndTableInfo) |
| : m_aRect(aRectAndTableInfo.m_aRect), |
| m_pNodeInfo(aRectAndTableInfo.m_pNodeInfo), |
| m_nFmtFrmWidth(aRectAndTableInfo.m_nFmtFrmWidth) |
| { |
| } |
| |
| ~CellInfo() {} |
| |
| bool operator < (const CellInfo & aCellInfo) const; |
| |
| long top() const { return m_aRect.Top(); } |
| long bottom() const { return m_aRect.Bottom(); } |
| long left() const { return m_aRect.Left(); } |
| long right() const { return m_aRect.Right(); } |
| long width() const { return m_aRect.Width(); } |
| long height() const { return m_aRect.Height(); } |
| SwRect getRect() const { return m_aRect; } |
| WW8TableNodeInfo * getTableNodeInfo() const |
| { return m_pNodeInfo; } |
| unsigned long getFmtFrmWidth() const |
| { |
| return m_nFmtFrmWidth; |
| } |
| |
| void setFmtFrmWidth(unsigned long nFmtFrmWidth) |
| { |
| m_nFmtFrmWidth = nFmtFrmWidth; |
| } |
| |
| ::std::string toString() const; |
| }; |
| |
| typedef ::std::multiset<CellInfo, less<CellInfo> > CellInfoMultiSet; |
| typedef boost::shared_ptr<CellInfoMultiSet> CellInfoMultiSetPtr; |
| |
| class WW8TableInfo; |
| class WW8TableNodeInfo |
| { |
| public: |
| typedef map<sal_uInt32, WW8TableNodeInfoInner::Pointer_t, |
| greater<sal_uInt32> > Inners_t; |
| |
| private: |
| WW8TableInfo * mpParent; |
| sal_uInt32 mnDepth; |
| const SwNode * mpNode; |
| Inners_t mInners; |
| WW8TableNodeInfo * mpNext; |
| const SwNode * mpNextNode; |
| |
| public: |
| typedef boost::shared_ptr<WW8TableNodeInfo> Pointer_t; |
| |
| WW8TableNodeInfo(WW8TableInfo * pParent, const SwNode * pTxtNode); |
| virtual ~WW8TableNodeInfo(); |
| |
| void setDepth(sal_uInt32 nDepth); |
| void setEndOfLine(bool bEndOfLine); |
| void setEndOfCell(bool bEndOfCell); |
| void setFirstInTable(bool bFirstInTable); |
| void setVertMerge(bool bVertMerge); |
| void setTableBox(const SwTableBox *pTableBox); |
| void setTable(const SwTable * pTable); |
| void setCell(sal_uInt32 nCell); |
| void setRow(sal_uInt32 nRow); |
| void setShadowsBefore(sal_uInt32 nShadowsBefore); |
| void setShadowsAfter(sal_uInt32 nShadowsAfter); |
| void setNext(WW8TableNodeInfo * pNext); |
| void setNextNode(const SwNode * pNode); |
| void setRect(const SwRect & rRect); |
| |
| WW8TableInfo * getParent() const; |
| sal_uInt32 getDepth() const; |
| bool isEndOfLine() const; |
| bool isEndOfCell() const; |
| bool isFirstInTable() const; |
| const SwNode * getNode() const; |
| const SwTableBox * getTableBox() const; |
| const SwTable * getTable() const; |
| WW8TableNodeInfo * getNext() const; |
| const SwNode * getNextNode() const; |
| const SwRect & getRect() const; |
| |
| const Inners_t & getInners() const; |
| const WW8TableNodeInfoInner::Pointer_t getFirstInner() const; |
| const WW8TableNodeInfoInner::Pointer_t getInnerForDepth(sal_uInt32 nDepth) const; |
| |
| sal_uInt32 getCell() const; |
| sal_uInt32 getRow() const; |
| |
| ::std::string toString() const; |
| |
| bool operator < (const WW8TableNodeInfo & rInfo) const; |
| }; |
| |
| struct hashNode |
| { |
| size_t operator()(const SwNode * pNode) const |
| { return reinterpret_cast<size_t>(pNode); } |
| }; |
| |
| struct hashTable |
| { |
| size_t operator()(const SwTable * pTable) const |
| { return reinterpret_cast<size_t>(pTable); } |
| }; |
| |
| class WW8TableCellGridRow |
| { |
| CellInfoMultiSetPtr m_pCellInfos; |
| TableBoxVectorPtr m_pTableBoxVector; |
| WidthsPtr m_pWidths; |
| RowSpansPtr m_pRowSpans; |
| |
| public: |
| typedef boost::shared_ptr<WW8TableCellGridRow> Pointer_t; |
| WW8TableCellGridRow(); |
| ~WW8TableCellGridRow(); |
| |
| void insert(const CellInfo & rCellInfo); |
| CellInfoMultiSet::const_iterator begin() const; |
| CellInfoMultiSet::const_iterator end() const; |
| |
| void setTableBoxVector(TableBoxVectorPtr pTableBoxVector); |
| void setWidths(WidthsPtr pGridCols); |
| void setRowSpans(RowSpansPtr pRowSpans); |
| |
| TableBoxVectorPtr getTableBoxVector() const; |
| WidthsPtr getWidths() const; |
| RowSpansPtr getRowSpans() const; |
| }; |
| |
| class WW8TableCellGrid |
| { |
| typedef ::std::set<long> RowTops_t; |
| typedef ::std::map<long, WW8TableCellGridRow::Pointer_t> Rows_t; |
| |
| RowTops_t m_aRowTops; |
| Rows_t m_aRows; |
| |
| WW8TableCellGridRow::Pointer_t getRow(long nTop, bool bCreate = true); |
| RowTops_t::const_iterator getRowTopsBegin() const; |
| RowTops_t::const_iterator getRowTopsEnd() const; |
| CellInfoMultiSet::const_iterator getCellsBegin(long nTop); |
| CellInfoMultiSet::const_iterator getCellsEnd(long nTop); |
| |
| public: |
| typedef ::boost::shared_ptr<WW8TableCellGrid> Pointer_t; |
| |
| WW8TableCellGrid(); |
| ~WW8TableCellGrid(); |
| |
| void insert(const SwRect & rRect, WW8TableNodeInfo * pNodeInfo, |
| unsigned long * pFmtFrmWidth = NULL); |
| void addShadowCells(); |
| WW8TableNodeInfo * connectCells(); |
| |
| string toString(); |
| |
| TableBoxVectorPtr getTableBoxesOfRow(WW8TableNodeInfoInner * pNodeInfo); |
| WidthsPtr getWidthsOfRow(WW8TableNodeInfoInner * pNodeInfo); |
| RowSpansPtr getRowSpansOfRow(WW8TableNodeInfoInner * pNodeInfo); |
| }; |
| |
| class WW8TableInfo |
| { |
| friend class WW8TableNodeInfoInner; |
| typedef hash_map<const SwNode *, WW8TableNodeInfo::Pointer_t, hashNode > Map_t; |
| Map_t mMap; |
| |
| typedef hash_map<const SwTable *, WW8TableCellGrid::Pointer_t, hashTable > CellGridMap_t; |
| CellGridMap_t mCellGridMap; |
| |
| typedef hash_map<const SwTable *, const SwNode *, hashTable > FirstInTableMap_t; |
| FirstInTableMap_t mFirstInTableMap; |
| |
| WW8TableNodeInfo * |
| processTableLine(const SwTable * pTable, |
| const SwTableLine * pTableLine, |
| sal_uInt32 nRow, |
| sal_uInt32 nDepth, WW8TableNodeInfo * pPrev); |
| |
| WW8TableNodeInfo * |
| processTableBox(const SwTable * pTable, |
| const SwTableBox * pTableBox, |
| sal_uInt32 nRow, |
| sal_uInt32 nCell, |
| sal_uInt32 nDepth, bool bEndOfLine, WW8TableNodeInfo * pPrev); |
| |
| WW8TableNodeInfo::Pointer_t |
| processTableBoxLines(const SwTableBox * pBox, |
| const SwTable * pTable, |
| const SwTableBox * pBoxToSet, |
| sal_uInt32 nRow, |
| sal_uInt32 nCell, |
| sal_uInt32 nDepth); |
| |
| WW8TableNodeInfo::Pointer_t |
| insertTableNodeInfo(const SwNode * pNode, |
| const SwTable * pTable, |
| const SwTableBox * pTableBox, |
| sal_uInt32 nRow, |
| sal_uInt32 nCell, |
| sal_uInt32 nDepth, |
| SwRect * pRect = NULL); |
| |
| WW8TableCellGrid::Pointer_t getCellGridForTable(const SwTable * pTable, |
| bool bCreate = true); |
| |
| public: |
| typedef boost::shared_ptr<WW8TableInfo> Pointer_t; |
| |
| WW8TableInfo(); |
| virtual ~WW8TableInfo(); |
| |
| void processSwTable(const SwTable * pTable); |
| WW8TableNodeInfo * processSwTableByLayout(const SwTable * pTable); |
| WW8TableNodeInfo::Pointer_t getTableNodeInfo(const SwNode * pNode); |
| const SwNode * getNextNode(const SwNode * pNode); |
| const WW8TableNodeInfo * getFirstTableNodeInfo() const; |
| |
| WW8TableNodeInfo * reorderByLayout(const SwTable * pTable); |
| }; |
| |
| } |
| #endif // WW8_TABLE_INFO_HXX |
| |