diff options
Diffstat (limited to 'sc/inc/chartlis.hxx')
-rw-r--r-- | sc/inc/chartlis.hxx | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/sc/inc/chartlis.hxx b/sc/inc/chartlis.hxx new file mode 100644 index 000000000..d140531a9 --- /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( const OUString& rName, ScDocument& rDoc, + const ScRangeListRef& rRangeListRef ); + ScChartListener( const OUString& rName, 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: */ |