diff options
author | Kurt Zenker <kz@openoffice.org> | 2004-10-04 19:45:36 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2004-10-04 19:45:36 +0000 |
commit | d9afbdc00da4f381b3f0bc9d9ea6854a42db1cf9 (patch) | |
tree | 3c212b7b5a81030efa27cb4b0a3c2b60d81fe337 /sfx2/source/appl/linksrc.cxx | |
parent | INTEGRATION: CWS mav09 (1.1.2); FILE ADDED (diff) | |
download | core-d9afbdc00da4f381b3f0bc9d9ea6854a42db1cf9.tar.gz core-d9afbdc00da4f381b3f0bc9d9ea6854a42db1cf9.zip |
INTEGRATION: CWS mav09 (1.1.2); FILE ADDED
2004/04/21 11:10:14 mav 1.1.2.1: #i27773# move implementation from so3
Diffstat (limited to 'sfx2/source/appl/linksrc.cxx')
-rw-r--r-- | sfx2/source/appl/linksrc.cxx | 431 |
1 files changed, 431 insertions, 0 deletions
diff --git a/sfx2/source/appl/linksrc.cxx b/sfx2/source/appl/linksrc.cxx new file mode 100644 index 000000000000..358d723d18bd --- /dev/null +++ b/sfx2/source/appl/linksrc.cxx @@ -0,0 +1,431 @@ +/************************************************************************* + * + * $RCSfile: linksrc.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: kz $ $Date: 2004-10-04 20:45:36 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "linksrc.hxx" +#include "lnkbase.hxx" +//#include <sot/exchange.hxx> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Sequence.hxx> + +#include <tools/debug.hxx> +#include <vcl/timer.hxx> +#include <svtools/svarray.hxx> +#pragma hdrstop + + +using namespace ::com::sun::star::uno; + +namespace sfx2 +{ + +TYPEINIT0( SvLinkSource ) + +/************** class SvLinkSourceTimer *********************************/ +class SvLinkSourceTimer : public Timer +{ + SvLinkSource * pOwner; + virtual void Timeout(); +public: + SvLinkSourceTimer( SvLinkSource * pOwn ); +}; + +SvLinkSourceTimer::SvLinkSourceTimer( SvLinkSource * pOwn ) + : pOwner( pOwn ) +{ +} + +void SvLinkSourceTimer::Timeout() +{ + // sicher gegen zerstoeren im Handler + SvLinkSourceRef aAdv( pOwner ); + pOwner->SendDataChanged(); +} + +static void StartTimer( SvLinkSourceTimer ** ppTimer, SvLinkSource * pOwner, + ULONG nTimeout ) +{ + if( !*ppTimer ) + { + *ppTimer = new SvLinkSourceTimer( pOwner ); + (*ppTimer)->SetTimeout( nTimeout ); + (*ppTimer)->Start(); + } +} + + +struct SvLinkSource_Entry_Impl +{ + SvBaseLinkRef xSink; + String aDataMimeType; + USHORT nAdviseModes; + BOOL bIsDataSink; + + SvLinkSource_Entry_Impl( SvBaseLink* pLink, const String& rMimeType, + USHORT nAdvMode ) + : xSink( pLink ), aDataMimeType( rMimeType ), + nAdviseModes( nAdvMode ), bIsDataSink( TRUE ) + {} + + SvLinkSource_Entry_Impl( SvBaseLink* pLink ) + : xSink( pLink ), nAdviseModes( 0 ), bIsDataSink( FALSE ) + {} + + ~SvLinkSource_Entry_Impl(); +}; + +SvLinkSource_Entry_Impl::~SvLinkSource_Entry_Impl() +{ +} + +typedef SvLinkSource_Entry_Impl* SvLinkSource_Entry_ImplPtr; +SV_DECL_PTRARR_DEL( SvLinkSource_Array_Impl, SvLinkSource_Entry_ImplPtr, 4, 4 ) +SV_IMPL_PTRARR( SvLinkSource_Array_Impl, SvLinkSource_Entry_ImplPtr ); + +class SvLinkSource_EntryIter_Impl +{ + SvLinkSource_Array_Impl aArr; + const SvLinkSource_Array_Impl& rOrigArr; + USHORT nPos; +public: + SvLinkSource_EntryIter_Impl( const SvLinkSource_Array_Impl& rArr ); + ~SvLinkSource_EntryIter_Impl(); + SvLinkSource_Entry_Impl* Curr() + { return nPos < aArr.Count() ? aArr[ nPos ] : 0; } + SvLinkSource_Entry_Impl* Next(); +}; + +SvLinkSource_EntryIter_Impl::SvLinkSource_EntryIter_Impl( + const SvLinkSource_Array_Impl& rArr ) + : rOrigArr( rArr ), nPos( 0 ) +{ + aArr.Insert( &rArr, 0 ); +} +SvLinkSource_EntryIter_Impl::~SvLinkSource_EntryIter_Impl() +{ + aArr.Remove( 0, aArr.Count() ); +} + +SvLinkSource_Entry_Impl* SvLinkSource_EntryIter_Impl::Next() +{ + SvLinkSource_Entry_ImplPtr pRet = 0; + if( nPos + 1 < aArr.Count() ) + { + ++nPos; + if( rOrigArr.Count() == aArr.Count() && + rOrigArr[ nPos ] == aArr[ nPos ] ) + pRet = aArr[ nPos ]; + else + { + // then we must search the current (or the next) in the orig + do { + pRet = aArr[ nPos ]; + if( USHRT_MAX != rOrigArr.GetPos( pRet )) + break; + pRet = 0; + ++nPos; + } while( nPos < aArr.Count() ); + + if( nPos >= aArr.Count() ) + pRet = 0; + } + } + return pRet; +} + +struct SvLinkSource_Impl +{ + SvLinkSource_Array_Impl aArr; + String aDataMimeType; + SvLinkSourceTimer * pTimer; + ULONG nTimeout; + + SvLinkSource_Impl() : pTimer( 0 ), nTimeout( 3000 ) {} + ~SvLinkSource_Impl(); + + void Closed(); +}; + +SvLinkSource_Impl::~SvLinkSource_Impl() +{ + delete pTimer; +} + +SvLinkSource::SvLinkSource() + : pImpl( new SvLinkSource_Impl ) +{ +} + +SvLinkSource::~SvLinkSource() +{ + delete pImpl; +} + +void SvLinkSource::Closed() +{ + SvLinkSource_EntryIter_Impl aIter( pImpl->aArr ); + for( SvLinkSource_Entry_Impl* p = aIter.Curr(); p; p = aIter.Next() ) + if( !p->bIsDataSink ) + p->xSink->Closed(); +} + +ULONG SvLinkSource::GetUpdateTimeout() const +{ + return pImpl->nTimeout; +} + +void SvLinkSource::SetUpdateTimeout( ULONG nTimeout ) +{ + pImpl->nTimeout = nTimeout; + if( pImpl->pTimer ) + pImpl->pTimer->SetTimeout( nTimeout ); +} + +void SvLinkSource::SendDataChanged() +{ + SvLinkSource_EntryIter_Impl aIter( pImpl->aArr ); + for( SvLinkSource_Entry_ImplPtr p = aIter.Curr(); p; p = aIter.Next() ) + { + if( p->bIsDataSink ) + { + String sDataMimeType( pImpl->aDataMimeType ); + if( !sDataMimeType.Len() ) + sDataMimeType = p->aDataMimeType; + + Any aVal; + if( ( p->nAdviseModes & ADVISEMODE_NODATA ) || + GetData( aVal, sDataMimeType, TRUE ) ) + { + p->xSink->DataChanged( sDataMimeType, aVal ); + + if( p->nAdviseModes & ADVISEMODE_ONLYONCE ) + { + USHORT nFndPos = pImpl->aArr.GetPos( p ); + if( USHRT_MAX != nFndPos ) + pImpl->aArr.DeleteAndDestroy( nFndPos ); + } + + } + } + } + if( pImpl->pTimer ) + { + delete pImpl->pTimer; + pImpl->pTimer = NULL; + } + pImpl->aDataMimeType.Erase(); +} + +void SvLinkSource::NotifyDataChanged() +{ + if( pImpl->nTimeout ) + StartTimer( &pImpl->pTimer, this, pImpl->nTimeout ); // Timeout neu + else + { + SvLinkSource_EntryIter_Impl aIter( pImpl->aArr ); + for( SvLinkSource_Entry_ImplPtr p = aIter.Curr(); p; p = aIter.Next() ) + if( p->bIsDataSink ) + { + Any aVal; + if( ( p->nAdviseModes & ADVISEMODE_NODATA ) || + GetData( aVal, p->aDataMimeType, TRUE ) ) + { + p->xSink->DataChanged( p->aDataMimeType, aVal ); + + if( p->nAdviseModes & ADVISEMODE_ONLYONCE ) + { + USHORT nFndPos = pImpl->aArr.GetPos( p ); + if( USHRT_MAX != nFndPos ) + pImpl->aArr.DeleteAndDestroy( nFndPos ); + } + } + } + + if( pImpl->pTimer ) + { + delete pImpl->pTimer; + pImpl->pTimer = NULL; + } + } +} + +// notify the sink, the mime type is not +// a selection criterion +void SvLinkSource::DataChanged( const String & rMimeType, + const ::com::sun::star::uno::Any & rVal ) +{ + if( pImpl->nTimeout && !rVal.hasValue() ) + { // nur wenn keine Daten mitgegeben wurden + // fire all data to the sink, independent of the requested format + pImpl->aDataMimeType = rMimeType; + StartTimer( &pImpl->pTimer, this, pImpl->nTimeout ); // Timeout neu + } + else + { + SvLinkSource_EntryIter_Impl aIter( pImpl->aArr ); + for( SvLinkSource_Entry_ImplPtr p = aIter.Curr(); p; p = aIter.Next() ) + { + if( p->bIsDataSink ) + { + p->xSink->DataChanged( rMimeType, rVal ); + + if( p->nAdviseModes & ADVISEMODE_ONLYONCE ) + { + USHORT nFndPos = pImpl->aArr.GetPos( p ); + if( USHRT_MAX != nFndPos ) + pImpl->aArr.DeleteAndDestroy( nFndPos ); + } + } + } + + if( pImpl->pTimer ) + { + delete pImpl->pTimer; + pImpl->pTimer = NULL; + } + } +} + + +// only one link is correct +void SvLinkSource::AddDataAdvise( SvBaseLink * pLink, const String& rMimeType, + USHORT nAdviseModes ) +{ + SvLinkSource_Entry_ImplPtr pNew = new SvLinkSource_Entry_Impl( + pLink, rMimeType, nAdviseModes ); + pImpl->aArr.Insert( pNew, pImpl->aArr.Count() ); +} + +void SvLinkSource::RemoveAllDataAdvise( SvBaseLink * pLink ) +{ + SvLinkSource_EntryIter_Impl aIter( pImpl->aArr ); + for( SvLinkSource_Entry_ImplPtr p = aIter.Curr(); p; p = aIter.Next() ) + if( p->bIsDataSink && &p->xSink == pLink ) + { + USHORT nFndPos = pImpl->aArr.GetPos( p ); + if( USHRT_MAX != nFndPos ) + pImpl->aArr.DeleteAndDestroy( nFndPos ); + } +} + +// only one link is correct +void SvLinkSource::AddConnectAdvise( SvBaseLink * pLink ) +{ + SvLinkSource_Entry_ImplPtr pNew = new SvLinkSource_Entry_Impl( pLink ); + pImpl->aArr.Insert( pNew, pImpl->aArr.Count() ); +} + +void SvLinkSource::RemoveConnectAdvise( SvBaseLink * pLink ) +{ + SvLinkSource_EntryIter_Impl aIter( pImpl->aArr ); + for( SvLinkSource_Entry_ImplPtr p = aIter.Curr(); p; p = aIter.Next() ) + if( !p->bIsDataSink && &p->xSink == pLink ) + { + USHORT nFndPos = pImpl->aArr.GetPos( p ); + if( USHRT_MAX != nFndPos ) + pImpl->aArr.DeleteAndDestroy( nFndPos ); + } +} + +BOOL SvLinkSource::HasDataLinks( const SvBaseLink* pLink ) const +{ + BOOL bRet = FALSE; + const SvLinkSource_Entry_Impl* p; + for( USHORT n = 0, nEnd = pImpl->aArr.Count(); n < nEnd; ++n ) + if( ( p = pImpl->aArr[ n ] )->bIsDataSink && + ( !pLink || &p->xSink == pLink ) ) + { + bRet = TRUE; + break; + } + return bRet; +} + +// TRUE => waitinmg for data +BOOL SvLinkSource::IsPending() const +{ + return FALSE; +} + +// TRUE => data complete loaded +BOOL SvLinkSource::IsDataComplete() const +{ + return TRUE; +} + +BOOL SvLinkSource::Connect( SvBaseLink * ) +{ + return TRUE; +} + +BOOL SvLinkSource::GetData( ::com::sun::star::uno::Any & , + const String & , BOOL ) +{ + return FALSE; +} + +String SvLinkSource::Edit( Window *, SvBaseLink * ) +{ + return String(); +} + +} + |