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 20 #ifndef INCLUDED_SC_INC_LINKUNO_HXX 21 #define INCLUDED_SC_INC_LINKUNO_HXX 22 23 #include <svl/lstner.hxx> 24 #include <svl/itemprop.hxx> 25 #include <com/sun/star/sheet/XDDELink.hpp> 26 #include <com/sun/star/sheet/XDDELinkResults.hpp> 27 #include <com/sun/star/sheet/XDDELinks.hpp> 28 #include <com/sun/star/sheet/XExternalDocLink.hpp> 29 #include <com/sun/star/sheet/XExternalDocLinks.hpp> 30 #include <com/sun/star/sheet/XExternalSheetCache.hpp> 31 #include <com/sun/star/sheet/XAreaLink.hpp> 32 #include <com/sun/star/sheet/XAreaLinks.hpp> 33 #include <com/sun/star/util/XRefreshable.hpp> 34 #include <com/sun/star/lang/XServiceInfo.hpp> 35 #include <com/sun/star/beans/XPropertySet.hpp> 36 #include <com/sun/star/container/XEnumerationAccess.hpp> 37 #include <com/sun/star/container/XNameAccess.hpp> 38 #include <com/sun/star/container/XIndexAccess.hpp> 39 #include <com/sun/star/container/XNamed.hpp> 40 #include <cppuhelper/implbase.hxx> 41 42 #include "externalrefmgr.hxx" 43 44 #include <vector> 45 46 class ScDocShell; 47 class ScTableLink; 48 49 typedef std::vector< css::uno::Reference< css::util::XRefreshListener > > XRefreshListenerArr_Impl; 50 51 class ScSheetLinkObj final : public cppu::WeakImplHelper< 52 css::container::XNamed, 53 css::util::XRefreshable, 54 css::beans::XPropertySet, 55 css::lang::XServiceInfo >, 56 public SfxListener 57 { 58 private: 59 SfxItemPropertySet const aPropSet; 60 ScDocShell* pDocShell; 61 OUString aFileName; 62 XRefreshListenerArr_Impl aRefreshListeners; 63 64 ScTableLink* GetLink_Impl() const; 65 void Refreshed_Impl(); 66 void ModifyRefreshDelay_Impl( sal_Int32 nRefresh ); 67 68 public: 69 ScSheetLinkObj(ScDocShell* pDocSh, const OUString& rName); 70 virtual ~ScSheetLinkObj() override; 71 72 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; 73 74 // XNamed 75 virtual OUString SAL_CALL getName() override; 76 virtual void SAL_CALL setName( const OUString& aName ) override; 77 78 // XRefreshable 79 virtual void SAL_CALL refresh() override; 80 virtual void SAL_CALL addRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override; 81 virtual void SAL_CALL removeRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override; 82 83 // XPropertySet 84 virtual css::uno::Reference< css::beans::XPropertySetInfo > 85 SAL_CALL getPropertySetInfo( ) override; 86 virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, 87 const css::uno::Any& aValue ) override; 88 virtual css::uno::Any SAL_CALL getPropertyValue( 89 const OUString& PropertyName ) override; 90 virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, 91 const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; 92 virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, 93 const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; 94 virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, 95 const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; 96 virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, 97 const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; 98 99 // called from get/setPropertyValue: 100 OUString getFileName() const; 101 void setFileName(const OUString& FileName); 102 OUString getFilter() const; 103 void setFilter(const OUString& Filter); 104 OUString getFilterOptions() const; 105 void setFilterOptions(const OUString& FilterOptions); 106 sal_Int32 getRefreshDelay() const; 107 void setRefreshDelay(sal_Int32 nRefreshDelay); 108 109 // XServiceInfo 110 virtual OUString SAL_CALL getImplementationName() override; 111 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; 112 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; 113 }; 114 115 class ScSheetLinksObj final : public cppu::WeakImplHelper< 116 css::container::XNameAccess, 117 css::container::XEnumerationAccess, 118 css::container::XIndexAccess, 119 css::lang::XServiceInfo >, 120 public SfxListener 121 { 122 private: 123 ScDocShell* pDocShell; 124 125 ScSheetLinkObj* GetObjectByIndex_Impl(sal_Int32 nIndex); 126 ScSheetLinkObj* GetObjectByName_Impl(const OUString& aName); 127 128 public: 129 ScSheetLinksObj(ScDocShell* pDocSh); 130 virtual ~ScSheetLinksObj() override; 131 132 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; 133 134 // XNameAccess 135 virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; 136 virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; 137 virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; 138 139 // XIndexAccess 140 virtual sal_Int32 SAL_CALL getCount() override; 141 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; 142 143 // XEnumerationAccess 144 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL 145 createEnumeration() override; 146 147 // XElementAccess 148 virtual css::uno::Type SAL_CALL getElementType() override; 149 virtual sal_Bool SAL_CALL hasElements() override; 150 151 // XServiceInfo 152 virtual OUString SAL_CALL getImplementationName() override; 153 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; 154 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; 155 }; 156 157 class ScAreaLinkObj final : public cppu::WeakImplHelper< 158 css::sheet::XAreaLink, 159 css::util::XRefreshable, 160 css::beans::XPropertySet, 161 css::lang::XServiceInfo >, 162 public SfxListener 163 { 164 private: 165 SfxItemPropertySet const aPropSet; 166 ScDocShell* pDocShell; 167 size_t const nPos; 168 XRefreshListenerArr_Impl aRefreshListeners; 169 170 void Modify_Impl( const OUString* pNewFile, const OUString* pNewFilter, 171 const OUString* pNewOptions, const OUString* pNewSource, 172 const css::table::CellRangeAddress* pNewDest ); 173 void ModifyRefreshDelay_Impl( sal_Int32 nRefresh ); 174 void Refreshed_Impl(); 175 176 public: 177 ScAreaLinkObj(ScDocShell* pDocSh, size_t nP); 178 virtual ~ScAreaLinkObj() override; 179 180 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; 181 182 // XRefreshable 183 virtual void SAL_CALL refresh() override; 184 virtual void SAL_CALL addRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override; 185 virtual void SAL_CALL removeRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override; 186 187 // XPropertySet 188 virtual css::uno::Reference< css::beans::XPropertySetInfo > 189 SAL_CALL getPropertySetInfo( ) override; 190 virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, 191 const css::uno::Any& aValue ) override; 192 virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; 193 virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, 194 const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener ) override; 195 virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, 196 const css::uno::Reference< css::beans::XPropertyChangeListener >& aListener ) override; 197 virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, 198 const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; 199 virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, 200 const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override; 201 202 // called from get/setPropertyValue: 203 OUString getFileName() const; 204 void setFileName(const OUString& FileName); 205 OUString getFilter() const; 206 void setFilter(const OUString& Filter); 207 OUString getFilterOptions() const; 208 void setFilterOptions(const OUString& FilterOptions); 209 sal_Int32 getRefreshDelay() const; 210 void setRefreshDelay(sal_Int32 nRefreshDelay); 211 212 // XAreaLink 213 virtual OUString SAL_CALL getSourceArea() override; 214 virtual void SAL_CALL setSourceArea( const OUString& aSourceArea ) override; 215 virtual css::table::CellRangeAddress SAL_CALL getDestArea() override; 216 virtual void SAL_CALL setDestArea( const css::table::CellRangeAddress& aDestArea ) override; 217 218 // XServiceInfo 219 virtual OUString SAL_CALL getImplementationName() override; 220 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; 221 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; 222 }; 223 224 class ScAreaLinksObj final : public cppu::WeakImplHelper< 225 css::sheet::XAreaLinks, 226 css::container::XEnumerationAccess, 227 css::lang::XServiceInfo >, 228 public SfxListener 229 { 230 private: 231 ScDocShell* pDocShell; 232 233 ScAreaLinkObj* GetObjectByIndex_Impl(sal_Int32 nIndex); 234 235 public: 236 ScAreaLinksObj(ScDocShell* pDocSh); 237 virtual ~ScAreaLinksObj() override; 238 239 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; 240 241 // XAreaLinks 242 virtual void SAL_CALL insertAtPosition( const css::table::CellAddress& aDestPos, 243 const OUString& aFileName, 244 const OUString& aSourceArea, 245 const OUString& aFilter, 246 const OUString& aFilterOptions ) override; 247 virtual void SAL_CALL removeByIndex( sal_Int32 nIndex ) override; 248 249 // XIndexAccess 250 virtual sal_Int32 SAL_CALL getCount() override; 251 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; 252 253 // XEnumerationAccess 254 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL 255 createEnumeration() override; 256 257 // XElementAccess 258 virtual css::uno::Type SAL_CALL getElementType() override; 259 virtual sal_Bool SAL_CALL hasElements() override; 260 261 // XServiceInfo 262 virtual OUString SAL_CALL getImplementationName() override; 263 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; 264 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; 265 }; 266 267 //! order of XNamed and DDELink changed to avoid "duplicate comdat" symbols 268 269 class ScDDELinkObj final : public cppu::WeakImplHelper< 270 css::sheet::XDDELink, 271 css::container::XNamed, 272 css::util::XRefreshable, 273 css::sheet::XDDELinkResults, 274 css::lang::XServiceInfo >, 275 public SfxListener 276 { 277 private: 278 ScDocShell* pDocShell; 279 OUString const aAppl; 280 OUString const aTopic; 281 OUString const aItem; 282 XRefreshListenerArr_Impl aRefreshListeners; 283 284 void Refreshed_Impl(); 285 286 public: 287 ScDDELinkObj(ScDocShell* pDocSh, const OUString& rA, 288 const OUString& rT, const OUString& rI); 289 virtual ~ScDDELinkObj() override; 290 291 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; 292 293 // XNamed 294 virtual OUString SAL_CALL getName() override; 295 virtual void SAL_CALL setName( const OUString& aName ) override; 296 297 // XDDELink 298 virtual OUString SAL_CALL getApplication() override; 299 virtual OUString SAL_CALL getTopic() override; 300 virtual OUString SAL_CALL getItem() override; 301 302 // XRefreshable 303 virtual void SAL_CALL refresh() override; 304 virtual void SAL_CALL addRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override; 305 virtual void SAL_CALL removeRefreshListener( const css::uno::Reference< css::util::XRefreshListener >& l ) override; 306 307 // XDDELinkResults 308 virtual css::uno::Sequence< css::uno::Sequence< css::uno::Any > > 309 SAL_CALL getResults( ) override; 310 virtual void SAL_CALL setResults( 311 const css::uno::Sequence< css::uno::Sequence< css::uno::Any > >& aResults ) override; 312 313 // XServiceInfo 314 virtual OUString SAL_CALL getImplementationName() override; 315 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; 316 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; 317 }; 318 319 class ScDDELinksObj final : public cppu::WeakImplHelper< 320 css::container::XEnumerationAccess, 321 css::container::XIndexAccess, 322 css::sheet::XDDELinks, 323 css::lang::XServiceInfo >, 324 public SfxListener 325 { 326 private: 327 ScDocShell* pDocShell; 328 329 ScDDELinkObj* GetObjectByIndex_Impl(sal_Int32 nIndex); 330 ScDDELinkObj* GetObjectByName_Impl(const OUString& aName); 331 332 public: 333 ScDDELinksObj(ScDocShell* pDocSh); 334 virtual ~ScDDELinksObj() override; 335 336 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; 337 338 // XNameAccess 339 virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; 340 virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; 341 virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; 342 343 // XIndexAccess 344 virtual sal_Int32 SAL_CALL getCount() override; 345 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) override; 346 347 // XEnumerationAccess 348 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL 349 createEnumeration() override; 350 351 // XElementAccess 352 virtual css::uno::Type SAL_CALL getElementType() override; 353 virtual sal_Bool SAL_CALL hasElements() override; 354 355 // XDDELinks 356 virtual css::uno::Reference< css::sheet::XDDELink > SAL_CALL addDDELink( 357 const OUString& aApplication, const OUString& aTopic, 358 const OUString& aItem, css::sheet::DDELinkMode nMode ) override; 359 360 // XServiceInfo 361 virtual OUString SAL_CALL getImplementationName() override; 362 virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; 363 virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; 364 }; 365 366 class ScExternalSheetCacheObj final : public cppu::WeakImplHelper< css::sheet::XExternalSheetCache > 367 { 368 public: 369 explicit ScExternalSheetCacheObj(ScDocShell* pDocShell, ScExternalRefCache::TableTypeRef const & pTable, size_t nIndex); 370 virtual ~ScExternalSheetCacheObj() override; 371 372 // XExternalSheetCache 373 virtual void SAL_CALL setCellValue( 374 sal_Int32 nCol, sal_Int32 nRow, const css::uno::Any& rAny) override; 375 376 virtual css::uno::Any SAL_CALL getCellValue(sal_Int32 nCol, sal_Int32 nRow) override; 377 378 virtual css::uno::Sequence< sal_Int32 > SAL_CALL getAllRows() override; 379 380 virtual css::uno::Sequence< sal_Int32 > SAL_CALL getAllColumns(sal_Int32 nRow) override; 381 382 // Attributes 383 virtual sal_Int32 SAL_CALL getTokenIndex() override; 384 385 private: 386 ScExternalSheetCacheObj(const ScExternalSheetCacheObj&) = delete; 387 388 private: 389 ScDocShell* mpDocShell; 390 ScExternalRefCache::TableTypeRef mpTable; 391 size_t const mnIndex; 392 }; 393 394 class ScExternalDocLinkObj final : public cppu::WeakImplHelper< css::sheet::XExternalDocLink > 395 { 396 public: 397 ScExternalDocLinkObj(ScDocShell* pDocShell, ScExternalRefManager* pRefMgr, sal_uInt16 nFileId); 398 virtual ~ScExternalDocLinkObj() override; 399 400 // XExternalDocLink 401 virtual css::uno::Reference< css::sheet::XExternalSheetCache > 402 SAL_CALL addSheetCache( const OUString& aSheetName, sal_Bool bDynamicCache ) override; 403 404 // XNameAccess 405 virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; 406 virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; 407 virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; 408 409 // XIndexAccess 410 virtual sal_Int32 SAL_CALL getCount() override; 411 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 nIndex ) override; 412 413 // XEnumerationAccess 414 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL 415 createEnumeration() override; 416 417 // XElementAccess 418 virtual css::uno::Type SAL_CALL getElementType() override; 419 virtual sal_Bool SAL_CALL hasElements() override; 420 421 // Attributes 422 virtual sal_Int32 SAL_CALL getTokenIndex() override; 423 424 private: 425 ScDocShell* const mpDocShell; 426 ScExternalRefManager* mpRefMgr; 427 sal_uInt16 const mnFileId; 428 }; 429 430 /** This is the UNO API equivalent of ScExternalRefManager. */ 431 class ScExternalDocLinksObj final : public cppu::WeakImplHelper< css::sheet::XExternalDocLinks > 432 { 433 public: 434 ScExternalDocLinksObj(ScDocShell* pDocShell); 435 virtual ~ScExternalDocLinksObj() override; 436 437 // XExternalDocLinks 438 virtual css::uno::Reference< css::sheet::XExternalDocLink > 439 SAL_CALL addDocLink( const OUString& aDocName ) override; 440 441 // XNameAccess 442 virtual css::uno::Any SAL_CALL getByName( const OUString& aName ) override; 443 virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override; 444 virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) override; 445 446 // XIndexAccess 447 virtual sal_Int32 SAL_CALL getCount() override; 448 virtual css::uno::Any SAL_CALL getByIndex( sal_Int32 nIndex ) override; 449 450 // XEnumerationAccess 451 virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL 452 createEnumeration() override; 453 454 // XElementAccess 455 virtual css::uno::Type SAL_CALL getElementType() override; 456 virtual sal_Bool SAL_CALL hasElements() override; 457 458 private: 459 ScExternalDocLinksObj(const ScExternalDocLinksObj&) = delete; 460 461 private: 462 ScDocShell* const mpDocShell; 463 ScExternalRefManager* mpRefMgr; 464 }; 465 466 #endif 467 468 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 469