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

Generated by: LCOV version 1.10