update ooo310-m15
[ooovba.git] / sc / source / filter / xml / xmlrowi.cxx
blob0bd7c90961d9d1d2c4ae54097467cc0de7a7b2f1
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: xmlrowi.cxx,v $
10 * $Revision: 1.29 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
36 // INCLUDE ---------------------------------------------------------------
38 #include "xmlrowi.hxx"
39 #include "xmlimprt.hxx"
40 #include "xmlcelli.hxx"
41 #include "global.hxx"
42 #include "xmlstyli.hxx"
43 #include "document.hxx"
44 #include "docuno.hxx"
45 #include "olinetab.hxx"
47 #include <xmloff/xmltkmap.hxx>
48 #include <xmloff/nmspmap.hxx>
49 #include <xmloff/xmlnmspe.hxx>
50 #include <xmloff/families.hxx>
51 #include <xmloff/xmltoken.hxx>
52 #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
53 #include <com/sun/star/sheet/XSpreadsheet.hpp>
54 #include <com/sun/star/table/XColumnRowRange.hpp>
55 #include <com/sun/star/sheet/XPrintAreas.hpp>
57 #include <com/sun/star/table/CellAddress.hpp>
59 #define SC_ISVISIBLE "IsVisible"
60 #define SC_OPTIMALHEIGHT "OptimalHeight"
61 #define SC_ISFILTERED "IsFiltered"
63 using namespace com::sun::star;
64 using namespace xmloff::token;
66 //------------------------------------------------------------------
68 ScXMLTableRowContext::ScXMLTableRowContext( ScXMLImport& rImport,
69 USHORT nPrfx,
70 const ::rtl::OUString& rLName,
71 const ::com::sun::star::uno::Reference<
72 ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) :
73 SvXMLImportContext( rImport, nPrfx, rLName ),
74 sVisibility(GetXMLToken(XML_VISIBLE)),
75 nRepeatedRows(1),
76 bHasCell(sal_False)
78 rtl::OUString sCellStyleName;
79 sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
80 const SvXMLTokenMap& rAttrTokenMap(GetScImport().GetTableRowAttrTokenMap());
81 for( sal_Int16 i=0; i < nAttrCount; ++i )
83 const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
84 rtl::OUString aLocalName;
85 sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
86 sAttrName, &aLocalName ));
87 const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
89 switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
91 case XML_TOK_TABLE_ROW_ATTR_STYLE_NAME:
93 sStyleName = sValue;
95 break;
96 case XML_TOK_TABLE_ROW_ATTR_VISIBILITY:
98 sVisibility = sValue;
100 break;
101 case XML_TOK_TABLE_ROW_ATTR_REPEATED:
103 nRepeatedRows = std::max( sValue.toInt32(), (sal_Int32) 1 );
105 break;
106 case XML_TOK_TABLE_ROW_ATTR_DEFAULT_CELL_STYLE_NAME:
108 sCellStyleName = sValue;
110 break;
111 /*case XML_TOK_TABLE_ROW_ATTR_USE_OPTIMAL_HEIGHT:
113 sOptimalHeight = sValue;
115 break;*/
118 GetScImport().GetTables().AddRow();
119 GetScImport().GetTables().SetRowStyle(sCellStyleName);
122 ScXMLTableRowContext::~ScXMLTableRowContext()
126 SvXMLImportContext *ScXMLTableRowContext::CreateChildContext( USHORT nPrefix,
127 const ::rtl::OUString& rLName,
128 const ::com::sun::star::uno::Reference<
129 ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
131 SvXMLImportContext *pContext(0);
133 const SvXMLTokenMap& rTokenMap(GetScImport().GetTableRowElemTokenMap());
134 switch( rTokenMap.Get( nPrefix, rLName ) )
136 case XML_TOK_TABLE_ROW_CELL:
137 // if( IsInsertCellPossible() )
139 bHasCell = sal_True;
140 pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix,
141 rLName, xAttrList, sal_False, nRepeatedRows
142 //this
145 break;
146 case XML_TOK_TABLE_ROW_COVERED_CELL:
147 // if( IsInsertCellPossible() )
149 bHasCell = sal_True;
150 pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix,
151 rLName, xAttrList, sal_True, nRepeatedRows
152 //this
155 break;
158 if( !pContext )
159 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
161 return pContext;
164 void ScXMLTableRowContext::EndElement()
166 ScXMLImport& rXMLImport(GetScImport());
167 if (!bHasCell && nRepeatedRows > 1)
169 for (sal_Int32 i = 0; i < nRepeatedRows - 1; ++i) //one row is always added
170 GetScImport().GetTables().AddRow();
171 DBG_ERRORFILE("it seems here is a nonvalid file; possible missing of table:table-cell element");
173 sal_Int32 nCurrentRow(rXMLImport.GetTables().GetCurrentRow());
174 uno::Reference<sheet::XSpreadsheet> xSheet(rXMLImport.GetTables().GetCurrentXSheet());
175 if(xSheet.is())
177 sal_Int32 nFirstRow(nCurrentRow - nRepeatedRows + 1);
178 if (nFirstRow > MAXROW)
179 nFirstRow = MAXROW;
180 if (nCurrentRow > MAXROW)
181 nCurrentRow = MAXROW;
182 uno::Reference <table::XCellRange> xCellRange(xSheet->getCellRangeByPosition(0, nFirstRow, 0, nCurrentRow));
183 if (xCellRange.is())
185 uno::Reference<table::XColumnRowRange> xColumnRowRange (xCellRange, uno::UNO_QUERY);
186 if (xColumnRowRange.is())
188 uno::Reference <beans::XPropertySet> xRowProperties(xColumnRowRange->getRows(), uno::UNO_QUERY);
189 if (xRowProperties.is())
191 if (sStyleName.getLength())
193 XMLTableStylesContext *pStyles((XMLTableStylesContext *)rXMLImport.GetAutoStyles());
194 if ( pStyles )
196 XMLTableStyleContext* pStyle((XMLTableStyleContext *)pStyles->FindStyleChildContext(
197 XML_STYLE_FAMILY_TABLE_ROW, sStyleName, sal_True));
198 if (pStyle)
199 pStyle->FillPropertySet(xRowProperties);
202 sal_Bool bVisible (sal_True);
203 sal_Bool bFiltered (sal_False);
204 if (IsXMLToken(sVisibility, XML_COLLAPSE))
206 bVisible = sal_False;
208 else if (IsXMLToken(sVisibility, XML_FILTER))
210 bVisible = sal_False;
211 bFiltered = sal_True;
213 if (!bVisible)
214 xRowProperties->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ISVISIBLE)), uno::makeAny(bVisible));
215 if (bFiltered)
216 xRowProperties->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ISFILTERED)), uno::makeAny(bFiltered));
223 ScXMLTableRowsContext::ScXMLTableRowsContext( ScXMLImport& rImport,
224 USHORT nPrfx,
225 const ::rtl::OUString& rLName,
226 const ::com::sun::star::uno::Reference<
227 ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
228 const sal_Bool bTempHeader, const sal_Bool bTempGroup ) :
229 SvXMLImportContext( rImport, nPrfx, rLName ),
230 nHeaderStartRow(0),
231 nHeaderEndRow(0),
232 nGroupStartRow(0),
233 nGroupEndRow(0),
234 bHeader(bTempHeader),
235 bGroup(bTempGroup),
236 bGroupDisplay(sal_True)
238 // don't have any attributes
239 if (bHeader)
241 nHeaderStartRow = rImport.GetTables().GetCurrentRow();
242 ++nHeaderStartRow;
244 else if (bGroup)
246 nGroupStartRow = rImport.GetTables().GetCurrentRow();
247 ++nGroupStartRow;
248 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
249 for( sal_Int16 i=0; i < nAttrCount; ++i )
251 const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
252 rtl::OUString aLocalName;
253 sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
254 sAttrName, &aLocalName ));
255 const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
257 if ((nPrefix == XML_NAMESPACE_TABLE) && IsXMLToken(aLocalName, XML_DISPLAY))
258 bGroupDisplay = IsXMLToken(sValue, XML_TRUE);
263 ScXMLTableRowsContext::~ScXMLTableRowsContext()
267 SvXMLImportContext *ScXMLTableRowsContext::CreateChildContext( USHORT nPrefix,
268 const ::rtl::OUString& rLName,
269 const ::com::sun::star::uno::Reference<
270 ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
272 SvXMLImportContext *pContext(0);
274 const SvXMLTokenMap& rTokenMap(GetScImport().GetTableRowsElemTokenMap());
275 switch( rTokenMap.Get( nPrefix, rLName ) )
277 case XML_TOK_TABLE_ROWS_ROW_GROUP:
278 pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
279 rLName, xAttrList,
280 sal_False, sal_True );
281 break;
282 case XML_TOK_TABLE_ROWS_HEADER_ROWS:
283 pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
284 rLName, xAttrList,
285 sal_True, sal_False );
286 break;
287 case XML_TOK_TABLE_ROWS_ROWS:
288 pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
289 rLName, xAttrList,
290 sal_False, sal_False );
291 break;
292 case XML_TOK_TABLE_ROWS_ROW:
293 pContext = new ScXMLTableRowContext( GetScImport(), nPrefix,
294 rLName, xAttrList//,
295 //this
297 break;
300 if( !pContext )
301 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
303 return pContext;
306 void ScXMLTableRowsContext::EndElement()
308 ScXMLImport& rXMLImport(GetScImport());
309 if (bHeader)
311 nHeaderEndRow = rXMLImport.GetTables().GetCurrentRow();
312 if (nHeaderStartRow <= nHeaderEndRow)
314 uno::Reference <sheet::XPrintAreas> xPrintAreas (rXMLImport.GetTables().GetCurrentXSheet(), uno::UNO_QUERY);
315 if (xPrintAreas.is())
317 if (!xPrintAreas->getPrintTitleRows())
319 xPrintAreas->setPrintTitleRows(sal_True);
320 table::CellRangeAddress aRowHeaderRange;
321 aRowHeaderRange.StartRow = nHeaderStartRow;
322 aRowHeaderRange.EndRow = nHeaderEndRow;
323 xPrintAreas->setTitleRows(aRowHeaderRange);
325 else
327 table::CellRangeAddress aRowHeaderRange(xPrintAreas->getTitleRows());
328 aRowHeaderRange.EndRow = nHeaderEndRow;
329 xPrintAreas->setTitleRows(aRowHeaderRange);
334 else if (bGroup)
336 nGroupEndRow = rXMLImport.GetTables().GetCurrentRow();
337 sal_Int32 nSheet(rXMLImport.GetTables().GetCurrentSheet());
338 if (nGroupStartRow <= nGroupEndRow)
340 ScDocument* pDoc(GetScImport().GetDocument());
341 if (pDoc)
343 GetScImport().LockSolarMutex();
344 ScOutlineTable* pOutlineTable(pDoc->GetOutlineTable(static_cast<SCTAB>(nSheet), sal_True));
345 ScOutlineArray* pRowArray(pOutlineTable->GetRowArray());
346 sal_Bool bResized;
347 pRowArray->Insert(static_cast<SCROW>(nGroupStartRow), static_cast<SCROW>(nGroupEndRow), bResized, !bGroupDisplay, sal_True);
348 GetScImport().UnlockSolarMutex();