diff options
Diffstat (limited to 'chart2/source/tools/AxisHelper.cxx')
-rw-r--r-- | chart2/source/tools/AxisHelper.cxx | 1174 |
1 files changed, 0 insertions, 1174 deletions
diff --git a/chart2/source/tools/AxisHelper.cxx b/chart2/source/tools/AxisHelper.cxx deleted file mode 100644 index 2d6a6dedc..000000000 --- a/chart2/source/tools/AxisHelper.cxx +++ /dev/null @@ -1,1174 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_chart2.hxx" - -#include "AxisHelper.hxx" -#include "DiagramHelper.hxx" -#include "ChartTypeHelper.hxx" -#include "macros.hxx" -#include "AxisIndexDefines.hxx" -#include "LineProperties.hxx" -#include "ContainerHelper.hxx" -#include "servicenames_coosystems.hxx" -#include "DataSeriesHelper.hxx" -#include "Scaling.hxx" -#include "ChartModelHelper.hxx" -#include "DataSourceHelper.hxx" - -#include <unotools/saveopt.hxx> - -#include <com/sun/star/chart/ChartAxisPosition.hpp> - -#include <com/sun/star/chart2/XCoordinateSystemContainer.hpp> -#include <com/sun/star/chart2/XChartTypeContainer.hpp> -#include <com/sun/star/chart2/XDataSeriesContainer.hpp> -#include <com/sun/star/chart2/data/XDataSource.hpp> - -// header for class OUStringBuffer -#include <rtl/ustrbuf.hxx> -#include <rtl/math.hxx> - -#include <com/sun/star/util/XCloneable.hpp> -#include <com/sun/star/lang/XServiceName.hpp> - -#include <map> - -//............................................................................. -namespace chart -{ -//............................................................................. -using namespace ::com::sun::star; -using namespace ::com::sun::star::chart2; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; - -Reference< chart2::XScaling > AxisHelper::createLinearScaling() -{ - return new LinearScaling( 1.0, 0.0 ); -} - -Reference< chart2::XScaling > AxisHelper::createLogarithmicScaling( double fBase ) -{ - return new LogarithmicScaling( fBase ); -} - -ScaleData AxisHelper::createDefaultScale() -{ - ScaleData aScaleData; - aScaleData.AxisType = chart2::AxisType::REALNUMBER; - aScaleData.AutoDateAxis = true; - aScaleData.ShiftedCategoryPosition = false;//this is adapted in the view code currently - Sequence< SubIncrement > aSubIncrements(1); - aSubIncrements[0] = SubIncrement(); - aScaleData.IncrementData.SubIncrements = aSubIncrements; - return aScaleData; -} - -void AxisHelper::removeExplicitScaling( ScaleData& rScaleData ) -{ - uno::Any aEmpty; - rScaleData.Minimum = rScaleData.Maximum = rScaleData.Origin = aEmpty; - rScaleData.Scaling = 0; - ScaleData aDefaultScale( createDefaultScale() ); - rScaleData.IncrementData = aDefaultScale.IncrementData; - rScaleData.TimeIncrement = aDefaultScale.TimeIncrement; -} - -bool AxisHelper::isLogarithmic( const Reference< XScaling >& xScaling ) -{ - bool bReturn = false; - Reference< lang::XServiceName > xServiceName( xScaling, uno::UNO_QUERY ); - bReturn =( xServiceName.is() && (xServiceName->getServiceName()).equals( - C2U( "com.sun.star.chart2.LogarithmicScaling" ))); - return bReturn; -} - -chart2::ScaleData AxisHelper::getDateCheckedScale( const Reference< chart2::XAxis >& xAxis, const Reference< frame::XModel >& xChartModel ) -{ - OSL_ENSURE(xChartModel.is(),"missing chart model"); - ScaleData aScale = xAxis->getScaleData(); - Reference< chart2::XCoordinateSystem > xCooSys( ChartModelHelper::getFirstCoordinateSystem( xChartModel ) ); - if( aScale.AutoDateAxis && aScale.AxisType == AxisType::CATEGORY ) - { - sal_Int32 nDimensionIndex=0; sal_Int32 nAxisIndex=0; - AxisHelper::getIndicesForAxis(xAxis, xCooSys, nDimensionIndex, nAxisIndex ); - bool bChartTypeAllowsDateAxis = ChartTypeHelper::isSupportingDateAxis( AxisHelper::getChartTypeByIndex( xCooSys, 0 ), 2, nDimensionIndex ); - if( bChartTypeAllowsDateAxis ) - aScale.AxisType = AxisType::DATE; - } - if( aScale.AxisType == AxisType::DATE ) - { - ExplicitCategoriesProvider aExplicitCategoriesProvider( xCooSys,xChartModel ); - if( !aExplicitCategoriesProvider.isDateAxis() ) - aScale.AxisType = AxisType::CATEGORY; - } - return aScale; -} - -void AxisHelper::checkDateAxis( chart2::ScaleData& rScale, ExplicitCategoriesProvider* pExplicitCategoriesProvider, bool bChartTypeAllowsDateAxis ) -{ - if( rScale.AutoDateAxis && rScale.AxisType == AxisType::CATEGORY && bChartTypeAllowsDateAxis ) - { - rScale.AxisType = AxisType::DATE; - removeExplicitScaling( rScale ); - } - if( rScale.AxisType == AxisType::DATE && (!pExplicitCategoriesProvider || !pExplicitCategoriesProvider->isDateAxis()) ) - { - rScale.AxisType = AxisType::CATEGORY; - removeExplicitScaling( rScale ); - } -} - -sal_Int32 AxisHelper::getExplicitNumberFormatKeyForAxis( - const Reference< chart2::XAxis >& xAxis - , const Reference< chart2::XCoordinateSystem > & xCorrespondingCoordinateSystem - , const Reference< util::XNumberFormatsSupplier >& xNumberFormatsSupplier - , bool bSearchForParallelAxisIfNothingIsFound ) -{ - sal_Int32 nNumberFormatKey(0); - bool bNumberFormatKeyFoundViaAttachedData = false; - sal_Int32 nAxisIndex = 0; - sal_Int32 nDimensionIndex = 1; - AxisHelper::getIndicesForAxis( xAxis, xCorrespondingCoordinateSystem, nDimensionIndex, nAxisIndex ); - Reference< chart2::XChartDocument > xChartDoc( xNumberFormatsSupplier, uno::UNO_QUERY ); - - Reference< beans::XPropertySet > xProp( xAxis, uno::UNO_QUERY ); - if( xProp.is() && !( xProp->getPropertyValue( C2U( "NumberFormat" ) ) >>= nNumberFormatKey ) ) - { - bool bFormatSet = false; - //check wether we have a percent scale -> use percent format - if( xNumberFormatsSupplier.is() ) - { - ScaleData aData = AxisHelper::getDateCheckedScale( xAxis, Reference< frame::XModel >( xNumberFormatsSupplier, uno::UNO_QUERY ) ); - if( aData.AxisType==AxisType::PERCENT ) - { - sal_Int32 nPercentFormat = DiagramHelper::getPercentNumberFormat( xNumberFormatsSupplier ); - if( nPercentFormat != -1 ) - { - nNumberFormatKey = nPercentFormat; - bFormatSet = true; - } - } - else if( aData.AxisType==AxisType::DATE ) - { - if( aData.Categories.is() ) - { - Reference< data::XDataSequence > xSeq( aData.Categories->getValues()); - if( xSeq.is() && !( xChartDoc.is() && xChartDoc->hasInternalDataProvider()) ) - nNumberFormatKey = xSeq->getNumberFormatKeyByIndex( -1 ); - else - nNumberFormatKey = DiagramHelper::getDateNumberFormat( xNumberFormatsSupplier ); - bFormatSet = true; - } - } - else if( xChartDoc.is() && xChartDoc->hasInternalDataProvider() && nDimensionIndex == 0 ) //maybe date axis - { - Reference< chart2::XDiagram > xDiagram( xChartDoc->getFirstDiagram() ); - if( DiagramHelper::isSupportingDateAxis( xDiagram ) ) - { - nNumberFormatKey = DiagramHelper::getDateNumberFormat( xNumberFormatsSupplier ); - } - else - { - Reference< data::XDataSource > xSource( DataSourceHelper::getUsedData( xChartDoc ) ); - if( xSource.is() ) - { - ::std::vector< Reference< chart2::data::XLabeledDataSequence > > aXValues( - DataSeriesHelper::getAllDataSequencesByRole( xSource->getDataSequences(), C2U("values-x"), true ) ); - if( aXValues.empty() ) - { - Reference< data::XLabeledDataSequence > xCategories( DiagramHelper::getCategoriesFromDiagram( xDiagram ) ); - if( xCategories.is() ) - { - Reference< data::XDataSequence > xSeq( xCategories->getValues()); - if( xSeq.is() ) - { - bool bHasValidDoubles = false; - double fTest=0.0; - Sequence< uno::Any > aCats( xSeq->getData() ); - sal_Int32 nCount = aCats.getLength(); - for( sal_Int32 i = 0; i < nCount; ++i ) - { - if( (aCats[i]>>=fTest) && !::rtl::math::isNan(fTest) ) - { - bHasValidDoubles=true; - break; - } - } - if( bHasValidDoubles ) - nNumberFormatKey = DiagramHelper::getDateNumberFormat( xNumberFormatsSupplier ); - } - } - } - } - } - bFormatSet = true; - } - } - - if( !bFormatSet ) - { - typedef ::std::map< sal_Int32, sal_Int32 > tNumberformatFrequency; - tNumberformatFrequency aKeyMap; - - try - { - Reference< XChartTypeContainer > xCTCnt( xCorrespondingCoordinateSystem, uno::UNO_QUERY_THROW ); - if( xCTCnt.is() ) - { - ::rtl::OUString aRoleToMatch; - if( nDimensionIndex == 0 ) - aRoleToMatch = C2U("values-x"); - Sequence< Reference< XChartType > > aChartTypes( xCTCnt->getChartTypes()); - for( sal_Int32 nCTIdx=0; nCTIdx<aChartTypes.getLength(); ++nCTIdx ) - { - if( nDimensionIndex != 0 ) - aRoleToMatch = ChartTypeHelper::getRoleOfSequenceForYAxisNumberFormatDetection( aChartTypes[nCTIdx] ); - Reference< XDataSeriesContainer > xDSCnt( aChartTypes[nCTIdx], uno::UNO_QUERY_THROW ); - Sequence< Reference< XDataSeries > > aDataSeriesSeq( xDSCnt->getDataSeries()); - for( sal_Int32 nSeriesIdx=0; nSeriesIdx<aDataSeriesSeq.getLength(); ++nSeriesIdx ) - { - Reference< chart2::XDataSeries > xDataSeries(aDataSeriesSeq[nSeriesIdx]); - Reference< data::XDataSource > xSource( xDataSeries, uno::UNO_QUERY_THROW ); - - if( nDimensionIndex == 1 ) - { - //only take those series into accoutn that are attached to this axis - sal_Int32 nAttachedAxisIndex = DataSeriesHelper::getAttachedAxisIndex(xDataSeries); - if( nAttachedAxisIndex != nAxisIndex ) - continue; - } - - Reference< data::XLabeledDataSequence > xLabeledSeq( - DataSeriesHelper::getDataSequenceByRole( xSource, aRoleToMatch ) ); - - if( !xLabeledSeq.is() && nDimensionIndex==0 ) - { - ScaleData aData = xAxis->getScaleData(); - xLabeledSeq = aData.Categories; - } - - if( xLabeledSeq.is() ) - { - Reference< data::XDataSequence > xSeq( xLabeledSeq->getValues()); - if( xSeq.is() ) - { - sal_Int32 nKey = xSeq->getNumberFormatKeyByIndex( -1 ); - // initialize the value - if( aKeyMap.find( nKey ) == aKeyMap.end()) - aKeyMap[ nKey ] = 0; - // increase frequency - aKeyMap[ nKey ] = (aKeyMap[ nKey ] + 1); - } - } - } - } - } - } - catch( const uno::Exception & ex ) - { - ASSERT_EXCEPTION( ex ); - } - - if( ! aKeyMap.empty()) - { - sal_Int32 nMaxFreq = 0; - // find most frequent key - for( tNumberformatFrequency::const_iterator aIt = aKeyMap.begin(); - aIt != aKeyMap.end(); ++aIt ) - { - OSL_TRACE( "NumberFormatKey %d appears %d times", (*aIt).first, (*aIt).second ); - // all values must at least be 1 - if( (*aIt).second > nMaxFreq ) - { - nNumberFormatKey = (*aIt).first; - bNumberFormatKeyFoundViaAttachedData = true; - nMaxFreq = (*aIt).second; - } - } - } - - if( bSearchForParallelAxisIfNothingIsFound ) - { - //no format is set to this axis and no data is set to this axis - //--> try to obtain the format from the parallel y-axis - if( !bNumberFormatKeyFoundViaAttachedData && nDimensionIndex == 1 ) - { - sal_Int32 nParallelAxisIndex = (nAxisIndex==1) ?0 :1; - Reference< XAxis > xParallelAxis( AxisHelper::getAxis( 1, nParallelAxisIndex, xCorrespondingCoordinateSystem ) ); - nNumberFormatKey = AxisHelper::getExplicitNumberFormatKeyForAxis( xParallelAxis, xCorrespondingCoordinateSystem, xNumberFormatsSupplier, false ); - } - } - } - } - return nNumberFormatKey; -} - -Reference< XAxis > AxisHelper::createAxis( - sal_Int32 nDimensionIndex - , sal_Int32 nAxisIndex // 0==main or 1==secondary axis - , const Reference< XCoordinateSystem >& xCooSys - , const Reference< uno::XComponentContext > & xContext - , ReferenceSizeProvider * pRefSizeProvider ) -{ - if( !xContext.is() || !xCooSys.is() ) - return NULL; - if( nDimensionIndex >= xCooSys->getDimension() ) - return NULL; - - Reference< XAxis > xAxis( xContext->getServiceManager()->createInstanceWithContext( - C2U( "com.sun.star.chart2.Axis" ), xContext ), uno::UNO_QUERY ); - - OSL_ASSERT( xAxis.is()); - if( xAxis.is()) - { - xCooSys->setAxisByDimension( nDimensionIndex, xAxis, nAxisIndex ); - - if( nAxisIndex>0 )//when inserting secondary axes copy some things from the main axis - { - ::com::sun::star::chart::ChartAxisPosition eNewAxisPos( ::com::sun::star::chart::ChartAxisPosition_END ); - - Reference< XAxis > xMainAxis( xCooSys->getAxisByDimension( nDimensionIndex, 0 ) ); - if( xMainAxis.is() ) - { - ScaleData aScale = xAxis->getScaleData(); - ScaleData aMainScale = xMainAxis->getScaleData(); - - aScale.AxisType = aMainScale.AxisType; - aScale.AutoDateAxis = aMainScale.AutoDateAxis; - aScale.Categories = aMainScale.Categories; - aScale.Orientation = aMainScale.Orientation; - - xAxis->setScaleData( aScale ); - - //ensure that the second axis is not placed on the main axis - Reference< beans::XPropertySet > xMainProp( xMainAxis, uno::UNO_QUERY ); - if( xMainProp.is() ) - { - ::com::sun::star::chart::ChartAxisPosition eMainAxisPos( ::com::sun::star::chart::ChartAxisPosition_ZERO ); - xMainProp->getPropertyValue(C2U( "CrossoverPosition" )) >>= eMainAxisPos; - if( ::com::sun::star::chart::ChartAxisPosition_END == eMainAxisPos ) - eNewAxisPos = ::com::sun::star::chart::ChartAxisPosition_START; - } - } - - Reference< beans::XPropertySet > xProp( xAxis, uno::UNO_QUERY ); - if( xProp.is() ) - xProp->setPropertyValue(C2U( "CrossoverPosition" ), uno::makeAny(eNewAxisPos) ); - } - - Reference< beans::XPropertySet > xProp( xAxis, uno::UNO_QUERY ); - if( xProp.is() ) try - { - // set correct initial AutoScale - if( pRefSizeProvider ) - pRefSizeProvider->setValuesAtPropertySet( xProp ); - } - catch( uno::Exception& e ) - { - ASSERT_EXCEPTION( e ); - } - } - return xAxis; -} - -Reference< XAxis > AxisHelper::createAxis( sal_Int32 nDimensionIndex, bool bMainAxis - , const Reference< chart2::XDiagram >& xDiagram - , const Reference< uno::XComponentContext >& xContext - , ReferenceSizeProvider * pRefSizeProvider ) -{ - OSL_ENSURE( xContext.is(), "need a context to create an axis" ); - if( !xContext.is() ) - return NULL; - - sal_Int32 nAxisIndex = bMainAxis ? MAIN_AXIS_INDEX : SECONDARY_AXIS_INDEX; - sal_Int32 nCooSysIndex = 0; - Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex ); - - // create axis - return AxisHelper::createAxis( - nDimensionIndex, nAxisIndex, xCooSys, xContext, pRefSizeProvider ); -} - -void AxisHelper::showAxis( sal_Int32 nDimensionIndex, bool bMainAxis - , const Reference< chart2::XDiagram >& xDiagram - , const Reference< uno::XComponentContext >& xContext - , ReferenceSizeProvider * pRefSizeProvider ) -{ - if( !xDiagram.is() ) - return; - - bool bNewAxisCreated = false; - Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) ); - if( !xAxis.is() && xContext.is() ) - { - // create axis - bNewAxisCreated = true; - xAxis.set( AxisHelper::createAxis( nDimensionIndex, bMainAxis, xDiagram, xContext, pRefSizeProvider ) ); - } - - OSL_ASSERT( xAxis.is()); - if( !bNewAxisCreated ) //default is true already if created - AxisHelper::makeAxisVisible( xAxis ); -} - -void AxisHelper::showGrid( sal_Int32 nDimensionIndex, sal_Int32 nCooSysIndex, bool bMainGrid - , const Reference< XDiagram >& xDiagram - , const Reference< uno::XComponentContext >& /*xContext*/ ) -{ - if( !xDiagram.is() ) - return; - - Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex ); - if(!xCooSys.is()) - return; - - Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, MAIN_AXIS_INDEX, xCooSys ) ); - if(!xAxis.is()) - { - //hhhh todo create axis without axis visibility - } - if(!xAxis.is()) - return; - - if( bMainGrid ) - AxisHelper::makeGridVisible( xAxis->getGridProperties() ); - else - { - Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() ); - for( sal_Int32 nN=0; nN<aSubGrids.getLength(); nN++) - AxisHelper::makeGridVisible( aSubGrids[nN] ); - } -} - -void AxisHelper::makeAxisVisible( const Reference< XAxis >& xAxis ) -{ - Reference< beans::XPropertySet > xProps( xAxis, uno::UNO_QUERY ); - if( xProps.is() ) - { - xProps->setPropertyValue( C2U( "Show" ), uno::makeAny( sal_True ) ); - LineProperties::SetLineVisible( xProps ); - xProps->setPropertyValue( C2U( "DisplayLabels" ), uno::makeAny( sal_True ) ); - } -} - -void AxisHelper::makeGridVisible( const Reference< beans::XPropertySet >& xGridProperties ) -{ - if( xGridProperties.is() ) - { - xGridProperties->setPropertyValue( C2U( "Show" ), uno::makeAny( sal_True ) ); - LineProperties::SetLineVisible( xGridProperties ); - } -} - -void AxisHelper::hideAxis( sal_Int32 nDimensionIndex, bool bMainAxis - , const Reference< XDiagram >& xDiagram ) -{ - AxisHelper::makeAxisInvisible( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) ); -} - -void AxisHelper::makeAxisInvisible( const Reference< XAxis >& xAxis ) -{ - Reference< beans::XPropertySet > xProps( xAxis, uno::UNO_QUERY ); - if( xProps.is() ) - { - xProps->setPropertyValue( C2U( "Show" ), uno::makeAny( sal_False ) ); - } -} - -void AxisHelper::hideAxisIfNoDataIsAttached( const Reference< XAxis >& xAxis, const Reference< XDiagram >& xDiagram ) -{ - //axis is hidden if no data is attached anymore but data is available - bool bOtherSeriesAttachedToThisAxis = false; - ::std::vector< Reference< chart2::XDataSeries > > aSeriesVector( DiagramHelper::getDataSeriesFromDiagram( xDiagram ) ); - ::std::vector< Reference< chart2::XDataSeries > >::const_iterator aIt = aSeriesVector.begin(); - for( ; aIt != aSeriesVector.end(); ++aIt) - { - uno::Reference< chart2::XAxis > xCurrentAxis( DiagramHelper::getAttachedAxis( *aIt, xDiagram ), uno::UNO_QUERY ); - if( xCurrentAxis==xAxis ) - { - bOtherSeriesAttachedToThisAxis = true; - break; - } - } - if(!bOtherSeriesAttachedToThisAxis && !aSeriesVector.empty() ) - AxisHelper::makeAxisInvisible( xAxis ); -} - -void AxisHelper::hideGrid( sal_Int32 nDimensionIndex, sal_Int32 nCooSysIndex, bool bMainGrid - , const Reference< XDiagram >& xDiagram ) -{ - if( !xDiagram.is() ) - return; - - Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex ); - if(!xCooSys.is()) - return; - - Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, MAIN_AXIS_INDEX, xCooSys ) ); - if(!xAxis.is()) - return; - - if( bMainGrid ) - AxisHelper::makeGridInvisible( xAxis->getGridProperties() ); - else - { - Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() ); - for( sal_Int32 nN=0; nN<aSubGrids.getLength(); nN++) - AxisHelper::makeGridInvisible( aSubGrids[nN] ); - } -} - -void AxisHelper::makeGridInvisible( const Reference< beans::XPropertySet >& xGridProperties ) -{ - if( xGridProperties.is() ) - { - xGridProperties->setPropertyValue( C2U( "Show" ), uno::makeAny( sal_False ) ); - } -} - -sal_Bool AxisHelper::isGridShown( sal_Int32 nDimensionIndex, sal_Int32 nCooSysIndex, bool bMainGrid - , const Reference< ::com::sun::star::chart2::XDiagram >& xDiagram ) -{ - sal_Bool bRet = false; - - Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, nCooSysIndex ); - if(!xCooSys.is()) - return bRet; - - Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, MAIN_AXIS_INDEX, xCooSys ) ); - if(!xAxis.is()) - return bRet; - - if( bMainGrid ) - bRet = AxisHelper::isGridVisible( xAxis->getGridProperties() ); - else - { - Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() ); - if( aSubGrids.getLength() ) - bRet = AxisHelper::isGridVisible( aSubGrids[0] ); - } - - return bRet; -} - -Reference< XCoordinateSystem > AxisHelper::getCoordinateSystemByIndex( - const Reference< XDiagram >& xDiagram, sal_Int32 nIndex ) -{ - Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY ); - if(!xCooSysContainer.is()) - return NULL; - Sequence< Reference< XCoordinateSystem > > aCooSysList = xCooSysContainer->getCoordinateSystems(); - if(0<=nIndex && nIndex<aCooSysList.getLength()) - return aCooSysList[nIndex]; - return NULL; -} - -Reference< XAxis > AxisHelper::getAxis( sal_Int32 nDimensionIndex, bool bMainAxis - , const Reference< XDiagram >& xDiagram ) -{ - Reference< XAxis > xRet; - try - { - Reference< XCoordinateSystem > xCooSys = AxisHelper::getCoordinateSystemByIndex( xDiagram, 0 ); - xRet.set( AxisHelper::getAxis( nDimensionIndex, bMainAxis ? 0 : 1, xCooSys ) ); - } - catch( const uno::Exception & ) - { - } - return xRet; -} - -Reference< XAxis > AxisHelper::getAxis( sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex - , const Reference< XCoordinateSystem >& xCooSys ) -{ - Reference< XAxis > xRet; - try - { - if( xCooSys.is() ) - xRet.set( xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex ) ); - } - catch( const uno::Exception & ) - { - } - return xRet; -} - -Reference< XAxis > AxisHelper::getCrossingMainAxis( const Reference< XAxis >& xAxis - , const Reference< XCoordinateSystem >& xCooSys ) -{ - sal_Int32 nDimensionIndex = 0; - sal_Int32 nAxisIndex = 0; - AxisHelper::getIndicesForAxis( xAxis, xCooSys, nDimensionIndex, nAxisIndex ); - if( 2==nDimensionIndex ) - { - nDimensionIndex=1; - bool bSwapXY = false; - Reference< beans::XPropertySet > xCooSysProp( xCooSys, uno::UNO_QUERY ); - if( xCooSysProp.is() && (xCooSysProp->getPropertyValue( C2U("SwapXAndYAxis") ) >>= bSwapXY) && bSwapXY ) - nDimensionIndex=0; - } - else if( 1==nDimensionIndex ) - nDimensionIndex=0; - else - nDimensionIndex=1; - return AxisHelper::getAxis( nDimensionIndex, 0, xCooSys ); -} - -Reference< XAxis > AxisHelper::getParallelAxis( const Reference< XAxis >& xAxis - , const Reference< XDiagram >& xDiagram ) -{ - try - { - sal_Int32 nCooSysIndex=-1; - sal_Int32 nDimensionIndex=-1; - sal_Int32 nAxisIndex=-1; - if( getIndicesForAxis( xAxis, xDiagram, nCooSysIndex, nDimensionIndex, nAxisIndex ) ) - { - sal_Int32 nParallelAxisIndex = (nAxisIndex==1) ?0 :1; - return getAxis( nDimensionIndex, nParallelAxisIndex, getCoordinateSystemByIndex( xDiagram, nCooSysIndex ) ); - } - } - catch( uno::RuntimeException& ) - { - } - return 0; -} - -sal_Bool AxisHelper::isAxisShown( sal_Int32 nDimensionIndex, bool bMainAxis - , const Reference< XDiagram >& xDiagram ) -{ - return AxisHelper::isAxisVisible( AxisHelper::getAxis( nDimensionIndex, bMainAxis, xDiagram ) ); -} - -sal_Bool AxisHelper::isAxisVisible( const Reference< XAxis >& xAxis ) -{ - sal_Bool bRet = false; - - Reference< beans::XPropertySet > xProps( xAxis, uno::UNO_QUERY ); - if( xProps.is() ) - { - xProps->getPropertyValue( C2U( "Show" ) ) >>= bRet; - bRet = bRet && ( LineProperties::IsLineVisible( xProps ) - || areAxisLabelsVisible( xProps ) ); - } - - return bRet; -} - -sal_Bool AxisHelper::areAxisLabelsVisible( const Reference< beans::XPropertySet >& xAxisProperties ) -{ - sal_Bool bRet = false; - if( xAxisProperties.is() ) - { - xAxisProperties->getPropertyValue( C2U( "DisplayLabels" ) ) >>= bRet; - } - return bRet; -} - -sal_Bool AxisHelper::isGridVisible( const Reference< beans::XPropertySet >& xGridProperies ) -{ - sal_Bool bRet = false; - - if( xGridProperies.is() ) - { - xGridProperies->getPropertyValue( C2U( "Show" ) ) >>= bRet; - bRet = bRet && LineProperties::IsLineVisible( xGridProperies ); - } - - return bRet; -} - -Reference< beans::XPropertySet > AxisHelper::getGridProperties( - const Reference< XCoordinateSystem >& xCooSys - , sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex, sal_Int32 nSubGridIndex ) -{ - Reference< beans::XPropertySet > xRet; - - Reference< XAxis > xAxis( AxisHelper::getAxis( nDimensionIndex, nAxisIndex, xCooSys ) ); - if( xAxis.is() ) - { - if( nSubGridIndex<0 ) - xRet.set( xAxis->getGridProperties() ); - else - { - Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() ); - if( nSubGridIndex >= 0 && nSubGridIndex < aSubGrids.getLength() ) - xRet.set( aSubGrids[nSubGridIndex] ); - } - } - - return xRet; -} - -sal_Int32 AxisHelper::getDimensionIndexOfAxis( - const Reference< XAxis >& xAxis - , const Reference< XDiagram >& xDiagram ) -{ - sal_Int32 nDimensionIndex = -1; - sal_Int32 nCooSysIndex = -1; - sal_Int32 nAxisIndex = -1; - AxisHelper::getIndicesForAxis( xAxis, xDiagram, nCooSysIndex , nDimensionIndex, nAxisIndex ); - return nDimensionIndex; -} - -bool AxisHelper::getIndicesForAxis( - const Reference< XAxis >& xAxis - , const Reference< XCoordinateSystem >& xCooSys - , sal_Int32& rOutDimensionIndex, sal_Int32& rOutAxisIndex ) -{ - //returns true if indices are found - - rOutDimensionIndex = -1; - rOutAxisIndex = -1; - - if( xCooSys.is() && xAxis.is() ) - { - Reference< XAxis > xCurrentAxis; - sal_Int32 nDimensionCount( xCooSys->getDimension() ); - for( sal_Int32 nDimensionIndex = 0; nDimensionIndex < nDimensionCount; nDimensionIndex++ ) - { - sal_Int32 nMaxAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex); - for( sal_Int32 nAxisIndex = 0; nAxisIndex <= nMaxAxisIndex; nAxisIndex++ ) - { - xCurrentAxis = xCooSys->getAxisByDimension(nDimensionIndex,nAxisIndex); - if( xCurrentAxis == xAxis ) - { - rOutDimensionIndex = nDimensionIndex; - rOutAxisIndex = nAxisIndex; - return true; - } - } - } - } - return false; -} - -bool AxisHelper::getIndicesForAxis( const Reference< XAxis >& xAxis, const Reference< XDiagram >& xDiagram - , sal_Int32& rOutCooSysIndex, sal_Int32& rOutDimensionIndex, sal_Int32& rOutAxisIndex ) -{ - //returns true if indices are found - - rOutCooSysIndex = -1; - rOutDimensionIndex = -1; - rOutAxisIndex = -1; - - Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY ); - if(xCooSysContainer.is()) - { - Sequence< Reference< XCoordinateSystem > > aCooSysList = xCooSysContainer->getCoordinateSystems(); - for( sal_Int32 nC=0; nC<aCooSysList.getLength(); ++nC ) - { - if( AxisHelper::getIndicesForAxis( xAxis, aCooSysList[nC], rOutDimensionIndex, rOutAxisIndex ) ) - { - rOutCooSysIndex = nC; - return true; - } - } - } - - return false; -} - -std::vector< Reference< XAxis > > AxisHelper::getAllAxesOfCoordinateSystem( - const Reference< XCoordinateSystem >& xCooSys - , bool bOnlyVisible /* = false */ ) -{ - std::vector< Reference< XAxis > > aAxisVector; - - if(xCooSys.is()) - { - sal_Int32 nMaxDimensionIndex = xCooSys->getDimension() -1; - if( nMaxDimensionIndex>=0 ) - { - sal_Int32 nDimensionIndex = 0; - for(; nDimensionIndex<=nMaxDimensionIndex; ++nDimensionIndex) - { - const sal_Int32 nMaximumAxisIndex = xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex); - for(sal_Int32 nAxisIndex=0; nAxisIndex<=nMaximumAxisIndex; ++nAxisIndex) - { - try - { - Reference< XAxis > xAxis( xCooSys->getAxisByDimension( nDimensionIndex, nAxisIndex ) ); - bool bAddAxis = true; - if( xAxis.is() ) - { - if( bOnlyVisible ) - { - Reference< beans::XPropertySet > xAxisProp( xAxis, uno::UNO_QUERY ); - if( !xAxisProp.is() || - !(xAxisProp->getPropertyValue( C2U("Show")) >>= bAddAxis) ) - bAddAxis = false; - } - if( bAddAxis ) - aAxisVector.push_back( xAxis ); - } - } - catch( const uno::Exception & ex ) - { - ASSERT_EXCEPTION( ex ); - } - } - } - } - } - - return aAxisVector; -} - -Sequence< Reference< XAxis > > AxisHelper::getAllAxesOfDiagram( - const Reference< XDiagram >& xDiagram - , bool bOnlyVisible ) -{ - std::vector< Reference< XAxis > > aAxisVector; - - Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY ); - if(xCooSysContainer.is()) - { - Sequence< Reference< XCoordinateSystem > > aCooSysList = xCooSysContainer->getCoordinateSystems(); - sal_Int32 nC = 0; - for( nC=0; nC<aCooSysList.getLength(); ++nC ) - { - std::vector< Reference< XAxis > > aAxesPerCooSys( AxisHelper::getAllAxesOfCoordinateSystem( aCooSysList[nC], bOnlyVisible ) ); - aAxisVector.insert( aAxisVector.end(), aAxesPerCooSys.begin(), aAxesPerCooSys.end() ); - } - } - - return ContainerHelper::ContainerToSequence( aAxisVector ); -} - -Sequence< Reference< beans::XPropertySet > > AxisHelper::getAllGrids( const Reference< XDiagram >& xDiagram ) -{ - Sequence< Reference< XAxis > > aAllAxes( AxisHelper::getAllAxesOfDiagram( xDiagram ) ); - std::vector< Reference< beans::XPropertySet > > aGridVector; - - sal_Int32 nA = 0; - for( nA=0; nA<aAllAxes.getLength(); ++nA ) - { - Reference< XAxis > xAxis( aAllAxes[nA] ); - if(!xAxis.is()) - continue; - Reference< beans::XPropertySet > xGridProperties( xAxis->getGridProperties() ); - if( xGridProperties.is() ) - aGridVector.push_back( xGridProperties ); - - Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() );; - sal_Int32 nSubGrid = 0; - for( nSubGrid = 0; nSubGrid < aSubGrids.getLength(); ++nSubGrid ) - { - Reference< beans::XPropertySet > xSubGrid( aSubGrids[nSubGrid] ); - if( xSubGrid.is() ) - aGridVector.push_back( xSubGrid ); - } - } - - return ContainerHelper::ContainerToSequence( aGridVector ); -} - -void AxisHelper::getAxisOrGridPossibilities( Sequence< sal_Bool >& rPossibilityList - , const Reference< XDiagram>& xDiagram, sal_Bool bAxis ) -{ - rPossibilityList.realloc(6); - - sal_Int32 nDimensionCount = DiagramHelper::getDimension( xDiagram ); - - //set possibilities: - sal_Int32 nIndex=0; - Reference< XChartType > xChartType = DiagramHelper::getChartTypeByIndex( xDiagram, 0 ); - for(nIndex=0;nIndex<3;nIndex++) - rPossibilityList[nIndex]=ChartTypeHelper::isSupportingMainAxis(xChartType,nDimensionCount,nIndex); - for(nIndex=3;nIndex<6;nIndex++) - if( bAxis ) - rPossibilityList[nIndex]=ChartTypeHelper::isSupportingSecondaryAxis(xChartType,nDimensionCount,nIndex-3); - else - rPossibilityList[nIndex] = rPossibilityList[nIndex-3]; -} - -bool AxisHelper::isSecondaryYAxisNeeded( const Reference< XCoordinateSystem >& xCooSys ) -{ - Reference< chart2::XChartTypeContainer > xCTCnt( xCooSys, uno::UNO_QUERY ); - if( xCTCnt.is() ) - { - Sequence< Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes() ); - for( sal_Int32 i=0; i<aChartTypes.getLength(); ++i ) - { - Reference< XDataSeriesContainer > xSeriesContainer( aChartTypes[i] , uno::UNO_QUERY ); - if( !xSeriesContainer.is() ) - continue; - - Sequence< Reference< XDataSeries > > aSeriesList( xSeriesContainer->getDataSeries() ); - for( sal_Int32 nS = aSeriesList.getLength(); nS-- ; ) - { - Reference< beans::XPropertySet > xProp( aSeriesList[nS], uno::UNO_QUERY ); - if(xProp.is()) - { - sal_Int32 nAttachedAxisIndex = 0; - if( ( xProp->getPropertyValue( C2U( "AttachedAxisIndex" ) ) >>= nAttachedAxisIndex ) && nAttachedAxisIndex>0 ) - return true; - } - } - } - } - return false; -} - -bool AxisHelper::shouldAxisBeDisplayed( const Reference< XAxis >& xAxis - , const Reference< XCoordinateSystem >& xCooSys ) -{ - bool bRet = false; - - if( xAxis.is() && xCooSys.is() ) - { - sal_Int32 nDimensionIndex=-1; - sal_Int32 nAxisIndex=-1; - if( AxisHelper::getIndicesForAxis( xAxis, xCooSys, nDimensionIndex, nAxisIndex ) ) - { - sal_Int32 nDimensionCount = xCooSys->getDimension(); - Reference< XChartType > xChartType( AxisHelper::getChartTypeByIndex( xCooSys, 0 ) ); - - bool bMainAxis = (nAxisIndex==MAIN_AXIS_INDEX); - if( bMainAxis ) - bRet = ChartTypeHelper::isSupportingMainAxis(xChartType,nDimensionCount,nDimensionIndex); - else - bRet = ChartTypeHelper::isSupportingSecondaryAxis(xChartType,nDimensionCount,nDimensionIndex); - } - } - - return bRet; -} - -void AxisHelper::getAxisOrGridExcistence( Sequence< sal_Bool >& rExistenceList - , const Reference< XDiagram>& xDiagram, sal_Bool bAxis ) -{ - rExistenceList.realloc(6); - - if(bAxis) - { - sal_Int32 nN; - Reference< XAxis > xAxis; - for(nN=0;nN<3;nN++) - rExistenceList[nN] = AxisHelper::isAxisShown( nN, true, xDiagram ); - for(nN=3;nN<6;nN++) - rExistenceList[nN] = AxisHelper::isAxisShown( nN%3, false, xDiagram ); - } - else - { - sal_Int32 nN; - - for(nN=0;nN<3;nN++) - rExistenceList[nN] = AxisHelper::isGridShown( nN, 0, true, xDiagram ); - for(nN=3;nN<6;nN++) - rExistenceList[nN] = AxisHelper::isGridShown( nN%3, 0, false, xDiagram ); - } -} - -bool AxisHelper::changeVisibilityOfAxes( const Reference< XDiagram >& xDiagram - , const Sequence< sal_Bool >& rOldExistenceList - , const Sequence< sal_Bool >& rNewExistenceList - , const Reference< uno::XComponentContext >& xContext - , ReferenceSizeProvider * pRefSizeProvider ) -{ - bool bChanged = false; - for(sal_Int32 nN=0;nN<6;nN++) - { - if(rOldExistenceList[nN]!=rNewExistenceList[nN]) - { - bChanged = true; - if(rNewExistenceList[nN]) - { - AxisHelper::showAxis( nN%3, nN<3, xDiagram, xContext, pRefSizeProvider ); - } - else - AxisHelper::hideAxis( nN%3, nN<3, xDiagram ); - } - } - return bChanged; -} - -bool AxisHelper::changeVisibilityOfGrids( const Reference< XDiagram >& xDiagram - , const Sequence< sal_Bool >& rOldExistenceList - , const Sequence< sal_Bool >& rNewExistenceList - , const Reference< uno::XComponentContext >& xContext ) -{ - bool bChanged = false; - for(sal_Int32 nN=0;nN<6;nN++) - { - if(rOldExistenceList[nN]!=rNewExistenceList[nN]) - { - bChanged = true; - if(rNewExistenceList[nN]) - AxisHelper::showGrid( nN%3, 0, nN<3, xDiagram, xContext ); - else - AxisHelper::hideGrid( nN%3, 0, nN<3, xDiagram ); - } - } - return bChanged; -} - -Reference< XCoordinateSystem > AxisHelper::getCoordinateSystemOfAxis( - const Reference< XAxis >& xAxis - , const Reference< XDiagram >& xDiagram ) -{ - Reference< XCoordinateSystem > xRet; - - Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY ); - if( xCooSysContainer.is() ) - { - Reference< XCoordinateSystem > xCooSys; - Sequence< Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() ); - for( sal_Int32 nCooSysIndex = 0; nCooSysIndex < aCooSysList.getLength(); ++nCooSysIndex ) - { - xCooSys = aCooSysList[nCooSysIndex]; - std::vector< Reference< XAxis > > aAllAxis( AxisHelper::getAllAxesOfCoordinateSystem( xCooSys ) ); - - ::std::vector< Reference< XAxis > >::iterator aFound = - ::std::find( aAllAxis.begin(), aAllAxis.end(), xAxis ); - if( aFound != aAllAxis.end()) - { - xRet.set( xCooSys ); - break; - } - } - } - return xRet; -} - -Reference< XChartType > AxisHelper::getChartTypeByIndex( const Reference< XCoordinateSystem >& xCooSys, sal_Int32 nIndex ) -{ - Reference< XChartType > xChartType; - - Reference< XChartTypeContainer > xChartTypeContainer( xCooSys, uno::UNO_QUERY ); - if( xChartTypeContainer.is() ) - { - Sequence< Reference< XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() ); - if( nIndex >= 0 && nIndex < aChartTypeList.getLength() ) - xChartType.set( aChartTypeList[nIndex] ); - } - - return xChartType; -} - -void AxisHelper::setRTLAxisLayout( const Reference< XCoordinateSystem >& xCooSys ) -{ - if( xCooSys.is() ) - { - bool bCartesian = xCooSys->getViewServiceName().equals( CHART2_COOSYSTEM_CARTESIAN_VIEW_SERVICE_NAME ); - if( bCartesian ) - { - bool bVertical = false; - Reference< beans::XPropertySet > xCooSysProp( xCooSys, uno::UNO_QUERY ); - if( xCooSysProp.is() ) - xCooSysProp->getPropertyValue( C2U("SwapXAndYAxis") ) >>= bVertical; - - sal_Int32 nHorizontalAxisDimension = bVertical ? 1 : 0; - sal_Int32 nVerticalAxisDimension = bVertical ? 0 : 1; - - try - { - //reverse direction for horizontal main axis - Reference< chart2::XAxis > xHorizontalMainAxis( AxisHelper::getAxis( nHorizontalAxisDimension, MAIN_AXIS_INDEX, xCooSys ) ); - if( xHorizontalMainAxis.is() ) - { - chart2::ScaleData aScale = xHorizontalMainAxis->getScaleData(); - aScale.Orientation = chart2::AxisOrientation_REVERSE; - xHorizontalMainAxis->setScaleData(aScale); - } - - //mathematical direction for vertical main axis - Reference< chart2::XAxis > xVerticalMainAxis( AxisHelper::getAxis( nVerticalAxisDimension, MAIN_AXIS_INDEX, xCooSys ) ); - if( xVerticalMainAxis.is() ) - { - chart2::ScaleData aScale = xVerticalMainAxis->getScaleData(); - aScale.Orientation = chart2::AxisOrientation_MATHEMATICAL; - xVerticalMainAxis->setScaleData(aScale); - } - } - catch( uno::Exception & ex ) - { - ASSERT_EXCEPTION( ex ); - } - - try - { - //reverse direction for horizontal secondary axis - Reference< chart2::XAxis > xHorizontalSecondaryAxis( AxisHelper::getAxis( nHorizontalAxisDimension, SECONDARY_AXIS_INDEX, xCooSys ) ); - if( xHorizontalSecondaryAxis.is() ) - { - chart2::ScaleData aScale = xHorizontalSecondaryAxis->getScaleData(); - aScale.Orientation = chart2::AxisOrientation_REVERSE; - xHorizontalSecondaryAxis->setScaleData(aScale); - } - - //mathematical direction for vertical secondary axis - Reference< chart2::XAxis > xVerticalSecondaryAxis( AxisHelper::getAxis( nVerticalAxisDimension, SECONDARY_AXIS_INDEX, xCooSys ) ); - if( xVerticalSecondaryAxis.is() ) - { - chart2::ScaleData aScale = xVerticalSecondaryAxis->getScaleData(); - aScale.Orientation = chart2::AxisOrientation_MATHEMATICAL; - xVerticalSecondaryAxis->setScaleData(aScale); - } - } - catch( uno::Exception & ex ) - { - ASSERT_EXCEPTION( ex ); - } - } - } -} - -Reference< XChartType > AxisHelper::getFirstChartTypeWithSeriesAttachedToAxisIndex( const Reference< chart2::XDiagram >& xDiagram, const sal_Int32 nAttachedAxisIndex ) -{ - Reference< XChartType > xChartType; - ::std::vector< Reference< XDataSeries > > aSeriesVector( DiagramHelper::getDataSeriesFromDiagram( xDiagram ) ); - ::std::vector< Reference< XDataSeries > >::const_iterator aIter = aSeriesVector.begin(); - for( ; aIter != aSeriesVector.end(); ++aIter ) - { - sal_Int32 nCurrentIndex = DataSeriesHelper::getAttachedAxisIndex( *aIter ); - if( nAttachedAxisIndex == nCurrentIndex ) - { - xChartType = DiagramHelper::getChartTypeOfSeries( xDiagram, *aIter ); - if(xChartType.is()) - break; - } - } - return xChartType; -} - -bool AxisHelper::isAxisPositioningEnabled() -{ - const SvtSaveOptions::ODFDefaultVersion nCurrentVersion( SvtSaveOptions().GetODFDefaultVersion() ); - return nCurrentVersion >= SvtSaveOptions::ODFVER_012; -} - -//............................................................................. -} //namespace chart -//............................................................................. - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |