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 : #include <tools/debug.hxx>
29 :
30 : #include <comphelper/processfactory.hxx>
31 : #include <xmloff/xmlnmspe.hxx>
32 : #include <xmloff/xmlement.hxx>
33 : #include <xmloff/nmspmap.hxx>
34 : #include <xmloff/xmluconv.hxx>
35 : #include <xmloff/prstylei.hxx>
36 : #include <xmloff/xmlstyle.hxx>
37 : #include "xexptran.hxx"
38 : #include <cppuhelper/implbase1.hxx>
39 :
40 : #include <com/sun/star/awt/Point.hpp>
41 : #include <com/sun/star/awt/Size.hpp>
42 : #include <com/sun/star/chart/ChartDataRowSource.hpp>
43 : #include <com/sun/star/chart/ChartErrorCategory.hpp>
44 : #include <com/sun/star/chart/ChartErrorIndicatorType.hpp>
45 : #include <com/sun/star/chart/ErrorBarStyle.hpp>
46 : #include <com/sun/star/chart/X3DDisplay.hpp>
47 : #include <com/sun/star/chart/XStatisticDisplay.hpp>
48 : #include <com/sun/star/chart/XDiagramPositioning.hpp>
49 : #include <com/sun/star/chart2/RelativePosition.hpp>
50 : #include <com/sun/star/chart2/XChartTypeContainer.hpp>
51 : #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
52 : #include <com/sun/star/chart2/data/XDataSink.hpp>
53 : #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
54 : #include <com/sun/star/chart2/data/LabeledDataSequence.hpp>
55 : #include <com/sun/star/drawing/CameraGeometry.hpp>
56 : #include <com/sun/star/drawing/FillStyle.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 0 : bool operator() ( const SchXMLAxis & rAxis )
72 : {
73 0 : return rAxis.bHasCategories;
74 : }
75 : };
76 :
77 0 : OUString lcl_ConvertRange( const OUString & rRange, const uno::Reference< chart2::XChartDocument > & xDoc )
78 : {
79 0 : OUString aResult = rRange;
80 0 : if(!xDoc.is())
81 0 : return aResult;
82 : uno::Reference< chart2::data::XRangeXMLConversion > xConversion(
83 0 : xDoc->getDataProvider(), uno::UNO_QUERY );
84 0 : if( xConversion.is())
85 0 : aResult = xConversion->convertRangeFromXML( rRange );
86 0 : return aResult;
87 : }
88 :
89 : } // anonymous namespace
90 :
91 0 : SchXML3DSceneAttributesHelper::SchXML3DSceneAttributesHelper( SvXMLImport& rImporter )
92 0 : : SdXML3DSceneAttributesHelper( rImporter )
93 : {
94 0 : }
95 :
96 0 : 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 0 : uno::Reference< beans::XPropertySet > xProp( xDiagram, uno::UNO_QUERY );
104 0 : if( xProp.is() )
105 : {
106 0 : drawing::CameraGeometry aCamGeo;
107 0 : xProp->getPropertyValue("D3DCameraGeometry") >>= aCamGeo;
108 0 : maVRP.setX( aCamGeo.vrp.PositionX );
109 0 : maVRP.setY( aCamGeo.vrp.PositionY );
110 0 : maVRP.setZ( aCamGeo.vrp.PositionZ );
111 0 : maVPN.setX( aCamGeo.vpn.DirectionX );
112 0 : maVPN.setY( aCamGeo.vpn.DirectionY );
113 0 : maVPN.setZ( aCamGeo.vpn.DirectionZ );
114 0 : maVUP.setX( aCamGeo.vup.DirectionX );
115 0 : maVUP.setY( aCamGeo.vup.DirectionY );
116 0 : maVUP.setZ( aCamGeo.vup.DirectionZ );
117 0 : }
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 0 : }
125 :
126 0 : SchXML3DSceneAttributesHelper::~SchXML3DSceneAttributesHelper()
127 : {
128 0 : }
129 :
130 0 : 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 : sal_Bool & rAllRangeAddressesAvailable,
138 : sal_Bool & rColHasLabels,
139 : sal_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( sal_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 0 : maChartSize( rChartSize )
168 : {
169 0 : m_rbHasRangeAtPlotArea = false;
170 :
171 : // get Diagram
172 0 : uno::Reference< chart::XChartDocument > xDoc( rImpHelper.GetChartDocument(), uno::UNO_QUERY );
173 0 : if( xDoc.is())
174 : {
175 0 : mxDiagram = xDoc->getDiagram();
176 0 : mxNewDoc.set( xDoc, uno::UNO_QUERY );
177 :
178 0 : maSceneImportHelper.getCameraDefaultFromDiagram( mxDiagram );
179 : }
180 : SAL_WARN_IF( !mxDiagram.is(),"xmloff.chart", "Couldn't get XDiagram" );
181 :
182 : // turn off all axes initially
183 0 : uno::Any aFalseBool;
184 0 : aFalseBool <<= (sal_Bool)(sal_False);
185 :
186 0 : uno::Reference< lang::XServiceInfo > xInfo( mxDiagram, uno::UNO_QUERY );
187 0 : uno::Reference< beans::XPropertySet > xProp( mxDiagram, uno::UNO_QUERY );
188 0 : if( xInfo.is() &&
189 0 : xProp.is())
190 : {
191 : try
192 : {
193 0 : xProp->setPropertyValue(
194 0 : OUString( "HasXAxis" ), aFalseBool );
195 0 : xProp->setPropertyValue(
196 0 : OUString( "HasXAxisGrid" ), aFalseBool );
197 0 : xProp->setPropertyValue(
198 0 : OUString( "HasXAxisDescription" ), aFalseBool );
199 0 : xProp->setPropertyValue(
200 0 : OUString( "HasSecondaryXAxis" ), aFalseBool );
201 0 : xProp->setPropertyValue(
202 0 : OUString( "HasSecondaryXAxisDescription" ), aFalseBool );
203 :
204 0 : xProp->setPropertyValue(
205 0 : OUString( "HasYAxis" ), aFalseBool );
206 0 : xProp->setPropertyValue(
207 0 : OUString( "HasYAxisGrid" ), aFalseBool );
208 0 : xProp->setPropertyValue(
209 0 : OUString( "HasYAxisDescription" ), aFalseBool );
210 0 : xProp->setPropertyValue(
211 0 : OUString( "HasSecondaryYAxis" ), aFalseBool );
212 0 : xProp->setPropertyValue(
213 0 : OUString( "HasSecondaryYAxisDescription" ), aFalseBool );
214 :
215 0 : xProp->setPropertyValue(
216 0 : OUString( "HasZAxis" ), aFalseBool );
217 0 : xProp->setPropertyValue(
218 0 : OUString( "HasZAxisDescription" ), aFalseBool );
219 :
220 0 : uno::Any aAny;
221 0 : chart::ChartDataRowSource eSource = chart::ChartDataRowSource_COLUMNS;
222 0 : aAny <<= eSource;
223 0 : 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 0 : }
230 0 : }
231 :
232 0 : SchXMLPlotAreaContext::~SchXMLPlotAreaContext()
233 0 : {}
234 :
235 0 : void SchXMLPlotAreaContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
236 : {
237 : // parse attributes
238 0 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
239 0 : const SvXMLTokenMap& rAttrTokenMap = mrImportHelper.GetPlotAreaAttrTokenMap();
240 0 : uno::Reference< chart2::XChartDocument > xNewDoc( GetImport().GetModel(), uno::UNO_QUERY );
241 :
242 0 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
243 : {
244 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
245 0 : OUString aLocalName;
246 0 : OUString aValue = xAttrList->getValueByIndex( i );
247 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
248 :
249 0 : 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 0 : m_aOuterPositioning.readPositioningAttribute( nPrefix, aLocalName, aValue );
256 0 : break;
257 : case XML_TOK_PA_STYLE_NAME:
258 0 : msAutoStyleName = aValue;
259 0 : break;
260 : case XML_TOK_PA_CHART_ADDRESS:
261 0 : mrChartAddress = lcl_ConvertRange( aValue, xNewDoc );
262 : // indicator for getting data from the outside
263 0 : m_rbHasRangeAtPlotArea = true;
264 0 : break;
265 : case XML_TOK_PA_DS_HAS_LABELS:
266 : {
267 0 : if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_BOTH )))
268 0 : mrColHasLabels = mrRowHasLabels = sal_True;
269 0 : else if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_ROW )))
270 0 : mrRowHasLabels = sal_True;
271 0 : else if( aValue.equals( ::xmloff::token::GetXMLToken( ::xmloff::token::XML_COLUMN )))
272 0 : mrColHasLabels = sal_True;
273 : }
274 0 : 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 0 : maSceneImportHelper.processSceneAttribute( nPrefix, aLocalName, aValue );
287 0 : break;
288 : }
289 0 : }
290 :
291 0 : 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 <<= (sal_Bool)(mrColHasLabels);
300 0 : xDocProp->setPropertyValue(
301 : OUString( "DataSourceLabelsInFirstColumn" ),
302 0 : aAny );
303 :
304 0 : aAny <<= (sal_Bool)(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 0 : uno::Reference< beans::XPropertySet > xProp( mxDiagram, uno::UNO_QUERY );
318 0 : if( !msAutoStyleName.isEmpty())
319 : {
320 0 : if( xProp.is())
321 : {
322 0 : const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
323 0 : if( pStylesCtxt )
324 : {
325 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
326 0 : mrImportHelper.GetChartFamilyID(), msAutoStyleName );
327 :
328 : XMLPropStyleContext* pPropStyleContext =
329 : const_cast< XMLPropStyleContext * >(
330 0 : dynamic_cast< const XMLPropStyleContext * >( pStyle ) );
331 0 : if( pPropStyleContext )
332 : {
333 0 : pPropStyleContext->FillPropertySet( xProp );
334 :
335 : // get the data row source that was set without having data
336 0 : xProp->getPropertyValue("DataRowSource")
337 0 : >>= 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 0 : mrSeriesDefaultsAndStyles.maLinesOnProperty = SchXMLTools::getPropertyFromContext(
342 0 : OUString("Lines"), pPropStyleContext, pStylesCtxt );
343 :
344 : //handle automatic position and size
345 0 : m_aOuterPositioning.readAutomaticPositioningProperties( pPropStyleContext, pStylesCtxt );
346 :
347 : //correct default starting angle for old 3D pies
348 0 : 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 0 : if(xProp.is())
370 : {
371 : try
372 : {
373 0 : mrSeriesDefaultsAndStyles.maSymbolTypeDefault = xProp->getPropertyValue("SymbolType");
374 0 : mrSeriesDefaultsAndStyles.maDataCaptionDefault = xProp->getPropertyValue("DataCaption");
375 :
376 0 : mrSeriesDefaultsAndStyles.maMeanValueDefault = xProp->getPropertyValue("MeanValue");
377 0 : mrSeriesDefaultsAndStyles.maRegressionCurvesDefault = xProp->getPropertyValue("RegressionCurves");
378 :
379 0 : bool bStacked = false;
380 0 : mrSeriesDefaultsAndStyles.maStackedDefault = xProp->getPropertyValue("Stacked");
381 0 : mrSeriesDefaultsAndStyles.maStackedDefault >>= bStacked;
382 0 : mrSeriesDefaultsAndStyles.maPercentDefault = xProp->getPropertyValue("Percent");
383 0 : mrSeriesDefaultsAndStyles.maPercentDefault >>= mbPercentStacked;
384 0 : mrSeriesDefaultsAndStyles.maStackedBarsConnectedDefault = xProp->getPropertyValue("StackedBarsConnected");
385 :
386 : // deep
387 0 : 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 0 : if( ! (bStacked || mbPercentStacked ))
390 : {
391 0 : 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 0 : mrSeriesDefaultsAndStyles.maDeepDefault = aDeepProperty;
405 :
406 0 : xProp->getPropertyValue("NumberOfLines") >>= mnNumOfLinesProp;
407 0 : 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 0 : bool bCreateInternalDataProvider = false;
417 0 : if( m_rXLinkHRefAttributeToIndicateDataProvider == "." ) //data comes from the chart itself
418 0 : bCreateInternalDataProvider = true;
419 0 : else if( m_rXLinkHRefAttributeToIndicateDataProvider == ".." ) //data comes from the parent application
420 0 : bCreateInternalDataProvider = false;
421 0 : 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 0 : else if( !m_rbHasRangeAtPlotArea )
424 0 : bCreateInternalDataProvider = true;
425 :
426 0 : 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 0 : mxNewDoc->createInternalDataProvider( false /* bCloneExistingData */ );
432 0 : if( xProp.is() && mrDataRowSource!=chart::ChartDataRowSource_COLUMNS )
433 0 : xProp->setPropertyValue("DataRowSource", uno::makeAny(mrDataRowSource) );
434 0 : }
435 0 : }
436 :
437 0 : SvXMLImportContext* SchXMLPlotAreaContext::CreateChildContext(
438 : sal_uInt16 nPrefix,
439 : const OUString& rLocalName,
440 : const uno::Reference< xml::sax::XAttributeList >& xAttrList )
441 : {
442 0 : SvXMLImportContext* pContext = 0;
443 0 : const SvXMLTokenMap& rTokenMap = mrImportHelper.GetPlotAreaElemTokenMap();
444 :
445 0 : switch( rTokenMap.Get( nPrefix, rLocalName ))
446 : {
447 : case XML_TOK_PA_COORDINATE_REGION_EXT:
448 : case XML_TOK_PA_COORDINATE_REGION:
449 : {
450 0 : pContext = new SchXMLCoordinateRegionContext( GetImport(), nPrefix, rLocalName, m_aInnerPositioning );
451 : }
452 0 : break;
453 :
454 : case XML_TOK_PA_AXIS:
455 : {
456 0 : bool bAddMissingXAxisForNetCharts = false;
457 0 : bool bAdaptWrongPercentScaleValues = false;
458 0 : 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 0 : bool bAdaptXAxisOrientationForOld2DBarCharts = false;
473 0 : 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 0 : pContext = new SchXMLAxisContext( mrImportHelper, GetImport(), rLocalName, mxDiagram, maAxes, mrCategoriesAddress,
481 0 : bAddMissingXAxisForNetCharts, bAdaptWrongPercentScaleValues, bAdaptXAxisOrientationForOld2DBarCharts, m_bAxisPositionAttributeImported );
482 : }
483 0 : break;
484 :
485 : case XML_TOK_PA_SERIES:
486 : {
487 0 : if( mxNewDoc.is())
488 : {
489 : pContext = new SchXMLSeries2Context(
490 0 : mrImportHelper, GetImport(), rLocalName,
491 : mxNewDoc, maAxes,
492 : mrSeriesDefaultsAndStyles.maSeriesStyleList,
493 : mrSeriesDefaultsAndStyles.maRegressionStyleList,
494 : mnSeries,
495 : mbStockHasVolume,
496 : m_aGlobalSeriesImportInfo,
497 : maChartTypeServiceName,
498 : mrLSequencesPerIndex,
499 0 : mbGlobalChartTypeUsedBySeries, maChartSize );
500 : }
501 0 : mnSeries++;
502 : }
503 0 : break;
504 :
505 : case XML_TOK_PA_WALL:
506 0 : pContext = new SchXMLWallFloorContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
507 0 : SchXMLWallFloorContext::CONTEXT_TYPE_WALL );
508 0 : break;
509 : case XML_TOK_PA_FLOOR:
510 0 : pContext = new SchXMLWallFloorContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
511 0 : SchXMLWallFloorContext::CONTEXT_TYPE_FLOOR );
512 0 : break;
513 :
514 : case XML_TOK_PA_LIGHT_SOURCE:
515 0 : pContext = maSceneImportHelper.create3DLightContext( nPrefix, rLocalName, xAttrList );
516 0 : break;
517 :
518 : // elements for stock charts
519 : case XML_TOK_PA_STOCK_GAIN:
520 0 : pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
521 0 : SchXMLStockContext::CONTEXT_TYPE_GAIN );
522 0 : break;
523 : case XML_TOK_PA_STOCK_LOSS:
524 0 : pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
525 0 : SchXMLStockContext::CONTEXT_TYPE_LOSS );
526 0 : break;
527 : case XML_TOK_PA_STOCK_RANGE:
528 0 : pContext = new SchXMLStockContext( mrImportHelper, GetImport(), nPrefix, rLocalName, mxDiagram,
529 0 : SchXMLStockContext::CONTEXT_TYPE_RANGE );
530 0 : break;
531 :
532 : default:
533 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
534 : }
535 :
536 0 : return pContext;
537 : }
538 :
539 0 : void SchXMLPlotAreaContext::EndElement()
540 : {
541 : // set categories
542 0 : if( !mrCategoriesAddress.isEmpty() && mxNewDoc.is())
543 : {
544 : uno::Reference< chart2::data::XDataProvider > xDataProvider(
545 0 : mxNewDoc->getDataProvider() );
546 : // @todo: correct coordinate system index
547 0 : sal_Int32 nDimension( 0 );
548 : ::std::vector< SchXMLAxis >::const_iterator aIt(
549 0 : ::std::find_if( maAxes.begin(), maAxes.end(), lcl_AxisHasCategories()));
550 0 : if( aIt != maAxes.end())
551 0 : nDimension = static_cast< sal_Int32 >( (*aIt).eDimension );
552 : SchXMLTools::CreateCategories(
553 : xDataProvider, mxNewDoc, mrCategoriesAddress,
554 : 0 /* nCooSysIndex */,
555 0 : nDimension, &mrLSequencesPerIndex );
556 : }
557 :
558 0 : uno::Reference< beans::XPropertySet > xDiaProp( mxDiagram, uno::UNO_QUERY );
559 0 : if( xDiaProp.is())
560 : {
561 0 : sal_Bool bIsThreeDim = sal_False;
562 0 : uno::Any aAny = xDiaProp->getPropertyValue("Dim3D");
563 0 : aAny >>= bIsThreeDim;
564 :
565 : // set 3d scene attributes
566 0 : if( bIsThreeDim )
567 : {
568 : // set scene attributes at diagram
569 0 : maSceneImportHelper.setSceneAttributes( xDiaProp );
570 : }
571 :
572 : // set correct number of lines at series
573 0 : 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 0 : 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 0 : }
602 : }
603 :
604 : // set changed size and position after properties (esp. 3d)
605 :
606 0 : uno::Reference< chart::XDiagramPositioning > xDiaPos( mxDiagram, uno::UNO_QUERY );
607 0 : if( xDiaPos.is())
608 : {
609 0 : if( !m_aOuterPositioning.isAutomatic() )
610 : {
611 0 : if( m_aInnerPositioning.hasPosSize() )
612 0 : xDiaPos->setDiagramPositionExcludingAxes( m_aInnerPositioning.getRectangle() );
613 0 : else if( m_aOuterPositioning.hasPosSize() )
614 : {
615 0 : 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 0 : xDiaPos->setDiagramPositionIncludingAxes( m_aOuterPositioning.getRectangle() );
619 : }
620 : }
621 : }
622 :
623 0 : SchXMLAxisContext::CorrectAxisPositions( uno::Reference< chart2::XChartDocument >( mrImportHelper.GetChartDocument(), uno::UNO_QUERY ), maChartTypeServiceName, GetImport().GetODFVersion(), m_bAxisPositionAttributeImported );
624 0 : }
625 :
626 0 : 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 0 : mbSymbolSizeForSeriesIsMissingInFile( bSymbolSizeForSeriesIsMissingInFile )
637 : {
638 0 : }
639 :
640 0 : SchXMLDataPointContext::~SchXMLDataPointContext()
641 : {
642 0 : }
643 :
644 0 : void SchXMLDataPointContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
645 : {
646 0 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
647 0 : OUString sAutoStyleName;
648 0 : sal_Int32 nRepeat = 1;
649 :
650 0 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
651 : {
652 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
653 0 : OUString aLocalName;
654 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
655 :
656 0 : if( nPrefix == XML_NAMESPACE_CHART )
657 : {
658 0 : if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
659 0 : sAutoStyleName = xAttrList->getValueByIndex( i );
660 0 : else if( IsXMLToken( aLocalName, XML_REPEATED ) )
661 0 : nRepeat = xAttrList->getValueByIndex( i ).toInt32();
662 : }
663 0 : }
664 :
665 0 : if( !sAutoStyleName.isEmpty())
666 : {
667 : DataRowPointStyle aStyle(
668 : DataRowPointStyle::DATA_POINT,
669 0 : m_xSeries, mrIndex, nRepeat, sAutoStyleName );
670 0 : aStyle.mbSymbolSizeForSeriesIsMissingInFile = mbSymbolSizeForSeriesIsMissingInFile;
671 0 : mrStyleList.push_back( aStyle );
672 : }
673 0 : mrIndex += nRepeat;
674 0 : }
675 :
676 0 : 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 0 : , m_bAutoPosition( false )
686 : {
687 0 : }
688 :
689 0 : SchXMLPositonAttributesHelper::~SchXMLPositonAttributesHelper()
690 : {
691 0 : }
692 :
693 0 : bool SchXMLPositonAttributesHelper::hasSize() const
694 : {
695 0 : return m_bHasSizeWidth && m_bHasSizeHeight;
696 : }
697 0 : bool SchXMLPositonAttributesHelper::hasPosition() const
698 : {
699 0 : return m_bHasPositionX && m_bHasPositionY;
700 : }
701 0 : bool SchXMLPositonAttributesHelper::hasPosSize() const
702 : {
703 0 : return hasPosition() && hasSize();
704 : }
705 0 : bool SchXMLPositonAttributesHelper::isAutomatic() const
706 : {
707 0 : return m_bAutoSize || m_bAutoPosition;
708 : }
709 0 : awt::Rectangle SchXMLPositonAttributesHelper::getRectangle() const
710 : {
711 0 : return awt::Rectangle( m_aPosition.X, m_aPosition.Y, m_aSize.Width, m_aSize.Height );
712 : }
713 :
714 0 : bool SchXMLPositonAttributesHelper::readPositioningAttribute( sal_uInt16 nPrefix, const OUString& rLocalName, const OUString& rValue )
715 : {
716 : //returns true if the attribute was proccessed
717 0 : bool bReturn = true;
718 :
719 0 : if( XML_NAMESPACE_SVG == nPrefix )
720 : {
721 0 : if( IsXMLToken( rLocalName, XML_X ) )
722 : {
723 0 : m_rImport.GetMM100UnitConverter().convertMeasureToCore(
724 0 : m_aPosition.X, rValue );
725 0 : m_bHasPositionX = true;
726 : }
727 0 : else if( IsXMLToken( rLocalName, XML_Y ) )
728 : {
729 0 : m_rImport.GetMM100UnitConverter().convertMeasureToCore(
730 0 : m_aPosition.Y, rValue );
731 0 : m_bHasPositionY = true;
732 : }
733 0 : else if( IsXMLToken( rLocalName, XML_WIDTH ) )
734 : {
735 0 : m_rImport.GetMM100UnitConverter().convertMeasureToCore(
736 0 : m_aSize.Width, rValue );
737 0 : m_bHasSizeWidth = true;
738 : }
739 0 : else if( IsXMLToken( rLocalName, XML_HEIGHT ) )
740 : {
741 0 : m_rImport.GetMM100UnitConverter().convertMeasureToCore(
742 0 : m_aSize.Height, rValue );
743 0 : m_bHasSizeHeight = true;
744 : }
745 : else
746 0 : bReturn = false;
747 : }
748 : else
749 0 : bReturn = false;
750 :
751 0 : return bReturn;
752 : }
753 :
754 0 : void SchXMLPositonAttributesHelper::readAutomaticPositioningProperties( XMLPropStyleContext* pPropStyleContext, const SvXMLStylesContext* pStylesCtxt )
755 : {
756 0 : if( pPropStyleContext && pStylesCtxt )
757 : {
758 : //handle automatic position and size
759 : SchXMLTools::getPropertyFromContext(
760 0 : OUString("AutomaticSize"), pPropStyleContext, pStylesCtxt ) >>= m_bAutoSize;
761 : SchXMLTools::getPropertyFromContext(
762 0 : OUString("AutomaticPosition"), pPropStyleContext, pStylesCtxt ) >>= m_bAutoPosition;
763 : }
764 0 : }
765 :
766 0 : SchXMLCoordinateRegionContext::SchXMLCoordinateRegionContext(
767 : SvXMLImport& rImport
768 : , sal_uInt16 nPrefix
769 : , const OUString& rLocalName
770 : , SchXMLPositonAttributesHelper& rPositioning )
771 : : SvXMLImportContext( rImport, nPrefix, rLocalName )
772 0 : , m_rPositioning( rPositioning )
773 : {
774 0 : }
775 :
776 0 : SchXMLCoordinateRegionContext::~SchXMLCoordinateRegionContext()
777 : {
778 0 : }
779 :
780 0 : void SchXMLCoordinateRegionContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
781 : {
782 : // parse attributes
783 0 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
784 :
785 0 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
786 : {
787 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
788 0 : OUString aLocalName;
789 0 : OUString aValue = xAttrList->getValueByIndex( i );
790 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
791 0 : m_rPositioning.readPositioningAttribute( nPrefix, aLocalName, aValue );
792 0 : }
793 0 : }
794 :
795 0 : SchXMLWallFloorContext::SchXMLWallFloorContext(
796 : SchXMLImportHelper& rImpHelper,
797 : SvXMLImport& rImport,
798 : sal_uInt16 nPrefix,
799 : const OUString& rLocalName,
800 : uno::Reference< chart::XDiagram >& xDiagram,
801 : ContextType eContextType ) :
802 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
803 : mrImportHelper( rImpHelper ),
804 : mxWallFloorSupplier( xDiagram, uno::UNO_QUERY ),
805 0 : meContextType( eContextType )
806 : {
807 0 : }
808 :
809 0 : SchXMLWallFloorContext::~SchXMLWallFloorContext()
810 : {
811 0 : }
812 :
813 0 : void SchXMLWallFloorContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
814 : {
815 0 : if( mxWallFloorSupplier.is())
816 : {
817 0 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
818 0 : OUString sAutoStyleName;
819 :
820 0 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
821 : {
822 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
823 0 : OUString aLocalName;
824 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
825 :
826 0 : if( nPrefix == XML_NAMESPACE_CHART &&
827 0 : IsXMLToken( aLocalName, XML_STYLE_NAME ) )
828 : {
829 0 : sAutoStyleName = xAttrList->getValueByIndex( i );
830 : }
831 0 : }
832 :
833 : // set properties
834 0 : uno::Reference< beans::XPropertySet > xProp( ( meContextType == CONTEXT_TYPE_WALL )
835 0 : ? mxWallFloorSupplier->getWall()
836 0 : : mxWallFloorSupplier->getFloor(),
837 0 : uno::UNO_QUERY );
838 0 : if( xProp.is())
839 : {
840 0 : if( !sAutoStyleName.isEmpty())
841 : {
842 0 : const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
843 0 : if( pStylesCtxt )
844 : {
845 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
846 0 : mrImportHelper.GetChartFamilyID(), sAutoStyleName );
847 :
848 0 : if( pStyle && pStyle->ISA( XMLPropStyleContext ))
849 0 : (( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
850 : }
851 : }
852 0 : }
853 : }
854 0 : }
855 :
856 0 : SchXMLStockContext::SchXMLStockContext(
857 : SchXMLImportHelper& rImpHelper,
858 : SvXMLImport& rImport,
859 : sal_uInt16 nPrefix,
860 : const OUString& rLocalName,
861 : uno::Reference< chart::XDiagram >& xDiagram,
862 : ContextType eContextType ) :
863 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
864 : mrImportHelper( rImpHelper ),
865 : mxStockPropProvider( xDiagram, uno::UNO_QUERY ),
866 0 : meContextType( eContextType )
867 : {
868 0 : }
869 :
870 0 : SchXMLStockContext::~SchXMLStockContext()
871 : {
872 0 : }
873 :
874 0 : void SchXMLStockContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
875 : {
876 0 : if( mxStockPropProvider.is())
877 : {
878 0 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
879 0 : OUString sAutoStyleName;
880 :
881 0 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
882 : {
883 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
884 0 : OUString aLocalName;
885 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
886 :
887 0 : if( nPrefix == XML_NAMESPACE_CHART &&
888 0 : IsXMLToken( aLocalName, XML_STYLE_NAME ) )
889 : {
890 0 : sAutoStyleName = xAttrList->getValueByIndex( i );
891 : }
892 0 : }
893 :
894 0 : if( !sAutoStyleName.isEmpty())
895 : {
896 : // set properties
897 0 : uno::Reference< beans::XPropertySet > xProp;
898 0 : switch( meContextType )
899 : {
900 : case CONTEXT_TYPE_GAIN:
901 0 : xProp = mxStockPropProvider->getUpBar();
902 0 : break;
903 : case CONTEXT_TYPE_LOSS:
904 0 : xProp = mxStockPropProvider->getDownBar();
905 0 : break;
906 : case CONTEXT_TYPE_RANGE:
907 0 : xProp = mxStockPropProvider->getMinMaxLine();
908 0 : break;
909 : }
910 0 : if( xProp.is())
911 : {
912 0 : const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
913 0 : if( pStylesCtxt )
914 : {
915 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
916 0 : mrImportHelper.GetChartFamilyID(), sAutoStyleName );
917 :
918 0 : if( pStyle && pStyle->ISA( XMLPropStyleContext ))
919 0 : (( XMLPropStyleContext* )pStyle )->FillPropertySet( xProp );
920 : }
921 0 : }
922 0 : }
923 : }
924 0 : }
925 :
926 0 : static void lcl_setErrorBarSequence ( const uno::Reference< chart2::XChartDocument > &xDoc,
927 : const uno::Reference< beans::XPropertySet > &xBarProp,
928 : const OUString &aXMLRange,
929 : bool bPositiveValue, bool bYError,
930 : tSchXMLLSequencesPerIndex& rSequences)
931 : {
932 0 : uno::Reference< com::sun::star::chart2::data::XDataProvider > xDataProvider(xDoc->getDataProvider());
933 0 : uno::Reference< com::sun::star::chart2::data::XDataSource > xDataSource( xBarProp, uno::UNO_QUERY );
934 0 : uno::Reference< com::sun::star::chart2::data::XDataSink > xDataSink( xDataSource, uno::UNO_QUERY );
935 :
936 : assert( xDataSink.is() && xDataSource.is() && xDataProvider.is() );
937 :
938 0 : OUString aRange(lcl_ConvertRange(aXMLRange,xDoc));
939 :
940 : uno::Reference< chart2::data::XDataSequence > xNewSequence(
941 0 : xDataProvider->createDataSequenceByRangeRepresentation( aRange ));
942 :
943 0 : if( xNewSequence.is())
944 : {
945 0 : SchXMLTools::setXMLRangePropertyAtDataSequence(xNewSequence,aXMLRange);
946 :
947 0 : OUStringBuffer aRoleBuffer("error-bars-");
948 0 : if( bYError )
949 0 : aRoleBuffer.append( 'y' );
950 : else
951 0 : aRoleBuffer.append( 'x');
952 :
953 0 : aRoleBuffer.append( '-' );
954 :
955 0 : if( bPositiveValue )
956 0 : aRoleBuffer = aRoleBuffer.appendAscii( "positive" );
957 : else
958 0 : aRoleBuffer = aRoleBuffer.appendAscii( "negative" );
959 :
960 0 : OUString aRole = aRoleBuffer.makeStringAndClear();
961 :
962 0 : Reference< beans::XPropertySet > xSeqProp( xNewSequence, uno::UNO_QUERY );
963 :
964 0 : xSeqProp->setPropertyValue("Role", uno::makeAny( aRole ));
965 :
966 0 : Reference< uno::XComponentContext > xContext = comphelper::getProcessComponentContext();
967 :
968 : Reference< chart2::data::XLabeledDataSequence > xLabelSeq( chart2::data::LabeledDataSequence::create(xContext),
969 0 : uno::UNO_QUERY_THROW );
970 :
971 : rSequences.insert( tSchXMLLSequencesPerIndex::value_type(
972 0 : tSchXMLIndexWithPart( -2, SCH_XML_PART_ERROR_BARS ), xLabelSeq ) );
973 :
974 0 : xLabelSeq->setValues( xNewSequence );
975 :
976 : uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > aSequences(
977 0 : xDataSource->getDataSequences());
978 :
979 0 : aSequences.realloc( aSequences.getLength() + 1 );
980 0 : aSequences[ aSequences.getLength() - 1 ] = xLabelSeq;
981 0 : xDataSink->setData( aSequences );
982 0 : }
983 0 : }
984 :
985 0 : SchXMLStatisticsObjectContext::SchXMLStatisticsObjectContext(
986 : SchXMLImportHelper& rImpHelper,
987 : SvXMLImport& rImport,
988 : sal_uInt16 nPrefix,
989 : const OUString& rLocalName,
990 : const OUString &rSeriesStyleName,
991 : ::std::list< DataRowPointStyle >& rStyleList,
992 : const ::com::sun::star::uno::Reference<
993 : ::com::sun::star::chart2::XDataSeries >& xSeries,
994 : ContextType eContextType,
995 : const awt::Size & rChartSize,
996 : tSchXMLLSequencesPerIndex & rLSequencesPerIndex) :
997 :
998 : SvXMLImportContext( rImport, nPrefix, rLocalName ),
999 : mrImportHelper( rImpHelper ),
1000 : mrStyleList( rStyleList ),
1001 : m_xSeries( xSeries ),
1002 : meContextType( eContextType ),
1003 : maChartSize( rChartSize ),
1004 : maSeriesStyleName( rSeriesStyleName),
1005 0 : mrLSequencesPerIndex(rLSequencesPerIndex)
1006 0 : {}
1007 :
1008 0 : SchXMLStatisticsObjectContext::~SchXMLStatisticsObjectContext()
1009 : {
1010 0 : }
1011 :
1012 : namespace {
1013 :
1014 0 : void SetErrorBarPropertiesFromStyleName( const OUString& aStyleName, uno::Reference< beans::XPropertySet> xBarProp,
1015 : SchXMLImportHelper& rImportHelper, OUString& aPosRange, OUString& aNegRange)
1016 : {
1017 0 : const SvXMLStylesContext* pStylesCtxt = rImportHelper.GetAutoStylesContext();
1018 0 : const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(rImportHelper.GetChartFamilyID(),
1019 0 : aStyleName);
1020 :
1021 : XMLPropStyleContext * pSeriesStyleContext =
1022 0 : const_cast< XMLPropStyleContext * >( dynamic_cast< const XMLPropStyleContext * >( pStyle ));
1023 :
1024 : uno::Any aAny = SchXMLTools::getPropertyFromContext("ErrorBarStyle",
1025 0 : pSeriesStyleContext,pStylesCtxt);
1026 :
1027 0 : if ( aAny.hasValue() )
1028 : {
1029 0 : sal_Int32 aBarStyle = com::sun::star::chart::ErrorBarStyle::NONE;
1030 0 : aAny >>= aBarStyle;
1031 0 : xBarProp->setPropertyValue("ErrorBarStyle", aAny);
1032 :
1033 0 : aAny = SchXMLTools::getPropertyFromContext("ShowPositiveError",
1034 0 : pSeriesStyleContext,pStylesCtxt);
1035 :
1036 0 : if(aAny.hasValue())
1037 0 : xBarProp->setPropertyValue("ShowPositiveError",aAny);
1038 :
1039 0 : aAny = SchXMLTools::getPropertyFromContext("ShowNegativeError",
1040 0 : pSeriesStyleContext,pStylesCtxt);
1041 :
1042 0 : if(aAny.hasValue())
1043 0 : xBarProp->setPropertyValue("ShowNegativeError",aAny);
1044 :
1045 0 : aAny = SchXMLTools::getPropertyFromContext("PositiveError",
1046 0 : pSeriesStyleContext, pStylesCtxt);
1047 :
1048 0 : if(aAny.hasValue())
1049 0 : xBarProp->setPropertyValue("PositiveError", aAny);
1050 : else
1051 : {
1052 0 : aAny = SchXMLTools::getPropertyFromContext("ConstantErrorHigh",
1053 0 : pSeriesStyleContext, pStylesCtxt);
1054 :
1055 0 : if(aAny.hasValue())
1056 0 : xBarProp->setPropertyValue("PositiveError", aAny);
1057 : }
1058 :
1059 0 : aAny = SchXMLTools::getPropertyFromContext("NegativeError",
1060 0 : pSeriesStyleContext, pStylesCtxt);
1061 :
1062 0 : if(aAny.hasValue())
1063 0 : xBarProp->setPropertyValue("NegativeError", aAny);
1064 : else
1065 : {
1066 0 : aAny = SchXMLTools::getPropertyFromContext("ConstantErrorLow",
1067 0 : pSeriesStyleContext, pStylesCtxt);
1068 :
1069 0 : if(aAny.hasValue())
1070 0 : xBarProp->setPropertyValue("NegativeError", aAny);
1071 : }
1072 :
1073 0 : aAny = SchXMLTools::getPropertyFromContext("ErrorBarRangePositive",
1074 0 : pSeriesStyleContext, pStylesCtxt);
1075 0 : if( aAny.hasValue() )
1076 : {
1077 0 : aAny >>= aPosRange;
1078 : }
1079 :
1080 0 : aAny = SchXMLTools::getPropertyFromContext("ErrorBarRangeNegative",
1081 0 : pSeriesStyleContext, pStylesCtxt);
1082 0 : if( aAny.hasValue() )
1083 : {
1084 0 : aAny >>= aNegRange;
1085 : }
1086 :
1087 0 : aAny = SchXMLTools::getPropertyFromContext("Weight",
1088 0 : pSeriesStyleContext, pStylesCtxt);
1089 0 : if( aAny.hasValue() )
1090 : {
1091 0 : xBarProp->setPropertyValue("Weight", aAny);
1092 : }
1093 :
1094 0 : aAny = SchXMLTools::getPropertyFromContext("PercentageError",
1095 0 : pSeriesStyleContext, pStylesCtxt);
1096 0 : if( aAny.hasValue() && aBarStyle == com::sun::star::chart::ErrorBarStyle::RELATIVE )
1097 : {
1098 0 : xBarProp->setPropertyValue("PositiveError", aAny);
1099 0 : xBarProp->setPropertyValue("NegativeError", aAny);
1100 : }
1101 :
1102 0 : switch(aBarStyle)
1103 : {
1104 : case com::sun::star::chart::ErrorBarStyle::ERROR_MARGIN:
1105 : {
1106 0 : aAny = SchXMLTools::getPropertyFromContext("NegativeError",
1107 0 : pSeriesStyleContext,pStylesCtxt);
1108 :
1109 0 : xBarProp->setPropertyValue("NegativeError",aAny);
1110 :
1111 0 : aAny = SchXMLTools::getPropertyFromContext("PositiveError",
1112 0 : pSeriesStyleContext,pStylesCtxt);
1113 :
1114 0 : xBarProp->setPropertyValue("PositiveError",aAny);
1115 : }
1116 0 : break;
1117 : default:
1118 0 : break;
1119 : }
1120 0 : }
1121 0 : }
1122 :
1123 : }
1124 :
1125 0 : void SchXMLStatisticsObjectContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1126 : {
1127 0 : sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
1128 0 : OUString sAutoStyleName;
1129 0 : OUString aPosRange;
1130 0 : OUString aNegRange;
1131 0 : bool bYError = true; /// Default errorbar, to be backward compatible with older files!
1132 :
1133 0 : for( sal_Int16 i = 0; i < nAttrCount; i++ )
1134 : {
1135 0 : OUString sAttrName = xAttrList->getNameByIndex( i );
1136 0 : OUString aLocalName;
1137 :
1138 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
1139 :
1140 0 : if( nPrefix == XML_NAMESPACE_CHART )
1141 : {
1142 0 : if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
1143 0 : sAutoStyleName = xAttrList->getValueByIndex( i );
1144 0 : else if( IsXMLToken( aLocalName, XML_DIMENSION ) )
1145 0 : bYError = xAttrList->getValueByIndex(i) == "y";
1146 0 : else if( IsXMLToken( aLocalName, XML_ERROR_UPPER_RANGE) )
1147 0 : aPosRange = xAttrList->getValueByIndex(i);
1148 0 : else if( IsXMLToken( aLocalName, XML_ERROR_LOWER_RANGE) )
1149 0 : aNegRange = xAttrList->getValueByIndex(i);
1150 : }
1151 0 : }
1152 :
1153 0 : if( !sAutoStyleName.isEmpty() )
1154 : {
1155 0 : DataRowPointStyle aStyle( DataRowPointStyle::MEAN_VALUE, m_xSeries, -1, 1, sAutoStyleName );
1156 :
1157 0 : switch( meContextType )
1158 : {
1159 : case CONTEXT_TYPE_MEAN_VALUE_LINE:
1160 0 : aStyle.meType = DataRowPointStyle::MEAN_VALUE;
1161 0 : break;
1162 : case CONTEXT_TYPE_ERROR_INDICATOR:
1163 : {
1164 0 : aStyle.meType = DataRowPointStyle::ERROR_INDICATOR;
1165 :
1166 : uno::Reference< lang::XMultiServiceFactory > xFact( comphelper::getProcessServiceFactory(),
1167 0 : uno::UNO_QUERY );
1168 :
1169 0 : uno::Reference< beans::XPropertySet > xBarProp( xFact->createInstance("com.sun.star.chart2.ErrorBar" ),
1170 0 : uno::UNO_QUERY );
1171 :
1172 0 : xBarProp->setPropertyValue("ErrorBarStyle",uno::makeAny(com::sun::star::chart::ErrorBarStyle::NONE));
1173 0 : xBarProp->setPropertyValue("PositiveError",uno::makeAny(static_cast<double>(0.0)));
1174 0 : xBarProp->setPropertyValue("NegativeError",uno::makeAny(static_cast<double>(0.0)));
1175 0 : xBarProp->setPropertyValue("Weight",uno::makeAny(static_cast<double>(1.0)));
1176 0 : xBarProp->setPropertyValue("ShowPositiveError",uno::makeAny(sal_True));
1177 0 : xBarProp->setPropertyValue("ShowNegativeError",uno::makeAny(sal_True));
1178 :
1179 : // first import defaults from parent style
1180 0 : SetErrorBarPropertiesFromStyleName( maSeriesStyleName, xBarProp, mrImportHelper, aPosRange, aNegRange );
1181 0 : SetErrorBarPropertiesFromStyleName( sAutoStyleName, xBarProp, mrImportHelper, aPosRange, aNegRange );
1182 :
1183 0 : uno::Reference< chart2::XChartDocument > xDoc(GetImport().GetModel(),uno::UNO_QUERY);
1184 :
1185 0 : if (!aPosRange.isEmpty())
1186 0 : lcl_setErrorBarSequence(xDoc,xBarProp,aPosRange,true,bYError, mrLSequencesPerIndex);
1187 :
1188 0 : if (!aNegRange.isEmpty())
1189 0 : lcl_setErrorBarSequence(xDoc,xBarProp,aNegRange,false,bYError, mrLSequencesPerIndex);
1190 :
1191 0 : if ( !bYError )
1192 : {
1193 0 : aStyle.m_xErrorXProperties.set( xBarProp );
1194 : }
1195 : else
1196 : {
1197 0 : aStyle.m_xErrorYProperties.set( xBarProp );
1198 0 : }
1199 : }
1200 0 : break;
1201 : }
1202 :
1203 0 : mrStyleList.push_back( aStyle );
1204 0 : }
1205 0 : }
1206 :
1207 0 : SvXMLImportContext* SchXMLStatisticsObjectContext::CreateChildContext(
1208 : sal_uInt16 nPrefix,
1209 : const OUString& rLocalName,
1210 : const uno::Reference< xml::sax::XAttributeList >& xAttrList )
1211 : {
1212 0 : SvXMLImportContext* pContext = 0;
1213 0 : pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
1214 0 : return pContext;
1215 : }
1216 :
1217 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|