summaryrefslogtreecommitdiffstats
path: root/sc/inc/chartlis.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/inc/chartlis.hxx')
-rw-r--r--sc/inc/chartlis.hxx211
1 files changed, 211 insertions, 0 deletions
diff --git a/sc/inc/chartlis.hxx b/sc/inc/chartlis.hxx
new file mode 100644
index 0000000000..5617dc482a
--- /dev/null
+++ b/sc/inc/chartlis.hxx
@@ -0,0 +1,211 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <vcl/idle.hxx>
+#include <svl/listener.hxx>
+#include "rangelst.hxx"
+#include "externalrefmgr.hxx"
+
+#include <memory>
+#include <map>
+#include <string_view>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
+
+namespace com::sun::star::chart { class XChartData; }
+namespace com::sun::star::chart { class XChartDataChangeEventListener; }
+
+class Timer;
+class ScDocument;
+class ScChartUnoData;
+
+class SC_DLLPUBLIC ScChartListener final : public SvtListener
+{
+public:
+ class SAL_DLLPRIVATE ExternalRefListener final : public ScExternalRefManager::LinkListener
+ {
+ public:
+ ExternalRefListener(ScChartListener& rParent, ScDocument& rDoc);
+ virtual ~ExternalRefListener() override;
+ virtual void notify(sal_uInt16 nFileId, ScExternalRefManager::LinkUpdateType eType) override;
+ void addFileId(sal_uInt16 nFileId);
+ void removeFileId(sal_uInt16 nFileId);
+ std::unordered_set<sal_uInt16>& getAllFileIds() { return maFileIds;}
+
+ private:
+ ExternalRefListener(const ExternalRefListener& r) = delete;
+
+ ScChartListener& mrParent;
+ std::unordered_set<sal_uInt16> maFileIds;
+ ScDocument* m_pDoc;
+ };
+
+private:
+
+ std::unique_ptr<ExternalRefListener> mpExtRefListener;
+ std::vector<ScTokenRef> maTokens;
+
+ OUString maName;
+ std::unique_ptr<ScChartUnoData> pUnoData;
+ ScDocument& mrDoc;
+ bool bUsed:1; // for ScChartListenerCollection::FreeUnused
+ bool bDirty:1;
+
+ ScChartListener& operator=( const ScChartListener& ) = delete;
+
+public:
+ ScChartListener( OUString aName, ScDocument& rDoc,
+ const ScRangeListRef& rRangeListRef );
+ ScChartListener( OUString aName, ScDocument& rDoc,
+ ::std::vector<ScTokenRef> aTokens );
+ ScChartListener( const ScChartListener& ) = delete;
+ virtual ~ScChartListener() override;
+
+ const OUString& GetName() const { return maName;}
+
+ void SetUno( const css::uno::Reference< css::chart::XChartDataChangeEventListener >& rListener,
+ const css::uno::Reference< css::chart::XChartData >& rSource );
+ css::uno::Reference< css::chart::XChartDataChangeEventListener > GetUnoListener() const;
+ css::uno::Reference< css::chart::XChartData > GetUnoSource() const;
+
+ bool IsUno() const { return (pUnoData != nullptr); }
+
+ virtual void Notify( const SfxHint& rHint ) override;
+ void StartListeningTo();
+ void EndListeningTo();
+ void ChangeListening( const ScRangeListRef& rRangeListRef,
+ bool bDirty );
+ void Update();
+ ScRangeListRef GetRangeList() const;
+ void SetRangeList( const ScRangeListRef& rNew );
+ bool IsUsed() const { return bUsed; }
+ void SetUsed( bool bFlg ) { bUsed = bFlg; }
+ bool IsDirty() const { return bDirty; }
+ void SetDirty( bool bFlg ) { bDirty = bFlg; }
+
+ void UpdateChartIntersecting( const ScRange& rRange );
+
+ ExternalRefListener* GetExtRefListener();
+ void SetUpdateQueue();
+
+ bool operator==( const ScChartListener& ) const;
+ bool operator!=( const ScChartListener& r ) const;
+};
+
+class SC_DLLPUBLIC ScChartHiddenRangeListener
+{
+public:
+ ScChartHiddenRangeListener();
+ virtual ~ScChartHiddenRangeListener();
+ virtual void notify() = 0;
+};
+
+class SC_DLLPUBLIC ScChartListenerCollection final
+{
+public:
+ typedef std::map<OUString, std::unique_ptr<ScChartListener>> ListenersType;
+ typedef std::unordered_set<OUString> StringSetType;
+private:
+ ListenersType m_Listeners;
+ enum UpdateStatus
+ {
+ SC_CLCUPDATE_NONE,
+ SC_CLCUPDATE_RUNNING,
+ SC_CLCUPDATE_MODIFIED
+ } meModifiedDuringUpdate;
+
+ std::unordered_multimap<ScChartHiddenRangeListener*, ScRange> maHiddenListeners;
+
+ StringSetType maNonOleObjectNames;
+
+ Idle aIdle;
+ ScDocument& rDoc;
+
+ DECL_DLLPRIVATE_LINK(TimerHdl, Timer *, void);
+
+ ScChartListenerCollection& operator=( const ScChartListenerCollection& ) = delete;
+
+ void Init();
+
+public:
+ ScChartListenerCollection( ScDocument& rDoc );
+ ScChartListenerCollection( const ScChartListenerCollection& );
+ ~ScChartListenerCollection();
+
+ // only needed after copy-ctor, if newly added to doc
+ void StartAllListeners();
+
+ bool insert(ScChartListener* pListener);
+ ScChartListener* findByName(const OUString& rName);
+ const ScChartListener* findByName(const OUString& rName) const;
+ bool hasListeners() const;
+
+ void removeByName(const OUString& rName);
+
+ const ListenersType& getListeners() const { return m_Listeners; }
+ ListenersType& getListeners() { return m_Listeners; }
+ StringSetType& getNonOleObjectNames() { return maNonOleObjectNames;}
+
+ /**
+ * Create a unique name that's not taken by any existing chart listener
+ * objects. The name consists of a prefix given followed by a number.
+ */
+ OUString getUniqueName(std::u16string_view rPrefix) const;
+
+ void ChangeListening( const OUString& rName,
+ const ScRangeListRef& rRangeListRef );
+ // use FreeUnused only the way it's used in ScDocument::UpdateChartListenerCollection
+ void FreeUnused();
+ void FreeUno( const css::uno::Reference< css::chart::XChartDataChangeEventListener >& rListener,
+ const css::uno::Reference< css::chart::XChartData >& rSource );
+ void StartTimer();
+ void UpdateDirtyCharts();
+ void SetDirty();
+ void SetDiffDirty( const ScChartListenerCollection&,
+ bool bSetChartRangeLists );
+
+ void SetRangeDirty( const ScRange& rRange ); // for example rows/columns
+
+ void UpdateChartsContainingTab( SCTAB nTab );
+
+ bool operator==( const ScChartListenerCollection& r ) const;
+
+ /**
+ * Start listening on hide/show change within specified cell range. A
+ * single listener may listen on multiple ranges when the caller passes
+ * the same pointer multiple times with different ranges.
+ *
+ * Note that the caller is responsible for managing the life-cycle of the
+ * listener instance.
+ */
+ void StartListeningHiddenRange( const ScRange& rRange,
+ ScChartHiddenRangeListener* pListener );
+
+ /**
+ * Remove all ranges associated with passed listener instance from the
+ * list of hidden range listeners. This does not delete the passed
+ * listener instance.
+ */
+ void EndListeningHiddenRange( ScChartHiddenRangeListener* pListener );
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */