update credits
[LibreOffice.git] / sc / inc / chartlis.hxx
blobded1f3cb79ac843bfec67704077b5bf431b9f80f
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef SC_CHARTLIS_HXX
21 #define SC_CHARTLIS_HXX
24 #include <vcl/timer.hxx>
25 #include <svl/listener.hxx>
26 #include "rangelst.hxx"
27 #include "token.hxx"
28 #include "externalrefmgr.hxx"
30 #include <memory>
31 #include <vector>
32 #include <list>
34 #include <boost/unordered_set.hpp>
35 #include <boost/scoped_ptr.hpp>
36 #include <boost/ptr_container/ptr_map.hpp>
38 class ScDocument;
39 class ScChartUnoData;
40 #include <com/sun/star/chart/XChartData.hpp>
41 #include <com/sun/star/chart/XChartDataChangeEventListener.hpp>
43 class SC_DLLPUBLIC ScChartListener : public SvtListener
45 public:
46 class ExternalRefListener : public ScExternalRefManager::LinkListener
48 public:
49 ExternalRefListener(ScChartListener& rParent, ScDocument* pDoc);
50 virtual ~ExternalRefListener();
51 virtual void notify(sal_uInt16 nFileId, ScExternalRefManager::LinkUpdateType eType);
52 void addFileId(sal_uInt16 nFileId);
53 void removeFileId(sal_uInt16 nFileId);
54 ::boost::unordered_set<sal_uInt16>& getAllFileIds();
56 private:
57 ExternalRefListener();
58 ExternalRefListener(const ExternalRefListener& r);
60 ScChartListener& mrParent;
61 ::boost::unordered_set<sal_uInt16> maFileIds;
62 ScDocument* mpDoc;
65 private:
67 boost::scoped_ptr<ExternalRefListener> mpExtRefListener;
68 boost::scoped_ptr<std::vector<ScTokenRef> > mpTokens;
70 OUString maName;
71 ScChartUnoData* pUnoData;
72 ScDocument* mpDoc;
73 bool bUsed:1; // for ScChartListenerCollection::FreeUnused
74 bool bDirty:1;
75 bool bSeriesRangesScheduled:1;
77 // not implemented
78 ScChartListener& operator=( const ScChartListener& );
80 public:
81 ScChartListener( const OUString& rName, ScDocument* pDoc,
82 const ScRangeListRef& rRangeListRef );
83 ScChartListener( const OUString& rName, ScDocument* pDoc,
84 ::std::vector<ScTokenRef>* pTokens );
85 ScChartListener( const ScChartListener& );
86 ~ScChartListener();
88 const OUString& GetName() const;
90 void SetUno( const com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener >& rListener,
91 const com::sun::star::uno::Reference< com::sun::star::chart::XChartData >& rSource );
92 com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener > GetUnoListener() const;
93 com::sun::star::uno::Reference< com::sun::star::chart::XChartData > GetUnoSource() const;
95 bool IsUno() const { return (pUnoData != NULL); }
97 virtual void Notify( SvtBroadcaster& rBC, const SfxHint& rHint );
98 void StartListeningTo();
99 void EndListeningTo();
100 void ChangeListening( const ScRangeListRef& rRangeListRef,
101 bool bDirty = false );
102 void Update();
103 ScRangeListRef GetRangeList() const;
104 void SetRangeList( const ScRangeListRef& rNew );
105 bool IsUsed() const { return bUsed; }
106 void SetUsed( bool bFlg ) { bUsed = bFlg; }
107 bool IsDirty() const { return bDirty; }
108 void SetDirty( bool bFlg ) { bDirty = bFlg; }
110 void UpdateChartIntersecting( const ScRange& rRange );
112 // if chart series ranges are to be updated later on (e.g. DeleteTab, InsertTab)
113 void ScheduleSeriesRanges() { bSeriesRangesScheduled = true; }
114 void UpdateScheduledSeriesRanges();
115 void UpdateSeriesRanges();
117 ExternalRefListener* GetExtRefListener();
118 void SetUpdateQueue();
120 bool operator==( const ScChartListener& ) const;
121 bool operator!=( const ScChartListener& r ) const;
124 // ============================================================================
126 class ScChartHiddenRangeListener
128 public:
129 ScChartHiddenRangeListener();
130 virtual ~ScChartHiddenRangeListener();
131 virtual void notify() = 0;
134 // ============================================================================
136 class ScChartListenerCollection
138 public:
139 struct RangeListenerItem
141 ScRange maRange;
142 ScChartHiddenRangeListener* mpListener;
143 explicit RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p);
146 typedef boost::ptr_map<OUString, ScChartListener> ListenersType;
147 typedef boost::unordered_set<OUString, OUStringHash> StringSetType;
148 private:
149 ListenersType maListeners;
150 ::std::list<RangeListenerItem> maHiddenListeners;
151 StringSetType maNonOleObjectNames;
153 Timer aTimer;
154 ScDocument* pDoc;
156 DECL_LINK(TimerHdl, void *);
158 // not implemented
159 ScChartListenerCollection& operator=( const ScChartListenerCollection& );
161 public:
162 ScChartListenerCollection( ScDocument* pDoc );
163 ScChartListenerCollection( const ScChartListenerCollection& );
164 ~ScChartListenerCollection();
166 // only needed after copy-ctor, if newly added to doc
167 void StartAllListeners();
169 SC_DLLPUBLIC void insert(ScChartListener* pListener);
170 ScChartListener* findByName(const OUString& rName);
171 const ScChartListener* findByName(const OUString& rName) const;
172 bool hasListeners() const;
174 void removeByName(const OUString& rName);
176 const ListenersType& getListeners() const;
177 ListenersType& getListeners();
178 StringSetType& getNonOleObjectNames();
181 * Create a unique name that's not taken by any existing chart listener
182 * objects. The name consists of a prefix given followed by a number.
184 OUString getUniqueName(const OUString& rPrefix) const;
186 void ChangeListening( const String& rName,
187 const ScRangeListRef& rRangeListRef,
188 bool bDirty = false );
189 // use FreeUnused only the way it's used in ScDocument::UpdateChartListenerCollection
190 void FreeUnused();
191 void FreeUno( const com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener >& rListener,
192 const com::sun::star::uno::Reference< com::sun::star::chart::XChartData >& rSource );
193 void StartTimer();
194 void UpdateDirtyCharts();
195 SC_DLLPUBLIC void SetDirty();
196 void SetDiffDirty( const ScChartListenerCollection&,
197 bool bSetChartRangeLists = false );
199 void SetRangeDirty( const ScRange& rRange ); // for example rows/columns
201 void UpdateScheduledSeriesRanges();
202 void UpdateChartsContainingTab( SCTAB nTab );
204 bool operator==( const ScChartListenerCollection& r ) const;
205 bool operator!=( const ScChartListenerCollection& r ) const;
208 * Start listening on hide/show change within specified cell range. A
209 * single listener may listen on multiple ranges when the caller passes
210 * the same pointer multiple times with different ranges.
212 * Note that the caller is responsible for managing the life-cycle of the
213 * listener instance.
215 void StartListeningHiddenRange( const ScRange& rRange,
216 ScChartHiddenRangeListener* pListener );
219 * Remove all ranges associated with passed listener instance from the
220 * list of hidden range listeners. This does not delete the passed
221 * listener instance.
223 void EndListeningHiddenRange( ScChartHiddenRangeListener* pListener );
227 #endif
229 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */