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 #ifndef SC_CHART2UNO_HXX 25 #define SC_CHART2UNO_HXX 26 27 #include "cellsuno.hxx" // for XModifyListenerArr_Impl / ScLinkListener 28 #include "rangelst.hxx" 29 #include "externalrefmgr.hxx" 30 #include "token.hxx" 31 #include "chartlis.hxx" 32 33 #include <svl/lstner.hxx> 34 #include <com/sun/star/chart/ChartDataRowSource.hpp> 35 #include <com/sun/star/chart2/data/XDataProvider.hpp> 36 #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp> 37 #include <com/sun/star/chart2/data/XDataSource.hpp> 38 #include <com/sun/star/chart2/data/XDataSequence.hpp> 39 #include <com/sun/star/chart2/data/XTextualDataSequence.hpp> 40 #include <com/sun/star/chart2/data/XNumericalDataSequence.hpp> 41 #include <com/sun/star/chart2/data/XLabeledDataSequence.hpp> 42 #include <com/sun/star/chart2/data/DataSequenceRole.hpp> 43 #include <com/sun/star/lang/XServiceInfo.hpp> 44 #include <com/sun/star/beans/XPropertySet.hpp> 45 #include <com/sun/star/util/XCloneable.hpp> 46 #include <com/sun/star/util/XModifyBroadcaster.hpp> 47 // #ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_ 48 // #include <com/sun/star/lang/XUnoTunnel.hpp> 49 // #endif 50 #include <cppuhelper/implbase2.hxx> 51 #include <cppuhelper/implbase4.hxx> 52 #include <cppuhelper/implbase6.hxx> 53 #include <cppuhelper/implbase7.hxx> 54 #include <rtl/ustring.hxx> 55 #include <svl/itemprop.hxx> 56 57 #include <hash_set> 58 #include <list> 59 #include <vector> 60 #include <memory> 61 #include <boost/shared_ptr.hpp> 62 63 #define USE_CHART2_EMPTYDATASEQUENCE 0 64 65 class ScDocument; 66 67 // DataProvider ============================================================== 68 69 class ScChart2DataProvider : public 70 ::cppu::WeakImplHelper4< 71 ::com::sun::star::chart2::data::XDataProvider, 72 ::com::sun::star::chart2::data::XRangeXMLConversion, 73 ::com::sun::star::beans::XPropertySet, 74 ::com::sun::star::lang::XServiceInfo>, 75 SfxListener 76 { 77 public: 78 79 explicit ScChart2DataProvider( ScDocument* pDoc ); 80 virtual ~ScChart2DataProvider(); 81 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 82 83 // XDataProvider --------------------------------------------------------- 84 85 virtual ::sal_Bool SAL_CALL createDataSourcePossible( 86 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArguments ); 87 88 virtual ::com::sun::star::uno::Reference< 89 ::com::sun::star::chart2::data::XDataSource > SAL_CALL createDataSource( 90 const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArguments ); 91 92 virtual ::com::sun::star::uno::Sequence< 93 ::com::sun::star::beans::PropertyValue > SAL_CALL detectArguments( 94 const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSource >& xDataSource ); 95 96 virtual ::sal_Bool SAL_CALL createDataSequenceByRangeRepresentationPossible( 97 const ::rtl::OUString& aRangeRepresentation ); 98 99 virtual ::com::sun::star::uno::Reference< 100 ::com::sun::star::chart2::data::XDataSequence > SAL_CALL createDataSequenceByRangeRepresentation( 101 const ::rtl::OUString& aRangeRepresentation ); 102 103 virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XRangeSelection > SAL_CALL getRangeSelection(); 104 105 /* virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier > SAL_CALL getNumberFormatsSupplier() 106 throw (::com::sun::star::uno::RuntimeException);*/ 107 108 // XRangeXMLConversion --------------------------------------------------- 109 110 virtual ::rtl::OUString SAL_CALL convertRangeToXML( const ::rtl::OUString& sRangeRepresentation ); 111 112 virtual ::rtl::OUString SAL_CALL convertRangeFromXML( const ::rtl::OUString& sXMLRange ); 113 114 // XPropertySet ---------------------------------------------------------- 115 116 virtual ::com::sun::star::uno::Reference< 117 ::com::sun::star::beans::XPropertySetInfo> SAL_CALL 118 getPropertySetInfo(); 119 120 virtual void SAL_CALL setPropertyValue( 121 const ::rtl::OUString& rPropertyName, 122 const ::com::sun::star::uno::Any& rValue); 123 124 virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( 125 const ::rtl::OUString& rPropertyName); 126 127 virtual void SAL_CALL addPropertyChangeListener( 128 const ::rtl::OUString& rPropertyName, 129 const ::com::sun::star::uno::Reference< 130 ::com::sun::star::beans::XPropertyChangeListener>& xListener); 131 132 virtual void SAL_CALL removePropertyChangeListener( 133 const ::rtl::OUString& rPropertyName, 134 const ::com::sun::star::uno::Reference< 135 ::com::sun::star::beans::XPropertyChangeListener>& rListener); 136 137 virtual void SAL_CALL addVetoableChangeListener( 138 const ::rtl::OUString& rPropertyName, 139 const ::com::sun::star::uno::Reference< 140 ::com::sun::star::beans::XVetoableChangeListener>& rListener); 141 142 virtual void SAL_CALL removeVetoableChangeListener( 143 const ::rtl::OUString& rPropertyName, 144 const ::com::sun::star::uno::Reference< 145 ::com::sun::star::beans::XVetoableChangeListener>& rListener); 146 147 // XServiceInfo ---------------------------------------------------------- 148 149 virtual ::rtl::OUString SAL_CALL getImplementationName(); 150 151 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& 152 rServiceName); 153 154 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL 155 getSupportedServiceNames(); 156 157 private: 158 159 ScDocument* m_pDocument; 160 SfxItemPropertySet m_aPropSet; 161 sal_Bool m_bIncludeHiddenCells; 162 }; 163 164 165 // DataSource ================================================================ 166 167 class ScChart2DataSource : public 168 ::cppu::WeakImplHelper2< 169 ::com::sun::star::chart2::data::XDataSource, 170 ::com::sun::star::lang::XServiceInfo>, 171 SfxListener 172 { 173 public: 174 175 explicit ScChart2DataSource( ScDocument* pDoc); 176 virtual ~ScChart2DataSource(); 177 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 178 179 // XDataSource ----------------------------------------------------------- 180 181 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< 182 ::com::sun::star::chart2::data::XLabeledDataSequence > > SAL_CALL 183 getDataSequences(); 184 185 // XServiceInfo ---------------------------------------------------------- 186 187 virtual ::rtl::OUString SAL_CALL getImplementationName(); 188 189 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& 190 rServiceName); 191 192 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL 193 getSupportedServiceNames(); 194 195 // implementation 196 197 void AddLabeledSequence(const com::sun::star::uno::Reference < com::sun::star::chart2::data::XLabeledDataSequence >& xNew); 198 199 private: 200 201 ScDocument* m_pDocument; 202 typedef std::list < com::sun::star::uno::Reference< com::sun::star::chart2::data::XLabeledDataSequence > > LabeledList; 203 LabeledList m_aLabeledSequences; 204 205 }; 206 207 208 // DataSequence ============================================================== 209 210 class ScChart2DataSequence : public 211 ::cppu::WeakImplHelper7< 212 ::com::sun::star::chart2::data::XDataSequence, 213 ::com::sun::star::chart2::data::XTextualDataSequence, 214 ::com::sun::star::chart2::data::XNumericalDataSequence, 215 ::com::sun::star::util::XCloneable, 216 ::com::sun::star::util::XModifyBroadcaster, 217 ::com::sun::star::beans::XPropertySet, 218 // ::com::sun::star::lang::XUnoTunnel, 219 ::com::sun::star::lang::XServiceInfo>, 220 SfxListener 221 { 222 public: 223 explicit ScChart2DataSequence( ScDocument* pDoc, 224 const com::sun::star::uno::Reference< com::sun::star::chart2::data::XDataProvider >& xDP, 225 ::std::vector<ScSharedTokenRef>* pTokens, bool bIncludeHiddenCells ); 226 227 virtual ~ScChart2DataSequence(); 228 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 229 230 // XDataSequence --------------------------------------------------------- 231 232 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > 233 SAL_CALL getData(); 234 virtual ::rtl::OUString SAL_CALL getSourceRangeRepresentation(); 235 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > 236 SAL_CALL generateLabel(::com::sun::star::chart2::data::LabelOrigin nOrigin); 237 virtual ::sal_Int32 SAL_CALL getNumberFormatKeyByIndex( ::sal_Int32 nIndex ); 238 239 // XNumericalDataSequence -------------------------------------------------- 240 241 virtual ::com::sun::star::uno::Sequence< double > 242 SAL_CALL getNumericalData( ); 243 244 // XTextualDataSequence -------------------------------------------------- 245 246 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > 247 SAL_CALL getTextualData( ); 248 249 // XPropertySet ---------------------------------------------------------- 250 251 virtual ::com::sun::star::uno::Reference< 252 ::com::sun::star::beans::XPropertySetInfo> SAL_CALL 253 getPropertySetInfo(); 254 255 virtual void SAL_CALL setPropertyValue( 256 const ::rtl::OUString& rPropertyName, 257 const ::com::sun::star::uno::Any& rValue); 258 259 virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( 260 const ::rtl::OUString& rPropertyName); 261 262 virtual void SAL_CALL addPropertyChangeListener( 263 const ::rtl::OUString& rPropertyName, 264 const ::com::sun::star::uno::Reference< 265 ::com::sun::star::beans::XPropertyChangeListener>& xListener); 266 267 virtual void SAL_CALL removePropertyChangeListener( 268 const ::rtl::OUString& rPropertyName, 269 const ::com::sun::star::uno::Reference< 270 ::com::sun::star::beans::XPropertyChangeListener>& rListener); 271 272 virtual void SAL_CALL addVetoableChangeListener( 273 const ::rtl::OUString& rPropertyName, 274 const ::com::sun::star::uno::Reference< 275 ::com::sun::star::beans::XVetoableChangeListener>& rListener); 276 277 virtual void SAL_CALL removeVetoableChangeListener( 278 const ::rtl::OUString& rPropertyName, 279 const ::com::sun::star::uno::Reference< 280 ::com::sun::star::beans::XVetoableChangeListener>& rListener); 281 282 // XCloneable ------------------------------------------------------------ 283 284 virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone(); 285 286 // XModifyBroadcaster ---------------------------------------------------- 287 288 virtual void SAL_CALL addModifyListener( 289 const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ); 290 virtual void SAL_CALL removeModifyListener( 291 const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ); 292 293 // XServiceInfo ---------------------------------------------------------- 294 295 virtual ::rtl::OUString SAL_CALL getImplementationName(); 296 297 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& 298 rServiceName); 299 300 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL 301 getSupportedServiceNames(); 302 303 // XUnoTunnel ------------------------------------------------------------ 304 305 // virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< 306 // sal_Int8 >& aIdentifier ) 307 // throw(::com::sun::star::uno::RuntimeException); 308 309 // static const com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId(); 310 // static ScChart2DataSequence* getImplementation( const com::sun::star::uno::Reference< 311 // com::sun::star::uno::XInterface> xObj ); 312 313 private: 314 void setDataChangedHint(bool b); 315 316 // Implementation -------------------------------------------------------- 317 318 void RefChanged(); 319 DECL_LINK( ValueListenerHdl, SfxHint* ); 320 321 private: 322 ScChart2DataSequence(); // disabled 323 ScChart2DataSequence(const ScChart2DataSequence& r); // disabled 324 325 class ExternalRefListener : public ScExternalRefManager::LinkListener 326 { 327 public: 328 ExternalRefListener(ScChart2DataSequence& rParent, ScDocument* pDoc); 329 virtual ~ExternalRefListener(); 330 virtual void notify(sal_uInt16 nFileId, ScExternalRefManager::LinkUpdateType eType); 331 void addFileId(sal_uInt16 nFileId); 332 void removeFileId(sal_uInt16 nFileId); 333 const ::std::hash_set<sal_uInt16>& getAllFileIds(); 334 335 private: 336 ExternalRefListener(); 337 ExternalRefListener(const ExternalRefListener& r); 338 339 ScChart2DataSequence& mrParent; 340 ::std::hash_set<sal_uInt16> maFileIds; 341 ScDocument* mpDoc; 342 }; 343 344 /** 345 * Build an internal data array to cache the data ranges, and other 346 * information such as hidden values. 347 */ 348 void BuildDataCache(); 349 350 void RebuildDataCache(); 351 352 sal_Int32 FillCacheFromExternalRef(const ScSharedTokenRef& pToken); 353 354 void UpdateTokensFromRanges(const ScRangeList& rRanges); 355 356 ExternalRefListener* GetExtRefListener(); 357 358 void StopListeningToAllExternalRefs(); 359 360 void CopyData(const ScChart2DataSequence& r); 361 362 private: 363 364 // data array 365 struct Item 366 { 367 double mfValue; 368 ::rtl::OUString maString; 369 bool mbIsValue; 370 Item(); 371 }; 372 373 class HiddenRangeListener : public ScChartHiddenRangeListener 374 { 375 public: 376 HiddenRangeListener(ScChart2DataSequence& rParent); 377 virtual ~HiddenRangeListener(); 378 379 virtual void notify(); 380 381 private: 382 ScChart2DataSequence& mrParent; 383 }; 384 385 ::std::list<Item> m_aDataArray; 386 387 /** 388 * Cached data for getData. We may also need to cache data for the 389 * numerical and textural data series if they turn out to be bottlenecks 390 * under certain scenarios. 391 */ 392 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > m_aMixedDataCache; 393 394 ::com::sun::star::uno::Sequence<sal_Int32> m_aHiddenValues; 395 396 // properties 397 ::com::sun::star::chart2::data::DataSequenceRole m_aRole; 398 sal_Bool m_bIncludeHiddenCells; 399 400 // internals 401 typedef ::std::auto_ptr< ::std::vector<ScSharedTokenRef> > TokenListPtr; 402 typedef ::std::auto_ptr< ::std::vector<sal_uInt32> > RangeIndexMapPtr; 403 typedef ::std::auto_ptr<ExternalRefListener> ExtRefListenerPtr; 404 405 sal_Int64 m_nObjectId; 406 ScDocument* m_pDocument; 407 TokenListPtr m_pTokens; 408 RangeIndexMapPtr m_pRangeIndices; 409 ExtRefListenerPtr m_pExtRefListener; 410 com::sun::star::uno::Reference < com::sun::star::chart2::data::XDataProvider > m_xDataProvider; 411 SfxItemPropertySet m_aPropSet; 412 413 ::std::auto_ptr<HiddenRangeListener> m_pHiddenListener; 414 ScLinkListener* m_pValueListener; 415 XModifyListenerArr_Impl m_aValueListeners; 416 417 bool m_bGotDataChangedHint; 418 bool m_bExtDataRebuildQueued; 419 }; 420 421 #if USE_CHART2_EMPTYDATASEQUENCE 422 // DataSequence ============================================================== 423 424 class ScChart2EmptyDataSequence : public 425 ::cppu::WeakImplHelper6< 426 ::com::sun::star::chart2::data::XDataSequence, 427 ::com::sun::star::chart2::data::XTextualDataSequence, 428 ::com::sun::star::util::XCloneable, 429 ::com::sun::star::util::XModifyBroadcaster, 430 ::com::sun::star::beans::XPropertySet, 431 // ::com::sun::star::lang::XUnoTunnel, 432 ::com::sun::star::lang::XServiceInfo>, 433 SfxListener 434 { 435 public: 436 437 explicit ScChart2EmptyDataSequence( ScDocument* pDoc, 438 const com::sun::star::uno::Reference< com::sun::star::chart2::data::XDataProvider >& xDP, 439 const ScRangeListRef& rRangeList, sal_Bool bColumn ); 440 virtual ~ScChart2EmptyDataSequence(); 441 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 442 443 // XDataSequence --------------------------------------------------------- 444 445 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > 446 SAL_CALL getData(); 447 virtual ::rtl::OUString SAL_CALL getSourceRangeRepresentation(); 448 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > 449 SAL_CALL generateLabel(::com::sun::star::chart2::data::LabelOrigin nOrigin); 450 virtual ::sal_Int32 SAL_CALL getNumberFormatKeyByIndex( ::sal_Int32 nIndex ); 451 452 // XTextualDataSequence -------------------------------------------------- 453 454 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > 455 SAL_CALL getTextualData( ); 456 457 // XPropertySet ---------------------------------------------------------- 458 459 virtual ::com::sun::star::uno::Reference< 460 ::com::sun::star::beans::XPropertySetInfo> SAL_CALL 461 getPropertySetInfo(); 462 463 virtual void SAL_CALL setPropertyValue( 464 const ::rtl::OUString& rPropertyName, 465 const ::com::sun::star::uno::Any& rValue); 466 467 virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( 468 const ::rtl::OUString& rPropertyName); 469 470 virtual void SAL_CALL addPropertyChangeListener( 471 const ::rtl::OUString& rPropertyName, 472 const ::com::sun::star::uno::Reference< 473 ::com::sun::star::beans::XPropertyChangeListener>& xListener); 474 475 virtual void SAL_CALL removePropertyChangeListener( 476 const ::rtl::OUString& rPropertyName, 477 const ::com::sun::star::uno::Reference< 478 ::com::sun::star::beans::XPropertyChangeListener>& rListener); 479 480 virtual void SAL_CALL addVetoableChangeListener( 481 const ::rtl::OUString& rPropertyName, 482 const ::com::sun::star::uno::Reference< 483 ::com::sun::star::beans::XVetoableChangeListener>& rListener); 484 485 virtual void SAL_CALL removeVetoableChangeListener( 486 const ::rtl::OUString& rPropertyName, 487 const ::com::sun::star::uno::Reference< 488 ::com::sun::star::beans::XVetoableChangeListener>& rListener); 489 490 // XCloneable ------------------------------------------------------------ 491 492 virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone(); 493 494 // XModifyBroadcaster ---------------------------------------------------- 495 496 virtual void SAL_CALL addModifyListener( 497 const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ); 498 virtual void SAL_CALL removeModifyListener( 499 const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ); 500 501 // XServiceInfo ---------------------------------------------------------- 502 503 virtual ::rtl::OUString SAL_CALL getImplementationName(); 504 505 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& 506 rServiceName); 507 508 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString> SAL_CALL 509 getSupportedServiceNames(); 510 511 // XUnoTunnel ------------------------------------------------------------ 512 513 // virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< 514 // sal_Int8 >& aIdentifier ) 515 // throw(::com::sun::star::uno::RuntimeException); 516 517 // static const com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId(); 518 // static ScChart2DataSequence* getImplementation( const com::sun::star::uno::Reference< 519 // com::sun::star::uno::XInterface> xObj ); 520 521 // Implementation -------------------------------------------------------- 522 GetRangeList()523 ScRangeListRef GetRangeList() { return m_xRanges; } 524 525 private: 526 527 // properties 528 ::com::sun::star::chart2::data::DataSequenceRole m_aRole; 529 sal_Bool m_bIncludeHiddenCells; 530 // internals 531 ScRangeListRef m_xRanges; 532 ScDocument* m_pDocument; 533 com::sun::star::uno::Reference < com::sun::star::chart2::data::XDataProvider > m_xDataProvider; 534 SfxItemPropertySet m_aPropSet; 535 sal_Bool m_bColumn; // defines the orientation to create the right labels 536 537 }; 538 #endif 539 540 #endif // SC_CHART2UNO_HXX 541