| /************************************************************** |
| * |
| * 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 _XMLTBLI_HXX |
| #define _XMLTBLI_HXX |
| |
| #include <xmloff/XMLTextTableContext.hxx> |
| |
| // STL include |
| #include <hash_map> |
| |
| #if !defined(_SVSTDARR_USHORTS_DECL) || !defined(_SVSTDARR_BOOLS_DECL) || !defined(_SVSTDARR_STRINGSDTOR_DECL) |
| #define _SVSTDARR_USHORTS |
| #define _SVSTDARR_BOOLS |
| #define _SVSTDARR_STRINGSDTOR |
| #include <svl/svstdarr.hxx> |
| #endif |
| |
| class SwXMLImport; |
| class SwTableNode; |
| class SwTableBox; |
| class SwTableLine; |
| class SwStartNode; |
| class SwTableBoxFmt; |
| class SwTableLineFmt; |
| class SwXMLTableCell_Impl; |
| class SwXMLTableRows_Impl; |
| class SwXMLDDETableContext_Impl; |
| class TableBoxIndexHasher; |
| class TableBoxIndex; |
| |
| namespace com { namespace sun { namespace star { |
| namespace text { class XTextContent; } |
| namespace text { class XTextCursor; } |
| } } } |
| |
| |
| |
| class SwXMLTableContext : public XMLTextTableContext |
| { |
| ::rtl::OUString aStyleName; |
| ::rtl::OUString aDfltCellStyleName; |
| /// NB: this contains the xml:id only if this table is a subtable! |
| ::rtl::OUString mXmlId; |
| |
| SvUShorts aColumnWidths; |
| SvBools aColumnRelWidths; |
| SvStringsDtor *pColumnDefaultCellStyleNames; |
| |
| ::com::sun::star::uno::Reference < |
| ::com::sun::star::text::XTextCursor > xOldCursor; |
| ::com::sun::star::uno::Reference < |
| ::com::sun::star::text::XTextContent > xTextContent; |
| |
| SwXMLTableRows_Impl *pRows; |
| |
| SwTableNode *pTableNode; |
| SwTableBox *pBox1; |
| const SwStartNode *pSttNd1; |
| |
| SwTableBoxFmt *pBoxFmt; |
| SwTableLineFmt *pLineFmt; |
| |
| // hash map of shared format, indexed by the (XML) style name, |
| // the column width, and protection flag |
| typedef std::hash_map<TableBoxIndex,SwTableBoxFmt*, |
| TableBoxIndexHasher> map_BoxFmt; |
| map_BoxFmt* pSharedBoxFormats; |
| |
| SvXMLImportContextRef xParentTable; // if table is a sub table |
| |
| SwXMLDDETableContext_Impl *pDDESource; |
| |
| sal_Bool bFirstSection : 1; |
| sal_Bool bRelWidth : 1; |
| sal_Bool bHasSubTables : 1; |
| |
| sal_uInt16 nHeaderRows; |
| sal_uInt32 nCurRow; |
| sal_uInt32 nCurCol; |
| sal_Int32 nWidth; |
| |
| SwTableBox *NewTableBox( const SwStartNode *pStNd, |
| SwTableLine *pUpper ); |
| SwTableBox *MakeTableBox( SwTableLine *pUpper, |
| const SwXMLTableCell_Impl *pStartNode, |
| sal_uInt32 nTopRow, sal_uInt32 nLeftCol, |
| sal_uInt32 nBottomRow, sal_uInt32 nRightCol ); |
| SwTableBox *MakeTableBox( SwTableLine *pUpper, |
| sal_uInt32 nTopRow, sal_uInt32 nLeftCol, |
| sal_uInt32 nBottomRow, sal_uInt32 nRightCol ); |
| SwTableLine *MakeTableLine( SwTableBox *pUpper, |
| sal_uInt32 nTopRow, sal_uInt32 nLeftCol, |
| sal_uInt32 nBottomRow, sal_uInt32 nRightCol ); |
| |
| void _MakeTable( SwTableBox *pBox=0 ); |
| void MakeTable( SwTableBox *pBox, sal_Int32 nWidth ); |
| void MakeTable(); |
| |
| inline SwXMLTableContext *GetParentTable() const; |
| |
| const SwStartNode *GetPrevStartNode( sal_uInt32 nRow, |
| sal_uInt32 nCol ) const; |
| inline const SwStartNode *GetLastStartNode() const; |
| void FixRowSpan( sal_uInt32 nRow, sal_uInt32 nCol, sal_uInt32 nColSpan ); |
| void ReplaceWithEmptyCell( sal_uInt32 nRow, sal_uInt32 nCol, bool bRows ); |
| |
| /** sets the appropriate SwTblBoxFmt at pBox. */ |
| SwTableBoxFmt* GetSharedBoxFormat( |
| SwTableBox* pBox, /// the table box |
| const ::rtl::OUString& rStyleName, /// XML style name |
| sal_Int32 nColumnWidth, /// width of column |
| sal_Bool bProtected, /// is cell protected? |
| sal_Bool bMayShare, /// may the format be shared (no value, formula...) |
| sal_Bool& bNew, /// true, if the format it not from the cache |
| sal_Bool* pModifyLocked ); /// if set, call pBox->LockModify() and return old lock status |
| |
| public: |
| |
| TYPEINFO(); |
| |
| SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx, |
| const ::rtl::OUString& rLName, |
| const ::com::sun::star::uno::Reference< |
| ::com::sun::star::xml::sax::XAttributeList > & xAttrList ); |
| SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx, |
| const ::rtl::OUString& rLName, |
| const ::com::sun::star::uno::Reference< |
| ::com::sun::star::xml::sax::XAttributeList > & xAttrList, |
| SwXMLTableContext *pTable, |
| const ::rtl::OUString& i_rXmlId ); |
| |
| virtual ~SwXMLTableContext(); |
| |
| virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, |
| const ::rtl::OUString& rLocalName, |
| const ::com::sun::star::uno::Reference< |
| ::com::sun::star::xml::sax::XAttributeList > & xAttrList ); |
| |
| SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); } |
| |
| void InsertColumn( sal_Int32 nWidth, sal_Bool bRelWidth, |
| const ::rtl::OUString *pDfltCellStyleName = 0 ); |
| sal_Int32 GetColumnWidth( sal_uInt32 nCol, sal_uInt32 nColSpan=1UL ) const; |
| ::rtl::OUString GetColumnDefaultCellStyleName( sal_uInt32 nCol ) const; |
| inline sal_uInt32 GetColumnCount() const; |
| inline sal_Bool HasColumnDefaultCellStyleNames() const; |
| |
| sal_Bool IsInsertCellPossible() const { return nCurCol < GetColumnCount(); } |
| sal_Bool IsInsertColPossible() const { return nCurCol < USHRT_MAX; } |
| sal_Bool IsInsertRowPossible() const { return nCurRow < USHRT_MAX; } |
| sal_Bool IsValid() const { return pTableNode != 0; } |
| |
| void InsertCell( const ::rtl::OUString& rStyleName, |
| sal_uInt32 nRowSpan=1U, sal_uInt32 nColSpan=1U, |
| const SwStartNode *pStNd=0, |
| const ::rtl::OUString & i_rXmlId = ::rtl::OUString(), |
| SwXMLTableContext *pTable=0, |
| sal_Bool bIsProtected = sal_False, |
| const ::rtl::OUString *pFormula=0, |
| sal_Bool bHasValue = sal_False, |
| double fValue = 0.0, |
| sal_Bool bTextValue = sal_False ); |
| void InsertRow( const ::rtl::OUString& rStyleName, |
| const ::rtl::OUString& rDfltCellStyleName, |
| sal_Bool bInHead, |
| const ::rtl::OUString & i_rXmlId = ::rtl::OUString() ); |
| void FinishRow(); |
| void InsertRepRows( sal_uInt32 nCount ); |
| SwXMLTableCell_Impl *GetCell( sal_uInt32 nRow, sal_uInt32 nCol ) const; |
| const SwStartNode *InsertTableSection( const SwStartNode *pPrevSttNd=0 ); |
| |
| virtual void EndElement(); |
| |
| virtual ::com::sun::star::uno::Reference < |
| ::com::sun::star::text::XTextContent > GetXTextContent() const; |
| |
| void SetHasSubTables( sal_Bool bNew ) { bHasSubTables = bNew; } |
| }; |
| |
| inline SwXMLTableContext *SwXMLTableContext::GetParentTable() const |
| { |
| return (SwXMLTableContext *)&xParentTable; |
| } |
| |
| inline sal_uInt32 SwXMLTableContext::GetColumnCount() const |
| { |
| return aColumnWidths.Count(); |
| } |
| |
| inline const SwStartNode *SwXMLTableContext::GetLastStartNode() const |
| { |
| return GetPrevStartNode( 0UL, GetColumnCount() ); |
| } |
| |
| inline sal_Bool SwXMLTableContext::HasColumnDefaultCellStyleNames() const |
| { |
| return pColumnDefaultCellStyleNames != 0; |
| } |
| |
| #endif |