1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chart2.hxx" 26 27 #include "WrappedStockProperties.hxx" 28 #include "macros.hxx" 29 #include "FastPropertyIdRanges.hxx" 30 #include "DiagramHelper.hxx" 31 #include "ChartModelHelper.hxx" 32 #include "ControllerLockGuard.hxx" 33 #include <com/sun/star/chart2/XChartDocument.hpp> 34 #include <com/sun/star/beans/PropertyAttribute.hpp> 35 36 using namespace ::com::sun::star; 37 using ::com::sun::star::uno::Any; 38 using ::com::sun::star::uno::Reference; 39 using ::com::sun::star::uno::Sequence; 40 using ::com::sun::star::beans::Property; 41 using ::rtl::OUString; 42 43 //............................................................................. 44 namespace chart 45 { 46 namespace wrapper 47 { 48 49 50 //----------------------------------------------------------------------------- 51 //----------------------------------------------------------------------------- 52 //----------------------------------------------------------------------------- 53 54 class WrappedStockProperty : public WrappedProperty 55 { 56 public: 57 explicit WrappedStockProperty( const ::rtl::OUString& rOuterName 58 , const ::com::sun::star::uno::Any& rDefaulValue 59 , ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ); 60 virtual ~WrappedStockProperty(); 61 62 void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const 63 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 64 65 ::com::sun::star::uno::Any getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& xInnerPropertyState ) const 66 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 67 68 virtual uno::Reference< chart2::XChartTypeTemplate > getNewTemplate( sal_Bool bNewValue, const rtl::OUString& rCurrentTemplate, const Reference< lang::XMultiServiceFactory >& xFactory ) const = 0; 69 70 protected: 71 ::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact; 72 mutable ::com::sun::star::uno::Any m_aOuterValue; 73 ::com::sun::star::uno::Any m_aDefaultValue; 74 }; 75 76 WrappedStockProperty::WrappedStockProperty( const ::rtl::OUString& rOuterName 77 , const ::com::sun::star::uno::Any& rDefaulValue 78 , ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) 79 : WrappedProperty(rOuterName,rtl::OUString()) 80 , m_spChart2ModelContact(spChart2ModelContact) 81 , m_aOuterValue() 82 , m_aDefaultValue(rDefaulValue) 83 { 84 } 85 WrappedStockProperty::~WrappedStockProperty() 86 { 87 } 88 89 void WrappedStockProperty::setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& /*xInnerPropertySet*/ ) const 90 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 91 { 92 sal_Bool bNewValue = false; 93 if( ! (rOuterValue >>= bNewValue) ) 94 throw lang::IllegalArgumentException( C2U("stock properties require type sal_Bool"), 0, 0 ); 95 96 m_aOuterValue = rOuterValue; 97 98 Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() ); 99 Reference< chart2::XDiagram > xDiagram( m_spChart2ModelContact->getChart2Diagram() ); 100 sal_Int32 nDimension = ::chart::DiagramHelper::getDimension( xDiagram ); 101 if( xChartDoc.is() && xDiagram.is() && nDimension==2 ) 102 { 103 Reference< lang::XMultiServiceFactory > xFactory( xChartDoc->getChartTypeManager(), uno::UNO_QUERY ); 104 DiagramHelper::tTemplateWithServiceName aTemplateAndService = 105 DiagramHelper::getTemplateForDiagram( xDiagram, xFactory ); 106 107 uno::Reference< chart2::XChartTypeTemplate > xTemplate = 108 getNewTemplate( bNewValue, aTemplateAndService.second, xFactory ); 109 110 if(xTemplate.is()) 111 { 112 try 113 { 114 // /-- locked controllers 115 ControllerLockGuard aCtrlLockGuard( m_spChart2ModelContact->getChartModel() ); 116 xTemplate->changeDiagram( xDiagram ); 117 // \-- locked controllers 118 } 119 catch( uno::Exception & ex ) 120 { 121 ASSERT_EXCEPTION( ex ); 122 } 123 } 124 } 125 } 126 127 ::com::sun::star::uno::Any WrappedStockProperty::getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& /*xInnerPropertyState*/ ) const 128 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 129 { 130 return m_aDefaultValue; 131 } 132 133 //------------------------------------------------------------------------------------- 134 //------------------------------------------------------------------------------------- 135 //------------------------------------------------------------------------------------- 136 137 class WrappedVolumeProperty : public WrappedStockProperty 138 { 139 public: 140 explicit WrappedVolumeProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ); 141 virtual ~WrappedVolumeProperty(); 142 143 ::com::sun::star::uno::Any getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const 144 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 145 146 uno::Reference< chart2::XChartTypeTemplate > getNewTemplate( sal_Bool bNewValue, const rtl::OUString& rCurrentTemplate, const Reference< lang::XMultiServiceFactory >& xFactory ) const; 147 }; 148 149 WrappedVolumeProperty::WrappedVolumeProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) 150 : WrappedStockProperty( C2U("Volume"), uno::makeAny(sal_False) , spChart2ModelContact ) 151 { 152 } 153 WrappedVolumeProperty::~WrappedVolumeProperty() 154 { 155 } 156 157 ::com::sun::star::uno::Any WrappedVolumeProperty::getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& /*xInnerPropertySet*/ ) const 158 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 159 { 160 Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() ); 161 Reference< chart2::XDiagram > xDiagram( m_spChart2ModelContact->getChart2Diagram() ); 162 if( xDiagram.is() && xChartDoc.is() ) 163 { 164 ::std::vector< uno::Reference< chart2::XDataSeries > > aSeriesVector( 165 DiagramHelper::getDataSeriesFromDiagram( xDiagram ) ); 166 if( aSeriesVector.size() > 0 ) 167 { 168 Reference< lang::XMultiServiceFactory > xFact( xChartDoc->getChartTypeManager(), uno::UNO_QUERY ); 169 DiagramHelper::tTemplateWithServiceName aTemplateAndService = 170 DiagramHelper::getTemplateForDiagram( xDiagram, xFact ); 171 172 if( aTemplateAndService.second.equals( C2U( "com.sun.star.chart2.template.StockVolumeLowHighClose" ) ) 173 || aTemplateAndService.second.equals( C2U( "com.sun.star.chart2.template.StockVolumeOpenLowHighClose" ) ) ) 174 m_aOuterValue <<= sal_Bool(sal_True); 175 else if( aTemplateAndService.second.getLength() || !m_aOuterValue.hasValue() ) 176 m_aOuterValue <<= sal_Bool(sal_False); 177 } 178 else if(!m_aOuterValue.hasValue()) 179 m_aOuterValue <<= sal_Bool(sal_False); 180 } 181 return m_aOuterValue; 182 } 183 184 uno::Reference< chart2::XChartTypeTemplate > WrappedVolumeProperty::getNewTemplate( sal_Bool bNewValue, const rtl::OUString& rCurrentTemplate, const Reference< lang::XMultiServiceFactory >& xFactory ) const 185 { 186 uno::Reference< chart2::XChartTypeTemplate > xTemplate(0); 187 188 if(!xFactory.is()) 189 return xTemplate; 190 191 if( bNewValue ) //add volume 192 { 193 if( rCurrentTemplate.equals( C2U( "com.sun.star.chart2.template.StockLowHighClose" ) ) ) 194 xTemplate.set( xFactory->createInstance( C2U( "com.sun.star.chart2.template.StockVolumeLowHighClose" ) ), uno::UNO_QUERY ); 195 else if( rCurrentTemplate.equals( C2U( "com.sun.star.chart2.template.StockOpenLowHighClose" ) ) ) 196 xTemplate.set( xFactory->createInstance( C2U( "com.sun.star.chart2.template.StockVolumeOpenLowHighClose" ) ), uno::UNO_QUERY ); 197 } 198 else //remove volume 199 { 200 if( rCurrentTemplate.equals( C2U( "com.sun.star.chart2.template.StockVolumeLowHighClose" ) ) ) 201 xTemplate.set( xFactory->createInstance( C2U( "com.sun.star.chart2.template.StockLowHighClose" ) ), uno::UNO_QUERY ); 202 else if( rCurrentTemplate.equals( C2U( "com.sun.star.chart2.template.StockVolumeOpenLowHighClose" ) ) ) 203 xTemplate.set( xFactory->createInstance( C2U( "com.sun.star.chart2.template.StockOpenLowHighClose" ) ), uno::UNO_QUERY ); 204 } 205 return xTemplate; 206 } 207 208 //------------------------------------------------------------------------------------- 209 //------------------------------------------------------------------------------------- 210 211 212 class WrappedUpDownProperty : public WrappedStockProperty 213 { 214 public: 215 explicit WrappedUpDownProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ); 216 virtual ~WrappedUpDownProperty(); 217 218 ::com::sun::star::uno::Any getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const 219 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 220 221 uno::Reference< chart2::XChartTypeTemplate > getNewTemplate( sal_Bool bNewValue, const rtl::OUString& rCurrentTemplate, const Reference< lang::XMultiServiceFactory >& xFactory ) const; 222 }; 223 WrappedUpDownProperty::WrappedUpDownProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) 224 : WrappedStockProperty( C2U("UpDown"), uno::makeAny(sal_False) , spChart2ModelContact ) 225 { 226 } 227 WrappedUpDownProperty::~WrappedUpDownProperty() 228 { 229 } 230 ::com::sun::star::uno::Any WrappedUpDownProperty::getPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& /*xInnerPropertySet*/ ) const 231 throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 232 { 233 Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() ); 234 Reference< chart2::XDiagram > xDiagram( m_spChart2ModelContact->getChart2Diagram() ); 235 if( xDiagram.is() && xChartDoc.is() ) 236 { 237 ::std::vector< uno::Reference< chart2::XDataSeries > > aSeriesVector( 238 DiagramHelper::getDataSeriesFromDiagram( xDiagram ) ); 239 if( aSeriesVector.size() > 0 ) 240 { 241 Reference< lang::XMultiServiceFactory > xFact( xChartDoc->getChartTypeManager(), uno::UNO_QUERY ); 242 DiagramHelper::tTemplateWithServiceName aTemplateAndService = 243 DiagramHelper::getTemplateForDiagram( xDiagram, xFact ); 244 245 if( aTemplateAndService.second.equals( C2U( "com.sun.star.chart2.template.StockOpenLowHighClose" ) ) 246 || aTemplateAndService.second.equals( C2U( "com.sun.star.chart2.template.StockVolumeOpenLowHighClose" ) ) ) 247 m_aOuterValue <<= sal_Bool(sal_True); 248 else if( aTemplateAndService.second.getLength() || !m_aOuterValue.hasValue() ) 249 m_aOuterValue <<= sal_Bool(sal_False); 250 } 251 else if(!m_aOuterValue.hasValue()) 252 m_aOuterValue <<= sal_Bool(sal_False); 253 } 254 return m_aOuterValue; 255 } 256 uno::Reference< chart2::XChartTypeTemplate > WrappedUpDownProperty::getNewTemplate( sal_Bool bNewValue, const rtl::OUString& rCurrentTemplate, const Reference< lang::XMultiServiceFactory >& xFactory ) const 257 { 258 uno::Reference< chart2::XChartTypeTemplate > xTemplate(0); 259 if( bNewValue ) //add open series 260 { 261 if( rCurrentTemplate.equals( C2U( "com.sun.star.chart2.template.StockLowHighClose" ) ) ) 262 xTemplate.set( xFactory->createInstance( C2U( "com.sun.star.chart2.template.StockOpenLowHighClose" ) ), uno::UNO_QUERY ); 263 else if( rCurrentTemplate.equals( C2U( "com.sun.star.chart2.template.StockVolumeLowHighClose" ) ) ) 264 xTemplate.set( xFactory->createInstance( C2U( "com.sun.star.chart2.template.StockVolumeOpenLowHighClose" ) ), uno::UNO_QUERY ); 265 } 266 else //remove open series 267 { 268 if( rCurrentTemplate.equals( C2U( "com.sun.star.chart2.template.StockOpenLowHighClose" ) ) ) 269 xTemplate.set( xFactory->createInstance( C2U( "com.sun.star.chart2.template.StockLowHighClose" ) ), uno::UNO_QUERY ); 270 else if( rCurrentTemplate.equals( C2U( "com.sun.star.chart2.template.StockVolumeOpenLowHighClose" ) ) ) 271 xTemplate.set( xFactory->createInstance( C2U( "com.sun.star.chart2.template.StockVolumeLowHighClose" ) ), uno::UNO_QUERY ); 272 } 273 return xTemplate; 274 } 275 276 namespace 277 { 278 enum 279 { 280 //spline properties 281 PROP_CHART_STOCK_VOLUME = FAST_PROPERTY_ID_START_CHART_STOCK_PROP 282 , PROP_CHART_STOCK_UPDOWN 283 }; 284 285 }//anonymous namespace 286 287 //----------------------------------------------------------------------------- 288 //----------------------------------------------------------------------------- 289 //----------------------------------------------------------------------------- 290 void WrappedStockProperties::addProperties( ::std::vector< Property > & rOutProperties ) 291 { 292 rOutProperties.push_back( 293 Property( C2U( "Volume" ), 294 PROP_CHART_STOCK_VOLUME, 295 ::getCppuType( reinterpret_cast< sal_Bool * >(0)), 296 beans::PropertyAttribute::BOUND 297 | beans::PropertyAttribute::MAYBEDEFAULT 298 | beans::PropertyAttribute::MAYBEVOID )); 299 rOutProperties.push_back( 300 Property( C2U( "UpDown" ), 301 PROP_CHART_STOCK_UPDOWN, 302 ::getCppuType( reinterpret_cast< sal_Bool * >(0)), 303 beans::PropertyAttribute::BOUND 304 | beans::PropertyAttribute::MAYBEDEFAULT 305 | beans::PropertyAttribute::MAYBEVOID )); 306 } 307 308 //----------------------------------------------------------------------------- 309 //----------------------------------------------------------------------------- 310 311 void WrappedStockProperties::addWrappedProperties( std::vector< WrappedProperty* >& rList 312 , ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) 313 { 314 rList.push_back( new WrappedVolumeProperty( spChart2ModelContact ) ); 315 rList.push_back( new WrappedUpDownProperty( spChart2ModelContact ) ); 316 } 317 318 //----------------------------------------------------------------------------- 319 //----------------------------------------------------------------------------- 320 //----------------------------------------------------------------------------- 321 322 } //namespace wrapper 323 } //namespace chart 324 //............................................................................. 325