Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "SchXMLImport.hxx"
21 : #include "SchXMLChartContext.hxx"
22 : #include "contexts.hxx"
23 : #include "XMLChartPropertySetMapper.hxx"
24 : #include "SchXMLTools.hxx"
25 : #include "facreg.hxx"
26 :
27 : #include <rtl/ustrbuf.hxx>
28 : #include <comphelper/processfactory.hxx>
29 : #include <xmloff/xmlnmspe.hxx>
30 : #include <xmloff/xmltoken.hxx>
31 : #include <xmloff/xmluconv.hxx>
32 : #include <xmloff/nmspmap.hxx>
33 : #include <xmloff/xmlictxt.hxx>
34 : #include <xmloff/xmlstyle.hxx>
35 : #include <com/sun/star/task/XStatusIndicatorSupplier.hpp>
36 : #include <com/sun/star/chart/XChartDocument.hpp>
37 : #include <com/sun/star/chart/ChartDataRowSource.hpp>
38 : #include <com/sun/star/container/XChild.hpp>
39 : #include <com/sun/star/uno/XComponentContext.hpp>
40 : #include <com/sun/star/chart2/data/XDataReceiver.hpp>
41 : #include <com/sun/star/chart2/data/XDataProvider.hpp>
42 : #include <com/sun/star/chart2/XChartDocument.hpp>
43 : #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
44 : #include <com/sun/star/chart2/XChartTypeContainer.hpp>
45 : #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
46 :
47 : #include <com/sun/star/document/XDocumentProperties.hpp>
48 : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
49 :
50 : #include <typeinfo>
51 :
52 : using namespace com::sun::star;
53 : using namespace ::xmloff::token;
54 :
55 : using ::com::sun::star::uno::Reference;
56 : using ::com::sun::star::uno::Sequence;
57 :
58 : namespace
59 : {
60 4680 : class lcl_MatchesChartType : public ::std::unary_function< Reference< chart2::XChartType >, bool >
61 : {
62 : public:
63 520 : explicit lcl_MatchesChartType( const OUString & aChartTypeName ) :
64 520 : m_aChartTypeName( aChartTypeName )
65 520 : {}
66 :
67 552 : bool operator () ( const Reference< chart2::XChartType > & xChartType ) const
68 : {
69 1656 : return (xChartType.is() &&
70 1656 : xChartType->getChartType().equals( m_aChartTypeName ));
71 : }
72 :
73 : private:
74 : OUString m_aChartTypeName;
75 : };
76 : } // anonymous namespace
77 :
78 : // TokenMaps for distinguishing different
79 : // tokens in different contexts
80 :
81 : // element maps
82 :
83 : // attribute maps
84 :
85 2466 : SchXMLImportHelper::SchXMLImportHelper() :
86 : mpAutoStyles( 0 ),
87 :
88 : mpChartDocElemTokenMap( 0 ),
89 : mpTableElemTokenMap( 0 ),
90 : mpChartElemTokenMap( 0 ),
91 : mpPlotAreaElemTokenMap( 0 ),
92 : mpSeriesElemTokenMap( 0 ),
93 :
94 : mpChartAttrTokenMap( 0 ),
95 : mpPlotAreaAttrTokenMap( 0 ),
96 : mpAutoStyleAttrTokenMap( 0 ),
97 : mpCellAttrTokenMap( 0 ),
98 : mpSeriesAttrTokenMap( 0 ),
99 : mpPropMappingAttrTokenMap( 0 ),
100 2466 : mpRegEquationAttrTokenMap( 0 )
101 : {
102 2466 : }
103 :
104 6676 : SchXMLImportHelper::~SchXMLImportHelper()
105 : {
106 : // delete token maps
107 2466 : if( mpChartDocElemTokenMap )
108 486 : delete mpChartDocElemTokenMap;
109 2466 : if( mpTableElemTokenMap )
110 244 : delete mpTableElemTokenMap;
111 2466 : if( mpChartElemTokenMap )
112 244 : delete mpChartElemTokenMap;
113 2466 : if( mpPlotAreaElemTokenMap )
114 244 : delete mpPlotAreaElemTokenMap;
115 2466 : if( mpSeriesElemTokenMap )
116 244 : delete mpSeriesElemTokenMap;
117 :
118 2466 : if( mpChartAttrTokenMap )
119 244 : delete mpChartAttrTokenMap;
120 2466 : if( mpPlotAreaAttrTokenMap )
121 244 : delete mpPlotAreaAttrTokenMap;
122 2466 : if( mpAutoStyleAttrTokenMap )
123 0 : delete mpAutoStyleAttrTokenMap;
124 2466 : if( mpCellAttrTokenMap )
125 244 : delete mpCellAttrTokenMap;
126 2466 : if( mpSeriesAttrTokenMap )
127 244 : delete mpSeriesAttrTokenMap;
128 2466 : delete mpPropMappingAttrTokenMap;
129 4210 : }
130 :
131 244 : SvXMLImportContext* SchXMLImportHelper::CreateChartContext(
132 : SvXMLImport& rImport,
133 : sal_uInt16 nPrefix, const OUString& rLocalName,
134 : const Reference< frame::XModel > xChartModel,
135 : const Reference< xml::sax::XAttributeList >& )
136 : {
137 244 : SvXMLImportContext* pContext = 0;
138 :
139 244 : Reference< chart::XChartDocument > xDoc( xChartModel, uno::UNO_QUERY );
140 244 : if( xDoc.is())
141 : {
142 244 : mxChartDoc = xDoc;
143 244 : pContext = new SchXMLChartContext( *this, rImport, rLocalName );
144 : }
145 : else
146 : {
147 : SAL_WARN("xmloff.chart", "No valid XChartDocument given as XModel" );
148 0 : pContext = new SvXMLImportContext( rImport, nPrefix, rLocalName );
149 : }
150 :
151 244 : return pContext;
152 : }
153 :
154 : // get various token maps
155 :
156 740 : const SvXMLTokenMap& SchXMLImportHelper::GetDocElemTokenMap()
157 : {
158 740 : if( ! mpChartDocElemTokenMap )
159 : {
160 : static const SvXMLTokenMapEntry aDocElemTokenMap[] =
161 : {
162 : { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_STYLES, XML_TOK_DOC_AUTOSTYLES },
163 : { XML_NAMESPACE_OFFICE, XML_STYLES, XML_TOK_DOC_STYLES },
164 : { XML_NAMESPACE_OFFICE, XML_META, XML_TOK_DOC_META },
165 : { XML_NAMESPACE_OFFICE, XML_BODY, XML_TOK_DOC_BODY },
166 : XML_TOKEN_MAP_END
167 : };
168 :
169 486 : mpChartDocElemTokenMap = new SvXMLTokenMap( aDocElemTokenMap );
170 : } // if( ! mpChartDocElemTokenMap )
171 :
172 740 : return *mpChartDocElemTokenMap;
173 : }
174 :
175 976 : const SvXMLTokenMap& SchXMLImportHelper::GetTableElemTokenMap()
176 : {
177 976 : if( ! mpTableElemTokenMap )
178 : {
179 : static const SvXMLTokenMapEntry aTableElemTokenMap[] =
180 : {
181 : { XML_NAMESPACE_TABLE, XML_TABLE_HEADER_COLUMNS, XML_TOK_TABLE_HEADER_COLS },
182 : { XML_NAMESPACE_TABLE, XML_TABLE_COLUMNS, XML_TOK_TABLE_COLUMNS },
183 : { XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, XML_TOK_TABLE_COLUMN },
184 : { XML_NAMESPACE_TABLE, XML_TABLE_HEADER_ROWS, XML_TOK_TABLE_HEADER_ROWS },
185 : { XML_NAMESPACE_TABLE, XML_TABLE_ROWS, XML_TOK_TABLE_ROWS },
186 : { XML_NAMESPACE_TABLE, XML_TABLE_ROW, XML_TOK_TABLE_ROW },
187 : XML_TOKEN_MAP_END
188 : };
189 :
190 244 : mpTableElemTokenMap = new SvXMLTokenMap( aTableElemTokenMap );
191 : } // if( ! mpTableElemTokenMap )
192 :
193 976 : return *mpTableElemTokenMap;
194 : }
195 :
196 740 : const SvXMLTokenMap& SchXMLImportHelper::GetChartElemTokenMap()
197 : {
198 740 : if( ! mpChartElemTokenMap )
199 : {
200 : static const SvXMLTokenMapEntry aChartElemTokenMap[] =
201 : {
202 : { XML_NAMESPACE_CHART, XML_PLOT_AREA, XML_TOK_CHART_PLOT_AREA },
203 : { XML_NAMESPACE_CHART, XML_TITLE, XML_TOK_CHART_TITLE },
204 : { XML_NAMESPACE_CHART, XML_SUBTITLE, XML_TOK_CHART_SUBTITLE },
205 : { XML_NAMESPACE_CHART, XML_LEGEND, XML_TOK_CHART_LEGEND },
206 : { XML_NAMESPACE_TABLE, XML_TABLE, XML_TOK_CHART_TABLE },
207 : XML_TOKEN_MAP_END
208 : };
209 :
210 244 : mpChartElemTokenMap = new SvXMLTokenMap( aChartElemTokenMap );
211 : } // if( ! mpChartElemTokenMap )
212 :
213 740 : return *mpChartElemTokenMap;
214 : }
215 :
216 2348 : const SvXMLTokenMap& SchXMLImportHelper::GetPlotAreaElemTokenMap()
217 : {
218 2348 : if( ! mpPlotAreaElemTokenMap )
219 : {
220 : static const SvXMLTokenMapEntry aPlotAreaElemTokenMap[] =
221 : {
222 : { XML_NAMESPACE_CHART_EXT, XML_COORDINATE_REGION, XML_TOK_PA_COORDINATE_REGION_EXT },
223 : { XML_NAMESPACE_CHART, XML_COORDINATE_REGION, XML_TOK_PA_COORDINATE_REGION },
224 : { XML_NAMESPACE_CHART, XML_AXIS, XML_TOK_PA_AXIS },
225 : { XML_NAMESPACE_CHART, XML_SERIES, XML_TOK_PA_SERIES },
226 : { XML_NAMESPACE_CHART, XML_WALL, XML_TOK_PA_WALL },
227 : { XML_NAMESPACE_CHART, XML_FLOOR, XML_TOK_PA_FLOOR },
228 : { XML_NAMESPACE_DR3D, XML_LIGHT, XML_TOK_PA_LIGHT_SOURCE },
229 : { XML_NAMESPACE_CHART, XML_STOCK_GAIN_MARKER, XML_TOK_PA_STOCK_GAIN },
230 : { XML_NAMESPACE_CHART, XML_STOCK_LOSS_MARKER, XML_TOK_PA_STOCK_LOSS },
231 : { XML_NAMESPACE_CHART, XML_STOCK_RANGE_LINE, XML_TOK_PA_STOCK_RANGE },
232 : XML_TOKEN_MAP_END
233 : };
234 :
235 244 : mpPlotAreaElemTokenMap = new SvXMLTokenMap( aPlotAreaElemTokenMap );
236 : } // if( ! mpPlotAreaElemTokenMap )
237 :
238 2348 : return *mpPlotAreaElemTokenMap;
239 : }
240 :
241 746 : const SvXMLTokenMap& SchXMLImportHelper::GetSeriesElemTokenMap()
242 : {
243 746 : if( ! mpSeriesElemTokenMap )
244 : {
245 : static const SvXMLTokenMapEntry aSeriesElemTokenMap[] =
246 : {
247 : { XML_NAMESPACE_CHART, XML_DATA_POINT, XML_TOK_SERIES_DATA_POINT },
248 : { XML_NAMESPACE_CHART, XML_DOMAIN, XML_TOK_SERIES_DOMAIN },
249 : { XML_NAMESPACE_CHART, XML_MEAN_VALUE, XML_TOK_SERIES_MEAN_VALUE_LINE },
250 : { XML_NAMESPACE_CHART, XML_REGRESSION_CURVE, XML_TOK_SERIES_REGRESSION_CURVE },
251 : { XML_NAMESPACE_CHART, XML_ERROR_INDICATOR, XML_TOK_SERIES_ERROR_INDICATOR },
252 : { XML_NAMESPACE_LO_EXT, XML_PROPERTY_MAPPING, XML_TOK_SERIES_PROPERTY_MAPPING },
253 : XML_TOKEN_MAP_END
254 : };
255 :
256 244 : mpSeriesElemTokenMap = new SvXMLTokenMap( aSeriesElemTokenMap );
257 : } // if( ! mpSeriesElemTokenMap )
258 :
259 746 : return *mpSeriesElemTokenMap;
260 : }
261 :
262 244 : const SvXMLTokenMap& SchXMLImportHelper::GetChartAttrTokenMap()
263 : {
264 244 : if( ! mpChartAttrTokenMap )
265 : {
266 : static const SvXMLTokenMapEntry aChartAttrTokenMap[] =
267 : {
268 : { XML_NAMESPACE_XLINK, XML_HREF, XML_TOK_CHART_HREF },
269 : { XML_NAMESPACE_CHART, XML_CLASS, XML_TOK_CHART_CLASS },
270 : { XML_NAMESPACE_SVG, XML_WIDTH, XML_TOK_CHART_WIDTH },
271 : { XML_NAMESPACE_SVG, XML_HEIGHT, XML_TOK_CHART_HEIGHT },
272 : { XML_NAMESPACE_CHART, XML_STYLE_NAME, XML_TOK_CHART_STYLE_NAME },
273 : { XML_NAMESPACE_CHART, XML_COLUMN_MAPPING, XML_TOK_CHART_COL_MAPPING },
274 : { XML_NAMESPACE_CHART, XML_ROW_MAPPING, XML_TOK_CHART_ROW_MAPPING },
275 : XML_TOKEN_MAP_END
276 : };
277 :
278 244 : mpChartAttrTokenMap = new SvXMLTokenMap( aChartAttrTokenMap );
279 : } // if( ! mpChartAttrTokenMap )
280 :
281 244 : return *mpChartAttrTokenMap;
282 : }
283 :
284 244 : const SvXMLTokenMap& SchXMLImportHelper::GetPlotAreaAttrTokenMap()
285 : {
286 244 : if( ! mpPlotAreaAttrTokenMap )
287 : {
288 : static const SvXMLTokenMapEntry aPlotAreaAttrTokenMap[] =
289 : {
290 : { XML_NAMESPACE_SVG, XML_X, XML_TOK_PA_X },
291 : { XML_NAMESPACE_SVG, XML_Y, XML_TOK_PA_Y },
292 : { XML_NAMESPACE_SVG, XML_WIDTH, XML_TOK_PA_WIDTH },
293 : { XML_NAMESPACE_SVG, XML_HEIGHT, XML_TOK_PA_HEIGHT },
294 : { XML_NAMESPACE_CHART, XML_STYLE_NAME, XML_TOK_PA_STYLE_NAME },
295 : { XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, XML_TOK_PA_CHART_ADDRESS },
296 : { XML_NAMESPACE_CHART, XML_DATA_SOURCE_HAS_LABELS, XML_TOK_PA_DS_HAS_LABELS },
297 : { XML_NAMESPACE_DR3D, XML_TRANSFORM, XML_TOK_PA_TRANSFORM },
298 : { XML_NAMESPACE_DR3D, XML_VRP, XML_TOK_PA_VRP },
299 : { XML_NAMESPACE_DR3D, XML_VPN, XML_TOK_PA_VPN },
300 : { XML_NAMESPACE_DR3D, XML_VUP, XML_TOK_PA_VUP },
301 : { XML_NAMESPACE_DR3D, XML_PROJECTION, XML_TOK_PA_PROJECTION },
302 : { XML_NAMESPACE_DR3D, XML_DISTANCE, XML_TOK_PA_DISTANCE },
303 : { XML_NAMESPACE_DR3D, XML_FOCAL_LENGTH, XML_TOK_PA_FOCAL_LENGTH },
304 : { XML_NAMESPACE_DR3D, XML_SHADOW_SLANT, XML_TOK_PA_SHADOW_SLANT },
305 : { XML_NAMESPACE_DR3D, XML_SHADE_MODE, XML_TOK_PA_SHADE_MODE },
306 : { XML_NAMESPACE_DR3D, XML_AMBIENT_COLOR, XML_TOK_PA_AMBIENT_COLOR },
307 : { XML_NAMESPACE_DR3D, XML_LIGHTING_MODE, XML_TOK_PA_LIGHTING_MODE },
308 : XML_TOKEN_MAP_END
309 : };
310 :
311 244 : mpPlotAreaAttrTokenMap = new SvXMLTokenMap( aPlotAreaAttrTokenMap );
312 : } // if( ! mpPlotAreaAttrTokenMap )
313 :
314 244 : return *mpPlotAreaAttrTokenMap;
315 : }
316 :
317 4558 : const SvXMLTokenMap& SchXMLImportHelper::GetCellAttrTokenMap()
318 : {
319 4558 : if( ! mpCellAttrTokenMap )
320 : {
321 : static const SvXMLTokenMapEntry aCellAttrTokenMap[] =
322 : {
323 : { XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_TOK_CELL_VAL_TYPE },
324 : { XML_NAMESPACE_OFFICE, XML_VALUE, XML_TOK_CELL_VALUE },
325 : XML_TOKEN_MAP_END
326 : };
327 :
328 244 : mpCellAttrTokenMap = new SvXMLTokenMap( aCellAttrTokenMap );
329 : } // if( ! mpCellAttrTokenMap )
330 :
331 4558 : return *mpCellAttrTokenMap;
332 : }
333 :
334 520 : const SvXMLTokenMap& SchXMLImportHelper::GetSeriesAttrTokenMap()
335 : {
336 520 : if( ! mpSeriesAttrTokenMap )
337 : {
338 : static const SvXMLTokenMapEntry aSeriesAttrTokenMap[] =
339 : {
340 : { XML_NAMESPACE_CHART, XML_VALUES_CELL_RANGE_ADDRESS, XML_TOK_SERIES_CELL_RANGE },
341 : { XML_NAMESPACE_CHART, XML_LABEL_CELL_ADDRESS, XML_TOK_SERIES_LABEL_ADDRESS },
342 : { XML_NAMESPACE_LO_EXT, XML_LABEL_STRING, XML_TOK_SERIES_LABEL_STRING },
343 : { XML_NAMESPACE_CHART, XML_ATTACHED_AXIS, XML_TOK_SERIES_ATTACHED_AXIS },
344 : { XML_NAMESPACE_CHART, XML_STYLE_NAME, XML_TOK_SERIES_STYLE_NAME },
345 : { XML_NAMESPACE_CHART, XML_CLASS, XML_TOK_SERIES_CHART_CLASS },
346 : XML_TOKEN_MAP_END
347 : };
348 :
349 244 : mpSeriesAttrTokenMap = new SvXMLTokenMap( aSeriesAttrTokenMap );
350 : } // if( ! mpSeriesAttrTokenMap )
351 :
352 520 : return *mpSeriesAttrTokenMap;
353 : }
354 :
355 0 : const SvXMLTokenMap& SchXMLImportHelper::GetPropMappingAttrTokenMap()
356 : {
357 0 : if( !mpPropMappingAttrTokenMap )
358 : {
359 : static const SvXMLTokenMapEntry aPropMappingAttrTokenMap[] =
360 : {
361 : { XML_NAMESPACE_LO_EXT, XML_PROPERTY, XML_TOK_PROPERTY_MAPPING_PROPERTY },
362 : { XML_NAMESPACE_LO_EXT, XML_CELL_RANGE_ADDRESS, XML_TOK_PROPERTY_MAPPING_RANGE },
363 : XML_TOKEN_MAP_END
364 : };
365 :
366 0 : mpPropMappingAttrTokenMap = new SvXMLTokenMap( aPropMappingAttrTokenMap );
367 : }
368 :
369 0 : return *mpPropMappingAttrTokenMap;
370 : }
371 :
372 16 : const SvXMLTokenMap& SchXMLImportHelper::GetRegEquationAttrTokenMap()
373 : {
374 16 : if( ! mpRegEquationAttrTokenMap )
375 : {
376 : static const SvXMLTokenMapEntry aRegressionEquationAttrTokenMap[] =
377 : {
378 : { XML_NAMESPACE_CHART, XML_STYLE_NAME, XML_TOK_REGEQ_STYLE_NAME },
379 : { XML_NAMESPACE_CHART, XML_DISPLAY_EQUATION, XML_TOK_REGEQ_DISPLAY_EQUATION },
380 : { XML_NAMESPACE_CHART, XML_DISPLAY_R_SQUARE, XML_TOK_REGEQ_DISPLAY_R_SQUARE },
381 : { XML_NAMESPACE_SVG, XML_X, XML_TOK_REGEQ_POS_X },
382 : { XML_NAMESPACE_SVG, XML_Y, XML_TOK_REGEQ_POS_Y },
383 : XML_TOKEN_MAP_END
384 : };
385 :
386 8 : mpRegEquationAttrTokenMap = new SvXMLTokenMap( aRegressionEquationAttrTokenMap );
387 : } // if( ! mpRegEquationAttrTokenMap )
388 :
389 16 : return *mpRegEquationAttrTokenMap;
390 : }
391 :
392 : //static
393 0 : void SchXMLImportHelper::DeleteDataSeries(
394 : const Reference< chart2::XDataSeries > & xSeries,
395 : const Reference< chart2::XChartDocument > & xDoc )
396 : {
397 0 : if( xDoc.is() )
398 : try
399 : {
400 : Reference< chart2::XCoordinateSystemContainer > xCooSysCnt(
401 0 : xDoc->getFirstDiagram(), uno::UNO_QUERY_THROW );
402 : Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq(
403 0 : xCooSysCnt->getCoordinateSystems());
404 :
405 0 : sal_Int32 nCooSysIndex = 0;
406 0 : for( nCooSysIndex=0; nCooSysIndex<aCooSysSeq.getLength(); nCooSysIndex++ )
407 : {
408 0 : Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[ nCooSysIndex ], uno::UNO_QUERY_THROW );
409 0 : Sequence< Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes());
410 :
411 0 : sal_Int32 nChartTypeIndex = 0;
412 0 : for( nChartTypeIndex=0; nChartTypeIndex<aChartTypes.getLength(); nChartTypeIndex++ )
413 : {
414 0 : Reference< chart2::XDataSeriesContainer > xSeriesCnt( aChartTypes[nChartTypeIndex], uno::UNO_QUERY_THROW );
415 0 : Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xSeriesCnt->getDataSeries());
416 :
417 0 : sal_Int32 nSeriesIndex = 0;
418 0 : for( nSeriesIndex=0; nSeriesIndex<aSeriesSeq.getLength(); nSeriesIndex++ )
419 : {
420 0 : if( xSeries==aSeriesSeq[nSeriesIndex] )
421 : {
422 0 : xSeriesCnt->removeDataSeries(xSeries);
423 0 : return;
424 : }
425 : }
426 0 : }
427 0 : }
428 : }
429 0 : catch( const uno::Exception & ex )
430 : {
431 : SAL_WARN("xmloff.chart", "Exception caught. Type: " << OUString::createFromAscii( typeid( ex ).name()) << ", Message: " << ex.Message);
432 : }
433 : }
434 :
435 : // static
436 520 : Reference< chart2::XDataSeries > SchXMLImportHelper::GetNewDataSeries(
437 : const Reference< chart2::XChartDocument > & xDoc,
438 : sal_Int32 nCoordinateSystemIndex,
439 : const OUString & rChartTypeName,
440 : bool bPushLastChartType /* = false */ )
441 : {
442 520 : Reference< chart2::XDataSeries > xResult;
443 520 : if(!xDoc.is())
444 0 : return xResult;
445 :
446 : try
447 : {
448 : Reference< chart2::XCoordinateSystemContainer > xCooSysCnt(
449 520 : xDoc->getFirstDiagram(), uno::UNO_QUERY_THROW );
450 : Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq(
451 1040 : xCooSysCnt->getCoordinateSystems());
452 : Reference< uno::XComponentContext > xContext(
453 1040 : comphelper::getProcessComponentContext() );
454 :
455 520 : if( nCoordinateSystemIndex < aCooSysSeq.getLength())
456 : {
457 520 : Reference< chart2::XChartType > xCurrentType;
458 : {
459 520 : Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[ nCoordinateSystemIndex ], uno::UNO_QUERY_THROW );
460 1040 : Sequence< Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes());
461 : // find matching chart type group
462 520 : const Reference< chart2::XChartType > * pBegin = aChartTypes.getConstArray();
463 520 : const Reference< chart2::XChartType > * pEnd = pBegin + aChartTypes.getLength();
464 : const Reference< chart2::XChartType > * pIt =
465 520 : ::std::find_if( pBegin, pEnd, lcl_MatchesChartType( rChartTypeName ));
466 520 : if( pIt != pEnd )
467 504 : xCurrentType.set( *pIt );
468 : // if chart type is set at series and differs from current one,
469 : // create a new chart type
470 520 : if( !xCurrentType.is())
471 : {
472 : xCurrentType.set(
473 32 : xContext->getServiceManager()->createInstanceWithContext( rChartTypeName, xContext ),
474 16 : uno::UNO_QUERY );
475 16 : if( xCurrentType.is())
476 : {
477 16 : if( bPushLastChartType && aChartTypes.getLength())
478 : {
479 4 : sal_Int32 nIndex( aChartTypes.getLength() - 1 );
480 4 : aChartTypes.realloc( aChartTypes.getLength() + 1 );
481 4 : aChartTypes[ nIndex + 1 ] = aChartTypes[ nIndex ];
482 4 : aChartTypes[ nIndex ] = xCurrentType;
483 4 : xCTCnt->setChartTypes( aChartTypes );
484 : }
485 : else
486 12 : xCTCnt->addChartType( xCurrentType );
487 : }
488 520 : }
489 : }
490 :
491 520 : if( xCurrentType.is())
492 : {
493 520 : Reference< chart2::XDataSeriesContainer > xSeriesCnt( xCurrentType, uno::UNO_QUERY_THROW );
494 :
495 520 : if( xContext.is() )
496 : {
497 : xResult.set(
498 1040 : xContext->getServiceManager()->createInstanceWithContext(
499 : OUString( "com.sun.star.chart2.DataSeries" ),
500 520 : xContext ), uno::UNO_QUERY_THROW );
501 : }
502 520 : if( xResult.is() )
503 520 : xSeriesCnt->addDataSeries( xResult );
504 520 : }
505 520 : }
506 : }
507 0 : catch( const uno::Exception & ex )
508 : {
509 : SAL_WARN("xmloff.chart", "Exception caught. Type: " << OUString::createFromAscii( typeid( ex ).name()) << ", Message: " << ex.Message);
510 : }
511 520 : return xResult;
512 : }
513 :
514 : // #110680#
515 722 : SchXMLImport::SchXMLImport(
516 : const Reference< uno::XComponentContext >& xContext,
517 : OUString const & implementationName, sal_uInt16 nImportFlags ) :
518 722 : SvXMLImport( xContext, implementationName, nImportFlags )
519 : {
520 722 : GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
521 722 : GetNamespaceMap().Add( GetXMLToken(XML_NP_CHART_EXT), GetXMLToken(XML_N_CHART_EXT), XML_NAMESPACE_CHART_EXT);
522 :
523 722 : mbIsGraphicLoadOnDemandSupported = false;
524 722 : }
525 :
526 2166 : SchXMLImport::~SchXMLImport() throw ()
527 : {
528 : // stop progress view
529 722 : if( mxStatusIndicator.is())
530 : {
531 0 : mxStatusIndicator->end();
532 0 : mxStatusIndicator->reset();
533 : }
534 :
535 722 : uno::Reference< chart2::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY );
536 722 : if( xChartDoc.is() && xChartDoc->hasControllersLocked() )
537 722 : xChartDoc->unlockControllers();
538 1444 : }
539 :
540 : // create the main context (subcontexts are created
541 : // by the one created here)
542 722 : SvXMLImportContext *SchXMLImport::CreateContext( sal_uInt16 nPrefix, const OUString& rLocalName,
543 : const Reference< xml::sax::XAttributeList >& xAttrList )
544 : {
545 722 : SvXMLImportContext* pContext = 0;
546 :
547 : // accept <office:document>
548 1928 : if( XML_NAMESPACE_OFFICE == nPrefix &&
549 1202 : ( IsXMLToken( rLocalName, XML_DOCUMENT_STYLES) ||
550 480 : IsXMLToken( rLocalName, XML_DOCUMENT_CONTENT) ))
551 : {
552 484 : pContext = new SchXMLDocContext( maImportHelper, *this, nPrefix, rLocalName );
553 714 : } else if ( (XML_NAMESPACE_OFFICE == nPrefix) &&
554 474 : ( IsXMLToken(rLocalName, XML_DOCUMENT) ||
555 236 : (IsXMLToken(rLocalName, XML_DOCUMENT_META)
556 236 : && (getImportFlags() & IMPORT_META) )) )
557 : {
558 : uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
559 238 : GetModel(), uno::UNO_QUERY);
560 : // mst@: right now, this seems to be not supported, so it is untested
561 238 : if (xDPS.is()) {
562 1186 : pContext = (IsXMLToken(rLocalName, XML_DOCUMENT_META))
563 : ? new SvXMLMetaDocumentContext(*this,
564 : XML_NAMESPACE_OFFICE, rLocalName,
565 472 : xDPS->getDocumentProperties())
566 : // flat OpenDocument file format
567 : : new SchXMLFlatDocContext_Impl(
568 : maImportHelper, *this, nPrefix, rLocalName,
569 242 : xDPS->getDocumentProperties());
570 : } else {
571 0 : pContext = (IsXMLToken(rLocalName, XML_DOCUMENT_META))
572 0 : ? SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList )
573 : : new SchXMLDocContext( maImportHelper, *this,
574 0 : nPrefix, rLocalName );
575 238 : }
576 : } else {
577 0 : pContext = SvXMLImport::CreateContext( nPrefix, rLocalName, xAttrList );
578 : }
579 :
580 722 : return pContext;
581 : }
582 :
583 244 : SvXMLImportContext* SchXMLImport::CreateStylesContext(
584 : const OUString& rLocalName,
585 : const Reference<xml::sax::XAttributeList>& xAttrList )
586 : {
587 : //#i103287# make sure that the version information is set before importing all the properties (especially stroke-opacity!)
588 244 : SchXMLTools::setBuildIDAtImportInfo( GetModel(), getImportInfo() );
589 :
590 : SvXMLStylesContext* pStylesCtxt =
591 244 : new SvXMLStylesContext( *(this), XML_NAMESPACE_OFFICE, rLocalName, xAttrList );
592 :
593 : // set context at base class, so that all auto-style classes are imported
594 244 : SetAutoStyles( pStylesCtxt );
595 244 : maImportHelper.SetAutoStylesContext( pStylesCtxt );
596 :
597 244 : return pStylesCtxt;
598 : }
599 :
600 722 : void SAL_CALL SchXMLImport::setTargetDocument( const uno::Reference< lang::XComponent >& xDoc )
601 : throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
602 : {
603 722 : uno::Reference< chart2::XChartDocument > xOldDoc( GetModel(), uno::UNO_QUERY );
604 722 : if( xOldDoc.is() && xOldDoc->hasControllersLocked() )
605 0 : xOldDoc->unlockControllers();
606 :
607 722 : SvXMLImport::setTargetDocument( xDoc );
608 :
609 : //set data provider and number formatter
610 : // try to get an XDataProvider and set it
611 : // @todo: if we have our own data, we must not use the parent as data provider
612 1444 : uno::Reference< chart2::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY );
613 :
614 722 : if( xChartDoc.is() )
615 : try
616 : {
617 : //prevent rebuild of view during load ( necesarry especially if loaded not via load api, which is the case for example if binary files are loaded )
618 722 : xChartDoc->lockControllers();
619 :
620 722 : uno::Reference< container::XChild > xChild( xChartDoc, uno::UNO_QUERY );
621 1444 : uno::Reference< chart2::data::XDataReceiver > xDataReceiver( xChartDoc, uno::UNO_QUERY );
622 722 : bool bHasOwnData = true;
623 722 : if( xChild.is() && xDataReceiver.is())
624 : {
625 722 : Reference< lang::XMultiServiceFactory > xFact( xChild->getParent(), uno::UNO_QUERY );
626 722 : if( xFact.is() )
627 : {
628 : //if the parent has a number formatter we will use the numberformatter of the parent
629 224 : Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( xFact, uno::UNO_QUERY );
630 224 : xDataReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier );
631 :
632 224 : if ( !xChartDoc->getDataProvider().is() )
633 : {
634 76 : const OUString aDataProviderServiceName( "com.sun.star.chart2.data.DataProvider");
635 152 : const uno::Sequence< OUString > aServiceNames( xFact->getAvailableServiceNames());
636 76 : const OUString * pBegin = aServiceNames.getConstArray();
637 76 : const OUString * pEnd = pBegin + aServiceNames.getLength();
638 76 : if( ::std::find( pBegin, pEnd, aDataProviderServiceName ) != pEnd )
639 : {
640 : Reference< chart2::data::XDataProvider > xProvider(
641 72 : xFact->createInstance( aDataProviderServiceName ), uno::UNO_QUERY );
642 72 : if( xProvider.is())
643 : {
644 72 : xDataReceiver->attachDataProvider( xProvider );
645 72 : bHasOwnData = false;
646 72 : }
647 76 : }
648 : }
649 : else
650 148 : bHasOwnData = false;
651 : }
652 : // else we have no parent => we have our own data
653 :
654 722 : if( bHasOwnData && ! xChartDoc->hasInternalDataProvider() )
655 172 : xChartDoc->createInternalDataProvider( sal_False );
656 722 : }
657 : }
658 0 : catch( const uno::Exception & rEx )
659 : {
660 0 : OString aBStr(OUStringToOString(rEx.Message, RTL_TEXTENCODING_ASCII_US));
661 0 : SAL_INFO("xmloff.chart", "SchXMLChartContext::StartElement(): Exception caught: " << aBStr);
662 722 : }
663 722 : }
664 :
665 : // first version: everything comes from one storage
666 :
667 2 : Sequence< OUString > SAL_CALL SchXMLImport_getSupportedServiceNames() throw()
668 : {
669 2 : const OUString aServiceName( "com.sun.star.comp.Chart.XMLOasisImporter" );
670 2 : const Sequence< OUString > aSeq( &aServiceName, 1 );
671 2 : return aSeq;
672 : }
673 :
674 118 : OUString SAL_CALL SchXMLImport_getImplementationName() throw()
675 : {
676 118 : return OUString( "SchXMLImport" );
677 : }
678 :
679 2 : Reference< uno::XInterface > SAL_CALL SchXMLImport_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
680 : {
681 : // #110680#
682 2 : return (cppu::OWeakObject*)new SchXMLImport( comphelper::getComponentContext(rSMgr), SchXMLImport_getImplementationName(), IMPORT_ALL);
683 : }
684 :
685 : // multiple storage version: one for content / styles / meta
686 :
687 18 : Sequence< OUString > SAL_CALL SchXMLImport_Styles_getSupportedServiceNames() throw()
688 : {
689 18 : const OUString aServiceName( "com.sun.star.comp.Chart.XMLOasisStylesImporter" );
690 18 : const Sequence< OUString > aSeq( &aServiceName, 1 );
691 18 : return aSeq;
692 : }
693 :
694 356 : OUString SAL_CALL SchXMLImport_Styles_getImplementationName() throw()
695 : {
696 356 : return OUString( "SchXMLImport.Styles" );
697 : }
698 :
699 242 : Reference< uno::XInterface > SAL_CALL SchXMLImport_Styles_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
700 : {
701 : // #110680#
702 242 : return (cppu::OWeakObject*)new SchXMLImport( comphelper::getComponentContext(rSMgr), SchXMLImport_Styles_getImplementationName(), IMPORT_STYLES );
703 : }
704 :
705 18 : Sequence< OUString > SAL_CALL SchXMLImport_Content_getSupportedServiceNames() throw()
706 : {
707 18 : const OUString aServiceName( "com.sun.star.comp.Chart.XMLOasisContentImporter" );
708 18 : const Sequence< OUString > aSeq( &aServiceName, 1 );
709 18 : return aSeq;
710 : }
711 :
712 338 : OUString SAL_CALL SchXMLImport_Content_getImplementationName() throw()
713 : {
714 338 : return OUString( "SchXMLImport.Content" );
715 : }
716 :
717 242 : Reference< uno::XInterface > SAL_CALL SchXMLImport_Content_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
718 : {
719 : // #110680#
720 242 : return (cppu::OWeakObject*)new SchXMLImport( comphelper::getComponentContext(rSMgr), SchXMLImport_Content_getImplementationName(), IMPORT_CONTENT | IMPORT_AUTOSTYLES | IMPORT_FONTDECLS );
721 : }
722 :
723 16 : Sequence< OUString > SAL_CALL SchXMLImport_Meta_getSupportedServiceNames() throw()
724 : {
725 16 : const OUString aServiceName( "com.sun.star.comp.Chart.XMLOasisMetaImporter" );
726 16 : const Sequence< OUString > aSeq( &aServiceName, 1 );
727 16 : return aSeq;
728 : }
729 :
730 364 : OUString SAL_CALL SchXMLImport_Meta_getImplementationName() throw()
731 : {
732 364 : return OUString( "SchXMLImport.Meta" );
733 : }
734 :
735 236 : Reference< uno::XInterface > SAL_CALL SchXMLImport_Meta_createInstance(const Reference< lang::XMultiServiceFactory > & rSMgr) throw( uno::Exception )
736 : {
737 : // #110680#
738 236 : return (cppu::OWeakObject*)new SchXMLImport( comphelper::getComponentContext(rSMgr), SchXMLImport_Meta_getImplementationName(), IMPORT_META );
739 : }
740 :
741 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|