xref: /trunk/main/sw/source/filter/xml/xmltbli.hxx (revision 1d2dbeb0)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _XMLTBLI_HXX
25 #define _XMLTBLI_HXX
26 
27 #include <xmloff/XMLTextTableContext.hxx>
28 
29 // STL include
30 #include <hash_map>
31 
32 #if !defined(_SVSTDARR_USHORTS_DECL) || !defined(_SVSTDARR_BOOLS_DECL) || !defined(_SVSTDARR_STRINGSDTOR_DECL)
33 #define _SVSTDARR_USHORTS
34 #define _SVSTDARR_BOOLS
35 #define _SVSTDARR_STRINGSDTOR
36 #include <svl/svstdarr.hxx>
37 #endif
38 
39 class SwXMLImport;
40 class SwTableNode;
41 class SwTableBox;
42 class SwTableLine;
43 class SwStartNode;
44 class SwTableBoxFmt;
45 class SwTableLineFmt;
46 class SwXMLTableCell_Impl;
47 class SwXMLTableRows_Impl;
48 class SwXMLDDETableContext_Impl;
49 class TableBoxIndexHasher;
50 class TableBoxIndex;
51 
52 namespace com { namespace sun { namespace star {
53 	namespace text { class XTextContent; }
54 	namespace text { class XTextCursor; }
55 } } }
56 
57 
58 
59 class SwXMLTableContext : public XMLTextTableContext
60 {
61 	::rtl::OUString		aStyleName;
62 	::rtl::OUString		aDfltCellStyleName;
63     /// NB: this contains the xml:id only if this table is a subtable!
64     ::rtl::OUString     mXmlId;
65 
66 	SvUShorts			aColumnWidths;
67 	SvBools				aColumnRelWidths;
68 	SvStringsDtor		*pColumnDefaultCellStyleNames;
69 
70 	::com::sun::star::uno::Reference <
71 		::com::sun::star::text::XTextCursor > xOldCursor;
72 	::com::sun::star::uno::Reference <
73 		::com::sun::star::text::XTextContent > xTextContent;
74 
75 	SwXMLTableRows_Impl *pRows;
76 
77 	SwTableNode			*pTableNode;
78 	SwTableBox 			*pBox1;
79 	const SwStartNode	*pSttNd1;
80 
81 	SwTableBoxFmt		*pBoxFmt;
82 	SwTableLineFmt 		*pLineFmt;
83 
84     // hash map of shared format, indexed by the (XML) style name,
85     // the column width, and protection flag
86     typedef std::hash_map<TableBoxIndex,SwTableBoxFmt*,
87                           TableBoxIndexHasher> map_BoxFmt;
88     map_BoxFmt* pSharedBoxFormats;
89 
90 	SvXMLImportContextRef	xParentTable;	// if table is a sub table
91 
92 	SwXMLDDETableContext_Impl	*pDDESource;
93 
94 	sal_Bool			bFirstSection : 1;
95 	sal_Bool			bRelWidth : 1;
96     sal_Bool            bHasSubTables : 1;
97 
98 	sal_uInt16              nHeaderRows;
99 	sal_uInt32 			nCurRow;
100 	sal_uInt32			nCurCol;
101 	sal_Int32			nWidth;
102 
103 	SwTableBox *NewTableBox( const SwStartNode *pStNd,
104 							 SwTableLine *pUpper );
105     SwTableBox *MakeTableBox( SwTableLine *pUpper,
106                               const SwXMLTableCell_Impl *pStartNode,
107                               sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
108                               sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
109     SwTableBox *MakeTableBox( SwTableLine *pUpper,
110                               sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
111                               sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
112     SwTableLine *MakeTableLine( SwTableBox *pUpper,
113                                 sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
114                                 sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
115 
116 	void _MakeTable( SwTableBox *pBox=0 );
117 	void MakeTable( SwTableBox *pBox, sal_Int32 nWidth );
118 	void MakeTable();
119 
120 	inline SwXMLTableContext *GetParentTable() const;
121 
122 	const SwStartNode *GetPrevStartNode( sal_uInt32 nRow,
123 										 sal_uInt32 nCol ) const;
124 	inline const SwStartNode *GetLastStartNode() const;
125 	void FixRowSpan( sal_uInt32 nRow, sal_uInt32 nCol, sal_uInt32 nColSpan );
126     void ReplaceWithEmptyCell( sal_uInt32 nRow, sal_uInt32 nCol, bool bRows );
127 
128     /** sets the appropriate SwTblBoxFmt at pBox. */
129     SwTableBoxFmt* GetSharedBoxFormat(
130         SwTableBox* pBox,   /// the table box
131         const ::rtl::OUString& rStyleName, /// XML style name
132         sal_Int32 nColumnWidth,     /// width of column
133         sal_Bool bProtected,        /// is cell protected?
134         sal_Bool bMayShare, /// may the format be shared (no value, formula...)
135         sal_Bool& bNew,     /// true, if the format it not from the cache
136         sal_Bool* pModifyLocked );  /// if set, call pBox->LockModify() and return old lock status
137 
138 public:
139 
140 	TYPEINFO();
141 
142 	SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
143 			   	const ::rtl::OUString& rLName,
144 				const ::com::sun::star::uno::Reference<
145 					::com::sun::star::xml::sax::XAttributeList > & xAttrList );
146 	SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
147 			   	const ::rtl::OUString& rLName,
148 			  	const ::com::sun::star::uno::Reference<
149 					::com::sun::star::xml::sax::XAttributeList > & xAttrList,
150 				SwXMLTableContext *pTable,
151 				const ::rtl::OUString& i_rXmlId );
152 
153 	virtual ~SwXMLTableContext();
154 
155 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
156 				const ::rtl::OUString& rLocalName,
157 				const ::com::sun::star::uno::Reference<
158 					::com::sun::star::xml::sax::XAttributeList > & xAttrList );
159 
GetSwImport()160 	SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
161 
162 	void InsertColumn( sal_Int32 nWidth, sal_Bool bRelWidth,
163 					   const ::rtl::OUString *pDfltCellStyleName = 0 );
164 	sal_Int32 GetColumnWidth( sal_uInt32 nCol, sal_uInt32 nColSpan=1UL ) const;
165 	::rtl::OUString GetColumnDefaultCellStyleName( sal_uInt32 nCol ) const;
166 	inline sal_uInt32 GetColumnCount() const;
167 	inline sal_Bool HasColumnDefaultCellStyleNames() const;
168 
IsInsertCellPossible() const169 	sal_Bool IsInsertCellPossible() const { return nCurCol < GetColumnCount(); }
IsInsertColPossible() const170 	sal_Bool IsInsertColPossible() const { return nCurCol < USHRT_MAX; }
IsInsertRowPossible() const171 	sal_Bool IsInsertRowPossible() const { return nCurRow < USHRT_MAX; }
IsValid() const172 	sal_Bool IsValid() const { return pTableNode != 0; }
173 
174 	void InsertCell( const ::rtl::OUString& rStyleName,
175 					 sal_uInt32 nRowSpan=1U, sal_uInt32 nColSpan=1U,
176 					 const SwStartNode *pStNd=0,
177                      const ::rtl::OUString & i_rXmlId = ::rtl::OUString(),
178 					 SwXMLTableContext *pTable=0,
179 					 sal_Bool bIsProtected = sal_False,
180 					 const ::rtl::OUString *pFormula=0,
181 					 sal_Bool bHasValue = sal_False,
182 					 double fValue = 0.0,
183                      sal_Bool bTextValue = sal_False );
184 	void InsertRow( const ::rtl::OUString& rStyleName,
185 					const ::rtl::OUString& rDfltCellStyleName,
186 					sal_Bool bInHead,
187                     const ::rtl::OUString & i_rXmlId = ::rtl::OUString() );
188 	void FinishRow();
189 	void InsertRepRows( sal_uInt32 nCount );
190 	SwXMLTableCell_Impl *GetCell( sal_uInt32 nRow, sal_uInt32 nCol ) const;
191 	const SwStartNode *InsertTableSection( const SwStartNode *pPrevSttNd=0 );
192 
193 	virtual void EndElement();
194 
195 	virtual ::com::sun::star::uno::Reference <
196 			::com::sun::star::text::XTextContent > GetXTextContent() const;
197 
SetHasSubTables(sal_Bool bNew)198     void SetHasSubTables( sal_Bool bNew ) { bHasSubTables = bNew; }
199 };
200 
GetParentTable() const201 inline SwXMLTableContext *SwXMLTableContext::GetParentTable() const
202 {
203 	return (SwXMLTableContext *)&xParentTable;
204 }
205 
GetColumnCount() const206 inline sal_uInt32 SwXMLTableContext::GetColumnCount() const
207 {
208 	return aColumnWidths.Count();
209 }
210 
GetLastStartNode() const211 inline const SwStartNode *SwXMLTableContext::GetLastStartNode() const
212 {
213 	return GetPrevStartNode( 0UL, GetColumnCount() );
214 }
215 
HasColumnDefaultCellStyleNames() const216 inline sal_Bool SwXMLTableContext::HasColumnDefaultCellStyleNames() const
217 {
218 	return pColumnDefaultCellStyleNames != 0;
219 }
220 
221 #endif
222