|  | /************************************************************** | 
|  | * | 
|  | * 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. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_framework.hxx" | 
|  |  | 
|  | //_________________________________________________________________________________________________________________ | 
|  | //	my own includes | 
|  | //_________________________________________________________________________________________________________________ | 
|  | #include <helper/ocomponentaccess.hxx> | 
|  | #include <helper/ocomponentenumeration.hxx> | 
|  |  | 
|  | #ifndef _FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_ | 
|  | #include <threadhelp/resetableguard.hxx> | 
|  | #endif | 
|  |  | 
|  | //_________________________________________________________________________________________________________________ | 
|  | //	interface includes | 
|  | //_________________________________________________________________________________________________________________ | 
|  | #include <com/sun/star/frame/FrameSearchFlag.hpp> | 
|  |  | 
|  | //_________________________________________________________________________________________________________________ | 
|  | //	includes of other projects | 
|  | //_________________________________________________________________________________________________________________ | 
|  | #include <vcl/svapp.hxx> | 
|  |  | 
|  | //_________________________________________________________________________________________________________________ | 
|  | //	namespace | 
|  | //_________________________________________________________________________________________________________________ | 
|  |  | 
|  | namespace framework{ | 
|  |  | 
|  | using namespace ::com::sun::star::container		; | 
|  | using namespace ::com::sun::star::frame			; | 
|  | using namespace ::com::sun::star::lang			; | 
|  | using namespace ::com::sun::star::uno			; | 
|  | using namespace ::cppu							; | 
|  | using namespace ::osl							; | 
|  | using namespace ::rtl							; | 
|  |  | 
|  | //_________________________________________________________________________________________________________________ | 
|  | //	non exported const | 
|  | //_________________________________________________________________________________________________________________ | 
|  |  | 
|  | //_________________________________________________________________________________________________________________ | 
|  | //	non exported definitions | 
|  | //_________________________________________________________________________________________________________________ | 
|  |  | 
|  | //_________________________________________________________________________________________________________________ | 
|  | //	declarations | 
|  | //_________________________________________________________________________________________________________________ | 
|  |  | 
|  | //***************************************************************************************************************** | 
|  | //	constructor | 
|  | //***************************************************************************************************************** | 
|  | OComponentAccess::OComponentAccess( const css::uno::Reference< XDesktop >& xOwner ) | 
|  | //	Init baseclasses first | 
|  | :   ThreadHelpBase  ( &Application::GetSolarMutex() ) | 
|  | // Init member | 
|  | ,   m_xOwner        ( xOwner                        ) | 
|  | { | 
|  | // Safe impossible cases | 
|  | LOG_ASSERT( impldbg_checkParameter_OComponentAccessCtor( xOwner ), "OComponentAccess::OComponentAccess()\nInvalid parameter detected!\n" ) | 
|  | } | 
|  |  | 
|  | //***************************************************************************************************************** | 
|  | //	destructor | 
|  | //***************************************************************************************************************** | 
|  | OComponentAccess::~OComponentAccess() | 
|  | { | 
|  | } | 
|  |  | 
|  | //***************************************************************************************************************** | 
|  | //	XEnumerationAccess | 
|  | //***************************************************************************************************************** | 
|  | css::uno::Reference< XEnumeration > SAL_CALL OComponentAccess::createEnumeration() throw( RuntimeException ) | 
|  | { | 
|  | // Ready for multithreading | 
|  | ResetableGuard aGuard( m_aLock ); | 
|  |  | 
|  | // Set default return value, if method failed. | 
|  | // If no desktop exist and there is no task container - return an empty enumeration! | 
|  | css::uno::Reference< XEnumeration > xReturn = css::uno::Reference< XEnumeration >(); | 
|  |  | 
|  | // Try to "lock" the desktop for access to task container. | 
|  | css::uno::Reference< XInterface > xLock = m_xOwner.get(); | 
|  | if ( xLock.is() == sal_True ) | 
|  | { | 
|  | // Desktop exist => pointer to task container must be valid. | 
|  | // Initialize a new enumeration ... if some tasks and his components exist! | 
|  | // (OTasksEnumeration will make an assert, if we initialize the new instance without valid values!) | 
|  |  | 
|  | Sequence< css::uno::Reference< XComponent > > seqComponents; | 
|  | impl_collectAllChildComponents( css::uno::Reference< XFramesSupplier >( xLock, UNO_QUERY ), seqComponents ); | 
|  | OComponentEnumeration* pEnumeration = new OComponentEnumeration( seqComponents ); | 
|  | xReturn = css::uno::Reference< XEnumeration >( (OWeakObject*)pEnumeration, UNO_QUERY ); | 
|  | } | 
|  |  | 
|  | // Return result of this operation. | 
|  | return xReturn; | 
|  | } | 
|  |  | 
|  | //***************************************************************************************************************** | 
|  | //	XElementAccess | 
|  | //***************************************************************************************************************** | 
|  | Type SAL_CALL OComponentAccess::getElementType() throw( RuntimeException ) | 
|  | { | 
|  | // Elements in list an enumeration are components! | 
|  | // Return the uno-type of XComponent. | 
|  | return ::getCppuType((const css::uno::Reference< XComponent >*)NULL); | 
|  | } | 
|  |  | 
|  | //***************************************************************************************************************** | 
|  | //	XElementAccess | 
|  | //***************************************************************************************************************** | 
|  | sal_Bool SAL_CALL OComponentAccess::hasElements() throw( RuntimeException ) | 
|  | { | 
|  | // Ready for multithreading | 
|  | ResetableGuard aGuard( m_aLock ); | 
|  |  | 
|  | // Set default return value, if method failed. | 
|  | sal_Bool bReturn = sal_False; | 
|  |  | 
|  | // Try to "lock" the desktop for access to task container. | 
|  | css::uno::Reference< XFramesSupplier > xLock( m_xOwner.get(), UNO_QUERY ); | 
|  | if ( xLock.is() == sal_True ) | 
|  | { | 
|  | // Ask container of owner for existing elements. | 
|  | bReturn = xLock->getFrames()->hasElements(); | 
|  | } | 
|  |  | 
|  | // Return result of this operation. | 
|  | return bReturn; | 
|  | } | 
|  |  | 
|  | //***************************************************************************************************************** | 
|  | //	private method | 
|  | //***************************************************************************************************************** | 
|  | void OComponentAccess::impl_collectAllChildComponents(	const	css::uno::Reference< XFramesSupplier >&			xNode			, | 
|  | Sequence< css::uno::Reference< XComponent > >&	seqComponents	) | 
|  | { | 
|  | // If valid node was given ... | 
|  | if( xNode.is() == sal_True ) | 
|  | { | 
|  | // ... continue collection at these. | 
|  |  | 
|  | // Get the container of current node, collect the components of existing child frames | 
|  | // and go down to next level in tree (recursive!). | 
|  |  | 
|  | sal_Int32 nComponentCount = seqComponents.getLength(); | 
|  |  | 
|  | const css::uno::Reference< XFrames >				xContainer	= xNode->getFrames(); | 
|  | const Sequence< css::uno::Reference< XFrame > >	seqFrames	= xContainer->queryFrames( FrameSearchFlag::CHILDREN ); | 
|  |  | 
|  | const sal_Int32 nFrameCount = seqFrames.getLength(); | 
|  | for( sal_Int32 nFrame=0; nFrame<nFrameCount; ++nFrame ) | 
|  | { | 
|  | css::uno::Reference< XComponent > xComponent = impl_getFrameComponent( seqFrames[nFrame] ); | 
|  | if( xComponent.is() == sal_True ) | 
|  | { | 
|  | nComponentCount++; | 
|  | seqComponents.realloc( nComponentCount ); | 
|  | seqComponents[nComponentCount-1] = xComponent; | 
|  | } | 
|  | } | 
|  | } | 
|  | // ... otherwise break a recursive path and go back at current stack! | 
|  | } | 
|  |  | 
|  | //***************************************************************************************************************** | 
|  | //	private method | 
|  | //***************************************************************************************************************** | 
|  | css::uno::Reference< XComponent > OComponentAccess::impl_getFrameComponent( const css::uno::Reference< XFrame >& xFrame ) const | 
|  | { | 
|  | // Set default return value, if method failed. | 
|  | css::uno::Reference< XComponent > xComponent = css::uno::Reference< XComponent >(); | 
|  | // Does no controller exists? | 
|  | css::uno::Reference< XController > xController = xFrame->getController(); | 
|  | if ( xController.is() == sal_False ) | 
|  | { | 
|  | // Controller not exist - use the VCL-component. | 
|  | xComponent = css::uno::Reference< XComponent >( xFrame->getComponentWindow(), UNO_QUERY ); | 
|  | } | 
|  | else | 
|  | { | 
|  | // Does no model exists? | 
|  | css::uno::Reference< XModel > xModel( xController->getModel(), UNO_QUERY ); | 
|  | if ( xModel.is() == sal_True ) | 
|  | { | 
|  | // Model exist - use the model as component. | 
|  | xComponent = css::uno::Reference< XComponent >( xModel, UNO_QUERY ); | 
|  | } | 
|  | else | 
|  | { | 
|  | // Model not exist - use the controller as component. | 
|  | xComponent = css::uno::Reference< XComponent >( xController, UNO_QUERY ); | 
|  | } | 
|  | } | 
|  |  | 
|  | return xComponent; | 
|  | } | 
|  |  | 
|  | //_________________________________________________________________________________________________________________ | 
|  | //	debug methods | 
|  | //_________________________________________________________________________________________________________________ | 
|  |  | 
|  | /*----------------------------------------------------------------------------------------------------------------- | 
|  | The follow methods checks the parameter for other functions. If a parameter or his value is non valid, | 
|  | we return "sal_False". (else sal_True) This mechanism is used to throw an ASSERT! | 
|  |  | 
|  | ATTENTION | 
|  |  | 
|  | If you miss a test for one of this parameters, contact the author or add it himself !(?) | 
|  | But ... look for right testing! See using of this methods! | 
|  | -----------------------------------------------------------------------------------------------------------------*/ | 
|  |  | 
|  | #ifdef ENABLE_ASSERTIONS | 
|  |  | 
|  | //***************************************************************************************************************** | 
|  | sal_Bool OComponentAccess::impldbg_checkParameter_OComponentAccessCtor( const   css::uno::Reference< XDesktop >&      xOwner  ) | 
|  | { | 
|  | // Set default return value. | 
|  | sal_Bool bOK = sal_True; | 
|  | // Check parameter. | 
|  | if	( | 
|  | ( &xOwner		==	NULL		)	|| | 
|  | ( xOwner.is()	==	sal_False	) | 
|  | ) | 
|  | { | 
|  | bOK = sal_False ; | 
|  | } | 
|  | // Return result of check. | 
|  | return bOK ; | 
|  | } | 
|  |  | 
|  | #endif	//	#ifdef ENABLE_ASSERTIONS | 
|  |  | 
|  | }		//	namespace framework |