xref: /AOO41X/main/xmloff/source/chart/SchXMLSeriesHelper.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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