1*63bba73cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*63bba73cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*63bba73cSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*63bba73cSAndrew Rist * distributed with this work for additional information 6*63bba73cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*63bba73cSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*63bba73cSAndrew Rist * "License"); you may not use this file except in compliance 9*63bba73cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*63bba73cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*63bba73cSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*63bba73cSAndrew Rist * software distributed under the License is distributed on an 15*63bba73cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*63bba73cSAndrew Rist * KIND, either express or implied. See the License for the 17*63bba73cSAndrew Rist * specific language governing permissions and limitations 18*63bba73cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*63bba73cSAndrew Rist *************************************************************/ 21*63bba73cSAndrew Rist 22*63bba73cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "SchXMLSeriesHelper.hxx" 28cdf0e10cSrcweir #include <com/sun/star/chart2/XChartDocument.hpp> 29cdf0e10cSrcweir #include <com/sun/star/chart2/XChartTypeContainer.hpp> 30cdf0e10cSrcweir #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp> 31cdf0e10cSrcweir #include <com/sun/star/chart2/XDataSeriesContainer.hpp> 32cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp> 33cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 34cdf0e10cSrcweir 35cdf0e10cSrcweir // header for define RTL_CONSTASCII_USTRINGPARAM 36cdf0e10cSrcweir #include <rtl/ustring.h> 37cdf0e10cSrcweir // header for define DBG_ERROR1 38cdf0e10cSrcweir #include <tools/debug.hxx> 39cdf0e10cSrcweir 40cdf0e10cSrcweir #include <typeinfo> 41cdf0e10cSrcweir 42cdf0e10cSrcweir using namespace ::com::sun::star; 43cdf0e10cSrcweir using ::rtl::OUString; 44cdf0e10cSrcweir using ::rtl::OUStringToOString; 45cdf0e10cSrcweir 46cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 47cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 48cdf0e10cSrcweir using ::rtl::OUString; 49cdf0e10cSrcweir 50cdf0e10cSrcweir // ---------------------------------------- 51cdf0e10cSrcweir 52cdf0e10cSrcweir ::std::vector< Reference< chart2::XDataSeries > > 53cdf0e10cSrcweir SchXMLSeriesHelper::getDataSeriesFromDiagram( 54cdf0e10cSrcweir const Reference< chart2::XDiagram > & xDiagram ) 55cdf0e10cSrcweir { 56cdf0e10cSrcweir ::std::vector< Reference< chart2::XDataSeries > > aResult; 57cdf0e10cSrcweir 58cdf0e10cSrcweir try 59cdf0e10cSrcweir { 60cdf0e10cSrcweir Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( 61cdf0e10cSrcweir xDiagram, uno::UNO_QUERY_THROW ); 62cdf0e10cSrcweir Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( 63cdf0e10cSrcweir xCooSysCnt->getCoordinateSystems()); 64cdf0e10cSrcweir for( sal_Int32 i=0; i<aCooSysSeq.getLength(); ++i ) 65cdf0e10cSrcweir { 66cdf0e10cSrcweir Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[i], uno::UNO_QUERY_THROW ); 67cdf0e10cSrcweir Sequence< Reference< chart2::XChartType > > aChartTypeSeq( xCTCnt->getChartTypes()); 68cdf0e10cSrcweir for( sal_Int32 j=0; j<aChartTypeSeq.getLength(); ++j ) 69cdf0e10cSrcweir { 70cdf0e10cSrcweir Reference< chart2::XDataSeriesContainer > xDSCnt( aChartTypeSeq[j], uno::UNO_QUERY_THROW ); 71cdf0e10cSrcweir Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xDSCnt->getDataSeries() ); 72cdf0e10cSrcweir ::std::copy( aSeriesSeq.getConstArray(), aSeriesSeq.getConstArray() + aSeriesSeq.getLength(), 73cdf0e10cSrcweir ::std::back_inserter( aResult )); 74cdf0e10cSrcweir } 75cdf0e10cSrcweir } 76cdf0e10cSrcweir } 77cdf0e10cSrcweir catch( uno::Exception & ex ) 78cdf0e10cSrcweir { 79cdf0e10cSrcweir (void)ex; // avoid warning for pro build 80cdf0e10cSrcweir 81cdf0e10cSrcweir OSL_ENSURE( false, OUStringToOString( OUString( 82cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( "Exception caught. Type: " )) + 83cdf0e10cSrcweir OUString::createFromAscii( typeid( ex ).name()) + 84cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( ", Message: " )) + 85cdf0e10cSrcweir ex.Message), RTL_TEXTENCODING_ASCII_US ).getStr()); 86cdf0e10cSrcweir 87cdf0e10cSrcweir } 88cdf0e10cSrcweir 89cdf0e10cSrcweir return aResult; 90cdf0e10cSrcweir } 91cdf0e10cSrcweir 92cdf0e10cSrcweir ::std::map< Reference< chart2::XDataSeries >, sal_Int32 > SchXMLSeriesHelper::getDataSeriesIndexMapFromDiagram( 93cdf0e10cSrcweir const Reference< chart2::XDiagram > & xDiagram ) 94cdf0e10cSrcweir { 95cdf0e10cSrcweir ::std::map< Reference< chart2::XDataSeries >, sal_Int32 > aRet; 96cdf0e10cSrcweir 97cdf0e10cSrcweir sal_Int32 nIndex=0; 98cdf0e10cSrcweir 99cdf0e10cSrcweir ::std::vector< Reference< chart2::XDataSeries > > aSeriesVector( SchXMLSeriesHelper::getDataSeriesFromDiagram( xDiagram )); 100cdf0e10cSrcweir for( ::std::vector< Reference< chart2::XDataSeries > >::const_iterator aSeriesIt( aSeriesVector.begin() ) 101cdf0e10cSrcweir ; aSeriesIt != aSeriesVector.end() 102cdf0e10cSrcweir ; aSeriesIt++, nIndex++ ) 103cdf0e10cSrcweir { 104cdf0e10cSrcweir Reference< chart2::XDataSeries > xSeries( *aSeriesIt ); 105cdf0e10cSrcweir if( xSeries.is() ) 106cdf0e10cSrcweir { 107cdf0e10cSrcweir if( aRet.end() == aRet.find(xSeries) ) 108cdf0e10cSrcweir aRet[xSeries]=nIndex; 109cdf0e10cSrcweir } 110cdf0e10cSrcweir } 111cdf0e10cSrcweir return aRet; 112cdf0e10cSrcweir } 113cdf0e10cSrcweir 114cdf0e10cSrcweir uno::Reference< chart2::XChartType > lcl_getChartTypeOfSeries( 115cdf0e10cSrcweir const uno::Reference< chart2::XDiagram >& xDiagram 116cdf0e10cSrcweir , const Reference< chart2::XDataSeries >& xSeries ) 117cdf0e10cSrcweir { 118cdf0e10cSrcweir if(!xDiagram.is()) 119cdf0e10cSrcweir return 0; 120cdf0e10cSrcweir 121cdf0e10cSrcweir //iterate through the model to find the given xSeries 122cdf0e10cSrcweir //the found parent indicates the charttype 123cdf0e10cSrcweir 124cdf0e10cSrcweir //iterate through all coordinate systems 125cdf0e10cSrcweir uno::Reference< chart2::XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY ); 126cdf0e10cSrcweir if( !xCooSysContainer.is()) 127cdf0e10cSrcweir return 0; 128cdf0e10cSrcweir 129cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() ); 130cdf0e10cSrcweir for( sal_Int32 nCS = 0; nCS < aCooSysList.getLength(); ++nCS ) 131cdf0e10cSrcweir { 132cdf0e10cSrcweir uno::Reference< chart2::XCoordinateSystem > xCooSys( aCooSysList[nCS] ); 133cdf0e10cSrcweir 134cdf0e10cSrcweir //iterate through all chart types in the current coordinate system 135cdf0e10cSrcweir uno::Reference< chart2::XChartTypeContainer > xChartTypeContainer( xCooSys, uno::UNO_QUERY ); 136cdf0e10cSrcweir OSL_ASSERT( xChartTypeContainer.is()); 137cdf0e10cSrcweir if( !xChartTypeContainer.is() ) 138cdf0e10cSrcweir continue; 139cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() ); 140cdf0e10cSrcweir for( sal_Int32 nT = 0; nT < aChartTypeList.getLength(); ++nT ) 141cdf0e10cSrcweir { 142cdf0e10cSrcweir uno::Reference< chart2::XChartType > xChartType( aChartTypeList[nT] ); 143cdf0e10cSrcweir 144cdf0e10cSrcweir //iterate through all series in this chart type 145cdf0e10cSrcweir uno::Reference< chart2::XDataSeriesContainer > xDataSeriesContainer( xChartType, uno::UNO_QUERY ); 146cdf0e10cSrcweir OSL_ASSERT( xDataSeriesContainer.is()); 147cdf0e10cSrcweir if( !xDataSeriesContainer.is() ) 148cdf0e10cSrcweir continue; 149cdf0e10cSrcweir 150cdf0e10cSrcweir uno::Sequence< uno::Reference< chart2::XDataSeries > > aSeriesList( xDataSeriesContainer->getDataSeries() ); 151cdf0e10cSrcweir for( sal_Int32 nS = 0; nS < aSeriesList.getLength(); ++nS ) 152cdf0e10cSrcweir { 153cdf0e10cSrcweir Reference< chart2::XDataSeries > xCurrentSeries( aSeriesList[nS] ); 154cdf0e10cSrcweir 155cdf0e10cSrcweir if( xSeries == xCurrentSeries ) 156cdf0e10cSrcweir return xChartType; 157cdf0e10cSrcweir } 158cdf0e10cSrcweir } 159cdf0e10cSrcweir } 160cdf0e10cSrcweir return 0; 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir bool SchXMLSeriesHelper::isCandleStickSeries( 164cdf0e10cSrcweir const Reference< chart2::XDataSeries >& xSeries 165cdf0e10cSrcweir , const Reference< frame::XModel >& xChartModel ) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir bool bRet = false; 168cdf0e10cSrcweir 169cdf0e10cSrcweir uno::Reference< chart2::XChartDocument > xNewDoc( xChartModel, uno::UNO_QUERY ); 170cdf0e10cSrcweir if( xNewDoc.is() ) 171cdf0e10cSrcweir { 172cdf0e10cSrcweir uno::Reference< chart2::XDiagram > xNewDiagram( xNewDoc->getFirstDiagram() ); 173cdf0e10cSrcweir if( xNewDiagram.is() ) 174cdf0e10cSrcweir { 175cdf0e10cSrcweir uno::Reference< chart2::XChartType > xChartType( lcl_getChartTypeOfSeries( 176cdf0e10cSrcweir xNewDiagram, xSeries ) ); 177cdf0e10cSrcweir if( xChartType.is() ) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir rtl::OUString aServiceName( xChartType->getChartType() ); 180cdf0e10cSrcweir if( aServiceName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.CandleStickChartType" ) ) ) ) 181cdf0e10cSrcweir bRet = true; 182cdf0e10cSrcweir } 183cdf0e10cSrcweir } 184cdf0e10cSrcweir } 185cdf0e10cSrcweir return bRet; 186cdf0e10cSrcweir } 187cdf0e10cSrcweir 188cdf0e10cSrcweir // static 189cdf0e10cSrcweir Reference< chart2::XDataSeries > SchXMLSeriesHelper::getFirstCandleStickSeries( 190cdf0e10cSrcweir const Reference< chart2::XDiagram > & xDiagram ) 191cdf0e10cSrcweir { 192cdf0e10cSrcweir Reference< chart2::XDataSeries > xResult; 193cdf0e10cSrcweir 194cdf0e10cSrcweir try 195cdf0e10cSrcweir { 196cdf0e10cSrcweir Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW ); 197cdf0e10cSrcweir Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems()); 198cdf0e10cSrcweir for( sal_Int32 nCooSysIdx=0; !xResult.is() && nCooSysIdx<aCooSysSeq.getLength(); ++nCooSysIdx ) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir Reference< chart2::XChartTypeContainer > xCTCnt( aCooSysSeq[nCooSysIdx], uno::UNO_QUERY_THROW ); 201cdf0e10cSrcweir Sequence< Reference< chart2::XChartType > > aCTSeq( xCTCnt->getChartTypes()); 202cdf0e10cSrcweir for( sal_Int32 nCTIdx=0; !xResult.is() && nCTIdx<aCTSeq.getLength(); ++nCTIdx ) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir if( aCTSeq[nCTIdx]->getChartType().equals( 205cdf0e10cSrcweir ::rtl::OUString::createFromAscii("com.sun.star.chart2.CandleStickChartType"))) 206cdf0e10cSrcweir { 207cdf0e10cSrcweir Reference< chart2::XDataSeriesContainer > xSeriesCnt( aCTSeq[nCTIdx], uno::UNO_QUERY_THROW ); 208cdf0e10cSrcweir Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xSeriesCnt->getDataSeries() ); 209cdf0e10cSrcweir if( aSeriesSeq.getLength()) 210cdf0e10cSrcweir xResult.set( aSeriesSeq[0] ); 211cdf0e10cSrcweir break; 212cdf0e10cSrcweir } 213cdf0e10cSrcweir } 214cdf0e10cSrcweir } 215cdf0e10cSrcweir } 216cdf0e10cSrcweir catch( const uno::Exception & ) 217cdf0e10cSrcweir { 218cdf0e10cSrcweir OSL_ENSURE( false, "Exception caught" ); 219cdf0e10cSrcweir } 220cdf0e10cSrcweir return xResult; 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir //static 224cdf0e10cSrcweir uno::Reference< beans::XPropertySet > SchXMLSeriesHelper::createOldAPISeriesPropertySet( 225cdf0e10cSrcweir const uno::Reference< chart2::XDataSeries >& xSeries 226cdf0e10cSrcweir , const uno::Reference< frame::XModel >& xChartModel ) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xRet; 229cdf0e10cSrcweir 230cdf0e10cSrcweir if( xSeries.is() ) 231cdf0e10cSrcweir { 232cdf0e10cSrcweir try 233cdf0e10cSrcweir { 234cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xFactory( xChartModel, uno::UNO_QUERY ); 235cdf0e10cSrcweir if( xFactory.is() ) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir xRet = uno::Reference< beans::XPropertySet >( xFactory->createInstance( 238cdf0e10cSrcweir OUString::createFromAscii( "com.sun.star.comp.chart2.DataSeriesWrapper" ) ), uno::UNO_QUERY ); 239cdf0e10cSrcweir Reference< lang::XInitialization > xInit( xRet, uno::UNO_QUERY ); 240cdf0e10cSrcweir if(xInit.is()) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir Sequence< uno::Any > aArguments(1); 243cdf0e10cSrcweir aArguments[0]=uno::makeAny(xSeries); 244cdf0e10cSrcweir xInit->initialize(aArguments); 245cdf0e10cSrcweir } 246cdf0e10cSrcweir } 247cdf0e10cSrcweir } 248cdf0e10cSrcweir catch( uno::Exception & rEx ) 249cdf0e10cSrcweir { 250cdf0e10cSrcweir (void)rEx; // avoid warning for pro build 251cdf0e10cSrcweir DBG_ERROR1( "Exception caught SchXMLSeriesHelper::createOldAPISeriesPropertySet: %s", 252cdf0e10cSrcweir OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() ); 253cdf0e10cSrcweir } 254cdf0e10cSrcweir } 255cdf0e10cSrcweir 256cdf0e10cSrcweir return xRet; 257cdf0e10cSrcweir } 258cdf0e10cSrcweir 259cdf0e10cSrcweir //static 260cdf0e10cSrcweir uno::Reference< beans::XPropertySet > SchXMLSeriesHelper::createOldAPIDataPointPropertySet( 261cdf0e10cSrcweir const uno::Reference< chart2::XDataSeries >& xSeries 262cdf0e10cSrcweir , sal_Int32 nPointIndex 263cdf0e10cSrcweir , const uno::Reference< frame::XModel >& xChartModel ) 264cdf0e10cSrcweir { 265cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xRet; 266cdf0e10cSrcweir 267cdf0e10cSrcweir if( xSeries.is() ) 268cdf0e10cSrcweir { 269cdf0e10cSrcweir try 270cdf0e10cSrcweir { 271cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xFactory( xChartModel, uno::UNO_QUERY ); 272cdf0e10cSrcweir if( xFactory.is() ) 273cdf0e10cSrcweir { 274cdf0e10cSrcweir xRet = uno::Reference< beans::XPropertySet >( xFactory->createInstance( 275cdf0e10cSrcweir OUString::createFromAscii( "com.sun.star.comp.chart2.DataSeriesWrapper" ) ), uno::UNO_QUERY ); 276cdf0e10cSrcweir Reference< lang::XInitialization > xInit( xRet, uno::UNO_QUERY ); 277cdf0e10cSrcweir if(xInit.is()) 278cdf0e10cSrcweir { 279cdf0e10cSrcweir Sequence< uno::Any > aArguments(2); 280cdf0e10cSrcweir aArguments[0]=uno::makeAny(xSeries); 281cdf0e10cSrcweir aArguments[1]=uno::makeAny(nPointIndex); 282cdf0e10cSrcweir xInit->initialize(aArguments); 283cdf0e10cSrcweir } 284cdf0e10cSrcweir } 285cdf0e10cSrcweir } 286cdf0e10cSrcweir catch( uno::Exception & rEx ) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir (void)rEx; // avoid warning for pro build 289cdf0e10cSrcweir 290cdf0e10cSrcweir DBG_ERROR1( "Exception caught SchXMLSeriesHelper::createOldAPIDataPointPropertySet: %s", 291cdf0e10cSrcweir OUStringToOString( rEx.Message, RTL_TEXTENCODING_ASCII_US ).getStr() ); 292cdf0e10cSrcweir } 293cdf0e10cSrcweir } 294cdf0e10cSrcweir 295cdf0e10cSrcweir return xRet; 296cdf0e10cSrcweir } 297cdf0e10cSrcweir 298