Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef _XMLTBLI_HXX
21 : #define _XMLTBLI_HXX
22 :
23 : #include <xmloff/XMLTextTableContext.hxx>
24 :
25 : // STL include
26 : #include <boost/unordered_map.hpp>
27 : #include <boost/ptr_container/ptr_vector.hpp>
28 : #include <vector>
29 :
30 : class SwXMLImport;
31 : class SwTableNode;
32 : class SwTableBox;
33 : class SwTableLine;
34 : class SwStartNode;
35 : class SwTableBoxFmt;
36 : class SwTableLineFmt;
37 : class SwXMLTableCell_Impl;
38 : class SwXMLTableRow_Impl;
39 : typedef boost::ptr_vector<SwXMLTableRow_Impl> SwXMLTableRows_Impl;
40 : class SwXMLDDETableContext_Impl;
41 : class TableBoxIndexHasher;
42 : class TableBoxIndex;
43 :
44 : namespace com { namespace sun { namespace star {
45 : namespace text { class XTextContent; }
46 : namespace text { class XTextCursor; }
47 : } } }
48 :
49 :
50 :
51 : class SwXMLTableContext : public XMLTextTableContext
52 : {
53 : OUString aStyleName;
54 : OUString aDfltCellStyleName;
55 : /// NB: this contains the xml:id only if this table is a subtable!
56 : OUString mXmlId;
57 :
58 : //! Holds basic information about a column's width.
59 : struct ColumnWidthInfo {
60 : sal_uInt16 width; //!< Column width (absolute or relative).
61 : bool isRelative; //!< True for a relative width, false for absolute.
62 18 : inline ColumnWidthInfo(sal_uInt16 wdth, bool isRel) : width(wdth), isRelative(isRel) {};
63 : };
64 : std::vector<ColumnWidthInfo> aColumnWidths;
65 : std::vector<String> *pColumnDefaultCellStyleNames;
66 :
67 : ::com::sun::star::uno::Reference <
68 : ::com::sun::star::text::XTextCursor > xOldCursor;
69 : ::com::sun::star::uno::Reference <
70 : ::com::sun::star::text::XTextContent > xTextContent;
71 :
72 : SwXMLTableRows_Impl *pRows;
73 :
74 : SwTableNode *pTableNode;
75 : SwTableBox *pBox1;
76 : const SwStartNode *pSttNd1;
77 :
78 : SwTableBoxFmt *pBoxFmt;
79 : SwTableLineFmt *pLineFmt;
80 :
81 : // hash map of shared format, indexed by the (XML) style name,
82 : // the column width, and protection flag
83 : typedef boost::unordered_map<TableBoxIndex,SwTableBoxFmt*,
84 : TableBoxIndexHasher> map_BoxFmt;
85 : map_BoxFmt* pSharedBoxFormats;
86 :
87 : SvXMLImportContextRef xParentTable; // if table is a sub table
88 :
89 : SwXMLDDETableContext_Impl *pDDESource;
90 :
91 : bool bFirstSection : 1;
92 : bool bRelWidth : 1;
93 : bool bHasSubTables : 1;
94 :
95 : sal_uInt16 nHeaderRows;
96 : sal_uInt32 nCurRow;
97 : sal_uInt32 nCurCol;
98 : sal_Int32 nWidth;
99 :
100 : SwTableBox *NewTableBox( const SwStartNode *pStNd,
101 : SwTableLine *pUpper );
102 : SwTableBox *MakeTableBox( SwTableLine *pUpper,
103 : const SwXMLTableCell_Impl *pStartNode,
104 : sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
105 : sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
106 : SwTableBox *MakeTableBox( SwTableLine *pUpper,
107 : sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
108 : sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
109 : SwTableLine *MakeTableLine( SwTableBox *pUpper,
110 : sal_uInt32 nTopRow, sal_uInt32 nLeftCol,
111 : sal_uInt32 nBottomRow, sal_uInt32 nRightCol );
112 :
113 : void _MakeTable( SwTableBox *pBox=0 );
114 : void MakeTable( SwTableBox *pBox, sal_Int32 nWidth );
115 : void MakeTable();
116 :
117 : inline SwXMLTableContext *GetParentTable() const;
118 :
119 : const SwStartNode *GetPrevStartNode( sal_uInt32 nRow,
120 : sal_uInt32 nCol ) const;
121 : inline const SwStartNode *GetLastStartNode() const;
122 : void FixRowSpan( sal_uInt32 nRow, sal_uInt32 nCol, sal_uInt32 nColSpan );
123 : void ReplaceWithEmptyCell( sal_uInt32 nRow, sal_uInt32 nCol, bool bRows );
124 :
125 : /** sets the appropriate SwTblBoxFmt at pBox. */
126 : SwTableBoxFmt* GetSharedBoxFormat(
127 : SwTableBox* pBox, /// the table box
128 : const OUString& rStyleName, /// XML style name
129 : sal_Int32 nColumnWidth, /// width of column
130 : sal_Bool bProtected, /// is cell protected?
131 : sal_Bool bMayShare, /// may the format be shared (no value, formula...)
132 : sal_Bool& bNew, /// true, if the format it not from the cache
133 : bool* pModifyLocked ); /// if set, call pBox->LockModify() and return old lock status
134 :
135 : public:
136 :
137 : TYPEINFO();
138 :
139 : SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
140 : const OUString& rLName,
141 : const ::com::sun::star::uno::Reference<
142 : ::com::sun::star::xml::sax::XAttributeList > & xAttrList );
143 : SwXMLTableContext( SwXMLImport& rImport, sal_uInt16 nPrfx,
144 : const OUString& rLName,
145 : const ::com::sun::star::uno::Reference<
146 : ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
147 : SwXMLTableContext *pTable,
148 : const OUString& i_rXmlId );
149 :
150 : virtual ~SwXMLTableContext();
151 :
152 : virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
153 : const OUString& rLocalName,
154 : const ::com::sun::star::uno::Reference<
155 : ::com::sun::star::xml::sax::XAttributeList > & xAttrList );
156 :
157 234 : SwXMLImport& GetSwImport() { return (SwXMLImport&)GetImport(); }
158 :
159 : void InsertColumn( sal_Int32 nWidth, bool bRelWidth,
160 : const OUString *pDfltCellStyleName = 0 );
161 : sal_Int32 GetColumnWidth( sal_uInt32 nCol, sal_uInt32 nColSpan=1UL ) const;
162 : OUString GetColumnDefaultCellStyleName( sal_uInt32 nCol ) const;
163 : inline sal_uInt32 GetColumnCount() const;
164 : inline bool HasColumnDefaultCellStyleNames() const;
165 :
166 130 : bool IsInsertCellPossible() const { return nCurCol < GetColumnCount(); }
167 32 : bool IsInsertColPossible() const { return nCurCol < USHRT_MAX; }
168 28 : bool IsInsertRowPossible() const { return nCurRow < USHRT_MAX; }
169 456 : bool IsValid() const { return pTableNode != 0; }
170 :
171 : void InsertCell( const OUString& rStyleName,
172 : sal_uInt32 nRowSpan=1U, sal_uInt32 nColSpan=1U,
173 : const SwStartNode *pStNd=0,
174 : const OUString & i_rXmlId = OUString(),
175 : SwXMLTableContext *pTable=0,
176 : sal_Bool bIsProtected = sal_False,
177 : const OUString *pFormula=0,
178 : sal_Bool bHasValue = sal_False,
179 : double fValue = 0.0,
180 : OUString const*const pStringValue = 0);
181 : void InsertRow( const OUString& rStyleName,
182 : const OUString& rDfltCellStyleName,
183 : bool bInHead,
184 : const OUString & i_rXmlId = OUString() );
185 : void FinishRow();
186 : void InsertRepRows( sal_uInt32 nCount );
187 : const SwXMLTableCell_Impl *GetCell( sal_uInt32 nRow, sal_uInt32 nCol ) const;
188 : SwXMLTableCell_Impl *GetCell( sal_uInt32 nRow, sal_uInt32 nCol );
189 : const SwStartNode *InsertTableSection(const SwStartNode *pPrevSttNd = 0,
190 : OUString const* pStringValueStyleName = 0);
191 :
192 : virtual void EndElement();
193 :
194 : virtual ::com::sun::star::uno::Reference <
195 : ::com::sun::star::text::XTextContent > GetXTextContent() const;
196 :
197 0 : void SetHasSubTables( bool bNew ) { bHasSubTables = bNew; }
198 : };
199 :
200 0 : inline SwXMLTableContext *SwXMLTableContext::GetParentTable() const
201 : {
202 0 : return (SwXMLTableContext *)&xParentTable;
203 : }
204 :
205 619 : inline sal_uInt32 SwXMLTableContext::GetColumnCount() const
206 : {
207 619 : return aColumnWidths.size();
208 : }
209 :
210 0 : inline const SwStartNode *SwXMLTableContext::GetLastStartNode() const
211 : {
212 0 : return GetPrevStartNode( 0UL, GetColumnCount() );
213 : }
214 :
215 102 : inline bool SwXMLTableContext::HasColumnDefaultCellStyleNames() const
216 : {
217 102 : return pColumnDefaultCellStyleNames != 0;
218 : }
219 :
220 : #endif
221 :
222 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|