office-gobmx/sc/inc/chartlis.hxx

241 lines
9 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 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 <boost/unordered_set.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/ptr_container/ptr_map.hpp>
class ScDocument;
class ScChartUnoData;
#include <com/sun/star/chart/XChartData.hpp>
#include <com/sun/star/chart/XChartDataChangeEventListener.hpp>
class SC_DLLPUBLIC ScChartListener : 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);
::boost::unordered_set<sal_uInt16>& getAllFileIds();
private:
ExternalRefListener();
ExternalRefListener(const ExternalRefListener& r);
ScChartListener& mrParent;
::boost::unordered_set<sal_uInt16> maFileIds;
ScDocument* mpDoc;
};
private:
boost::scoped_ptr<ExternalRefListener> mpExtRefListener;
boost::scoped_ptr<std::vector<ScTokenRef> > mpTokens;
rtl::OUString maName;
ScChartUnoData* pUnoData;
ScDocument* pDoc;
bool bUsed:1; // for ScChartListenerCollection::FreeUnused
bool bDirty:1;
bool bSeriesRangesScheduled:1;
// not implemented
ScChartListener& operator=( const ScChartListener& );
public:
ScChartListener( const rtl::OUString& rName, ScDocument* pDoc,
const ScRange& rRange );
ScChartListener( const rtl::OUString& rName, ScDocument* pDoc,
const ScRangeListRef& rRangeListRef );
ScChartListener( const rtl::OUString& rName, ScDocument* pDoc,
::std::vector<ScTokenRef>* pTokens );
ScChartListener( const ScChartListener& );
~ScChartListener();
const rtl::OUString& GetName() const;
void SetName(const rtl::OUString& rName);
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;
bool IsUno() const { return (pUnoData != NULL); }
virtual void Notify( SvtBroadcaster& rBC, const SfxHint& rHint );
void StartListeningTo();
void EndListeningTo();
void ChangeListening( const ScRangeListRef& rRangeListRef,
bool bDirty = false );
void Update();
ScRangeListRef GetRangeList() const;
void SetRangeList( const ScRangeListRef& rNew );
void SetRangeList( const ScRange& 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 );
// if chart series ranges are to be updated later on (e.g. DeleteTab, InsertTab)
void ScheduleSeriesRanges() { bSeriesRangesScheduled = true; }
void UpdateScheduledSeriesRanges();
void UpdateSeriesRanges();
ExternalRefListener* GetExtRefListener();
void SetUpdateQueue();
bool operator==( const ScChartListener& ) const;
bool operator!=( const ScChartListener& r ) const;
};
// ============================================================================
class ScChartHiddenRangeListener
{
public:
ScChartHiddenRangeListener();
virtual ~ScChartHiddenRangeListener();
virtual void notify() = 0;
};
// ============================================================================
class ScChartListenerCollection
{
public:
struct RangeListenerItem
{
ScRange maRange;
ScChartHiddenRangeListener* mpListener;
explicit RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p);
};
typedef boost::ptr_map<rtl::OUString, ScChartListener> ListenersType;
typedef boost::unordered_set<rtl::OUString, rtl::OUStringHash> StringSetType;
private:
ListenersType maListeners;
::std::list<RangeListenerItem> maHiddenListeners;
StringSetType maNonOleObjectNames;
Timer aTimer;
ScDocument* pDoc;
DECL_LINK( TimerHdl, Timer* );
// not implemented
ScChartListenerCollection& operator=( const ScChartListenerCollection& );
public:
ScChartListenerCollection( ScDocument* pDoc );
ScChartListenerCollection( const ScChartListenerCollection& );
~ScChartListenerCollection();
// only needed after copy-ctor, if newly added to doc
void StartAllListeners();
SC_DLLPUBLIC void insert(ScChartListener* pListener);
ScChartListener* findByName(const rtl::OUString& rName);
const ScChartListener* findByName(const rtl::OUString& rName) const;
bool hasListeners() const;
const ListenersType& getListeners() const;
ListenersType& getListeners();
StringSetType& getNonOleObjectNames();
/**
* 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.
*/
rtl::OUString getUniqueName(const rtl::OUString& rPrefix) const;
void ChangeListening( const String& rName,
const ScRangeListRef& rRangeListRef,
bool bDirty = false );
// use FreeUnused only the way it's used in ScDocument::UpdateChartListenerCollection
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();
SC_DLLPUBLIC void SetDirty();
void SetDiffDirty( const ScChartListenerCollection&,
bool bSetChartRangeLists = false );
void SetRangeDirty( const ScRange& rRange ); // for example rows/columns
void UpdateScheduledSeriesRanges();
void UpdateChartsContainingTab( SCTAB nTab );
bool operator==( const ScChartListenerCollection& r ) const;
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 );
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */