Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "xmlrowi.hxx"
30 : : #include "xmlimprt.hxx"
31 : : #include "xmlcelli.hxx"
32 : : #include "global.hxx"
33 : : #include "xmlstyli.hxx"
34 : : #include "document.hxx"
35 : : #include "docuno.hxx"
36 : : #include "olinetab.hxx"
37 : : #include "sheetdata.hxx"
38 : :
39 : : #include <xmloff/xmltkmap.hxx>
40 : : #include <xmloff/nmspmap.hxx>
41 : : #include <xmloff/xmlnmspe.hxx>
42 : : #include <xmloff/families.hxx>
43 : : #include <xmloff/xmltoken.hxx>
44 : : #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
45 : : #include <com/sun/star/sheet/XSpreadsheet.hpp>
46 : : #include <com/sun/star/table/XColumnRowRange.hpp>
47 : : #include <com/sun/star/sheet/XPrintAreas.hpp>
48 : :
49 : : #include <com/sun/star/table/CellAddress.hpp>
50 : :
51 : : #define SC_ISVISIBLE "IsVisible"
52 : : #define SC_ISFILTERED "IsFiltered"
53 : :
54 : : using namespace com::sun::star;
55 : : using namespace xmloff::token;
56 : :
57 : : //------------------------------------------------------------------
58 : :
59 : 4404 : ScXMLTableRowContext::ScXMLTableRowContext( ScXMLImport& rImport,
60 : : sal_uInt16 nPrfx,
61 : : const ::rtl::OUString& rLName,
62 : : const ::com::sun::star::uno::Reference<
63 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) :
64 : : SvXMLImportContext( rImport, nPrfx, rLName ),
65 [ + - ]: 4404 : sVisibility(GetXMLToken(XML_VISIBLE)),
66 : : nRepeatedRows(1),
67 : 8808 : bHasCell(false)
68 : : {
69 : 4404 : rtl::OUString sCellStyleName;
70 [ + - ][ + - ]: 4404 : sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
[ + - ]
71 [ + - ]: 4404 : const SvXMLTokenMap& rAttrTokenMap(GetScImport().GetTableRowAttrTokenMap());
72 [ + + ]: 8924 : for( sal_Int16 i=0; i < nAttrCount; ++i )
73 : : {
74 [ + - ][ + - ]: 4520 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
75 : 4520 : rtl::OUString aLocalName;
76 : 4520 : sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
77 [ + - ]: 4520 : sAttrName, &aLocalName ));
78 [ + - ][ + - ]: 4520 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
79 : :
80 [ + - ][ + + : 4520 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
+ - - ]
81 : : {
82 : : case XML_TOK_TABLE_ROW_ATTR_STYLE_NAME:
83 : : {
84 : 4404 : sStyleName = sValue;
85 : : }
86 : 4404 : break;
87 : : case XML_TOK_TABLE_ROW_ATTR_VISIBILITY:
88 : : {
89 : 32 : sVisibility = sValue;
90 : : }
91 : 32 : break;
92 : : case XML_TOK_TABLE_ROW_ATTR_REPEATED:
93 : : {
94 [ + - ]: 84 : nRepeatedRows = std::max( sValue.toInt32(), (sal_Int32) 1 );
95 : : }
96 : 84 : break;
97 : : case XML_TOK_TABLE_ROW_ATTR_DEFAULT_CELL_STYLE_NAME:
98 : : {
99 : 0 : sCellStyleName = sValue;
100 : : }
101 : 0 : break;
102 : : /*case XML_TOK_TABLE_ROW_ATTR_USE_OPTIMAL_HEIGHT:
103 : : {
104 : : sOptimalHeight = sValue;
105 : : }
106 : : break;*/
107 : : }
108 : 4520 : }
109 [ + - ]: 4404 : GetScImport().GetTables().AddRow();
110 [ + - ]: 4404 : GetScImport().GetTables().SetRowStyle(sCellStyleName);
111 : 4404 : }
112 : :
113 : 4404 : ScXMLTableRowContext::~ScXMLTableRowContext()
114 : : {
115 [ - + ]: 8808 : }
116 : :
117 : 10481 : SvXMLImportContext *ScXMLTableRowContext::CreateChildContext( sal_uInt16 nPrefix,
118 : : const ::rtl::OUString& rLName,
119 : : const ::com::sun::star::uno::Reference<
120 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
121 : : {
122 : 10481 : SvXMLImportContext *pContext(0);
123 : :
124 : 10481 : const SvXMLTokenMap& rTokenMap(GetScImport().GetTableRowElemTokenMap());
125 [ + + - ]: 10481 : switch( rTokenMap.Get( nPrefix, rLName ) )
126 : : {
127 : : case XML_TOK_TABLE_ROW_CELL:
128 : : // if( IsInsertCellPossible() )
129 : : {
130 : 10340 : bHasCell = true;
131 : : pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix,
132 : : rLName, xAttrList, false, static_cast<SCROW>(nRepeatedRows)
133 : : //this
134 [ + - ]: 10340 : );
135 : : }
136 : 10340 : break;
137 : : case XML_TOK_TABLE_ROW_COVERED_CELL:
138 : : // if( IsInsertCellPossible() )
139 : : {
140 : 141 : bHasCell = true;
141 : : pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix,
142 : : rLName, xAttrList, true, static_cast<SCROW>(nRepeatedRows)
143 : : //this
144 [ + - ]: 141 : );
145 : : }
146 : 141 : break;
147 : : }
148 : :
149 [ - + ]: 10481 : if( !pContext )
150 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
151 : :
152 : 10481 : return pContext;
153 : : }
154 : :
155 : 4404 : void ScXMLTableRowContext::EndElement()
156 : : {
157 : 4404 : ScXMLImport& rXMLImport(GetScImport());
158 [ # # ][ - + ]: 4404 : if (!bHasCell && nRepeatedRows > 1)
159 : : {
160 [ # # ]: 0 : for (sal_Int32 i = 0; i < nRepeatedRows - 1; ++i) //one row is always added
161 [ # # ]: 0 : GetScImport().GetTables().AddRow();
162 : : OSL_FAIL("it seems here is a nonvalid file; possible missing of table:table-cell element");
163 : : }
164 : 4404 : SCTAB nSheet = rXMLImport.GetTables().GetCurrentSheet();
165 : 4404 : sal_Int32 nCurrentRow(rXMLImport.GetTables().GetCurrentRow());
166 [ + - ]: 4404 : uno::Reference<sheet::XSpreadsheet> xSheet(rXMLImport.GetTables().GetCurrentXSheet());
167 [ + - ]: 4404 : if(xSheet.is())
168 : : {
169 : 4404 : sal_Int32 nFirstRow(nCurrentRow - nRepeatedRows + 1);
170 [ - + ]: 4404 : if (nFirstRow > MAXROW)
171 : 0 : nFirstRow = MAXROW;
172 [ - + ]: 4404 : if (nCurrentRow > MAXROW)
173 : 0 : nCurrentRow = MAXROW;
174 [ + - ][ + - ]: 4404 : uno::Reference <table::XCellRange> xCellRange(xSheet->getCellRangeByPosition(0, nFirstRow, 0, nCurrentRow));
175 [ + - ]: 4404 : if (xCellRange.is())
176 : : {
177 [ + - ]: 4404 : uno::Reference<table::XColumnRowRange> xColumnRowRange (xCellRange, uno::UNO_QUERY);
178 [ + - ]: 4404 : if (xColumnRowRange.is())
179 : : {
180 [ + - ][ + - ]: 4404 : uno::Reference <beans::XPropertySet> xRowProperties(xColumnRowRange->getRows(), uno::UNO_QUERY);
[ + - ]
181 [ + - ]: 4404 : if (xRowProperties.is())
182 : : {
183 [ + - ]: 4404 : if (!sStyleName.isEmpty())
184 : : {
185 [ + - ]: 4404 : XMLTableStylesContext *pStyles((XMLTableStylesContext *)rXMLImport.GetAutoStyles());
186 [ + - ]: 4404 : if ( pStyles )
187 : : {
188 : : XMLTableStyleContext* pStyle((XMLTableStyleContext *)pStyles->FindStyleChildContext(
189 [ + - ]: 4404 : XML_STYLE_FAMILY_TABLE_ROW, sStyleName, true));
190 [ + - ]: 4404 : if (pStyle)
191 : : {
192 [ + - ]: 4404 : pStyle->FillPropertySet(xRowProperties);
193 : :
194 [ + + ]: 4404 : if ( nSheet != pStyle->GetLastSheet() )
195 : : {
196 [ + - ][ + - ]: 260 : ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData();
197 [ + - ]: 260 : pSheetData->AddRowStyle( sStyleName, ScAddress( 0, (SCROW)nFirstRow, nSheet ) );
198 : 260 : pStyle->SetLastSheet(nSheet);
199 : : }
200 : : }
201 : : }
202 : : }
203 : 4404 : bool bVisible (true);
204 : 4404 : bool bFiltered (false);
205 [ + - ][ - + ]: 4404 : if (IsXMLToken(sVisibility, XML_COLLAPSE))
206 : : {
207 : 0 : bVisible = false;
208 : : }
209 [ + - ][ + + ]: 4404 : else if (IsXMLToken(sVisibility, XML_FILTER))
210 : : {
211 : 32 : bVisible = false;
212 : 32 : bFiltered = true;
213 : : }
214 [ + + ]: 4404 : if (!bVisible)
215 [ + - ][ + - ]: 32 : xRowProperties->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ISVISIBLE)), uno::makeAny(bVisible));
[ + - ][ + - ]
216 [ + + ]: 4404 : if (bFiltered)
217 [ + - ][ + - ]: 4404 : xRowProperties->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ISFILTERED)), uno::makeAny(bFiltered));
[ + - ][ + - ]
218 : 4404 : }
219 : 4404 : }
220 : 4404 : }
221 : 4404 : }
222 : 4404 : }
223 : :
224 : 0 : ScXMLTableRowsContext::ScXMLTableRowsContext( ScXMLImport& rImport,
225 : : sal_uInt16 nPrfx,
226 : : const ::rtl::OUString& rLName,
227 : : const ::com::sun::star::uno::Reference<
228 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
229 : : const bool bTempHeader, const bool bTempGroup ) :
230 : : SvXMLImportContext( rImport, nPrfx, rLName ),
231 : : nHeaderStartRow(0),
232 : : nHeaderEndRow(0),
233 : : nGroupStartRow(0),
234 : : nGroupEndRow(0),
235 : : bHeader(bTempHeader),
236 : : bGroup(bTempGroup),
237 : 0 : bGroupDisplay(true)
238 : : {
239 : : // don't have any attributes
240 [ # # ]: 0 : if (bHeader)
241 : : {
242 : 0 : nHeaderStartRow = rImport.GetTables().GetCurrentRow();
243 : 0 : ++nHeaderStartRow;
244 : : }
245 [ # # ]: 0 : else if (bGroup)
246 : : {
247 : 0 : nGroupStartRow = rImport.GetTables().GetCurrentRow();
248 : 0 : ++nGroupStartRow;
249 [ # # ][ # # ]: 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
[ # # ]
250 [ # # ]: 0 : for( sal_Int16 i=0; i < nAttrCount; ++i )
251 : : {
252 [ # # ][ # # ]: 0 : const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
253 : 0 : rtl::OUString aLocalName;
254 : 0 : sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
255 [ # # ]: 0 : sAttrName, &aLocalName ));
256 [ # # ][ # # ]: 0 : const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
257 : :
258 [ # # ][ # # ]: 0 : if ((nPrefix == XML_NAMESPACE_TABLE) && IsXMLToken(aLocalName, XML_DISPLAY))
[ # # ][ # # ]
259 [ # # ]: 0 : bGroupDisplay = IsXMLToken(sValue, XML_TRUE);
260 : 0 : }
261 : : }
262 : 0 : }
263 : :
264 : 0 : ScXMLTableRowsContext::~ScXMLTableRowsContext()
265 : : {
266 [ # # ]: 0 : }
267 : :
268 : 0 : SvXMLImportContext *ScXMLTableRowsContext::CreateChildContext( sal_uInt16 nPrefix,
269 : : const ::rtl::OUString& rLName,
270 : : const ::com::sun::star::uno::Reference<
271 : : ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
272 : : {
273 : 0 : SvXMLImportContext *pContext(0);
274 : :
275 : 0 : const SvXMLTokenMap& rTokenMap(GetScImport().GetTableRowsElemTokenMap());
276 [ # # # # : 0 : switch( rTokenMap.Get( nPrefix, rLName ) )
# ]
277 : : {
278 : : case XML_TOK_TABLE_ROWS_ROW_GROUP:
279 : : pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
280 : : rLName, xAttrList,
281 [ # # ]: 0 : false, true );
282 : 0 : break;
283 : : case XML_TOK_TABLE_ROWS_HEADER_ROWS:
284 : : pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
285 : : rLName, xAttrList,
286 [ # # ]: 0 : true, false );
287 : 0 : break;
288 : : case XML_TOK_TABLE_ROWS_ROWS:
289 : : pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
290 : : rLName, xAttrList,
291 [ # # ]: 0 : false, false );
292 : 0 : break;
293 : : case XML_TOK_TABLE_ROWS_ROW:
294 : : pContext = new ScXMLTableRowContext( GetScImport(), nPrefix,
295 : : rLName, xAttrList//,
296 : : //this
297 [ # # ]: 0 : );
298 : 0 : break;
299 : : }
300 : :
301 [ # # ]: 0 : if( !pContext )
302 [ # # ]: 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
303 : :
304 : 0 : return pContext;
305 : : }
306 : :
307 : 0 : void ScXMLTableRowsContext::EndElement()
308 : : {
309 : 0 : ScXMLImport& rXMLImport(GetScImport());
310 [ # # ]: 0 : if (bHeader)
311 : : {
312 : 0 : nHeaderEndRow = rXMLImport.GetTables().GetCurrentRow();
313 [ # # ]: 0 : if (nHeaderStartRow <= nHeaderEndRow)
314 : : {
315 [ # # ][ # # ]: 0 : uno::Reference <sheet::XPrintAreas> xPrintAreas (rXMLImport.GetTables().GetCurrentXSheet(), uno::UNO_QUERY);
316 [ # # ]: 0 : if (xPrintAreas.is())
317 : : {
318 [ # # ][ # # ]: 0 : if (!xPrintAreas->getPrintTitleRows())
[ # # ]
319 : : {
320 [ # # ][ # # ]: 0 : xPrintAreas->setPrintTitleRows(true);
321 : 0 : table::CellRangeAddress aRowHeaderRange;
322 : 0 : aRowHeaderRange.StartRow = nHeaderStartRow;
323 : 0 : aRowHeaderRange.EndRow = nHeaderEndRow;
324 [ # # ][ # # ]: 0 : xPrintAreas->setTitleRows(aRowHeaderRange);
325 : : }
326 : : else
327 : : {
328 [ # # ][ # # ]: 0 : table::CellRangeAddress aRowHeaderRange(xPrintAreas->getTitleRows());
329 : 0 : aRowHeaderRange.EndRow = nHeaderEndRow;
330 [ # # ][ # # ]: 0 : xPrintAreas->setTitleRows(aRowHeaderRange);
331 : : }
332 : 0 : }
333 : : }
334 : : }
335 [ # # ]: 0 : else if (bGroup)
336 : : {
337 : 0 : nGroupEndRow = rXMLImport.GetTables().GetCurrentRow();
338 : 0 : SCTAB nSheet(rXMLImport.GetTables().GetCurrentSheet());
339 [ # # ]: 0 : if (nGroupStartRow <= nGroupEndRow)
340 : : {
341 : 0 : ScDocument* pDoc(GetScImport().GetDocument());
342 [ # # ]: 0 : if (pDoc)
343 : : {
344 [ # # ]: 0 : ScXMLImport::MutexGuard aGuard(GetScImport());
345 [ # # ]: 0 : ScOutlineTable* pOutlineTable(pDoc->GetOutlineTable(nSheet, true));
346 : 0 : ScOutlineArray* pRowArray(pOutlineTable->GetRowArray());
347 : : bool bResized;
348 [ # # ][ # # ]: 0 : pRowArray->Insert(static_cast<SCROW>(nGroupStartRow), static_cast<SCROW>(nGroupEndRow), bResized, !bGroupDisplay, true);
349 : : }
350 : : }
351 : : }
352 : 0 : }
353 : :
354 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|