xref: /trunk/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