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 <sax/tools/converter.hxx>
21 :
22 : #include "SchXMLPlotAreaContext.hxx"
23 : #include "SchXMLRegressionCurveObjectContext.hxx"
24 : #include "SchXMLImport.hxx"
25 : #include "SchXMLAxisContext.hxx"
26 : #include "SchXMLSeries2Context.hxx"
27 : #include "SchXMLTools.hxx"
28 :
29 : #include <comphelper/processfactory.hxx>
30 : #include <xmloff/xmlnmspe.hxx>
31 : #include <xmloff/xmlement.hxx>
32 : #include <xmloff/nmspmap.hxx>
33 : #include <xmloff/xmluconv.hxx>
34 : #include <xmloff/prstylei.hxx>
35 : #include <xmloff/xmlstyle.hxx>
36 : #include "xexptran.hxx"
37 : #include <cppuhelper/implbase1.hxx>
38 :
39 : #include <com/sun/star/awt/Point.hpp>
40 : #include <com/sun/star/awt/Size.hpp>
41 : #include <com/sun/star/chart/ChartDataRowSource.hpp>
42 : #include <com/sun/star/chart/ChartErrorCategory.hpp>
43 : #include <com/sun/star/chart/ChartErrorIndicatorType.hpp>
44 : #include <com/sun/star/chart/ErrorBarStyle.hpp>
45 : #include <com/sun/star/chart/X3DDisplay.hpp>
46 : #include <com/sun/star/chart/XStatisticDisplay.hpp>
47 : #include <com/sun/star/chart/XDiagramPositioning.hpp>
48 : #include <com/sun/star/chart2/RelativePosition.hpp>
49 : #include <com/sun/star/chart2/XChartTypeContainer.hpp>
50 : #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
51 : #include <com/sun/star/chart2/data/XDataSink.hpp>
52 : #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
53 : #include <com/sun/star/chart2/data/LabeledDataSequence.hpp>
54 : #include <com/sun/star/drawing/CameraGeometry.hpp>
55 : #include <com/sun/star/drawing/FillStyle.hpp>
56 : #include <com/sun/star/lang/XServiceInfo.hpp>
57 : #include <com/sun/star/util/XStringMapping.hpp>
58 : #include <com/sun/star/xml/sax/XAttributeList.hpp>
59 :
60 : using namespace com::sun::star;
61 : using namespace ::xmloff::token;
62 :
63 : using com::sun::star::uno::Reference;
64 :
65 : namespace
66 : {
67 :
68 : struct lcl_AxisHasCategories : public ::std::unary_function< SchXMLAxis, bool >
69 : {
70 440 : bool operator() ( const SchXMLAxis & rAxis )
71 : {
72 440 : return rAxis.bHasCategories;
73 : }
74 : };
75 :
76 78 : OUString lcl_ConvertRange( const OUString & rRange, const uno::Reference< chart2::XChartDocument > & xDoc )
77 : {
78 78 : OUString aResult = rRange;
79 78 : if(!xDoc.is())
80 0 : return aResult;
81 : uno::Reference< chart2::data::XRangeXMLConversion > xConversion(
82 156 : xDoc->getDataProvider(), uno::UNO_QUERY );
83 78 : if( xConversion.is())
84 78 : aResult = xConversion->convertRangeFromXML( rRange );
85 78 : return aResult;
86 : }
87 :
88 : } // anonymous namespace
89 :
90 244 : SchXML3DSceneAttributesHelper::SchXML3DSceneAttributesHelper( SvXMLImport& rImporter )
91 244 : : SdXML3DSceneAttributesHelper( rImporter )
92 : {
93 244 : }
94 :
95 244 : void SchXML3DSceneAttributesHelper::getCameraDefaultFromDiagram( const uno::Reference< chart::XDiagram >& xDiagram )
96 : {
97 : //different defaults for camera geometry necessary to workaround wrong behaviour in old chart
98 : //in future make this version dependent if we have versioning (metastream) for ole objects
99 :
100 : try
101 : {
102 244 : uno::Reference< beans::XPropertySet > xProp( xDiagram, uno::UNO_QUERY );
103 244 : if( xProp.is() )
104 : {
105 244 : drawing::CameraGeometry aCamGeo;
106 244 : xProp->getPropertyValue("D3DCameraGeometry") >>= aCamGeo;
107 244 : maVRP.setX( aCamGeo.vrp.PositionX );
108 244 : maVRP.setY( aCamGeo.vrp.PositionY );
109 244 : maVRP.setZ( aCamGeo.vrp.PositionZ );
110 244 : maVPN.setX( aCamGeo.vpn.DirectionX );
111 244 : maVPN.setY( aCamGeo.vpn.DirectionY );
112 244 : maVPN.setZ( aCamGeo.vpn.DirectionZ );
113 244 : maVUP.setX( aCamGeo.vup.DirectionX );
114 244 : maVUP.setY( aCamGeo.vup.DirectionY );
115 244 : maVUP.setZ( aCamGeo.vup.DirectionZ );
116 244 : }
117 : }
118 0 : catch( const uno::Exception & rEx )
119 : {
120 0 : OString aBStr(OUStringToOString(rEx.Message, RTL_TEXTENCODING_ASCII_US));
121 0 : SAL_INFO("xmloff.chart", "Exception caught for property NumberOfLines: " << aBStr);
122 : }
123 244 : }
124 :
125 244 : SchXML3DSceneAttributesHelper::~SchXML3DSceneAttributesHelper()
126 : {
127 244 : }
128 :
129 244 : SchXMLPlotAreaContext::SchXMLPlotAreaContext(
130 : SchXMLImportHelper& rImpHelper,
131 : SvXMLImport& rImport, const OUString& rLocalName,
132 : const OUString& rXLinkHRefAttributeToIndicateDataProvider,
133 : OUString& rCategoriesAddress,
134 : OUString& rChartAddress,
135 : bool & rbHasRangeAtPlotArea,
136 : bool & rAllRangeAddressesAvailable,
137 : bool & rColHasLabels,
138 : bool & rRowHasLabels,
139 : chart::ChartDataRowSource & rDataRowSource,
140 : SeriesDefaultsAndStyles& rSeriesDefaultsAndStyles,
141 : const OUString& aChartTypeServiceName,
142 : tSchXMLLSequencesPerIndex & rLSequencesPerIndex,
143 : const awt::Size & rChartSize ) :
144 : SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
145 : mrImportHelper( rImpHelper ),
146 : mrCategoriesAddress( rCategoriesAddress ),
147 : mrSeriesDefaultsAndStyles( rSeriesDefaultsAndStyles ),
148 : mnNumOfLinesProp( 0 ),
149 : mbStockHasVolume( false ),
150 : mnSeries( 0 ),
151 : m_aGlobalSeriesImportInfo( rAllRangeAddressesAvailable ),
152 : maSceneImportHelper( rImport ),
153 : m_aOuterPositioning( rImport ),
154 : m_aInnerPositioning( rImport ),
155 : mbPercentStacked(false),
156 : m_bAxisPositionAttributeImported(false),
157 : m_rXLinkHRefAttributeToIndicateDataProvider(rXLinkHRefAttributeToIndicateDataProvider),
158 : mrChartAddress( rChartAddress ),
159 : m_rbHasRangeAtPlotArea( rbHasRangeAtPlotArea ),
160 : mrColHasLabels( rColHasLabels ),
161 : mrRowHasLabels( rRowHasLabels ),
162 : mrDataRowSource( rDataRowSource ),
163 : maChartTypeServiceName( aChartTypeServiceName ),
164 : mrLSequencesPerIndex( rLSequencesPerIndex ),
165 : mbGlobalChartTypeUsedBySeries( false ),
166 244 : maChartSize( rChartSize )
167 : {
168 244 : m_rbHasRangeAtPlotArea = false;
169 :
170 : // get Diagram
171 244 : uno::Reference< chart::XChartDocument > xDoc( rImpHelper.GetChartDocument(), uno::UNO_QUERY );
172 244 : if( xDoc.is())
173 : {
174 244 : mxDiagram = xDoc->getDiagram();
175 244 : mxNewDoc.set( xDoc, uno::UNO_QUERY );
176 :
177 244 : maSceneImportHelper.getCameraDefaultFromDiagram( mxDiagram );
178 : }
179 : SAL_WARN_IF( !mxDiagram.is(),"xmloff.chart", "Couldn't get XDiagram" );
180 :
181 : // turn off all axes initially
182 488 : uno::Any aFalseBool;
183 244 : aFalseBool <<= false;
184 :
185 488 : uno::Reference< lang::XServiceInfo > xInfo( mxDiagram, uno::UNO_QUERY );
186 488 : uno::Reference< beans::XPropertySet > xProp( mxDiagram, uno::UNO_QUERY );
187 488 : if( xInfo.is() &&
188 244 : xProp.is())
189 : {
190 : try
191 : {
192 244 : xProp->setPropertyValue(
193 244 : OUString( "HasXAxis" ), aFalseBool );
194 244 : xProp->setPropertyValue(
195 244 : OUString( "HasXAxisGrid" ), aFalseBool );
196 244 : xProp->setPropertyValue(
197 244 : OUString( "HasXAxisDescription" ), aFalseBool );
198 244 : xProp->setPropertyValue(
199 244 : OUString( "HasSecondaryXAxis" ), aFalseBool );
200 244 : xProp->setPropertyValue(
201 244 : OUString( "HasSecondaryXAxisDescription" ), aFalseBool );
202 :
203 244 : xProp->setPropertyValue(
204 244 : OUString( "HasYAxis" ), aFalseBool );
205 244 : xProp->setPropertyValue(
206 244 : OUString( "HasYAxisGrid" ), aFalseBool );
207 244 : xProp->setPropertyValue(
208 244 : OUString( "HasYAxisDescription" ), aFalseBool );
209 244 : xProp->setPropertyValue(
210 244 : OUString( "HasSecondaryYAxis" ), aFalseBool );
211 244 : xProp->setPropertyValue(
212 244 : OUString( "HasSecondaryYAxisDescription" ), aFalseBool );
213 :
214 244 : xProp->setPropertyValue(
215 244 : OUString( "HasZAxis" ), aFalseBool );
216 244 : xProp->setPropertyValue(
217 244 : OUString( "HasZAxisDescription" ), aFalseBool );
218 :
219 244 : uno::Any aAny;
220 244 : chart::ChartDataRowSource eSource = chart::ChartDataRowSource_COLUMNS;
221 244 : aAny <<= eSource;
222 244 : xProp->setPropertyValue("DataRowSource", aAny );
223 : }
224 0 : catch( const beans::UnknownPropertyException & )
225 : {
226 : SAL_WARN("xmloff.chart", "Property required by service not supported" );
227 : }
228 244 : }
229 244 : }
230 :
231 488 : SchXMLPlotAreaContext::~SchXMLPlotAreaContext()
232 488 : {}
233 :
234 244 : void SchXMLPlotAreaContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
235 : {
236 : // parse attributes
237 244 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
238 244 : const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetPlotAreaAttrTokenMap();
239 244 : uno::Reference< chart2::XChartDocument > xNewDoc( GetImport().GetModel(), uno::UNO_QUERY );
240 :
241 2448 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
242 : {
243 2204 : OUString sAttrName = xAttrList->getNameByIndex( i );
244 4408 : OUString aLocalName;
245 4408 : OUString aValue = xAttrList->getValueByIndex( i );
246 2204 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
247 :
248 2204 : switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
249 : {
250 : case XML_TOK_PA_X:
251 : case XML_TOK_PA_Y:
252 : case XML_TOK_PA_WIDTH:
253 : case XML_TOK_PA_HEIGHT:
254 976 : m_aOuterPositioning.readPositioningAttribute( nPrefix, aLocalName, aValue );
255 976 : break;
256 : case XML_TOK_PA_STYLE_NAME:
257 244 : msAutoStyleName = aValue;
258 244 : break;
259 : case XML_TOK_PA_CHART_ADDRESS:
260 66 : mrChartAddress = lcl_ConvertRange( aValue, xNewDoc );
261 : // indicator for getting data from the outside
262 66 : m_rbHasRangeAtPlotArea = true;
263 66 : break;
264 : case XML_TOK_PA_DS_HAS_LABELS:
265 : {
266 214 : if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_BOTH )))
267 168 : mrColHasLabels = mrRowHasLabels = true;
268 46 : else if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_ROW )))
269 46 : mrRowHasLabels = true;
270 0 : else if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_COLUMN )))
271 0 : mrColHasLabels = true;
272 : }
273 214 : break;
274 : case XML_TOK_PA_TRANSFORM:
275 : case XML_TOK_PA_VRP:
276 : case XML_TOK_PA_VPN:
277 : case XML_TOK_PA_VUP:
278 : case XML_TOK_PA_PROJECTION:
279 : case XML_TOK_PA_DISTANCE:
280 : case XML_TOK_PA_FOCAL_LENGTH:
281 : case XML_TOK_PA_SHADOW_SLANT:
282 : case XML_TOK_PA_SHADE_MODE:
283 : case XML_TOK_PA_AMBIENT_COLOR:
284 : case XML_TOK_PA_LIGHTING_MODE:
285 704 : maSceneImportHelper.processSceneAttribute( nPrefix, aLocalName, aValue );
286 704 : break;
287 : }
288 2204 : }
289 :
290 244 : if( ! mxNewDoc.is())
291 : {
292 0 : uno::Reference< beans::XPropertySet > xDocProp( mrImportHelper.GetChartDocument(), uno::UNO_QUERY );
293 0 : if( xDocProp.is())
294 : {
295 : try
296 : {
297 0 : uno::Any aAny;
298 0 : aAny <<= mrColHasLabels;
299 0 : xDocProp->setPropertyValue(
300 : OUString( "DataSourceLabelsInFirstColumn" ),
301 0 : aAny );
302 :
303 0 : aAny <<= mrRowHasLabels;
304 0 : xDocProp->setPropertyValue(
305 : OUString( "DataSourceLabelsInFirstRow" ),
306 0 : aAny );
307 : }
308 0 : catch( const beans::UnknownPropertyException & )
309 : {
310 : SAL_WARN("xmloff.chart", "Properties missing" );
311 : }
312 0 : }
313 : }
314 :
315 : // set properties
316 244 : uno::Reference< beans::XPropertySet > xProp( mxDiagram, uno::UNO_QUERY );
317 244 : if( !msAutoStyleName.isEmpty())
318 : {
319 244 : if( xProp.is())
320 : {
321 244 : const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
322 244 : if( pStylesCtxt )
323 : {
324 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
325 244 : SchXMLImportHelper::GetChartFamilyID(), msAutoStyleName );
326 :
327 : XMLPropStyleContext* pPropStyleContext =
328 : const_cast< XMLPropStyleContext * >(
329 244 : dynamic_cast< const XMLPropStyleContext * >( pStyle ) );
330 244 : if( pPropStyleContext )
331 : {
332 244 : pPropStyleContext->FillPropertySet( xProp );
333 :
334 : // get the data row source that was set without having data
335 244 : xProp->getPropertyValue("DataRowSource")
336 488 : >>= mrDataRowSource;
337 :
338 : //lines on/off
339 : //this old property is not supported fully anymore with the new chart, so we need to get the information a little bit different from similar properties
340 488 : mrSeriesDefaultsAndStyles.maLinesOnProperty = SchXMLTools::getPropertyFromContext(
341 244 : OUString("Lines"), pPropStyleContext, pStylesCtxt );
342 :
343 : //handle automatic position and size
344 244 : m_aOuterPositioning.readAutomaticPositioningProperties( pPropStyleContext, pStylesCtxt );
345 :
346 : //correct default starting angle for old 3D pies
347 244 : if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan3_0( GetImport().GetModel() ) )
348 : {
349 0 : bool bIs3d = false;
350 0 : if( xProp.is() && ( xProp->getPropertyValue("Dim3D") >>= bIs3d ) &&
351 : bIs3d )
352 : {
353 0 : if( maChartTypeServiceName == "com.sun.star.chart2.PieChartType" || maChartTypeServiceName == "com.sun.star.chart2.DonutChartType" )
354 : {
355 0 : OUString aPropName( "StartingAngle" );
356 0 : uno::Any aAStartingAngle( SchXMLTools::getPropertyFromContext( aPropName, pPropStyleContext, pStylesCtxt ) );
357 0 : if( !aAStartingAngle.hasValue() )
358 0 : xProp->setPropertyValue( aPropName, uno::makeAny(sal_Int32(0)) ) ;
359 : }
360 : }
361 : }
362 : }
363 : }
364 : }
365 : }
366 :
367 : //remember default values for dataseries
368 244 : if(xProp.is())
369 : {
370 : try
371 : {
372 244 : mrSeriesDefaultsAndStyles.maSymbolTypeDefault = xProp->getPropertyValue("SymbolType");
373 244 : mrSeriesDefaultsAndStyles.maDataCaptionDefault = xProp->getPropertyValue("DataCaption");
374 :
375 244 : mrSeriesDefaultsAndStyles.maMeanValueDefault = xProp->getPropertyValue("MeanValue");
376 244 : mrSeriesDefaultsAndStyles.maRegressionCurvesDefault = xProp->getPropertyValue("RegressionCurves");
377 :
378 244 : bool bStacked = false;
379 244 : mrSeriesDefaultsAndStyles.maStackedDefault = xProp->getPropertyValue("Stacked");
380 244 : mrSeriesDefaultsAndStyles.maStackedDefault >>= bStacked;
381 244 : mrSeriesDefaultsAndStyles.maPercentDefault = xProp->getPropertyValue("Percent");
382 244 : mrSeriesDefaultsAndStyles.maPercentDefault >>= mbPercentStacked;
383 244 : mrSeriesDefaultsAndStyles.maStackedBarsConnectedDefault = xProp->getPropertyValue("StackedBarsConnected");
384 :
385 : // deep
386 244 : uno::Any aDeepProperty( xProp->getPropertyValue("Deep"));
387 : // #124488# old versions store a 3d area and 3D line deep chart with Deep==false => workaround for this
388 244 : if( ! (bStacked || mbPercentStacked ))
389 : {
390 204 : if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_3( GetImport().GetModel() ) )
391 : {
392 0 : bool bIs3d = false;
393 0 : if( ( xProp->getPropertyValue("Dim3D") >>= bIs3d ) &&
394 : bIs3d )
395 : {
396 0 : if( maChartTypeServiceName == "com.sun.star.chart2.AreaChartType" || maChartTypeServiceName == "com.sun.star.chart2.LineChartType" )
397 : {
398 0 : aDeepProperty <<= uno::makeAny( true );
399 : }
400 : }
401 : }
402 : }
403 244 : mrSeriesDefaultsAndStyles.maDeepDefault = aDeepProperty;
404 :
405 244 : xProp->getPropertyValue("NumberOfLines") >>= mnNumOfLinesProp;
406 244 : xProp->getPropertyValue("Volume") >>= mbStockHasVolume;
407 : }
408 0 : catch( const uno::Exception & rEx )
409 : {
410 0 : OString aBStr(OUStringToOString(rEx.Message, RTL_TEXTENCODING_ASCII_US));
411 0 : SAL_INFO("xmloff.chart", "PlotAreaContext:EndElement(): Exception caught: " << aBStr);
412 : }
413 : } // if
414 :
415 244 : bool bCreateInternalDataProvider = false;
416 244 : if( m_rXLinkHRefAttributeToIndicateDataProvider == "." ) //data comes from the chart itself
417 172 : bCreateInternalDataProvider = true;
418 72 : else if( m_rXLinkHRefAttributeToIndicateDataProvider == ".." ) //data comes from the parent application
419 66 : bCreateInternalDataProvider = false;
420 6 : else if( !m_rXLinkHRefAttributeToIndicateDataProvider.isEmpty() ) //not supported so far to get the data by sibling objects -> fall back to chart itself
421 0 : bCreateInternalDataProvider = true;
422 6 : else if( !m_rbHasRangeAtPlotArea )
423 6 : bCreateInternalDataProvider = true;
424 :
425 244 : if( bCreateInternalDataProvider && mxNewDoc.is() )
426 : {
427 : // we have no complete range => we have own data, so switch the data
428 : // provider to internal. Clone is not necessary, as we don't have any
429 : // data yet.
430 178 : mxNewDoc->createInternalDataProvider( false /* bCloneExistingData */ );
431 178 : if( xProp.is() && mrDataRowSource!=chart::ChartDataRowSource_COLUMNS )
432 2 : xProp->setPropertyValue("DataRowSource", uno::makeAny(mrDataRowSource) );
433 244 : }
434 244 : }
435 :
436 2348 : SvXMLImportContext* SchXMLPlotAreaContext::CreateChildContext(
437 : sal_uInt16 nPrefix,
438 : const OUString& rLocalName,
439 : const uno::Reference< xml::sax::XAttributeList >& xAttrList )
440 : {
441 2348 : SvXMLImportContext* pContext = 0;
442 2348 : const SvXMLTokenMap& rTokenMap = mrImportHelper.GetPlotAreaElemTokenMap();
443 :
444 2348 : switch( rTokenMap.Get( nPrefix, rLocalName ))
445 : {
446 : case XML_TOK_PA_COORDINATE_REGION_EXT:
447 : case XML_TOK_PA_COORDINATE_REGION:
448 : {
449 236 : pContext = new SchXMLCoordinateRegionContext( GetImport(), nPrefix, rLocalName, m_aInnerPositioning );
450 : }
451 236 : break;
452 :
453 : case XML_TOK_PA_AXIS:
454 : {
455 580 : bool bAddMissingXAxisForNetCharts = false;
456 580 : bool bAdaptWrongPercentScaleValues = false;
457 580 : if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_3( GetImport().GetModel() ) )
458 : {
459 : //correct errors from older versions
460 :
461 : // for NetCharts there were no xAxis exported to older files
462 : // so we need to add the x axis here for those old NetChart files
463 0 : if ( maChartTypeServiceName == "com.sun.star.chart2.NetChartType" )
464 0 : bAddMissingXAxisForNetCharts = true;
465 :
466 : //Issue 59288
467 0 : if( mbPercentStacked )
468 0 : bAdaptWrongPercentScaleValues = true;
469 : }
470 :
471 580 : bool bAdaptXAxisOrientationForOld2DBarCharts = false;
472 580 : if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan2_4( GetImport().GetModel() ) )
473 : {
474 : //issue74660
475 0 : if ( maChartTypeServiceName == "com.sun.star.chart2.ColumnChartType" )
476 0 : bAdaptXAxisOrientationForOld2DBarCharts = true;
477 : }
478 :
479 580 : pContext = new SchXMLAxisContext( mrImportHelper, GetImport(), rLocalName, mxDiagram, maAxes, mrCategoriesAddress,
480 580 : bAddMissingXAxisForNetCharts, bAdaptWrongPercentScaleValues, bAdaptXAxisOrientationForOld2DBarCharts, m_bAxisPositionAttributeImported );
481 : }
482 580 : break;
483 :
484 : case XML_TOK_PA_SERIES:
485 : {
486 520 : if( mxNewDoc.is())
487 : {
488 : pContext = new SchXMLSeries2Context(
489 520 : mrImportHelper, GetImport(), rLocalName,
490 : mxNewDoc, maAxes,
491 : mrSeriesDefaultsAndStyles.maSeriesStyleList,
492 : mrSeriesDefaultsAndStyles.maRegressionStyleList,
493 : mnSeries,
494 : mbStockHasVolume,
495 : m_aGlobalSeriesImportInfo,
496 : maChartTypeServiceName,
497 : mrLSequencesPerIndex,
498 520 : mbGlobalChartTypeUsedBySeries, maChartSize );
499 : }
500 520 : mnSeries++;
501 : }
502 520 : break;
503 :
504 : case XML_TOK_PA_WALL:
505 244 : pContext = new SchXMLWallFloorContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
506 244 : SchXMLWallFloorContext::CONTEXT_TYPE_WALL );
507 244 : break;
508 : case XML_TOK_PA_FLOOR:
509 244 : pContext = new SchXMLWallFloorContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
510 244 : SchXMLWallFloorContext::CONTEXT_TYPE_FLOOR );
511 244 : break;
512 :
513 : case XML_TOK_PA_LIGHT_SOURCE:
514 512 : pContext = maSceneImportHelper.create3DLightContext( nPrefix, rLocalName, xAttrList );
515 512 : break;
516 :
517 : // elements for stock charts
518 : case XML_TOK_PA_STOCK_GAIN:
519 4 : pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
520 4 : SchXMLStockContext::CONTEXT_TYPE_GAIN );
521 4 : break;
522 : case XML_TOK_PA_STOCK_LOSS:
523 4 : pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
524 4 : SchXMLStockContext::CONTEXT_TYPE_LOSS );
525 4 : break;
526 : case XML_TOK_PA_STOCK_RANGE:
527 4 : pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
528 4 : SchXMLStockContext::CONTEXT_TYPE_RANGE );
529 4 : break;
530 :
531 : default:
532 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
533 : }
534 :
535 2348 : return pContext;
536 : }
537 :
538 244 : void SchXMLPlotAreaContext::EndElement()
539 : {
540 : // set categories
541 244 : if( !mrCategoriesAddress.isEmpty() && mxNewDoc.is())
542 : {
543 : uno::Reference< chart2::data::XDataProvider > xDataProvider(
544 174 : mxNewDoc->getDataProvider() );
545 : // @todo: correct coordinate system index
546 174 : sal_Int32 nDimension( 0 );
547 : ::std::vector< SchXMLAxis >::const_iterator aIt(
548 174 : ::std::find_if( maAxes.begin(), maAxes.end(), lcl_AxisHasCategories()));
549 174 : if( aIt != maAxes.end())
550 0 : nDimension = static_cast< sal_Int32 >( (*aIt).eDimension );
551 : SchXMLTools::CreateCategories(
552 : xDataProvider, mxNewDoc, mrCategoriesAddress,
553 : 0 /* nCooSysIndex */,
554 174 : nDimension, &mrLSequencesPerIndex );
555 : }
556 :
557 244 : uno::Reference< beans::XPropertySet > xDiaProp( mxDiagram, uno::UNO_QUERY );
558 244 : if( xDiaProp.is())
559 : {
560 244 : bool bIsThreeDim = false;
561 244 : uno::Any aAny = xDiaProp->getPropertyValue("Dim3D");
562 244 : aAny >>= bIsThreeDim;
563 :
564 : // set 3d scene attributes
565 244 : if( bIsThreeDim )
566 : {
567 : // set scene attributes at diagram
568 64 : maSceneImportHelper.setSceneAttributes( xDiaProp );
569 : }
570 :
571 : // set correct number of lines at series
572 244 : if( ! m_aGlobalSeriesImportInfo.rbAllRangeAddressesAvailable && mnNumOfLinesProp > 0 && maChartTypeServiceName == "com.sun.star.chart2.ColumnChartType" )
573 : {
574 : try
575 : {
576 0 : xDiaProp->setPropertyValue("NumberOfLines",
577 0 : uno::makeAny( mnNumOfLinesProp ));
578 : }
579 0 : catch( const uno::Exception & rEx )
580 : {
581 0 : OString aBStr(OUStringToOString(rEx.Message, RTL_TEXTENCODING_ASCII_US));
582 0 : SAL_INFO("xmloff.chart", "Exception caught for property NumberOfLines: " << aBStr);
583 : }
584 : }
585 :
586 : // #i32366# stock has volume
587 244 : if( mxDiagram->getDiagramType() == "com.sun.star.chart.StockDiagram" &&
588 : mbStockHasVolume )
589 : {
590 : try
591 : {
592 0 : xDiaProp->setPropertyValue("Volume",
593 0 : uno::makeAny( true ));
594 : }
595 0 : catch( const uno::Exception & rEx )
596 : {
597 0 : OString aBStr(OUStringToOString(rEx.Message, RTL_TEXTENCODING_ASCII_US));
598 0 : SAL_INFO("xmloff.chart", "Exception caught for property Volume: " << aBStr);
599 : }
600 244 : }
601 : }
602 :
603 : // set changed size and position after properties (esp. 3d)
604 :
605 488 : uno::Reference< chart::XDiagramPositioning > xDiaPos( mxDiagram, uno::UNO_QUERY );
606 244 : if( xDiaPos.is())
607 : {
608 244 : if( !m_aOuterPositioning.isAutomatic() )
609 : {
610 8 : if( m_aInnerPositioning.hasPosSize() )
611 2 : xDiaPos->setDiagramPositionExcludingAxes( m_aInnerPositioning.getRectangle() );
612 6 : else if( m_aOuterPositioning.hasPosSize() )
613 : {
614 6 : if( SchXMLTools::isDocumentGeneratedWithOpenOfficeOlderThan3_3( GetImport().GetModel() ) ) //old version of OOo did write a wrong rectangle for the diagram size
615 0 : xDiaPos->setDiagramPositionIncludingAxesAndAxisTitles( m_aOuterPositioning.getRectangle() );
616 : else
617 6 : xDiaPos->setDiagramPositionIncludingAxes( m_aOuterPositioning.getRectangle() );
618 : }
619 : }
620 : }
621 :
622 488 : SchXMLAxisContext::CorrectAxisPositions( uno::Reference< chart2::XChartDocument >( mrImportHelper.GetChartDocument(), uno::UNO_QUERY ), maChartTypeServiceName, GetImport().GetODFVersion(), m_bAxisPositionAttributeImported );
623 244 : }
624 :
625 650 : SchXMLDataPointContext::SchXMLDataPointContext( SvXMLImport& rImport, const OUString& rLocalName,
626 : ::std::list< DataRowPointStyle >& rStyleList,
627 : const ::com::sun::star::uno::Reference<
628 : ::com::sun::star::chart2::XDataSeries >& xSeries,
629 : sal_Int32& rIndex,
630 : bool bSymbolSizeForSeriesIsMissingInFile ) :
631 : SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
632 : mrStyleList( rStyleList ),
633 : m_xSeries( xSeries ),
634 : mrIndex( rIndex ),
635 650 : mbSymbolSizeForSeriesIsMissingInFile( bSymbolSizeForSeriesIsMissingInFile )
636 : {
637 650 : }
638 :
639 1300 : SchXMLDataPointContext::~SchXMLDataPointContext()
640 : {
641 1300 : }
642 :
643 650 : void SchXMLDataPointContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
644 : {
645 650 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
646 650 : OUString sAutoStyleName;
647 650 : sal_Int32 nRepeat = 1;
648 :
649 1286 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
650 : {
651 636 : OUString sAttrName = xAttrList->getNameByIndex( i );
652 1272 : OUString aLocalName;
653 636 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
654 :
655 636 : if( nPrefix == XML_NAMESPACE_CHART )
656 : {
657 636 : if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
658 154 : sAutoStyleName = xAttrList->getValueByIndex( i );
659 482 : else if( IsXMLToken( aLocalName, XML_REPEATED ) )
660 482 : nRepeat = xAttrList->getValueByIndex( i ).toInt32();
661 : }
662 636 : }
663 :
664 650 : if( !sAutoStyleName.isEmpty())
665 : {
666 : DataRowPointStyle aStyle(
667 : DataRowPointStyle::DATA_POINT,
668 154 : m_xSeries, mrIndex, nRepeat, sAutoStyleName );
669 154 : aStyle.mbSymbolSizeForSeriesIsMissingInFile = mbSymbolSizeForSeriesIsMissingInFile;
670 154 : mrStyleList.push_back( aStyle );
671 : }
672 650 : mrIndex += nRepeat;
673 650 : }
674 :
675 488 : SchXMLPositonAttributesHelper::SchXMLPositonAttributesHelper( SvXMLImport& rImporter )
676 : : m_rImport( rImporter )
677 : , m_aPosition(0,0)
678 : , m_aSize(0,0)
679 : , m_bHasSizeWidth( false )
680 : , m_bHasSizeHeight( false )
681 : , m_bHasPositionX( false )
682 : , m_bHasPositionY( false )
683 : , m_bAutoSize( false )
684 488 : , m_bAutoPosition( false )
685 : {
686 488 : }
687 :
688 488 : SchXMLPositonAttributesHelper::~SchXMLPositonAttributesHelper()
689 : {
690 488 : }
691 :
692 8 : bool SchXMLPositonAttributesHelper::hasSize() const
693 : {
694 8 : return m_bHasSizeWidth && m_bHasSizeHeight;
695 : }
696 14 : bool SchXMLPositonAttributesHelper::hasPosition() const
697 : {
698 14 : return m_bHasPositionX && m_bHasPositionY;
699 : }
700 14 : bool SchXMLPositonAttributesHelper::hasPosSize() const
701 : {
702 14 : return hasPosition() && hasSize();
703 : }
704 244 : bool SchXMLPositonAttributesHelper::isAutomatic() const
705 : {
706 244 : return m_bAutoSize || m_bAutoPosition;
707 : }
708 :
709 1920 : bool SchXMLPositonAttributesHelper::readPositioningAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue )
710 : {
711 : //returns true if the attribute was proccessed
712 1920 : bool bReturn = true;
713 :
714 1920 : if( XML_NAMESPACE_SVG == nPrefix )
715 : {
716 1920 : if( IsXMLToken( rLocalName, XML_X ) )
717 : {
718 480 : m_rImport.GetMM100UnitConverter().convertMeasureToCore(
719 960 : m_aPosition.X, rValue );
720 480 : m_bHasPositionX = true;
721 : }
722 1440 : else if( IsXMLToken( rLocalName, XML_Y ) )
723 : {
724 480 : m_rImport.GetMM100UnitConverter().convertMeasureToCore(
725 960 : m_aPosition.Y, rValue );
726 480 : m_bHasPositionY = true;
727 : }
728 960 : else if( IsXMLToken( rLocalName, XML_WIDTH ) )
729 : {
730 480 : m_rImport.GetMM100UnitConverter().convertMeasureToCore(
731 960 : m_aSize.Width, rValue );
732 480 : m_bHasSizeWidth = true;
733 : }
734 480 : else if( IsXMLToken( rLocalName, XML_HEIGHT ) )
735 : {
736 480 : m_rImport.GetMM100UnitConverter().convertMeasureToCore(
737 960 : m_aSize.Height, rValue );
738 480 : m_bHasSizeHeight = true;
739 : }
740 : else
741 0 : bReturn = false;
742 : }
743 : else
744 0 : bReturn = false;
745 :
746 1920 : return bReturn;
747 : }
748 :
749 244 : void SchXMLPositonAttributesHelper::readAutomaticPositioningProperties( XMLPropStyleContext* pPropStyleContext, const SvXMLStylesContext* pStylesCtxt )
750 : {
751 244 : if( pPropStyleContext && pStylesCtxt )
752 : {
753 : //handle automatic position and size
754 : SchXMLTools::getPropertyFromContext(
755 244 : OUString("AutomaticSize"), pPropStyleContext, pStylesCtxt ) >>= m_bAutoSize;
756 : SchXMLTools::getPropertyFromContext(
757 244 : OUString("AutomaticPosition"), pPropStyleContext, pStylesCtxt ) >>= m_bAutoPosition;
758 : }
759 244 : }
760 :
761 236 : SchXMLCoordinateRegionContext::SchXMLCoordinateRegionContext(
762 : SvXMLImport& rImport
763 : , sal_uInt16 nPrefix
764 : , const OUString& rLocalName
765 : , SchXMLPositonAttributesHelper& rPositioning )
766 : : SvXMLImportContext( rImport, nPrefix, rLocalName )
767 236 : , m_rPositioning( rPositioning )
768 : {
769 236 : }
770 :
771 472 : SchXMLCoordinateRegionContext::~SchXMLCoordinateRegionContext()
772 : {
773 472 : }
774 :
775 236 : void SchXMLCoordinateRegionContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
776 : {
777 : // parse attributes
778 236 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
779 :
780 1180 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
781 : {
782 944 : OUString sAttrName = xAttrList->getNameByIndex( i );
783 1888 : OUString aLocalName;
784 1888 : OUString aValue = xAttrList->getValueByIndex( i );
785 944 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
786 944 : m_rPositioning.readPositioningAttribute( nPrefix, aLocalName, aValue );
787 944 : }
788 236 : }
789 :
790 488 : SchXMLWallFloorContext::SchXMLWallFloorContext(
791 : SchXMLImportHelper& rImpHelper,
792 : SvXMLImport& rImport,
793 : sal_uInt16 nPrefix,
794 : const OUString& rLocalName,
795 : uno::Reference< chart::XDiagram >& xDiagram,
796 : ContextType eContextType ) :
797 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
798 : mrImportHelper( rImpHelper ),
799 : mxWallFloorSupplier( xDiagram, uno::UNO_QUERY ),
800 488 : meContextType( eContextType )
801 : {
802 488 : }
803 :
804 976 : SchXMLWallFloorContext::~SchXMLWallFloorContext()
805 : {
806 976 : }
807 :
808 488 : void SchXMLWallFloorContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
809 : {
810 488 : if( mxWallFloorSupplier.is())
811 : {
812 488 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
813 488 : OUString sAutoStyleName;
814 :
815 976 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
816 : {
817 488 : OUString sAttrName = xAttrList->getNameByIndex( i );
818 976 : OUString aLocalName;
819 488 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
820 :
821 976 : if( nPrefix == XML_NAMESPACE_CHART &&
822 488 : IsXMLToken( aLocalName, XML_STYLE_NAME ) )
823 : {
824 488 : sAutoStyleName = xAttrList->getValueByIndex( i );
825 : }
826 488 : }
827 :
828 : // set properties
829 488 : uno::Reference< beans::XPropertySet > xProp( ( meContextType == CONTEXT_TYPE_WALL )
830 244 : ? mxWallFloorSupplier->getWall()
831 244 : : mxWallFloorSupplier->getFloor(),
832 1464 : uno::UNO_QUERY );
833 488 : if( xProp.is())
834 : {
835 488 : if( !sAutoStyleName.isEmpty())
836 : {
837 488 : const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
838 488 : if( pStylesCtxt )
839 : {
840 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
841 488 : SchXMLImportHelper::GetChartFamilyID(), sAutoStyleName );
842 :
843 488 : if( pStyle && pStyle->ISA( XMLPropStyleContext ))
844 488 : const_cast<XMLPropStyleContext*>( static_cast<const XMLPropStyleContext*>( pStyle ) )->FillPropertySet( xProp );
845 : }
846 : }
847 488 : }
848 : }
849 488 : }
850 :
851 12 : SchXMLStockContext::SchXMLStockContext(
852 : SchXMLImportHelper& rImpHelper,
853 : SvXMLImport& rImport,
854 : sal_uInt16 nPrefix,
855 : const OUString& rLocalName,
856 : uno::Reference< chart::XDiagram >& xDiagram,
857 : ContextType eContextType ) :
858 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
859 : mrImportHelper( rImpHelper ),
860 : mxStockPropProvider( xDiagram, uno::UNO_QUERY ),
861 12 : meContextType( eContextType )
862 : {
863 12 : }
864 :
865 24 : SchXMLStockContext::~SchXMLStockContext()
866 : {
867 24 : }
868 :
869 12 : void SchXMLStockContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
870 : {
871 12 : if( mxStockPropProvider.is())
872 : {
873 12 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
874 12 : OUString sAutoStyleName;
875 :
876 24 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
877 : {
878 12 : OUString sAttrName = xAttrList->getNameByIndex( i );
879 24 : OUString aLocalName;
880 12 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
881 :
882 24 : if( nPrefix == XML_NAMESPACE_CHART &&
883 12 : IsXMLToken( aLocalName, XML_STYLE_NAME ) )
884 : {
885 12 : sAutoStyleName = xAttrList->getValueByIndex( i );
886 : }
887 12 : }
888 :
889 12 : if( !sAutoStyleName.isEmpty())
890 : {
891 : // set properties
892 12 : uno::Reference< beans::XPropertySet > xProp;
893 12 : switch( meContextType )
894 : {
895 : case CONTEXT_TYPE_GAIN:
896 4 : xProp = mxStockPropProvider->getUpBar();
897 4 : break;
898 : case CONTEXT_TYPE_LOSS:
899 4 : xProp = mxStockPropProvider->getDownBar();
900 4 : break;
901 : case CONTEXT_TYPE_RANGE:
902 4 : xProp = mxStockPropProvider->getMinMaxLine();
903 4 : break;
904 : }
905 12 : if( xProp.is())
906 : {
907 12 : const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
908 12 : if( pStylesCtxt )
909 : {
910 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
911 12 : SchXMLImportHelper::GetChartFamilyID(), sAutoStyleName );
912 :
913 12 : if( pStyle && pStyle->ISA( XMLPropStyleContext ))
914 12 : const_cast<XMLPropStyleContext*>( static_cast<const XMLPropStyleContext*>( pStyle ) )->FillPropertySet( xProp );
915 : }
916 12 : }
917 12 : }
918 : }
919 12 : }
920 :
921 12 : static void lcl_setErrorBarSequence ( const uno::Reference< chart2::XChartDocument > &xDoc,
922 : const uno::Reference< beans::XPropertySet > &xBarProp,
923 : const OUString &aXMLRange,
924 : bool bPositiveValue, bool bYError,
925 : tSchXMLLSequencesPerIndex& rSequences)
926 : {
927 12 : uno::Reference< com::sun::star::chart2::data::XDataProvider > xDataProvider(xDoc->getDataProvider());
928 24 : uno::Reference< com::sun::star::chart2::data::XDataSource > xDataSource( xBarProp, uno::UNO_QUERY );
929 24 : uno::Reference< com::sun::star::chart2::data::XDataSink > xDataSink( xDataSource, uno::UNO_QUERY );
930 :
931 : assert( xDataSink.is() && xDataSource.is() && xDataProvider.is() );
932 :
933 24 : OUString aRange(lcl_ConvertRange(aXMLRange,xDoc));
934 :
935 : uno::Reference< chart2::data::XDataSequence > xNewSequence(
936 24 : xDataProvider->createDataSequenceByRangeRepresentation( aRange ));
937 :
938 12 : if( xNewSequence.is())
939 : {
940 12 : SchXMLTools::setXMLRangePropertyAtDataSequence(xNewSequence,aXMLRange);
941 :
942 12 : OUStringBuffer aRoleBuffer("error-bars-");
943 12 : if( bYError )
944 12 : aRoleBuffer.append( 'y' );
945 : else
946 0 : aRoleBuffer.append( 'x');
947 :
948 12 : aRoleBuffer.append( '-' );
949 :
950 12 : if( bPositiveValue )
951 6 : aRoleBuffer = aRoleBuffer.appendAscii( "positive" );
952 : else
953 6 : aRoleBuffer = aRoleBuffer.appendAscii( "negative" );
954 :
955 24 : OUString aRole = aRoleBuffer.makeStringAndClear();
956 :
957 24 : Reference< beans::XPropertySet > xSeqProp( xNewSequence, uno::UNO_QUERY );
958 :
959 12 : xSeqProp->setPropertyValue("Role", uno::makeAny( aRole ));
960 :
961 24 : Reference< uno::XComponentContext > xContext = comphelper::getProcessComponentContext();
962 :
963 : Reference< chart2::data::XLabeledDataSequence > xLabelSeq( chart2::data::LabeledDataSequence::create(xContext),
964 24 : uno::UNO_QUERY_THROW );
965 :
966 : rSequences.insert( tSchXMLLSequencesPerIndex::value_type(
967 12 : tSchXMLIndexWithPart( -2, SCH_XML_PART_ERROR_BARS ), xLabelSeq ) );
968 :
969 12 : xLabelSeq->setValues( xNewSequence );
970 :
971 : uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > aSequences(
972 24 : xDataSource->getDataSequences());
973 :
974 12 : aSequences.realloc( aSequences.getLength() + 1 );
975 12 : aSequences[ aSequences.getLength() - 1 ] = xLabelSeq;
976 24 : xDataSink->setData( aSequences );
977 12 : }
978 12 : }
979 :
980 12 : SchXMLStatisticsObjectContext::SchXMLStatisticsObjectContext(
981 : SchXMLImportHelper& rImpHelper,
982 : SvXMLImport& rImport,
983 : sal_uInt16 nPrefix,
984 : const OUString& rLocalName,
985 : const OUString &rSeriesStyleName,
986 : ::std::list< DataRowPointStyle >& rStyleList,
987 : const ::com::sun::star::uno::Reference<
988 : ::com::sun::star::chart2::XDataSeries >& xSeries,
989 : ContextType eContextType,
990 : const awt::Size & rChartSize,
991 : tSchXMLLSequencesPerIndex & rLSequencesPerIndex) :
992 :
993 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
994 : mrImportHelper( rImpHelper ),
995 : mrStyleList( rStyleList ),
996 : m_xSeries( xSeries ),
997 : meContextType( eContextType ),
998 : maChartSize( rChartSize ),
999 : maSeriesStyleName( rSeriesStyleName),
1000 12 : mrLSequencesPerIndex(rLSequencesPerIndex)
1001 12 : {}
1002 :
1003 24 : SchXMLStatisticsObjectContext::~SchXMLStatisticsObjectContext()
1004 : {
1005 24 : }
1006 :
1007 : namespace {
1008 :
1009 24 : void SetErrorBarStyleProperties( const OUString& rStyleName, uno::Reference< beans::XPropertySet > xBarProp,
1010 : SchXMLImportHelper& rImportHelper )
1011 : {
1012 24 : const SvXMLStylesContext* pStylesCtxt = rImportHelper.GetAutoStylesContext();
1013 24 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(SchXMLImportHelper::GetChartFamilyID(),
1014 24 : rStyleName);
1015 :
1016 : XMLPropStyleContext &rSeriesStyleContext =
1017 24 : const_cast< XMLPropStyleContext& >( dynamic_cast< const XMLPropStyleContext& >( *pStyle ));
1018 :
1019 24 : rSeriesStyleContext.FillPropertySet( xBarProp );
1020 24 : }
1021 :
1022 24 : void SetErrorBarPropertiesFromStyleName( const OUString& aStyleName, uno::Reference< beans::XPropertySet> xBarProp,
1023 : SchXMLImportHelper& rImportHelper, OUString& aPosRange, OUString& aNegRange)
1024 : {
1025 24 : const SvXMLStylesContext* pStylesCtxt = rImportHelper.GetAutoStylesContext();
1026 24 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(SchXMLImportHelper::GetChartFamilyID(),
1027 24 : aStyleName);
1028 :
1029 : XMLPropStyleContext * pSeriesStyleContext =
1030 24 : const_cast< XMLPropStyleContext * >( dynamic_cast< const XMLPropStyleContext * >( pStyle ));
1031 :
1032 : uno::Any aAny = SchXMLTools::getPropertyFromContext("ErrorBarStyle",
1033 24 : pSeriesStyleContext,pStylesCtxt);
1034 :
1035 24 : if ( aAny.hasValue() )
1036 : {
1037 24 : sal_Int32 aBarStyle = com::sun::star::chart::ErrorBarStyle::NONE;
1038 24 : aAny >>= aBarStyle;
1039 24 : xBarProp->setPropertyValue("ErrorBarStyle", aAny);
1040 :
1041 48 : aAny = SchXMLTools::getPropertyFromContext("ShowPositiveError",
1042 24 : pSeriesStyleContext,pStylesCtxt);
1043 :
1044 24 : if(aAny.hasValue())
1045 12 : xBarProp->setPropertyValue("ShowPositiveError",aAny);
1046 :
1047 48 : aAny = SchXMLTools::getPropertyFromContext("ShowNegativeError",
1048 24 : pSeriesStyleContext,pStylesCtxt);
1049 :
1050 24 : if(aAny.hasValue())
1051 12 : xBarProp->setPropertyValue("ShowNegativeError",aAny);
1052 :
1053 48 : aAny = SchXMLTools::getPropertyFromContext("PositiveError",
1054 24 : pSeriesStyleContext, pStylesCtxt);
1055 :
1056 24 : if(aAny.hasValue())
1057 0 : xBarProp->setPropertyValue("PositiveError", aAny);
1058 : else
1059 : {
1060 48 : aAny = SchXMLTools::getPropertyFromContext("ConstantErrorHigh",
1061 24 : pSeriesStyleContext, pStylesCtxt);
1062 :
1063 24 : if(aAny.hasValue())
1064 0 : xBarProp->setPropertyValue("PositiveError", aAny);
1065 : }
1066 :
1067 48 : aAny = SchXMLTools::getPropertyFromContext("NegativeError",
1068 24 : pSeriesStyleContext, pStylesCtxt);
1069 :
1070 24 : if(aAny.hasValue())
1071 0 : xBarProp->setPropertyValue("NegativeError", aAny);
1072 : else
1073 : {
1074 48 : aAny = SchXMLTools::getPropertyFromContext("ConstantErrorLow",
1075 24 : pSeriesStyleContext, pStylesCtxt);
1076 :
1077 24 : if(aAny.hasValue())
1078 0 : xBarProp->setPropertyValue("NegativeError", aAny);
1079 : }
1080 :
1081 48 : aAny = SchXMLTools::getPropertyFromContext("ErrorBarRangePositive",
1082 24 : pSeriesStyleContext, pStylesCtxt);
1083 24 : if( aAny.hasValue() )
1084 : {
1085 12 : aAny >>= aPosRange;
1086 : }
1087 :
1088 48 : aAny = SchXMLTools::getPropertyFromContext("ErrorBarRangeNegative",
1089 24 : pSeriesStyleContext, pStylesCtxt);
1090 24 : if( aAny.hasValue() )
1091 : {
1092 12 : aAny >>= aNegRange;
1093 : }
1094 :
1095 48 : aAny = SchXMLTools::getPropertyFromContext("Weight",
1096 24 : pSeriesStyleContext, pStylesCtxt);
1097 24 : if( aAny.hasValue() )
1098 : {
1099 8 : xBarProp->setPropertyValue("Weight", aAny);
1100 : }
1101 :
1102 48 : aAny = SchXMLTools::getPropertyFromContext("PercentageError",
1103 24 : pSeriesStyleContext, pStylesCtxt);
1104 24 : if( aAny.hasValue() && aBarStyle == com::sun::star::chart::ErrorBarStyle::RELATIVE )
1105 : {
1106 12 : xBarProp->setPropertyValue("PositiveError", aAny);
1107 12 : xBarProp->setPropertyValue("NegativeError", aAny);
1108 : }
1109 :
1110 24 : switch(aBarStyle)
1111 : {
1112 : case com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN:
1113 : {
1114 0 : aAny = SchXMLTools::getPropertyFromContext("NegativeError",
1115 0 : pSeriesStyleContext,pStylesCtxt);
1116 :
1117 0 : xBarProp->setPropertyValue("NegativeError",aAny);
1118 :
1119 0 : aAny = SchXMLTools::getPropertyFromContext("PositiveError",
1120 0 : pSeriesStyleContext,pStylesCtxt);
1121 :
1122 0 : xBarProp->setPropertyValue("PositiveError",aAny);
1123 : }
1124 0 : break;
1125 : default:
1126 24 : break;
1127 : }
1128 24 : }
1129 24 : }
1130 :
1131 : }
1132 :
1133 12 : void SchXMLStatisticsObjectContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1134 : {
1135 12 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
1136 12 : OUString sAutoStyleName;
1137 24 : OUString aPosRange;
1138 24 : OUString aNegRange;
1139 12 : bool bYError = true; /// Default errorbar, to be backward compatible with older files!
1140 :
1141 36 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
1142 : {
1143 24 : OUString sAttrName = xAttrList->getNameByIndex( i );
1144 48 : OUString aLocalName;
1145 :
1146 24 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
1147 :
1148 24 : if( nPrefix == XML_NAMESPACE_CHART )
1149 : {
1150 24 : if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
1151 12 : sAutoStyleName = xAttrList->getValueByIndex( i );
1152 12 : else if( IsXMLToken( aLocalName, XML_DIMENSION ) )
1153 12 : bYError = xAttrList->getValueByIndex(i) == "y";
1154 0 : else if( IsXMLToken( aLocalName, XML_ERROR_UPPER_RANGE) )
1155 0 : aPosRange = xAttrList->getValueByIndex(i);
1156 0 : else if( IsXMLToken( aLocalName, XML_ERROR_LOWER_RANGE) )
1157 0 : aNegRange = xAttrList->getValueByIndex(i);
1158 : }
1159 24 : }
1160 :
1161 12 : if( !sAutoStyleName.isEmpty() )
1162 : {
1163 12 : DataRowPointStyle aStyle( DataRowPointStyle::MEAN_VALUE, m_xSeries, -1, 1, sAutoStyleName );
1164 :
1165 12 : switch( meContextType )
1166 : {
1167 : case CONTEXT_TYPE_MEAN_VALUE_LINE:
1168 0 : aStyle.meType = DataRowPointStyle::MEAN_VALUE;
1169 0 : break;
1170 : case CONTEXT_TYPE_ERROR_INDICATOR:
1171 : {
1172 12 : aStyle.meType = DataRowPointStyle::ERROR_INDICATOR;
1173 :
1174 : uno::Reference< lang::XMultiServiceFactory > xFact( comphelper::getProcessServiceFactory(),
1175 12 : uno::UNO_QUERY );
1176 :
1177 12 : uno::Reference< beans::XPropertySet > xBarProp( xFact->createInstance("com.sun.star.chart2.ErrorBar" ),
1178 24 : uno::UNO_QUERY );
1179 :
1180 12 : xBarProp->setPropertyValue("ErrorBarStyle",uno::makeAny(com::sun::star::chart::ErrorBarStyle::NONE));
1181 12 : xBarProp->setPropertyValue("PositiveError",uno::makeAny(static_cast<double>(0.0)));
1182 12 : xBarProp->setPropertyValue("NegativeError",uno::makeAny(static_cast<double>(0.0)));
1183 12 : xBarProp->setPropertyValue("Weight",uno::makeAny(static_cast<double>(1.0)));
1184 12 : xBarProp->setPropertyValue("ShowPositiveError",uno::makeAny(sal_True));
1185 12 : xBarProp->setPropertyValue("ShowNegativeError",uno::makeAny(sal_True));
1186 :
1187 : // first import defaults from parent style
1188 12 : SetErrorBarStyleProperties( maSeriesStyleName, xBarProp, mrImportHelper );
1189 12 : SetErrorBarStyleProperties( sAutoStyleName, xBarProp, mrImportHelper );
1190 12 : SetErrorBarPropertiesFromStyleName( maSeriesStyleName, xBarProp, mrImportHelper, aPosRange, aNegRange );
1191 12 : SetErrorBarPropertiesFromStyleName( sAutoStyleName, xBarProp, mrImportHelper, aPosRange, aNegRange );
1192 :
1193 24 : uno::Reference< chart2::XChartDocument > xDoc(GetImport().GetModel(),uno::UNO_QUERY);
1194 :
1195 12 : if (!aPosRange.isEmpty())
1196 6 : lcl_setErrorBarSequence(xDoc,xBarProp,aPosRange,true,bYError, mrLSequencesPerIndex);
1197 :
1198 12 : if (!aNegRange.isEmpty())
1199 6 : lcl_setErrorBarSequence(xDoc,xBarProp,aNegRange,false,bYError, mrLSequencesPerIndex);
1200 :
1201 12 : if ( !bYError )
1202 : {
1203 0 : aStyle.m_xErrorXProperties.set( xBarProp );
1204 : }
1205 : else
1206 : {
1207 12 : aStyle.m_xErrorYProperties.set( xBarProp );
1208 12 : }
1209 : }
1210 12 : break;
1211 : }
1212 :
1213 12 : mrStyleList.push_back( aStyle );
1214 12 : }
1215 12 : }
1216 :
1217 0 : SvXMLImportContext* SchXMLStatisticsObjectContext::CreateChildContext(
1218 : sal_uInt16 nPrefix,
1219 : const OUString& rLocalName,
1220 : const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1221 : {
1222 0 : SvXMLImportContext* pContext = 0;
1223 0 : pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
1224 0 : return pContext;
1225 : }
1226 :
1227 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|