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