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 > >
getDataSeriesFromDiagram(const Reference<chart2::XDiagram> & xDiagram)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
getDataSeriesIndexMapFromDiagram(const Reference<chart2::XDiagram> & xDiagram)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
lcl_getChartTypeOfSeries(const uno::Reference<chart2::XDiagram> & xDiagram,const Reference<chart2::XDataSeries> & xSeries)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
isCandleStickSeries(const Reference<chart2::XDataSeries> & xSeries,const Reference<frame::XModel> & xChartModel)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
getFirstCandleStickSeries(const Reference<chart2::XDiagram> & xDiagram)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
createOldAPISeriesPropertySet(const uno::Reference<chart2::XDataSeries> & xSeries,const uno::Reference<frame::XModel> & xChartModel)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
createOldAPIDataPointPropertySet(const uno::Reference<chart2::XDataSeries> & xSeries,sal_Int32 nPointIndex,const uno::Reference<frame::XModel> & xChartModel)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