diff options
Diffstat (limited to 'UnoControls/source/base/basecontainercontrol.cxx')
-rw-r--r-- | UnoControls/source/base/basecontainercontrol.cxx | 636 |
1 files changed, 0 insertions, 636 deletions
diff --git a/UnoControls/source/base/basecontainercontrol.cxx b/UnoControls/source/base/basecontainercontrol.cxx deleted file mode 100644 index 123449f10..000000000 --- a/UnoControls/source/base/basecontainercontrol.cxx +++ /dev/null @@ -1,636 +0,0 @@ -/* -*- 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. - * - ************************************************************************/ - -//____________________________________________________________________________________________________________ -// my own includes -//____________________________________________________________________________________________________________ - -#include "basecontainercontrol.hxx" - -//____________________________________________________________________________________________________________ -// includes of other projects -//____________________________________________________________________________________________________________ -#include <cppuhelper/typeprovider.hxx> - -//____________________________________________________________________________________________________________ -// includes of my own project -//____________________________________________________________________________________________________________ - -//____________________________________________________________________________________________________________ -// namespaces -//____________________________________________________________________________________________________________ - -using namespace ::cppu ; -using namespace ::osl ; -using namespace ::rtl ; -using namespace ::com::sun::star::uno ; -using namespace ::com::sun::star::lang ; -using namespace ::com::sun::star::awt ; -using namespace ::com::sun::star::container ; - -namespace unocontrols{ - -//____________________________________________________________________________________________________________ -// construct/destruct -//____________________________________________________________________________________________________________ - -BaseContainerControl::BaseContainerControl( const Reference< XMultiServiceFactory >& xFactory ) - : BaseControl ( xFactory ) - , m_aListeners ( m_aMutex ) -{ -} - -BaseContainerControl::~BaseContainerControl() -{ - impl_cleanMemory(); -} - -//____________________________________________________________________________________________________________ -// XInterface -//____________________________________________________________________________________________________________ - -Any SAL_CALL BaseContainerControl::queryInterface( const Type& rType ) throw( RuntimeException ) -{ - // Attention: - // Don't use mutex or guard in this method!!! Is a method of XInterface. - Any aReturn ; - Reference< XInterface > xDel = BaseControl::impl_getDelegator(); - if ( xDel.is() == sal_True ) - { - // If an delegator exist, forward question to his queryInterface. - // Delegator will ask his own queryAggregation! - aReturn = xDel->queryInterface( rType ); - } - else - { - // If an delegator unknown, forward question to own queryAggregation. - aReturn = queryAggregation( rType ); - } - - return aReturn ; -} - -//____________________________________________________________________________________________________________ -// XTypeProvider -//____________________________________________________________________________________________________________ - -Sequence< Type > SAL_CALL BaseContainerControl::getTypes() throw( RuntimeException ) -{ - // Optimize this method ! - // We initialize a static variable only one time. And we don't must use a mutex at every call! - // For the first call; pTypeCollection is NULL - for the second call pTypeCollection is different from NULL! - static OTypeCollection* pTypeCollection = NULL ; - - if ( pTypeCollection == NULL ) - { - // Ready for multithreading; get global mutex for first call of this method only! see before - MutexGuard aGuard( Mutex::getGlobalMutex() ); - - // Control these pointer again ... it can be, that another instance will be faster then these! - if ( pTypeCollection == NULL ) - { - // Create a static typecollection ... - static OTypeCollection aTypeCollection ( ::getCppuType(( const Reference< XControlModel >*)NULL ) , - ::getCppuType(( const Reference< XControlContainer >*)NULL ) , - BaseControl::getTypes() - ); - // ... and set his address to static pointer! - pTypeCollection = &aTypeCollection ; - } - } - - return pTypeCollection->getTypes(); -} - -//____________________________________________________________________________________________________________ -// XAggregation -//____________________________________________________________________________________________________________ - -Any SAL_CALL BaseContainerControl::queryAggregation( const Type& aType ) throw( RuntimeException ) -{ - // Ask for my own supported interfaces ... - // Attention: XTypeProvider and XInterface are supported by OComponentHelper! - Any aReturn ( ::cppu::queryInterface( aType , - static_cast< XControlModel* > ( this ) , - static_cast< XControlContainer* > ( this ) - ) - ); - - // If searched interface supported by this class ... - if ( aReturn.hasValue() == sal_True ) - { - // ... return this information. - return aReturn ; - } - else - { - // Else; ... ask baseclass for interfaces! - return BaseControl::queryAggregation( aType ); - } -} - -//____________________________________________________________________________________________________________ -// XControl -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::createPeer( const Reference< XToolkit >& xToolkit , - const Reference< XWindowPeer >& xParent ) throw( RuntimeException ) -{ - if ( getPeer().is() == sal_False ) - { - // create own peer - BaseControl::createPeer( xToolkit, xParent ); - - // create peers at all childs - Sequence< Reference< XControl > > seqControlList = getControls(); - sal_uInt32 nControls = seqControlList.getLength(); - - for ( sal_uInt32 n=0; n<nControls; n++ ) - { - seqControlList.getArray()[n]->createPeer( xToolkit, getPeer() ); - } - - // activate new tab order - impl_activateTabControllers(); - - } -} - -//____________________________________________________________________________________________________________ -// XControl -//____________________________________________________________________________________________________________ - -sal_Bool SAL_CALL BaseContainerControl::setModel( const Reference< XControlModel >& ) throw( RuntimeException ) -{ - // This object has NO model. - return sal_False ; -} - -//____________________________________________________________________________________________________________ -// XControl -//____________________________________________________________________________________________________________ - -Reference< XControlModel > SAL_CALL BaseContainerControl::getModel() throw( RuntimeException ) -{ - // This object has NO model. - // return (XControlModel*)this ; - return Reference< XControlModel >(); -} - -//____________________________________________________________________________________________________________ -// XComponent -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::dispose() throw( RuntimeException ) -{ - // Zuerst der Welt mitteilen, da� der Container wegfliegt. Dieses ist um einiges - // schneller wenn die Welt sowohl an den Controls als auch am Container horcht - - // Ready for multithreading - MutexGuard aGuard( m_aMutex ); - - // remove listeners - EventObject aObject ; - - aObject.Source = Reference< XComponent > ( (XControlContainer*)this, UNO_QUERY ); - m_aListeners.disposeAndClear( aObject ); - - // remove controls - Sequence< Reference< XControl > > seqCtrls = getControls(); - Reference< XControl > * pCtrls = seqCtrls.getArray(); - sal_uInt32 nCtrls = seqCtrls.getLength(); - size_t nMaxCount = maControlInfoList.size(); - size_t nCount = 0; - - for ( nCount = 0; nCount < nMaxCount; ++nCount ) - { - delete maControlInfoList[ nCount ]; - } - maControlInfoList.clear(); - - for ( nCount = 0; nCount < nCtrls; ++nCount ) - { - pCtrls [ nCount ] -> removeEventListener ( static_cast< XEventListener* >( static_cast< XWindowListener* >( this ) ) ) ; - pCtrls [ nCount ] -> dispose ( ) ; - } - - // call baseclass - BaseControl::dispose(); -} - -//____________________________________________________________________________________________________________ -// XEventListener -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::disposing( const EventObject& rEvent ) throw( RuntimeException ) -{ - Reference< XControl > xControl( rEvent.Source, UNO_QUERY ); - - // "removeControl" remove only, when control is an active control - removeControl( xControl ); -} - -//____________________________________________________________________________________________________________ -// XControlContainer -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::addControl ( const OUString& rName, const Reference< XControl > & rControl ) throw( RuntimeException ) -{ - if ( !rControl.is () ) - return; - - // take memory for new item - IMPL_ControlInfo* pNewControl = new IMPL_ControlInfo ; - - if (pNewControl!=(IMPL_ControlInfo*)0) - { - // Ready for multithreading - MutexGuard aGuard (m_aMutex) ; - - // set control - pNewControl->sName = rName ; - pNewControl->xControl = rControl ; - - // and insert in list - maControlInfoList.push_back( pNewControl ) ; - - // initialize new control - pNewControl->xControl->setContext ( (OWeakObject*)this ) ; - pNewControl->xControl->addEventListener ( static_cast< XEventListener* >( static_cast< XWindowListener* >( this ) ) ) ; - - // when container has a peer ... - if (getPeer().is()) - { - // .. then create a peer on child - pNewControl->xControl->createPeer ( getPeer()->getToolkit(), getPeer() ) ; - impl_activateTabControllers () ; - } - - // Send message to all listener - OInterfaceContainerHelper* pInterfaceContainer = m_aListeners.getContainer( ::getCppuType((const Reference< XContainerListener >*)0) ) ; - - if (pInterfaceContainer) - { - // Build event - ContainerEvent aEvent ; - - aEvent.Source = *this ; - aEvent.Element <<= rControl ; - - // Get all listener - OInterfaceIteratorHelper aIterator (*pInterfaceContainer) ; - - // Send event - while ( aIterator.hasMoreElements() ) - { - ((XContainerListener*)aIterator.next())->elementInserted (aEvent) ; - } - } - } -} - -//____________________________________________________________________________________________________________ -// XControlContainer -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::addContainerListener ( const Reference< XContainerListener > & rListener ) throw( RuntimeException ) -{ - // Ready for multithreading - MutexGuard aGuard ( m_aMutex ) ; - - m_aListeners.addInterface ( ::getCppuType((const Reference< XContainerListener >*)0), rListener ) ; -} - -//____________________________________________________________________________________________________________ -// XControlContainer -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::removeControl ( const Reference< XControl > & rControl ) throw( RuntimeException ) -{ - if ( rControl.is() ) - { - // Ready for multithreading - MutexGuard aGuard (m_aMutex) ; - - size_t nControls = maControlInfoList.size(); - - for ( size_t n = 0; n < nControls; n++ ) - { - // Search for right control - IMPL_ControlInfo* pControl = maControlInfoList[ n ] ; - if ( rControl == pControl->xControl ) - { - //.is it found ... remove listener from control - pControl->xControl->removeEventListener (static_cast< XEventListener* >( static_cast< XWindowListener* >( this ) )) ; - pControl->xControl->setContext ( Reference< XInterface > () ) ; - - // ... free memory - delete pControl ; - ::std::vector<IMPL_ControlInfo*>::iterator itr = maControlInfoList.begin(); - ::std::advance(itr, n); - maControlInfoList.erase(itr); - - // Send message to all other listener - OInterfaceContainerHelper * pInterfaceContainer = m_aListeners.getContainer( ::getCppuType((const Reference< XContainerListener >*)0) ) ; - - if (pInterfaceContainer) - { - ContainerEvent aEvent ; - - aEvent.Source = *this ; - aEvent.Element <<= rControl ; - - OInterfaceIteratorHelper aIterator (*pInterfaceContainer) ; - - while ( aIterator.hasMoreElements() ) - { - ((XContainerListener*)aIterator.next())->elementRemoved (aEvent) ; - } - } - // Break "for" ! - break ; - } - } - } -} - -//____________________________________________________________________________________________________________ -// XControlContainer -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::removeContainerListener ( const Reference< XContainerListener > & rListener ) throw( RuntimeException ) -{ - // Ready for multithreading - MutexGuard aGuard ( m_aMutex ) ; - - m_aListeners.removeInterface ( ::getCppuType((const Reference< XContainerListener >*)0), rListener ) ; -} - -//____________________________________________________________________________________________________________ -// XControlContainer -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::setStatusText ( const OUString& rStatusText ) throw( RuntimeException ) -{ - // go down to each parent - Reference< XControlContainer > xContainer ( getContext(), UNO_QUERY ) ; - - if ( xContainer.is () ) - { - xContainer->setStatusText ( rStatusText ) ; - } -} - -//____________________________________________________________________________________________________________ -// XControlContainer -//____________________________________________________________________________________________________________ - -Reference< XControl > SAL_CALL BaseContainerControl::getControl ( const OUString& rName ) throw( RuntimeException ) -{ - // Ready for multithreading - MutexGuard aGuard ( Mutex::getGlobalMutex() ) ; - - Reference< XControl > xRetControl = Reference< XControl > (); - size_t nControls = maControlInfoList.size(); - - // Search for right control - for( size_t nCount = 0; nCount < nControls; ++nCount ) - { - IMPL_ControlInfo* pSearchControl = maControlInfoList[ nCount ]; - - if ( pSearchControl->sName == rName ) - { - // We have found it ... - // Break operation and return. - return pSearchControl->xControl ; - } - } - - // We have not found it ... return NULL. - return Reference< XControl > () ; -} - -//____________________________________________________________________________________________________________ -// XControlContainer -//____________________________________________________________________________________________________________ - -Sequence< Reference< XControl > > SAL_CALL BaseContainerControl::getControls () throw( RuntimeException ) -{ - // Ready for multithreading - MutexGuard aGuard ( Mutex::getGlobalMutex() ) ; - - size_t nControls = maControlInfoList.size(); - size_t nCount = 0; - Sequence< Reference< XControl > > aDescriptor ( nControls ) ; - Reference< XControl > * pDestination = aDescriptor.getArray () ; - - // Copy controls to sequence - for( nCount = 0; nCount < nControls; ++nCount ) - { - IMPL_ControlInfo* pCopyControl = maControlInfoList[ nCount ]; - pDestination [ nCount ] = pCopyControl->xControl ; - } - - // Return sequence - return aDescriptor ; -} - -//____________________________________________________________________________________________________________ -// XUnoControlContainer -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::addTabController ( const Reference< XTabController > & rTabController ) throw( RuntimeException ) -{ - // Ready for multithreading - MutexGuard aGuard (m_aMutex) ; - - sal_uInt32 nOldCount = m_xTabControllerList.getLength () ; - Sequence< Reference< XTabController > > aNewList ( nOldCount + 1 ) ; - sal_uInt32 nCount = 0 ; - - // Copy old elements of sequence to new list. - for ( nCount = 0; nCount < nOldCount; ++nCount ) - { - aNewList.getArray () [nCount] = m_xTabControllerList.getConstArray () [nCount] ; - } - - // Add new controller - aNewList.getArray () [nOldCount] = rTabController ; - - // change old and new list - m_xTabControllerList = aNewList ; -} - -//____________________________________________________________________________________________________________ -// XUnoControlContainer -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::removeTabController ( const Reference< XTabController > & rTabController ) throw( RuntimeException ) -{ - // Ready for multithreading - MutexGuard aGuard (m_aMutex) ; - - sal_uInt32 nMaxCount = m_xTabControllerList.getLength () ; - sal_uInt32 nCount = 0 ; - - // Search right tabcontroller ... - for ( nCount = 0; nCount < nMaxCount; ++nCount ) - { - if ( m_xTabControllerList.getConstArray () [nCount] == rTabController ) - { - // ... if is it found ... remove it from list. - m_xTabControllerList.getArray()[ nCount ] = Reference< XTabController >() ; - break ; - } - } -} - -//____________________________________________________________________________________________________________ -// XUnoControlContainer -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::setTabControllers ( const Sequence< Reference< XTabController > >& rTabControllers ) throw( RuntimeException ) -{ - // Ready for multithreading - MutexGuard aGuard (m_aMutex) ; - - m_xTabControllerList = rTabControllers ; -} - -Sequence<Reference< XTabController > > SAL_CALL BaseContainerControl::getTabControllers () throw( RuntimeException ) -{ - // Ready for multithreading - MutexGuard aGuard (m_aMutex) ; - - return m_xTabControllerList ; -} - -//____________________________________________________________________________________________________________ -// XWindow -//____________________________________________________________________________________________________________ - -void SAL_CALL BaseContainerControl::setVisible ( sal_Bool bVisible ) throw( RuntimeException ) -{ - // override baseclass definition - BaseControl::setVisible ( bVisible ) ; - - // is it a top window ? - if ( !getContext().is() && bVisible ) - { - // then show it automaticly - createPeer ( Reference< XToolkit > (), Reference< XWindowPeer > () ) ; - } -} - -//____________________________________________________________________________________________________________ -// protected method -//____________________________________________________________________________________________________________ - -WindowDescriptor* BaseContainerControl::impl_getWindowDescriptor ( const Reference< XWindowPeer > & rParentPeer ) -{ - // - used from "createPeer()" to set the values of an WindowDescriptor !!! - // - if you will change the descriptor-values, you must override thid virtuell function - // - the caller must release the memory for this dynamical descriptor !!! - - WindowDescriptor * aDescriptor = new WindowDescriptor ; - - aDescriptor->Type = WindowClass_CONTAINER ; - aDescriptor->WindowServiceName = OUString(RTL_CONSTASCII_USTRINGPARAM("window")) ; - aDescriptor->ParentIndex = -1 ; - aDescriptor->Parent = rParentPeer ; - aDescriptor->Bounds = getPosSize () ; - aDescriptor->WindowAttributes = 0 ; - - return aDescriptor ; -} - -//____________________________________________________________________________________________________________ -// protected method -//____________________________________________________________________________________________________________ - -void BaseContainerControl::impl_paint ( sal_Int32 /*nX*/, sal_Int32 /*nY*/, const Reference< XGraphics > & /*rGraphics*/ ) -{ -/* - if (rGraphics.is()) - { - for ( size_t n = maControlInfoList.size(); n; ) - { - ControlInfo* pSearchControl = maControlInfoList[ --n ]; - pSearchControl->xControl->paint ( nX, nY, rGraphics ) ; - } - } -*/ -} - -//____________________________________________________________________________________________________________ -// private method -//____________________________________________________________________________________________________________ - -void BaseContainerControl::impl_activateTabControllers () -{ - // Ready for multithreading - MutexGuard aGuard (m_aMutex) ; - - sal_uInt32 nMaxCount = m_xTabControllerList.getLength () ; - sal_uInt32 nCount = 0 ; - - for ( nCount = 0; nCount < nMaxCount; ++nCount ) - { - m_xTabControllerList.getArray () [nCount]->setContainer ( this ) ; - m_xTabControllerList.getArray () [nCount]->activateTabOrder ( ) ; - } -} - -//____________________________________________________________________________________________________________ -// private method -//____________________________________________________________________________________________________________ - -void BaseContainerControl::impl_cleanMemory () -{ - // Get count of listitems. - size_t nMaxCount = maControlInfoList.size(); - size_t nCount = 0; - - // Delete all items. - for ( nCount = 0; nCount < nMaxCount; ++nCount ) - { - // Delete everytime first element of list! - // We count from 0 to MAX, where "MAX=count of items" BEFORE we delete some elements! - // If we use "GetObject ( nCount )" ... it can be, that we have an index greater then count of current elements! - - IMPL_ControlInfo* pSearchControl = maControlInfoList[ nCount ]; - delete pSearchControl; - } - - // Delete list himself. - maControlInfoList.clear (); -} - -} // namespace unocontrols - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |