|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_xmloff.hxx" | 
|  |  | 
|  | #include "SchXMLSeriesHelper.hxx" | 
|  | #include <com/sun/star/chart2/XChartDocument.hpp> | 
|  | #include <com/sun/star/chart2/XChartTypeContainer.hpp> | 
|  | #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp> | 
|  | #include <com/sun/star/chart2/XDataSeriesContainer.hpp> | 
|  | #include <com/sun/star/lang/XInitialization.hpp> | 
|  | #include <com/sun/star/lang/XMultiServiceFactory.hpp> | 
|  |  | 
|  | // header for define RTL_CONSTASCII_USTRINGPARAM | 
|  | #include <rtl/ustring.h> | 
|  | // header for define DBG_ERROR1 | 
|  | #include <tools/debug.hxx> | 
|  |  | 
|  | #include <typeinfo> | 
|  |  | 
|  | using namespace ::com::sun::star; | 
|  | using ::rtl::OUString; | 
|  | using ::rtl::OUStringToOString; | 
|  |  | 
|  | using ::com::sun::star::uno::Reference; | 
|  | using ::com::sun::star::uno::Sequence; | 
|  | using ::rtl::OUString; | 
|  |  | 
|  | // ---------------------------------------- | 
|  |  | 
|  | ::std::vector< Reference< chart2::XDataSeries > > | 
|  | SchXMLSeriesHelper::getDataSeriesFromDiagram( | 
|  | const Reference< chart2::XDiagram > & xDiagram ) | 
|  | { | 
|  | ::std::vector< Reference< chart2::XDataSeries > > aResult; | 
|  |  | 
|  | try | 
|  | { | 
|  | Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( | 
|  | xDiagram, uno::UNO_QUERY_THROW ); | 
|  | Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( | 
|  | xCooSysCnt->getCoordinateSystems()); | 
|  | for( sal_Int32 i=0; i<aCooSysSeq.getLength(); ++i ) | 
|  | { | 
|  | Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[i], uno::UNO_QUERY_THROW ); | 
|  | Sequence< Reference< chart2::XChartType > > aChartTypeSeq( xCTCnt->getChartTypes()); | 
|  | for( sal_Int32 j=0; j<aChartTypeSeq.getLength(); ++j ) | 
|  | { | 
|  | Reference< chart2::XDataSeriesContainer > xDSCnt( aChartTypeSeq[j], uno::UNO_QUERY_THROW ); | 
|  | Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xDSCnt->getDataSeries() ); | 
|  | ::std::copy( aSeriesSeq.getConstArray(), aSeriesSeq.getConstArray() + aSeriesSeq.getLength(), | 
|  | ::std::back_inserter( aResult )); | 
|  | } | 
|  | } | 
|  | } | 
|  | catch( uno::Exception & ex ) | 
|  | { | 
|  | (void)ex; // avoid warning for pro build | 
|  |  | 
|  | OSL_ENSURE( false, OUStringToOString( OUString( | 
|  | OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught. Type: " )) + | 
|  | OUString::createFromAscii( typeid( ex ).name()) + | 
|  | OUString( RTL_CONSTASCII_USTRINGPARAM( ", Message: " )) + | 
|  | ex.Message), RTL_TEXTENCODING_ASCII_US ).getStr()); | 
|  |  | 
|  | } | 
|  |  | 
|  | return aResult; | 
|  | } | 
|  |  | 
|  | ::std::map< Reference< chart2::XDataSeries >, sal_Int32 > SchXMLSeriesHelper::getDataSeriesIndexMapFromDiagram( | 
|  | const Reference< chart2::XDiagram > & xDiagram ) | 
|  | { | 
|  | ::std::map< Reference< chart2::XDataSeries >, sal_Int32 > aRet; | 
|  |  | 
|  | sal_Int32 nIndex=0; | 
|  |  | 
|  | ::std::vector< Reference< chart2::XDataSeries > > aSeriesVector( SchXMLSeriesHelper::getDataSeriesFromDiagram( xDiagram )); | 
|  | for( ::std::vector< Reference< chart2::XDataSeries > >::const_iterator aSeriesIt( aSeriesVector.begin() ) | 
|  | ; aSeriesIt != aSeriesVector.end() | 
|  | ; aSeriesIt++, nIndex++ ) | 
|  | { | 
|  | Reference< chart2::XDataSeries > xSeries( *aSeriesIt ); | 
|  | if( xSeries.is() ) | 
|  | { | 
|  | if( aRet.end() == aRet.find(xSeries) ) | 
|  | aRet[xSeries]=nIndex; | 
|  | } | 
|  | } | 
|  | return aRet; | 
|  | } | 
|  |  | 
|  | uno::Reference< chart2::XChartType > lcl_getChartTypeOfSeries( | 
|  | const uno::Reference< chart2::XDiagram >&   xDiagram | 
|  | , const Reference< chart2::XDataSeries >& xSeries ) | 
|  | { | 
|  | if(!xDiagram.is()) | 
|  | return 0; | 
|  |  | 
|  | //iterate through the model to find the given xSeries | 
|  | //the found parent indicates the charttype | 
|  |  | 
|  | //iterate through all coordinate systems | 
|  | uno::Reference< chart2::XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY ); | 
|  | if( !xCooSysContainer.is()) | 
|  | return 0; | 
|  |  | 
|  | uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() ); | 
|  | for( sal_Int32 nCS = 0; nCS < aCooSysList.getLength(); ++nCS ) | 
|  | { | 
|  | uno::Reference< chart2::XCoordinateSystem > xCooSys( aCooSysList[nCS] ); | 
|  |  | 
|  | //iterate through all chart types in the current coordinate system | 
|  | uno::Reference< chart2::XChartTypeContainer > xChartTypeContainer( xCooSys, uno::UNO_QUERY ); | 
|  | OSL_ASSERT( xChartTypeContainer.is()); | 
|  | if( !xChartTypeContainer.is() ) | 
|  | continue; | 
|  | uno::Sequence< uno::Reference< chart2::XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() ); | 
|  | for( sal_Int32 nT = 0; nT < aChartTypeList.getLength(); ++nT ) | 
|  | { | 
|  | uno::Reference< chart2::XChartType > xChartType( aChartTypeList[nT] ); | 
|  |  | 
|  | //iterate through all series in this chart type | 
|  | uno::Reference< chart2::XDataSeriesContainer > xDataSeriesContainer( xChartType, uno::UNO_QUERY ); | 
|  | OSL_ASSERT( xDataSeriesContainer.is()); | 
|  | if( !xDataSeriesContainer.is() ) | 
|  | continue; | 
|  |  | 
|  | uno::Sequence< uno::Reference< chart2::XDataSeries > > aSeriesList( xDataSeriesContainer->getDataSeries() ); | 
|  | for( sal_Int32 nS = 0; nS < aSeriesList.getLength(); ++nS ) | 
|  | { | 
|  | Reference< chart2::XDataSeries > xCurrentSeries( aSeriesList[nS] ); | 
|  |  | 
|  | if( xSeries == xCurrentSeries ) | 
|  | return xChartType; | 
|  | } | 
|  | } | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | bool SchXMLSeriesHelper::isCandleStickSeries( | 
|  | const Reference< chart2::XDataSeries >& xSeries | 
|  | , const Reference< frame::XModel >& xChartModel ) | 
|  | { | 
|  | bool bRet = false; | 
|  |  | 
|  | uno::Reference< chart2::XChartDocument > xNewDoc( xChartModel, uno::UNO_QUERY ); | 
|  | if( xNewDoc.is() ) | 
|  | { | 
|  | uno::Reference< chart2::XDiagram > xNewDiagram( xNewDoc->getFirstDiagram() ); | 
|  | if( xNewDiagram.is() ) | 
|  | { | 
|  | uno::Reference< chart2::XChartType > xChartType( lcl_getChartTypeOfSeries( | 
|  | xNewDiagram, xSeries ) ); | 
|  | if( xChartType.is() ) | 
|  | { | 
|  | rtl::OUString aServiceName( xChartType->getChartType() ); | 
|  | if( aServiceName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.CandleStickChartType" ) ) ) ) | 
|  | bRet = true; | 
|  | } | 
|  | } | 
|  | } | 
|  | return bRet; | 
|  | } | 
|  |  | 
|  | // static | 
|  | Reference< chart2::XDataSeries > SchXMLSeriesHelper::getFirstCandleStickSeries( | 
|  | const Reference< chart2::XDiagram > & xDiagram  ) | 
|  | { | 
|  | Reference< chart2::XDataSeries > xResult; | 
|  |  | 
|  | try | 
|  | { | 
|  | Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW ); | 
|  | Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems()); | 
|  | for( sal_Int32 nCooSysIdx=0; !xResult.is() && nCooSysIdx<aCooSysSeq.getLength(); ++nCooSysIdx ) | 
|  | { | 
|  | Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[nCooSysIdx], uno::UNO_QUERY_THROW ); | 
|  | Sequence< Reference< chart2::XChartType > > aCTSeq( xCTCnt->getChartTypes()); | 
|  | for( sal_Int32 nCTIdx=0; !xResult.is() && nCTIdx<aCTSeq.getLength(); ++nCTIdx ) | 
|  | { | 
|  | if( aCTSeq[nCTIdx]->getChartType().equals( | 
|  | ::rtl::OUString::createFromAscii("com.sun.star.chart2.CandleStickChartType"))) | 
|  | { | 
|  | Reference< chart2::XDataSeriesContainer > xSeriesCnt( aCTSeq[nCTIdx], uno::UNO_QUERY_THROW ); | 
|  | Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xSeriesCnt->getDataSeries() ); | 
|  | if( aSeriesSeq.getLength()) | 
|  | xResult.set( aSeriesSeq[0] ); | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | catch( const uno::Exception & ) | 
|  | { | 
|  | OSL_ENSURE( false, "Exception caught" ); | 
|  | } | 
|  | return xResult; | 
|  | } | 
|  |  | 
|  | //static | 
|  | uno::Reference< beans::XPropertySet > SchXMLSeriesHelper::createOldAPISeriesPropertySet( | 
|  | const uno::Reference< chart2::XDataSeries >& xSeries | 
|  | , const uno::Reference< frame::XModel >& xChartModel ) | 
|  | { | 
|  | uno::Reference< beans::XPropertySet > xRet; | 
|  |  | 
|  | if( xSeries.is() ) | 
|  | { | 
|  | try | 
|  | { | 
|  | uno::Reference< lang::XMultiServiceFactory > xFactory( xChartModel, uno::UNO_QUERY ); | 
|  | if( xFactory.is() ) | 
|  | { | 
|  | xRet = uno::Reference< beans::XPropertySet >( xFactory->createInstance( | 
|  | OUString::createFromAscii( "com.sun.star.comp.chart2.DataSeriesWrapper" ) ), uno::UNO_QUERY ); | 
|  | Reference< lang::XInitialization > xInit( xRet, uno::UNO_QUERY ); | 
|  | if(xInit.is()) | 
|  | { | 
|  | Sequence< uno::Any > aArguments(1); | 
|  | aArguments[0]=uno::makeAny(xSeries); | 
|  | xInit->initialize(aArguments); | 
|  | } | 
|  | } | 
|  | } | 
|  | catch( uno::Exception & rEx ) | 
|  | { | 
|  | (void)rEx; // avoid warning for pro build | 
|  | DBG_ERROR1( "Exception caught SchXMLSeriesHelper::createOldAPISeriesPropertySet: %s", | 
|  | OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() ); | 
|  | } | 
|  | } | 
|  |  | 
|  | return xRet; | 
|  | } | 
|  |  | 
|  | //static | 
|  | uno::Reference< beans::XPropertySet > SchXMLSeriesHelper::createOldAPIDataPointPropertySet( | 
|  | const uno::Reference< chart2::XDataSeries >& xSeries | 
|  | , sal_Int32 nPointIndex | 
|  | , const uno::Reference< frame::XModel >& xChartModel ) | 
|  | { | 
|  | uno::Reference< beans::XPropertySet > xRet; | 
|  |  | 
|  | if( xSeries.is() ) | 
|  | { | 
|  | try | 
|  | { | 
|  | uno::Reference< lang::XMultiServiceFactory > xFactory( xChartModel, uno::UNO_QUERY ); | 
|  | if( xFactory.is() ) | 
|  | { | 
|  | xRet = uno::Reference< beans::XPropertySet >( xFactory->createInstance( | 
|  | OUString::createFromAscii( "com.sun.star.comp.chart2.DataSeriesWrapper" ) ), uno::UNO_QUERY ); | 
|  | Reference< lang::XInitialization > xInit( xRet, uno::UNO_QUERY ); | 
|  | if(xInit.is()) | 
|  | { | 
|  | Sequence< uno::Any > aArguments(2); | 
|  | aArguments[0]=uno::makeAny(xSeries); | 
|  | aArguments[1]=uno::makeAny(nPointIndex); | 
|  | xInit->initialize(aArguments); | 
|  | } | 
|  | } | 
|  | } | 
|  | catch( uno::Exception & rEx ) | 
|  | { | 
|  | (void)rEx; // avoid warning for pro build | 
|  |  | 
|  | DBG_ERROR1( "Exception caught SchXMLSeriesHelper::createOldAPIDataPointPropertySet: %s", | 
|  | OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() ); | 
|  | } | 
|  | } | 
|  |  | 
|  | return xRet; | 
|  | } | 
|  |  |