LCOV - code coverage report
Current view: top level - xmloff/source/chart - SchXMLPlotAreaContext.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 491 568 86.4 %
Date: 2015-06-13 12:38:46 Functions: 42 44 95.5 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11