1*6d739b60SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*6d739b60SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*6d739b60SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*6d739b60SAndrew Rist  * distributed with this work for additional information
6*6d739b60SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*6d739b60SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*6d739b60SAndrew Rist  * "License"); you may not use this file except in compliance
9*6d739b60SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*6d739b60SAndrew Rist  *
11*6d739b60SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*6d739b60SAndrew Rist  *
13*6d739b60SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*6d739b60SAndrew Rist  * software distributed under the License is distributed on an
15*6d739b60SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*6d739b60SAndrew Rist  * KIND, either express or implied.  See the License for the
17*6d739b60SAndrew Rist  * specific language governing permissions and limitations
18*6d739b60SAndrew Rist  * under the License.
19*6d739b60SAndrew Rist  *
20*6d739b60SAndrew Rist  *************************************************************/
21*6d739b60SAndrew Rist 
22*6d739b60SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir //_________________________________________________________________________________________________________________
28cdf0e10cSrcweir //	my own includes
29cdf0e10cSrcweir //_________________________________________________________________________________________________________________
30cdf0e10cSrcweir #include <loadenv/loadenv.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #ifndef __FRAMEWORK_LOADENV_TARGETHELPER_HXX_
33cdf0e10cSrcweir #include <loadenv/targethelper.hxx>
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #ifndef __FRAMEWORK_DESKTOP_HXX_
37cdf0e10cSrcweir #include <services/desktop.hxx>
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir #include <helper/ocomponentaccess.hxx>
40cdf0e10cSrcweir #include <dispatch/dispatchprovider.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #ifndef __FRAMEWORK_DISPATCH_INTERCEPTIONHELPER_HXX_
43cdf0e10cSrcweir #include <dispatch/interceptionhelper.hxx>
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir #include <classes/taskcreator.hxx>
46cdf0e10cSrcweir #include <threadhelp/transactionguard.hxx>
47cdf0e10cSrcweir #include <threadhelp/writeguard.hxx>
48cdf0e10cSrcweir #include <threadhelp/readguard.hxx>
49cdf0e10cSrcweir #include <services.h>
50cdf0e10cSrcweir #include <general.h>
51cdf0e10cSrcweir #include <properties.h>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include <classes/resource.hrc>
54cdf0e10cSrcweir #include <classes/fwkresid.hxx>
55cdf0e10cSrcweir 
56cdf0e10cSrcweir //_________________________________________________________________________________________________________________
57cdf0e10cSrcweir //	interface includes
58cdf0e10cSrcweir //_________________________________________________________________________________________________________________
59cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
60cdf0e10cSrcweir #include <com/sun/star/frame/FrameSearchFlag.hpp>
61cdf0e10cSrcweir #include <com/sun/star/awt/XToolkit.hpp>
62cdf0e10cSrcweir #include <com/sun/star/awt/XWindow.hpp>
63cdf0e10cSrcweir #include <com/sun/star/awt/XWindowPeer.hpp>
64cdf0e10cSrcweir #include <com/sun/star/awt/WindowDescriptor.hpp>
65cdf0e10cSrcweir #include <com/sun/star/awt/WindowAttribute.hpp>
66cdf0e10cSrcweir #include <com/sun/star/awt/PosSize.hpp>
67cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp>
68cdf0e10cSrcweir #include <com/sun/star/task/XInteractionAbort.hpp>
69cdf0e10cSrcweir #include <com/sun/star/task/XInteractionApprove.hpp>
70cdf0e10cSrcweir #include <com/sun/star/document/XInteractionFilterSelect.hpp>
71cdf0e10cSrcweir #include <com/sun/star/document/AmbigousFilterRequest.hpp>
72cdf0e10cSrcweir #include <com/sun/star/task/ErrorCodeRequest.hpp>
73cdf0e10cSrcweir #include <com/sun/star/ucb/InteractiveIOException.hpp>
74cdf0e10cSrcweir #include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp>
75cdf0e10cSrcweir #include <com/sun/star/frame/XNotifyingDispatch.hpp>
76cdf0e10cSrcweir #include <com/sun/star/frame/DispatchResultState.hpp>
77cdf0e10cSrcweir #include <com/sun/star/lang/IllegalArgumentException.hpp>
78cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
79cdf0e10cSrcweir #include <com/sun/star/util/XCloseable.hpp>
80cdf0e10cSrcweir #include <com/sun/star/document/MacroExecMode.hpp>
81cdf0e10cSrcweir #include <com/sun/star/document/UpdateDocMode.hpp>
82cdf0e10cSrcweir #include <com/sun/star/frame/XTerminateListener2.hpp>
83cdf0e10cSrcweir 
84cdf0e10cSrcweir //_________________________________________________________________________________________________________________
85cdf0e10cSrcweir //	includes of other projects
86cdf0e10cSrcweir //_________________________________________________________________________________________________________________
87cdf0e10cSrcweir #include <cppuhelper/queryinterface.hxx>
88cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
89cdf0e10cSrcweir #include <cppuhelper/factory.hxx>
90cdf0e10cSrcweir #include <cppuhelper/proptypehlp.hxx>
91cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
92cdf0e10cSrcweir #include <rtl/logfile.hxx>
93cdf0e10cSrcweir #include <vcl/svapp.hxx>
94cdf0e10cSrcweir 
95cdf0e10cSrcweir #ifndef __RSC
96cdf0e10cSrcweir #include <tools/errinf.hxx>
97cdf0e10cSrcweir #endif
98cdf0e10cSrcweir #include <comphelper/extract.hxx>
99cdf0e10cSrcweir 
100cdf0e10cSrcweir #include <fwkdllapi.h>
101cdf0e10cSrcweir 
102cdf0e10cSrcweir //_________________________________________________________________________________________________________________
103cdf0e10cSrcweir //	namespace
104cdf0e10cSrcweir //_________________________________________________________________________________________________________________
105cdf0e10cSrcweir 
106cdf0e10cSrcweir namespace framework{
107cdf0e10cSrcweir 
108cdf0e10cSrcweir //_________________________________________________________________________________________________________________
109cdf0e10cSrcweir //	non exported const
110cdf0e10cSrcweir //_________________________________________________________________________________________________________________
111cdf0e10cSrcweir 
112cdf0e10cSrcweir //_________________________________________________________________________________________________________________
113cdf0e10cSrcweir //	non exported definitions
114cdf0e10cSrcweir //_________________________________________________________________________________________________________________
115cdf0e10cSrcweir 
116cdf0e10cSrcweir //_________________________________________________________________________________________________________________
117cdf0e10cSrcweir //	declarations
118cdf0e10cSrcweir //_________________________________________________________________________________________________________________
119cdf0e10cSrcweir 
120cdf0e10cSrcweir //*****************************************************************************************************************
121cdf0e10cSrcweir //	XInterface, XTypeProvider, XServiceInfo
122cdf0e10cSrcweir //*****************************************************************************************************************
DEFINE_XINTERFACE_15(Desktop,OWeakObject,DIRECT_INTERFACE (css::lang::XTypeProvider),DIRECT_INTERFACE (css::lang::XServiceInfo),DIRECT_INTERFACE (css::frame::XDesktop),DIRECT_INTERFACE (css::frame::XComponentLoader),DIRECT_INTERFACE (css::frame::XTasksSupplier),DIRECT_INTERFACE (css::frame::XDispatchProvider),DIRECT_INTERFACE (css::frame::XDispatchProviderInterception),DIRECT_INTERFACE (css::frame::XFramesSupplier),DIRECT_INTERFACE (css::frame::XFrame),DIRECT_INTERFACE (css::lang::XComponent),DIRECT_INTERFACE (css::frame::XDispatchResultListener),DIRECT_INTERFACE (css::lang::XEventListener),DIRECT_INTERFACE (css::task::XInteractionHandler),DIRECT_INTERFACE (css::beans::XPropertySet),DIRECT_INTERFACE (css::frame::XUntitledNumbers))123cdf0e10cSrcweir DEFINE_XINTERFACE_15                    (   Desktop                                                  ,
124cdf0e10cSrcweir                                             OWeakObject                                              ,
125cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::lang::XTypeProvider              ),
126cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::lang::XServiceInfo               ),
127cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XDesktop                  ),
128cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XComponentLoader          ),
129cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XTasksSupplier            ),
130cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XDispatchProvider         ),
131cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XDispatchProviderInterception),
132cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XFramesSupplier           ),
133cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XFrame                    ),
134cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::lang::XComponent                 ),
135cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XDispatchResultListener   ),
136cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::lang::XEventListener             ),
137cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::task::XInteractionHandler        ),
138cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::beans::XPropertySet				),
139cdf0e10cSrcweir                                             DIRECT_INTERFACE( css::frame::XUntitledNumbers          )
140cdf0e10cSrcweir 										)
141cdf0e10cSrcweir 
142cdf0e10cSrcweir DEFINE_XTYPEPROVIDER_15                 (   Desktop                                                 ,
143cdf0e10cSrcweir                                             css::lang::XTypeProvider                                ,
144cdf0e10cSrcweir                                             css::lang::XServiceInfo                                 ,
145cdf0e10cSrcweir                                             css::frame::XDesktop                                    ,
146cdf0e10cSrcweir                                             css::frame::XComponentLoader                            ,
147cdf0e10cSrcweir                                             css::frame::XTasksSupplier                              ,
148cdf0e10cSrcweir                                             css::frame::XDispatchProvider                           ,
149cdf0e10cSrcweir                                             css::frame::XDispatchProviderInterception               ,
150cdf0e10cSrcweir                                             css::frame::XFramesSupplier                             ,
151cdf0e10cSrcweir                                             css::frame::XFrame                                      ,
152cdf0e10cSrcweir                                             css::lang::XComponent                                   ,
153cdf0e10cSrcweir                                             css::frame::XDispatchResultListener                     ,
154cdf0e10cSrcweir                                             css::lang::XEventListener                               ,
155cdf0e10cSrcweir                                             css::task::XInteractionHandler                          ,
156cdf0e10cSrcweir                                             css::beans::XPropertySet                                ,
157cdf0e10cSrcweir                                             css::frame::XUntitledNumbers
158cdf0e10cSrcweir 										)
159cdf0e10cSrcweir 
160cdf0e10cSrcweir DEFINE_XSERVICEINFO_ONEINSTANCESERVICE  (   Desktop                                                 ,
161cdf0e10cSrcweir                                             ::cppu::OWeakObject                                     ,
162cdf0e10cSrcweir                                             SERVICENAME_DESKTOP                                     ,
163cdf0e10cSrcweir 											IMPLEMENTATIONNAME_DESKTOP
164cdf0e10cSrcweir 										)
165cdf0e10cSrcweir 
166cdf0e10cSrcweir DEFINE_INIT_SERVICE                     (   Desktop,
167cdf0e10cSrcweir                                             {
168cdf0e10cSrcweir                                                 /*Attention
169cdf0e10cSrcweir                                                     I think we don't need any mutex or lock here ... because we are called by our own static method impl_createInstance()
170cdf0e10cSrcweir                                                     to create a new instance of this class by our own supported service factory.
171cdf0e10cSrcweir                                                     see macro DEFINE_XSERVICEINFO_MULTISERVICE and "impl_initService()" for further informations!
172cdf0e10cSrcweir                                                 */
173cdf0e10cSrcweir 
174cdf0e10cSrcweir                                                 //-------------------------------------------------------------------------------------------------------------
175cdf0e10cSrcweir                                                 // Initialize a new XFrames-helper-object to handle XIndexAccess and XElementAccess.
176cdf0e10cSrcweir                                                 // We hold member as reference ... not as pointer too!
177cdf0e10cSrcweir                                                 // Attention: We share our frame container with this helper. Container is threadsafe himself ... So I think we can do that.
178cdf0e10cSrcweir                                                 // But look on dispose() for right order of deinitialization.
179cdf0e10cSrcweir                                                 OFrames* pFramesHelper = new OFrames( m_xFactory, this, &m_aChildTaskContainer );
180cdf0e10cSrcweir                                                 m_xFramesHelper = css::uno::Reference< css::frame::XFrames >( static_cast< ::cppu::OWeakObject* >(pFramesHelper), css::uno::UNO_QUERY );
181cdf0e10cSrcweir 
182cdf0e10cSrcweir                                                 //-------------------------------------------------------------------------------------------------------------
183cdf0e10cSrcweir                                                 // Initialize a new dispatchhelper-object to handle dispatches.
184cdf0e10cSrcweir                                                 // We use these helper as slave for our interceptor helper ... not directly!
185cdf0e10cSrcweir                                                 // But he is event listener on THIS instance!
186cdf0e10cSrcweir                                                 DispatchProvider* pDispatchHelper = new DispatchProvider( m_xFactory, this );
187cdf0e10cSrcweir                                                 css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider( static_cast< ::cppu::OWeakObject* >(pDispatchHelper), css::uno::UNO_QUERY );
188cdf0e10cSrcweir 
189cdf0e10cSrcweir                                                 //-------------------------------------------------------------------------------------------------------------
190cdf0e10cSrcweir                                                 // Initialize a new interception helper object to handle dispatches and implement an interceptor mechanism.
191cdf0e10cSrcweir                                                 // Set created dispatch provider as slowest slave of it.
192cdf0e10cSrcweir                                                 // Hold interception helper by reference only - not by pointer!
193cdf0e10cSrcweir                                                 // So it's easiear to destroy it.
194cdf0e10cSrcweir                                                 InterceptionHelper* pInterceptionHelper = new InterceptionHelper( this, xDispatchProvider );
195cdf0e10cSrcweir                                                 m_xDispatchHelper = css::uno::Reference< css::frame::XDispatchProvider >( static_cast< ::cppu::OWeakObject* >(pInterceptionHelper), css::uno::UNO_QUERY );
196cdf0e10cSrcweir 
197cdf0e10cSrcweir                                                 ::rtl::OUStringBuffer sUntitledPrefix (256);
198cdf0e10cSrcweir                                                 sUntitledPrefix.append      (::rtl::OUString( String( FwkResId( STR_UNTITLED_DOCUMENT ))));
199cdf0e10cSrcweir                                                 sUntitledPrefix.appendAscii (" ");
200cdf0e10cSrcweir 
201cdf0e10cSrcweir                                                 ::comphelper::NumberedCollection* pNumbers = new ::comphelper::NumberedCollection ();
202cdf0e10cSrcweir                                                 m_xTitleNumberGenerator = css::uno::Reference< css::frame::XUntitledNumbers >(static_cast< ::cppu::OWeakObject* >(pNumbers), css::uno::UNO_QUERY_THROW);
203cdf0e10cSrcweir                                                 pNumbers->setOwner          ( static_cast< ::cppu::OWeakObject* >(this) );
204cdf0e10cSrcweir                                                 pNumbers->setUntitledPrefix ( sUntitledPrefix.makeStringAndClear ()     );
205cdf0e10cSrcweir 
206cdf0e10cSrcweir                                                 // Safe impossible cases
207cdf0e10cSrcweir                                                 // We can't work without this helper!
208cdf0e10cSrcweir                                                 LOG_ASSERT2( m_xFramesHelper.is  ()==sal_False, "Desktop::Desktop()", "Frames helper is not valid. XFrames, XIndexAccess and XElementAcces are not supported!\n")
209cdf0e10cSrcweir                                                 LOG_ASSERT2( m_xDispatchHelper.is()==sal_False, "Desktop::Desktop()", "Dispatch helper is not valid. XDispatch will not work correctly!\n"                      )
210cdf0e10cSrcweir 
211cdf0e10cSrcweir                                                 // Enable object for real working!
212cdf0e10cSrcweir                                                 // Otherwise all calls will be rejected ...
213cdf0e10cSrcweir                                                 m_aTransactionManager.setWorkingMode( E_WORK );
214cdf0e10cSrcweir                                             }
215cdf0e10cSrcweir                                         )
216cdf0e10cSrcweir 
217cdf0e10cSrcweir /*-************************************************************************************************************//**
218cdf0e10cSrcweir     @short      standard constructor to create instance by factory
219cdf0e10cSrcweir     @descr      This constructor initialize a new instance of this class by valid factory,
220cdf0e10cSrcweir                 and will be set valid values on his member and baseclasses.
221cdf0e10cSrcweir 
222cdf0e10cSrcweir     @attention  a)  Don't use your own reference during an UNO-Service-ctor! There is no guarantee, that you
223cdf0e10cSrcweir                     will get over this. (e.g. using of your reference as parameter to initialize some member)
224cdf0e10cSrcweir                     Do such things in DEFINE_INIT_SERVICE() method, which is called automaticly after your ctor!!!
225cdf0e10cSrcweir                 b)  Baseclass OBroadcastHelper is a typedef in namespace cppu!
226cdf0e10cSrcweir                     The microsoft compiler has some problems to handle it right BY using namespace explicitly ::cppu::OBroadcastHelper.
227cdf0e10cSrcweir                     If we write it without a namespace or expand the typedef to OBrodcastHelperVar<...> -> it will be OK!?
228cdf0e10cSrcweir                     I don't know why! (other compiler not tested .. but it works!)
229cdf0e10cSrcweir 
230cdf0e10cSrcweir     @seealso    method DEFINE_INIT_SERVICE()
231cdf0e10cSrcweir 
232cdf0e10cSrcweir     @param      "xFactory" is the multi service manager, which create this instance.
233cdf0e10cSrcweir                 The value must be different from NULL!
234cdf0e10cSrcweir     @return     -
235cdf0e10cSrcweir 
236cdf0e10cSrcweir     @onerror    We throw an ASSERT in debug version or do nothing in relaese version.
237cdf0e10cSrcweir *//*-*************************************************************************************************************/
238cdf0e10cSrcweir Desktop::Desktop( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory )
239cdf0e10cSrcweir 		//	Init baseclasses first
240cdf0e10cSrcweir         //  Attention: Don't change order of initialization!
241cdf0e10cSrcweir         //      ThreadHelpBase is a struct with a lock as member. We can't use a lock as direct member!
242cdf0e10cSrcweir         //      We must garant right initialization and a valid value of this to initialize other baseclasses!
243cdf0e10cSrcweir         :   ThreadHelpBase          ( &Application::GetSolarMutex()                 )
244cdf0e10cSrcweir         ,   TransactionBase         (                                               )
245cdf0e10cSrcweir         ,   ::cppu::OBroadcastHelperVar< ::cppu::OMultiTypeInterfaceContainerHelper, ::cppu::OMultiTypeInterfaceContainerHelper::keyType >           ( m_aLock.getShareableOslMutex()         )
246cdf0e10cSrcweir         ,   ::cppu::OPropertySetHelper  ( *(static_cast< ::cppu::OBroadcastHelper* >(this)) )
247cdf0e10cSrcweir         ,   ::cppu::OWeakObject     (                                               )
248cdf0e10cSrcweir 		// Init member
249cdf0e10cSrcweir 		#ifdef ENABLE_ASSERTIONS
250cdf0e10cSrcweir         ,   m_bIsTerminated         ( sal_False                                     )   // see dispose() for further informations!
251cdf0e10cSrcweir 		#endif
252cdf0e10cSrcweir         ,   m_xFactory              ( xFactory                                      )
253cdf0e10cSrcweir         ,   m_aChildTaskContainer   (                                               )
254cdf0e10cSrcweir         ,   m_aListenerContainer    ( m_aLock.getShareableOslMutex()                )
255cdf0e10cSrcweir         ,   m_xFramesHelper         (                                               )
256cdf0e10cSrcweir         ,   m_xDispatchHelper       (                                               )
257cdf0e10cSrcweir         ,   m_eLoadState            ( E_NOTSET                                      )
258cdf0e10cSrcweir         ,   m_xLastFrame            (                                               )
259cdf0e10cSrcweir         ,   m_aInteractionRequest   (                                               )
260cdf0e10cSrcweir         ,   m_bSuspendQuickstartVeto( sal_False										)
261cdf0e10cSrcweir         ,   m_aCommandOptions       (                                               )
262cdf0e10cSrcweir         ,   m_sName                 (                                               )
263cdf0e10cSrcweir         ,   m_sTitle                (                                               )
264cdf0e10cSrcweir         ,   m_xDispatchRecorderSupplier(                                            )
265cdf0e10cSrcweir         ,   m_xPipeTerminator       (                                               )
266cdf0e10cSrcweir         ,   m_xQuickLauncher        (                                               )
267cdf0e10cSrcweir         ,   m_xSWThreadManager      (                                               )
268cdf0e10cSrcweir         ,   m_xSfxTerminator        (                                               )
269cdf0e10cSrcweir         ,   m_xTitleNumberGenerator (                                               )
270cdf0e10cSrcweir {
271cdf0e10cSrcweir 	// Safe impossible cases
272cdf0e10cSrcweir 	// We don't accept all incoming parameter.
273cdf0e10cSrcweir     LOG_ASSERT2( implcp_ctor( xFactory ), "Desktop::Desktop()", "Invalid parameter detected!")
274cdf0e10cSrcweir }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir /*-************************************************************************************************************//**
277cdf0e10cSrcweir 	@short		standard destructor
278cdf0e10cSrcweir 	@descr		This one do NOTHING! Use dispose() instaed of this.
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 	@seealso	method dispose()
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 	@param		-
283cdf0e10cSrcweir 	@return		-
284cdf0e10cSrcweir 
285cdf0e10cSrcweir 	@onerror	-
286cdf0e10cSrcweir *//*-*************************************************************************************************************/
~Desktop()287cdf0e10cSrcweir Desktop::~Desktop()
288cdf0e10cSrcweir {
289cdf0e10cSrcweir     LOG_ASSERT2( m_bIsTerminated                       ==sal_False, "Desktop::~Desktop()", "Who forgot to terminate the desktop service?" )
290cdf0e10cSrcweir     LOG_ASSERT2( m_aTransactionManager.getWorkingMode()!=E_CLOSE  , "Desktop::~Desktop()", "Who forgot to dispose this service?"          )
291cdf0e10cSrcweir }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir //=============================================================================
terminate()294cdf0e10cSrcweir sal_Bool SAL_CALL Desktop::terminate()
295cdf0e10cSrcweir     throw( css::uno::RuntimeException )
296cdf0e10cSrcweir {
297cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
298cdf0e10cSrcweir 
299cdf0e10cSrcweir     SYNCHRONIZED_START
300cdf0e10cSrcweir         ReadGuard aReadLock( m_aLock );
301cdf0e10cSrcweir 
302cdf0e10cSrcweir         css::uno::Reference< css::frame::XTerminateListener > xPipeTerminator    = m_xPipeTerminator;
303cdf0e10cSrcweir         css::uno::Reference< css::frame::XTerminateListener > xQuickLauncher     = m_xQuickLauncher;
304cdf0e10cSrcweir         css::uno::Reference< css::frame::XTerminateListener > xSWThreadManager   = m_xSWThreadManager;
305cdf0e10cSrcweir         css::uno::Reference< css::frame::XTerminateListener > xSfxTerminator     = m_xSfxTerminator;
306cdf0e10cSrcweir 
307cdf0e10cSrcweir         css::lang::EventObject                                aEvent             ( static_cast< ::cppu::OWeakObject* >(this) );
308cdf0e10cSrcweir         ::sal_Bool											  bAskQuickStart     = !m_bSuspendQuickstartVeto                  ;
309cdf0e10cSrcweir 
310cdf0e10cSrcweir         aReadLock.unlock();
311cdf0e10cSrcweir     SYNCHRONIZED_END
312cdf0e10cSrcweir 
313cdf0e10cSrcweir     //-------------------------------------------------------------------------------------------------------------
314cdf0e10cSrcweir     // Ask normal terminate listener. They could stop terminate without closing any open document.
315cdf0e10cSrcweir     Desktop::TTerminateListenerList lCalledTerminationListener;
316cdf0e10cSrcweir     ::sal_Bool                      bVeto = sal_False;
317cdf0e10cSrcweir     impl_sendQueryTerminationEvent(lCalledTerminationListener, bVeto);
318cdf0e10cSrcweir     if ( bVeto )
319cdf0e10cSrcweir     {
320cdf0e10cSrcweir         impl_sendCancelTerminationEvent(lCalledTerminationListener);
321cdf0e10cSrcweir         return sal_False;
322cdf0e10cSrcweir     }
323cdf0e10cSrcweir 
324cdf0e10cSrcweir     //-------------------------------------------------------------------------------------------------------------
325cdf0e10cSrcweir     // try to close all open frames.
326cdf0e10cSrcweir     // Allow using of any UI ... because Desktop.terminate() was designed as UI functionality in the past.
327cdf0e10cSrcweir     ::sal_Bool bAllowUI      = sal_True;
328cdf0e10cSrcweir     ::sal_Bool bFramesClosed = impl_closeFrames(bAllowUI);
329cdf0e10cSrcweir     if ( ! bFramesClosed )
330cdf0e10cSrcweir     {
331cdf0e10cSrcweir         impl_sendCancelTerminationEvent(lCalledTerminationListener);
332cdf0e10cSrcweir         return sal_False;
333cdf0e10cSrcweir     }
334cdf0e10cSrcweir 
335cdf0e10cSrcweir     //-------------------------------------------------------------------------------------------------------------
336cdf0e10cSrcweir     // Normal listener had no problem ...
337cdf0e10cSrcweir     // all frames was closed ...
338cdf0e10cSrcweir     // now it's time to ask our specialized listener.
339cdf0e10cSrcweir     // They are handled these way because they wish to hinder the office on termination
340cdf0e10cSrcweir     // but they wish also closing of all frames.
341cdf0e10cSrcweir 
342cdf0e10cSrcweir 	// Note further:
343cdf0e10cSrcweir     //    We shouldn't ask quicklauncher in case it was allowed from outside only.
344cdf0e10cSrcweir     //    This is special trick to "ignore existing quick starter" for debug purposes.
345cdf0e10cSrcweir 
346cdf0e10cSrcweir     // Attention:
347cdf0e10cSrcweir     // Order of alled listener is important !
348cdf0e10cSrcweir     // some of them are harmless .-)
349cdf0e10cSrcweir     // But some of them can be dangerous. E.g. it would be dangerous if we close our pipe
350cdf0e10cSrcweir     // and dont terminate in real because another listener throws a veto exception .-)
351cdf0e10cSrcweir 
352cdf0e10cSrcweir     ::sal_Bool bTerminate = sal_False;
353cdf0e10cSrcweir     try
354cdf0e10cSrcweir     {
355cdf0e10cSrcweir         if(
356cdf0e10cSrcweir             ( bAskQuickStart      ) &&
357cdf0e10cSrcweir             ( xQuickLauncher.is() )
358cdf0e10cSrcweir           )
359cdf0e10cSrcweir         {
360cdf0e10cSrcweir             xQuickLauncher->queryTermination( aEvent );
361cdf0e10cSrcweir             lCalledTerminationListener.push_back( xQuickLauncher );
362cdf0e10cSrcweir         }
363cdf0e10cSrcweir 
364cdf0e10cSrcweir         if ( xSWThreadManager.is() )
365cdf0e10cSrcweir         {
366cdf0e10cSrcweir             xSWThreadManager->queryTermination( aEvent );
367cdf0e10cSrcweir             lCalledTerminationListener.push_back( xSWThreadManager );
368cdf0e10cSrcweir         }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir         if ( xPipeTerminator.is() )
371cdf0e10cSrcweir         {
372cdf0e10cSrcweir             xPipeTerminator->queryTermination( aEvent );
373cdf0e10cSrcweir             lCalledTerminationListener.push_back( xPipeTerminator );
374cdf0e10cSrcweir         }
375cdf0e10cSrcweir 
376cdf0e10cSrcweir         if ( xSfxTerminator.is() )
377cdf0e10cSrcweir         {
378cdf0e10cSrcweir             xSfxTerminator->queryTermination( aEvent );
379cdf0e10cSrcweir             lCalledTerminationListener.push_back( xSfxTerminator );
380cdf0e10cSrcweir         }
381cdf0e10cSrcweir 
382cdf0e10cSrcweir         bTerminate = sal_True;
383cdf0e10cSrcweir     }
384cdf0e10cSrcweir     catch(const css::frame::TerminationVetoException&)
385cdf0e10cSrcweir     {
386cdf0e10cSrcweir         bTerminate = sal_False;
387cdf0e10cSrcweir     }
388cdf0e10cSrcweir 
389cdf0e10cSrcweir     if ( ! bTerminate )
390cdf0e10cSrcweir         impl_sendCancelTerminationEvent(lCalledTerminationListener);
391cdf0e10cSrcweir     else
392cdf0e10cSrcweir     {
393cdf0e10cSrcweir         #ifdef ENABLE_ASSERTIONS
394cdf0e10cSrcweir             // "Protect" us against dispose before terminate calls!
395cdf0e10cSrcweir             // see dispose() for further informations.
396cdf0e10cSrcweir             /* SAFE AREA --------------------------------------------------------------------------------------- */
397cdf0e10cSrcweir             WriteGuard aWriteLock( m_aLock );
398cdf0e10cSrcweir             m_bIsTerminated = sal_True;
399cdf0e10cSrcweir             aWriteLock.unlock();
400cdf0e10cSrcweir             /* UNSAFE AREA ------------------------------------------------------------------------------------- */
401cdf0e10cSrcweir         #endif
402cdf0e10cSrcweir 
403cdf0e10cSrcweir         impl_sendNotifyTerminationEvent();
404cdf0e10cSrcweir 
405cdf0e10cSrcweir         if(
406cdf0e10cSrcweir             ( bAskQuickStart      ) &&
407cdf0e10cSrcweir             ( xQuickLauncher.is() )
408cdf0e10cSrcweir           )
409cdf0e10cSrcweir         {
410cdf0e10cSrcweir             xQuickLauncher->notifyTermination( aEvent );
411cdf0e10cSrcweir         }
412cdf0e10cSrcweir 
413cdf0e10cSrcweir         if ( xSWThreadManager.is() )
414cdf0e10cSrcweir             xSWThreadManager->notifyTermination( aEvent );
415cdf0e10cSrcweir 
416cdf0e10cSrcweir         if ( xPipeTerminator.is() )
417cdf0e10cSrcweir             xPipeTerminator->notifyTermination( aEvent );
418cdf0e10cSrcweir 
419cdf0e10cSrcweir         // Must be realy the last listener to be called.
420cdf0e10cSrcweir         // Because it shutdown the whole process asynchronous !
421cdf0e10cSrcweir         if ( xSfxTerminator.is() )
422cdf0e10cSrcweir             xSfxTerminator->notifyTermination( aEvent );
423cdf0e10cSrcweir     }
424cdf0e10cSrcweir 
425cdf0e10cSrcweir     return bTerminate;
426cdf0e10cSrcweir }
427cdf0e10cSrcweir 
428cdf0e10cSrcweir 
429cdf0e10cSrcweir //=============================================================================
addTerminateListener(const css::uno::Reference<css::frame::XTerminateListener> & xListener)430cdf0e10cSrcweir void SAL_CALL Desktop::addTerminateListener( const css::uno::Reference< css::frame::XTerminateListener >& xListener )
431cdf0e10cSrcweir     throw( css::uno::RuntimeException )
432cdf0e10cSrcweir {
433cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
434cdf0e10cSrcweir 
435cdf0e10cSrcweir     css::uno::Reference< css::lang::XServiceInfo > xInfo( xListener, css::uno::UNO_QUERY );
436cdf0e10cSrcweir     if ( xInfo.is() )
437cdf0e10cSrcweir     {
438cdf0e10cSrcweir         ::rtl::OUString sImplementationName = xInfo->getImplementationName();
439cdf0e10cSrcweir 
440cdf0e10cSrcweir         // SYCNHRONIZED ->
441cdf0e10cSrcweir         WriteGuard aWriteLock( m_aLock );
442cdf0e10cSrcweir 
443cdf0e10cSrcweir         if( sImplementationName.equals(IMPLEMENTATIONNAME_SFXTERMINATOR) )
444cdf0e10cSrcweir         {
445cdf0e10cSrcweir             m_xSfxTerminator = xListener;
446cdf0e10cSrcweir             return;
447cdf0e10cSrcweir         }
448cdf0e10cSrcweir         if( sImplementationName.equals(IMPLEMENTATIONNAME_PIPETERMINATOR) )
449cdf0e10cSrcweir         {
450cdf0e10cSrcweir             m_xPipeTerminator = xListener;
451cdf0e10cSrcweir             return;
452cdf0e10cSrcweir         }
453cdf0e10cSrcweir         if( sImplementationName.equals(IMPLEMENTATIONNAME_QUICKLAUNCHER) )
454cdf0e10cSrcweir         {
455cdf0e10cSrcweir             m_xQuickLauncher = xListener;
456cdf0e10cSrcweir             return;
457cdf0e10cSrcweir         }
458cdf0e10cSrcweir         if( sImplementationName.equals(IMPLEMENTATIONNAME_SWTHREADMANAGER) )
459cdf0e10cSrcweir         {
460cdf0e10cSrcweir             m_xSWThreadManager = xListener;
461cdf0e10cSrcweir             return;
462cdf0e10cSrcweir         }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir         aWriteLock.unlock();
465cdf0e10cSrcweir         // <- SYCNHRONIZED
466cdf0e10cSrcweir     }
467cdf0e10cSrcweir 
468cdf0e10cSrcweir     // No lock required ... container is threadsafe by itself.
469cdf0e10cSrcweir     m_aListenerContainer.addInterface( ::getCppuType( ( const css::uno::Reference< css::frame::XTerminateListener >*) NULL ), xListener );
470cdf0e10cSrcweir }
471cdf0e10cSrcweir 
472cdf0e10cSrcweir //=============================================================================
removeTerminateListener(const css::uno::Reference<css::frame::XTerminateListener> & xListener)473cdf0e10cSrcweir void SAL_CALL Desktop::removeTerminateListener( const css::uno::Reference< css::frame::XTerminateListener >& xListener )
474cdf0e10cSrcweir     throw( css::uno::RuntimeException )
475cdf0e10cSrcweir {
476cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS );
477cdf0e10cSrcweir 
478cdf0e10cSrcweir     css::uno::Reference< css::lang::XServiceInfo > xInfo( xListener, css::uno::UNO_QUERY );
479cdf0e10cSrcweir     if ( xInfo.is() )
480cdf0e10cSrcweir     {
481cdf0e10cSrcweir         ::rtl::OUString sImplementationName = xInfo->getImplementationName();
482cdf0e10cSrcweir 
483cdf0e10cSrcweir         // SYCNHRONIZED ->
484cdf0e10cSrcweir         WriteGuard aWriteLock( m_aLock );
485cdf0e10cSrcweir 
486cdf0e10cSrcweir         if( sImplementationName.equals(IMPLEMENTATIONNAME_SFXTERMINATOR) )
487cdf0e10cSrcweir         {
488cdf0e10cSrcweir             m_xSfxTerminator.clear();
489cdf0e10cSrcweir             return;
490cdf0e10cSrcweir         }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir         if( sImplementationName.equals(IMPLEMENTATIONNAME_PIPETERMINATOR) )
493cdf0e10cSrcweir         {
494cdf0e10cSrcweir             m_xPipeTerminator.clear();
495cdf0e10cSrcweir             return;
496cdf0e10cSrcweir         }
497cdf0e10cSrcweir 
498cdf0e10cSrcweir         if( sImplementationName.equals(IMPLEMENTATIONNAME_QUICKLAUNCHER) )
499cdf0e10cSrcweir         {
500cdf0e10cSrcweir             m_xQuickLauncher.clear();
501cdf0e10cSrcweir             return;
502cdf0e10cSrcweir         }
503cdf0e10cSrcweir 
504cdf0e10cSrcweir         if( sImplementationName.equals(IMPLEMENTATIONNAME_SWTHREADMANAGER) )
505cdf0e10cSrcweir         {
506cdf0e10cSrcweir             m_xSWThreadManager.clear();
507cdf0e10cSrcweir             return;
508cdf0e10cSrcweir         }
509cdf0e10cSrcweir 
510cdf0e10cSrcweir         aWriteLock.unlock();
511cdf0e10cSrcweir         // <- SYCNHRONIZED
512cdf0e10cSrcweir     }
513cdf0e10cSrcweir 
514cdf0e10cSrcweir     // No lock required ... container is threadsafe by itself.
515cdf0e10cSrcweir     m_aListenerContainer.removeInterface( ::getCppuType( ( const css::uno::Reference< css::frame::XTerminateListener >*) NULL ), xListener );
516cdf0e10cSrcweir }
517cdf0e10cSrcweir 
518cdf0e10cSrcweir /*-************************************************************************************************************//**
519cdf0e10cSrcweir     @interface  XDesktop
520cdf0e10cSrcweir     @short      get access to create enumerations of all current components
521cdf0e10cSrcweir     @descr      You will be the owner of the returned object and must delete it if you don't use it again.
522cdf0e10cSrcweir 
523cdf0e10cSrcweir     @seealso    class TasksAccess
524cdf0e10cSrcweir     @seealso    class TasksEnumeration
525cdf0e10cSrcweir 
526cdf0e10cSrcweir     @param      -
527cdf0e10cSrcweir     @return     A reference to an XEnumerationAccess-object.
528cdf0e10cSrcweir 
529cdf0e10cSrcweir     @onerror    We return a null-reference.
530cdf0e10cSrcweir     @threadsafe yes
531cdf0e10cSrcweir *//*-*************************************************************************************************************/
getComponents()532cdf0e10cSrcweir css::uno::Reference< css::container::XEnumerationAccess > SAL_CALL Desktop::getComponents() throw( css::uno::RuntimeException )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
535cdf0e10cSrcweir     // Register transaction and reject wrong calls.
536cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
537cdf0e10cSrcweir 
538cdf0e10cSrcweir 	// We use a helper class OComponentAccess to have access on all child components.
539cdf0e10cSrcweir     // Create it on demand and return it as a reference.
540cdf0e10cSrcweir     OComponentAccess* pAccess = new OComponentAccess( this );
541cdf0e10cSrcweir     css::uno::Reference< css::container::XEnumerationAccess > xAccess( static_cast< ::cppu::OWeakObject* >(pAccess), css::uno::UNO_QUERY );
542cdf0e10cSrcweir     return xAccess;
543cdf0e10cSrcweir }
544cdf0e10cSrcweir 
545cdf0e10cSrcweir /*-************************************************************************************************************//**
546cdf0e10cSrcweir     @interface  XDesktop
547cdf0e10cSrcweir     @short      return the current active component
548cdf0e10cSrcweir     @descr      The most current component is the window, model or the controller of the current active frame.
549cdf0e10cSrcweir 
550cdf0e10cSrcweir     @seealso    method getCurrentFrame()
551cdf0e10cSrcweir     @seealso    method impl_getFrameComponent()
552cdf0e10cSrcweir 
553cdf0e10cSrcweir     @param      -
554cdf0e10cSrcweir     @return     A reference to the component.
555cdf0e10cSrcweir 
556cdf0e10cSrcweir     @onerror    We return a null-reference.
557cdf0e10cSrcweir     @threadsafe yes
558cdf0e10cSrcweir *//*-*************************************************************************************************************/
getCurrentComponent()559cdf0e10cSrcweir css::uno::Reference< css::lang::XComponent > SAL_CALL Desktop::getCurrentComponent() throw( css::uno::RuntimeException )
560cdf0e10cSrcweir {
561cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
562cdf0e10cSrcweir     // Register transaction and reject wrong calls.
563cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
564cdf0e10cSrcweir 
565cdf0e10cSrcweir 	// Set return value if method failed.
566cdf0e10cSrcweir     css::uno::Reference< css::lang::XComponent > xComponent;
567cdf0e10cSrcweir 
568cdf0e10cSrcweir 	// Get reference to current frame ...
569cdf0e10cSrcweir 	// ... get component of this frame ... (It can be the window, the model or the controller.)
570cdf0e10cSrcweir     // ... and return the result.
571cdf0e10cSrcweir     css::uno::Reference< css::frame::XFrame > xCurrentFrame = getCurrentFrame();
572cdf0e10cSrcweir 	if( xCurrentFrame.is() == sal_True )
573cdf0e10cSrcweir 	{
574cdf0e10cSrcweir 		xComponent = impl_getFrameComponent( xCurrentFrame );
575cdf0e10cSrcweir 	}
576cdf0e10cSrcweir 	return xComponent;
577cdf0e10cSrcweir }
578cdf0e10cSrcweir 
579cdf0e10cSrcweir /*-************************************************************************************************************//**
580cdf0e10cSrcweir     @interface  XDesktop
581cdf0e10cSrcweir     @short      return the current active frame in hierarchy
582cdf0e10cSrcweir     @descr      There can be more then one different active pathes in our frame hierarchy. But only one of them
583cdf0e10cSrcweir                 could be the most active frame (normal he has the focus).
584cdf0e10cSrcweir                 Don't mix it with getActiveFrame()! That will return our current active frame, which must be
585cdf0e10cSrcweir                 a direct child of us and should be a part(!) of an active path.
586cdf0e10cSrcweir 
587cdf0e10cSrcweir     @seealso    method getActiveFrame()
588cdf0e10cSrcweir 
589cdf0e10cSrcweir     @param      -
590cdf0e10cSrcweir     @return     A valid reference, if there is an active frame.
591cdf0e10cSrcweir                 A null reference , otherwise.
592cdf0e10cSrcweir 
593cdf0e10cSrcweir     @onerror    We return a null reference.
594cdf0e10cSrcweir     @threadsafe yes
595cdf0e10cSrcweir *//*-*************************************************************************************************************/
getCurrentFrame()596cdf0e10cSrcweir css::uno::Reference< css::frame::XFrame > SAL_CALL Desktop::getCurrentFrame() throw( css::uno::RuntimeException )
597cdf0e10cSrcweir {
598cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
599cdf0e10cSrcweir     // Register transaction and reject wrong calls.
600cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
601cdf0e10cSrcweir 
602cdf0e10cSrcweir 	// Start search with ouer direct active frame (if it exist!).
603cdf0e10cSrcweir     // Search on his children for other active frames too.
604cdf0e10cSrcweir     // Stop if no one could be found and return last of found ones.
605cdf0e10cSrcweir     css::uno::Reference< css::frame::XFramesSupplier > xLast = css::uno::Reference< css::frame::XFramesSupplier >( getActiveFrame(), css::uno::UNO_QUERY );
606cdf0e10cSrcweir     if( xLast.is() == sal_True )
607cdf0e10cSrcweir 	{
608cdf0e10cSrcweir         css::uno::Reference< css::frame::XFramesSupplier > xNext = css::uno::Reference< css::frame::XFramesSupplier >( xLast->getActiveFrame(), css::uno::UNO_QUERY );
609cdf0e10cSrcweir         while( xNext.is() == sal_True )
610cdf0e10cSrcweir 		{
611cdf0e10cSrcweir             xLast = xNext;
612cdf0e10cSrcweir             xNext = css::uno::Reference< css::frame::XFramesSupplier >( xNext->getActiveFrame(), css::uno::UNO_QUERY );
613cdf0e10cSrcweir 		}
614cdf0e10cSrcweir 	}
615cdf0e10cSrcweir     return css::uno::Reference< css::frame::XFrame >( xLast, css::uno::UNO_QUERY );
616cdf0e10cSrcweir }
617cdf0e10cSrcweir 
618cdf0e10cSrcweir /*-************************************************************************************************************//**
619cdf0e10cSrcweir     @interface  XComponentLoader
620cdf0e10cSrcweir     @short      try to load given URL into a task
621cdf0e10cSrcweir     @descr      You can give us some informations about the content, which you will load into a frame.
622cdf0e10cSrcweir                 We search or create this target for you, make a type detection of given URL and try to load it.
623cdf0e10cSrcweir                 As result of this operation we return the new created component or nothing, if loading failed.
624cdf0e10cSrcweir 
625cdf0e10cSrcweir     @seealso    -
626cdf0e10cSrcweir 
627cdf0e10cSrcweir     @param      "sURL"              , URL, which represant the content
628cdf0e10cSrcweir     @param      "sTargetFrameName"  , name of target frame or special value like "_self", "_blank" ...
629cdf0e10cSrcweir     @param      "nSearchFlags"      , optional arguments for frame search, if target isn't a special one
630cdf0e10cSrcweir     @param      "lArguments"        , optional arguments for loading
631cdf0e10cSrcweir     @return     A valid component reference, if loading was successfully.
632cdf0e10cSrcweir                 A null reference otherwise.
633cdf0e10cSrcweir 
634cdf0e10cSrcweir     @onerror    We return a null reference.
635cdf0e10cSrcweir     @threadsafe yes
636cdf0e10cSrcweir *//*-*************************************************************************************************************/
loadComponentFromURL(const::rtl::OUString & sURL,const::rtl::OUString & sTargetFrameName,sal_Int32 nSearchFlags,const css::uno::Sequence<css::beans::PropertyValue> & lArguments)637cdf0e10cSrcweir css::uno::Reference< css::lang::XComponent > SAL_CALL Desktop::loadComponentFromURL( const ::rtl::OUString&                                 sURL            ,
638cdf0e10cSrcweir                                                                                      const ::rtl::OUString&                                 sTargetFrameName,
639cdf0e10cSrcweir                                                                                            sal_Int32                                        nSearchFlags    ,
640cdf0e10cSrcweir                                                                                      const css::uno::Sequence< css::beans::PropertyValue >& lArguments      ) throw(    css::io::IOException                ,
641cdf0e10cSrcweir                                                                                                                                                                         css::lang::IllegalArgumentException ,
642cdf0e10cSrcweir                                                                                                                                                                         css::uno::RuntimeException          )
643cdf0e10cSrcweir {
644cdf0e10cSrcweir     /* UNSAFE AREA --------------------------------------------------------------------------------------------- */
645cdf0e10cSrcweir     // Register transaction and reject wrong calls.
646cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
647cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT( aLog, "framework (as96863) ::Desktop::loadComponentFromURL" );
648cdf0e10cSrcweir 
649cdf0e10cSrcweir     ReadGuard aReadLock(m_aLock);
650cdf0e10cSrcweir     css::uno::Reference< css::frame::XComponentLoader > xThis(static_cast< css::frame::XComponentLoader* >(this), css::uno::UNO_QUERY);
651cdf0e10cSrcweir     css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xFactory;
652cdf0e10cSrcweir     aReadLock.unlock();
653cdf0e10cSrcweir 
654cdf0e10cSrcweir     RTL_LOGFILE_PRODUCT_CONTEXT( aLog2, "PERFORMANCE - Desktop::loadComponentFromURL()" );
655cdf0e10cSrcweir     return LoadEnv::loadComponentFromURL(xThis, xSMGR, sURL, sTargetFrameName, nSearchFlags, lArguments);
656cdf0e10cSrcweir }
657cdf0e10cSrcweir 
658cdf0e10cSrcweir /*-************************************************************************************************************//**
659cdf0e10cSrcweir     @interface  XTasksSupplier
660cdf0e10cSrcweir     @short      get access to create enumerations of ouer taskchilds
661cdf0e10cSrcweir     @descr      Direct childs of desktop are tasks everytime.
662cdf0e10cSrcweir                 Call these method to could create enumerations of it.
663cdf0e10cSrcweir 
664cdf0e10cSrcweir But; Don't forget - you will be the owner of returned object and must release it!
665cdf0e10cSrcweir                 We use a helper class to implement the access interface. They hold a weakreference to us.
666cdf0e10cSrcweir                 It can be, that the desktop is dead - but not your tasksaccess-object! Then they will do nothing!
667cdf0e10cSrcweir                 You can't create enumerations then.
668cdf0e10cSrcweir 
669cdf0e10cSrcweir     @attention  Normaly we don't need any lock here. We don't work on internal member!
670cdf0e10cSrcweir 
671cdf0e10cSrcweir     @seealso    class TasksAccess
672cdf0e10cSrcweir 
673cdf0e10cSrcweir     @param      -
674cdf0e10cSrcweir     @return     A reference to an accessobject, which can create enumerations of ouer childtasks.
675cdf0e10cSrcweir 
676cdf0e10cSrcweir     @onerror    A null reference is returned.
677cdf0e10cSrcweir     @threadsafe yes
678cdf0e10cSrcweir *//*-*************************************************************************************************************/
getTasks()679cdf0e10cSrcweir css::uno::Reference< css::container::XEnumerationAccess > SAL_CALL Desktop::getTasks() throw( css::uno::RuntimeException )
680cdf0e10cSrcweir {
681cdf0e10cSrcweir     LOG_WARNING("Desktop::getTasks()", "Use of obsolete interface XTaskSupplier")
682cdf0e10cSrcweir     return NULL;
683cdf0e10cSrcweir     /*
684cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
685cdf0e10cSrcweir 
686cdf0e10cSrcweir     OTasksAccess* pTasksAccess = new OTasksAccess( this, &m_aChildTaskContainer );
687cdf0e10cSrcweir     css::uno::Reference< css::container::XEnumerationAccess > xAccess( static_cast< ::cppu::OWeakObject* >(pTasksAccess), css::uno::UNO_QUERY );
688cdf0e10cSrcweir 	return xAccess;
689cdf0e10cSrcweir     */
690cdf0e10cSrcweir }
691cdf0e10cSrcweir 
692cdf0e10cSrcweir /*-************************************************************************************************************//**
693cdf0e10cSrcweir     @interface  XTasksSupplier
694cdf0e10cSrcweir     @short      return current active task of ouer direct childs
695cdf0e10cSrcweir     @descr      Desktop childs are tasks only ! If we have an active path from desktop
696cdf0e10cSrcweir                 as top to any frame on bottom, we must have an active direct child. His reference is returned here.
697cdf0e10cSrcweir 
698cdf0e10cSrcweir     @attention  a)  Do not confuse it with getCurrentFrame()! The current frame don't must one of ouer direct childs.
699cdf0e10cSrcweir                     It can be every frame in subtree and must have the focus (Is the last one of an active path!).
700cdf0e10cSrcweir                 b)  We don't need any lock here. Our container is threadsafe himself and live, if we live!
701cdf0e10cSrcweir 
702cdf0e10cSrcweir     @seealso    method getCurrentFrame()
703cdf0e10cSrcweir 
704cdf0e10cSrcweir     @param      -
705cdf0e10cSrcweir     @return     A reference to ouer current active taskchild.
706cdf0e10cSrcweir 
707cdf0e10cSrcweir     @onerror    A null reference is returned.
708cdf0e10cSrcweir     @threadsafe yes
709cdf0e10cSrcweir *//*-*************************************************************************************************************/
getActiveTask()710cdf0e10cSrcweir css::uno::Reference< css::frame::XTask > SAL_CALL Desktop::getActiveTask() throw( css::uno::RuntimeException )
711cdf0e10cSrcweir {
712cdf0e10cSrcweir     /*
713cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
714cdf0e10cSrcweir 
715cdf0e10cSrcweir     return css::uno::Reference< css::frame::XTask >( m_aChildTaskContainer.getActive(), css::uno::UNO_QUERY );
716cdf0e10cSrcweir     */
717cdf0e10cSrcweir     LOG_WARNING("Desktop::getActiveTask()", "Use of obsolete interface XTaskSupplier")
718cdf0e10cSrcweir     return NULL;
719cdf0e10cSrcweir }
720cdf0e10cSrcweir 
721cdf0e10cSrcweir /*-************************************************************************************************************//**
722cdf0e10cSrcweir     @interface  XDispatchProvider
723cdf0e10cSrcweir     @short      search a dispatcher for given URL
724cdf0e10cSrcweir     @descr      We use a helper implementation (class DispatchProvider) to do so.
725cdf0e10cSrcweir                 So we don't must implement this algorithm twice!
726cdf0e10cSrcweir 
727cdf0e10cSrcweir     @attention  We don't need any lock here. Our helper is threadsafe himself and live, if we live!
728cdf0e10cSrcweir 
729cdf0e10cSrcweir     @seealso    class DispatchProvider
730cdf0e10cSrcweir 
731cdf0e10cSrcweir     @param      "aURL"              , URL to dispatch
732cdf0e10cSrcweir     @param      "sTargetFrameName"  , name of target frame, who should dispatch these URL
733cdf0e10cSrcweir     @param      "nSearchFlags"      , flags to regulate the search
734cdf0e10cSrcweir     @param      "lQueries"          , list of queryDispatch() calls!
735cdf0e10cSrcweir     @return     A reference or list of founded dispatch objects for these URL.
736cdf0e10cSrcweir 
737cdf0e10cSrcweir     @onerror    A null reference is returned.
738cdf0e10cSrcweir     @threadsafe yes
739cdf0e10cSrcweir *//*-*************************************************************************************************************/
queryDispatch(const css::util::URL & aURL,const::rtl::OUString & sTargetFrameName,sal_Int32 nSearchFlags)740cdf0e10cSrcweir css::uno::Reference< css::frame::XDispatch > SAL_CALL Desktop::queryDispatch( const css::util::URL&  aURL             ,
741cdf0e10cSrcweir                                                                               const ::rtl::OUString& sTargetFrameName ,
742cdf0e10cSrcweir                                                                                     sal_Int32        nSearchFlags     ) throw( css::uno::RuntimeException )
743cdf0e10cSrcweir {
744cdf0e10cSrcweir 	const char UNO_PROTOCOL[] = ".uno:";
745cdf0e10cSrcweir 
746cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
747cdf0e10cSrcweir     // Register transaction and reject wrong calls.
748cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
749cdf0e10cSrcweir 
750cdf0e10cSrcweir 	// Remove uno and cmd protocol part as we want to support both of them. We store only the command part
751cdf0e10cSrcweir 	// in our hash map. All other protocols are stored with the protocol part.
752cdf0e10cSrcweir 	String aCommand( aURL.Main );
753cdf0e10cSrcweir 	if ( aURL.Protocol.equalsIgnoreAsciiCaseAsciiL( UNO_PROTOCOL, sizeof( UNO_PROTOCOL )-1 ))
754cdf0e10cSrcweir 		aCommand = aURL.Path;
755cdf0e10cSrcweir 
756cdf0e10cSrcweir 	// Make hash_map lookup if the current URL is in the disabled list
757cdf0e10cSrcweir 	if ( m_aCommandOptions.Lookup( SvtCommandOptions::CMDOPTION_DISABLED, aCommand ) )
758cdf0e10cSrcweir 		return css::uno::Reference< css::frame::XDispatch >();
759cdf0e10cSrcweir 	else
760cdf0e10cSrcweir 	{
761cdf0e10cSrcweir 		// We use a helper to support these interface and an interceptor mechanism.
762cdf0e10cSrcweir 		// Our helper is threadsafe by himself!
763cdf0e10cSrcweir 		return m_xDispatchHelper->queryDispatch( aURL, sTargetFrameName, nSearchFlags );
764cdf0e10cSrcweir 	}
765cdf0e10cSrcweir }
766cdf0e10cSrcweir 
767cdf0e10cSrcweir //*****************************************************************************************************************
queryDispatches(const css::uno::Sequence<css::frame::DispatchDescriptor> & lQueries)768cdf0e10cSrcweir css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL Desktop::queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& lQueries ) throw( css::uno::RuntimeException )
769cdf0e10cSrcweir {
770cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
771cdf0e10cSrcweir     // Register transaction and reject wrong calls.
772cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
773cdf0e10cSrcweir 
774cdf0e10cSrcweir     return m_xDispatchHelper->queryDispatches( lQueries );
775cdf0e10cSrcweir }
776cdf0e10cSrcweir 
777cdf0e10cSrcweir /*-************************************************************************************************************//**
778cdf0e10cSrcweir     @interface  XDipsatchProviderInterception
779cdf0e10cSrcweir     @short      supports registration/deregistration of interception objects, which
780cdf0e10cSrcweir                 are interested on special dispatches.
781cdf0e10cSrcweir 
782cdf0e10cSrcweir     @descr      Its realy provided by an internal helper, which is used inside the dispatch api too.
783cdf0e10cSrcweir     @param      xInterceptor
784cdf0e10cSrcweir                 the interceptor object, which wish to be (de)registered.
785cdf0e10cSrcweir 
786cdf0e10cSrcweir     @threadsafe yes
787cdf0e10cSrcweir *//*-*************************************************************************************************************/
registerDispatchProviderInterceptor(const css::uno::Reference<css::frame::XDispatchProviderInterceptor> & xInterceptor)788cdf0e10cSrcweir void SAL_CALL Desktop::registerDispatchProviderInterceptor( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor)
789cdf0e10cSrcweir     throw( css::uno::RuntimeException)
790cdf0e10cSrcweir {
791cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
792cdf0e10cSrcweir 
793cdf0e10cSrcweir     css::uno::Reference< css::frame::XDispatchProviderInterception > xInterceptionHelper( m_xDispatchHelper, css::uno::UNO_QUERY );
794cdf0e10cSrcweir     xInterceptionHelper->registerDispatchProviderInterceptor( xInterceptor );
795cdf0e10cSrcweir }
796cdf0e10cSrcweir 
797cdf0e10cSrcweir //*****************************************************************************************************************
releaseDispatchProviderInterceptor(const css::uno::Reference<css::frame::XDispatchProviderInterceptor> & xInterceptor)798cdf0e10cSrcweir void SAL_CALL Desktop::releaseDispatchProviderInterceptor ( const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor)
799cdf0e10cSrcweir     throw( css::uno::RuntimeException)
800cdf0e10cSrcweir {
801cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS );
802cdf0e10cSrcweir 
803cdf0e10cSrcweir     css::uno::Reference< css::frame::XDispatchProviderInterception > xInterceptionHelper( m_xDispatchHelper, css::uno::UNO_QUERY );
804cdf0e10cSrcweir     xInterceptionHelper->releaseDispatchProviderInterceptor( xInterceptor );
805cdf0e10cSrcweir }
806cdf0e10cSrcweir 
807cdf0e10cSrcweir /*-************************************************************************************************************//**
808cdf0e10cSrcweir     @interface  XFramesSupplier
809cdf0e10cSrcweir     @short      return access to append or remove childs on desktop
810cdf0e10cSrcweir     @descr      We don't implement these interface directly. We use a helper class to do this.
811cdf0e10cSrcweir                 If you wish to add or delete childs to/from the container, call these method to get
812cdf0e10cSrcweir                 a reference to the helper.
813cdf0e10cSrcweir 
814cdf0e10cSrcweir     @attention  Helper is threadsafe himself. So we don't need any lock here.
815cdf0e10cSrcweir 
816cdf0e10cSrcweir     @seealso    class OFrames
817cdf0e10cSrcweir 
818cdf0e10cSrcweir     @param      -
819cdf0e10cSrcweir     @return     A reference to the helper.
820cdf0e10cSrcweir 
821cdf0e10cSrcweir     @onerror    A null reference is returned.
822cdf0e10cSrcweir     @threadsafe yes
823cdf0e10cSrcweir *//*-*************************************************************************************************************/
getFrames()824cdf0e10cSrcweir css::uno::Reference< css::frame::XFrames > SAL_CALL Desktop::getFrames() throw( css::uno::RuntimeException )
825cdf0e10cSrcweir {
826cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
827cdf0e10cSrcweir     // Register transaction and reject wrong calls.
828cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
829cdf0e10cSrcweir 
830cdf0e10cSrcweir     return m_xFramesHelper;
831cdf0e10cSrcweir }
832cdf0e10cSrcweir 
833cdf0e10cSrcweir /*-************************************************************************************************************//**
834cdf0e10cSrcweir     @interface  XFramesSupplier
835cdf0e10cSrcweir     @short      set/get the current active child frame
836cdf0e10cSrcweir     @descr      It must be a task. Direct childs of desktop are tasks only! No frames are accepted.
837cdf0e10cSrcweir                 We don't save this information directly in this class. We use ouer container-helper
838cdf0e10cSrcweir                 to do that.
839cdf0e10cSrcweir 
840cdf0e10cSrcweir     @attention  Helper is threadsafe himself. So we don't need any lock here.
841cdf0e10cSrcweir 
842cdf0e10cSrcweir     @seealso    class OFrameContainer
843cdf0e10cSrcweir 
844cdf0e10cSrcweir     @param      "xFrame", new active frame (must be valid!)
845cdf0e10cSrcweir     @return     A reference to ouer current active childtask, if anyone exist.
846cdf0e10cSrcweir 
847cdf0e10cSrcweir     @onerror    A null reference is returned.
848cdf0e10cSrcweir     @threadsafe yes
849cdf0e10cSrcweir *//*-*************************************************************************************************************/
setActiveFrame(const css::uno::Reference<css::frame::XFrame> & xFrame)850cdf0e10cSrcweir void SAL_CALL Desktop::setActiveFrame( const css::uno::Reference< css::frame::XFrame >& xFrame ) throw( css::uno::RuntimeException )
851cdf0e10cSrcweir {
852cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
853cdf0e10cSrcweir     // Register transaction and reject wrong calls.
854cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
855cdf0e10cSrcweir 
856cdf0e10cSrcweir     // Get old active frame first.
857cdf0e10cSrcweir     // If nothing will change - do nothing!
858cdf0e10cSrcweir     // Otherwise set new active frame ...
859cdf0e10cSrcweir     // and deactivate last frame.
860cdf0e10cSrcweir     // It's neccessary for our FrameActionEvent listener on a frame!
861cdf0e10cSrcweir     css::uno::Reference< css::frame::XFrame > xLastActiveChild = m_aChildTaskContainer.getActive();
862cdf0e10cSrcweir     if( xLastActiveChild != xFrame )
863cdf0e10cSrcweir 	{
864cdf0e10cSrcweir         m_aChildTaskContainer.setActive( xFrame );
865cdf0e10cSrcweir         if( xLastActiveChild.is() == sal_True )
866cdf0e10cSrcweir         {
867cdf0e10cSrcweir             xLastActiveChild->deactivate();
868cdf0e10cSrcweir         }
869cdf0e10cSrcweir     }
870cdf0e10cSrcweir }
871cdf0e10cSrcweir 
872cdf0e10cSrcweir //*****************************************************************************************************************
getActiveFrame()873cdf0e10cSrcweir css::uno::Reference< css::frame::XFrame > SAL_CALL Desktop::getActiveFrame() throw( css::uno::RuntimeException )
874cdf0e10cSrcweir {
875cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
876cdf0e10cSrcweir     // Register transaction and reject wrong calls.
877cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 	return m_aChildTaskContainer.getActive();
880cdf0e10cSrcweir }
881cdf0e10cSrcweir 
882cdf0e10cSrcweir /*-************************************************************************************************************//**
883cdf0e10cSrcweir     @interface  XFrame
884cdf0e10cSrcweir     @short      non implemented methods!
885cdf0e10cSrcweir     @descr      Some method make no sense for our desktop! He has no window or parent or ...
886cdf0e10cSrcweir                 So we should implement it empty and warn programmer, if he use it!
887cdf0e10cSrcweir 
888cdf0e10cSrcweir     @seealso    -
889cdf0e10cSrcweir 
890cdf0e10cSrcweir     @param      -
891cdf0e10cSrcweir     @return     -
892cdf0e10cSrcweir 
893cdf0e10cSrcweir     @onerror    -
894cdf0e10cSrcweir     @threadsafe -
895cdf0e10cSrcweir *//*-*************************************************************************************************************/
initialize(const css::uno::Reference<css::awt::XWindow> &)896cdf0e10cSrcweir void SAL_CALL Desktop::initialize( const css::uno::Reference< css::awt::XWindow >& ) throw( css::uno::RuntimeException )
897cdf0e10cSrcweir {
898cdf0e10cSrcweir }
899cdf0e10cSrcweir 
900cdf0e10cSrcweir //*****************************************************************************************************************
getContainerWindow()901cdf0e10cSrcweir css::uno::Reference< css::awt::XWindow > SAL_CALL Desktop::getContainerWindow() throw( css::uno::RuntimeException )
902cdf0e10cSrcweir {
903cdf0e10cSrcweir     return css::uno::Reference< css::awt::XWindow >();
904cdf0e10cSrcweir }
905cdf0e10cSrcweir 
906cdf0e10cSrcweir //*****************************************************************************************************************
setCreator(const css::uno::Reference<css::frame::XFramesSupplier> &)907cdf0e10cSrcweir void SAL_CALL Desktop::setCreator( const css::uno::Reference< css::frame::XFramesSupplier >& /*xCreator*/ ) throw( css::uno::RuntimeException )
908cdf0e10cSrcweir {
909cdf0e10cSrcweir }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir //*****************************************************************************************************************
getCreator()912cdf0e10cSrcweir css::uno::Reference< css::frame::XFramesSupplier > SAL_CALL Desktop::getCreator() throw( css::uno::RuntimeException )
913cdf0e10cSrcweir {
914cdf0e10cSrcweir     return css::uno::Reference< css::frame::XFramesSupplier >();
915cdf0e10cSrcweir }
916cdf0e10cSrcweir 
917cdf0e10cSrcweir //*****************************************************************************************************************
getName()918cdf0e10cSrcweir ::rtl::OUString SAL_CALL Desktop::getName() throw( css::uno::RuntimeException )
919cdf0e10cSrcweir {
920cdf0e10cSrcweir     /* SAFE { */
921cdf0e10cSrcweir     ReadGuard aReadLock( m_aLock );
922cdf0e10cSrcweir     return m_sName;
923cdf0e10cSrcweir     /* } SAFE */
924cdf0e10cSrcweir }
925cdf0e10cSrcweir 
926cdf0e10cSrcweir //*****************************************************************************************************************
setName(const::rtl::OUString & sName)927cdf0e10cSrcweir void SAL_CALL Desktop::setName( const ::rtl::OUString& sName ) throw( css::uno::RuntimeException )
928cdf0e10cSrcweir {
929cdf0e10cSrcweir     /* SAFE { */
930cdf0e10cSrcweir     WriteGuard aWriteLock( m_aLock );
931cdf0e10cSrcweir     m_sName = sName;
932cdf0e10cSrcweir     aWriteLock.unlock();
933cdf0e10cSrcweir     /* } SAFE */
934cdf0e10cSrcweir }
935cdf0e10cSrcweir 
936cdf0e10cSrcweir //*****************************************************************************************************************
isTop()937cdf0e10cSrcweir sal_Bool SAL_CALL Desktop::isTop() throw( css::uno::RuntimeException )
938cdf0e10cSrcweir {
939cdf0e10cSrcweir 	return sal_True;
940cdf0e10cSrcweir }
941cdf0e10cSrcweir 
942cdf0e10cSrcweir //*****************************************************************************************************************
activate()943cdf0e10cSrcweir void SAL_CALL Desktop::activate() throw( css::uno::RuntimeException )
944cdf0e10cSrcweir {
945cdf0e10cSrcweir     // Desktop is activae always ... but sometimes our frames try to activate
946cdf0e10cSrcweir     // the complete path from bottom to top ... And our desktop is the topest frame :-(
947cdf0e10cSrcweir     // So - please don't show any assertions here. Do nothing!
948cdf0e10cSrcweir }
949cdf0e10cSrcweir 
950cdf0e10cSrcweir //*****************************************************************************************************************
deactivate()951cdf0e10cSrcweir void SAL_CALL Desktop::deactivate() throw( css::uno::RuntimeException )
952cdf0e10cSrcweir {
953cdf0e10cSrcweir     // Desktop is activae always ... but sometimes our frames try to deactivate
954cdf0e10cSrcweir     // the complete path from bottom to top ... And our desktop is the topest frame :-(
955cdf0e10cSrcweir     // So - please don't show any assertions here. Do nothing!
956cdf0e10cSrcweir }
957cdf0e10cSrcweir 
958cdf0e10cSrcweir //*****************************************************************************************************************
isActive()959cdf0e10cSrcweir sal_Bool SAL_CALL Desktop::isActive() throw( css::uno::RuntimeException )
960cdf0e10cSrcweir {
961cdf0e10cSrcweir 	return sal_True;
962cdf0e10cSrcweir }
963cdf0e10cSrcweir 
964cdf0e10cSrcweir //*****************************************************************************************************************
setComponent(const css::uno::Reference<css::awt::XWindow> &,const css::uno::Reference<css::frame::XController> &)965cdf0e10cSrcweir sal_Bool SAL_CALL Desktop::setComponent( const css::uno::Reference< css::awt::XWindow >&       /*xComponentWindow*/ ,
966cdf0e10cSrcweir                                          const css::uno::Reference< css::frame::XController >& /*xController*/      ) throw( css::uno::RuntimeException )
967cdf0e10cSrcweir {
968cdf0e10cSrcweir 	return sal_False;
969cdf0e10cSrcweir }
970cdf0e10cSrcweir 
971cdf0e10cSrcweir //*****************************************************************************************************************
getComponentWindow()972cdf0e10cSrcweir css::uno::Reference< css::awt::XWindow > SAL_CALL Desktop::getComponentWindow() throw( css::uno::RuntimeException )
973cdf0e10cSrcweir {
974cdf0e10cSrcweir     return css::uno::Reference< css::awt::XWindow >();
975cdf0e10cSrcweir }
976cdf0e10cSrcweir 
977cdf0e10cSrcweir //*****************************************************************************************************************
getController()978cdf0e10cSrcweir css::uno::Reference< css::frame::XController > SAL_CALL Desktop::getController() throw( css::uno::RuntimeException )
979cdf0e10cSrcweir {
980cdf0e10cSrcweir     return css::uno::Reference< css::frame::XController >();
981cdf0e10cSrcweir }
982cdf0e10cSrcweir 
983cdf0e10cSrcweir //*****************************************************************************************************************
contextChanged()984cdf0e10cSrcweir void SAL_CALL Desktop::contextChanged() throw( css::uno::RuntimeException )
985cdf0e10cSrcweir {
986cdf0e10cSrcweir }
987cdf0e10cSrcweir 
988cdf0e10cSrcweir //*****************************************************************************************************************
addFrameActionListener(const css::uno::Reference<css::frame::XFrameActionListener> &)989cdf0e10cSrcweir void SAL_CALL Desktop::addFrameActionListener( const css::uno::Reference< css::frame::XFrameActionListener >& ) throw( css::uno::RuntimeException )
990cdf0e10cSrcweir {
991cdf0e10cSrcweir }
992cdf0e10cSrcweir 
993cdf0e10cSrcweir //*****************************************************************************************************************
994cdf0e10cSrcweir //   css::frame::XFrame
995cdf0e10cSrcweir //*****************************************************************************************************************
removeFrameActionListener(const css::uno::Reference<css::frame::XFrameActionListener> &)996cdf0e10cSrcweir void SAL_CALL Desktop::removeFrameActionListener( const css::uno::Reference< css::frame::XFrameActionListener >& ) throw( css::uno::RuntimeException )
997cdf0e10cSrcweir {
998cdf0e10cSrcweir }
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir /*-************************************************************************************************************//**
1001cdf0e10cSrcweir     @interface  XFrame
1002cdf0e10cSrcweir     @short      try to find a frame with special parameters
1003cdf0e10cSrcweir     @descr      This method searches for a frame with the specified name.
1004cdf0e10cSrcweir                 Frames may contain other frames (e.g. a frameset) and may
1005cdf0e10cSrcweir                 be contained in other frames. This hierarchie ist searched by
1006cdf0e10cSrcweir                 this method.
1007cdf0e10cSrcweir                 First some special names are taken into account, i.e. "",
1008cdf0e10cSrcweir                 "_self", "_top", "_parent" etc. The FrameSearchFlags are ignored
1009cdf0e10cSrcweir                 when comparing these names with aTargetFrameName, further steps are
1010cdf0e10cSrcweir                 controlled by the FrameSearchFlags. If allowed, the name of the frame
1011cdf0e10cSrcweir                 itself is compared with the desired one, then ( again if allowed )
1012cdf0e10cSrcweir                 the method findFrame is called for all children of the frame.
1013cdf0e10cSrcweir                 If no Frame with the given name is found until the top frames container,
1014cdf0e10cSrcweir                 a new top Frame is created, if this is allowed by a special
1015cdf0e10cSrcweir                 FrameSearchFlag. The new Frame also gets the desired name.
1016cdf0e10cSrcweir                 We use a helper to get right search direction and react in a right manner.
1017cdf0e10cSrcweir 
1018cdf0e10cSrcweir     @seealso    class TargetFinder
1019cdf0e10cSrcweir 
1020cdf0e10cSrcweir     @param      "sTargetFrameName"  , name of searched frame
1021cdf0e10cSrcweir     @param      "nSearchFlags"      , flags to regulate search
1022cdf0e10cSrcweir     @return     A reference to an existing frame in hierarchy, if it exist.
1023cdf0e10cSrcweir 
1024cdf0e10cSrcweir     @onerror    A null reference is returned.
1025cdf0e10cSrcweir     @threadsafe yes
1026cdf0e10cSrcweir *//*-*************************************************************************************************************/
findFrame(const::rtl::OUString & sTargetFrameName,sal_Int32 nSearchFlags)1027cdf0e10cSrcweir css::uno::Reference< css::frame::XFrame > SAL_CALL Desktop::findFrame( const ::rtl::OUString& sTargetFrameName ,
1028cdf0e10cSrcweir                                                                              sal_Int32        nSearchFlags     ) throw( css::uno::RuntimeException )
1029cdf0e10cSrcweir {
1030cdf0e10cSrcweir     css::uno::Reference< css::frame::XFrame > xTarget;
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1033cdf0e10cSrcweir     // 0) Ignore wrong parameter!
1034cdf0e10cSrcweir     //    We doesn't support search for following special targets.
1035cdf0e10cSrcweir     //    If we reject this requests - we mustnt check for such names
1036cdf0e10cSrcweir     //    in following code again and again. If we do not so -wrong
1037cdf0e10cSrcweir     //    search results can occure!
1038cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1039cdf0e10cSrcweir     if (
1040cdf0e10cSrcweir         (sTargetFrameName==SPECIALTARGET_DEFAULT  )   ||    // valid for dispatches - not for findFrame()!
1041cdf0e10cSrcweir         (sTargetFrameName==SPECIALTARGET_MENUBAR  )   ||    // valid for dispatches - not for findFrame()!
1042cdf0e10cSrcweir         (sTargetFrameName==SPECIALTARGET_HELPAGENT)   ||    // valid for dispatches - not for findFrame()!
1043cdf0e10cSrcweir         (sTargetFrameName==SPECIALTARGET_PARENT   )   ||    // we have no parent by definition
1044cdf0e10cSrcweir         (sTargetFrameName==SPECIALTARGET_BEAMER   )         // beamer frames are allowed as child of tasks only -
1045cdf0e10cSrcweir                                                             // and they exist more then ones. We have no idea which our sub tasks is the right one
1046cdf0e10cSrcweir        )
1047cdf0e10cSrcweir     {
1048cdf0e10cSrcweir         return NULL;
1049cdf0e10cSrcweir     }
1050cdf0e10cSrcweir 
1051cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1052cdf0e10cSrcweir     // I) check for special defined targets first which must be handled exclusive.
1053cdf0e10cSrcweir     //    force using of "if() else if() ..."
1054cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir     // get threadsafe some neccessary member which are neccessary for following functionality
1057cdf0e10cSrcweir     /* SAFE { */
1058cdf0e10cSrcweir     ReadGuard aReadLock( m_aLock );
1059cdf0e10cSrcweir     css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory;
1060cdf0e10cSrcweir     aReadLock.unlock();
1061cdf0e10cSrcweir     /* } SAFE */
1062cdf0e10cSrcweir 
1063cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1064cdf0e10cSrcweir     // I.I) "_blank"
1065cdf0e10cSrcweir     //  create a new task as child of this desktop instance
1066cdf0e10cSrcweir     //  Note: Used helper TaskCreator use us automaticly ...
1067cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1068cdf0e10cSrcweir     if ( sTargetFrameName==SPECIALTARGET_BLANK )
1069cdf0e10cSrcweir     {
1070cdf0e10cSrcweir         TaskCreator aCreator(xFactory);
1071cdf0e10cSrcweir         xTarget = aCreator.createTask(sTargetFrameName,sal_False);
1072cdf0e10cSrcweir     }
1073cdf0e10cSrcweir 
1074cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1075cdf0e10cSrcweir     // I.II) "_top"
1076cdf0e10cSrcweir     //  We are top by definition
1077cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1078cdf0e10cSrcweir     else
1079cdf0e10cSrcweir     if ( sTargetFrameName==SPECIALTARGET_TOP )
1080cdf0e10cSrcweir     {
1081cdf0e10cSrcweir         xTarget = this;
1082cdf0e10cSrcweir     }
1083cdf0e10cSrcweir 
1084cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1085cdf0e10cSrcweir     // I.III) "_self", ""
1086cdf0e10cSrcweir     //  This mean this "frame" in every case.
1087cdf0e10cSrcweir     //-----------------------------------------------------------------------------------------------------
1088cdf0e10cSrcweir     else
1089cdf0e10cSrcweir     if (
1090cdf0e10cSrcweir         ( sTargetFrameName==SPECIALTARGET_SELF ) ||
1091cdf0e10cSrcweir         ( sTargetFrameName.getLength()<1       )
1092cdf0e10cSrcweir        )
1093cdf0e10cSrcweir     {
1094cdf0e10cSrcweir         xTarget = this;
1095cdf0e10cSrcweir     }
1096cdf0e10cSrcweir 
1097cdf0e10cSrcweir     else
1098cdf0e10cSrcweir     {
1099cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1100cdf0e10cSrcweir         // II) otherwhise use optional given search flags
1101cdf0e10cSrcweir         //  force using of combinations of such flags. means no "else" part of use if() statements.
1102cdf0e10cSrcweir         //  But we ust break further searches if target was already found.
1103cdf0e10cSrcweir         //  Order of using flags is fix: SELF - CHILDREN - SIBLINGS - PARENT
1104cdf0e10cSrcweir         //  TASK and CREATE are handled special.
1105cdf0e10cSrcweir         //  But note: Such flags are not valid for the desktop - especialy SIBLINGS or PARENT.
1106cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1107cdf0e10cSrcweir 
1108cdf0e10cSrcweir         // get threadsafe some neccessary member which are neccessary for following functionality
1109cdf0e10cSrcweir         /* SAFE { */
1110cdf0e10cSrcweir         aReadLock.lock();
1111cdf0e10cSrcweir         ::rtl::OUString sOwnName = m_sName;
1112cdf0e10cSrcweir         aReadLock.unlock();
1113cdf0e10cSrcweir         /* } SAFE */
1114cdf0e10cSrcweir 
1115cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1116cdf0e10cSrcweir         // II.I) SELF
1117cdf0e10cSrcweir         //  Check for right name. If it's the searched one return ourself - otherwhise
1118cdf0e10cSrcweir         //  ignore this flag.
1119cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1120cdf0e10cSrcweir         if (
1121cdf0e10cSrcweir             (nSearchFlags &  css::frame::FrameSearchFlag::SELF)  &&
1122cdf0e10cSrcweir             (sOwnName     == sTargetFrameName                 )
1123cdf0e10cSrcweir            )
1124cdf0e10cSrcweir         {
1125cdf0e10cSrcweir             xTarget = this;
1126cdf0e10cSrcweir         }
1127cdf0e10cSrcweir 
1128cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1129cdf0e10cSrcweir         // II.II) TASKS
1130cdf0e10cSrcweir         //  This is a special flag. Normaly it regulate search inside tasks and forbid access to parent trees.
1131cdf0e10cSrcweir         //  But the desktop exists outside such task trees. They are our sub trees. So the desktop implement
1132cdf0e10cSrcweir         //  a special feature: We use it to start search on our direct childrens only. That means we supress
1133cdf0e10cSrcweir         //  search on ALL child frames. May that can be usefull to get access on opened document tasks
1134cdf0e10cSrcweir         //  only without filter out all non realy required sub frames ...
1135cdf0e10cSrcweir         //  Used helper method on our container doesn't create any frame - its a search only.
1136cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1137cdf0e10cSrcweir         if (
1138cdf0e10cSrcweir             ( ! xTarget.is()                                  ) &&
1139cdf0e10cSrcweir             (nSearchFlags & css::frame::FrameSearchFlag::TASKS)
1140cdf0e10cSrcweir            )
1141cdf0e10cSrcweir         {
1142cdf0e10cSrcweir             xTarget = m_aChildTaskContainer.searchOnDirectChildrens(sTargetFrameName);
1143cdf0e10cSrcweir         }
1144cdf0e10cSrcweir 
1145cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1146cdf0e10cSrcweir         // II.III) CHILDREN
1147cdf0e10cSrcweir         //  Search on all children for the given target name.
1148cdf0e10cSrcweir         //  An empty name value can't occure here - because it must be already handled as "_self"
1149cdf0e10cSrcweir         //  before. Used helper function of container doesn't create any frame.
1150cdf0e10cSrcweir         //  It makes a deep search only.
1151cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1152cdf0e10cSrcweir         if (
1153cdf0e10cSrcweir             ( ! xTarget.is()                                     ) &&
1154cdf0e10cSrcweir             (nSearchFlags & css::frame::FrameSearchFlag::CHILDREN)
1155cdf0e10cSrcweir            )
1156cdf0e10cSrcweir         {
1157cdf0e10cSrcweir             xTarget = m_aChildTaskContainer.searchOnAllChildrens(sTargetFrameName);
1158cdf0e10cSrcweir         }
1159cdf0e10cSrcweir 
1160cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1161cdf0e10cSrcweir         // II.IV) CREATE
1162cdf0e10cSrcweir         //  If we haven't found any valid target frame by using normal flags - but user allowed us to create
1163cdf0e10cSrcweir         //  a new one ... we should do that. Used TaskCreator use us automaticly as parent!
1164cdf0e10cSrcweir         //-------------------------------------------------------------------------------------------------
1165cdf0e10cSrcweir         if (
1166cdf0e10cSrcweir             ( ! xTarget.is()                                   )    &&
1167cdf0e10cSrcweir             (nSearchFlags & css::frame::FrameSearchFlag::CREATE)
1168cdf0e10cSrcweir            )
1169cdf0e10cSrcweir         {
1170cdf0e10cSrcweir             TaskCreator aCreator(xFactory);
1171cdf0e10cSrcweir             xTarget = aCreator.createTask(sTargetFrameName,sal_False);
1172cdf0e10cSrcweir         }
1173cdf0e10cSrcweir     }
1174cdf0e10cSrcweir 
1175cdf0e10cSrcweir     return xTarget;
1176cdf0e10cSrcweir }
1177cdf0e10cSrcweir 
1178cdf0e10cSrcweir //=============================================================================
dispose()1179cdf0e10cSrcweir void SAL_CALL Desktop::dispose()
1180cdf0e10cSrcweir     throw( css::uno::RuntimeException )
1181cdf0e10cSrcweir {
1182cdf0e10cSrcweir 	// Safe impossible cases
1183cdf0e10cSrcweir 	// It's an programming error if dispose is called before terminate!
1184cdf0e10cSrcweir     LOG_ASSERT2( m_bIsTerminated==sal_False, "Desktop::dispose()", "It's not allowed to dispose the desktop before terminate() is called!" )
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir     SYNCHRONIZED_START
1187cdf0e10cSrcweir         WriteGuard aWriteLock( m_aLock );
1188cdf0e10cSrcweir 
1189cdf0e10cSrcweir         // Look for multiple calls of this method!
1190cdf0e10cSrcweir         // If somewhere call dispose() twice - he will be stopped here realy!!!
1191cdf0e10cSrcweir         TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1192cdf0e10cSrcweir 
1193cdf0e10cSrcweir         // Now - we are alone and its the first call of this method ...
1194cdf0e10cSrcweir         // otherwise call before had thrown a DisposedException / hopefully .-)
1195cdf0e10cSrcweir         // But we dont use the transaction object created before ... we reset it immediatly ...
1196cdf0e10cSrcweir         // two lines of code ... for what ?
1197cdf0e10cSrcweir         // The answer: We wished to synchronize concurrent dispose() calls -> OK
1198cdf0e10cSrcweir         // But next line will wait for all currently running transaction (even if they
1199cdf0e10cSrcweir         // are running within the same thread!) So we would block ourself there if aTransaction
1200cdf0e10cSrcweir         // will stay registered .-)
1201cdf0e10cSrcweir         aTransaction.stop();
1202cdf0e10cSrcweir 
1203cdf0e10cSrcweir         // Disable this instance for further work.
1204cdf0e10cSrcweir         // This will wait for all current running transactions ...
1205cdf0e10cSrcweir         // and reject all new incoming requests!
1206cdf0e10cSrcweir         m_aTransactionManager.setWorkingMode( E_BEFORECLOSE );
1207cdf0e10cSrcweir 
1208cdf0e10cSrcweir         aWriteLock.unlock();
1209cdf0e10cSrcweir     SYNCHRONIZED_END
1210cdf0e10cSrcweir 
1211cdf0e10cSrcweir     // Following lines of code can be called outside a synchronized block ...
1212cdf0e10cSrcweir     // Because our transaction manager will block all new requests to this object.
1213cdf0e10cSrcweir     // So nobody can use us any longer.
1214cdf0e10cSrcweir     // Exception: Only removing of listener will work ... and this code cant be dangerous.
1215cdf0e10cSrcweir 
1216cdf0e10cSrcweir     // First we has to kill all listener connections.
1217cdf0e10cSrcweir     // They might rely on our member and can hinder us on releasing them.
1218cdf0e10cSrcweir     css::uno::Reference< css::uno::XInterface > xThis ( static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY );
1219cdf0e10cSrcweir     css::lang::EventObject                      aEvent( xThis );
1220cdf0e10cSrcweir     m_aListenerContainer.disposeAndClear( aEvent );
1221cdf0e10cSrcweir 
1222cdf0e10cSrcweir     // Clear our child task container and forget all task references hardly.
1223cdf0e10cSrcweir     // Normaly all open document was already closed by our terminate() function before ...
1224cdf0e10cSrcweir     // New opened frames will have a problem now .-)
1225cdf0e10cSrcweir     m_aChildTaskContainer.clear();
1226cdf0e10cSrcweir 
1227cdf0e10cSrcweir     // Dispose our helper too.
1228cdf0e10cSrcweir     css::uno::Reference< css::lang::XEventListener > xFramesHelper( m_xFramesHelper, css::uno::UNO_QUERY );
1229cdf0e10cSrcweir     if( xFramesHelper.is() )
1230cdf0e10cSrcweir         xFramesHelper->disposing( aEvent );
1231cdf0e10cSrcweir 
1232cdf0e10cSrcweir     // At least clean up other member references.
1233cdf0e10cSrcweir     m_xDispatchHelper.clear();
1234cdf0e10cSrcweir     m_xFramesHelper.clear();
1235cdf0e10cSrcweir     m_xLastFrame.clear();
1236cdf0e10cSrcweir     m_xFactory.clear();
1237cdf0e10cSrcweir 
1238cdf0e10cSrcweir     m_xPipeTerminator.clear();
1239cdf0e10cSrcweir     m_xQuickLauncher.clear();
1240cdf0e10cSrcweir     m_xSWThreadManager.clear();
1241cdf0e10cSrcweir     m_xSfxTerminator.clear();
1242cdf0e10cSrcweir 
1243cdf0e10cSrcweir     // From this point nothing will work further on this object ...
1244cdf0e10cSrcweir     // excepting our dtor() .-)
1245cdf0e10cSrcweir     m_aTransactionManager.setWorkingMode( E_CLOSE );
1246cdf0e10cSrcweir }
1247cdf0e10cSrcweir 
1248cdf0e10cSrcweir /*-************************************************************************************************************//**
1249cdf0e10cSrcweir     @interface  XComponent
1250cdf0e10cSrcweir     @short      add/remove listener for dispose events
1251cdf0e10cSrcweir     @descr      Add an event listener to this object, if you whish to get informations
1252cdf0e10cSrcweir                 about our dieing!
1253cdf0e10cSrcweir                 You must releas ethis listener reference during your own disposing() method.
1254cdf0e10cSrcweir 
1255cdf0e10cSrcweir     @attention  Our container is threadsafe himeslf. So we doesn't need any lock here.
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir     @seealso    -
1258cdf0e10cSrcweir 
1259cdf0e10cSrcweir     @param      "xListener", reference to valid listener. We don't accept invalid values!
1260cdf0e10cSrcweir     @return     -
1261cdf0e10cSrcweir 
1262cdf0e10cSrcweir     @onerror    -
1263cdf0e10cSrcweir     @threadsafe yes
1264cdf0e10cSrcweir *//*-*************************************************************************************************************/
addEventListener(const css::uno::Reference<css::lang::XEventListener> & xListener)1265cdf0e10cSrcweir void SAL_CALL Desktop::addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) throw( css::uno::RuntimeException )
1266cdf0e10cSrcweir {
1267cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1268cdf0e10cSrcweir 	// Safe impossible cases
1269cdf0e10cSrcweir 	// Method not defined for all incoming parameter.
1270cdf0e10cSrcweir     LOG_ASSERT2( implcp_addEventListener( xListener ), "Desktop::addEventListener()", "Invalid parameter detected!" )
1271cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1272cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1273cdf0e10cSrcweir 
1274cdf0e10cSrcweir     m_aListenerContainer.addInterface( ::getCppuType( ( const css::uno::Reference< css::lang::XEventListener >*) NULL ), xListener );
1275cdf0e10cSrcweir }
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir //*****************************************************************************************************************
removeEventListener(const css::uno::Reference<css::lang::XEventListener> & xListener)1278cdf0e10cSrcweir void SAL_CALL Desktop::removeEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) throw( css::uno::RuntimeException )
1279cdf0e10cSrcweir {
1280cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1281cdf0e10cSrcweir 	// Safe impossible cases
1282cdf0e10cSrcweir 	// Method not defined for all incoming parameter.
1283cdf0e10cSrcweir     LOG_ASSERT2( implcp_removeEventListener( xListener ), "Desktop::removeEventListener()", "Invalid parameter detected!" )
1284cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1285cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_SOFTEXCEPTIONS );
1286cdf0e10cSrcweir 
1287cdf0e10cSrcweir     m_aListenerContainer.removeInterface( ::getCppuType( ( const css::uno::Reference< css::lang::XEventListener >*) NULL ), xListener );
1288cdf0e10cSrcweir }
1289cdf0e10cSrcweir 
1290cdf0e10cSrcweir /*-************************************************************************************************************//**
1291cdf0e10cSrcweir     @interface  XDispatchResultListener
1292cdf0e10cSrcweir     @short      callback for dispatches
1293cdf0e10cSrcweir     @descr      To support our method "loadComponentFromURL()" we are listener on temp. created dispatcher.
1294cdf0e10cSrcweir                 They call us back in this method "statusChanged()". As source of given state event, they give us a
1295cdf0e10cSrcweir                 reference to the target frame, in which dispatch was loaded! So we can use it to return his component
1296cdf0e10cSrcweir                 to caller! If no target exist ... ??!!
1297cdf0e10cSrcweir 
1298cdf0e10cSrcweir     @seealso    method loadComponentFromURL()
1299cdf0e10cSrcweir 
1300cdf0e10cSrcweir     @param      "aEvent", state event which (hopefully) valid informations
1301cdf0e10cSrcweir     @return     -
1302cdf0e10cSrcweir 
1303cdf0e10cSrcweir     @onerror    -
1304cdf0e10cSrcweir     @threadsafe yes
1305cdf0e10cSrcweir *//*-*************************************************************************************************************/
dispatchFinished(const css::frame::DispatchResultEvent & aEvent)1306cdf0e10cSrcweir void SAL_CALL Desktop::dispatchFinished( const css::frame::DispatchResultEvent& aEvent ) throw( css::uno::RuntimeException )
1307cdf0e10cSrcweir {
1308cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1309cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1310cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1311cdf0e10cSrcweir 
1312cdf0e10cSrcweir     /* SAFE AREA ------------------------------------------------------------------------------------------- */
1313cdf0e10cSrcweir     WriteGuard aWriteLock( m_aLock );
1314cdf0e10cSrcweir     if( m_eLoadState != E_INTERACTION )
1315cdf0e10cSrcweir     {
1316cdf0e10cSrcweir         m_xLastFrame = css::uno::Reference< css::frame::XFrame >();
1317cdf0e10cSrcweir         m_eLoadState = E_FAILED                                   ;
1318cdf0e10cSrcweir         if( aEvent.State == css::frame::DispatchResultState::SUCCESS )
1319cdf0e10cSrcweir         {
1320cdf0e10cSrcweir             css::uno::Reference < css::frame::XFrame > xFrame;
1321cdf0e10cSrcweir             if ( aEvent.Result >>= m_xLastFrame )
1322cdf0e10cSrcweir                 m_eLoadState = E_SUCCESSFUL;
1323cdf0e10cSrcweir         }
1324cdf0e10cSrcweir     }
1325cdf0e10cSrcweir     /* UNSAFE AREA ----------------------------------------------------------------------------------------- */
1326cdf0e10cSrcweir }
1327cdf0e10cSrcweir 
1328cdf0e10cSrcweir /*-************************************************************************************************************//**
1329cdf0e10cSrcweir     @interface  XEventListener
1330cdf0e10cSrcweir     @short      not implemented!
1331cdf0e10cSrcweir     @descr      We are a status listener ... and so we must be an event listener too ... But we doesn't need it realy!
1332cdf0e10cSrcweir                 We are a temp. listener only and our lifetime isn't smaller then of our temp. used dispatcher.
1333cdf0e10cSrcweir 
1334cdf0e10cSrcweir     @seealso    method loadComponentFromURL()
1335cdf0e10cSrcweir 
1336cdf0e10cSrcweir     @param      -
1337cdf0e10cSrcweir     @return     -
1338cdf0e10cSrcweir 
1339cdf0e10cSrcweir     @onerror    -
1340cdf0e10cSrcweir     @threadsafe -
1341cdf0e10cSrcweir *//*-*************************************************************************************************************/
disposing(const css::lang::EventObject &)1342cdf0e10cSrcweir void SAL_CALL Desktop::disposing( const css::lang::EventObject& ) throw( css::uno::RuntimeException )
1343cdf0e10cSrcweir {
1344cdf0e10cSrcweir     LOG_ERROR( "Desktop::disposing()", "Algorithm error! Normaly desktop is temp. listener ... not all the time. So this method shouldn't be called." )
1345cdf0e10cSrcweir }
1346cdf0e10cSrcweir 
1347cdf0e10cSrcweir /*-************************************************************************************************************//**
1348cdf0e10cSrcweir     @interface  XInteractionHandler
1349cdf0e10cSrcweir     @short      callback for loadComponentFromURL for detected exceptions during load proccess
1350cdf0e10cSrcweir     @descr      In this case we must cancel loading and throw these detected exception again as result
1351cdf0e10cSrcweir                 of our own called method.
1352cdf0e10cSrcweir 
1353cdf0e10cSrcweir     @attention  a)
1354cdf0e10cSrcweir                 Normal loop in loadComponentFromURL() breaks on setted member m_eLoadState during callback statusChanged().
1355cdf0e10cSrcweir                 But these interaction feature implements second way to do so! So we must look on different callbacks
1356cdf0e10cSrcweir                 for same operation ... and live with it.
1357cdf0e10cSrcweir                 b)
1358cdf0e10cSrcweir                 Search for given continuations too. If any XInteractionAbort exist ... use it to abort further operations
1359cdf0e10cSrcweir                 for currently running operation!
1360cdf0e10cSrcweir 
1361cdf0e10cSrcweir     @seealso    method loadComponentFromURL()
1362cdf0e10cSrcweir     @seealso    member m_eLoadState
1363cdf0e10cSrcweir 
1364cdf0e10cSrcweir     @param      "xRequest", request for interaction - normal a wrapped target exception from bottom services
1365cdf0e10cSrcweir     @return     -
1366cdf0e10cSrcweir 
1367cdf0e10cSrcweir     @onerror    -
1368cdf0e10cSrcweir     @threadsafe yes
1369cdf0e10cSrcweir *//*-*************************************************************************************************************/
handle(const css::uno::Reference<css::task::XInteractionRequest> & xRequest)1370cdf0e10cSrcweir void SAL_CALL Desktop::handle( const css::uno::Reference< css::task::XInteractionRequest >& xRequest ) throw( css::uno::RuntimeException )
1371cdf0e10cSrcweir {
1372cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1373cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1374cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1375cdf0e10cSrcweir 
1376cdf0e10cSrcweir     // Don't check incoming request!
1377cdf0e10cSrcweir     // If somewhere starts interaction without right parameter - he maked something wrong.
1378cdf0e10cSrcweir     // loadComponentFromURL() waits for thjese event - otherwise it yield for ever!
1379cdf0e10cSrcweir 
1380cdf0e10cSrcweir     // get packed request and work on it first
1381cdf0e10cSrcweir     // Attention: Don't set it on internal member BEFORE interaction is finished - because
1382cdf0e10cSrcweir     // "loadComponentFromURL()" yield tills this member is changed. If we do it before
1383cdf0e10cSrcweir     // interaction finish we can't guarantee right functionality. May be we cancel load process to erliear ...
1384cdf0e10cSrcweir     css::uno::Any aRequest = xRequest->getRequest();
1385cdf0e10cSrcweir 
1386cdf0e10cSrcweir     // extract continuations from request
1387cdf0e10cSrcweir     css::uno::Sequence< css::uno::Reference< css::task::XInteractionContinuation > > lContinuations = xRequest->getContinuations();
1388cdf0e10cSrcweir     css::uno::Reference< css::task::XInteractionAbort >                              xAbort         ;
1389cdf0e10cSrcweir     css::uno::Reference< css::task::XInteractionApprove >                            xApprove       ;
1390cdf0e10cSrcweir     css::uno::Reference< css::document::XInteractionFilterSelect >                   xFilterSelect  ;
1391cdf0e10cSrcweir     sal_Bool                                                                         bAbort         = sal_False;
1392cdf0e10cSrcweir 
1393cdf0e10cSrcweir     sal_Int32 nCount=lContinuations.getLength();
1394cdf0e10cSrcweir     for( sal_Int32 nStep=0; nStep<nCount; ++nStep )
1395cdf0e10cSrcweir     {
1396cdf0e10cSrcweir         if( ! xAbort.is() )
1397cdf0e10cSrcweir             xAbort  = css::uno::Reference< css::task::XInteractionAbort >( lContinuations[nStep], css::uno::UNO_QUERY );
1398cdf0e10cSrcweir 
1399cdf0e10cSrcweir         if( ! xApprove.is() )
1400cdf0e10cSrcweir             xApprove  = css::uno::Reference< css::task::XInteractionApprove >( lContinuations[nStep], css::uno::UNO_QUERY );
1401cdf0e10cSrcweir 
1402cdf0e10cSrcweir         if( ! xFilterSelect.is() )
1403cdf0e10cSrcweir             xFilterSelect = css::uno::Reference< css::document::XInteractionFilterSelect >( lContinuations[nStep], css::uno::UNO_QUERY );
1404cdf0e10cSrcweir     }
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir     // differ between abortable interactions (error, unknown filter ...)
1407cdf0e10cSrcweir     // and other ones (ambigous but not unknown filter ...)
1408cdf0e10cSrcweir     css::task::ErrorCodeRequest          aErrorCodeRequest     ;
1409cdf0e10cSrcweir     css::document::AmbigousFilterRequest aAmbigousFilterRequest;
1410cdf0e10cSrcweir     if( aRequest >>= aAmbigousFilterRequest )
1411cdf0e10cSrcweir     {
1412cdf0e10cSrcweir         if( xFilterSelect.is() )
1413cdf0e10cSrcweir         {
1414cdf0e10cSrcweir             xFilterSelect->setFilter( aAmbigousFilterRequest.SelectedFilter ); // user selected filter wins!
1415cdf0e10cSrcweir             xFilterSelect->select();
1416cdf0e10cSrcweir         }
1417cdf0e10cSrcweir     }
1418cdf0e10cSrcweir     else
1419cdf0e10cSrcweir     if( aRequest >>= aErrorCodeRequest )
1420cdf0e10cSrcweir     {
1421cdf0e10cSrcweir         sal_Bool bWarning = ((aErrorCodeRequest.ErrCode & ERRCODE_WARNING_MASK) == ERRCODE_WARNING_MASK);
1422cdf0e10cSrcweir         if (xApprove.is() && bWarning)
1423cdf0e10cSrcweir             xApprove->select();
1424cdf0e10cSrcweir         else
1425cdf0e10cSrcweir         if (xAbort.is())
1426cdf0e10cSrcweir         {
1427cdf0e10cSrcweir             xAbort->select();
1428cdf0e10cSrcweir             bAbort = sal_True;
1429cdf0e10cSrcweir         }
1430cdf0e10cSrcweir     }
1431cdf0e10cSrcweir     else
1432cdf0e10cSrcweir     if( xAbort.is() )
1433cdf0e10cSrcweir     {
1434cdf0e10cSrcweir         xAbort->select();
1435cdf0e10cSrcweir         bAbort = sal_True;
1436cdf0e10cSrcweir     }
1437cdf0e10cSrcweir 
1438cdf0e10cSrcweir     /* SAFE AREA ------------------------------------------------------------------------------------------- */
1439cdf0e10cSrcweir     // Ok now it's time to break yield loop of loadComponentFromURL().
1440cdf0e10cSrcweir     // But only for realy aborted requests!
1441cdf0e10cSrcweir     // For example warnings will be approved and we wait for any success story ...
1442cdf0e10cSrcweir     if (bAbort)
1443cdf0e10cSrcweir     {
1444cdf0e10cSrcweir         WriteGuard aWriteLock( m_aLock );
1445cdf0e10cSrcweir         m_eLoadState          = E_INTERACTION;
1446cdf0e10cSrcweir         m_aInteractionRequest = aRequest     ;
1447cdf0e10cSrcweir         aWriteLock.unlock();
1448cdf0e10cSrcweir     }
1449cdf0e10cSrcweir     /* UNSAFE AREA ----------------------------------------------------------------------------------------- */
1450cdf0e10cSrcweir }
1451cdf0e10cSrcweir 
1452cdf0e10cSrcweir //-----------------------------------------------------------------------------
leaseNumber(const css::uno::Reference<css::uno::XInterface> & xComponent)1453cdf0e10cSrcweir ::sal_Int32 SAL_CALL Desktop::leaseNumber( const css::uno::Reference< css::uno::XInterface >& xComponent )
1454cdf0e10cSrcweir     throw (css::lang::IllegalArgumentException,
1455cdf0e10cSrcweir            css::uno::RuntimeException         )
1456cdf0e10cSrcweir {
1457cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1458cdf0e10cSrcweir     return m_xTitleNumberGenerator->leaseNumber (xComponent);
1459cdf0e10cSrcweir }
1460cdf0e10cSrcweir 
1461cdf0e10cSrcweir //-----------------------------------------------------------------------------
releaseNumber(::sal_Int32 nNumber)1462cdf0e10cSrcweir void SAL_CALL Desktop::releaseNumber( ::sal_Int32 nNumber )
1463cdf0e10cSrcweir     throw (css::lang::IllegalArgumentException,
1464cdf0e10cSrcweir            css::uno::RuntimeException         )
1465cdf0e10cSrcweir {
1466cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1467cdf0e10cSrcweir     m_xTitleNumberGenerator->releaseNumber (nNumber);
1468cdf0e10cSrcweir }
1469cdf0e10cSrcweir 
1470cdf0e10cSrcweir //-----------------------------------------------------------------------------
releaseNumberForComponent(const css::uno::Reference<css::uno::XInterface> & xComponent)1471cdf0e10cSrcweir void SAL_CALL Desktop::releaseNumberForComponent( const css::uno::Reference< css::uno::XInterface >& xComponent )
1472cdf0e10cSrcweir     throw (css::lang::IllegalArgumentException,
1473cdf0e10cSrcweir            css::uno::RuntimeException         )
1474cdf0e10cSrcweir {
1475cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1476cdf0e10cSrcweir     m_xTitleNumberGenerator->releaseNumberForComponent (xComponent);
1477cdf0e10cSrcweir }
1478cdf0e10cSrcweir 
1479cdf0e10cSrcweir //-----------------------------------------------------------------------------
getUntitledPrefix()1480cdf0e10cSrcweir ::rtl::OUString SAL_CALL Desktop::getUntitledPrefix()
1481cdf0e10cSrcweir     throw (css::uno::RuntimeException)
1482cdf0e10cSrcweir {
1483cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1484cdf0e10cSrcweir     return m_xTitleNumberGenerator->getUntitledPrefix ();
1485cdf0e10cSrcweir }
1486cdf0e10cSrcweir 
1487cdf0e10cSrcweir /*-************************************************************************************************************//**
1488cdf0e10cSrcweir     @short      try to convert a property value
1489cdf0e10cSrcweir     @descr      This method is called from helperclass "OPropertySetHelper".
1490cdf0e10cSrcweir                 Don't use this directly!
1491cdf0e10cSrcweir                 You must try to convert the value of given DESKTOP_PROPHANDLE and
1492cdf0e10cSrcweir                 return results of this operation. This will be used to ask vetoable
1493cdf0e10cSrcweir                 listener. If no listener has a veto, we will change value realy!
1494cdf0e10cSrcweir                 ( in method setFastPropertyValue_NoBroadcast(...) )
1495cdf0e10cSrcweir 
1496cdf0e10cSrcweir     @attention  Methods of OPropertySethelper are safed by using our shared osl mutex! (see ctor!)
1497cdf0e10cSrcweir                 So we must use different locks to make our implementation threadsafe.
1498cdf0e10cSrcweir 
1499cdf0e10cSrcweir     @seealso    class OPropertySetHelper
1500cdf0e10cSrcweir     @seealso    method setFastPropertyValue_NoBroadcast()
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir     @param      "aConvertedValue"   new converted value of property
1503cdf0e10cSrcweir     @param      "aOldValue"         old value of property
1504cdf0e10cSrcweir     @param      "nHandle"           handle of property
1505cdf0e10cSrcweir     @param      "aValue"            new value of property
1506cdf0e10cSrcweir     @return     sal_True if value will be changed, sal_FALSE otherway
1507cdf0e10cSrcweir 
1508cdf0e10cSrcweir     @onerror    IllegalArgumentException, if you call this with an invalid argument
1509cdf0e10cSrcweir     @threadsafe yes
1510cdf0e10cSrcweir *//*-*************************************************************************************************************/
convertFastPropertyValue(css::uno::Any & aConvertedValue,css::uno::Any & aOldValue,sal_Int32 nHandle,const css::uno::Any & aValue)1511cdf0e10cSrcweir sal_Bool SAL_CALL Desktop::convertFastPropertyValue(       css::uno::Any&   aConvertedValue ,
1512cdf0e10cSrcweir                                                            css::uno::Any&   aOldValue       ,
1513cdf0e10cSrcweir                                                            sal_Int32        nHandle         ,
1514cdf0e10cSrcweir                                                      const css::uno::Any&   aValue          ) throw( css::lang::IllegalArgumentException )
1515cdf0e10cSrcweir {
1516cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1517cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1518cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1519cdf0e10cSrcweir 
1520cdf0e10cSrcweir 	//	Initialize state with sal_False !!!
1521cdf0e10cSrcweir 	//	(Handle can be invalid)
1522cdf0e10cSrcweir 	sal_Bool bReturn = sal_False;
1523cdf0e10cSrcweir 
1524cdf0e10cSrcweir     switch( nHandle )
1525cdf0e10cSrcweir 	{
1526cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_SUSPENDQUICKSTARTVETO:
1527cdf0e10cSrcweir                 bReturn = PropHelper::willPropertyBeChanged(
1528cdf0e10cSrcweir                     css::uno::makeAny(m_bSuspendQuickstartVeto),
1529cdf0e10cSrcweir                     aValue,
1530cdf0e10cSrcweir                     aOldValue,
1531cdf0e10cSrcweir                     aConvertedValue);
1532cdf0e10cSrcweir                 break;
1533cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_DISPATCHRECORDERSUPPLIER :
1534cdf0e10cSrcweir                 bReturn = PropHelper::willPropertyBeChanged(
1535cdf0e10cSrcweir                     css::uno::makeAny(m_xDispatchRecorderSupplier),
1536cdf0e10cSrcweir                     aValue,
1537cdf0e10cSrcweir                     aOldValue,
1538cdf0e10cSrcweir                     aConvertedValue);
1539cdf0e10cSrcweir                 break;
1540cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_TITLE :
1541cdf0e10cSrcweir                 bReturn = PropHelper::willPropertyBeChanged(
1542cdf0e10cSrcweir                     css::uno::makeAny(m_sTitle),
1543cdf0e10cSrcweir                     aValue,
1544cdf0e10cSrcweir                     aOldValue,
1545cdf0e10cSrcweir                     aConvertedValue);
1546cdf0e10cSrcweir                 break;
1547cdf0e10cSrcweir 	}
1548cdf0e10cSrcweir 
1549cdf0e10cSrcweir 	// Return state of operation.
1550cdf0e10cSrcweir 	return bReturn ;
1551cdf0e10cSrcweir }
1552cdf0e10cSrcweir 
1553cdf0e10cSrcweir /*-************************************************************************************************************//**
1554cdf0e10cSrcweir     @short      set value of a transient property
1555cdf0e10cSrcweir     @descr      This method is calling from helperclass "OPropertySetHelper".
1556cdf0e10cSrcweir                 Don't use this directly!
1557cdf0e10cSrcweir                 Handle and value are valid everyway! You must set the new value only.
1558cdf0e10cSrcweir                 After this, baseclass send messages to all listener automaticly.
1559cdf0e10cSrcweir 
1560cdf0e10cSrcweir     @seealso    class OPropertySetHelper
1561cdf0e10cSrcweir 
1562cdf0e10cSrcweir     @param      "nHandle"   handle of property to change
1563cdf0e10cSrcweir     @param      "aValue"    new value of property
1564cdf0e10cSrcweir     @return     -
1565cdf0e10cSrcweir 
1566cdf0e10cSrcweir     @onerror    An exception is thrown.
1567cdf0e10cSrcweir     @threadsafe yes
1568cdf0e10cSrcweir *//*-*************************************************************************************************************/
setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const css::uno::Any & aValue)1569cdf0e10cSrcweir void SAL_CALL Desktop::setFastPropertyValue_NoBroadcast(       sal_Int32        nHandle ,
1570cdf0e10cSrcweir                                                          const css::uno::Any&   aValue  ) throw( css::uno::Exception )
1571cdf0e10cSrcweir {
1572cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1573cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1574cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1575cdf0e10cSrcweir 
1576cdf0e10cSrcweir     switch( nHandle )
1577cdf0e10cSrcweir 	{
1578cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_SUSPENDQUICKSTARTVETO:    aValue >>= m_bSuspendQuickstartVeto;
1579cdf0e10cSrcweir 													break;
1580cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_DISPATCHRECORDERSUPPLIER:    aValue >>= m_xDispatchRecorderSupplier;
1581cdf0e10cSrcweir                                                     break;
1582cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_TITLE:    aValue >>= m_sTitle;
1583cdf0e10cSrcweir                                                     break;
1584cdf0e10cSrcweir 	}
1585cdf0e10cSrcweir }
1586cdf0e10cSrcweir 
1587cdf0e10cSrcweir /*-************************************************************************************************************//**
1588cdf0e10cSrcweir     @short      get value of a transient property
1589cdf0e10cSrcweir     @descr      This method is calling from helperclass "OPropertySetHelper".
1590cdf0e10cSrcweir                 Don't use this directly!
1591cdf0e10cSrcweir 
1592cdf0e10cSrcweir     @attention  We don't need any mutex or lock here ... We use threadsafe container or methods here only!
1593cdf0e10cSrcweir 
1594cdf0e10cSrcweir     @seealso    class OPropertySetHelper
1595cdf0e10cSrcweir 
1596cdf0e10cSrcweir     @param      "nHandle"   handle of property to change
1597cdf0e10cSrcweir     @param      "aValue"    current value of property
1598cdf0e10cSrcweir     @return     -
1599cdf0e10cSrcweir 
1600cdf0e10cSrcweir     @onerror    -
1601cdf0e10cSrcweir     @threadsafe yes
1602cdf0e10cSrcweir *//*-*************************************************************************************************************/
getFastPropertyValue(css::uno::Any & aValue,sal_Int32 nHandle) const1603cdf0e10cSrcweir void SAL_CALL Desktop::getFastPropertyValue( css::uno::Any& aValue  ,
1604cdf0e10cSrcweir                                              sal_Int32      nHandle ) const
1605cdf0e10cSrcweir {
1606cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1607cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1608cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1609cdf0e10cSrcweir 
1610cdf0e10cSrcweir     switch( nHandle )
1611cdf0e10cSrcweir 	{
1612cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_ACTIVEFRAME           :   aValue <<= m_aChildTaskContainer.getActive();
1613cdf0e10cSrcweir 													break;
1614cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_ISPLUGGED           :   aValue <<= sal_False;
1615cdf0e10cSrcweir 													break;
1616cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_SUSPENDQUICKSTARTVETO:    aValue <<= m_bSuspendQuickstartVeto;
1617cdf0e10cSrcweir 													break;
1618cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_DISPATCHRECORDERSUPPLIER:    aValue <<= m_xDispatchRecorderSupplier;
1619cdf0e10cSrcweir                                                     break;
1620cdf0e10cSrcweir         case DESKTOP_PROPHANDLE_TITLE:    aValue <<= m_sTitle;
1621cdf0e10cSrcweir                                                     break;
1622cdf0e10cSrcweir 	}
1623cdf0e10cSrcweir }
1624cdf0e10cSrcweir 
1625cdf0e10cSrcweir /*-************************************************************************************************************//**
1626cdf0e10cSrcweir     @short      return structure and information about transient properties
1627cdf0e10cSrcweir     @descr      This method is calling from helperclass "OPropertySetHelper".
1628cdf0e10cSrcweir                 Don't use this directly!
1629cdf0e10cSrcweir 
1630cdf0e10cSrcweir     @attention  You must use global lock (method use static variable) ... and it must be the shareable osl mutex of it.
1631cdf0e10cSrcweir                 Because; our baseclass use this mutex to make his code threadsafe. We use our lock!
1632cdf0e10cSrcweir                 So we could have two different mutex/lock mechanism at the same object.
1633cdf0e10cSrcweir 
1634cdf0e10cSrcweir     @seealso    class OPropertySetHelper
1635cdf0e10cSrcweir 
1636cdf0e10cSrcweir     @param      -
1637cdf0e10cSrcweir     @return     structure with property-informations
1638cdf0e10cSrcweir 
1639cdf0e10cSrcweir     @onerror    -
1640cdf0e10cSrcweir     @threadsafe yes
1641cdf0e10cSrcweir *//*-*************************************************************************************************************/
getInfoHelper()1642cdf0e10cSrcweir ::cppu::IPropertyArrayHelper& SAL_CALL Desktop::getInfoHelper()
1643cdf0e10cSrcweir {
1644cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1645cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1646cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1647cdf0e10cSrcweir 
1648cdf0e10cSrcweir 	// Optimize this method !
1649cdf0e10cSrcweir 	// We initialize a static variable only one time. And we don't must use a mutex at every call!
1650cdf0e10cSrcweir 	// For the first call; pInfoHelper is NULL - for the second call pInfoHelper is different from NULL!
1651cdf0e10cSrcweir     static ::cppu::OPropertyArrayHelper* pInfoHelper = NULL;
1652cdf0e10cSrcweir 
1653cdf0e10cSrcweir     if( pInfoHelper == NULL )
1654cdf0e10cSrcweir 	{
1655cdf0e10cSrcweir 		// Ready for multithreading
1656cdf0e10cSrcweir         ::osl::MutexGuard aGuard( LockHelper::getGlobalLock().getShareableOslMutex() );
1657cdf0e10cSrcweir 		// Control this pointer again, another instance can be faster then these!
1658cdf0e10cSrcweir         if( pInfoHelper == NULL )
1659cdf0e10cSrcweir 		{
1660cdf0e10cSrcweir 			// Define static member to give structure of properties to baseclass "OPropertySetHelper".
1661cdf0e10cSrcweir 			// "impl_getStaticPropertyDescriptor" is a non exported and static funtion, who will define a static propertytable.
1662cdf0e10cSrcweir 			// "sal_True" say: Table is sorted by name.
1663cdf0e10cSrcweir             static ::cppu::OPropertyArrayHelper aInfoHelper( impl_getStaticPropertyDescriptor(), sal_True );
1664cdf0e10cSrcweir 			pInfoHelper = &aInfoHelper;
1665cdf0e10cSrcweir 		}
1666cdf0e10cSrcweir 	}
1667cdf0e10cSrcweir 
1668cdf0e10cSrcweir     return(*pInfoHelper);
1669cdf0e10cSrcweir }
1670cdf0e10cSrcweir 
1671cdf0e10cSrcweir /*-************************************************************************************************************//**
1672cdf0e10cSrcweir     @short      return propertysetinfo
1673cdf0e10cSrcweir     @descr      You can call this method to get information about transient properties
1674cdf0e10cSrcweir                 of this object.
1675cdf0e10cSrcweir 
1676cdf0e10cSrcweir     @attention  You must use global lock (method use static variable) ... and it must be the shareable osl mutex of it.
1677cdf0e10cSrcweir                 Because; our baseclass use this mutex to make his code threadsafe. We use our lock!
1678cdf0e10cSrcweir                 So we could have two different mutex/lock mechanism at the same object.
1679cdf0e10cSrcweir 
1680cdf0e10cSrcweir     @seealso    class OPropertySetHelper
1681cdf0e10cSrcweir     @seealso    interface XPropertySet
1682cdf0e10cSrcweir     @seealso    interface XMultiPropertySet
1683cdf0e10cSrcweir 
1684cdf0e10cSrcweir     @param      -
1685cdf0e10cSrcweir     @return     reference to object with information [XPropertySetInfo]
1686cdf0e10cSrcweir 
1687cdf0e10cSrcweir     @onerror    -
1688cdf0e10cSrcweir     @threadsafe yes
1689cdf0e10cSrcweir *//*-*************************************************************************************************************/
getPropertySetInfo()1690cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL Desktop::getPropertySetInfo() throw (::com::sun::star::uno::RuntimeException)
1691cdf0e10cSrcweir {
1692cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1693cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1694cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1695cdf0e10cSrcweir 
1696cdf0e10cSrcweir 	// Optimize this method !
1697cdf0e10cSrcweir 	// We initialize a static variable only one time. And we don't must use a mutex at every call!
1698cdf0e10cSrcweir 	// For the first call; pInfo is NULL - for the second call pInfo is different from NULL!
1699cdf0e10cSrcweir     static css::uno::Reference< css::beans::XPropertySetInfo >* pInfo = NULL;
1700cdf0e10cSrcweir 
1701cdf0e10cSrcweir     if( pInfo == NULL )
1702cdf0e10cSrcweir 	{
1703cdf0e10cSrcweir 		// Ready for multithreading
1704cdf0e10cSrcweir         ::osl::MutexGuard aGuard( LockHelper::getGlobalLock().getShareableOslMutex() );
1705cdf0e10cSrcweir 		// Control this pointer again, another instance can be faster then these!
1706cdf0e10cSrcweir         if( pInfo == NULL )
1707cdf0e10cSrcweir 		{
1708cdf0e10cSrcweir 			// Create structure of propertysetinfo for baseclass "OPropertySetHelper".
1709cdf0e10cSrcweir 			// (Use method "getInfoHelper()".)
1710cdf0e10cSrcweir             static css::uno::Reference< css::beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
1711cdf0e10cSrcweir 			pInfo = &xInfo;
1712cdf0e10cSrcweir 		}
1713cdf0e10cSrcweir 	}
1714cdf0e10cSrcweir 
1715cdf0e10cSrcweir 	return (*pInfo);
1716cdf0e10cSrcweir }
1717cdf0e10cSrcweir 
1718cdf0e10cSrcweir /*-************************************************************************************************************//**
1719cdf0e10cSrcweir     @short      return current component of current frame
1720cdf0e10cSrcweir     @descr      The desktop himself has no component. But every frame in subtree.
1721cdf0e10cSrcweir                 If somewhere call getCurrentComponent() at this class, we try to find the right frame and
1722cdf0e10cSrcweir                 then we try to become his component. It can be a VCL-component, the model or the controller
1723cdf0e10cSrcweir                 of founded frame.
1724cdf0e10cSrcweir 
1725cdf0e10cSrcweir     @attention  We don't work on internal member ... so we doesn't need any lock here.
1726cdf0e10cSrcweir 
1727cdf0e10cSrcweir     @seealso    method getCurrentComponent();
1728cdf0e10cSrcweir 
1729cdf0e10cSrcweir     @param      "xFrame", reference to valid frame in hierarchy. Method is not defined for invalid values.
1730cdf0e10cSrcweir                 But we don't check these. Its an IMPL-method and caller must use it right!
1731cdf0e10cSrcweir     @return     A reference to found component.
1732cdf0e10cSrcweir 
1733cdf0e10cSrcweir     @onerror    A null reference is returned.
1734cdf0e10cSrcweir     @threadsafe yes
1735cdf0e10cSrcweir *//*-*************************************************************************************************************/
impl_getFrameComponent(const css::uno::Reference<css::frame::XFrame> & xFrame) const1736cdf0e10cSrcweir css::uno::Reference< css::lang::XComponent > Desktop::impl_getFrameComponent( const css::uno::Reference< css::frame::XFrame >& xFrame ) const
1737cdf0e10cSrcweir {
1738cdf0e10cSrcweir 	/* UNSAFE AREA --------------------------------------------------------------------------------------------- */
1739cdf0e10cSrcweir     // Register transaction and reject wrong calls.
1740cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1741cdf0e10cSrcweir 
1742cdf0e10cSrcweir 	// Set default return value, if method failed.
1743cdf0e10cSrcweir     css::uno::Reference< css::lang::XComponent > xComponent;
1744cdf0e10cSrcweir 	// Does no controller exists?
1745cdf0e10cSrcweir     css::uno::Reference< css::frame::XController > xController = xFrame->getController();
1746cdf0e10cSrcweir     if( xController.is() == sal_False )
1747cdf0e10cSrcweir 	{
1748cdf0e10cSrcweir 		// Controller not exist - use the VCL-component.
1749cdf0e10cSrcweir         xComponent = css::uno::Reference< css::lang::XComponent >( xFrame->getComponentWindow(), css::uno::UNO_QUERY );
1750cdf0e10cSrcweir 	}
1751cdf0e10cSrcweir 	else
1752cdf0e10cSrcweir 	{
1753cdf0e10cSrcweir 		// Does no model exists?
1754cdf0e10cSrcweir         css::uno::Reference< css::frame::XModel > xModel( xController->getModel(), css::uno::UNO_QUERY );
1755cdf0e10cSrcweir         if( xModel.is() == sal_True )
1756cdf0e10cSrcweir 		{
1757cdf0e10cSrcweir 			// Model exist - use the model as component.
1758cdf0e10cSrcweir             xComponent = css::uno::Reference< css::lang::XComponent >( xModel, css::uno::UNO_QUERY );
1759cdf0e10cSrcweir 		}
1760cdf0e10cSrcweir 		else
1761cdf0e10cSrcweir 		{
1762cdf0e10cSrcweir 			// Model not exist - use the controller as component.
1763cdf0e10cSrcweir             xComponent = css::uno::Reference< css::lang::XComponent >( xController, css::uno::UNO_QUERY );
1764cdf0e10cSrcweir 		}
1765cdf0e10cSrcweir 	}
1766cdf0e10cSrcweir 
1767cdf0e10cSrcweir 	return xComponent;
1768cdf0e10cSrcweir }
1769cdf0e10cSrcweir 
1770cdf0e10cSrcweir /*-************************************************************************************************************//**
1771cdf0e10cSrcweir     @short      create table with information about properties
1772cdf0e10cSrcweir     @descr      We use a helper class to support properties. These class need some information about this.
1773cdf0e10cSrcweir                 These method create a new static description table with name, type, r/w-flags and so on ...
1774cdf0e10cSrcweir 
1775cdf0e10cSrcweir     @seealso    class OPropertySetHelper
1776cdf0e10cSrcweir     @seealso    method getInfoHelper()
1777cdf0e10cSrcweir 
1778cdf0e10cSrcweir     @param      -
1779cdf0e10cSrcweir     @return     Static table with information about properties.
1780cdf0e10cSrcweir 
1781cdf0e10cSrcweir     @onerror    -
1782cdf0e10cSrcweir     @threadsafe yes
1783cdf0e10cSrcweir *//*-*************************************************************************************************************/
impl_getStaticPropertyDescriptor()1784cdf0e10cSrcweir const css::uno::Sequence< css::beans::Property > Desktop::impl_getStaticPropertyDescriptor()
1785cdf0e10cSrcweir {
1786cdf0e10cSrcweir 	// Create a new static property array to initialize sequence!
1787cdf0e10cSrcweir 	// Table of all predefined properties of this class. Its used from OPropertySetHelper-class!
1788cdf0e10cSrcweir 	// Don't forget to change the defines (see begin of this file), if you add, change or delete a property in this list!!!
1789cdf0e10cSrcweir 	// It's necessary for methods of OPropertySetHelper.
1790cdf0e10cSrcweir 	// ATTENTION:
1791cdf0e10cSrcweir     //      YOU MUST SORT FOLLOW TABLE BY NAME ALPHABETICAL !!!
1792cdf0e10cSrcweir 
1793cdf0e10cSrcweir     static const css::beans::Property pProperties[] =
1794cdf0e10cSrcweir 	{
1795cdf0e10cSrcweir         css::beans::Property( DESKTOP_PROPNAME_ACTIVEFRAME              , DESKTOP_PROPHANDLE_ACTIVEFRAME             , ::getCppuType((const css::uno::Reference< css::lang::XComponent >*)NULL)                , css::beans::PropertyAttribute::TRANSIENT | css::beans::PropertyAttribute::READONLY ),
1796cdf0e10cSrcweir         css::beans::Property( DESKTOP_PROPNAME_DISPATCHRECORDERSUPPLIER , DESKTOP_PROPHANDLE_DISPATCHRECORDERSUPPLIER, ::getCppuType((const css::uno::Reference< css::frame::XDispatchRecorderSupplier >*)NULL), css::beans::PropertyAttribute::TRANSIENT ),
1797cdf0e10cSrcweir         css::beans::Property( DESKTOP_PROPNAME_ISPLUGGED                , DESKTOP_PROPHANDLE_ISPLUGGED               , ::getBooleanCppuType()                                                                  , css::beans::PropertyAttribute::TRANSIENT | css::beans::PropertyAttribute::READONLY ),
1798cdf0e10cSrcweir         css::beans::Property( DESKTOP_PROPNAME_SUSPENDQUICKSTARTVETO    , DESKTOP_PROPHANDLE_SUSPENDQUICKSTARTVETO   , ::getBooleanCppuType()                                                                  , css::beans::PropertyAttribute::TRANSIENT ),
1799cdf0e10cSrcweir         css::beans::Property( DESKTOP_PROPNAME_TITLE                    , DESKTOP_PROPHANDLE_TITLE                   , ::getCppuType((const ::rtl::OUString*)NULL)                                             , css::beans::PropertyAttribute::TRANSIENT ),
1800cdf0e10cSrcweir 	};
1801cdf0e10cSrcweir 	// Use it to initialize sequence!
1802cdf0e10cSrcweir     static const css::uno::Sequence< css::beans::Property > lPropertyDescriptor( pProperties, DESKTOP_PROPCOUNT );
1803cdf0e10cSrcweir 	// Return static "PropertyDescriptor"
1804cdf0e10cSrcweir     return lPropertyDescriptor;
1805cdf0e10cSrcweir }
1806cdf0e10cSrcweir 
1807cdf0e10cSrcweir //=============================================================================
impl_sendQueryTerminationEvent(Desktop::TTerminateListenerList & lCalledListener,::sal_Bool & bVeto)1808cdf0e10cSrcweir void Desktop::impl_sendQueryTerminationEvent(Desktop::TTerminateListenerList& lCalledListener,
1809cdf0e10cSrcweir                                              ::sal_Bool&                      bVeto          )
1810cdf0e10cSrcweir {
1811cdf0e10cSrcweir     bVeto = sal_False;
1812cdf0e10cSrcweir 
1813cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1814cdf0e10cSrcweir 
1815cdf0e10cSrcweir     ::cppu::OInterfaceContainerHelper* pContainer = m_aListenerContainer.getContainer( ::getCppuType( ( const css::uno::Reference< css::frame::XTerminateListener >*) NULL ) );
1816cdf0e10cSrcweir 	if ( ! pContainer )
1817cdf0e10cSrcweir         return;
1818cdf0e10cSrcweir 
1819cdf0e10cSrcweir     css::lang::EventObject aEvent( static_cast< ::cppu::OWeakObject* >(this) );
1820cdf0e10cSrcweir 
1821cdf0e10cSrcweir     ::cppu::OInterfaceIteratorHelper aIterator( *pContainer );
1822cdf0e10cSrcweir     while ( aIterator.hasMoreElements() )
1823cdf0e10cSrcweir     {
1824cdf0e10cSrcweir         try
1825cdf0e10cSrcweir         {
1826cdf0e10cSrcweir             css::uno::Reference< css::frame::XTerminateListener > xListener(aIterator.next(), css::uno::UNO_QUERY);
1827cdf0e10cSrcweir             if ( ! xListener.is() )
1828cdf0e10cSrcweir                 continue;
1829cdf0e10cSrcweir             xListener->queryTermination( aEvent );
1830cdf0e10cSrcweir             lCalledListener.push_back(xListener);
1831cdf0e10cSrcweir         }
1832cdf0e10cSrcweir         catch( const css::frame::TerminationVetoException& )
1833cdf0e10cSrcweir         {
1834cdf0e10cSrcweir             // first veto will stop notification loop.
1835cdf0e10cSrcweir             bVeto = sal_True;
1836cdf0e10cSrcweir             return;
1837cdf0e10cSrcweir         }
1838cdf0e10cSrcweir         catch( const css::uno::Exception& )
1839cdf0e10cSrcweir         {
1840cdf0e10cSrcweir             // clean up container.
1841cdf0e10cSrcweir             // E.g. dead remote listener objects can make trouble otherwise.
1842cdf0e10cSrcweir             // Iterator implementation allows removing objects during it's used !
1843cdf0e10cSrcweir             aIterator.remove();
1844cdf0e10cSrcweir         }
1845cdf0e10cSrcweir     }
1846cdf0e10cSrcweir }
1847cdf0e10cSrcweir 
1848cdf0e10cSrcweir //=============================================================================
impl_sendCancelTerminationEvent(const Desktop::TTerminateListenerList & lCalledListener)1849cdf0e10cSrcweir void Desktop::impl_sendCancelTerminationEvent(const Desktop::TTerminateListenerList& lCalledListener)
1850cdf0e10cSrcweir {
1851cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1852cdf0e10cSrcweir 
1853cdf0e10cSrcweir     css::lang::EventObject                          aEvent( static_cast< ::cppu::OWeakObject* >(this) );
1854cdf0e10cSrcweir     Desktop::TTerminateListenerList::const_iterator pIt;
1855cdf0e10cSrcweir     for (  pIt  = lCalledListener.begin();
1856cdf0e10cSrcweir            pIt != lCalledListener.end  ();
1857cdf0e10cSrcweir          ++pIt                           )
1858cdf0e10cSrcweir     {
1859cdf0e10cSrcweir         try
1860cdf0e10cSrcweir         {
1861cdf0e10cSrcweir             // Note: cancelTermination() is a new and optional interface method !
1862cdf0e10cSrcweir             css::uno::Reference< css::frame::XTerminateListener  > xListener           = *pIt;
1863cdf0e10cSrcweir             css::uno::Reference< css::frame::XTerminateListener2 > xListenerGeneration2(xListener, css::uno::UNO_QUERY);
1864cdf0e10cSrcweir             if ( ! xListenerGeneration2.is() )
1865cdf0e10cSrcweir                 continue;
1866cdf0e10cSrcweir             xListenerGeneration2->cancelTermination( aEvent );
1867cdf0e10cSrcweir         }
1868cdf0e10cSrcweir         catch( const css::uno::Exception& )
1869cdf0e10cSrcweir         {}
1870cdf0e10cSrcweir     }
1871cdf0e10cSrcweir }
1872cdf0e10cSrcweir 
1873cdf0e10cSrcweir //=============================================================================
impl_sendNotifyTerminationEvent()1874cdf0e10cSrcweir void Desktop::impl_sendNotifyTerminationEvent()
1875cdf0e10cSrcweir {
1876cdf0e10cSrcweir     TransactionGuard aTransaction( m_aTransactionManager, E_HARDEXCEPTIONS );
1877cdf0e10cSrcweir 
1878cdf0e10cSrcweir     ::cppu::OInterfaceContainerHelper* pContainer = m_aListenerContainer.getContainer( ::getCppuType( ( const css::uno::Reference< css::frame::XTerminateListener >*) NULL ) );
1879cdf0e10cSrcweir 	if ( ! pContainer )
1880cdf0e10cSrcweir         return;
1881cdf0e10cSrcweir 
1882cdf0e10cSrcweir     css::lang::EventObject aEvent( static_cast< ::cppu::OWeakObject* >(this) );
1883cdf0e10cSrcweir 
1884cdf0e10cSrcweir     ::cppu::OInterfaceIteratorHelper aIterator( *pContainer );
1885cdf0e10cSrcweir     while ( aIterator.hasMoreElements() )
1886cdf0e10cSrcweir     {
1887cdf0e10cSrcweir         try
1888cdf0e10cSrcweir         {
1889cdf0e10cSrcweir             css::uno::Reference< css::frame::XTerminateListener > xListener(aIterator.next(), css::uno::UNO_QUERY);
1890cdf0e10cSrcweir             if ( ! xListener.is() )
1891cdf0e10cSrcweir                 continue;
1892cdf0e10cSrcweir             xListener->notifyTermination( aEvent );
1893cdf0e10cSrcweir         }
1894cdf0e10cSrcweir         catch( const css::uno::Exception& )
1895cdf0e10cSrcweir         {
1896cdf0e10cSrcweir             // clean up container.
1897cdf0e10cSrcweir             // E.g. dead remote listener objects can make trouble otherwise.
1898cdf0e10cSrcweir             // Iterator implementation allows removing objects during it's used !
1899cdf0e10cSrcweir             aIterator.remove();
1900cdf0e10cSrcweir         }
1901cdf0e10cSrcweir     }
1902cdf0e10cSrcweir }
1903cdf0e10cSrcweir 
1904cdf0e10cSrcweir //=============================================================================
impl_closeFrames(::sal_Bool bAllowUI)1905cdf0e10cSrcweir ::sal_Bool Desktop::impl_closeFrames(::sal_Bool bAllowUI)
1906cdf0e10cSrcweir {
1907cdf0e10cSrcweir     SYNCHRONIZED_START
1908cdf0e10cSrcweir         ReadGuard aReadLock( m_aLock );
1909cdf0e10cSrcweir         css::uno::Sequence< css::uno::Reference< css::frame::XFrame > > lFrames = m_aChildTaskContainer.getAllElements();
1910cdf0e10cSrcweir         aReadLock.unlock();
1911cdf0e10cSrcweir     SYNCHRONIZED_END
1912cdf0e10cSrcweir 
1913cdf0e10cSrcweir     ::sal_Int32 c                = lFrames.getLength();
1914cdf0e10cSrcweir     ::sal_Int32 i                = 0;
1915cdf0e10cSrcweir     ::sal_Int32 nNonClosedFrames = 0;
1916cdf0e10cSrcweir 
1917cdf0e10cSrcweir     for( i=0; i<c; ++i )
1918cdf0e10cSrcweir     {
1919cdf0e10cSrcweir         try
1920cdf0e10cSrcweir         {
1921cdf0e10cSrcweir             css::uno::Reference< css::frame::XFrame > xFrame = lFrames[i];
1922cdf0e10cSrcweir 
1923cdf0e10cSrcweir             // XController.suspend() will show an UI ...
1924cdf0e10cSrcweir             // Use it in case it was allowed from outside only.
1925cdf0e10cSrcweir             sal_Bool                                       bSuspended = sal_False;
1926cdf0e10cSrcweir             css::uno::Reference< css::frame::XController > xController( xFrame->getController(), css::uno::UNO_QUERY );
1927cdf0e10cSrcweir             if (
1928cdf0e10cSrcweir                 ( bAllowUI         ) &&
1929cdf0e10cSrcweir                 ( xController.is() )
1930cdf0e10cSrcweir                )
1931cdf0e10cSrcweir             {
1932cdf0e10cSrcweir                 bSuspended = xController->suspend( sal_True );
1933cdf0e10cSrcweir                 if ( ! bSuspended )
1934cdf0e10cSrcweir                 {
1935cdf0e10cSrcweir                     ++nNonClosedFrames;
1936cdf0e10cSrcweir                     continue;
1937cdf0e10cSrcweir                 }
1938cdf0e10cSrcweir             }
1939cdf0e10cSrcweir 
1940cdf0e10cSrcweir             // Try to close frame (in case no UI was allowed without calling XController->suspend() before!)
1941cdf0e10cSrcweir             // But don't deliver ownership to any other one!
1942cdf0e10cSrcweir             // This method can be called again.
1943cdf0e10cSrcweir             css::uno::Reference< css::util::XCloseable > xClose( xFrame, css::uno::UNO_QUERY );
1944cdf0e10cSrcweir             if ( xClose.is() )
1945cdf0e10cSrcweir             {
1946cdf0e10cSrcweir                 try
1947cdf0e10cSrcweir                 {
1948cdf0e10cSrcweir                     xClose->close(sal_False);
1949cdf0e10cSrcweir                 }
1950cdf0e10cSrcweir                 catch(const css::util::CloseVetoException&)
1951cdf0e10cSrcweir                 {
1952cdf0e10cSrcweir                     // Any internal process of this frame disagree with our request.
1953cdf0e10cSrcweir                     // Safe this state but dont break these loop. Other frames has to be closed!
1954cdf0e10cSrcweir                     ++nNonClosedFrames;
1955cdf0e10cSrcweir 
1956cdf0e10cSrcweir                     // Reactivate controller.
1957cdf0e10cSrcweir                     // It can happen that XController.suspend() returned true ... but a registered close listener
1958cdf0e10cSrcweir                     // throwed these veto exception. Then the controller has to be reactivated. Otherwise
1959cdf0e10cSrcweir                     // these document doesnt work any more.
1960cdf0e10cSrcweir                     if (
1961cdf0e10cSrcweir                         (bSuspended      ) &&
1962cdf0e10cSrcweir                         (xController.is())
1963cdf0e10cSrcweir                        )
1964cdf0e10cSrcweir                         xController->suspend(sal_False);
1965cdf0e10cSrcweir                 }
1966cdf0e10cSrcweir 
1967cdf0e10cSrcweir                 // If interface XClosable interface exists and was used ...
1968cdf0e10cSrcweir                 // it's not allowed to use XComponent->dispose() also !
1969cdf0e10cSrcweir                 continue;
1970cdf0e10cSrcweir             }
1971cdf0e10cSrcweir 
1972cdf0e10cSrcweir             // XClosable not supported ?
1973cdf0e10cSrcweir             // Then we have to dispose these frame hardly.
1974cdf0e10cSrcweir             css::uno::Reference< css::lang::XComponent > xDispose( xFrame, css::uno::UNO_QUERY );
1975cdf0e10cSrcweir             if ( xDispose.is() )
1976cdf0e10cSrcweir                 xDispose->dispose();
1977cdf0e10cSrcweir 
1978cdf0e10cSrcweir             // Don't remove these frame from our child container!
1979cdf0e10cSrcweir             // A frame do it by itself inside close()/dispose() method.
1980cdf0e10cSrcweir         }
1981cdf0e10cSrcweir         catch(const css::lang::DisposedException&)
1982cdf0e10cSrcweir         {
1983cdf0e10cSrcweir             // Dispose frames are closed frames.
1984cdf0e10cSrcweir             // So we can count it here .-)
1985cdf0e10cSrcweir         }
1986cdf0e10cSrcweir     }
1987cdf0e10cSrcweir 
1988cdf0e10cSrcweir     return (nNonClosedFrames < 1);
1989cdf0e10cSrcweir }
1990cdf0e10cSrcweir 
1991cdf0e10cSrcweir //_________________________________________________________________________________________________________________
1992cdf0e10cSrcweir //	debug methods
1993cdf0e10cSrcweir //_________________________________________________________________________________________________________________
1994cdf0e10cSrcweir 
1995cdf0e10cSrcweir /*-----------------------------------------------------------------------------------------------------------------
1996cdf0e10cSrcweir 	The follow methods checks the parameter for other functions. If a parameter or his value is non valid,
1997cdf0e10cSrcweir     we return "sal_True". (otherwise sal_False) This mechanism is used to throw an ASSERT!
1998cdf0e10cSrcweir -----------------------------------------------------------------------------------------------------------------*/
1999cdf0e10cSrcweir 
2000cdf0e10cSrcweir #ifdef ENABLE_ASSERTIONS
2001cdf0e10cSrcweir 
2002cdf0e10cSrcweir //*****************************************************************************************************************
2003cdf0e10cSrcweir //	We work with valid servicemanager only.
implcp_ctor(const css::uno::Reference<css::lang::XMultiServiceFactory> & xFactory)2004cdf0e10cSrcweir sal_Bool Desktop::implcp_ctor( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory )
2005cdf0e10cSrcweir {
2006cdf0e10cSrcweir     return(
2007cdf0e10cSrcweir 			( &xFactory		==	NULL		)	||
2008cdf0e10cSrcweir 			( xFactory.is()	==	sal_False	)
2009cdf0e10cSrcweir           );
2010cdf0e10cSrcweir }
2011cdf0e10cSrcweir 
2012cdf0e10cSrcweir //*****************************************************************************************************************
2013cdf0e10cSrcweir //	We work with valid listener only.
implcp_addEventListener(const css::uno::Reference<css::lang::XEventListener> & xListener)2014cdf0e10cSrcweir sal_Bool Desktop::implcp_addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener )
2015cdf0e10cSrcweir {
2016cdf0e10cSrcweir     return(
2017cdf0e10cSrcweir 			( &xListener		==	NULL		)	||
2018cdf0e10cSrcweir 			( xListener.is()	==	sal_False	)
2019cdf0e10cSrcweir           );
2020cdf0e10cSrcweir }
2021cdf0e10cSrcweir 
2022cdf0e10cSrcweir //*****************************************************************************************************************
2023cdf0e10cSrcweir //	We work with valid listener only.
implcp_removeEventListener(const css::uno::Reference<css::lang::XEventListener> & xListener)2024cdf0e10cSrcweir sal_Bool Desktop::implcp_removeEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener )
2025cdf0e10cSrcweir {
2026cdf0e10cSrcweir     return(
2027cdf0e10cSrcweir 			( &xListener		==	NULL		)	||
2028cdf0e10cSrcweir 			( xListener.is()	==	sal_False	)
2029cdf0e10cSrcweir           );
2030cdf0e10cSrcweir }
2031cdf0e10cSrcweir 
2032cdf0e10cSrcweir #endif	// #ifdef ENABLE_ASSERTIONS
2033cdf0e10cSrcweir 
2034cdf0e10cSrcweir }	// namespace framework
2035