25 #include <document.hxx>
28 #include <com/sun/star/chart/XChartDataChangeEventListener.hpp>
32 using ::std::for_each;
39 uno::Reference< chart::XChartDataChangeEventListener >
xListener;
40 uno::Reference< chart::XChartData >
xSource;
43 ScChartUnoData(
const uno::Reference< chart::XChartDataChangeEventListener >& rL,
44 const uno::Reference< chart::XChartData >& rS ) :
45 xListener( rL ), xSource( rS ) {}
47 const uno::Reference< chart::XChartDataChangeEventListener >&
GetListener()
const {
return xListener; }
48 const uno::Reference< chart::XChartData >&
GetSource()
const {
return xSource; }
73 if (maFileIds.count(nFileId))
80 removeFileId(nFileId);
87 maFileIds.insert(nFileId);
92 maFileIds.erase(nFileId);
109 mpTokens(
std::move(pTokens)),
127 const std::unordered_set<sal_uInt16>& rFileIds =
mpExtRefListener->getAllFileIds();
128 for (
const auto& rFileId : rFileIds)
134 const uno::Reference< chart::XChartDataChangeEventListener >& rListener,
135 const uno::Reference< chart::XChartData >& rSource )
144 return uno::Reference< chart::XChartDataChangeEventListener >();
151 return uno::Reference< chart::XChartData >();
157 if (p && (p->
GetId() == SfxHintId::ScDataChanged))
175 chart::ChartDataChangeType_ALL,
195 vector<ScTokenRef> aTokens;
202 class StartEndListening
206 mrDoc(rDoc),
mrParent(rParent), mbStart(bStart) {}
216 sal_uInt16 nFileId = pToken->GetIndex();
235 startListening(aRange);
237 endListening(aRange);
241 void startListening(
const ScRange& rRange)
244 mrDoc.StartListeningCell(rRange.
aStart, &mrParent);
246 mrDoc.StartListeningArea(rRange,
false, &mrParent);
249 void endListening(
const ScRange& rRange)
252 mrDoc.EndListeningCell(rRange.
aStart, &mrParent);
254 mrDoc.EndListeningArea(rRange,
false, &mrParent);
356 meModifiedDuringUpdate( SC_CLCUPDATE_NONE ),
364 meModifiedDuringUpdate( SC_CLCUPDATE_NONE ),
383 it.second->StartListeningTo();
392 return m_Listeners.insert(std::make_pair(aName, std::unique_ptr<ScChartListener>(pListener))).second;
404 ListenersType::iterator
const it =
m_Listeners.find(rName);
405 return it ==
m_Listeners.end() ?
nullptr : it->second.get();
410 ListenersType::const_iterator
const it =
m_Listeners.find(rName);
411 return it ==
m_Listeners.end() ?
nullptr : it->second.get();
421 for (sal_Int32 nNum = 1; nNum < 10000; ++nNum)
423 OUString aTestName = rPrefix + OUString::number(nNum);
460 aUsed.insert(std::make_pair(pair.first, std::move(pair.second)));
467 aUsed.insert(std::make_pair(pair.first, std::move(pair.second)));
471 m_Listeners = std::move(aUsed);
475 const uno::Reference< chart::XChartData >& rSource )
531 it.second->SetDirty(
true);
546 if (!pCLCmp || *pCL != *pCLCmp)
548 if ( bSetChartRangeLists )
554 bool b1 = rList1.
is();
555 bool b2 = rList2.
is();
556 if ( b1 != b2 || (b1 && b2 && (*rList1 != *rList2)) )
589 if (rHiddenRange.Intersects(rRange))
601 it.second->UpdateChartIntersecting(aRange);
613 [](
const ListenersType::value_type& lhs,
const ListenersType::value_type& rhs) {
614 return (lhs.first == rhs.first) && (*lhs.second == *rhs.second);
#define LINK(Instance, Class, Member)
enum ScChartListenerCollection::UpdateStatus meModifiedDuringUpdate
void UpdateChartIntersecting(const ScRange &rRange)
bool Intersects(const ScRange &) const
css::uno::Reference< css::chart::XChartData > GetUnoSource() const
bool operator!=(const ScChartListener &r) const
void ChangeListening(const OUString &rName, const ScRangeListRef &rRangeListRef)
bool IsInInterpreter() const
ScChartListenerCollection(ScDocument &rDoc)
bool SC_DLLPUBLIC isExternalRef(const ScTokenRef &pToken)
uno::Reference< chart::XChartDataChangeEventListener > xListener
void getTokenFromRange(const ScDocument *pDoc, ScTokenRef &pToken, const ScRange &rRange)
Create a double reference token from a range object.
void UpdateChartsContainingTab(SCTAB nTab)
bool insert(ScChartListener *pListener)
void getRangeListFromTokens(const ScDocument *pDoc, ScRangeList &rRangeList, const ::std::vector< ScTokenRef > &pTokens, const ScAddress &rPos)
void SetUno(const css::uno::Reference< css::chart::XChartDataChangeEventListener > &rListener, const css::uno::Reference< css::chart::XChartData > &rSource)
ScRangeListRef GetRangeList() const
ListenersType m_Listeners
bool SC_DLLPUBLIC isRef(const ScTokenRef &pToken)
OUString getUniqueName(std::u16string_view rPrefix) const
Create a unique name that's not taken by any existing chart listener objects.
std::unique_ptr< ExternalRefListener > mpExtRefListener
void UpdateChart(const OUString &rName)
ExternalRefListener(ScChartListener &rParent, ScDocument &rDoc)
void FreeUno(const css::uno::Reference< css::chart::XChartDataChangeEventListener > &rListener, const css::uno::Reference< css::chart::XChartData > &rSource)
SC_DLLPUBLIC SCROW MaxRow() const
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
void StartListeningHiddenRange(const ScRange &rRange, ScChartHiddenRangeListener *pListener)
Start listening on hide/show change within specified cell range.
virtual void Start() override
SC_DLLPUBLIC ScExternalRefManager * GetExternalRefManager() const
std::unordered_multimap< ScChartHiddenRangeListener *, ScRange > maHiddenListeners
void removeLinkListener(sal_uInt16 nFileId, LinkListener *pListener)
Remove an existing link listener.
bool operator==(const ScChartListener &) const
void SetDebugName(const char *pDebugName)
std::unique_ptr< ScChartUnoData > pUnoData
virtual ~ScChartListener() override
void addFileId(sal_uInt16 nFileId)
ScChartListener * findByName(const OUString &rName)
SC_DLLPUBLIC SCCOL MaxCol() const
bool IsImportingXML() const
virtual void Notify(const SfxHint &rHint) override
std::unique_ptr< std::vector< ScTokenRef > > mpTokens
static bool AnyInput(VclInputFlags nType=VCL_INPUT_ANY)
const OUString & GetName() const
virtual ~ScChartHiddenRangeListener()
uno::Reference< chart::XChartData > xSource
ScChartListener(const OUString &rName, ScDocument &rDoc, const ScRangeListRef &rRangeListRef)
IMPL_LINK_NOARG(ScChartListenerCollection, TimerHdl, Timer *, void)
void SetRangeList(const ScRangeListRef &rNew)
void SetRangeDirty(const ScRange &rRange)
void removeByName(const OUString &rName)
~ScChartListenerCollection()
bool HasBroadcaster() const
ExternalRefListener * GetExtRefListener()
const uno::Reference< chart::XChartDataChangeEventListener > & GetListener() const
std::map< OUString, std::unique_ptr< ScChartListener > > ListenersType
bool operator==(const ScChartListenerCollection &r) const
virtual ~ExternalRefListener() override
ScChartHiddenRangeListener()
bool IsInDtorClear() const
void EndListeningHiddenRange(ScChartHiddenRangeListener *pListener)
Remove all ranges associated with passed listener instance from the list of hidden range listeners...
void ChangeListening(const ScRangeListRef &rRangeListRef, bool bDirty)
::boost::intrusive_ptr< formula::FormulaToken > ScTokenRef
SC_DLLPUBLIC ScChartListenerCollection * GetChartListenerCollection() const
void SetInvokeHandler(const Link< Timer *, void > &rLink)
void SetChartRangeList(std::u16string_view rChartName, const ScRangeListRef &rNewRangeListRef)
only assigns the new RangeList, no ChartListener or the like
void SetDiffDirty(const ScChartListenerCollection &, bool bSetChartRangeLists)
bool SC_DLLPUBLIC intersects(const ScDocument *pDoc, const ::std::vector< ScTokenRef > &rTokens, const ScTokenRef &pToken, const ScAddress &rPos)
bool hasListeners() const
virtual void notify(sal_uInt16 nFileId, ScExternalRefManager::LinkUpdateType eType) override
void SetPriority(TaskPriority ePriority)
css::uno::Reference< css::chart::XChartDataChangeEventListener > GetUnoListener() const
bool getRangeFromToken(const ScDocument *pDoc, ScRange &rRange, const ScTokenRef &pToken, const ScAddress &rPos, bool bExternal=false)
ScChartUnoData(const uno::Reference< chart::XChartDataChangeEventListener > &rL, const uno::Reference< chart::XChartData > &rS)
void removeFileId(sal_uInt16 nFileId)
BaseContainerNodeSharedPtr & mrParent
void addLinkListener(sal_uInt16 nFileId, LinkListener *pListener)
Register a new link listener to a specified external document.
void getTokensFromRangeList(const ScDocument *pDoc,::std::vector< ScTokenRef > &pTokens, const ScRangeList &rRanges)
const uno::Reference< chart::XChartData > & GetSource() const
SC_DLLPUBLIC bool GetAutoCalc() const