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