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