LCOV - code coverage report
Current view: top level - libreoffice/xmloff/source/chart - SchXMLAxisContext.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 446 0.0 %
Date: 2012-12-27 Functions: 0 34 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             : 
      21             : #include <sax/tools/converter.hxx>
      22             : 
      23             : #include "SchXMLAxisContext.hxx"
      24             : #include "SchXMLChartContext.hxx"
      25             : #include "SchXMLTools.hxx"
      26             : #include <xmloff/xmlnmspe.hxx>
      27             : #include <xmloff/xmlement.hxx>
      28             : #include <xmloff/xmlstyle.hxx>
      29             : #include <xmloff/prstylei.hxx>
      30             : #include <xmloff/nmspmap.hxx>
      31             : #include <xmloff/xmluconv.hxx>
      32             : 
      33             : #include <tools/color.hxx>
      34             : 
      35             : #include <com/sun/star/chart/ChartAxisLabelPosition.hpp>
      36             : #include <com/sun/star/chart/ChartAxisMarkPosition.hpp>
      37             : #include <com/sun/star/chart/ChartAxisPosition.hpp>
      38             : #include <com/sun/star/chart/ChartAxisType.hpp>
      39             : #include <com/sun/star/chart/TimeIncrement.hpp>
      40             : #include <com/sun/star/chart/TimeInterval.hpp>
      41             : #include <com/sun/star/chart/TimeUnit.hpp>
      42             : #include <com/sun/star/chart/XAxis.hpp>
      43             : #include <com/sun/star/chart/XAxisSupplier.hpp>
      44             : #include <com/sun/star/chart2/AxisType.hpp>
      45             : #include <com/sun/star/chart2/XChartDocument.hpp>
      46             : #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
      47             : 
      48             : #include <com/sun/star/drawing/LineStyle.hpp>
      49             : 
      50             : using namespace ::xmloff::token;
      51             : using namespace com::sun::star;
      52             : 
      53             : using com::sun::star::uno::Reference;
      54             : 
      55             : //----------------------------------------
      56             : //----------------------------------------
      57             : 
      58             : static SvXMLEnumMapEntry aXMLAxisDimensionMap[] =
      59             : {
      60             :     { XML_X,  SCH_XML_AXIS_X  },
      61             :     { XML_Y,  SCH_XML_AXIS_Y  },
      62             :     { XML_Z,  SCH_XML_AXIS_Z  },
      63             :     { XML_TOKEN_INVALID, 0 }
      64             : };
      65             : 
      66             : static SvXMLEnumMapEntry aXMLAxisTypeMap[] =
      67             : {
      68             :     { XML_AUTO,  ::com::sun::star::chart::ChartAxisType::AUTOMATIC },
      69             :     { XML_TEXT,  ::com::sun::star::chart::ChartAxisType::CATEGORY },
      70             :     { XML_DATE,  ::com::sun::star::chart::ChartAxisType::DATE },
      71             :     { XML_TOKEN_INVALID, 0 }
      72             : };
      73             : 
      74             : //----------------------------------------
      75             : //----------------------------------------
      76             : 
      77             : class SchXMLCategoriesContext : public SvXMLImportContext
      78             : {
      79             : private:
      80             :     OUString& mrAddress;
      81             : 
      82             : public:
      83             :     SchXMLCategoriesContext( SvXMLImport& rImport,
      84             :                                    sal_uInt16 nPrefix,
      85             :                                    const OUString& rLocalName,
      86             :                                    OUString& rAddress );
      87             :     virtual ~SchXMLCategoriesContext();
      88             :     virtual void StartElement( const Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
      89             : };
      90             : 
      91             : //----------------------------------------
      92             : //----------------------------------------
      93             : 
      94             : 
      95             : class DateScaleContext : public SvXMLImportContext
      96             : {
      97             : public:
      98             :     DateScaleContext( SvXMLImport& rImport,
      99             :                         sal_uInt16 nPrefix, const OUString& rLocalName,
     100             :                         const Reference< beans::XPropertySet > xAxisProps );
     101             : 
     102             :     virtual ~DateScaleContext();
     103             :     virtual void StartElement( const Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
     104             : 
     105             : private:
     106             :     Reference< beans::XPropertySet > m_xAxisProps;
     107             : };
     108             : 
     109             : 
     110             : //----------------------------------------
     111             : //----------------------------------------
     112             : 
     113           0 : SchXMLAxisContext::SchXMLAxisContext( SchXMLImportHelper& rImpHelper,
     114             :                                       SvXMLImport& rImport, const OUString& rLocalName,
     115             :                                       Reference< chart::XDiagram > xDiagram,
     116             :                                       std::vector< SchXMLAxis >& rAxes,
     117             :                                       OUString & rCategoriesAddress,
     118             :                                       bool bAddMissingXAxisForNetCharts,
     119             :                                       bool bAdaptWrongPercentScaleValues,
     120             :                                       bool bAdaptXAxisOrientationForOld2DBarCharts,
     121             :                                       bool& rbAxisPositionAttributeImported ) :
     122             :         SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
     123             :         m_rImportHelper( rImpHelper ),
     124             :         m_xDiagram( xDiagram ),
     125             :         m_rAxes( rAxes ),
     126             :         m_rCategoriesAddress( rCategoriesAddress ),
     127             :         m_nAxisType(chart::ChartAxisType::AUTOMATIC),
     128             :         m_bAxisTypeImported(false),
     129             :         m_bDateScaleImported(false),
     130             :         m_bAddMissingXAxisForNetCharts( bAddMissingXAxisForNetCharts ),
     131             :         m_bAdaptWrongPercentScaleValues( bAdaptWrongPercentScaleValues ),
     132             :         m_bAdaptXAxisOrientationForOld2DBarCharts( bAdaptXAxisOrientationForOld2DBarCharts ),
     133           0 :         m_rbAxisPositionAttributeImported( rbAxisPositionAttributeImported )
     134             : {
     135           0 : }
     136             : 
     137           0 : SchXMLAxisContext::~SchXMLAxisContext()
     138           0 : {}
     139             : 
     140           0 : static Reference< chart::XAxis > lcl_getChartAxis( SchXMLAxis aCurrentAxis, const Reference< chart::XDiagram > xDiagram )
     141             : {
     142           0 :     Reference< chart::XAxis > xAxis;
     143           0 :     Reference< chart::XAxisSupplier > xAxisSuppl( xDiagram, uno::UNO_QUERY );
     144           0 :     if( !xAxisSuppl.is() )
     145             :         return xAxis;
     146           0 :     if( aCurrentAxis.nAxisIndex == 0 )
     147           0 :         xAxis = xAxisSuppl->getAxis(aCurrentAxis.eDimension);
     148             :     else
     149           0 :         xAxis = xAxisSuppl->getSecondaryAxis(aCurrentAxis.eDimension);
     150           0 :     return xAxis;
     151             : }
     152             : 
     153             : /* returns a shape for the current axis's title. The property
     154             :    "Has...AxisTitle" is set to "True" to get the shape
     155             :  */
     156           0 : Reference< drawing::XShape > SchXMLAxisContext::getTitleShape()
     157             : {
     158           0 :     Reference< drawing::XShape > xResult;
     159           0 :     Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
     160           0 :     Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
     161           0 :     if( !xDiaProp.is() || !xAxis.is() )
     162             :         return xResult;
     163             : 
     164           0 :     OUString aPropName;
     165           0 :     switch( m_aCurrentAxis.eDimension )
     166             :     {
     167             :         case SCH_XML_AXIS_X:
     168           0 :             if( m_aCurrentAxis.nAxisIndex == 0 )
     169           0 :                 aPropName = "HasXAxisTitle";
     170             :             else
     171           0 :                 aPropName = "HasSecondaryXAxisTitle";
     172           0 :             break;
     173             :         case SCH_XML_AXIS_Y:
     174           0 :             if( m_aCurrentAxis.nAxisIndex == 0 )
     175           0 :                 aPropName = "HasYAxisTitle";
     176             :             else
     177           0 :                 aPropName = "HasSecondaryYAxisTitle";
     178           0 :             break;
     179             :         case SCH_XML_AXIS_Z:
     180           0 :             aPropName = "HasZAxisTitle";
     181           0 :             break;
     182             :         case SCH_XML_AXIS_UNDEF:
     183             :             OSL_TRACE( "Invalid axis" );
     184           0 :             break;
     185             :     }
     186           0 :     xDiaProp->setPropertyValue( aPropName, uno::makeAny(sal_True) );
     187           0 :     xResult = Reference< drawing::XShape >( xAxis->getAxisTitle(), uno::UNO_QUERY );
     188           0 :     return xResult;
     189             : }
     190             : 
     191           0 : void SchXMLAxisContext::CreateGrid( OUString sAutoStyleName, bool bIsMajor )
     192             : {
     193           0 :     Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
     194           0 :     Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
     195           0 :     if( !xDiaProp.is() || !xAxis.is() )
     196           0 :         return;
     197             : 
     198           0 :     OUString aPropName;
     199           0 :     switch( m_aCurrentAxis.eDimension )
     200             :     {
     201             :         case SCH_XML_AXIS_X:
     202           0 :             if( bIsMajor )
     203           0 :                 aPropName = "HasXAxisGrid";
     204             :             else
     205           0 :                 aPropName = "HasXAxisHelpGrid";
     206           0 :             break;
     207             :         case SCH_XML_AXIS_Y:
     208           0 :             if( bIsMajor )
     209           0 :                 aPropName = "HasYAxisGrid";
     210             :             else
     211           0 :                 aPropName = "HasYAxisHelpGrid";
     212           0 :             break;
     213             :         case SCH_XML_AXIS_Z:
     214           0 :             if( bIsMajor )
     215           0 :                 aPropName = "HasZAxisGrid";
     216             :             else
     217           0 :                 aPropName = "HasZAxisHelpGrid";
     218           0 :             break;
     219             :         case SCH_XML_AXIS_UNDEF:
     220             :             OSL_TRACE( "Invalid axis" );
     221           0 :             break;
     222             :     }
     223           0 :     xDiaProp->setPropertyValue( aPropName, uno::makeAny(sal_True) );
     224             : 
     225           0 :     Reference< beans::XPropertySet > xGridProp;
     226           0 :     if( bIsMajor )
     227           0 :         xGridProp = xAxis->getMajorGrid();
     228             :     else
     229           0 :         xGridProp = xAxis->getMinorGrid();
     230             : 
     231             :     // set properties
     232           0 :     if( xGridProp.is())
     233             :     {
     234             :         // the line color is black as default, in the model it is a light gray
     235           0 :         xGridProp->setPropertyValue( OUString( "LineColor" ),
     236           0 :                                      uno::makeAny( COL_BLACK ));
     237           0 :         if( !sAutoStyleName.isEmpty())
     238             :         {
     239           0 :             const SvXMLStylesContext* pStylesCtxt = m_rImportHelper.GetAutoStylesContext();
     240           0 :             if( pStylesCtxt )
     241             :             {
     242             :                 const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
     243           0 :                     m_rImportHelper.GetChartFamilyID(), sAutoStyleName );
     244             : 
     245           0 :                 if( pStyle && pStyle->ISA( XMLPropStyleContext ))
     246           0 :                     (( XMLPropStyleContext* )pStyle )->FillPropertySet( xGridProp );
     247             :             }
     248             :         }
     249           0 :     }
     250             : }
     251             : 
     252             : namespace
     253             : {
     254             : enum AxisAttributeTokens
     255             : {
     256             :     XML_TOK_AXIS_DIMENSION,
     257             :     XML_TOK_AXIS_NAME,
     258             :     XML_TOK_AXIS_STYLE_NAME,
     259             :     XML_TOK_AXIS_TYPE,
     260             :     XML_TOK_AXIS_TYPE_EXT
     261             : };
     262             : 
     263             : SvXMLTokenMapEntry aAxisAttributeTokenMap[] =
     264             : {
     265             :     { XML_NAMESPACE_CHART,      XML_DIMENSION,  XML_TOK_AXIS_DIMENSION      },
     266             :     { XML_NAMESPACE_CHART,      XML_NAME,       XML_TOK_AXIS_NAME           },
     267             :     { XML_NAMESPACE_CHART,      XML_STYLE_NAME, XML_TOK_AXIS_STYLE_NAME     },
     268             :     { XML_NAMESPACE_CHART,      XML_AXIS_TYPE,  XML_TOK_AXIS_TYPE           },
     269             :     { XML_NAMESPACE_CHART_EXT,  XML_AXIS_TYPE,  XML_TOK_AXIS_TYPE_EXT       },
     270             :     XML_TOKEN_MAP_END
     271             : };
     272             : 
     273             : class AxisAttributeTokenMap : public SvXMLTokenMap
     274             : {
     275             : public:
     276           0 :     AxisAttributeTokenMap(): SvXMLTokenMap( aAxisAttributeTokenMap ) {}
     277           0 :     virtual ~AxisAttributeTokenMap() {}
     278             : };
     279             : 
     280             : //a AxisAttributeTokenMap Singleton
     281             : struct theAxisAttributeTokenMap : public rtl::Static< AxisAttributeTokenMap, theAxisAttributeTokenMap > {};
     282             : }
     283             : 
     284           0 : void SchXMLAxisContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
     285             : {
     286             :     // parse attributes
     287           0 :     sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     288           0 :     SchXMLImport& rImport = ( SchXMLImport& )GetImport();
     289           0 :     const SvXMLTokenMap& rAttrTokenMap = theAxisAttributeTokenMap::get();
     290             : 
     291           0 :     for( sal_Int16 i = 0; i < nAttrCount; i++ )
     292             :     {
     293           0 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     294           0 :         OUString aLocalName;
     295           0 :         OUString aValue = xAttrList->getValueByIndex( i );
     296           0 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
     297             : 
     298           0 :         switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
     299             :         {
     300             :             case XML_TOK_AXIS_DIMENSION:
     301             :                 {
     302             :                     sal_uInt16 nEnumVal;
     303           0 :                     if( rImport.GetMM100UnitConverter().convertEnum( nEnumVal, aValue, aXMLAxisDimensionMap ))
     304           0 :                         m_aCurrentAxis.eDimension = ( SchXMLAxisDimension )nEnumVal;
     305             :                 }
     306             :                 break;
     307             :             case XML_TOK_AXIS_NAME:
     308           0 :                 m_aCurrentAxis.aName = aValue;
     309             :                 break;
     310             :             case XML_TOK_AXIS_TYPE:
     311             :             case XML_TOK_AXIS_TYPE_EXT:
     312             :                 sal_uInt16 nEnumVal;
     313           0 :                 if( rImport.GetMM100UnitConverter().convertEnum( nEnumVal, aValue, aXMLAxisTypeMap ))
     314             :                 {
     315           0 :                     m_nAxisType = nEnumVal;
     316           0 :                     m_bAxisTypeImported = true;
     317             :                 }
     318             :                 break;
     319             :             case XML_TOK_AXIS_STYLE_NAME:
     320           0 :                 m_aAutoStyleName = aValue;
     321             :                 break;
     322             :         }
     323           0 :     }
     324             : 
     325             :     // check for number of axes with same dimension
     326           0 :     m_aCurrentAxis.nAxisIndex = 0;
     327           0 :     sal_Int32 nNumOfAxes = m_rAxes.size();
     328           0 :     for( sal_Int32 nCurrent = 0; nCurrent < nNumOfAxes; nCurrent++ )
     329             :     {
     330           0 :         if( m_rAxes[ nCurrent ].eDimension == m_aCurrentAxis.eDimension )
     331           0 :             m_aCurrentAxis.nAxisIndex++;
     332             :     }
     333           0 :     CreateAxis();
     334           0 : }
     335             : namespace
     336             : {
     337             : 
     338           0 : Reference< chart2::XAxis > lcl_getAxis( const Reference< frame::XModel >& xChartModel,
     339             :                                             sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex )
     340             : {
     341           0 :     Reference< chart2::XAxis > xAxis;
     342             : 
     343             :     try
     344             :     {
     345           0 :         Reference< chart2::XChartDocument > xChart2Document( xChartModel, uno::UNO_QUERY );
     346           0 :         if( xChart2Document.is() )
     347             :         {
     348           0 :             Reference< chart2::XDiagram > xDiagram( xChart2Document->getFirstDiagram());
     349           0 :             Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW );
     350             :             uno::Sequence< Reference< chart2::XCoordinateSystem > >
     351           0 :                 aCooSysSeq( xCooSysCnt->getCoordinateSystems());
     352           0 :             sal_Int32 nCooSysIndex = 0;
     353           0 :             if( nCooSysIndex < aCooSysSeq.getLength() )
     354             :             {
     355           0 :                 Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[nCooSysIndex] );
     356           0 :                 if( xCooSys.is() && nDimensionIndex < xCooSys->getDimension() )
     357             :                 {
     358           0 :                     const sal_Int32 nMaxAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex);
     359           0 :                     if( nAxisIndex <= nMaxAxisIndex )
     360           0 :                         xAxis = xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex );
     361           0 :                 }
     362           0 :             }
     363           0 :         }
     364             :     }
     365           0 :     catch( uno::Exception & )
     366             :     {
     367             :         OSL_TRACE( "Couldn't get axis" );
     368             :     }
     369             : 
     370           0 :     return xAxis;
     371             : }
     372             : 
     373           0 : bool lcl_divideBy100( uno::Any& rDoubleAny )
     374             : {
     375           0 :     bool bChanged = false;
     376           0 :     double fValue=0.0;
     377           0 :     if( (rDoubleAny>>=fValue) && (fValue!=0.0) )
     378             :     {
     379           0 :         fValue/=100.0;
     380           0 :         rDoubleAny = uno::makeAny(fValue);
     381           0 :         bChanged = true;
     382             :     }
     383           0 :     return bChanged;
     384             : }
     385             : 
     386           0 : bool lcl_AdaptWrongPercentScaleValues(chart2::ScaleData& rScaleData)
     387             : {
     388           0 :     bool bChanged = lcl_divideBy100( rScaleData.Minimum );
     389           0 :     bChanged = lcl_divideBy100( rScaleData.Maximum ) || bChanged;
     390           0 :     bChanged = lcl_divideBy100( rScaleData.Origin ) || bChanged;
     391           0 :     bChanged = lcl_divideBy100( rScaleData.IncrementData.Distance ) || bChanged;
     392           0 :     return bChanged;
     393             : }
     394             : 
     395             : }//end anonymous namespace
     396             : 
     397           0 : void SchXMLAxisContext::CreateAxis()
     398             : {
     399           0 :     m_rAxes.push_back( m_aCurrentAxis );
     400             : 
     401           0 :     Reference< beans::XPropertySet > xDiaProp( m_rImportHelper.GetChartDocument()->getDiagram(), uno::UNO_QUERY );
     402           0 :     if( !xDiaProp.is() )
     403             :         return;
     404           0 :     OUString aPropName;
     405           0 :     switch( m_aCurrentAxis.eDimension )
     406             :     {
     407             :         case SCH_XML_AXIS_X:
     408           0 :             if( m_aCurrentAxis.nAxisIndex == 0 )
     409           0 :                 aPropName = "HasXAxis";
     410             :             else
     411           0 :                 aPropName = "HasSecondaryXAxis";
     412           0 :             break;
     413             :         case SCH_XML_AXIS_Y:
     414           0 :             if( m_aCurrentAxis.nAxisIndex == 0 )
     415           0 :                 aPropName = "HasYAxis";
     416             :             else
     417           0 :                 aPropName = "HasSecondaryYAxis";
     418           0 :             break;
     419             :         case SCH_XML_AXIS_Z:
     420           0 :             if( m_aCurrentAxis.nAxisIndex == 0 )
     421           0 :                 aPropName = "HasXAxis";
     422             :             else
     423           0 :                 aPropName = "HasSecondaryXAxis";
     424           0 :             break;
     425             :         case SCH_XML_AXIS_UNDEF:
     426             :             OSL_TRACE( "Invalid axis" );
     427           0 :             break;
     428             :     }
     429             :     try
     430             :     {
     431           0 :         xDiaProp->setPropertyValue( aPropName, uno::makeAny(sal_True) );
     432             :     }
     433           0 :     catch( beans::UnknownPropertyException & )
     434             :     {
     435             :         OSL_TRACE( "Couldn't turn on axis" );
     436             :     }
     437           0 :     if( m_aCurrentAxis.eDimension==SCH_XML_AXIS_Z )
     438             :     {
     439           0 :         bool bSettingZAxisSuccedded = false;
     440             :         try
     441             :         {
     442           0 :             xDiaProp->getPropertyValue( aPropName ) >>= bSettingZAxisSuccedded;
     443             :         }
     444           0 :         catch( beans::UnknownPropertyException & )
     445             :         {
     446             :             OSL_TRACE( "Couldn't turn on z axis" );
     447             :         }
     448           0 :         if( !bSettingZAxisSuccedded )
     449             :             return;
     450             :     }
     451             : 
     452             : 
     453           0 :     m_xAxisProps = Reference<beans::XPropertySet>( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ), uno::UNO_QUERY );
     454             : 
     455           0 :     if( m_bAddMissingXAxisForNetCharts && m_aCurrentAxis.eDimension==SCH_XML_AXIS_Y && m_aCurrentAxis.nAxisIndex==0 )
     456             :     {
     457             :         try
     458             :         {
     459           0 :             xDiaProp->setPropertyValue( OUString( "HasXAxis" ), uno::makeAny(sal_True) );
     460             :         }
     461           0 :         catch( beans::UnknownPropertyException & )
     462             :         {
     463             :             OSL_TRACE( "Couldn't turn on x axis" );
     464             :         }
     465             :     }
     466             : 
     467             :     // set properties
     468           0 :     if( m_xAxisProps.is())
     469             :     {
     470           0 :         uno::Any aTrueBool( uno::makeAny( sal_True ));
     471           0 :         uno::Any aFalseBool( uno::makeAny( sal_False ));
     472             : 
     473             :         // #i109879# the line color is black as default, in the model it is a light gray
     474           0 :         m_xAxisProps->setPropertyValue( OUString( "LineColor" ),
     475           0 :                                      uno::makeAny( COL_BLACK ));
     476             : 
     477           0 :         m_xAxisProps->setPropertyValue( OUString( "DisplayLabels" ), aFalseBool );
     478             : 
     479             :         // #88077# AutoOrigin 'on' is default
     480           0 :         m_xAxisProps->setPropertyValue( OUString( "AutoOrigin" ), aTrueBool );
     481             : 
     482           0 :         if( m_bAxisTypeImported )
     483           0 :             m_xAxisProps->setPropertyValue( OUString( "AxisType" ), uno::makeAny(m_nAxisType) );
     484             : 
     485           0 :         if( !m_aAutoStyleName.isEmpty())
     486             :         {
     487           0 :             const SvXMLStylesContext* pStylesCtxt = m_rImportHelper.GetAutoStylesContext();
     488           0 :             if( pStylesCtxt )
     489             :             {
     490             :                 const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
     491           0 :                     m_rImportHelper.GetChartFamilyID(), m_aAutoStyleName );
     492             : 
     493           0 :                 if( pStyle && pStyle->ISA( XMLPropStyleContext ))
     494             :                 {
     495             :                     // note: SvXMLStyleContext::FillPropertySet is not const
     496           0 :                     XMLPropStyleContext * pPropStyleContext = const_cast< XMLPropStyleContext * >( dynamic_cast< const XMLPropStyleContext * >( pStyle ));
     497           0 :                     if( pPropStyleContext )
     498           0 :                         pPropStyleContext->FillPropertySet( m_xAxisProps );
     499             : 
     500           0 :                     if( m_bAdaptWrongPercentScaleValues && m_aCurrentAxis.eDimension==SCH_XML_AXIS_Y )
     501             :                     {
     502             :                         //set scale data of added x axis back to default
     503           0 :                         Reference< chart2::XAxis > xAxis( lcl_getAxis( GetImport().GetModel(),
     504           0 :                                             m_aCurrentAxis.eDimension, m_aCurrentAxis.nAxisIndex ) );
     505           0 :                         if( xAxis.is() )
     506             :                         {
     507           0 :                             chart2::ScaleData aScaleData( xAxis->getScaleData());
     508           0 :                             if( lcl_AdaptWrongPercentScaleValues(aScaleData) )
     509           0 :                                 xAxis->setScaleData( aScaleData );
     510           0 :                         }
     511             :                     }
     512             : 
     513           0 :                     if( m_bAddMissingXAxisForNetCharts )
     514             :                     {
     515             :                         //copy style from y axis to added x axis:
     516             : 
     517           0 :                         Reference< chart::XAxisSupplier > xAxisSuppl( xDiaProp, uno::UNO_QUERY );
     518           0 :                         if( xAxisSuppl.is() )
     519             :                         {
     520           0 :                             Reference< beans::XPropertySet > xXAxisProp( xAxisSuppl->getAxis(0), uno::UNO_QUERY );
     521           0 :                             (( XMLPropStyleContext* )pStyle )->FillPropertySet( xXAxisProp );
     522             :                         }
     523             : 
     524             :                         //set scale data of added x axis back to default
     525           0 :                         Reference< chart2::XAxis > xAxis( lcl_getAxis( GetImport().GetModel(),
     526           0 :                                             0 /*nDimensionIndex*/, 0 /*nAxisIndex*/ ) );
     527           0 :                         if( xAxis.is() )
     528             :                         {
     529           0 :                             chart2::ScaleData aScaleData;
     530           0 :                             aScaleData.AxisType = chart2::AxisType::CATEGORY;
     531           0 :                             aScaleData.Orientation = chart2::AxisOrientation_MATHEMATICAL;
     532           0 :                             xAxis->setScaleData( aScaleData );
     533             :                         }
     534             : 
     535             :                         //set line style of added x axis to invisible
     536           0 :                         Reference< beans::XPropertySet > xNewAxisProp( xAxis, uno::UNO_QUERY );
     537           0 :                         if( xNewAxisProp.is() )
     538             :                         {
     539           0 :                             xNewAxisProp->setPropertyValue( OUString("LineStyle")
     540           0 :                                 , uno::makeAny(drawing::LineStyle_NONE));
     541           0 :                         }
     542             :                     }
     543             : 
     544           0 :                     if( m_bAdaptXAxisOrientationForOld2DBarCharts && m_aCurrentAxis.eDimension == SCH_XML_AXIS_X )
     545             :                     {
     546           0 :                         bool bIs3DChart = false;
     547           0 :                         if( xDiaProp.is() && ( xDiaProp->getPropertyValue(OUString("Dim3D")) >>= bIs3DChart )
     548           0 :                             && !bIs3DChart )
     549             :                         {
     550           0 :                             Reference< chart2::XChartDocument > xChart2Document( GetImport().GetModel(), uno::UNO_QUERY );
     551           0 :                             if( xChart2Document.is() )
     552             :                             {
     553           0 :                                 Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xChart2Document->getFirstDiagram(), uno::UNO_QUERY );
     554           0 :                                 if( xCooSysCnt.is() )
     555             :                                 {
     556           0 :                                     uno::Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems() );
     557           0 :                                     if( aCooSysSeq.getLength() )
     558             :                                     {
     559           0 :                                         bool bSwapXandYAxis = false;
     560           0 :                                         Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[0] );
     561           0 :                                         Reference< beans::XPropertySet > xCooSysProp( xCooSys, uno::UNO_QUERY );
     562           0 :                                         if( xCooSysProp.is() && ( xCooSysProp->getPropertyValue( OUString("SwapXAndYAxis")) >>= bSwapXandYAxis )
     563             :                                             && bSwapXandYAxis )
     564             :                                         {
     565           0 :                                             Reference< chart2::XAxis > xAxis = xCooSys->getAxisByDimension( 0, m_aCurrentAxis.nAxisIndex );
     566           0 :                                             if( xAxis.is() )
     567             :                                             {
     568           0 :                                                 chart2::ScaleData aScaleData = xAxis->getScaleData();
     569           0 :                                                 aScaleData.Orientation = chart2::AxisOrientation_REVERSE;
     570           0 :                                                 xAxis->setScaleData( aScaleData );
     571           0 :                                             }
     572           0 :                                         }
     573           0 :                                     }
     574           0 :                                 }
     575           0 :                             }
     576             :                         }
     577             :                     }
     578             : 
     579             :                     m_rbAxisPositionAttributeImported = m_rbAxisPositionAttributeImported || SchXMLTools::getPropertyFromContext(
     580           0 :                         OUString("CrossoverPosition"), pPropStyleContext, pStylesCtxt ).hasValue();
     581             :                 }
     582             :             }
     583           0 :         }
     584           0 :     }
     585             : }
     586             : 
     587           0 : void SchXMLAxisContext::SetAxisTitle()
     588             : {
     589           0 :     if( m_aCurrentAxis.aTitle.isEmpty() )
     590             :         return;
     591             : 
     592           0 :     Reference< chart::XAxis > xAxis( lcl_getChartAxis( m_aCurrentAxis, m_xDiagram ) );
     593           0 :     if( !xAxis.is() )
     594             :         return;
     595             : 
     596           0 :     Reference< beans::XPropertySet > xTitleProp( xAxis->getAxisTitle() );
     597           0 :     if( xTitleProp.is() )
     598             :     {
     599             :         try
     600             :         {
     601           0 :             xTitleProp->setPropertyValue( OUString( "String" ), uno::makeAny(m_aCurrentAxis.aTitle) );
     602             :         }
     603           0 :         catch( beans::UnknownPropertyException & )
     604             :         {
     605             :             OSL_TRACE( "Property String for Title not available" );
     606             :         }
     607           0 :     }
     608             : }
     609             : 
     610             : //-----------------------------------------------------------------------
     611             : namespace
     612             : {
     613             : enum AxisChildTokens
     614             : {
     615             :     XML_TOK_AXIS_TITLE,
     616             :     XML_TOK_AXIS_CATEGORIES,
     617             :     XML_TOK_AXIS_GRID,
     618             :     XML_TOK_AXIS_DATE_SCALE,
     619             :     XML_TOK_AXIS_DATE_SCALE_EXT
     620             : };
     621             : 
     622             : SvXMLTokenMapEntry aAxisChildTokenMap[] =
     623             : {
     624             :     { XML_NAMESPACE_CHART,      XML_TITLE,              XML_TOK_AXIS_TITLE          },
     625             :     { XML_NAMESPACE_CHART,      XML_CATEGORIES,         XML_TOK_AXIS_CATEGORIES     },
     626             :     { XML_NAMESPACE_CHART,      XML_GRID,               XML_TOK_AXIS_GRID           },
     627             :     { XML_NAMESPACE_CHART,      XML_DATE_SCALE,         XML_TOK_AXIS_DATE_SCALE     },
     628             :     { XML_NAMESPACE_CHART_EXT,  XML_DATE_SCALE,         XML_TOK_AXIS_DATE_SCALE_EXT },
     629             :     XML_TOKEN_MAP_END
     630             : };
     631             : 
     632             : class AxisChildTokenMap : public SvXMLTokenMap
     633             : {
     634             : public:
     635           0 :     AxisChildTokenMap(): SvXMLTokenMap( aAxisChildTokenMap ) {}
     636           0 :     virtual ~AxisChildTokenMap() {}
     637             : };
     638             : 
     639             : //a AxisChildTokenMap Singleton
     640             : struct theAxisChildTokenMap : public rtl::Static< AxisChildTokenMap, theAxisChildTokenMap > {};
     641             : }
     642             : 
     643           0 : SvXMLImportContext* SchXMLAxisContext::CreateChildContext(
     644             :     sal_uInt16 p_nPrefix,
     645             :     const OUString& rLocalName,
     646             :     const Reference< xml::sax::XAttributeList >& xAttrList )
     647             : {
     648           0 :     SvXMLImportContext* pContext = 0;
     649           0 :     const SvXMLTokenMap& rTokenMap = theAxisChildTokenMap::get();
     650             : 
     651           0 :     switch( rTokenMap.Get( p_nPrefix, rLocalName ))
     652             :     {
     653             :         case XML_TOK_AXIS_TITLE:
     654             :         {
     655           0 :             Reference< drawing::XShape > xTitleShape = getTitleShape();
     656           0 :             pContext = new SchXMLTitleContext( m_rImportHelper, GetImport(), rLocalName,
     657             :                                                m_aCurrentAxis.aTitle,
     658           0 :                                                xTitleShape );
     659             :         }
     660           0 :         break;
     661             : 
     662             :         case XML_TOK_AXIS_CATEGORIES:
     663           0 :             pContext = new SchXMLCategoriesContext( GetImport(),
     664             :                                                           p_nPrefix, rLocalName,
     665           0 :                                                           m_rCategoriesAddress );
     666           0 :             m_aCurrentAxis.bHasCategories = true;
     667           0 :             break;
     668             : 
     669             :         case XML_TOK_AXIS_DATE_SCALE:
     670             :         case XML_TOK_AXIS_DATE_SCALE_EXT:
     671           0 :             pContext = new DateScaleContext( GetImport(),
     672           0 :                             p_nPrefix, rLocalName, m_xAxisProps );
     673           0 :             m_bDateScaleImported = true;
     674           0 :             break;
     675             : 
     676             :         case XML_TOK_AXIS_GRID:
     677             :         {
     678           0 :             sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     679           0 :             bool bIsMajor = true;       // default value for class is "major"
     680           0 :             OUString sAutoStyleName;
     681             : 
     682           0 :             for( sal_Int16 i = 0; i < nAttrCount; i++ )
     683             :             {
     684           0 :                 OUString sAttrName = xAttrList->getNameByIndex( i );
     685           0 :                 OUString aLocalName;
     686           0 :                 sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
     687             : 
     688           0 :                 if( nPrefix == XML_NAMESPACE_CHART )
     689             :                 {
     690           0 :                     if( IsXMLToken( aLocalName, XML_CLASS ) )
     691             :                     {
     692           0 :                         if( IsXMLToken( xAttrList->getValueByIndex( i ), XML_MINOR ) )
     693           0 :                             bIsMajor = false;
     694             :                     }
     695           0 :                     else if( IsXMLToken( aLocalName, XML_STYLE_NAME ) )
     696           0 :                         sAutoStyleName = xAttrList->getValueByIndex( i );
     697             :                 }
     698           0 :             }
     699             : 
     700           0 :             CreateGrid( sAutoStyleName, bIsMajor );
     701             : 
     702             :             // don't create a context => use default context. grid elements are empty
     703           0 :             pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
     704             :         }
     705           0 :         break;
     706             : 
     707             :         default:
     708           0 :             pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
     709           0 :             break;
     710             :     }
     711             : 
     712           0 :     return pContext;
     713             : }
     714             : 
     715           0 : void SchXMLAxisContext::EndElement()
     716             : {
     717           0 :     if( !m_bDateScaleImported && m_nAxisType==chart::ChartAxisType::AUTOMATIC )
     718             :     {
     719           0 :         Reference< chart2::XAxis > xAxis( lcl_getAxis( GetImport().GetModel(), m_aCurrentAxis.eDimension, m_aCurrentAxis.nAxisIndex ) );
     720           0 :         if( xAxis.is() )
     721             :         {
     722           0 :             chart2::ScaleData aScaleData( xAxis->getScaleData());
     723           0 :             aScaleData.AutoDateAxis = false;//different default for older documents
     724           0 :             xAxis->setScaleData( aScaleData );
     725           0 :         }
     726             :     }
     727             : 
     728           0 :     SetAxisTitle();
     729           0 : }
     730             : 
     731             : // ========================================
     732             : 
     733             : namespace
     734             : {
     735             : 
     736           0 : Reference< chart2::XAxis > lcl_getAxis( const Reference< chart2::XCoordinateSystem > xCooSys, sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex )
     737             : {
     738           0 :     Reference< chart2::XAxis > xAxis;
     739             :     try
     740             :     {
     741           0 :         xAxis = xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex );
     742             :     }
     743           0 :     catch( uno::Exception & )
     744             :     {
     745             :     }
     746           0 :     return xAxis;
     747             : }
     748             : 
     749             : } // anonymous namespace
     750             : 
     751           0 : void SchXMLAxisContext::CorrectAxisPositions( const Reference< chart2::XChartDocument >& xNewDoc,
     752             :                           const OUString& rChartTypeServiceName,
     753             :                           const OUString& rODFVersionOfFile,
     754             :                           bool bAxisPositionAttributeImported )
     755             : {
     756           0 :     if( ( rODFVersionOfFile.isEmpty() || rODFVersionOfFile == "1.0" || rODFVersionOfFile == "1.1"
     757           0 :         || ( rODFVersionOfFile == "1.2" && !bAxisPositionAttributeImported ) ) )
     758             :     {
     759             :         try
     760             :         {
     761           0 :             Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xNewDoc->getFirstDiagram(), uno::UNO_QUERY_THROW );
     762           0 :             uno::Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems());
     763           0 :             if( aCooSysSeq.getLength() )
     764             :             {
     765           0 :                 Reference< chart2::XCoordinateSystem > xCooSys( aCooSysSeq[0] );
     766           0 :                 if( xCooSys.is() )
     767             :                 {
     768           0 :                     Reference< chart2::XAxis > xMainXAxis = lcl_getAxis( xCooSys, 0, 0 );
     769           0 :                     Reference< chart2::XAxis > xMainYAxis = lcl_getAxis( xCooSys, 1, 0 );
     770             :                     //Reference< chart2::XAxis > xMajorZAxis = lcl_getAxis( xCooSys, 2, 0 );
     771           0 :                     Reference< chart2::XAxis > xSecondaryXAxis = lcl_getAxis( xCooSys, 0, 1 );
     772           0 :                     Reference< chart2::XAxis > xSecondaryYAxis = lcl_getAxis( xCooSys, 1, 1 );
     773             : 
     774           0 :                     Reference< beans::XPropertySet > xMainXAxisProp( xMainXAxis, uno::UNO_QUERY );
     775           0 :                     Reference< beans::XPropertySet > xMainYAxisProp( xMainYAxis, uno::UNO_QUERY );
     776           0 :                     Reference< beans::XPropertySet > xSecondaryXAxisProp( xSecondaryXAxis, uno::UNO_QUERY );
     777           0 :                     Reference< beans::XPropertySet > xSecondaryYAxisProp( xSecondaryYAxis, uno::UNO_QUERY );
     778             : 
     779           0 :                     if( xMainXAxisProp.is() && xMainYAxisProp.is() )
     780             :                     {
     781           0 :                         chart2::ScaleData aMainXScale = xMainXAxis->getScaleData();
     782           0 :                         if( 0 == rChartTypeServiceName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.chart2.ScatterChartType" ) ) )
     783             :                         {
     784           0 :                             xMainYAxisProp->setPropertyValue( OUString("CrossoverPosition")
     785           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_VALUE) );
     786           0 :                             double fCrossoverValue = 0.0;
     787           0 :                             aMainXScale.Origin >>= fCrossoverValue;
     788           0 :                             xMainYAxisProp->setPropertyValue( OUString("CrossoverValue")
     789           0 :                                     , uno::makeAny( fCrossoverValue ) );
     790             : 
     791           0 :                             if( aMainXScale.Orientation == chart2::AxisOrientation_REVERSE )
     792             :                             {
     793           0 :                                 xMainYAxisProp->setPropertyValue( OUString("LabelPosition")
     794           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_END) );
     795           0 :                                 xMainYAxisProp->setPropertyValue( OUString("MarkPosition")
     796           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
     797           0 :                                 if( xSecondaryYAxisProp.is() )
     798           0 :                                     xSecondaryYAxisProp->setPropertyValue( OUString("CrossoverPosition")
     799           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
     800             :                             }
     801             :                             else
     802             :                             {
     803           0 :                                 xMainYAxisProp->setPropertyValue( OUString("LabelPosition")
     804           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START) );
     805           0 :                                 xMainYAxisProp->setPropertyValue( OUString("MarkPosition")
     806           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
     807           0 :                                 if( xSecondaryYAxisProp.is() )
     808           0 :                                     xSecondaryYAxisProp->setPropertyValue( OUString("CrossoverPosition")
     809           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
     810             :                             }
     811             :                         }
     812             :                         else
     813             :                         {
     814           0 :                             if( aMainXScale.Orientation == chart2::AxisOrientation_REVERSE )
     815             :                             {
     816           0 :                                 xMainYAxisProp->setPropertyValue( OUString("CrossoverPosition")
     817           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
     818           0 :                                 if( xSecondaryYAxisProp.is() )
     819           0 :                                     xSecondaryYAxisProp->setPropertyValue( OUString("CrossoverPosition")
     820           0 :                                         , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
     821             :                             }
     822             :                             else
     823             :                             {
     824           0 :                                 xMainYAxisProp->setPropertyValue( OUString("CrossoverPosition")
     825           0 :                                     , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
     826           0 :                                 if( xSecondaryYAxisProp.is() )
     827           0 :                                     xSecondaryYAxisProp->setPropertyValue( OUString("CrossoverPosition")
     828           0 :                                         , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
     829             :                             }
     830             :                         }
     831             : 
     832           0 :                         chart2::ScaleData aMainYScale = xMainYAxis->getScaleData();
     833           0 :                         xMainXAxisProp->setPropertyValue( OUString("CrossoverPosition")
     834           0 :                                 , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_VALUE) );
     835           0 :                         double fCrossoverValue = 0.0;
     836           0 :                         aMainYScale.Origin >>= fCrossoverValue;
     837           0 :                         xMainXAxisProp->setPropertyValue( OUString("CrossoverValue")
     838           0 :                                 , uno::makeAny( fCrossoverValue ) );
     839             : 
     840           0 :                         if( aMainYScale.Orientation == chart2::AxisOrientation_REVERSE )
     841             :                         {
     842           0 :                             xMainXAxisProp->setPropertyValue( OUString("LabelPosition")
     843           0 :                                 , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_END) );
     844           0 :                             xMainXAxisProp->setPropertyValue( OUString("MarkPosition")
     845           0 :                                 , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
     846           0 :                             if( xSecondaryXAxisProp.is() )
     847           0 :                                 xSecondaryXAxisProp->setPropertyValue( OUString("CrossoverPosition")
     848           0 :                                 , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_START) );
     849             :                         }
     850             :                         else
     851             :                         {
     852           0 :                             xMainXAxisProp->setPropertyValue( OUString("LabelPosition")
     853           0 :                                 , uno::makeAny( ::com::sun::star::chart::ChartAxisLabelPosition_OUTSIDE_START) );
     854           0 :                             xMainXAxisProp->setPropertyValue( OUString("MarkPosition")
     855           0 :                                 , uno::makeAny( ::com::sun::star::chart::ChartAxisMarkPosition_AT_LABELS) );
     856           0 :                             if( xSecondaryXAxisProp.is() )
     857           0 :                                 xSecondaryXAxisProp->setPropertyValue( OUString("CrossoverPosition")
     858           0 :                                 , uno::makeAny( ::com::sun::star::chart::ChartAxisPosition_END) );
     859           0 :                         }
     860           0 :                     }
     861           0 :                 }
     862           0 :             }
     863             :         }
     864           0 :         catch( uno::Exception & )
     865             :         {
     866             :         }
     867             :     }
     868           0 : }
     869             : 
     870             : // ========================================
     871             : 
     872           0 : SchXMLCategoriesContext::SchXMLCategoriesContext(
     873             :     SvXMLImport& rImport,
     874             :     sal_uInt16 nPrefix,
     875             :     const OUString& rLocalName,
     876             :     OUString& rAddress ) :
     877             :         SvXMLImportContext( rImport, nPrefix, rLocalName ),
     878           0 :         mrAddress( rAddress )
     879             : {
     880           0 : }
     881             : 
     882           0 : SchXMLCategoriesContext::~SchXMLCategoriesContext()
     883             : {
     884           0 : }
     885             : 
     886           0 : void SchXMLCategoriesContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
     887             : {
     888           0 :     sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     889             : 
     890           0 :     for( sal_Int16 i = 0; i < nAttrCount; i++ )
     891             :     {
     892           0 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     893           0 :         OUString aLocalName;
     894           0 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
     895             : 
     896           0 :         if( nPrefix == XML_NAMESPACE_TABLE &&
     897           0 :             IsXMLToken( aLocalName, XML_CELL_RANGE_ADDRESS ) )
     898             :         {
     899           0 :             Reference< chart2::XChartDocument > xNewDoc( GetImport().GetModel(), uno::UNO_QUERY );
     900           0 :             mrAddress = xAttrList->getValueByIndex( i );
     901             :         }
     902           0 :     }
     903           0 : }
     904             : 
     905             : // ========================================
     906             : 
     907           0 : DateScaleContext::DateScaleContext(
     908             :     SvXMLImport& rImport,
     909             :     sal_uInt16 nPrefix,
     910             :     const OUString& rLocalName,
     911             :     const Reference< beans::XPropertySet > xAxisProps ) :
     912             :         SvXMLImportContext( rImport, nPrefix, rLocalName ),
     913           0 :         m_xAxisProps( xAxisProps )
     914             : {
     915           0 : }
     916             : 
     917           0 : DateScaleContext::~DateScaleContext()
     918             : {
     919           0 : }
     920             : 
     921             : namespace
     922             : {
     923             : enum DateScaleAttributeTokens
     924             : {
     925             :     XML_TOK_DATESCALE_BASE_TIME_UNIT,
     926             :     XML_TOK_DATESCALE_MAJOR_INTERVAL_VALUE,
     927             :     XML_TOK_DATESCALE_MAJOR_INTERVAL_UNIT,
     928             :     XML_TOK_DATESCALE_MINOR_INTERVAL_VALUE,
     929             :     XML_TOK_DATESCALE_MINOR_INTERVAL_UNIT
     930             : };
     931             : 
     932             : SvXMLTokenMapEntry aDateScaleAttributeTokenMap[] =
     933             : {
     934             :     { XML_NAMESPACE_CHART,  XML_BASE_TIME_UNIT,         XML_TOK_DATESCALE_BASE_TIME_UNIT  },
     935             :     { XML_NAMESPACE_CHART,  XML_MAJOR_INTERVAL_VALUE,   XML_TOK_DATESCALE_MAJOR_INTERVAL_VALUE  },
     936             :     { XML_NAMESPACE_CHART,  XML_MAJOR_INTERVAL_UNIT,    XML_TOK_DATESCALE_MAJOR_INTERVAL_UNIT  },
     937             :     { XML_NAMESPACE_CHART,  XML_MINOR_INTERVAL_VALUE,   XML_TOK_DATESCALE_MINOR_INTERVAL_VALUE  },
     938             :     { XML_NAMESPACE_CHART,  XML_MINOR_INTERVAL_UNIT,    XML_TOK_DATESCALE_MINOR_INTERVAL_UNIT  },
     939             :     XML_TOKEN_MAP_END
     940             : };
     941             : 
     942             : class DateScaleAttributeTokenMap : public SvXMLTokenMap
     943             : {
     944             : public:
     945           0 :     DateScaleAttributeTokenMap(): SvXMLTokenMap( aDateScaleAttributeTokenMap ) {}
     946           0 :     virtual ~DateScaleAttributeTokenMap() {}
     947             : };
     948             : 
     949             : struct theDateScaleAttributeTokenMap : public rtl::Static< DateScaleAttributeTokenMap, theDateScaleAttributeTokenMap > {};
     950             : 
     951           0 : sal_Int32 lcl_getTimeUnit( const OUString& rValue )
     952             : {
     953           0 :     sal_Int32 nTimeUnit = ::com::sun::star::chart::TimeUnit::DAY;
     954           0 :     if( IsXMLToken( rValue, XML_DAYS ) )
     955           0 :         nTimeUnit = ::com::sun::star::chart::TimeUnit::DAY;
     956           0 :     else if( IsXMLToken( rValue, XML_MONTHS ) )
     957           0 :         nTimeUnit = ::com::sun::star::chart::TimeUnit::MONTH;
     958           0 :     else if( IsXMLToken( rValue, XML_YEARS ) )
     959           0 :         nTimeUnit = ::com::sun::star::chart::TimeUnit::YEAR;
     960           0 :     return nTimeUnit;
     961             : }
     962             : 
     963             : }
     964             : 
     965           0 : void DateScaleContext::StartElement( const Reference< xml::sax::XAttributeList >& xAttrList )
     966             : {
     967           0 :     if( !m_xAxisProps.is() )
     968           0 :         return;
     969             : 
     970             :     // parse attributes
     971           0 :     sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
     972           0 :     const SvXMLTokenMap& rAttrTokenMap = theDateScaleAttributeTokenMap::get();
     973             : 
     974           0 :     bool bSetNewIncrement=false;
     975           0 :     chart::TimeIncrement aIncrement;
     976           0 :     m_xAxisProps->getPropertyValue( OUString( "TimeIncrement" )) >>= aIncrement;
     977             : 
     978           0 :     for( sal_Int16 i = 0; i < nAttrCount; i++ )
     979             :     {
     980           0 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     981           0 :         OUString aLocalName;
     982           0 :         OUString aValue = xAttrList->getValueByIndex( i );
     983           0 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
     984             : 
     985           0 :         switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
     986             :         {
     987             :             case XML_TOK_DATESCALE_BASE_TIME_UNIT:
     988             :                 {
     989           0 :                     aIncrement.TimeResolution = uno::makeAny( lcl_getTimeUnit(aValue) );
     990           0 :                     bSetNewIncrement = true;
     991             :                 }
     992           0 :                 break;
     993             :             case XML_TOK_DATESCALE_MAJOR_INTERVAL_VALUE:
     994             :                 {
     995           0 :                     chart::TimeInterval aInterval(1,0);
     996           0 :                     aIncrement.MajorTimeInterval >>= aInterval;
     997           0 :                     ::sax::Converter::convertNumber( aInterval.Number, aValue );
     998           0 :                     aIncrement.MajorTimeInterval = uno::makeAny(aInterval);
     999           0 :                     bSetNewIncrement = true;
    1000             :                 }
    1001           0 :                 break;
    1002             :             case XML_TOK_DATESCALE_MAJOR_INTERVAL_UNIT:
    1003             :                 {
    1004           0 :                     chart::TimeInterval aInterval(1,0);
    1005           0 :                     aIncrement.MajorTimeInterval >>= aInterval;
    1006           0 :                     aInterval.TimeUnit = lcl_getTimeUnit(aValue);
    1007           0 :                     aIncrement.MajorTimeInterval = uno::makeAny(aInterval);
    1008           0 :                     bSetNewIncrement = true;
    1009             :                 }
    1010           0 :                 break;
    1011             :             case XML_TOK_DATESCALE_MINOR_INTERVAL_VALUE:
    1012             :                 {
    1013           0 :                     chart::TimeInterval aInterval(1,0);
    1014           0 :                     aIncrement.MinorTimeInterval >>= aInterval;
    1015           0 :                     ::sax::Converter::convertNumber( aInterval.Number, aValue );
    1016           0 :                     aIncrement.MinorTimeInterval = uno::makeAny(aInterval);
    1017           0 :                     bSetNewIncrement = true;
    1018             :                 }
    1019           0 :                 break;
    1020             :             case XML_TOK_DATESCALE_MINOR_INTERVAL_UNIT:
    1021             :                 {
    1022           0 :                     chart::TimeInterval aInterval(1,0);
    1023           0 :                     aIncrement.MinorTimeInterval >>= aInterval;
    1024           0 :                     aInterval.TimeUnit = lcl_getTimeUnit(aValue);
    1025           0 :                     aIncrement.MinorTimeInterval = uno::makeAny(aInterval);
    1026           0 :                     bSetNewIncrement = true;
    1027             :                 }
    1028           0 :                 break;
    1029             :         }
    1030           0 :     }
    1031             : 
    1032           0 :     if( bSetNewIncrement )
    1033           0 :         m_xAxisProps->setPropertyValue( OUString( "TimeIncrement" ), uno::makeAny( aIncrement ) );
    1034             : }
    1035             : 
    1036             : // ========================================
    1037             : 
    1038             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10