LibreOffice Module xmloff (master)  1
SchXMLSeriesHelper.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
21 #include <com/sun/star/chart2/XChartDocument.hpp>
22 #include <com/sun/star/chart2/XChartTypeContainer.hpp>
23 #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
24 #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
25 #include <com/sun/star/lang/XInitialization.hpp>
26 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
27 
28 #include <sal/log.hxx>
29 #include <tools/diagnose_ex.h>
30 
31 using namespace ::com::sun::star;
32 
33 using ::com::sun::star::uno::Reference;
34 using ::com::sun::star::uno::Sequence;
35 
36 ::std::vector< Reference< chart2::XDataSeries > >
38  const Reference< chart2::XDiagram > & xDiagram )
39 {
40  ::std::vector< Reference< chart2::XDataSeries > > aResult;
41 
42  try
43  {
44  Reference< chart2::XCoordinateSystemContainer > xCooSysCnt(
45  xDiagram, uno::UNO_QUERY_THROW );
46  const Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq(
47  xCooSysCnt->getCoordinateSystems());
48  for( const auto& rCooSys : aCooSysSeq )
49  {
50  Reference< chart2::XChartTypeContainer > xCTCnt( rCooSys, uno::UNO_QUERY_THROW );
51  const Sequence< Reference< chart2::XChartType > > aChartTypeSeq( xCTCnt->getChartTypes());
52  for( const auto& rChartType : aChartTypeSeq )
53  {
54  Reference< chart2::XDataSeriesContainer > xDSCnt( rChartType, uno::UNO_QUERY_THROW );
55  const Sequence< Reference< chart2::XDataSeries > > aSeriesSeq( xDSCnt->getDataSeries() );
56  aResult.insert( aResult.end(), aSeriesSeq.begin(), aSeriesSeq.end() );
57  }
58  }
59  }
60  catch( const uno::Exception & )
61  {
62  DBG_UNHANDLED_EXCEPTION("xmloff.chart");
63  }
64 
65  return aResult;
66 }
67 
68 ::std::map< Reference< chart2::XDataSeries >, sal_Int32 > SchXMLSeriesHelper::getDataSeriesIndexMapFromDiagram(
69  const Reference< chart2::XDiagram > & xDiagram )
70 {
71  ::std::map< Reference< chart2::XDataSeries >, sal_Int32 > aRet;
72 
73  sal_Int32 nIndex=0;
74 
75  ::std::vector< Reference< chart2::XDataSeries > > aSeriesVector( SchXMLSeriesHelper::getDataSeriesFromDiagram( xDiagram ));
76  for( const Reference< chart2::XDataSeries >& xSeries : aSeriesVector )
77  {
78  if( xSeries.is() )
79  {
80  if( aRet.end() == aRet.find(xSeries) )
81  aRet[xSeries]=nIndex;
82  }
83  nIndex++;
84  }
85  return aRet;
86 }
87 
88 namespace {
89 uno::Reference< chart2::XChartType > lcl_getChartTypeOfSeries(
90  const uno::Reference< chart2::XDiagram >& xDiagram
91  , const Reference< chart2::XDataSeries >& xSeries )
92 {
93  if(!xDiagram.is())
94  return nullptr;
95 
96  //iterate through the model to find the given xSeries
97  //the found parent indicates the charttype
98 
99  //iterate through all coordinate systems
100  uno::Reference< chart2::XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY );
101  if( !xCooSysContainer.is())
102  return nullptr;
103 
104  const uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() );
105  for( const auto& xCooSys : aCooSysList )
106  {
107  //iterate through all chart types in the current coordinate system
108  uno::Reference< chart2::XChartTypeContainer > xChartTypeContainer( xCooSys, uno::UNO_QUERY );
109  SAL_WARN_IF( !xChartTypeContainer.is(), "xmloff.chart", "xChartTypeContainer is NULL");
110  if( !xChartTypeContainer.is() )
111  continue;
112  const uno::Sequence< uno::Reference< chart2::XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() );
113  for( const auto& xChartType : aChartTypeList )
114  {
115  //iterate through all series in this chart type
116  uno::Reference< chart2::XDataSeriesContainer > xDataSeriesContainer( xChartType, uno::UNO_QUERY );
117  SAL_WARN_IF( !xDataSeriesContainer.is(), "xmloff.chart", "xDataSeriesContainer is NULL");
118  if( !xDataSeriesContainer.is() )
119  continue;
120 
121  const uno::Sequence< uno::Reference< chart2::XDataSeries > > aSeriesList( xDataSeriesContainer->getDataSeries() );
122  if (std::find(aSeriesList.begin(), aSeriesList.end(), xSeries) != aSeriesList.end())
123  return xChartType;
124  }
125  }
126  return nullptr;
127 }
128 }
129 
131  const Reference< chart2::XDataSeries >& xSeries
132  , const Reference< frame::XModel >& xChartModel )
133 {
134  bool bRet = false;
135 
136  uno::Reference< chart2::XChartDocument > xNewDoc( xChartModel, uno::UNO_QUERY );
137  if( xNewDoc.is() )
138  {
139  uno::Reference< chart2::XDiagram > xNewDiagram( xNewDoc->getFirstDiagram() );
140  if( xNewDiagram.is() )
141  {
142  uno::Reference< chart2::XChartType > xChartType( lcl_getChartTypeOfSeries(
143  xNewDiagram, xSeries ) );
144  if( xChartType.is() )
145  {
146  OUString aServiceName( xChartType->getChartType() );
147  if( aServiceName == "com.sun.star.chart2.CandleStickChartType" )
148  bRet = true;
149  }
150  }
151  }
152  return bRet;
153 }
154 
155 //static
156 uno::Reference< beans::XPropertySet > SchXMLSeriesHelper::createOldAPISeriesPropertySet(
157  const uno::Reference< chart2::XDataSeries >& xSeries
158  , const uno::Reference< frame::XModel >& xChartModel )
159 {
160  uno::Reference< beans::XPropertySet > xRet;
161 
162  if( xSeries.is() )
163  {
164  try
165  {
166  uno::Reference< lang::XMultiServiceFactory > xFactory( xChartModel, uno::UNO_QUERY );
167  if( xFactory.is() )
168  {
169  xRet.set( xFactory->createInstance( "com.sun.star.comp.chart2.DataSeriesWrapper" ), uno::UNO_QUERY );
170  Reference< lang::XInitialization > xInit( xRet, uno::UNO_QUERY );
171  if(xInit.is())
172  {
173  xInit->initialize( { uno::Any(xSeries) });
174  }
175  }
176  }
177  catch( const uno::Exception & )
178  {
179  TOOLS_INFO_EXCEPTION("xmloff.chart", "Exception caught SchXMLSeriesHelper::createOldAPISeriesPropertySet" );
180  }
181  }
182 
183  return xRet;
184 }
185 
186 //static
187 uno::Reference< beans::XPropertySet > SchXMLSeriesHelper::createOldAPIDataPointPropertySet(
188  const uno::Reference< chart2::XDataSeries >& xSeries
189  , sal_Int32 nPointIndex
190  , const uno::Reference< frame::XModel >& xChartModel )
191 {
192  uno::Reference< beans::XPropertySet > xRet;
193 
194  if( xSeries.is() )
195  {
196  try
197  {
198  uno::Reference< lang::XMultiServiceFactory > xFactory( xChartModel, uno::UNO_QUERY );
199  if( xFactory.is() )
200  {
201  xRet.set( xFactory->createInstance( "com.sun.star.comp.chart2.DataSeriesWrapper" ), uno::UNO_QUERY );
202  Reference< lang::XInitialization > xInit( xRet, uno::UNO_QUERY );
203  if(xInit.is())
204  {
205  xInit->initialize({ uno::Any(xSeries), uno::Any(nPointIndex) });
206  }
207  }
208  }
209  catch( const uno::Exception & )
210  {
211  TOOLS_INFO_EXCEPTION("xmloff.chart", "Exception caught SchXMLSeriesHelper::createOldAPIDataPointPropertySet" );
212  }
213  }
214 
215  return xRet;
216 }
217 
218 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
sal_Int32 nIndex
static css::uno::Reference< css::beans::XPropertySet > createOldAPISeriesPropertySet(const css::uno::Reference< css::chart2::XDataSeries > &xSeries, const css::uno::Reference< css::frame::XModel > &xChartModel)
static bool isCandleStickSeries(const css::uno::Reference< css::chart2::XDataSeries > &xSeries, const css::uno::Reference< css::frame::XModel > &xChartModel)
#define DBG_UNHANDLED_EXCEPTION(...)
static css::uno::Reference< css::beans::XPropertySet > createOldAPIDataPointPropertySet(const css::uno::Reference< css::chart2::XDataSeries > &xSeries, sal_Int32 nPointIndex, const css::uno::Reference< css::frame::XModel > &xChartModel)
static::std::vector< css::uno::Reference< css::chart2::XDataSeries > > getDataSeriesFromDiagram(const css::uno::Reference< css::chart2::XDiagram > &xDiagram)
#define TOOLS_INFO_EXCEPTION(area, stream)
static::std::map< css::uno::Reference< css::chart2::XDataSeries >, sal_Int32 > getDataSeriesIndexMapFromDiagram(const css::uno::Reference< css::chart2::XDiagram > &xDiagram)
#define SAL_WARN_IF(condition, area, stream)
Reference< XSingleServiceFactory > xFactory