xref: /AOO41X/main/UnoControls/source/controls/framecontrol.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 
29*cdf0e10cSrcweir //______________________________________________________________________________________________________________
30*cdf0e10cSrcweir //	my own include
31*cdf0e10cSrcweir //______________________________________________________________________________________________________________
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include "framecontrol.hxx"
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir //______________________________________________________________________________________________________________
36*cdf0e10cSrcweir //	includes of other projects
37*cdf0e10cSrcweir //______________________________________________________________________________________________________________
38*cdf0e10cSrcweir #include <com/sun/star/frame/XDispatchProvider.hpp>
39*cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp>
40*cdf0e10cSrcweir #include <com/sun/star/frame/XDispatch.hpp>
41*cdf0e10cSrcweir #include <com/sun/star/frame/FrameSearchFlag.hpp>
42*cdf0e10cSrcweir #include <com/sun/star/frame/FrameSearchFlag.hpp>
43*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
44*cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
45*cdf0e10cSrcweir #include <vos/diagnose.hxx>
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir //______________________________________________________________________________________________________________
48*cdf0e10cSrcweir //	include of my own project
49*cdf0e10cSrcweir //______________________________________________________________________________________________________________
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir //______________________________________________________________________________________________________________
52*cdf0e10cSrcweir //	namespaces
53*cdf0e10cSrcweir //______________________________________________________________________________________________________________
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir using namespace	::rtl					;
56*cdf0e10cSrcweir using namespace	::osl					;
57*cdf0e10cSrcweir using namespace	::cppu					;
58*cdf0e10cSrcweir using namespace	::com::sun::star::uno	;
59*cdf0e10cSrcweir using namespace	::com::sun::star::lang	;
60*cdf0e10cSrcweir using namespace	::com::sun::star::beans	;
61*cdf0e10cSrcweir using namespace	::com::sun::star::awt	;
62*cdf0e10cSrcweir using namespace	::com::sun::star::frame	;
63*cdf0e10cSrcweir using namespace	::com::sun::star::util	;
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir namespace unocontrols{
66*cdf0e10cSrcweir 
67*cdf0e10cSrcweir //______________________________________________________________________________________________________________
68*cdf0e10cSrcweir //	construct/destruct
69*cdf0e10cSrcweir //______________________________________________________________________________________________________________
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir FrameControl::FrameControl( const Reference< XMultiServiceFactory >& xFactory )
72*cdf0e10cSrcweir 	: BaseControl					( xFactory																				)
73*cdf0e10cSrcweir 	, OBroadcastHelper				( m_aMutex																				)
74*cdf0e10cSrcweir 	, OPropertySetHelper			( *SAL_STATIC_CAST( OBroadcastHelper *, this )	)
75*cdf0e10cSrcweir 	, m_aInterfaceContainer			( m_aMutex																				)
76*cdf0e10cSrcweir 	, m_aConnectionPointContainer	( m_aMutex																				)
77*cdf0e10cSrcweir {
78*cdf0e10cSrcweir }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir FrameControl::~FrameControl()
81*cdf0e10cSrcweir {
82*cdf0e10cSrcweir }
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir //____________________________________________________________________________________________________________
85*cdf0e10cSrcweir //	XInterface
86*cdf0e10cSrcweir //____________________________________________________________________________________________________________
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir Any SAL_CALL FrameControl::queryInterface( const Type& rType ) throw( RuntimeException )
89*cdf0e10cSrcweir {
90*cdf0e10cSrcweir 	// Attention:
91*cdf0e10cSrcweir 	//	Don't use mutex or guard in this method!!! Is a method of XInterface.
92*cdf0e10cSrcweir 	Any aReturn ;
93*cdf0e10cSrcweir 	Reference< XInterface > xDel = BaseControl::impl_getDelegator();
94*cdf0e10cSrcweir 	if ( xDel.is() )
95*cdf0e10cSrcweir 	{
96*cdf0e10cSrcweir 		// If an delegator exist, forward question to his queryInterface.
97*cdf0e10cSrcweir 		// Delegator will ask his own queryAggregation!
98*cdf0e10cSrcweir 		aReturn = xDel->queryInterface( rType );
99*cdf0e10cSrcweir 	}
100*cdf0e10cSrcweir 	else
101*cdf0e10cSrcweir 	{
102*cdf0e10cSrcweir 		// If an delegator unknown, forward question to own queryAggregation.
103*cdf0e10cSrcweir 		aReturn = queryAggregation( rType );
104*cdf0e10cSrcweir 	}
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir 	return aReturn ;
107*cdf0e10cSrcweir }
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir //____________________________________________________________________________________________________________
110*cdf0e10cSrcweir //	XInterface
111*cdf0e10cSrcweir //____________________________________________________________________________________________________________
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir void SAL_CALL FrameControl::acquire() throw()
114*cdf0e10cSrcweir {
115*cdf0e10cSrcweir 	// Attention:
116*cdf0e10cSrcweir 	//	Don't use mutex or guard in this method!!! Is a method of XInterface.
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir 	// Forward to baseclass
119*cdf0e10cSrcweir 	BaseControl::acquire();
120*cdf0e10cSrcweir }
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir //____________________________________________________________________________________________________________
123*cdf0e10cSrcweir //	XInterface
124*cdf0e10cSrcweir //____________________________________________________________________________________________________________
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir void SAL_CALL FrameControl::release() throw()
127*cdf0e10cSrcweir {
128*cdf0e10cSrcweir 	// Attention:
129*cdf0e10cSrcweir 	//	Don't use mutex or guard in this method!!! Is a method of XInterface.
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir 	// Forward to baseclass
132*cdf0e10cSrcweir 	BaseControl::release();
133*cdf0e10cSrcweir }
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir //____________________________________________________________________________________________________________
136*cdf0e10cSrcweir //	XTypeProvider
137*cdf0e10cSrcweir //____________________________________________________________________________________________________________
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir Sequence< Type > SAL_CALL FrameControl::getTypes() throw( RuntimeException )
140*cdf0e10cSrcweir {
141*cdf0e10cSrcweir 	// Optimize this method !
142*cdf0e10cSrcweir 	// We initialize a static variable only one time. And we don't must use a mutex at every call!
143*cdf0e10cSrcweir 	// For the first call; pTypeCollection is NULL - for the second call pTypeCollection is different from NULL!
144*cdf0e10cSrcweir 	static OTypeCollection* pTypeCollection = NULL ;
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir 	if ( pTypeCollection == NULL )
147*cdf0e10cSrcweir 	{
148*cdf0e10cSrcweir 		// Ready for multithreading; get global mutex for first call of this method only! see before
149*cdf0e10cSrcweir 		MutexGuard aGuard( Mutex::getGlobalMutex() );
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir 		// Control these pointer again ... it can be, that another instance will be faster then these!
152*cdf0e10cSrcweir 		if ( pTypeCollection == NULL )
153*cdf0e10cSrcweir 		{
154*cdf0e10cSrcweir 			// Create a static typecollection ...
155*cdf0e10cSrcweir 			static OTypeCollection aTypeCollection	(	::getCppuType(( const Reference< XControlModel				>*)NULL )	,
156*cdf0e10cSrcweir 												  		::getCppuType(( const Reference< XControlContainer			>*)NULL )	,
157*cdf0e10cSrcweir 												  		::getCppuType(( const Reference< XConnectionPointContainer	>*)NULL )	,
158*cdf0e10cSrcweir 														BaseControl::getTypes()
159*cdf0e10cSrcweir 													);
160*cdf0e10cSrcweir 			// ... and set his address to static pointer!
161*cdf0e10cSrcweir 			pTypeCollection = &aTypeCollection ;
162*cdf0e10cSrcweir 		}
163*cdf0e10cSrcweir 	}
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir 	return pTypeCollection->getTypes();
166*cdf0e10cSrcweir }
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir //____________________________________________________________________________________________________________
169*cdf0e10cSrcweir //	XAggregation
170*cdf0e10cSrcweir //____________________________________________________________________________________________________________
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir Any SAL_CALL FrameControl::queryAggregation( const Type& aType ) throw( RuntimeException )
173*cdf0e10cSrcweir {
174*cdf0e10cSrcweir 	// Ask for my own supported interfaces ...
175*cdf0e10cSrcweir 	// Attention: XTypeProvider and XInterface are supported by OComponentHelper!
176*cdf0e10cSrcweir 	Any aReturn	( ::cppu::queryInterface(	aType												,
177*cdf0e10cSrcweir 									   		static_cast< XControlModel*				> ( this )	,
178*cdf0e10cSrcweir 									   		static_cast< XConnectionPointContainer*	> ( this )
179*cdf0e10cSrcweir 										)
180*cdf0e10cSrcweir 				);
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir 	// If searched interface not supported by this class ...
183*cdf0e10cSrcweir 	if ( aReturn.hasValue() == sal_False )
184*cdf0e10cSrcweir 	{
185*cdf0e10cSrcweir 		// ... ask baseclasses.
186*cdf0e10cSrcweir 		aReturn = OPropertySetHelper::queryInterface( aType );
187*cdf0e10cSrcweir 		if ( aReturn.hasValue() == sal_False )
188*cdf0e10cSrcweir 		{
189*cdf0e10cSrcweir 			aReturn = BaseControl::queryAggregation( aType );
190*cdf0e10cSrcweir 		}
191*cdf0e10cSrcweir 	}
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir 	return aReturn ;
194*cdf0e10cSrcweir }
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir //____________________________________________________________________________________________________________
197*cdf0e10cSrcweir //	XControl
198*cdf0e10cSrcweir //____________________________________________________________________________________________________________
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir void SAL_CALL FrameControl::createPeer(	const	Reference< XToolkit >&		xToolkit	,
201*cdf0e10cSrcweir 										const	Reference< XWindowPeer >&	xParentPeer	) throw( RuntimeException )
202*cdf0e10cSrcweir {
203*cdf0e10cSrcweir 	BaseControl::createPeer( xToolkit, xParentPeer );
204*cdf0e10cSrcweir 	if ( impl_getPeerWindow().is() )
205*cdf0e10cSrcweir 	{
206*cdf0e10cSrcweir 		if( m_sComponentURL.getLength() > 0 )
207*cdf0e10cSrcweir 		{
208*cdf0e10cSrcweir 			impl_createFrame( getPeer(), m_sComponentURL, m_seqLoaderArguments );
209*cdf0e10cSrcweir 		}
210*cdf0e10cSrcweir 	}
211*cdf0e10cSrcweir }
212*cdf0e10cSrcweir 
213*cdf0e10cSrcweir //____________________________________________________________________________________________________________
214*cdf0e10cSrcweir //	XControl
215*cdf0e10cSrcweir //____________________________________________________________________________________________________________
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir sal_Bool SAL_CALL FrameControl::setModel( const Reference< XControlModel >& /*xModel*/ ) throw( RuntimeException )
218*cdf0e10cSrcweir {
219*cdf0e10cSrcweir 	// We have no model.
220*cdf0e10cSrcweir 	return sal_False ;
221*cdf0e10cSrcweir }
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir //____________________________________________________________________________________________________________
224*cdf0e10cSrcweir //	XControl
225*cdf0e10cSrcweir //____________________________________________________________________________________________________________
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir Reference< XControlModel > SAL_CALL FrameControl::getModel() throw( RuntimeException )
228*cdf0e10cSrcweir {
229*cdf0e10cSrcweir 	// We have no model.
230*cdf0e10cSrcweir 	return Reference< XControlModel >();
231*cdf0e10cSrcweir }
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir //____________________________________________________________________________________________________________
234*cdf0e10cSrcweir //	XControl
235*cdf0e10cSrcweir //____________________________________________________________________________________________________________
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir void SAL_CALL FrameControl::dispose() throw( RuntimeException )
238*cdf0e10cSrcweir {
239*cdf0e10cSrcweir     impl_deleteFrame();
240*cdf0e10cSrcweir     BaseControl::dispose();
241*cdf0e10cSrcweir }
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir //____________________________________________________________________________________________________________
244*cdf0e10cSrcweir //	XView
245*cdf0e10cSrcweir //____________________________________________________________________________________________________________
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir sal_Bool SAL_CALL FrameControl::setGraphics( const Reference< XGraphics >& /*xDevice*/ ) throw( RuntimeException )
248*cdf0e10cSrcweir {
249*cdf0e10cSrcweir 	// it is not possible to print this control
250*cdf0e10cSrcweir 	return sal_False ;
251*cdf0e10cSrcweir }
252*cdf0e10cSrcweir 
253*cdf0e10cSrcweir //____________________________________________________________________________________________________________
254*cdf0e10cSrcweir //	XView
255*cdf0e10cSrcweir //____________________________________________________________________________________________________________
256*cdf0e10cSrcweir 
257*cdf0e10cSrcweir Reference< XGraphics > SAL_CALL FrameControl::getGraphics() throw( RuntimeException )
258*cdf0e10cSrcweir {
259*cdf0e10cSrcweir 	// when its not posible to set graphics ! then its possible to return null
260*cdf0e10cSrcweir 	return Reference< XGraphics >();
261*cdf0e10cSrcweir }
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir //____________________________________________________________________________________________________________
264*cdf0e10cSrcweir //	XConnectionPointContainer
265*cdf0e10cSrcweir //____________________________________________________________________________________________________________
266*cdf0e10cSrcweir 
267*cdf0e10cSrcweir Sequence< Type > SAL_CALL FrameControl::getConnectionPointTypes() throw( RuntimeException )
268*cdf0e10cSrcweir {
269*cdf0e10cSrcweir 	// Forwarded to helper class
270*cdf0e10cSrcweir 	return m_aConnectionPointContainer.getConnectionPointTypes();
271*cdf0e10cSrcweir }
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir //____________________________________________________________________________________________________________
274*cdf0e10cSrcweir //	XConnectionPointContainer
275*cdf0e10cSrcweir //____________________________________________________________________________________________________________
276*cdf0e10cSrcweir 
277*cdf0e10cSrcweir Reference< XConnectionPoint > SAL_CALL FrameControl::queryConnectionPoint( const Type& aType ) throw( RuntimeException )
278*cdf0e10cSrcweir {
279*cdf0e10cSrcweir 	// Forwarded to helper class
280*cdf0e10cSrcweir 	return m_aConnectionPointContainer.queryConnectionPoint( aType );
281*cdf0e10cSrcweir }
282*cdf0e10cSrcweir 
283*cdf0e10cSrcweir //____________________________________________________________________________________________________________
284*cdf0e10cSrcweir //	XConnectionPointContainer
285*cdf0e10cSrcweir //____________________________________________________________________________________________________________
286*cdf0e10cSrcweir 
287*cdf0e10cSrcweir void SAL_CALL FrameControl::advise(	const	Type&						aType		,
288*cdf0e10cSrcweir 									const	Reference< XInterface >&	xListener	) throw( RuntimeException )
289*cdf0e10cSrcweir {
290*cdf0e10cSrcweir 	// Forwarded to helper class
291*cdf0e10cSrcweir 	m_aConnectionPointContainer.advise( aType, xListener );
292*cdf0e10cSrcweir }
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir //____________________________________________________________________________________________________________
295*cdf0e10cSrcweir //	XConnectionPointContainer
296*cdf0e10cSrcweir //____________________________________________________________________________________________________________
297*cdf0e10cSrcweir 
298*cdf0e10cSrcweir void SAL_CALL FrameControl::unadvise(	const	Type&						aType		,
299*cdf0e10cSrcweir 										const	Reference< XInterface >&	xListener	) throw( RuntimeException )
300*cdf0e10cSrcweir {
301*cdf0e10cSrcweir 	// Forwarded to helper class
302*cdf0e10cSrcweir 	m_aConnectionPointContainer.unadvise( aType, xListener );
303*cdf0e10cSrcweir }
304*cdf0e10cSrcweir 
305*cdf0e10cSrcweir //____________________________________________________________________________________________________________
306*cdf0e10cSrcweir //	impl but public method to register service
307*cdf0e10cSrcweir //____________________________________________________________________________________________________________
308*cdf0e10cSrcweir 
309*cdf0e10cSrcweir const Sequence< OUString > FrameControl::impl_getStaticSupportedServiceNames()
310*cdf0e10cSrcweir {
311*cdf0e10cSrcweir 	MutexGuard aGuard( Mutex::getGlobalMutex() );
312*cdf0e10cSrcweir     Sequence< OUString > seqServiceNames( 1 );
313*cdf0e10cSrcweir     seqServiceNames.getArray() [0] = OUString::createFromAscii( SERVICENAME_FRAMECONTROL );
314*cdf0e10cSrcweir     return seqServiceNames ;
315*cdf0e10cSrcweir }
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir //____________________________________________________________________________________________________________
318*cdf0e10cSrcweir //	impl but public method to register service
319*cdf0e10cSrcweir //____________________________________________________________________________________________________________
320*cdf0e10cSrcweir 
321*cdf0e10cSrcweir const OUString FrameControl::impl_getStaticImplementationName()
322*cdf0e10cSrcweir {
323*cdf0e10cSrcweir 	return OUString::createFromAscii( IMPLEMENTATIONNAME_FRAMECONTROL );
324*cdf0e10cSrcweir }
325*cdf0e10cSrcweir 
326*cdf0e10cSrcweir //____________________________________________________________________________________________________________
327*cdf0e10cSrcweir //	OPropertySetHelper
328*cdf0e10cSrcweir //____________________________________________________________________________________________________________
329*cdf0e10cSrcweir 
330*cdf0e10cSrcweir sal_Bool FrameControl::convertFastPropertyValue(		Any&		rConvertedValue	,
331*cdf0e10cSrcweir 														Any&		rOldValue		,
332*cdf0e10cSrcweir 														sal_Int32	nHandle			,
333*cdf0e10cSrcweir 												const	Any&		rValue			) throw( IllegalArgumentException )
334*cdf0e10cSrcweir {
335*cdf0e10cSrcweir 	sal_Bool bReturn = sal_False ;
336*cdf0e10cSrcweir 	switch (nHandle)
337*cdf0e10cSrcweir 	{
338*cdf0e10cSrcweir 		case PROPERTYHANDLE_COMPONENTURL		:		rConvertedValue	  = rValue					;
339*cdf0e10cSrcweir 														rOldValue		<<= m_sComponentURL			;
340*cdf0e10cSrcweir 														bReturn			  = sal_True				;
341*cdf0e10cSrcweir 														break ;
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir 		case PROPERTYHANDLE_LOADERARGUMENTS		:		rConvertedValue	  = rValue					;
344*cdf0e10cSrcweir 														rOldValue		<<= m_seqLoaderArguments	;
345*cdf0e10cSrcweir 														bReturn			  = sal_True				;
346*cdf0e10cSrcweir 														break ;
347*cdf0e10cSrcweir 	}
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir 	if ( bReturn == sal_False )
350*cdf0e10cSrcweir 	{
351*cdf0e10cSrcweir 		throw IllegalArgumentException();
352*cdf0e10cSrcweir 	}
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir 	return bReturn ;
355*cdf0e10cSrcweir }
356*cdf0e10cSrcweir 
357*cdf0e10cSrcweir //____________________________________________________________________________________________________________
358*cdf0e10cSrcweir //	OPropertySetHelper
359*cdf0e10cSrcweir //____________________________________________________________________________________________________________
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir void FrameControl::setFastPropertyValue_NoBroadcast(			sal_Int32	nHandle	,
362*cdf0e10cSrcweir 														const	Any&		rValue	)
363*cdf0e10cSrcweir                                                         throw ( ::com::sun::star::uno::Exception )
364*cdf0e10cSrcweir {
365*cdf0e10cSrcweir 	// this method only set the value
366*cdf0e10cSrcweir 	MutexGuard	aGuard (m_aMutex) ;
367*cdf0e10cSrcweir 	switch (nHandle)
368*cdf0e10cSrcweir 	{
369*cdf0e10cSrcweir 		case PROPERTYHANDLE_COMPONENTURL		:		rValue >>= m_sComponentURL ;
370*cdf0e10cSrcweir 														if (getPeer().is())
371*cdf0e10cSrcweir 														{
372*cdf0e10cSrcweir 															impl_createFrame ( getPeer(), m_sComponentURL, m_seqLoaderArguments ) ;
373*cdf0e10cSrcweir 														}
374*cdf0e10cSrcweir 														break ;
375*cdf0e10cSrcweir 
376*cdf0e10cSrcweir 		case PROPERTYHANDLE_LOADERARGUMENTS		:		rValue >>= m_seqLoaderArguments ;
377*cdf0e10cSrcweir 														break ;
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir 		default	:										VOS_ENSHURE ( nHandle == -1, ERRORTEXT_VOSENSHURE ) ;
380*cdf0e10cSrcweir 	}
381*cdf0e10cSrcweir }
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir //____________________________________________________________________________________________________________
384*cdf0e10cSrcweir //	OPropertySetHelper
385*cdf0e10cSrcweir //____________________________________________________________________________________________________________
386*cdf0e10cSrcweir 
387*cdf0e10cSrcweir void FrameControl::getFastPropertyValue(	Any&		rRet	,
388*cdf0e10cSrcweir 											sal_Int32	nHandle	) const
389*cdf0e10cSrcweir {
390*cdf0e10cSrcweir 	MutexGuard	aGuard ( Mutex::getGlobalMutex() ) ;
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir 	switch (nHandle)
393*cdf0e10cSrcweir 	{
394*cdf0e10cSrcweir 		case PROPERTYHANDLE_COMPONENTURL	:		rRet <<= m_sComponentURL ;
395*cdf0e10cSrcweir 													break ;
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir 		case PROPERTYHANDLE_LOADERARGUMENTS	:		rRet <<= m_seqLoaderArguments ;
398*cdf0e10cSrcweir 													break ;
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir 		case PROPERTYHANDLE_FRAME			:		rRet <<= m_xFrame ;
401*cdf0e10cSrcweir 							   						break ;
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir 		default	:			                        VOS_ENSHURE ( nHandle == -1, ERRORTEXT_VOSENSHURE ) ;
404*cdf0e10cSrcweir 	}
405*cdf0e10cSrcweir }
406*cdf0e10cSrcweir 
407*cdf0e10cSrcweir //____________________________________________________________________________________________________________
408*cdf0e10cSrcweir //	OPropertySetHelper
409*cdf0e10cSrcweir //____________________________________________________________________________________________________________
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir IPropertyArrayHelper& FrameControl::getInfoHelper()
412*cdf0e10cSrcweir {
413*cdf0e10cSrcweir 	// Create a table that map names to index values.
414*cdf0e10cSrcweir 	static OPropertyArrayHelper* pInfo ;
415*cdf0e10cSrcweir 
416*cdf0e10cSrcweir 	if (!pInfo)
417*cdf0e10cSrcweir 	{
418*cdf0e10cSrcweir 		// global method must be guarded
419*cdf0e10cSrcweir 		MutexGuard	aGuard ( Mutex::getGlobalMutex() ) ;
420*cdf0e10cSrcweir 
421*cdf0e10cSrcweir 		if (!pInfo)
422*cdf0e10cSrcweir 		{
423*cdf0e10cSrcweir 			pInfo = new OPropertyArrayHelper( impl_getStaticPropertyDescriptor(), sal_True );
424*cdf0e10cSrcweir 		}
425*cdf0e10cSrcweir 	}
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir 	return *pInfo ;
428*cdf0e10cSrcweir }
429*cdf0e10cSrcweir /*
430*cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
431*cdf0e10cSrcweir // start OConnectionPointContainerHelper
432*cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
433*cdf0e10cSrcweir Uik* FrameControl::getConnectionPointUiks ( sal_Int32* pCount ) const
434*cdf0e10cSrcweir {
435*cdf0e10cSrcweir 	static Uik szUiks[] =
436*cdf0e10cSrcweir 	{
437*cdf0e10cSrcweir 		((XEventListener*)NULL)->getSmartUik  (),
438*cdf0e10cSrcweir 		::getCppuType((const Reference< XPropertyChangeListener >*)0),
439*cdf0e10cSrcweir 		::getCppuType((const Reference< XVetoableChangeListener >*)0),
440*cdf0e10cSrcweir 		::getCppuType((const Reference< XPropertiesChangeListener >*)0)
441*cdf0e10cSrcweir 	} ;
442*cdf0e10cSrcweir 
443*cdf0e10cSrcweir 	*pCount = 4 ;
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir 	return szUiks ;
446*cdf0e10cSrcweir }
447*cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
448*cdf0e10cSrcweir // end OConnectionPointContainerHelper
449*cdf0e10cSrcweir //--------------------------------------------------------------------------------------------------
450*cdf0e10cSrcweir */
451*cdf0e10cSrcweir 
452*cdf0e10cSrcweir //____________________________________________________________________________________________________________
453*cdf0e10cSrcweir //	OPropertySetHelper
454*cdf0e10cSrcweir //____________________________________________________________________________________________________________
455*cdf0e10cSrcweir 
456*cdf0e10cSrcweir Reference< XPropertySetInfo > SAL_CALL FrameControl::getPropertySetInfo() throw( RuntimeException )
457*cdf0e10cSrcweir {
458*cdf0e10cSrcweir 	// Optimize this method !
459*cdf0e10cSrcweir 	// We initialize a static variable only one time. And we don't must use a mutex at every call!
460*cdf0e10cSrcweir 	// For the first call; pInfo is NULL - for the second call pInfo is different from NULL!
461*cdf0e10cSrcweir 	static Reference< XPropertySetInfo >* pInfo = (Reference< XPropertySetInfo >*)0 ;
462*cdf0e10cSrcweir 	if ( pInfo == (Reference< XPropertySetInfo >*)0 )
463*cdf0e10cSrcweir 	{
464*cdf0e10cSrcweir 		// Ready for multithreading
465*cdf0e10cSrcweir 		MutexGuard aGuard ( Mutex::getGlobalMutex () ) ;
466*cdf0e10cSrcweir 		// Control this pointer again, another instance can be faster then these!
467*cdf0e10cSrcweir 		if ( pInfo == (Reference< XPropertySetInfo >*)0 )
468*cdf0e10cSrcweir 		{
469*cdf0e10cSrcweir 			// Create structure of propertysetinfo for baseclass "OPropertySetHelper".
470*cdf0e10cSrcweir 			// (Use method "getInfoHelper()".)
471*cdf0e10cSrcweir 			static Reference< XPropertySetInfo > xInfo ( createPropertySetInfo ( getInfoHelper () ) ) ;
472*cdf0e10cSrcweir 			pInfo = &xInfo ;
473*cdf0e10cSrcweir 		}
474*cdf0e10cSrcweir 	}
475*cdf0e10cSrcweir 	return ( *pInfo ) ;
476*cdf0e10cSrcweir }
477*cdf0e10cSrcweir 
478*cdf0e10cSrcweir //____________________________________________________________________________________________________________
479*cdf0e10cSrcweir //	BaseControl
480*cdf0e10cSrcweir //____________________________________________________________________________________________________________
481*cdf0e10cSrcweir 
482*cdf0e10cSrcweir WindowDescriptor* FrameControl::impl_getWindowDescriptor( const Reference< XWindowPeer >& xParentPeer )
483*cdf0e10cSrcweir {
484*cdf0e10cSrcweir 	WindowDescriptor* pDescriptor	= new WindowDescriptor	;
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir 	pDescriptor->Type				= WindowClass_CONTAINER	;
487*cdf0e10cSrcweir 	pDescriptor->ParentIndex		= -1					;
488*cdf0e10cSrcweir 	pDescriptor->Parent				= xParentPeer			;
489*cdf0e10cSrcweir 	pDescriptor->Bounds				= getPosSize ()			;
490*cdf0e10cSrcweir 	pDescriptor->WindowAttributes	= 0						;
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir 	return pDescriptor ;
493*cdf0e10cSrcweir }
494*cdf0e10cSrcweir 
495*cdf0e10cSrcweir //____________________________________________________________________________________________________________
496*cdf0e10cSrcweir //	private method
497*cdf0e10cSrcweir //____________________________________________________________________________________________________________
498*cdf0e10cSrcweir 
499*cdf0e10cSrcweir void FrameControl::impl_createFrame(	const	Reference< XWindowPeer >&	xPeer		,
500*cdf0e10cSrcweir 										const	OUString&					rURL		,
501*cdf0e10cSrcweir 										const	Sequence< PropertyValue >&	rArguments	)
502*cdf0e10cSrcweir {
503*cdf0e10cSrcweir 	Reference< XFrame > 	xOldFrame	;
504*cdf0e10cSrcweir 	Reference< XFrame > 	xNewFrame	;
505*cdf0e10cSrcweir 
506*cdf0e10cSrcweir 	{
507*cdf0e10cSrcweir 		MutexGuard	aGuard ( m_aMutex ) ;
508*cdf0e10cSrcweir 		xOldFrame = m_xFrame ;
509*cdf0e10cSrcweir 	}
510*cdf0e10cSrcweir 
511*cdf0e10cSrcweir 	xNewFrame = Reference< XFrame >  ( impl_getMultiServiceFactory()->createInstance ( OUString::createFromAscii( "com.sun.star.frame.Frame" ) ), UNO_QUERY ) ;
512*cdf0e10cSrcweir 	Reference< XDispatchProvider >  xDSP ( xNewFrame, UNO_QUERY ) ;
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir 	if (xDSP.is())
515*cdf0e10cSrcweir 	{
516*cdf0e10cSrcweir 		Reference< XWindow >  xWP ( xPeer, UNO_QUERY ) ;
517*cdf0e10cSrcweir 		xNewFrame->initialize ( xWP ) ;
518*cdf0e10cSrcweir 
519*cdf0e10cSrcweir 		//	option
520*cdf0e10cSrcweir 		//xFrame->setName( "WhatYouWant" );
521*cdf0e10cSrcweir 
522*cdf0e10cSrcweir 		Reference< XURLTransformer >  xTrans ( impl_getMultiServiceFactory()->createInstance ( OUString::createFromAscii( "com.sun.star.util.URLTransformer" ) ), UNO_QUERY ) ;
523*cdf0e10cSrcweir 		if(xTrans.is())
524*cdf0e10cSrcweir 		{
525*cdf0e10cSrcweir 			// load file
526*cdf0e10cSrcweir 			URL	aURL ;
527*cdf0e10cSrcweir 
528*cdf0e10cSrcweir 			aURL.Complete = rURL ;
529*cdf0e10cSrcweir 			xTrans->parseStrict( aURL ) ;
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir 			Reference< XDispatch >  xDisp = xDSP->queryDispatch ( aURL, OUString (), FrameSearchFlag::SELF ) ;
532*cdf0e10cSrcweir 			if (xDisp.is())
533*cdf0e10cSrcweir 			{
534*cdf0e10cSrcweir 				xDisp->dispatch ( aURL, rArguments ) ;
535*cdf0e10cSrcweir 			}
536*cdf0e10cSrcweir 		}
537*cdf0e10cSrcweir 	}
538*cdf0e10cSrcweir 
539*cdf0e10cSrcweir 	// set the frame
540*cdf0e10cSrcweir 	{
541*cdf0e10cSrcweir 		MutexGuard aGuard ( m_aMutex ) ;
542*cdf0e10cSrcweir 		m_xFrame = xNewFrame ;
543*cdf0e10cSrcweir 	}
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir 	// notify the listeners
546*cdf0e10cSrcweir 	sal_Int32	nFrameId = PROPERTYHANDLE_FRAME ;
547*cdf0e10cSrcweir 	Any	aNewFrame ( &xNewFrame, ::getCppuType((const Reference< XFrame >*)0) ) ;
548*cdf0e10cSrcweir 	Any	aOldFrame ( &xOldFrame, ::getCppuType((const Reference< XFrame >*)0) ) ;
549*cdf0e10cSrcweir 
550*cdf0e10cSrcweir 	fire ( &nFrameId, &aNewFrame, &aOldFrame, 1, sal_False ) ;
551*cdf0e10cSrcweir 
552*cdf0e10cSrcweir 	if (xOldFrame.is())
553*cdf0e10cSrcweir 	{
554*cdf0e10cSrcweir 		xOldFrame->dispose () ;
555*cdf0e10cSrcweir 	}
556*cdf0e10cSrcweir }
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir //____________________________________________________________________________________________________________
559*cdf0e10cSrcweir //	private method
560*cdf0e10cSrcweir //____________________________________________________________________________________________________________
561*cdf0e10cSrcweir 
562*cdf0e10cSrcweir void FrameControl::impl_deleteFrame()
563*cdf0e10cSrcweir {
564*cdf0e10cSrcweir 	Reference< XFrame >  xOldFrame;
565*cdf0e10cSrcweir 	Reference< XFrame >  xNullFrame;
566*cdf0e10cSrcweir 
567*cdf0e10cSrcweir 	{
568*cdf0e10cSrcweir         // do not dispose the frame in this guarded section (deadlock?)
569*cdf0e10cSrcweir         MutexGuard aGuard( m_aMutex );
570*cdf0e10cSrcweir         xOldFrame = m_xFrame;
571*cdf0e10cSrcweir         m_xFrame = Reference< XFrame > ();
572*cdf0e10cSrcweir 	}
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir 	// notify the listeners
575*cdf0e10cSrcweir     sal_Int32 nFrameId = PROPERTYHANDLE_FRAME;
576*cdf0e10cSrcweir 	Any aNewFrame( &xNullFrame, ::getCppuType((const Reference< XFrame >*)0) );
577*cdf0e10cSrcweir 	Any aOldFrame( &xOldFrame, ::getCppuType((const Reference< XFrame >*)0) );
578*cdf0e10cSrcweir 	fire( &nFrameId, &aNewFrame, &aOldFrame, 1, sal_False );
579*cdf0e10cSrcweir 
580*cdf0e10cSrcweir 	// dispose the frame
581*cdf0e10cSrcweir 	if( xOldFrame.is() )
582*cdf0e10cSrcweir 		xOldFrame->dispose();
583*cdf0e10cSrcweir }
584*cdf0e10cSrcweir 
585*cdf0e10cSrcweir //____________________________________________________________________________________________________________
586*cdf0e10cSrcweir //	private method
587*cdf0e10cSrcweir //____________________________________________________________________________________________________________
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir const Sequence< Property > FrameControl::impl_getStaticPropertyDescriptor()
590*cdf0e10cSrcweir {
591*cdf0e10cSrcweir 	// All Properties of this implementation. The array must be sorted!
592*cdf0e10cSrcweir 	static const Property pPropertys[PROPERTY_COUNT] =
593*cdf0e10cSrcweir 	{
594*cdf0e10cSrcweir 		Property( OUString::createFromAscii( PROPERTYNAME_COMPONENTURL		), PROPERTYHANDLE_COMPONENTURL		, ::getCppuType((const OUString*)0)					, PropertyAttribute::BOUND | PropertyAttribute::CONSTRAINED	),
595*cdf0e10cSrcweir 		Property( OUString::createFromAscii( PROPERTYNAME_FRAME				), PROPERTYHANDLE_FRAME				, ::getCppuType((const Reference< XFrame >*)0)		, PropertyAttribute::BOUND | PropertyAttribute::TRANSIENT	),
596*cdf0e10cSrcweir 		Property( OUString::createFromAscii( PROPERTYNAME_LOADERARGUMENTS	), PROPERTYHANDLE_LOADERARGUMENTS	, ::getCppuType((const Sequence< PropertyValue >*)0), PropertyAttribute::BOUND | PropertyAttribute::CONSTRAINED	)
597*cdf0e10cSrcweir 	};
598*cdf0e10cSrcweir 
599*cdf0e10cSrcweir 	static const Sequence< Property > seqPropertys( pPropertys, PROPERTY_COUNT );
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir 	return seqPropertys ;
602*cdf0e10cSrcweir }
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir }	// namespace unocontrols
605