xref: /AOO41X/main/sc/source/filter/xml/xmlrowi.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 
28 
29 // INCLUDE ---------------------------------------------------------------
30 
31 #include "xmlrowi.hxx"
32 #include "xmlimprt.hxx"
33 #include "xmlcelli.hxx"
34 #include "global.hxx"
35 #include "xmlstyli.hxx"
36 #include "document.hxx"
37 #include "docuno.hxx"
38 #include "olinetab.hxx"
39 #include "sheetdata.hxx"
40 
41 #include <xmloff/xmltkmap.hxx>
42 #include <xmloff/nmspmap.hxx>
43 #include <xmloff/xmlnmspe.hxx>
44 #include <xmloff/families.hxx>
45 #include <xmloff/xmltoken.hxx>
46 #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
47 #include <com/sun/star/sheet/XSpreadsheet.hpp>
48 #include <com/sun/star/table/XColumnRowRange.hpp>
49 #include <com/sun/star/sheet/XPrintAreas.hpp>
50 
51 #include <com/sun/star/table/CellAddress.hpp>
52 
53 #define SC_ISVISIBLE "IsVisible"
54 #define SC_OPTIMALHEIGHT "OptimalHeight"
55 #define SC_ISFILTERED "IsFiltered"
56 
57 using namespace com::sun::star;
58 using namespace xmloff::token;
59 
60 //------------------------------------------------------------------
61 
ScXMLTableRowContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)62 ScXMLTableRowContext::ScXMLTableRowContext( ScXMLImport& rImport,
63                                       sal_uInt16 nPrfx,
64                                       const ::rtl::OUString& rLName,
65                                       const ::com::sun::star::uno::Reference<
66                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) :
67     SvXMLImportContext( rImport, nPrfx, rLName ),
68     sVisibility(GetXMLToken(XML_VISIBLE)),
69     nRepeatedRows(1),
70     bHasCell(sal_False)
71 {
72     rtl::OUString sCellStyleName;
73     sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
74     const SvXMLTokenMap& rAttrTokenMap(GetScImport().GetTableRowAttrTokenMap());
75     for( sal_Int16 i=0; i < nAttrCount; ++i )
76     {
77         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
78         rtl::OUString aLocalName;
79         sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
80                                             sAttrName, &aLocalName ));
81         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
82 
83         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
84         {
85             case XML_TOK_TABLE_ROW_ATTR_STYLE_NAME:
86             {
87                 sStyleName = sValue;
88             }
89             break;
90             case XML_TOK_TABLE_ROW_ATTR_VISIBILITY:
91             {
92                 sVisibility = sValue;
93             }
94             break;
95             case XML_TOK_TABLE_ROW_ATTR_REPEATED:
96             {
97                 nRepeatedRows = std::max( sValue.toInt32(), (sal_Int32) 1 );
98             }
99             break;
100             case XML_TOK_TABLE_ROW_ATTR_DEFAULT_CELL_STYLE_NAME:
101             {
102                 sCellStyleName = sValue;
103             }
104             break;
105             /*case XML_TOK_TABLE_ROW_ATTR_USE_OPTIMAL_HEIGHT:
106             {
107                 sOptimalHeight = sValue;
108             }
109             break;*/
110         }
111     }
112     GetScImport().GetTables().AddRow();
113     GetScImport().GetTables().SetRowStyle(sCellStyleName);
114 }
115 
~ScXMLTableRowContext()116 ScXMLTableRowContext::~ScXMLTableRowContext()
117 {
118 }
119 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)120 SvXMLImportContext *ScXMLTableRowContext::CreateChildContext( sal_uInt16 nPrefix,
121                                             const ::rtl::OUString& rLName,
122                                             const ::com::sun::star::uno::Reference<
123                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
124 {
125     SvXMLImportContext *pContext(0);
126 
127     const SvXMLTokenMap& rTokenMap(GetScImport().GetTableRowElemTokenMap());
128     switch( rTokenMap.Get( nPrefix, rLName ) )
129     {
130     case XML_TOK_TABLE_ROW_CELL:
131 //      if( IsInsertCellPossible() )
132         {
133             bHasCell = sal_True;
134             pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix,
135                                                       rLName, xAttrList, sal_False, nRepeatedRows
136                                                       //this
137                                                       );
138         }
139         break;
140     case XML_TOK_TABLE_ROW_COVERED_CELL:
141 //      if( IsInsertCellPossible() )
142         {
143             bHasCell = sal_True;
144             pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix,
145                                                       rLName, xAttrList, sal_True, nRepeatedRows
146                                                       //this
147                                                       );
148         }
149         break;
150     }
151 
152     if( !pContext )
153         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
154 
155     return pContext;
156 }
157 
EndElement()158 void ScXMLTableRowContext::EndElement()
159 {
160     ScXMLImport& rXMLImport(GetScImport());
161     if (!bHasCell && nRepeatedRows > 1)
162     {
163         for (sal_Int32 i = 0; i < nRepeatedRows - 1; ++i) //one row is always added
164             GetScImport().GetTables().AddRow();
165         DBG_ERRORFILE("it seems here is a nonvalid file; possible missing of table:table-cell element");
166     }
167     sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet();
168     sal_Int32 nCurrentRow(rXMLImport.GetTables().GetCurrentRow());
169     uno::Reference<sheet::XSpreadsheet> xSheet(rXMLImport.GetTables().GetCurrentXSheet());
170     ScDocument* pDoc = rXMLImport.GetDocument();
171     if(xSheet.is())
172     {
173         sal_Int32 nFirstRow(nCurrentRow - nRepeatedRows + 1);
174         if (nFirstRow > MAXROW)
175             nFirstRow = MAXROW;
176         if (nCurrentRow > MAXROW)
177             nCurrentRow = MAXROW;
178         uno::Reference <table::XCellRange> xCellRange(xSheet->getCellRangeByPosition(0, nFirstRow, 0, nCurrentRow));
179         if (xCellRange.is())
180         {
181             uno::Reference<table::XColumnRowRange> xColumnRowRange (xCellRange, uno::UNO_QUERY);
182             if (xColumnRowRange.is())
183             {
184                 uno::Reference <beans::XPropertySet> xRowProperties(xColumnRowRange->getRows(), uno::UNO_QUERY);
185                 if (xRowProperties.is())
186                 {
187                     if (sStyleName.getLength())
188                     {
189                         XMLTableStylesContext *pStyles((XMLTableStylesContext *)rXMLImport.GetAutoStyles());
190                         if ( pStyles )
191                         {
192                             XMLTableStyleContext* pStyle((XMLTableStyleContext *)pStyles->FindStyleChildContext(
193                                 XML_STYLE_FAMILY_TABLE_ROW, sStyleName, sal_True));
194                             if (pStyle)
195                             {
196                                 pStyle->FillPropertySet(xRowProperties);
197 
198                                 if ( nSheet != pStyle->GetLastSheet() )
199                                 {
200                                     ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData();
201                                     pSheetData->AddRowStyle( sStyleName, ScAddress( 0, (SCROW)nFirstRow, (SCTAB)nSheet ) );
202                                     pStyle->SetLastSheet(nSheet);
203                                 }
204                             }
205                         }
206                     }
207                     sal_Bool bVisible (sal_True);
208                     sal_Bool bFiltered (sal_False);
209                     if (IsXMLToken(sVisibility, XML_COLLAPSE))
210                     {
211                         bVisible = sal_False;
212                     }
213                     else if (IsXMLToken(sVisibility, XML_FILTER))
214                     {
215                         bVisible = sal_False;
216                         bFiltered = sal_True;
217                     }
218 
219                     // #i116164# call SetRowHidden/SetRowFiltered directly, so the tree doesn't have to be rebuilt
220                     // to compare with existing hidden flags.
221                     if (!bVisible && pDoc)
222                         pDoc->SetRowHidden((SCROW)nFirstRow, (SCROW)nCurrentRow, (SCTAB)nSheet, true);
223                     if (bFiltered && pDoc)
224                         pDoc->SetRowFiltered((SCROW)nFirstRow, (SCROW)nCurrentRow, (SCTAB)nSheet, true);
225 
226                     //if (!bVisible)
227                     //    xRowProperties->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ISVISIBLE)), uno::makeAny(bVisible));
228                     //if (bFiltered)
229                     //    xRowProperties->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ISFILTERED)), uno::makeAny(bFiltered));
230                 }
231             }
232         }
233     }
234 }
235 
ScXMLTableRowsContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList,const sal_Bool bTempHeader,const sal_Bool bTempGroup)236 ScXMLTableRowsContext::ScXMLTableRowsContext( ScXMLImport& rImport,
237                                       sal_uInt16 nPrfx,
238                                       const ::rtl::OUString& rLName,
239                                       const ::com::sun::star::uno::Reference<
240                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
241                                       const sal_Bool bTempHeader, const sal_Bool bTempGroup ) :
242     SvXMLImportContext( rImport, nPrfx, rLName ),
243     nHeaderStartRow(0),
244     nHeaderEndRow(0),
245     nGroupStartRow(0),
246     nGroupEndRow(0),
247     bHeader(bTempHeader),
248     bGroup(bTempGroup),
249     bGroupDisplay(sal_True)
250 {
251     // don't have any attributes
252     if (bHeader)
253     {
254         nHeaderStartRow = rImport.GetTables().GetCurrentRow();
255         ++nHeaderStartRow;
256     }
257     else if (bGroup)
258     {
259         nGroupStartRow = rImport.GetTables().GetCurrentRow();
260         ++nGroupStartRow;
261         sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
262         for( sal_Int16 i=0; i < nAttrCount; ++i )
263         {
264             const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
265             rtl::OUString aLocalName;
266             sal_uInt16 nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
267                                                 sAttrName, &aLocalName ));
268             const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
269 
270             if ((nPrefix == XML_NAMESPACE_TABLE) && IsXMLToken(aLocalName, XML_DISPLAY))
271                 bGroupDisplay = IsXMLToken(sValue, XML_TRUE);
272         }
273     }
274 }
275 
~ScXMLTableRowsContext()276 ScXMLTableRowsContext::~ScXMLTableRowsContext()
277 {
278 }
279 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)280 SvXMLImportContext *ScXMLTableRowsContext::CreateChildContext( sal_uInt16 nPrefix,
281                                             const ::rtl::OUString& rLName,
282                                             const ::com::sun::star::uno::Reference<
283                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
284 {
285     SvXMLImportContext *pContext(0);
286 
287     const SvXMLTokenMap& rTokenMap(GetScImport().GetTableRowsElemTokenMap());
288     switch( rTokenMap.Get( nPrefix, rLName ) )
289     {
290     case XML_TOK_TABLE_ROWS_ROW_GROUP:
291         pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
292                                                    rLName, xAttrList,
293                                                    sal_False, sal_True );
294         break;
295     case XML_TOK_TABLE_ROWS_HEADER_ROWS:
296         pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
297                                                    rLName, xAttrList,
298                                                    sal_True, sal_False );
299         break;
300     case XML_TOK_TABLE_ROWS_ROWS:
301         pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix,
302                                                    rLName, xAttrList,
303                                                    sal_False, sal_False );
304         break;
305     case XML_TOK_TABLE_ROWS_ROW:
306             pContext = new ScXMLTableRowContext( GetScImport(), nPrefix,
307                                                       rLName, xAttrList//,
308                                                       //this
309                                                       );
310         break;
311     }
312 
313     if( !pContext )
314         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
315 
316     return pContext;
317 }
318 
EndElement()319 void ScXMLTableRowsContext::EndElement()
320 {
321     ScXMLImport& rXMLImport(GetScImport());
322     if (bHeader)
323     {
324         nHeaderEndRow = rXMLImport.GetTables().GetCurrentRow();
325         if (nHeaderStartRow <= nHeaderEndRow)
326         {
327             uno::Reference <sheet::XPrintAreas> xPrintAreas (rXMLImport.GetTables().GetCurrentXSheet(), uno::UNO_QUERY);
328             if (xPrintAreas.is())
329             {
330                 if (!xPrintAreas->getPrintTitleRows())
331                 {
332                     xPrintAreas->setPrintTitleRows(sal_True);
333                     table::CellRangeAddress aRowHeaderRange;
334                     aRowHeaderRange.StartRow = nHeaderStartRow;
335                     aRowHeaderRange.EndRow = nHeaderEndRow;
336                     xPrintAreas->setTitleRows(aRowHeaderRange);
337                 }
338                 else
339                 {
340                     table::CellRangeAddress aRowHeaderRange(xPrintAreas->getTitleRows());
341                     aRowHeaderRange.EndRow = nHeaderEndRow;
342                     xPrintAreas->setTitleRows(aRowHeaderRange);
343                 }
344             }
345         }
346     }
347     else if (bGroup)
348     {
349         nGroupEndRow = rXMLImport.GetTables().GetCurrentRow();
350         sal_Int32 nSheet(rXMLImport.GetTables().GetCurrentSheet());
351         if (nGroupStartRow <= nGroupEndRow)
352         {
353             ScDocument* pDoc(GetScImport().GetDocument());
354             if (pDoc)
355             {
356                 GetScImport().LockSolarMutex();
357                 ScOutlineTable* pOutlineTable(pDoc->GetOutlineTable(static_cast<SCTAB>(nSheet), sal_True));
358                 ScOutlineArray* pRowArray(pOutlineTable->GetRowArray());
359                 sal_Bool bResized;
360                 pRowArray->Insert(static_cast<SCROW>(nGroupStartRow), static_cast<SCROW>(nGroupEndRow), bResized, !bGroupDisplay, sal_True);
361                 GetScImport().UnlockSolarMutex();
362             }
363         }
364     }
365 }
366