xref: /trunk/main/sc/inc/chartlis.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
1*38d50f7bSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*38d50f7bSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*38d50f7bSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*38d50f7bSAndrew Rist  * distributed with this work for additional information
6*38d50f7bSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*38d50f7bSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*38d50f7bSAndrew Rist  * "License"); you may not use this file except in compliance
9*38d50f7bSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*38d50f7bSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*38d50f7bSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*38d50f7bSAndrew Rist  * software distributed under the License is distributed on an
15*38d50f7bSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*38d50f7bSAndrew Rist  * KIND, either express or implied.  See the License for the
17*38d50f7bSAndrew Rist  * specific language governing permissions and limitations
18*38d50f7bSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*38d50f7bSAndrew Rist  *************************************************************/
21*38d50f7bSAndrew Rist 
22*38d50f7bSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef SC_CHARTLIS_HXX
25cdf0e10cSrcweir #define SC_CHARTLIS_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <vcl/timer.hxx>
29cdf0e10cSrcweir #include <svl/listener.hxx>
30cdf0e10cSrcweir #include "collect.hxx"
31cdf0e10cSrcweir #include "rangelst.hxx"
32cdf0e10cSrcweir #include "token.hxx"
33cdf0e10cSrcweir #include "externalrefmgr.hxx"
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <memory>
36cdf0e10cSrcweir #include <vector>
37cdf0e10cSrcweir #include <list>
38cdf0e10cSrcweir #include <hash_set>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir class ScDocument;
41cdf0e10cSrcweir class ScChartUnoData;
42cdf0e10cSrcweir #include <com/sun/star/chart/XChartData.hpp>
43cdf0e10cSrcweir #include <com/sun/star/chart/XChartDataChangeEventListener.hpp>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir class SC_DLLPUBLIC ScChartListener : public StrData, public SvtListener
46cdf0e10cSrcweir {
47cdf0e10cSrcweir public:
48cdf0e10cSrcweir     class ExternalRefListener : public ScExternalRefManager::LinkListener
49cdf0e10cSrcweir     {
50cdf0e10cSrcweir     public:
51cdf0e10cSrcweir         ExternalRefListener(ScChartListener& rParent, ScDocument* pDoc);
52cdf0e10cSrcweir         virtual ~ExternalRefListener();
53cdf0e10cSrcweir         virtual void notify(sal_uInt16 nFileId, ScExternalRefManager::LinkUpdateType eType);
54cdf0e10cSrcweir         void addFileId(sal_uInt16 nFileId);
55cdf0e10cSrcweir         void removeFileId(sal_uInt16 nFileId);
56cdf0e10cSrcweir         ::std::hash_set<sal_uInt16>& getAllFileIds();
57cdf0e10cSrcweir 
58cdf0e10cSrcweir     private:
59cdf0e10cSrcweir         ExternalRefListener();
60cdf0e10cSrcweir         ExternalRefListener(const ExternalRefListener& r);
61cdf0e10cSrcweir 
62cdf0e10cSrcweir         ScChartListener& mrParent;
63cdf0e10cSrcweir         ::std::hash_set<sal_uInt16> maFileIds;
64cdf0e10cSrcweir         ScDocument*                 mpDoc;
65cdf0e10cSrcweir     };
66cdf0e10cSrcweir 
67cdf0e10cSrcweir private:
68cdf0e10cSrcweir 
69cdf0e10cSrcweir     ::std::auto_ptr<ExternalRefListener>                mpExtRefListener;
70cdf0e10cSrcweir     ::std::auto_ptr< ::std::vector<ScSharedTokenRef> >  mpTokens;
71cdf0e10cSrcweir 
72cdf0e10cSrcweir     ScChartUnoData* pUnoData;
73cdf0e10cSrcweir     ScDocument*     pDoc;
74cdf0e10cSrcweir     sal_Bool            bUsed;  // fuer ScChartListenerCollection::FreeUnused
75cdf0e10cSrcweir     sal_Bool            bDirty;
76cdf0e10cSrcweir     sal_Bool            bSeriesRangesScheduled;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir                     // not implemented
79cdf0e10cSrcweir     ScChartListener& operator=( const ScChartListener& );
80cdf0e10cSrcweir 
81cdf0e10cSrcweir public:
82cdf0e10cSrcweir                     ScChartListener( const String& rName, ScDocument* pDoc,
83cdf0e10cSrcweir                                      const ScRange& rRange );
84cdf0e10cSrcweir                     ScChartListener( const String& rName, ScDocument* pDoc,
85cdf0e10cSrcweir                                      const ScRangeListRef& rRangeListRef );
86cdf0e10cSrcweir                     ScChartListener( const String& rName, ScDocument* pDoc,
87cdf0e10cSrcweir                                      ::std::vector<ScSharedTokenRef>* pTokens );
88cdf0e10cSrcweir                     ScChartListener( const ScChartListener& );
89cdf0e10cSrcweir     virtual         ~ScChartListener();
90cdf0e10cSrcweir     virtual ScDataObject*   Clone() const;
91cdf0e10cSrcweir 
92cdf0e10cSrcweir     void            SetUno( const com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener >& rListener,
93cdf0e10cSrcweir                             const com::sun::star::uno::Reference< com::sun::star::chart::XChartData >& rSource );
94cdf0e10cSrcweir     com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener >  GetUnoListener() const;
95cdf0e10cSrcweir     com::sun::star::uno::Reference< com::sun::star::chart::XChartData >                     GetUnoSource() const;
96cdf0e10cSrcweir 
IsUno() const97cdf0e10cSrcweir     sal_Bool            IsUno() const   { return (pUnoData != NULL); }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir     virtual void    Notify( SvtBroadcaster& rBC, const SfxHint& rHint );
100cdf0e10cSrcweir     void            StartListeningTo();
101cdf0e10cSrcweir     void            EndListeningTo();
102cdf0e10cSrcweir     void            ChangeListening( const ScRangeListRef& rRangeListRef,
103cdf0e10cSrcweir                                     sal_Bool bDirty = sal_False );
104cdf0e10cSrcweir     void            Update();
105cdf0e10cSrcweir     ScRangeListRef  GetRangeList() const;
106cdf0e10cSrcweir     void            SetRangeList( const ScRangeListRef& rNew );
107cdf0e10cSrcweir     void            SetRangeList( const ScRange& rNew );
IsUsed() const108cdf0e10cSrcweir     sal_Bool            IsUsed() const { return bUsed; }
SetUsed(sal_Bool bFlg)109cdf0e10cSrcweir     void            SetUsed( sal_Bool bFlg ) { bUsed = bFlg; }
IsDirty() const110cdf0e10cSrcweir     sal_Bool            IsDirty() const { return bDirty; }
SetDirty(sal_Bool bFlg)111cdf0e10cSrcweir     void            SetDirty( sal_Bool bFlg ) { bDirty = bFlg; }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     void            UpdateChartIntersecting( const ScRange& rRange );
114cdf0e10cSrcweir 
115cdf0e10cSrcweir     // if chart series ranges are to be updated later on (e.g. DeleteTab, InsertTab)
ScheduleSeriesRanges()116cdf0e10cSrcweir     void            ScheduleSeriesRanges()      { bSeriesRangesScheduled = sal_True; }
117cdf0e10cSrcweir     void            UpdateScheduledSeriesRanges();
118cdf0e10cSrcweir     void            UpdateSeriesRanges();
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     ExternalRefListener* GetExtRefListener();
121cdf0e10cSrcweir     void            SetUpdateQueue();
122cdf0e10cSrcweir 
123cdf0e10cSrcweir     sal_Bool            operator==( const ScChartListener& );
operator !=(const ScChartListener & r)124cdf0e10cSrcweir     sal_Bool            operator!=( const ScChartListener& r )
125cdf0e10cSrcweir                         { return !operator==( r ); }
126cdf0e10cSrcweir };
127cdf0e10cSrcweir 
128cdf0e10cSrcweir // ============================================================================
129cdf0e10cSrcweir 
130cdf0e10cSrcweir class ScChartHiddenRangeListener
131cdf0e10cSrcweir {
132cdf0e10cSrcweir public:
133cdf0e10cSrcweir     ScChartHiddenRangeListener();
134cdf0e10cSrcweir     virtual ~ScChartHiddenRangeListener();
135cdf0e10cSrcweir     virtual void notify() = 0;
136cdf0e10cSrcweir };
137cdf0e10cSrcweir 
138cdf0e10cSrcweir // ============================================================================
139cdf0e10cSrcweir 
140cdf0e10cSrcweir class ScChartListenerCollection : public ScStrCollection
141cdf0e10cSrcweir {
142cdf0e10cSrcweir public:
143cdf0e10cSrcweir     struct RangeListenerItem
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         ScRange                     maRange;
146cdf0e10cSrcweir         ScChartHiddenRangeListener* mpListener;
147cdf0e10cSrcweir         explicit RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p);
148cdf0e10cSrcweir     };
149cdf0e10cSrcweir 
150cdf0e10cSrcweir private:
151cdf0e10cSrcweir     ::std::list<RangeListenerItem> maHiddenListeners;
152cdf0e10cSrcweir 
153cdf0e10cSrcweir     Timer           aTimer;
154cdf0e10cSrcweir     ScDocument*     pDoc;
155cdf0e10cSrcweir 
156cdf0e10cSrcweir                     DECL_LINK( TimerHdl, Timer* );
157cdf0e10cSrcweir 
158cdf0e10cSrcweir                     // not implemented
159cdf0e10cSrcweir     ScChartListenerCollection& operator=( const ScChartListenerCollection& );
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     using ScStrCollection::operator==;
162cdf0e10cSrcweir 
163cdf0e10cSrcweir public:
164cdf0e10cSrcweir                     ScChartListenerCollection( ScDocument* pDoc );
165cdf0e10cSrcweir                     ScChartListenerCollection( const ScChartListenerCollection& );
166cdf0e10cSrcweir     virtual ScDataObject*   Clone() const;
167cdf0e10cSrcweir 
168cdf0e10cSrcweir     virtual         ~ScChartListenerCollection();
169cdf0e10cSrcweir 
170cdf0e10cSrcweir                     // nur nach copy-ctor noetig, wenn neu ins Dok gehaengt
171cdf0e10cSrcweir     void            StartAllListeners();
172cdf0e10cSrcweir 
173cdf0e10cSrcweir     void            ChangeListening( const String& rName,
174cdf0e10cSrcweir                                     const ScRangeListRef& rRangeListRef,
175cdf0e10cSrcweir                                     sal_Bool bDirty = sal_False );
176cdf0e10cSrcweir     // FreeUnused nur wie in ScDocument::UpdateChartListenerCollection verwenden!
177cdf0e10cSrcweir     void            FreeUnused();
178cdf0e10cSrcweir     void            FreeUno( const com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener >& rListener,
179cdf0e10cSrcweir                              const com::sun::star::uno::Reference< com::sun::star::chart::XChartData >& rSource );
180cdf0e10cSrcweir     void            StartTimer();
181cdf0e10cSrcweir     void            UpdateDirtyCharts();
182cdf0e10cSrcweir     void SC_DLLPUBLIC SetDirty();
183cdf0e10cSrcweir     void            SetDiffDirty( const ScChartListenerCollection&,
184cdf0e10cSrcweir                         sal_Bool bSetChartRangeLists = sal_False );
185cdf0e10cSrcweir 
186cdf0e10cSrcweir     void            SetRangeDirty( const ScRange& rRange );     // z.B. Zeilen/Spalten
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     void            UpdateScheduledSeriesRanges();
189cdf0e10cSrcweir     void            UpdateChartsContainingTab( SCTAB nTab );
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     sal_Bool            operator==( const ScChartListenerCollection& );
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     /**
194cdf0e10cSrcweir      * Start listening on hide/show change within specified cell range.  A
195cdf0e10cSrcweir      * single listener may listen on multiple ranges when the caller passes
196cdf0e10cSrcweir      * the same pointer multiple times with different ranges.
197cdf0e10cSrcweir      *
198cdf0e10cSrcweir      * Note that the caller is responsible for managing the life-cycle of the
199cdf0e10cSrcweir      * listener instance.
200cdf0e10cSrcweir      */
201cdf0e10cSrcweir     void            StartListeningHiddenRange( const ScRange& rRange,
202cdf0e10cSrcweir                                                ScChartHiddenRangeListener* pListener );
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     /**
205cdf0e10cSrcweir      * Remove all ranges associated with passed listener instance from the
206cdf0e10cSrcweir      * list of hidden range listeners.  This does not delete the passed
207cdf0e10cSrcweir      * listener instance.
208cdf0e10cSrcweir      */
209cdf0e10cSrcweir     void            EndListeningHiddenRange( ScChartHiddenRangeListener* pListener );
210cdf0e10cSrcweir };
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 
213cdf0e10cSrcweir #endif
214