xref: /trunk/main/sc/inc/chart2uno.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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