blob: f233c49c335f514cd8ff32e0631d8d1a3c1131cb [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SC_CHARTLIS_HXX
#define SC_CHARTLIS_HXX
#include <vcl/timer.hxx>
#include <svl/listener.hxx>
#include "collect.hxx"
#include "rangelst.hxx"
#include "token.hxx"
#include "externalrefmgr.hxx"
#include <memory>
#include <vector>
#include <list>
#include <hash_set>
class ScDocument;
class ScChartUnoData;
#include <com/sun/star/chart/XChartData.hpp>
#include <com/sun/star/chart/XChartDataChangeEventListener.hpp>
class SC_DLLPUBLIC ScChartListener : public StrData, public SvtListener
{
public:
class ExternalRefListener : public ScExternalRefManager::LinkListener
{
public:
ExternalRefListener(ScChartListener& rParent, ScDocument* pDoc);
virtual ~ExternalRefListener();
virtual void notify(sal_uInt16 nFileId, ScExternalRefManager::LinkUpdateType eType);
void addFileId(sal_uInt16 nFileId);
void removeFileId(sal_uInt16 nFileId);
::std::hash_set<sal_uInt16>& getAllFileIds();
private:
ExternalRefListener();
ExternalRefListener(const ExternalRefListener& r);
ScChartListener& mrParent;
::std::hash_set<sal_uInt16> maFileIds;
ScDocument* mpDoc;
};
private:
::std::auto_ptr<ExternalRefListener> mpExtRefListener;
::std::auto_ptr< ::std::vector<ScSharedTokenRef> > mpTokens;
ScChartUnoData* pUnoData;
ScDocument* pDoc;
sal_Bool bUsed; // fuer ScChartListenerCollection::FreeUnused
sal_Bool bDirty;
sal_Bool bSeriesRangesScheduled;
// not implemented
ScChartListener& operator=( const ScChartListener& );
public:
ScChartListener( const String& rName, ScDocument* pDoc,
const ScRange& rRange );
ScChartListener( const String& rName, ScDocument* pDoc,
const ScRangeListRef& rRangeListRef );
ScChartListener( const String& rName, ScDocument* pDoc,
::std::vector<ScSharedTokenRef>* pTokens );
ScChartListener( const ScChartListener& );
virtual ~ScChartListener();
virtual ScDataObject* Clone() const;
void SetUno( const com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener >& rListener,
const com::sun::star::uno::Reference< com::sun::star::chart::XChartData >& rSource );
com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener > GetUnoListener() const;
com::sun::star::uno::Reference< com::sun::star::chart::XChartData > GetUnoSource() const;
sal_Bool IsUno() const { return (pUnoData != NULL); }
virtual void Notify( SvtBroadcaster& rBC, const SfxHint& rHint );
void StartListeningTo();
void EndListeningTo();
void ChangeListening( const ScRangeListRef& rRangeListRef,
sal_Bool bDirty = sal_False );
void Update();
ScRangeListRef GetRangeList() const;
void SetRangeList( const ScRangeListRef& rNew );
void SetRangeList( const ScRange& rNew );
sal_Bool IsUsed() const { return bUsed; }
void SetUsed( sal_Bool bFlg ) { bUsed = bFlg; }
sal_Bool IsDirty() const { return bDirty; }
void SetDirty( sal_Bool bFlg ) { bDirty = bFlg; }
void UpdateChartIntersecting( const ScRange& rRange );
// if chart series ranges are to be updated later on (e.g. DeleteTab, InsertTab)
void ScheduleSeriesRanges() { bSeriesRangesScheduled = sal_True; }
void UpdateScheduledSeriesRanges();
void UpdateSeriesRanges();
ExternalRefListener* GetExtRefListener();
void SetUpdateQueue();
sal_Bool operator==( const ScChartListener& );
sal_Bool operator!=( const ScChartListener& r )
{ return !operator==( r ); }
};
// ============================================================================
class ScChartHiddenRangeListener
{
public:
ScChartHiddenRangeListener();
virtual ~ScChartHiddenRangeListener();
virtual void notify() = 0;
};
// ============================================================================
class ScChartListenerCollection : public ScStrCollection
{
public:
struct RangeListenerItem
{
ScRange maRange;
ScChartHiddenRangeListener* mpListener;
explicit RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p);
};
private:
::std::list<RangeListenerItem> maHiddenListeners;
Timer aTimer;
ScDocument* pDoc;
DECL_LINK( TimerHdl, Timer* );
// not implemented
ScChartListenerCollection& operator=( const ScChartListenerCollection& );
using ScStrCollection::operator==;
public:
ScChartListenerCollection( ScDocument* pDoc );
ScChartListenerCollection( const ScChartListenerCollection& );
virtual ScDataObject* Clone() const;
virtual ~ScChartListenerCollection();
// nur nach copy-ctor noetig, wenn neu ins Dok gehaengt
void StartAllListeners();
void ChangeListening( const String& rName,
const ScRangeListRef& rRangeListRef,
sal_Bool bDirty = sal_False );
// FreeUnused nur wie in ScDocument::UpdateChartListenerCollection verwenden!
void FreeUnused();
void FreeUno( const com::sun::star::uno::Reference< com::sun::star::chart::XChartDataChangeEventListener >& rListener,
const com::sun::star::uno::Reference< com::sun::star::chart::XChartData >& rSource );
void StartTimer();
void UpdateDirtyCharts();
void SC_DLLPUBLIC SetDirty();
void SetDiffDirty( const ScChartListenerCollection&,
sal_Bool bSetChartRangeLists = sal_False );
void SetRangeDirty( const ScRange& rRange ); // z.B. Zeilen/Spalten
void UpdateScheduledSeriesRanges();
void UpdateChartsContainingTab( SCTAB nTab );
sal_Bool operator==( const ScChartListenerCollection& );
/**
* 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 );
};
#endif