xref: /trunk/main/sc/inc/chartlis.hxx (revision 38d50f7b)
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
10*38d50f7bSAndrew Rist  *
11*38d50f7bSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*38d50f7bSAndrew Rist  *
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.
19*38d50f7bSAndrew Rist  *
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
214cdf0e10cSrcweir 
215