xref: /AOO41X/main/sc/source/filter/xml/xmlcoli.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 "xmlcoli.hxx"
32 #include "xmlimprt.hxx"
33 #include "global.hxx"
34 #include "xmlstyli.hxx"
35 #include "document.hxx"
36 #include "docuno.hxx"
37 #include "olinetab.hxx"
38 #include "sheetdata.hxx"
39 #include "unonames.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 using namespace com::sun::star;
52 using namespace xmloff::token;
53 
54 //------------------------------------------------------------------
55 
ScXMLTableColContext(ScXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)56 ScXMLTableColContext::ScXMLTableColContext( ScXMLImport& rImport,
57                                       sal_uInt16 nPrfx,
58                                       const ::rtl::OUString& rLName,
59                                       const ::com::sun::star::uno::Reference<
60                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) :
61     SvXMLImportContext( rImport, nPrfx, rLName ),
62     sVisibility(GetXMLToken(XML_VISIBLE))
63 {
64     nColCount = 1;
65     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
66     const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetTableColAttrTokenMap();
67 
68     for( sal_Int16 i=0; i < nAttrCount; ++i )
69     {
70         const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
71         rtl::OUString aLocalName;
72         sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
73                                             sAttrName, &aLocalName );
74         const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
75 
76         switch( rAttrTokenMap.Get( nPrefix, aLocalName ) )
77         {
78             case XML_TOK_TABLE_COL_ATTR_REPEATED:
79                 {
80                     nColCount = sValue.toInt32();
81                 }
82                 break;
83             case XML_TOK_TABLE_COL_ATTR_STYLE_NAME:
84                 {
85                     sStyleName = sValue;
86                 }
87                 break;
88             case XML_TOK_TABLE_COL_ATTR_VISIBILITY:
89                 {
90                     sVisibility = sValue;
91                 }
92                 break;
93             case XML_TOK_TABLE_COL_ATTR_DEFAULT_CELL_STYLE_NAME:
94                 {
95                     sCellStyleName = sValue;
96                 }
97                 break;
98         }
99     }
100 }
101 
~ScXMLTableColContext()102 ScXMLTableColContext::~ScXMLTableColContext()
103 {
104 }
105 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> &)106 SvXMLImportContext *ScXMLTableColContext::CreateChildContext( sal_uInt16 nPrefix,
107                                             const ::rtl::OUString& rLName,
108                                             const ::com::sun::star::uno::Reference<
109                                         ::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
110 {
111     SvXMLImportContext *pContext = 0;
112 /*
113     const SvXMLTokenMap& rTokenMap = GetScImport().GetTableRowElemTokenMap();
114     sal_Bool bHeader = sal_False;
115     switch( rTokenMap.Get( nPrefix, rLName ) )
116     {
117     case XML_TOK_TABLE_ROW_CELL:
118 //      if( IsInsertCellPossible() )
119             pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix,
120                                                       rLName, xAttrList//,
121                                                       //this
122                                                       );
123         break;
124     case XML_TOK_TABLE_ROW_COVERED_CELL:
125 //      if( IsInsertCellPossible() )
126             pContext = new ScXMLTableRowCellContext( GetScImport(), nPrefix,
127                                                       rLName, xAttrList//,
128                                                       //this
129                                                       );
130         break;
131     }*/
132 
133     if( !pContext )
134         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
135 
136     return pContext;
137 }
138 
EndElement()139 void ScXMLTableColContext::EndElement()
140 {
141     ScXMLImport& rXMLImport = GetScImport();
142     sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet();
143     sal_Int32 nCurrentColumn = rXMLImport.GetTables().GetCurrentColumn();
144     uno::Reference<sheet::XSpreadsheet> xSheet(rXMLImport.GetTables().GetCurrentXSheet());
145     if(xSheet.is())
146     {
147         sal_Int32 nLastColumn(nCurrentColumn + nColCount - 1);
148         if (nLastColumn > MAXCOL)
149             nLastColumn = MAXCOL;
150         if (nCurrentColumn > MAXCOL)
151             nCurrentColumn = MAXCOL;
152         uno::Reference<table::XColumnRowRange> xColumnRowRange (xSheet->getCellRangeByPosition(nCurrentColumn, 0, nLastColumn, 0), uno::UNO_QUERY);
153         if (xColumnRowRange.is())
154         {
155             uno::Reference <beans::XPropertySet> xColumnProperties(xColumnRowRange->getColumns(), uno::UNO_QUERY);
156             if (xColumnProperties.is())
157             {
158                 if (sStyleName.getLength())
159                 {
160                     XMLTableStylesContext *pStyles = (XMLTableStylesContext *)rXMLImport.GetAutoStyles();
161                     if ( pStyles )
162                     {
163                         XMLTableStyleContext* pStyle = (XMLTableStyleContext *)pStyles->FindStyleChildContext(
164                             XML_STYLE_FAMILY_TABLE_COLUMN, sStyleName, sal_True);
165                         if (pStyle)
166                         {
167                             pStyle->FillPropertySet(xColumnProperties);
168 
169                             if ( nSheet != pStyle->GetLastSheet() )
170                             {
171                                 ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData();
172                                 pSheetData->AddColumnStyle( sStyleName, ScAddress( (SCCOL)nCurrentColumn, 0, (SCTAB)nSheet ) );
173                                 pStyle->SetLastSheet(nSheet);
174                             }
175                         }
176                     }
177                 }
178                 rtl::OUString sVisible(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CELLVIS));
179                 sal_Bool bValue(sal_True);
180                 if (!IsXMLToken(sVisibility, XML_VISIBLE))
181                     bValue = sal_False;
182                 xColumnProperties->setPropertyValue(sVisible, uno::makeAny(bValue));
183             }
184         }
185     }
186 
187     // #i57915# ScXMLImport::SetStyleToRange can't handle empty style names.
188     // The default for a column if there is no attribute is the style "Default" (programmatic API name).
189     if ( !sCellStyleName.getLength() )
190         sCellStyleName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "Default" ));
191 
192     GetScImport().GetTables().AddColCount(nColCount);
193     GetScImport().GetTables().AddColStyle(nColCount, sCellStyleName);
194 }
195 
ScXMLTableColsContext(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)196 ScXMLTableColsContext::ScXMLTableColsContext( ScXMLImport& rImport,
197                                       sal_uInt16 nPrfx,
198                                       const ::rtl::OUString& rLName,
199                                       const ::com::sun::star::uno::Reference<
200                                       ::com::sun::star::xml::sax::XAttributeList>& xAttrList,
201                                       const sal_Bool bTempHeader, const sal_Bool bTempGroup) :
202     SvXMLImportContext( rImport, nPrfx, rLName ),
203     nHeaderStartCol(0),
204     nHeaderEndCol(0),
205     nGroupStartCol(0),
206     nGroupEndCol(0),
207     bHeader(bTempHeader),
208     bGroup(bTempGroup),
209     bGroupDisplay(sal_True)
210 {
211     // don't have any attributes
212     if (bHeader)
213         nHeaderStartCol = rImport.GetTables().GetCurrentColumn();
214     else if (bGroup)
215     {
216         nGroupStartCol = rImport.GetTables().GetCurrentColumn();
217         sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
218         for( sal_Int16 i=0; i < nAttrCount; ++i )
219         {
220             const rtl::OUString& sAttrName(xAttrList->getNameByIndex( i ));
221             rtl::OUString aLocalName;
222             sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName(
223                                                 sAttrName, &aLocalName );
224             const rtl::OUString& sValue(xAttrList->getValueByIndex( i ));
225 
226             if (nPrefix == XML_NAMESPACE_TABLE && IsXMLToken(aLocalName, XML_DISPLAY))
227             {
228                 if (IsXMLToken(sValue, XML_FALSE))
229                     bGroupDisplay = sal_False;
230             }
231         }
232     }
233 }
234 
~ScXMLTableColsContext()235 ScXMLTableColsContext::~ScXMLTableColsContext()
236 {
237 }
238 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLName,const::com::sun::star::uno::Reference<::com::sun::star::xml::sax::XAttributeList> & xAttrList)239 SvXMLImportContext *ScXMLTableColsContext::CreateChildContext( sal_uInt16 nPrefix,
240                                             const ::rtl::OUString& rLName,
241                                             const ::com::sun::star::uno::Reference<
242                                         ::com::sun::star::xml::sax::XAttributeList>& xAttrList )
243 {
244     SvXMLImportContext *pContext = 0;
245 
246     const SvXMLTokenMap& rTokenMap = GetScImport().GetTableColsElemTokenMap();
247     switch( rTokenMap.Get( nPrefix, rLName ) )
248     {
249     case XML_TOK_TABLE_COLS_COL_GROUP:
250         pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
251                                                    rLName, xAttrList,
252                                                    sal_False, sal_True );
253         break;
254     case XML_TOK_TABLE_COLS_HEADER_COLS:
255         pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
256                                                    rLName, xAttrList,
257                                                    sal_True, sal_False );
258         break;
259     case XML_TOK_TABLE_COLS_COLS:
260         pContext = new ScXMLTableColsContext( GetScImport(), nPrefix,
261                                                    rLName, xAttrList,
262                                                    sal_False, sal_False );
263         break;
264     case XML_TOK_TABLE_COLS_COL:
265             pContext = new ScXMLTableColContext( GetScImport(), nPrefix,
266                                                       rLName, xAttrList//,
267                                                       //this
268                                                       );
269         break;
270     }
271 
272     if( !pContext )
273         pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
274 
275     return pContext;
276 }
277 
EndElement()278 void ScXMLTableColsContext::EndElement()
279 {
280     ScXMLImport& rXMLImport = GetScImport();
281     if (bHeader)
282     {
283         nHeaderEndCol = rXMLImport.GetTables().GetCurrentColumn();
284         nHeaderEndCol--;
285         if (nHeaderStartCol <= nHeaderEndCol)
286         {
287             uno::Reference <sheet::XPrintAreas> xPrintAreas (rXMLImport.GetTables().GetCurrentXSheet(), uno::UNO_QUERY);
288             if (xPrintAreas.is())
289             {
290                 if (!xPrintAreas->getPrintTitleColumns())
291                 {
292                     xPrintAreas->setPrintTitleColumns(sal_True);
293                     table::CellRangeAddress aColumnHeaderRange;
294                     aColumnHeaderRange.StartColumn = nHeaderStartCol;
295                     aColumnHeaderRange.EndColumn = nHeaderEndCol;
296                     xPrintAreas->setTitleColumns(aColumnHeaderRange);
297                 }
298                 else
299                 {
300                     table::CellRangeAddress aColumnHeaderRange(xPrintAreas->getTitleColumns());
301                     aColumnHeaderRange.EndColumn = nHeaderEndCol;
302                     xPrintAreas->setTitleColumns(aColumnHeaderRange);
303                 }
304             }
305         }
306     }
307     else if (bGroup)
308     {
309         sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet();
310         nGroupEndCol = rXMLImport.GetTables().GetCurrentColumn();
311         nGroupEndCol--;
312         if (nGroupStartCol <= nGroupEndCol)
313         {
314             ScDocument* pDoc = GetScImport().GetDocument();
315             if (pDoc)
316             {
317                 rXMLImport.LockSolarMutex();
318                 ScOutlineTable* pOutlineTable = pDoc->GetOutlineTable(static_cast<SCTAB>(nSheet), sal_True);
319                 ScOutlineArray* pColArray = pOutlineTable ? pOutlineTable->GetColArray() : NULL;
320                 if (pColArray)
321                 {
322                     sal_Bool bResized;
323                     pColArray->Insert(static_cast<SCCOL>(nGroupStartCol), static_cast<SCCOL>(nGroupEndCol), bResized, !bGroupDisplay, sal_True);
324                 }
325                 rXMLImport.UnlockSolarMutex();
326             }
327         }
328     }
329 }
330