1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: xmlrowi.cxx,v $
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"
42 #include "xmlstyli.hxx"
43 #include "document.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
,
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
)),
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
:
96 case XML_TOK_TABLE_ROW_ATTR_VISIBILITY
:
101 case XML_TOK_TABLE_ROW_ATTR_REPEATED
:
103 nRepeatedRows
= std::max( sValue
.toInt32(), (sal_Int32
) 1 );
106 case XML_TOK_TABLE_ROW_ATTR_DEFAULT_CELL_STYLE_NAME
:
108 sCellStyleName
= sValue
;
111 /*case XML_TOK_TABLE_ROW_ATTR_USE_OPTIMAL_HEIGHT:
113 sOptimalHeight = sValue;
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() )
140 pContext
= new ScXMLTableRowCellContext( GetScImport(), nPrefix
,
141 rLName
, xAttrList
, sal_False
, nRepeatedRows
146 case XML_TOK_TABLE_ROW_COVERED_CELL
:
147 // if( IsInsertCellPossible() )
150 pContext
= new ScXMLTableRowCellContext( GetScImport(), nPrefix
,
151 rLName
, xAttrList
, sal_True
, nRepeatedRows
159 pContext
= new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
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());
177 sal_Int32
nFirstRow(nCurrentRow
- nRepeatedRows
+ 1);
178 if (nFirstRow
> MAXROW
)
180 if (nCurrentRow
> MAXROW
)
181 nCurrentRow
= MAXROW
;
182 uno::Reference
<table::XCellRange
> xCellRange(xSheet
->getCellRangeByPosition(0, nFirstRow
, 0, nCurrentRow
));
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());
196 XMLTableStyleContext
* pStyle((XMLTableStyleContext
*)pStyles
->FindStyleChildContext(
197 XML_STYLE_FAMILY_TABLE_ROW
, sStyleName
, sal_True
));
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
;
214 xRowProperties
->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ISVISIBLE
)), uno::makeAny(bVisible
));
216 xRowProperties
->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ISFILTERED
)), uno::makeAny(bFiltered
));
223 ScXMLTableRowsContext::ScXMLTableRowsContext( ScXMLImport
& rImport
,
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
),
234 bHeader(bTempHeader
),
236 bGroupDisplay(sal_True
)
238 // don't have any attributes
241 nHeaderStartRow
= rImport
.GetTables().GetCurrentRow();
246 nGroupStartRow
= rImport
.GetTables().GetCurrentRow();
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
,
280 sal_False
, sal_True
);
282 case XML_TOK_TABLE_ROWS_HEADER_ROWS
:
283 pContext
= new ScXMLTableRowsContext( GetScImport(), nPrefix
,
285 sal_True
, sal_False
);
287 case XML_TOK_TABLE_ROWS_ROWS
:
288 pContext
= new ScXMLTableRowsContext( GetScImport(), nPrefix
,
290 sal_False
, sal_False
);
292 case XML_TOK_TABLE_ROWS_ROW
:
293 pContext
= new ScXMLTableRowContext( GetScImport(), nPrefix
,
301 pContext
= new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
306 void ScXMLTableRowsContext::EndElement()
308 ScXMLImport
& rXMLImport(GetScImport());
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
);
327 table::CellRangeAddress
aRowHeaderRange(xPrintAreas
->getTitleRows());
328 aRowHeaderRange
.EndRow
= nHeaderEndRow
;
329 xPrintAreas
->setTitleRows(aRowHeaderRange
);
336 nGroupEndRow
= rXMLImport
.GetTables().GetCurrentRow();
337 sal_Int32
nSheet(rXMLImport
.GetTables().GetCurrentSheet());
338 if (nGroupStartRow
<= nGroupEndRow
)
340 ScDocument
* pDoc(GetScImport().GetDocument());
343 GetScImport().LockSolarMutex();
344 ScOutlineTable
* pOutlineTable(pDoc
->GetOutlineTable(static_cast<SCTAB
>(nSheet
), sal_True
));
345 ScOutlineArray
* pRowArray(pOutlineTable
->GetRowArray());
347 pRowArray
->Insert(static_cast<SCROW
>(nGroupStartRow
), static_cast<SCROW
>(nGroupEndRow
), bResized
, !bGroupDisplay
, sal_True
);
348 GetScImport().UnlockSolarMutex();