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