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