xref: /AOO41X/main/framework/source/helper/ocomponentaccess.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_framework.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
32*cdf0e10cSrcweir //	my own includes
33*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
34*cdf0e10cSrcweir #include <helper/ocomponentaccess.hxx>
35*cdf0e10cSrcweir #include <helper/ocomponentenumeration.hxx>
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir #ifndef _FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_
38*cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx>
39*cdf0e10cSrcweir #endif
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
42*cdf0e10cSrcweir //	interface includes
43*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
44*cdf0e10cSrcweir #include <com/sun/star/frame/FrameSearchFlag.hpp>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
47*cdf0e10cSrcweir //	includes of other projects
48*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
49*cdf0e10cSrcweir #include <vcl/svapp.hxx>
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
52*cdf0e10cSrcweir //	namespace
53*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir namespace framework{
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir using namespace ::com::sun::star::container		;
58*cdf0e10cSrcweir using namespace ::com::sun::star::frame			;
59*cdf0e10cSrcweir using namespace ::com::sun::star::lang			;
60*cdf0e10cSrcweir using namespace ::com::sun::star::uno			;
61*cdf0e10cSrcweir using namespace ::cppu							;
62*cdf0e10cSrcweir using namespace ::osl							;
63*cdf0e10cSrcweir using namespace ::rtl							;
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
66*cdf0e10cSrcweir //	non exported const
67*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
70*cdf0e10cSrcweir //	non exported definitions
71*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
74*cdf0e10cSrcweir //	declarations
75*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir //*****************************************************************************************************************
78*cdf0e10cSrcweir //	constructor
79*cdf0e10cSrcweir //*****************************************************************************************************************
80*cdf0e10cSrcweir OComponentAccess::OComponentAccess( const css::uno::Reference< XDesktop >& xOwner )
81*cdf0e10cSrcweir 		//	Init baseclasses first
82*cdf0e10cSrcweir         :   ThreadHelpBase  ( &Application::GetSolarMutex() )
83*cdf0e10cSrcweir 		// Init member
84*cdf0e10cSrcweir         ,   m_xOwner        ( xOwner                        )
85*cdf0e10cSrcweir {
86*cdf0e10cSrcweir 	// Safe impossible cases
87*cdf0e10cSrcweir     LOG_ASSERT( impldbg_checkParameter_OComponentAccessCtor( xOwner ), "OComponentAccess::OComponentAccess()\nInvalid parameter detected!\n" )
88*cdf0e10cSrcweir }
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir //*****************************************************************************************************************
91*cdf0e10cSrcweir //	destructor
92*cdf0e10cSrcweir //*****************************************************************************************************************
93*cdf0e10cSrcweir OComponentAccess::~OComponentAccess()
94*cdf0e10cSrcweir {
95*cdf0e10cSrcweir }
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir //*****************************************************************************************************************
98*cdf0e10cSrcweir //	XEnumerationAccess
99*cdf0e10cSrcweir //*****************************************************************************************************************
100*cdf0e10cSrcweir css::uno::Reference< XEnumeration > SAL_CALL OComponentAccess::createEnumeration() throw( RuntimeException )
101*cdf0e10cSrcweir {
102*cdf0e10cSrcweir 	// Ready for multithreading
103*cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir 	// Set default return value, if method failed.
106*cdf0e10cSrcweir 	// If no desktop exist and there is no task container - return an empty enumeration!
107*cdf0e10cSrcweir 	css::uno::Reference< XEnumeration > xReturn = css::uno::Reference< XEnumeration >();
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir 	// Try to "lock" the desktop for access to task container.
110*cdf0e10cSrcweir 	css::uno::Reference< XInterface > xLock = m_xOwner.get();
111*cdf0e10cSrcweir 	if ( xLock.is() == sal_True )
112*cdf0e10cSrcweir 	{
113*cdf0e10cSrcweir 		// Desktop exist => pointer to task container must be valid.
114*cdf0e10cSrcweir 		// Initialize a new enumeration ... if some tasks and his components exist!
115*cdf0e10cSrcweir 		// (OTasksEnumeration will make an assert, if we initialize the new instance without valid values!)
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir 		Sequence< css::uno::Reference< XComponent > > seqComponents;
118*cdf0e10cSrcweir 		impl_collectAllChildComponents( css::uno::Reference< XFramesSupplier >( xLock, UNO_QUERY ), seqComponents );
119*cdf0e10cSrcweir 		OComponentEnumeration* pEnumeration = new OComponentEnumeration( seqComponents );
120*cdf0e10cSrcweir 		xReturn = css::uno::Reference< XEnumeration >( (OWeakObject*)pEnumeration, UNO_QUERY );
121*cdf0e10cSrcweir 	}
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir 	// Return result of this operation.
124*cdf0e10cSrcweir 	return xReturn;
125*cdf0e10cSrcweir }
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir //*****************************************************************************************************************
128*cdf0e10cSrcweir //	XElementAccess
129*cdf0e10cSrcweir //*****************************************************************************************************************
130*cdf0e10cSrcweir Type SAL_CALL OComponentAccess::getElementType() throw( RuntimeException )
131*cdf0e10cSrcweir {
132*cdf0e10cSrcweir 	// Elements in list an enumeration are components!
133*cdf0e10cSrcweir 	// Return the uno-type of XComponent.
134*cdf0e10cSrcweir 	return ::getCppuType((const css::uno::Reference< XComponent >*)NULL);
135*cdf0e10cSrcweir }
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir //*****************************************************************************************************************
138*cdf0e10cSrcweir //	XElementAccess
139*cdf0e10cSrcweir //*****************************************************************************************************************
140*cdf0e10cSrcweir sal_Bool SAL_CALL OComponentAccess::hasElements() throw( RuntimeException )
141*cdf0e10cSrcweir {
142*cdf0e10cSrcweir 	// Ready for multithreading
143*cdf0e10cSrcweir 	ResetableGuard aGuard( m_aLock );
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir 	// Set default return value, if method failed.
146*cdf0e10cSrcweir 	sal_Bool bReturn = sal_False;
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir 	// Try to "lock" the desktop for access to task container.
149*cdf0e10cSrcweir 	css::uno::Reference< XFramesSupplier > xLock( m_xOwner.get(), UNO_QUERY );
150*cdf0e10cSrcweir 	if ( xLock.is() == sal_True )
151*cdf0e10cSrcweir 	{
152*cdf0e10cSrcweir 		// Ask container of owner for existing elements.
153*cdf0e10cSrcweir 		bReturn = xLock->getFrames()->hasElements();
154*cdf0e10cSrcweir 	}
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir 	// Return result of this operation.
157*cdf0e10cSrcweir 	return bReturn;
158*cdf0e10cSrcweir }
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir //*****************************************************************************************************************
161*cdf0e10cSrcweir //	private method
162*cdf0e10cSrcweir //*****************************************************************************************************************
163*cdf0e10cSrcweir void OComponentAccess::impl_collectAllChildComponents(	const	css::uno::Reference< XFramesSupplier >&			xNode			,
164*cdf0e10cSrcweir 	 															Sequence< css::uno::Reference< XComponent > >&	seqComponents	)
165*cdf0e10cSrcweir {
166*cdf0e10cSrcweir 	// If valid node was given ...
167*cdf0e10cSrcweir 	if( xNode.is() == sal_True )
168*cdf0e10cSrcweir 	{
169*cdf0e10cSrcweir 		// ... continue collection at these.
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir 		// Get the container of current node, collect the components of existing child frames
172*cdf0e10cSrcweir 		// and go down to next level in tree (recursive!).
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir 		sal_Int32 nComponentCount = seqComponents.getLength();
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir 		const css::uno::Reference< XFrames >				xContainer	= xNode->getFrames();
177*cdf0e10cSrcweir 		const Sequence< css::uno::Reference< XFrame > >	seqFrames	= xContainer->queryFrames( FrameSearchFlag::CHILDREN );
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir 		const sal_Int32 nFrameCount = seqFrames.getLength();
180*cdf0e10cSrcweir 		for( sal_Int32 nFrame=0; nFrame<nFrameCount; ++nFrame )
181*cdf0e10cSrcweir 		{
182*cdf0e10cSrcweir 			css::uno::Reference< XComponent > xComponent = impl_getFrameComponent( seqFrames[nFrame] );
183*cdf0e10cSrcweir 			if( xComponent.is() == sal_True )
184*cdf0e10cSrcweir 			{
185*cdf0e10cSrcweir 				nComponentCount++;
186*cdf0e10cSrcweir 				seqComponents.realloc( nComponentCount );
187*cdf0e10cSrcweir 				seqComponents[nComponentCount-1] = xComponent;
188*cdf0e10cSrcweir 			}
189*cdf0e10cSrcweir 		}
190*cdf0e10cSrcweir 	}
191*cdf0e10cSrcweir 	// ... otherwise break a recursive path and go back at current stack!
192*cdf0e10cSrcweir }
193*cdf0e10cSrcweir 
194*cdf0e10cSrcweir //*****************************************************************************************************************
195*cdf0e10cSrcweir //	private method
196*cdf0e10cSrcweir //*****************************************************************************************************************
197*cdf0e10cSrcweir css::uno::Reference< XComponent > OComponentAccess::impl_getFrameComponent( const css::uno::Reference< XFrame >& xFrame ) const
198*cdf0e10cSrcweir {
199*cdf0e10cSrcweir 	// Set default return value, if method failed.
200*cdf0e10cSrcweir 	css::uno::Reference< XComponent > xComponent = css::uno::Reference< XComponent >();
201*cdf0e10cSrcweir 	// Does no controller exists?
202*cdf0e10cSrcweir 	css::uno::Reference< XController > xController = xFrame->getController();
203*cdf0e10cSrcweir 	if ( xController.is() == sal_False )
204*cdf0e10cSrcweir 	{
205*cdf0e10cSrcweir 		// Controller not exist - use the VCL-component.
206*cdf0e10cSrcweir 		xComponent = css::uno::Reference< XComponent >( xFrame->getComponentWindow(), UNO_QUERY );
207*cdf0e10cSrcweir 	}
208*cdf0e10cSrcweir 	else
209*cdf0e10cSrcweir 	{
210*cdf0e10cSrcweir 		// Does no model exists?
211*cdf0e10cSrcweir 		css::uno::Reference< XModel > xModel( xController->getModel(), UNO_QUERY );
212*cdf0e10cSrcweir 		if ( xModel.is() == sal_True )
213*cdf0e10cSrcweir 		{
214*cdf0e10cSrcweir 			// Model exist - use the model as component.
215*cdf0e10cSrcweir 			xComponent = css::uno::Reference< XComponent >( xModel, UNO_QUERY );
216*cdf0e10cSrcweir 		}
217*cdf0e10cSrcweir 		else
218*cdf0e10cSrcweir 		{
219*cdf0e10cSrcweir 			// Model not exist - use the controller as component.
220*cdf0e10cSrcweir 			xComponent = css::uno::Reference< XComponent >( xController, UNO_QUERY );
221*cdf0e10cSrcweir 		}
222*cdf0e10cSrcweir 	}
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir 	return xComponent;
225*cdf0e10cSrcweir }
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
228*cdf0e10cSrcweir //	debug methods
229*cdf0e10cSrcweir //_________________________________________________________________________________________________________________
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir /*-----------------------------------------------------------------------------------------------------------------
232*cdf0e10cSrcweir 	The follow methods checks the parameter for other functions. If a parameter or his value is non valid,
233*cdf0e10cSrcweir 	we return "sal_False". (else sal_True) This mechanism is used to throw an ASSERT!
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir 	ATTENTION
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir 		If you miss a test for one of this parameters, contact the autor or add it himself !(?)
238*cdf0e10cSrcweir 		But ... look for right testing! See using of this methods!
239*cdf0e10cSrcweir -----------------------------------------------------------------------------------------------------------------*/
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir #ifdef ENABLE_ASSERTIONS
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir //*****************************************************************************************************************
244*cdf0e10cSrcweir sal_Bool OComponentAccess::impldbg_checkParameter_OComponentAccessCtor( const   css::uno::Reference< XDesktop >&      xOwner  )
245*cdf0e10cSrcweir {
246*cdf0e10cSrcweir 	// Set default return value.
247*cdf0e10cSrcweir 	sal_Bool bOK = sal_True;
248*cdf0e10cSrcweir 	// Check parameter.
249*cdf0e10cSrcweir 	if	(
250*cdf0e10cSrcweir 			( &xOwner		==	NULL		)	||
251*cdf0e10cSrcweir 			( xOwner.is()	==	sal_False	)
252*cdf0e10cSrcweir 		)
253*cdf0e10cSrcweir 	{
254*cdf0e10cSrcweir 		bOK = sal_False ;
255*cdf0e10cSrcweir 	}
256*cdf0e10cSrcweir 	// Return result of check.
257*cdf0e10cSrcweir 	return bOK ;
258*cdf0e10cSrcweir }
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir #endif	//	#ifdef ENABLE_ASSERTIONS
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir }		//	namespace framework
263