LCOV - code coverage report
Current view: top level - xmloff/source/chart - SchXMLPlotAreaContext.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 561 0.0 %
Date: 2014-04-14 Functions: 0 44 0.0 %
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             : #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: */

Generated by: LCOV version 1.10