Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <services/layoutmanager.hxx>
21 : #include "helpers.hxx"
22 :
23 : #include <framework/sfxhelperfunctions.hxx>
24 : #include <uielement/menubarwrapper.hxx>
25 : #include <framework/addonsoptions.hxx>
26 : #include <classes/fwkresid.hxx>
27 : #include <classes/resource.hrc>
28 : #include <toolkit/helper/convert.hxx>
29 : #include <uielement/progressbarwrapper.hxx>
30 : #include <uiconfiguration/globalsettings.hxx>
31 : #include <uiconfiguration/windowstateproperties.hxx>
32 : #include "toolbarlayoutmanager.hxx"
33 :
34 : #include <com/sun/star/beans/XPropertySet.hpp>
35 : #include <com/sun/star/beans/PropertyAttribute.hpp>
36 : #include <com/sun/star/frame/ModuleManager.hpp>
37 : #include <com/sun/star/frame/XModel.hpp>
38 : #include <com/sun/star/frame/FrameAction.hpp>
39 : #include <com/sun/star/lang/XMultiComponentFactory.hpp>
40 : #include <com/sun/star/awt/XTopWindow.hpp>
41 : #include <com/sun/star/awt/XSystemDependentMenuPeer.hpp>
42 : #include <com/sun/star/lang/SystemDependent.hpp>
43 : #include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
44 : #include <com/sun/star/awt/PosSize.hpp>
45 : #include <com/sun/star/awt/XDevice.hpp>
46 : #include <com/sun/star/awt/XSystemDependentWindowPeer.hpp>
47 : #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
48 : #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
49 : #include <com/sun/star/ui/UIElementType.hpp>
50 : #include <com/sun/star/ui/theWindowStateConfiguration.hpp>
51 : #include <com/sun/star/ui/theUIElementFactoryManager.hpp>
52 : #include <com/sun/star/container/XNameReplace.hpp>
53 : #include <com/sun/star/container/XNameContainer.hpp>
54 : #include <com/sun/star/frame/LayoutManagerEvents.hpp>
55 : #include <com/sun/star/frame/XDispatchProvider.hpp>
56 : #include <com/sun/star/frame/DispatchHelper.hpp>
57 : #include <com/sun/star/lang/DisposedException.hpp>
58 : #include <com/sun/star/util/URLTransformer.hpp>
59 :
60 : #include <comphelper/processfactory.hxx>
61 : #include <svtools/imgdef.hxx>
62 : #include <tools/diagnose_ex.h>
63 : #include <vcl/window.hxx>
64 : #include <vcl/wrkwin.hxx>
65 : #include <vcl/dockingarea.hxx>
66 : #include <vcl/svapp.hxx>
67 : #include <vcl/i18nhelp.hxx>
68 : #include <vcl/wall.hxx>
69 : #include <toolkit/helper/vclunohelper.hxx>
70 : #include <toolkit/awt/vclxwindow.hxx>
71 : #include <toolkit/awt/vclxmenu.hxx>
72 : #include <comphelper/uno3.hxx>
73 : #include <rtl/instance.hxx>
74 : #include <unotools/cmdoptions.hxx>
75 :
76 : #include <rtl/ref.hxx>
77 : #include <rtl/strbuf.hxx>
78 :
79 : #include <algorithm>
80 : #include <boost/utility.hpp>
81 :
82 : // using namespace
83 : using namespace ::com::sun::star;
84 : using namespace ::com::sun::star::uno;
85 : using namespace ::com::sun::star::beans;
86 : using namespace ::com::sun::star::util;
87 : using namespace ::com::sun::star::lang;
88 : using namespace ::com::sun::star::container;
89 : using namespace ::com::sun::star::ui;
90 : using namespace ::com::sun::star::frame;
91 :
92 : static const char STATUS_BAR_ALIAS[] = "private:resource/statusbar/statusbar";
93 : static const char PROGRESS_BAR_ALIAS[] = "private:resource/progressbar/progressbar";
94 :
95 : namespace framework
96 : {
97 :
98 0 : IMPLEMENT_FORWARD_XTYPEPROVIDER2( LayoutManager, LayoutManager_Base, LayoutManager_PBase )
99 1956010 : IMPLEMENT_FORWARD_XINTERFACE2( LayoutManager, LayoutManager_Base, LayoutManager_PBase )
100 :
101 5576 : LayoutManager::LayoutManager( const Reference< XComponentContext >& xContext ) : LayoutManager_Base()
102 : , ::cppu::OBroadcastHelperVar< ::cppu::OMultiTypeInterfaceContainerHelper, ::cppu::OMultiTypeInterfaceContainerHelper::keyType >(m_aMutex)
103 : , LayoutManager_PBase( *(static_cast< ::cppu::OBroadcastHelper* >(this)) )
104 : , m_xContext( xContext )
105 : , m_xURLTransformer( URLTransformer::create(xContext) )
106 : , m_nLockCount( 0 )
107 : , m_bActive( false )
108 : , m_bInplaceMenuSet( false )
109 : , m_bDockingInProgress( false )
110 : , m_bMenuVisible( true )
111 : , m_bComponentAttached( false )
112 : , m_bDoLayout( false )
113 : , m_bVisible( true )
114 : , m_bParentWindowVisible( false )
115 : , m_bMustDoLayout( true )
116 : , m_bAutomaticToolbars( true )
117 : , m_bStoreWindowState( false )
118 : , m_bHideCurrentUI( false )
119 : , m_bGlobalSettings( false )
120 : , m_bPreserveContentSize( false )
121 : , m_bMenuBarCloseButton( false )
122 : , m_pInplaceMenuBar( NULL )
123 : , m_xModuleManager( ModuleManager::create( xContext ))
124 : , m_xUIElementFactoryManager( ui::theUIElementFactoryManager::get(xContext) )
125 : , m_xPersistentWindowStateSupplier( ui::theWindowStateConfiguration::get( xContext ) )
126 : , m_pGlobalSettings( 0 )
127 : , m_aListenerContainer( m_aMutex )
128 : , m_pToolbarManager( 0 )
129 5576 : , m_xToolbarManager( 0 )
130 : {
131 : // Initialize statusbar member
132 5576 : const sal_Bool bRefreshVisibility = sal_False;
133 5576 : m_aStatusBarElement.m_aType = "statusbar";
134 5576 : m_aStatusBarElement.m_aName = STATUS_BAR_ALIAS;
135 :
136 5576 : m_pToolbarManager = new ToolbarLayoutManager( xContext, Reference<XUIElementFactory>(m_xUIElementFactoryManager, UNO_QUERY_THROW), this );
137 5576 : m_xToolbarManager = uno::Reference< ui::XUIConfigurationListener >( static_cast< OWeakObject* >( m_pToolbarManager ), uno::UNO_QUERY );
138 :
139 5576 : Application::AddEventListener( LINK( this, LayoutManager, SettingsChanged ) );
140 :
141 5576 : m_aAsyncLayoutTimer.SetTimeout( 50 );
142 5576 : m_aAsyncLayoutTimer.SetTimeoutHdl( LINK( this, LayoutManager, AsyncLayoutHdl ) );
143 :
144 5576 : registerProperty( LAYOUTMANAGER_PROPNAME_AUTOMATICTOOLBARS, LAYOUTMANAGER_PROPHANDLE_AUTOMATICTOOLBARS, css::beans::PropertyAttribute::TRANSIENT, &m_bAutomaticToolbars, ::getCppuType( &m_bAutomaticToolbars ) );
145 5576 : registerProperty( LAYOUTMANAGER_PROPNAME_HIDECURRENTUI, LAYOUTMANAGER_PROPHANDLE_HIDECURRENTUI, beans::PropertyAttribute::TRANSIENT, &m_bHideCurrentUI, ::getCppuType( &m_bHideCurrentUI ) );
146 5576 : registerProperty( LAYOUTMANAGER_PROPNAME_LOCKCOUNT, LAYOUTMANAGER_PROPHANDLE_LOCKCOUNT, beans::PropertyAttribute::TRANSIENT | beans::PropertyAttribute::READONLY, &m_nLockCount, getCppuType( &m_nLockCount ) );
147 5576 : registerProperty( LAYOUTMANAGER_PROPNAME_MENUBARCLOSER, LAYOUTMANAGER_PROPHANDLE_MENUBARCLOSER, beans::PropertyAttribute::TRANSIENT, &m_bMenuBarCloseButton, ::getCppuType( &m_bMenuBarCloseButton ) );
148 5576 : registerPropertyNoMember( LAYOUTMANAGER_PROPNAME_REFRESHVISIBILITY, LAYOUTMANAGER_PROPHANDLE_REFRESHVISIBILITY, beans::PropertyAttribute::TRANSIENT, ::getCppuType( &bRefreshVisibility ), &bRefreshVisibility );
149 5576 : registerProperty( LAYOUTMANAGER_PROPNAME_PRESERVE_CONTENT_SIZE, LAYOUTMANAGER_PROPHANDLE_PRESERVE_CONTENT_SIZE, beans::PropertyAttribute::TRANSIENT, &m_bPreserveContentSize, ::getCppuType( &m_bPreserveContentSize ) );
150 5576 : }
151 :
152 16590 : LayoutManager::~LayoutManager()
153 : {
154 5530 : Application::RemoveEventListener( LINK( this, LayoutManager, SettingsChanged ) );
155 5530 : m_aAsyncLayoutTimer.Stop();
156 5530 : setDockingAreaAcceptor(NULL);
157 5530 : delete m_pGlobalSettings;
158 11060 : }
159 :
160 : // Internal helper function
161 11136 : void LayoutManager::impl_clearUpMenuBar()
162 : {
163 11136 : implts_lock();
164 :
165 : // Clear up VCL menu bar to prepare shutdown
166 11136 : if ( m_xContainerWindow.is() )
167 : {
168 11136 : SolarMutexGuard aGuard;
169 :
170 11136 : SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow );
171 11136 : if ( pSysWindow )
172 : {
173 11136 : MenuBar* pSetMenuBar = 0;
174 11136 : if ( m_xInplaceMenuBar.is() )
175 2 : pSetMenuBar = static_cast<MenuBar *>(m_pInplaceMenuBar->GetMenuBar());
176 : else
177 : {
178 11134 : Reference< awt::XMenuBar > xMenuBar;
179 :
180 22268 : Reference< XPropertySet > xPropSet( m_xMenuBar, UNO_QUERY );
181 11134 : if ( xPropSet.is() )
182 : {
183 : try
184 : {
185 5470 : xPropSet->getPropertyValue("XMenuBar") >>= xMenuBar;
186 : }
187 0 : catch (const beans::UnknownPropertyException&)
188 : {
189 : }
190 0 : catch (const lang::WrappedTargetException&)
191 : {
192 : }
193 : }
194 :
195 11134 : VCLXMenu* pAwtMenuBar = VCLXMenu::GetImplementation( xMenuBar );
196 11134 : if ( pAwtMenuBar )
197 16604 : pSetMenuBar = static_cast<MenuBar*>(pAwtMenuBar->GetMenu());
198 : }
199 :
200 11136 : MenuBar* pTopMenuBar = pSysWindow->GetMenuBar();
201 11136 : if ( pSetMenuBar == pTopMenuBar )
202 11132 : pSysWindow->SetMenuBar( 0 );
203 11136 : }
204 : }
205 :
206 : // reset inplace menubar manager
207 11136 : m_pInplaceMenuBar = 0;
208 11136 : if ( m_xInplaceMenuBar.is() )
209 : {
210 2 : m_xInplaceMenuBar->dispose();
211 2 : m_xInplaceMenuBar.clear();
212 : }
213 :
214 11136 : Reference< XComponent > xComp( m_xMenuBar, UNO_QUERY );
215 11136 : if ( xComp.is() )
216 5470 : xComp->dispose();
217 11136 : m_xMenuBar.clear();
218 11136 : implts_unlock();
219 11136 : }
220 :
221 57992 : void LayoutManager::implts_lock()
222 : {
223 57992 : SolarMutexGuard g;
224 57992 : ++m_nLockCount;
225 57992 : }
226 :
227 57982 : bool LayoutManager::implts_unlock()
228 : {
229 57982 : SolarMutexGuard g;
230 57982 : m_nLockCount = std::max( m_nLockCount-1, static_cast<sal_Int32>(0) );
231 57982 : return ( m_nLockCount == 0 );
232 : }
233 :
234 11154 : void LayoutManager::implts_reset( bool bAttached )
235 : {
236 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
237 11154 : SolarMutexClearableGuard aReadLock;
238 22308 : Reference< XFrame > xFrame = m_xFrame;
239 22308 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
240 22308 : Reference< XUIConfiguration > xModuleCfgMgr( m_xModuleCfgMgr, UNO_QUERY );
241 22308 : Reference< XUIConfiguration > xDocCfgMgr( m_xDocCfgMgr, UNO_QUERY );
242 22308 : Reference< XNameAccess > xPersistentWindowState( m_xPersistentWindowState );
243 22308 : Reference< XComponentContext > xContext( m_xContext );
244 22308 : Reference< XNameAccess > xPersistentWindowStateSupplier( m_xPersistentWindowStateSupplier );
245 11154 : ToolbarLayoutManager* pToolbarManager( m_pToolbarManager );
246 22308 : OUString aModuleIdentifier( m_aModuleIdentifier );
247 11154 : bool bAutomaticToolbars( m_bAutomaticToolbars );
248 11154 : aReadLock.clear();
249 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
250 :
251 11154 : implts_lock();
252 :
253 22308 : Reference< XModel > xModel;
254 11154 : if ( xFrame.is() )
255 : {
256 11154 : if ( bAttached )
257 : {
258 5586 : OUString aOldModuleIdentifier( aModuleIdentifier );
259 : try
260 : {
261 5586 : aModuleIdentifier = m_xModuleManager->identify( xFrame );
262 : }
263 4 : catch( const Exception& ) {}
264 :
265 5586 : if ( !aModuleIdentifier.isEmpty() && aOldModuleIdentifier != aModuleIdentifier )
266 : {
267 5578 : Reference< XModuleUIConfigurationManagerSupplier > xModuleCfgSupplier;
268 5578 : if ( xContext.is() )
269 5578 : xModuleCfgSupplier = theModuleUIConfigurationManagerSupplier::get( xContext );
270 :
271 5578 : if ( xModuleCfgMgr.is() )
272 : {
273 : try
274 : {
275 : // Remove listener to old module ui configuration manager
276 0 : xModuleCfgMgr->removeConfigurationListener( Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
277 : }
278 0 : catch (const Exception&)
279 : {
280 : }
281 : }
282 :
283 : try
284 : {
285 : // Add listener to new module ui configuration manager
286 5578 : xModuleCfgMgr = Reference< XUIConfiguration >( xModuleCfgSupplier->getUIConfigurationManager( aModuleIdentifier ), UNO_QUERY );
287 5568 : if ( xModuleCfgMgr.is() )
288 5568 : xModuleCfgMgr->addConfigurationListener( Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
289 : }
290 10 : catch (const Exception&)
291 : {
292 : }
293 :
294 : try
295 : {
296 : // Retrieve persistent window state reference for our new module
297 5578 : if ( xPersistentWindowStateSupplier.is() )
298 5578 : xPersistentWindowStateSupplier->getByName( aModuleIdentifier ) >>= xPersistentWindowState;
299 : }
300 0 : catch (const NoSuchElementException&)
301 : {
302 : }
303 0 : catch (const WrappedTargetException&)
304 : {
305 5578 : }
306 : }
307 :
308 5586 : xModel = impl_getModelFromFrame( xFrame );
309 5586 : if ( xModel.is() )
310 : {
311 5578 : Reference< XUIConfigurationManagerSupplier > xUIConfigurationManagerSupplier( xModel, UNO_QUERY );
312 5578 : if ( xUIConfigurationManagerSupplier.is() )
313 : {
314 5544 : if ( xDocCfgMgr.is() )
315 : {
316 : try
317 : {
318 : // Remove listener to old ui configuration manager
319 4 : xDocCfgMgr->removeConfigurationListener( Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
320 : }
321 0 : catch (const Exception&)
322 : {
323 : }
324 : }
325 :
326 : try
327 : {
328 5544 : xDocCfgMgr = Reference< XUIConfiguration >( xUIConfigurationManagerSupplier->getUIConfigurationManager(), UNO_QUERY );
329 5544 : if ( xDocCfgMgr.is() )
330 5544 : xDocCfgMgr->addConfigurationListener( Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
331 : }
332 0 : catch (const Exception&)
333 : {
334 : }
335 5578 : }
336 5586 : }
337 : }
338 : else
339 : {
340 : // Remove configuration listeners before we can release our references
341 5568 : if ( xModuleCfgMgr.is() )
342 : {
343 : try
344 : {
345 5562 : xModuleCfgMgr->removeConfigurationListener(
346 5562 : Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
347 : }
348 0 : catch (const Exception&)
349 : {
350 : }
351 : }
352 :
353 5568 : if ( xDocCfgMgr.is() )
354 : {
355 : try
356 : {
357 5526 : xDocCfgMgr->removeConfigurationListener(
358 5526 : Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
359 : }
360 0 : catch (const Exception&)
361 : {
362 : }
363 : }
364 :
365 : // Release references to our configuration managers as we currently don't have
366 : // an attached module.
367 5568 : xModuleCfgMgr.clear();
368 5568 : xDocCfgMgr.clear();
369 5568 : xPersistentWindowState.clear();
370 5568 : aModuleIdentifier = OUString();
371 : }
372 :
373 11154 : Reference< XUIConfigurationManager > xModCfgMgr( xModuleCfgMgr, UNO_QUERY );
374 22308 : Reference< XUIConfigurationManager > xDokCfgMgr( xDocCfgMgr, UNO_QUERY );
375 :
376 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
377 22308 : SolarMutexClearableGuard aWriteLock;
378 11154 : m_xModel = xModel;
379 11154 : m_aDockingArea = awt::Rectangle();
380 11154 : m_bComponentAttached = bAttached;
381 11154 : m_aModuleIdentifier = aModuleIdentifier;
382 11154 : m_xModuleCfgMgr = xModCfgMgr;
383 11154 : m_xDocCfgMgr = xDokCfgMgr;
384 11154 : m_xPersistentWindowState = xPersistentWindowState;
385 11154 : m_aStatusBarElement.m_bStateRead = false; // reset state to read data again!
386 11154 : aWriteLock.clear();
387 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
388 :
389 : // reset/notify toolbar layout manager
390 11154 : if ( pToolbarManager )
391 : {
392 11154 : if ( bAttached )
393 : {
394 5586 : pToolbarManager->attach( xFrame, xModCfgMgr, xDokCfgMgr, xPersistentWindowState );
395 5586 : uno::Reference< awt::XWindowPeer > xParent( xContainerWindow, UNO_QUERY );
396 5586 : pToolbarManager->setParentWindow( xParent );
397 5586 : if ( bAutomaticToolbars )
398 5592 : pToolbarManager->createStaticToolbars();
399 : }
400 : else
401 : {
402 5568 : pToolbarManager->reset();
403 5568 : implts_destroyElements();
404 : }
405 11154 : }
406 : }
407 :
408 22300 : implts_unlock();
409 11146 : }
410 :
411 2 : bool LayoutManager::implts_isEmbeddedLayoutManager() const
412 : {
413 2 : SolarMutexClearableGuard aReadLock;
414 4 : Reference< XFrame > xFrame = m_xFrame;
415 4 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
416 2 : aReadLock.clear();
417 :
418 4 : Reference< awt::XWindow > xFrameContainerWindow = xFrame->getContainerWindow();
419 2 : if ( xFrameContainerWindow == xContainerWindow )
420 0 : return false;
421 : else
422 4 : return true;
423 : }
424 :
425 11136 : void LayoutManager::implts_destroyElements()
426 : {
427 11136 : SolarMutexResettableGuard aWriteLock;
428 11136 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
429 11136 : aWriteLock.clear();
430 :
431 11136 : if ( pToolbarManager )
432 11136 : pToolbarManager->destroyToolbars();
433 :
434 11136 : implts_destroyStatusBar();
435 :
436 11136 : aWriteLock.reset();
437 11136 : impl_clearUpMenuBar();
438 11136 : aWriteLock.clear();
439 11136 : }
440 :
441 5082 : void LayoutManager::implts_toggleFloatingUIElementsVisibility( bool bActive )
442 : {
443 5082 : SolarMutexClearableGuard aReadLock;
444 5082 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
445 5082 : aReadLock.clear();
446 :
447 5082 : if ( pToolbarManager )
448 5082 : pToolbarManager->setFloatingToolbarsVisibility( bActive );
449 5082 : }
450 :
451 10184 : uno::Reference< ui::XUIElement > LayoutManager::implts_findElement( const OUString& aName )
452 : {
453 10184 : OUString aElementType;
454 20368 : OUString aElementName;
455 :
456 10184 : parseResourceURL( aName, aElementType, aElementName );
457 10204 : if ( aElementType.equalsIgnoreAsciiCase("menubar") &&
458 20 : aElementName.equalsIgnoreAsciiCase("menubar") )
459 14 : return m_xMenuBar;
460 20340 : else if (( aElementType.equalsIgnoreAsciiCase("statusbar") &&
461 20340 : aElementName.equalsIgnoreAsciiCase("statusbar") ) ||
462 10170 : ( m_aStatusBarElement.m_aName == aName ))
463 4 : return m_aStatusBarElement.m_xUIElement;
464 20306 : else if ( aElementType.equalsIgnoreAsciiCase("progressbar") &&
465 10140 : aElementName.equalsIgnoreAsciiCase("progressbar") )
466 10140 : return m_aProgressBarElement.m_xUIElement;
467 :
468 10210 : return uno::Reference< ui::XUIElement >();
469 : }
470 :
471 15232 : bool LayoutManager::implts_readWindowStateData( const OUString& aName, UIElement& rElementData )
472 : {
473 : return readWindowStateData( aName, rElementData, m_xPersistentWindowState,
474 15232 : m_pGlobalSettings, m_bGlobalSettings, m_xContext );
475 : }
476 :
477 288801 : bool LayoutManager::readWindowStateData( const OUString& aName, UIElement& rElementData,
478 : const Reference< XNameAccess > &rPersistentWindowState,
479 : GlobalSettings* &rGlobalSettings, bool &bInGlobalSettings,
480 : const Reference< XComponentContext > &rComponentContext )
481 : {
482 288801 : bool bGetSettingsState( false );
483 :
484 288801 : SolarMutexResettableGuard aWriteLock;
485 577602 : Reference< XNameAccess > xPersistentWindowState( rPersistentWindowState );
486 288801 : aWriteLock.clear();
487 :
488 288801 : if ( xPersistentWindowState.is() )
489 : {
490 279075 : aWriteLock.reset();
491 279075 : bool bGlobalSettings( bInGlobalSettings );
492 279075 : GlobalSettings* pGlobalSettings( 0 );
493 279075 : if ( rGlobalSettings == 0 )
494 : {
495 11050 : rGlobalSettings = new GlobalSettings( rComponentContext );
496 11050 : bGetSettingsState = true;
497 : }
498 279075 : pGlobalSettings = rGlobalSettings;
499 279075 : aWriteLock.clear();
500 :
501 : try
502 : {
503 279075 : Sequence< PropertyValue > aWindowState;
504 279075 : if ( xPersistentWindowState->hasByName( aName ) && (xPersistentWindowState->getByName( aName ) >>= aWindowState) )
505 : {
506 273569 : bool bValue( false );
507 3300271 : for ( sal_Int32 n = 0; n < aWindowState.getLength(); n++ )
508 : {
509 3026702 : if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_DOCKED )
510 : {
511 273569 : if ( aWindowState[n].Value >>= bValue )
512 273569 : rElementData.m_bFloating = !bValue;
513 : }
514 2753133 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_VISIBLE )
515 : {
516 273569 : if ( aWindowState[n].Value >>= bValue )
517 273569 : rElementData.m_bVisible = bValue;
518 : }
519 2479564 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_DOCKINGAREA )
520 : {
521 : ui::DockingArea eDockingArea;
522 138672 : if ( aWindowState[n].Value >>= eDockingArea )
523 138672 : rElementData.m_aDockedData.m_nDockedArea = sal_Int16( eDockingArea );
524 : }
525 2340892 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_DOCKPOS )
526 : {
527 136276 : awt::Point aPoint;
528 136276 : if ( aWindowState[n].Value >>= aPoint )
529 136276 : rElementData.m_aDockedData.m_aPos = aPoint;
530 : }
531 2204616 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_POS )
532 : {
533 8138 : awt::Point aPoint;
534 8138 : if ( aWindowState[n].Value >>= aPoint )
535 8138 : rElementData.m_aFloatingData.m_aPos = aPoint;
536 : }
537 2196478 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_SIZE )
538 : {
539 7926 : awt::Size aSize;
540 7926 : if ( aWindowState[n].Value >>= aSize )
541 7926 : rElementData.m_aFloatingData.m_aSize = aSize;
542 : }
543 2188552 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_UINAME )
544 273569 : aWindowState[n].Value >>= rElementData.m_aUIName;
545 1914983 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_STYLE )
546 : {
547 273569 : sal_Int32 nStyle = 0;
548 273569 : if ( aWindowState[n].Value >>= nStyle )
549 273569 : rElementData.m_nStyle = sal_Int16( nStyle );
550 : }
551 1641414 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_LOCKED )
552 : {
553 273569 : if ( aWindowState[n].Value >>= bValue )
554 273569 : rElementData.m_aDockedData.m_bLocked = bValue;
555 : }
556 1367845 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_CONTEXT )
557 : {
558 273569 : if ( aWindowState[n].Value >>= bValue )
559 273569 : rElementData.m_bContextSensitive = bValue;
560 : }
561 1094276 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_NOCLOSE )
562 : {
563 273569 : if ( aWindowState[n].Value >>= bValue )
564 273569 : rElementData.m_bNoClose = bValue;
565 : }
566 820707 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_CONTEXTACTIVE )
567 : {
568 273569 : if ( aWindowState[n].Value >>= bValue )
569 273569 : rElementData.m_bContextActive = bValue;
570 : }
571 547138 : else if ( aWindowState[n].Name == WINDOWSTATE_PROPERTY_SOFTCLOSE )
572 : {
573 273569 : if ( aWindowState[n].Value >>= bValue )
574 273569 : rElementData.m_bSoftClose = bValue;
575 : }
576 : }
577 : }
578 :
579 : // oversteer values with global settings
580 279075 : if ( pGlobalSettings && ( bGetSettingsState || bGlobalSettings ))
581 : {
582 11050 : if ( pGlobalSettings->HasStatesInfo( GlobalSettings::UIELEMENT_TYPE_TOOLBAR ))
583 : {
584 0 : SolarMutexClearableGuard aWriteLock2;
585 0 : bInGlobalSettings = true;
586 0 : aWriteLock2.clear();
587 :
588 0 : uno::Any aValue;
589 0 : if ( pGlobalSettings->GetStateInfo( GlobalSettings::UIELEMENT_TYPE_TOOLBAR,
590 : GlobalSettings::STATEINFO_LOCKED,
591 : aValue ))
592 0 : aValue >>= rElementData.m_aDockedData.m_bLocked;
593 0 : if ( pGlobalSettings->GetStateInfo( GlobalSettings::UIELEMENT_TYPE_TOOLBAR,
594 : GlobalSettings::STATEINFO_DOCKED,
595 : aValue ))
596 : {
597 : bool bValue;
598 0 : if ( aValue >>= bValue )
599 0 : rElementData.m_bFloating = !bValue;
600 0 : }
601 : }
602 : }
603 :
604 279075 : return true;
605 : }
606 0 : catch (const NoSuchElementException&)
607 : {
608 : }
609 : }
610 :
611 298527 : return false;
612 : }
613 :
614 0 : void LayoutManager::implts_writeWindowStateData( const OUString& aName, const UIElement& rElementData )
615 : {
616 0 : SolarMutexResettableGuard aWriteLock;
617 0 : Reference< XNameAccess > xPersistentWindowState( m_xPersistentWindowState );
618 :
619 : // set flag to determine that we triggered the notification
620 0 : m_bStoreWindowState = true;
621 0 : aWriteLock.clear();
622 :
623 0 : bool bPersistent( false );
624 0 : Reference< XPropertySet > xPropSet( rElementData.m_xUIElement, UNO_QUERY );
625 0 : if ( xPropSet.is() )
626 : {
627 : try
628 : {
629 : // Check persistent flag of the user interface element
630 0 : xPropSet->getPropertyValue("Persistent") >>= bPersistent;
631 : }
632 0 : catch (const beans::UnknownPropertyException&)
633 : {
634 : // Non-configurable elements should at least store their dimension/position
635 0 : bPersistent = true;
636 : }
637 0 : catch (const lang::WrappedTargetException&)
638 : {
639 : }
640 : }
641 :
642 0 : if ( bPersistent && xPersistentWindowState.is() )
643 : {
644 : try
645 : {
646 0 : Sequence< PropertyValue > aWindowState( 8 );
647 :
648 0 : aWindowState[0].Name = WINDOWSTATE_PROPERTY_DOCKED;
649 0 : aWindowState[0].Value = makeAny( !rElementData.m_bFloating );
650 0 : aWindowState[1].Name = WINDOWSTATE_PROPERTY_VISIBLE;
651 0 : aWindowState[1].Value = makeAny( rElementData.m_bVisible );
652 :
653 0 : aWindowState[2].Name = WINDOWSTATE_PROPERTY_DOCKINGAREA;
654 0 : aWindowState[2].Value = makeAny( static_cast< DockingArea >( rElementData.m_aDockedData.m_nDockedArea ) );
655 :
656 0 : aWindowState[3].Name = WINDOWSTATE_PROPERTY_DOCKPOS;
657 0 : aWindowState[3].Value <<= rElementData.m_aDockedData.m_aPos;
658 :
659 0 : aWindowState[4].Name = WINDOWSTATE_PROPERTY_POS;
660 0 : aWindowState[4].Value <<= rElementData.m_aFloatingData.m_aPos;
661 :
662 0 : aWindowState[5].Name = WINDOWSTATE_PROPERTY_SIZE;
663 0 : aWindowState[5].Value <<= rElementData.m_aFloatingData.m_aSize;
664 0 : aWindowState[6].Name = WINDOWSTATE_PROPERTY_UINAME;
665 0 : aWindowState[6].Value = makeAny( rElementData.m_aUIName );
666 0 : aWindowState[7].Name = WINDOWSTATE_PROPERTY_LOCKED;
667 0 : aWindowState[7].Value = makeAny( rElementData.m_aDockedData.m_bLocked );
668 :
669 0 : if ( xPersistentWindowState->hasByName( aName ))
670 : {
671 0 : Reference< XNameReplace > xReplace( xPersistentWindowState, uno::UNO_QUERY );
672 0 : xReplace->replaceByName( aName, makeAny( aWindowState ));
673 : }
674 : else
675 : {
676 0 : Reference< XNameContainer > xInsert( xPersistentWindowState, uno::UNO_QUERY );
677 0 : xInsert->insertByName( aName, makeAny( aWindowState ));
678 0 : }
679 : }
680 0 : catch (const Exception&)
681 : {
682 : }
683 : }
684 :
685 : // Reset flag
686 0 : aWriteLock.reset();
687 0 : m_bStoreWindowState = false;
688 0 : aWriteLock.clear();
689 0 : }
690 :
691 18797 : ::Size LayoutManager::implts_getContainerWindowOutputSize()
692 : {
693 18797 : ::Size aContainerWinSize;
694 18797 : vcl::Window* pContainerWindow( 0 );
695 :
696 : // Retrieve output size from container Window
697 18797 : SolarMutexGuard aGuard;
698 18797 : pContainerWindow = VCLUnoHelper::GetWindow( m_xContainerWindow );
699 18797 : if ( pContainerWindow )
700 18797 : aContainerWinSize = pContainerWindow->GetOutputSizePixel();
701 :
702 18797 : return aContainerWinSize;
703 : }
704 :
705 10980 : Reference< XUIElement > LayoutManager::implts_createElement( const OUString& aName )
706 : {
707 10980 : Reference< ui::XUIElement > xUIElement;
708 :
709 21960 : SolarMutexGuard g;
710 21960 : Sequence< PropertyValue > aPropSeq( 2 );
711 10980 : aPropSeq[0].Name = "Frame";
712 10980 : aPropSeq[0].Value <<= m_xFrame;
713 10980 : aPropSeq[1].Name = "Persistent";
714 10980 : aPropSeq[1].Value <<= sal_True;
715 :
716 : try
717 : {
718 10980 : xUIElement = m_xUIElementFactoryManager->createUIElement( aName, aPropSeq );
719 : }
720 0 : catch (const NoSuchElementException&)
721 : {
722 : }
723 0 : catch (const IllegalArgumentException&)
724 : {
725 : }
726 :
727 21960 : return xUIElement;
728 : }
729 :
730 10 : void LayoutManager::implts_setVisibleState( bool bShow )
731 : {
732 10 : SolarMutexClearableGuard aWriteLock;
733 10 : m_aStatusBarElement.m_bMasterHide = !bShow;
734 10 : aWriteLock.clear();
735 :
736 10 : implts_updateUIElementsVisibleState( bShow );
737 10 : }
738 :
739 5506 : void LayoutManager::implts_updateUIElementsVisibleState( bool bSetVisible )
740 : {
741 : // notify listeners
742 5506 : uno::Any a;
743 5506 : if ( bSetVisible )
744 5494 : implts_notifyListeners( frame::LayoutManagerEvents::VISIBLE, a );
745 : else
746 12 : implts_notifyListeners( frame::LayoutManagerEvents::INVISIBLE, a );
747 :
748 11012 : SolarMutexResettableGuard aWriteLock;
749 11012 : Reference< XUIElement > xMenuBar( m_xMenuBar, UNO_QUERY );
750 11012 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
751 11012 : Reference< XComponent > xInplaceMenuBar( m_xInplaceMenuBar );
752 5506 : MenuBarManager* pInplaceMenuBar( m_pInplaceMenuBar );
753 5506 : aWriteLock.clear();
754 :
755 5506 : if (( xMenuBar.is() || xInplaceMenuBar.is() ) && xContainerWindow.is() )
756 : {
757 1664 : SolarMutexGuard aGuard;
758 :
759 1664 : MenuBar* pMenuBar( 0 );
760 1664 : if ( xInplaceMenuBar.is() )
761 2 : pMenuBar = static_cast<MenuBar *>(pInplaceMenuBar->GetMenuBar());
762 : else
763 : {
764 1662 : MenuBarWrapper* pMenuBarWrapper = (static_cast< MenuBarWrapper* >(xMenuBar.get()) );
765 1662 : pMenuBar = static_cast<MenuBar *>(pMenuBarWrapper->GetMenuBarManager()->GetMenuBar());
766 : }
767 :
768 1664 : SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow );
769 1664 : if ( pSysWindow )
770 : {
771 1664 : if ( bSetVisible )
772 1660 : pSysWindow->SetMenuBar(pMenuBar, m_xFrame);
773 : else
774 4 : pSysWindow->SetMenuBar( 0 );
775 1664 : }
776 : }
777 :
778 : bool bMustDoLayout;
779 : // Hide/show the statusbar according to bSetVisible
780 5506 : if ( bSetVisible )
781 5494 : bMustDoLayout = !implts_showStatusBar();
782 : else
783 12 : bMustDoLayout = !implts_hideStatusBar();
784 :
785 5506 : aWriteLock.reset();
786 5506 : ToolbarLayoutManager* pToolbarManager( m_pToolbarManager );
787 5506 : aWriteLock.clear();
788 :
789 5506 : if ( pToolbarManager )
790 : {
791 5506 : pToolbarManager->setVisible( bSetVisible );
792 5506 : bMustDoLayout = pToolbarManager->isLayoutDirty();
793 : }
794 :
795 5506 : if ( bMustDoLayout )
796 11008 : implts_doLayout_notify( false );
797 5506 : }
798 :
799 0 : void LayoutManager::implts_setCurrentUIVisibility( bool bShow )
800 : {
801 0 : SolarMutexClearableGuard aWriteLock;
802 0 : if ( !bShow && m_aStatusBarElement.m_bVisible && m_aStatusBarElement.m_xUIElement.is() )
803 0 : m_aStatusBarElement.m_bMasterHide = true;
804 0 : else if ( bShow && m_aStatusBarElement.m_bVisible )
805 0 : m_aStatusBarElement.m_bMasterHide = false;
806 0 : aWriteLock.clear();
807 :
808 0 : implts_updateUIElementsVisibleState( bShow );
809 0 : }
810 :
811 11136 : void LayoutManager::implts_destroyStatusBar()
812 : {
813 11136 : Reference< XComponent > xCompStatusBar;
814 :
815 22272 : SolarMutexClearableGuard aWriteLock;
816 11136 : m_aStatusBarElement.m_aName = OUString();
817 11136 : xCompStatusBar = Reference< XComponent >( m_aStatusBarElement.m_xUIElement, UNO_QUERY );
818 11136 : m_aStatusBarElement.m_xUIElement.clear();
819 11136 : aWriteLock.clear();
820 :
821 11136 : if ( xCompStatusBar.is() )
822 5502 : xCompStatusBar->dispose();
823 :
824 22272 : implts_destroyProgressBar();
825 11136 : }
826 :
827 11983 : void LayoutManager::implts_createStatusBar( const OUString& aStatusBarName )
828 : {
829 11983 : SolarMutexClearableGuard aWriteLock;
830 11983 : if ( !m_aStatusBarElement.m_xUIElement.is() )
831 : {
832 5506 : implts_readStatusBarState( aStatusBarName );
833 5506 : m_aStatusBarElement.m_aName = aStatusBarName;
834 5506 : m_aStatusBarElement.m_xUIElement = implts_createElement( aStatusBarName );
835 : }
836 11983 : aWriteLock.clear();
837 :
838 11983 : implts_createProgressBar();
839 11983 : }
840 :
841 27207 : void LayoutManager::implts_readStatusBarState( const OUString& rStatusBarName )
842 : {
843 27207 : SolarMutexGuard g;
844 27207 : if ( !m_aStatusBarElement.m_bStateRead )
845 : {
846 : // Read persistent data for status bar if not yet read!
847 15232 : if ( implts_readWindowStateData( rStatusBarName, m_aStatusBarElement ))
848 5506 : m_aStatusBarElement.m_bStateRead = true;
849 27207 : }
850 27207 : }
851 :
852 22123 : void LayoutManager::implts_createProgressBar()
853 : {
854 22123 : Reference< XUIElement > xStatusBar;
855 44246 : Reference< XUIElement > xProgressBar;
856 44246 : Reference< XUIElement > xProgressBarBackup;
857 44246 : Reference< awt::XWindow > xContainerWindow;
858 :
859 44246 : SolarMutexResettableGuard aWriteLock;
860 22123 : xStatusBar = Reference< XUIElement >( m_aStatusBarElement.m_xUIElement, UNO_QUERY );
861 22123 : xProgressBar = Reference< XUIElement >( m_aProgressBarElement.m_xUIElement, UNO_QUERY );
862 22123 : xProgressBarBackup = m_xProgressBarBackup;
863 22123 : m_xProgressBarBackup.clear();
864 22123 : xContainerWindow = m_xContainerWindow;
865 22123 : aWriteLock.clear();
866 :
867 22123 : bool bRecycled = xProgressBarBackup.is();
868 22123 : ProgressBarWrapper* pWrapper = 0;
869 22123 : if ( bRecycled )
870 16 : pWrapper = static_cast<ProgressBarWrapper*>(xProgressBarBackup.get());
871 22107 : else if ( xProgressBar.is() )
872 16535 : pWrapper = static_cast<ProgressBarWrapper*>(xProgressBar.get());
873 : else
874 5572 : pWrapper = new ProgressBarWrapper();
875 :
876 22123 : if ( xStatusBar.is() )
877 : {
878 12627 : Reference< awt::XWindow > xWindow( xStatusBar->getRealInterface(), UNO_QUERY );
879 12627 : pWrapper->setStatusBar( xWindow );
880 : }
881 : else
882 : {
883 9496 : Reference< awt::XWindow > xStatusBarWindow = pWrapper->getStatusBar();
884 :
885 18992 : SolarMutexGuard aGuard;
886 9496 : vcl::Window* pStatusBarWnd = VCLUnoHelper::GetWindow( xStatusBarWindow );
887 9496 : if ( !pStatusBarWnd )
888 : {
889 5572 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xContainerWindow );
890 5572 : if ( pWindow )
891 : {
892 5572 : StatusBar* pStatusBar = new StatusBar( pWindow, WinBits( WB_LEFT | WB_3DLOOK ) );
893 5572 : Reference< awt::XWindow > xStatusBarWindow2( VCLUnoHelper::GetInterface( pStatusBar ));
894 5572 : pWrapper->setStatusBar( xStatusBarWindow2, true );
895 : }
896 9496 : }
897 : }
898 :
899 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
900 22123 : aWriteLock.reset();
901 44246 : m_aProgressBarElement.m_xUIElement = Reference< XUIElement >(
902 44246 : static_cast< cppu::OWeakObject* >( pWrapper ), UNO_QUERY );
903 22123 : aWriteLock.clear();
904 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
905 :
906 22123 : if ( bRecycled )
907 22139 : implts_showProgressBar();
908 22123 : }
909 :
910 11136 : void LayoutManager::implts_backupProgressBarWrapper()
911 : {
912 11136 : SolarMutexGuard g;
913 :
914 11136 : if (m_xProgressBarBackup.is())
915 16690 : return;
916 :
917 : // safe a backup copy of the current progress!
918 : // This copy will be used automatically inside createProgressBar() which is called
919 : // implictly from implts_doLayout() .-)
920 5582 : m_xProgressBarBackup = m_aProgressBarElement.m_xUIElement;
921 :
922 : // remove the relation between this old progress bar and our old status bar.
923 : // Otherwhise we work on disposed items ...
924 : // The internal used ProgressBarWrapper can handle a NULL reference.
925 5582 : if ( m_xProgressBarBackup.is() )
926 : {
927 5582 : ProgressBarWrapper* pWrapper = static_cast<ProgressBarWrapper*>(m_xProgressBarBackup.get());
928 5582 : if ( pWrapper )
929 5582 : pWrapper->setStatusBar( Reference< awt::XWindow >(), false );
930 : }
931 :
932 : // prevent us from dispose() the m_aProgressBarElement.m_xUIElement inside implts_reset()
933 5582 : m_aProgressBarElement.m_xUIElement.clear();
934 : }
935 :
936 11136 : void LayoutManager::implts_destroyProgressBar()
937 : {
938 : // dont remove the progressbar in general
939 : // We must reuse it if a new status bar is created later.
940 : // Of course there exists one backup only.
941 : // And further this backup will be released inside our dtor.
942 11136 : implts_backupProgressBarWrapper();
943 11136 : }
944 :
945 18469 : void LayoutManager::implts_setStatusBarPosSize( const ::Point& rPos, const ::Size& rSize )
946 : {
947 18469 : Reference< XUIElement > xStatusBar;
948 36938 : Reference< XUIElement > xProgressBar;
949 36938 : Reference< awt::XWindow > xContainerWindow;
950 :
951 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
952 36938 : SolarMutexClearableGuard aReadLock;
953 18469 : xStatusBar = Reference< XUIElement >( m_aStatusBarElement.m_xUIElement, UNO_QUERY );
954 18469 : xProgressBar = Reference< XUIElement >( m_aProgressBarElement.m_xUIElement, UNO_QUERY );
955 18469 : xContainerWindow = m_xContainerWindow;
956 :
957 36938 : Reference< awt::XWindow > xWindow;
958 18469 : if ( xStatusBar.is() )
959 13473 : xWindow = Reference< awt::XWindow >( xStatusBar->getRealInterface(), UNO_QUERY );
960 4996 : else if ( xProgressBar.is() )
961 : {
962 4996 : ProgressBarWrapper* pWrapper = static_cast<ProgressBarWrapper*>(xProgressBar.get());
963 4996 : if ( pWrapper )
964 4996 : xWindow = pWrapper->getStatusBar();
965 : }
966 18469 : aReadLock.clear();
967 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
968 :
969 18469 : if ( xWindow.is() )
970 : {
971 18469 : SolarMutexGuard aGuard;
972 18469 : vcl::Window* pParentWindow = VCLUnoHelper::GetWindow( xContainerWindow );
973 18469 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
974 18469 : if ( pParentWindow && ( pWindow && pWindow->GetType() == WINDOW_STATUSBAR ))
975 : {
976 18469 : vcl::Window* pOldParentWindow = pWindow->GetParent();
977 18469 : if ( pParentWindow != pOldParentWindow )
978 2 : pWindow->SetParent( pParentWindow );
979 18469 : static_cast<StatusBar *>(pWindow)->SetPosSizePixel( rPos, rSize );
980 18469 : }
981 18469 : }
982 18469 : }
983 :
984 4584 : bool LayoutManager::implts_showProgressBar()
985 : {
986 4584 : Reference< XUIElement > xStatusBar;
987 9168 : Reference< XUIElement > xProgressBar;
988 9168 : Reference< awt::XWindow > xWindow;
989 :
990 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
991 9168 : SolarMutexClearableGuard aWriteLock;
992 4584 : xStatusBar = Reference< XUIElement >( m_aStatusBarElement.m_xUIElement, UNO_QUERY );
993 4584 : xProgressBar = Reference< XUIElement >( m_aProgressBarElement.m_xUIElement, UNO_QUERY );
994 4584 : bool bVisible( m_bVisible );
995 :
996 4584 : m_aProgressBarElement.m_bVisible = true;
997 4584 : if ( bVisible )
998 : {
999 4584 : if ( xStatusBar.is() && !m_aStatusBarElement.m_bMasterHide )
1000 : {
1001 660 : xWindow = Reference< awt::XWindow >( xStatusBar->getRealInterface(), UNO_QUERY );
1002 : }
1003 3924 : else if ( xProgressBar.is() )
1004 : {
1005 3924 : ProgressBarWrapper* pWrapper = static_cast<ProgressBarWrapper*>(xProgressBar.get());
1006 3924 : if ( pWrapper )
1007 3924 : xWindow = pWrapper->getStatusBar();
1008 : }
1009 : }
1010 4584 : aWriteLock.clear();
1011 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
1012 :
1013 9168 : SolarMutexGuard aGuard;
1014 4584 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
1015 4584 : if ( pWindow )
1016 : {
1017 4584 : if ( !pWindow->IsVisible() )
1018 : {
1019 3866 : implts_setOffset( pWindow->GetSizePixel().Height() );
1020 3866 : pWindow->Show();
1021 3866 : implts_doLayout_notify( false );
1022 : }
1023 4584 : return true;
1024 : }
1025 :
1026 4584 : return false;
1027 : }
1028 :
1029 9732 : bool LayoutManager::implts_hideProgressBar()
1030 : {
1031 9732 : Reference< XUIElement > xProgressBar;
1032 19464 : Reference< awt::XWindow > xWindow;
1033 9732 : bool bHideStatusBar( false );
1034 :
1035 19464 : SolarMutexGuard g;
1036 9732 : xProgressBar = Reference< XUIElement >( m_aProgressBarElement.m_xUIElement, UNO_QUERY );
1037 :
1038 9732 : bool bInternalStatusBar( false );
1039 9732 : if ( xProgressBar.is() )
1040 : {
1041 9732 : Reference< awt::XWindow > xStatusBar;
1042 9732 : ProgressBarWrapper* pWrapper = static_cast<ProgressBarWrapper*>(xProgressBar.get());
1043 9732 : if ( pWrapper )
1044 9732 : xWindow = pWrapper->getStatusBar();
1045 19464 : Reference< ui::XUIElement > xStatusBarElement = m_aStatusBarElement.m_xUIElement;
1046 9732 : if ( xStatusBarElement.is() )
1047 6 : xStatusBar = Reference< awt::XWindow >( xStatusBarElement->getRealInterface(), UNO_QUERY );
1048 19464 : bInternalStatusBar = xStatusBar != xWindow;
1049 : }
1050 9732 : m_aProgressBarElement.m_bVisible = false;
1051 9732 : implts_readStatusBarState( STATUS_BAR_ALIAS );
1052 9732 : bHideStatusBar = !m_aStatusBarElement.m_bVisible;
1053 :
1054 9732 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
1055 9732 : if ( pWindow && pWindow->IsVisible() && ( bHideStatusBar || bInternalStatusBar ))
1056 : {
1057 3850 : implts_setOffset( 0 );
1058 3850 : pWindow->Hide();
1059 3850 : implts_doLayout_notify( false );
1060 3850 : return true;
1061 : }
1062 :
1063 15614 : return false;
1064 : }
1065 :
1066 5494 : bool LayoutManager::implts_showStatusBar( bool bStoreState )
1067 : {
1068 5494 : SolarMutexClearableGuard aWriteLock;
1069 10988 : Reference< ui::XUIElement > xStatusBar = m_aStatusBarElement.m_xUIElement;
1070 5494 : if ( bStoreState )
1071 0 : m_aStatusBarElement.m_bVisible = true;
1072 5494 : aWriteLock.clear();
1073 :
1074 5494 : if ( xStatusBar.is() )
1075 : {
1076 1660 : Reference< awt::XWindow > xWindow( xStatusBar->getRealInterface(), UNO_QUERY );
1077 :
1078 3314 : SolarMutexGuard aGuard;
1079 1660 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
1080 1660 : if ( pWindow && !pWindow->IsVisible() )
1081 : {
1082 6 : implts_setOffset( pWindow->GetSizePixel().Height() );
1083 6 : pWindow->Show();
1084 6 : implts_doLayout_notify( false );
1085 6 : return true;
1086 1654 : }
1087 : }
1088 :
1089 10982 : return false;
1090 : }
1091 :
1092 12 : bool LayoutManager::implts_hideStatusBar( bool bStoreState )
1093 : {
1094 12 : SolarMutexClearableGuard aWriteLock;
1095 24 : Reference< ui::XUIElement > xStatusBar = m_aStatusBarElement.m_xUIElement;
1096 12 : if ( bStoreState )
1097 0 : m_aStatusBarElement.m_bVisible = false;
1098 12 : aWriteLock.clear();
1099 :
1100 12 : if ( xStatusBar.is() )
1101 : {
1102 4 : Reference< awt::XWindow > xWindow( xStatusBar->getRealInterface(), UNO_QUERY );
1103 :
1104 4 : SolarMutexGuard aGuard;
1105 4 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
1106 4 : if ( pWindow && pWindow->IsVisible() )
1107 : {
1108 4 : implts_setOffset( 0 );
1109 4 : pWindow->Hide();
1110 4 : implts_doLayout_notify( false );
1111 4 : return true;
1112 0 : }
1113 : }
1114 :
1115 20 : return false;
1116 : }
1117 :
1118 26523 : void LayoutManager::implts_setOffset( const sal_Int32 nBottomOffset )
1119 : {
1120 26523 : ::Rectangle aOffsetRect;
1121 26523 : setZeroRectangle( aOffsetRect );
1122 26523 : aOffsetRect.setHeight( nBottomOffset );
1123 :
1124 26523 : if ( m_pToolbarManager )
1125 26523 : m_pToolbarManager->setDockingAreaOffsets( aOffsetRect );
1126 26523 : }
1127 :
1128 2 : void LayoutManager::implts_setInplaceMenuBar( const Reference< XIndexAccess >& xMergedMenuBar )
1129 : throw (uno::RuntimeException)
1130 : {
1131 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
1132 2 : SolarMutexClearableGuard aWriteLock;
1133 :
1134 2 : if ( !m_bInplaceMenuSet )
1135 : {
1136 2 : SolarMutexGuard aGuard;
1137 :
1138 : // Reset old inplace menubar!
1139 2 : m_pInplaceMenuBar = 0;
1140 2 : if ( m_xInplaceMenuBar.is() )
1141 0 : m_xInplaceMenuBar->dispose();
1142 2 : m_xInplaceMenuBar.clear();
1143 2 : m_bInplaceMenuSet = false;
1144 :
1145 2 : if ( m_xFrame.is() && m_xContainerWindow.is() )
1146 : {
1147 2 : OUString aModuleIdentifier;
1148 4 : Reference< XDispatchProvider > xDispatchProvider;
1149 :
1150 2 : MenuBar* pMenuBar = new MenuBar;
1151 2 : m_pInplaceMenuBar = new MenuBarManager( m_xContext, m_xFrame, m_xURLTransformer, xDispatchProvider, aModuleIdentifier, pMenuBar, true, true );
1152 2 : m_pInplaceMenuBar->SetItemContainer( xMergedMenuBar );
1153 :
1154 2 : SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow );
1155 2 : if ( pSysWindow )
1156 2 : pSysWindow->SetMenuBar(pMenuBar, m_xFrame);
1157 :
1158 2 : m_bInplaceMenuSet = true;
1159 4 : m_xInplaceMenuBar = Reference< XComponent >( (OWeakObject *)m_pInplaceMenuBar, UNO_QUERY );
1160 : }
1161 :
1162 2 : aWriteLock.clear();
1163 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
1164 :
1165 2 : implts_updateMenuBarClose();
1166 2 : }
1167 2 : }
1168 :
1169 2 : void LayoutManager::implts_resetInplaceMenuBar()
1170 : throw (uno::RuntimeException)
1171 : {
1172 2 : SolarMutexGuard g;
1173 2 : m_bInplaceMenuSet = false;
1174 :
1175 2 : if ( m_xContainerWindow.is() )
1176 : {
1177 2 : SolarMutexGuard aGuard;
1178 2 : MenuBarWrapper* pMenuBarWrapper = (static_cast< MenuBarWrapper* >(m_xMenuBar.get()) );
1179 2 : SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow );
1180 2 : if ( pSysWindow )
1181 : {
1182 2 : if ( pMenuBarWrapper )
1183 0 : pSysWindow->SetMenuBar(static_cast<MenuBar *>(pMenuBarWrapper->GetMenuBarManager()->GetMenuBar()), m_xFrame);
1184 : else
1185 2 : pSysWindow->SetMenuBar(0);
1186 2 : }
1187 : }
1188 :
1189 : // Remove inplace menu bar
1190 2 : m_pInplaceMenuBar = 0;
1191 2 : if ( m_xInplaceMenuBar.is() )
1192 0 : m_xInplaceMenuBar->dispose();
1193 2 : m_xInplaceMenuBar.clear();
1194 2 : }
1195 :
1196 11142 : void SAL_CALL LayoutManager::attachFrame( const Reference< XFrame >& xFrame )
1197 : throw (uno::RuntimeException, std::exception)
1198 : {
1199 11142 : SolarMutexGuard g;
1200 11142 : m_xFrame = xFrame;
1201 11142 : }
1202 :
1203 2 : void SAL_CALL LayoutManager::reset()
1204 : throw (RuntimeException, std::exception)
1205 : {
1206 2 : implts_reset( true );
1207 2 : }
1208 :
1209 : // XMenuBarMergingAcceptor
1210 :
1211 2 : sal_Bool SAL_CALL LayoutManager::setMergedMenuBar(
1212 : const Reference< XIndexAccess >& xMergedMenuBar )
1213 : throw (uno::RuntimeException, std::exception)
1214 : {
1215 2 : implts_setInplaceMenuBar( xMergedMenuBar );
1216 :
1217 2 : uno::Any a;
1218 2 : implts_notifyListeners( frame::LayoutManagerEvents::MERGEDMENUBAR, a );
1219 2 : return sal_True;
1220 : }
1221 :
1222 2 : void SAL_CALL LayoutManager::removeMergedMenuBar()
1223 : throw (uno::RuntimeException, std::exception)
1224 : {
1225 2 : implts_resetInplaceMenuBar();
1226 2 : }
1227 :
1228 2 : awt::Rectangle SAL_CALL LayoutManager::getCurrentDockingArea()
1229 : throw ( RuntimeException, std::exception )
1230 : {
1231 2 : SolarMutexGuard g;
1232 2 : return m_aDockingArea;
1233 : }
1234 :
1235 4 : Reference< XDockingAreaAcceptor > SAL_CALL LayoutManager::getDockingAreaAcceptor()
1236 : throw (uno::RuntimeException, std::exception)
1237 : {
1238 4 : SolarMutexGuard g;
1239 4 : return m_xDockingAreaAcceptor;
1240 : }
1241 :
1242 16680 : void SAL_CALL LayoutManager::setDockingAreaAcceptor( const Reference< ui::XDockingAreaAcceptor >& xDockingAreaAcceptor )
1243 : throw ( RuntimeException, std::exception )
1244 : {
1245 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
1246 16680 : SolarMutexClearableGuard aWriteLock;
1247 :
1248 16680 : if (( m_xDockingAreaAcceptor == xDockingAreaAcceptor ) || !m_xFrame.is() )
1249 22216 : return;
1250 :
1251 : // IMPORTANT: Be sure to stop layout timer if don't have a docking area acceptor!
1252 11144 : if ( !xDockingAreaAcceptor.is() )
1253 5568 : m_aAsyncLayoutTimer.Stop();
1254 :
1255 11144 : bool bAutomaticToolbars( m_bAutomaticToolbars );
1256 22288 : std::vector< Reference< awt::XWindow > > oldDockingAreaWindows;
1257 :
1258 11144 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1259 :
1260 11144 : if ( !xDockingAreaAcceptor.is() )
1261 5568 : m_aAsyncLayoutTimer.Stop();
1262 :
1263 : // Remove listener from old docking area acceptor
1264 11144 : if ( m_xDockingAreaAcceptor.is() )
1265 : {
1266 5570 : Reference< awt::XWindow > xWindow( m_xDockingAreaAcceptor->getContainerWindow() );
1267 5570 : if ( xWindow.is() && ( m_xFrame->getContainerWindow() != m_xContainerWindow || !xDockingAreaAcceptor.is() ) )
1268 5568 : xWindow->removeWindowListener( Reference< awt::XWindowListener >( static_cast< OWeakObject * >( this ), UNO_QUERY ));
1269 :
1270 5570 : m_aDockingArea = awt::Rectangle();
1271 5570 : if ( pToolbarManager )
1272 5570 : pToolbarManager->resetDockingArea();
1273 :
1274 5570 : vcl::Window* pContainerWindow = VCLUnoHelper::GetWindow( xWindow );
1275 5570 : if ( pContainerWindow )
1276 5570 : pContainerWindow->RemoveChildEventListener( LINK( this, LayoutManager, WindowEventListener ) );
1277 : }
1278 :
1279 22288 : Reference< ui::XDockingAreaAcceptor > xOldDockingAreaAcceptor( m_xDockingAreaAcceptor );
1280 11144 : m_xDockingAreaAcceptor = xDockingAreaAcceptor;
1281 11144 : if ( m_xDockingAreaAcceptor.is() )
1282 : {
1283 5576 : m_aDockingArea = awt::Rectangle();
1284 5576 : m_xContainerWindow = m_xDockingAreaAcceptor->getContainerWindow();
1285 5576 : m_xContainerTopWindow.set( m_xContainerWindow, UNO_QUERY );
1286 5576 : m_xContainerWindow->addWindowListener( Reference< awt::XWindowListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
1287 :
1288 : // we always must keep a connection to the window of our frame for resize events
1289 5576 : if ( m_xContainerWindow != m_xFrame->getContainerWindow() )
1290 2 : m_xFrame->getContainerWindow()->addWindowListener( Reference< awt::XWindowListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
1291 :
1292 : // #i37884# set initial visibility state - in the plugin case the container window is already shown
1293 : // and we get no notification anymore
1294 : {
1295 5576 : SolarMutexGuard aGuard;
1296 5576 : vcl::Window* pContainerWindow = VCLUnoHelper::GetWindow( m_xContainerWindow );
1297 5576 : if( pContainerWindow )
1298 5576 : m_bParentWindowVisible = pContainerWindow->IsVisible();
1299 : }
1300 :
1301 5576 : uno::Reference< awt::XWindowPeer > xParent( m_xContainerWindow, UNO_QUERY );
1302 : }
1303 :
1304 11144 : aWriteLock.clear();
1305 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
1306 :
1307 11144 : if ( xDockingAreaAcceptor.is() )
1308 : {
1309 5576 : SolarMutexGuard aGuard;
1310 :
1311 : // Add layout manager as listener to get notifications about toolbar button activties
1312 5576 : vcl::Window* pContainerWindow = VCLUnoHelper::GetWindow( m_xContainerWindow );
1313 5576 : if ( pContainerWindow )
1314 5576 : pContainerWindow->AddChildEventListener( LINK( this, LayoutManager, WindowEventListener ) );
1315 :
1316 : // We have now a new container window, reparent all child windows!
1317 5576 : implts_reparentChildWindows();
1318 : }
1319 : else
1320 5568 : implts_destroyElements(); // remove all elements
1321 :
1322 11144 : if ( !oldDockingAreaWindows.empty() )
1323 : {
1324 : // Reset docking area size for our old docking area acceptor
1325 0 : awt::Rectangle aEmptyRect;
1326 0 : xOldDockingAreaAcceptor->setDockingAreaSpace( aEmptyRect );
1327 : }
1328 :
1329 11144 : if ( pToolbarManager && xDockingAreaAcceptor.is() )
1330 : {
1331 5576 : if ( bAutomaticToolbars )
1332 : {
1333 5576 : lock();
1334 5576 : pToolbarManager->createStaticToolbars();
1335 5576 : unlock();
1336 : }
1337 5576 : implts_doLayout( true, false );
1338 11144 : }
1339 : }
1340 :
1341 5576 : void LayoutManager::implts_reparentChildWindows()
1342 : {
1343 5576 : SolarMutexResettableGuard aWriteLock;
1344 11152 : UIElement aStatusBarElement = m_aStatusBarElement;
1345 11152 : uno::Reference< awt::XWindow > xContainerWindow = m_xContainerWindow;
1346 5576 : aWriteLock.clear();
1347 :
1348 11152 : uno::Reference< awt::XWindow > xStatusBarWindow;
1349 5576 : if ( aStatusBarElement.m_xUIElement.is() )
1350 : {
1351 : try
1352 : {
1353 0 : xStatusBarWindow = Reference< awt::XWindow >( aStatusBarElement.m_xUIElement->getRealInterface(), UNO_QUERY );
1354 : }
1355 0 : catch (const RuntimeException&)
1356 : {
1357 0 : throw;
1358 : }
1359 0 : catch (const Exception&)
1360 : {
1361 : }
1362 : }
1363 :
1364 5576 : if ( xStatusBarWindow.is() )
1365 : {
1366 0 : SolarMutexGuard aGuard;
1367 0 : vcl::Window* pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow );
1368 0 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xStatusBarWindow );
1369 0 : if ( pWindow && pContainerWindow )
1370 0 : pWindow->SetParent( pContainerWindow );
1371 : }
1372 :
1373 5576 : implts_resetMenuBar();
1374 :
1375 5576 : aWriteLock.reset();
1376 5576 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1377 5576 : if ( pToolbarManager )
1378 5576 : pToolbarManager->setParentWindow( uno::Reference< awt::XWindowPeer >( xContainerWindow, uno::UNO_QUERY ));
1379 11152 : aWriteLock.clear();
1380 5576 : }
1381 :
1382 0 : uno::Reference< ui::XUIElement > LayoutManager::implts_createDockingWindow( const OUString& aElementName )
1383 : {
1384 0 : Reference< XUIElement > xUIElement = implts_createElement( aElementName );
1385 0 : return xUIElement;
1386 : }
1387 :
1388 10125950 : IMPL_LINK( LayoutManager, WindowEventListener, VclSimpleEvent*, pEvent )
1389 : {
1390 5062975 : long nResult( 1 );
1391 :
1392 5062975 : if ( pEvent && pEvent->ISA( VclWindowEvent ))
1393 : {
1394 5062975 : vcl::Window* pWindow = static_cast< VclWindowEvent* >(pEvent)->GetWindow();
1395 5062975 : if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX )
1396 : {
1397 1552712 : SolarMutexClearableGuard aReadLock;
1398 1552712 : ToolbarLayoutManager* pToolbarManager( m_pToolbarManager );
1399 1552712 : aReadLock.clear();
1400 :
1401 1552712 : if ( pToolbarManager )
1402 1552712 : nResult = pToolbarManager->childWindowEvent( pEvent );
1403 : }
1404 : }
1405 :
1406 5062975 : return nResult;
1407 : }
1408 :
1409 27731 : void SAL_CALL LayoutManager::createElement( const OUString& aName )
1410 : throw (RuntimeException, std::exception)
1411 : {
1412 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::createElement" );
1413 :
1414 27731 : SolarMutexClearableGuard aReadLock;
1415 55462 : Reference< XFrame > xFrame = m_xFrame;
1416 55462 : Reference< XURLTransformer > xURLTransformer = m_xURLTransformer;
1417 27731 : bool bInPlaceMenu = m_bInplaceMenuSet;
1418 27731 : aReadLock.clear();
1419 :
1420 27731 : if ( !xFrame.is() )
1421 27731 : return;
1422 :
1423 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
1424 55462 : SolarMutexClearableGuard aWriteLock;
1425 :
1426 27731 : bool bMustBeLayouted( false );
1427 27731 : bool bNotify( false );
1428 :
1429 : bool bPreviewFrame;
1430 27731 : if (m_pToolbarManager)
1431 : // Assumes that we created the ToolbarLayoutManager with our frame, if
1432 : // not then we're somewhat fouled up ...
1433 27731 : bPreviewFrame = m_pToolbarManager->isPreviewFrame();
1434 : else
1435 : {
1436 0 : Reference< XModel > xModel( impl_getModelFromFrame( xFrame ) );
1437 0 : bPreviewFrame = implts_isPreviewModel( xModel );
1438 : }
1439 :
1440 27731 : if ( m_xContainerWindow.is() && !bPreviewFrame ) // no UI elements on preview frames
1441 : {
1442 27731 : OUString aElementType;
1443 55462 : OUString aElementName;
1444 :
1445 27731 : parseResourceURL( aName, aElementType, aElementName );
1446 :
1447 27731 : if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ) && m_pToolbarManager != NULL )
1448 : {
1449 132 : bNotify = m_pToolbarManager->createToolbar( aName );
1450 132 : bMustBeLayouted = m_pToolbarManager->isLayoutDirty();
1451 : }
1452 33075 : else if ( aElementType.equalsIgnoreAsciiCase("menubar") &&
1453 5476 : aElementName.equalsIgnoreAsciiCase("menubar") )
1454 : {
1455 : // #i38743# don't create a menubar if frame isn't top
1456 5474 : if ( !bInPlaceMenu && !m_xMenuBar.is() && implts_isFrameOrWindowTop( xFrame ))
1457 : {
1458 5474 : m_xMenuBar = implts_createElement( aName );
1459 5474 : if ( m_xMenuBar.is() )
1460 : {
1461 5474 : SolarMutexGuard aGuard;
1462 :
1463 5474 : SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow );
1464 5474 : if ( pSysWindow )
1465 : {
1466 5474 : Reference< awt::XMenuBar > xMenuBar;
1467 :
1468 10948 : Reference< XPropertySet > xPropSet( m_xMenuBar, UNO_QUERY );
1469 5474 : if ( xPropSet.is() )
1470 : {
1471 : try
1472 : {
1473 5474 : xPropSet->getPropertyValue("XMenuBar") >>= xMenuBar;
1474 : }
1475 0 : catch (const beans::UnknownPropertyException&)
1476 : {
1477 : }
1478 0 : catch (const lang::WrappedTargetException&)
1479 : {
1480 : }
1481 : }
1482 :
1483 5474 : if ( xMenuBar.is() )
1484 : {
1485 5474 : VCLXMenu* pAwtMenuBar = VCLXMenu::GetImplementation( xMenuBar );
1486 5474 : if ( pAwtMenuBar )
1487 : {
1488 5474 : MenuBar* pMenuBar = static_cast<MenuBar*>(pAwtMenuBar->GetMenu());
1489 5474 : if ( pMenuBar )
1490 : {
1491 5474 : pSysWindow->SetMenuBar(pMenuBar, m_xFrame);
1492 5474 : pMenuBar->SetDisplayable( m_bMenuVisible );
1493 5474 : if ( m_bMenuVisible )
1494 5474 : bNotify = true;
1495 5474 : implts_updateMenuBarClose();
1496 : }
1497 : }
1498 5474 : }
1499 5474 : }
1500 : }
1501 : }
1502 5474 : aWriteLock.clear();
1503 : }
1504 46091 : else if ( aElementType.equalsIgnoreAsciiCase("statusbar") &&
1505 11985 : ( implts_isFrameOrWindowTop(xFrame) || implts_isEmbeddedLayoutManager() ))
1506 : {
1507 11983 : implts_createStatusBar( aName );
1508 11983 : bNotify = true;
1509 : }
1510 30424 : else if ( aElementType.equalsIgnoreAsciiCase("progressbar") &&
1511 20282 : aElementName.equalsIgnoreAsciiCase("progressbar") &&
1512 10140 : implts_isFrameOrWindowTop(xFrame) )
1513 : {
1514 10140 : implts_createProgressBar();
1515 10140 : bNotify = true;
1516 : }
1517 2 : else if ( aElementType.equalsIgnoreAsciiCase("dockingwindow"))
1518 : {
1519 : // Add layout manager as listener for docking and other window events
1520 0 : uno::Reference< uno::XInterface > xThis( static_cast< OWeakObject* >(this), uno::UNO_QUERY );
1521 0 : uno::Reference< ui::XUIElement > xUIElement( implts_createDockingWindow( aName ));
1522 :
1523 0 : if ( xUIElement.is() )
1524 : {
1525 0 : impl_addWindowListeners( xThis, xUIElement );
1526 0 : }
1527 :
1528 : // The docking window is created by a factory method located in the sfx2 library.
1529 : // CreateDockingWindow( xFrame, aElementName );
1530 27731 : }
1531 : }
1532 :
1533 27731 : if ( bMustBeLayouted )
1534 126 : implts_doLayout_notify( true );
1535 :
1536 27731 : if ( bNotify )
1537 : {
1538 : // UI element is invisible - provide information to listeners
1539 27627 : implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_VISIBLE, uno::makeAny( aName ) );
1540 27731 : }
1541 : }
1542 :
1543 12005 : void SAL_CALL LayoutManager::destroyElement( const OUString& aName )
1544 : throw (RuntimeException, std::exception)
1545 : {
1546 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::destroyElement" );
1547 :
1548 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
1549 12005 : SolarMutexClearableGuard aWriteLock;
1550 :
1551 12005 : bool bMustBeLayouted( false );
1552 12005 : bool bNotify( false );
1553 24010 : OUString aElementType;
1554 24010 : OUString aElementName;
1555 :
1556 24010 : Reference< XComponent > xComponent;
1557 12005 : parseResourceURL( aName, aElementType, aElementName );
1558 :
1559 12007 : if ( aElementType.equalsIgnoreAsciiCase("menubar") &&
1560 2 : aElementName.equalsIgnoreAsciiCase("menubar") )
1561 : {
1562 0 : if ( !m_bInplaceMenuSet )
1563 : {
1564 0 : impl_clearUpMenuBar();
1565 0 : m_xMenuBar.clear();
1566 0 : bNotify = true;
1567 : }
1568 : }
1569 24010 : else if (( aElementType.equalsIgnoreAsciiCase("statusbar") &&
1570 24010 : aElementName.equalsIgnoreAsciiCase("statusbar") ) ||
1571 12005 : ( m_aStatusBarElement.m_aName == aName ))
1572 : {
1573 0 : aWriteLock.clear();
1574 0 : implts_destroyStatusBar();
1575 0 : bMustBeLayouted = true;
1576 0 : bNotify = true;
1577 : }
1578 12005 : else if ( aElementType.equalsIgnoreAsciiCase("progressbar") &&
1579 0 : aElementName.equalsIgnoreAsciiCase("progressbar") )
1580 : {
1581 0 : aWriteLock.clear();
1582 0 : implts_createProgressBar();
1583 0 : bMustBeLayouted = true;
1584 0 : bNotify = true;
1585 : }
1586 12005 : else if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ) && m_pToolbarManager != NULL )
1587 : {
1588 11997 : aWriteLock.clear();
1589 11997 : bNotify = m_pToolbarManager->destroyToolbar( aName );
1590 11997 : bMustBeLayouted = m_pToolbarManager->isLayoutDirty();
1591 : }
1592 8 : else if ( aElementType.equalsIgnoreAsciiCase("dockingwindow"))
1593 : {
1594 0 : uno::Reference< frame::XFrame > xFrame( m_xFrame );
1595 0 : uno::Reference< XComponentContext > xContext( m_xContext );
1596 0 : aWriteLock.clear();
1597 :
1598 0 : impl_setDockingWindowVisibility( xContext, xFrame, aElementName, false );
1599 0 : bMustBeLayouted = false;
1600 0 : bNotify = false;
1601 : }
1602 12005 : aWriteLock.clear();
1603 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
1604 :
1605 12005 : if ( bMustBeLayouted )
1606 2047 : doLayout();
1607 :
1608 12005 : if ( bNotify )
1609 24002 : implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_INVISIBLE, uno::makeAny( aName ) );
1610 12005 : }
1611 :
1612 64887 : sal_Bool SAL_CALL LayoutManager::requestElement( const OUString& rResourceURL )
1613 : throw (uno::RuntimeException, std::exception)
1614 : {
1615 64887 : bool bResult( false );
1616 64887 : bool bNotify( false );
1617 64887 : OUString aElementType;
1618 129774 : OUString aElementName;
1619 :
1620 64887 : parseResourceURL( rResourceURL, aElementType, aElementName );
1621 :
1622 129774 : SolarMutexClearableGuard aWriteLock;
1623 :
1624 129774 : OString aResName = OUStringToOString( aElementName, RTL_TEXTENCODING_ASCII_US );
1625 : SAL_INFO( "fwk", "framework (cd100003) Element " << aResName.getStr() << " requested." );
1626 :
1627 141743 : if (( aElementType.equalsIgnoreAsciiCase("statusbar") &&
1628 117805 : aElementName.equalsIgnoreAsciiCase("statusbar") ) ||
1629 52918 : ( m_aStatusBarElement.m_aName == rResourceURL ))
1630 : {
1631 11969 : implts_readStatusBarState( rResourceURL );
1632 11969 : if ( m_aStatusBarElement.m_bVisible && !m_aStatusBarElement.m_bMasterHide )
1633 : {
1634 11965 : aWriteLock.clear();
1635 11965 : createElement( rResourceURL );
1636 :
1637 : // There are some situation where we are not able to create an element.
1638 : // Therefore we have to check the reference before further action.
1639 : // See #i70019#
1640 11965 : uno::Reference< ui::XUIElement > xUIElement( m_aStatusBarElement.m_xUIElement );
1641 11965 : if ( xUIElement.is() )
1642 : {
1643 : // we need VCL here to pass special flags to Show()
1644 11965 : SolarMutexGuard aGuard;
1645 23930 : Reference< awt::XWindow > xWindow( xUIElement->getRealInterface(), UNO_QUERY );
1646 11965 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
1647 11965 : if ( pWindow )
1648 : {
1649 11965 : pWindow->Show( true, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE );
1650 11965 : bResult = true;
1651 11965 : bNotify = true;
1652 11965 : }
1653 11965 : }
1654 : }
1655 : }
1656 52918 : else if ( aElementType.equalsIgnoreAsciiCase("progressbar") &&
1657 0 : aElementName.equalsIgnoreAsciiCase("progressbar") )
1658 : {
1659 0 : aWriteLock.clear();
1660 0 : implts_showProgressBar();
1661 0 : bResult = true;
1662 0 : bNotify = true;
1663 : }
1664 52918 : else if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ) && m_bVisible )
1665 : {
1666 52878 : bool bComponentAttached( !m_aModuleIdentifier.isEmpty() );
1667 52878 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1668 52878 : aWriteLock.clear();
1669 :
1670 52878 : if ( pToolbarManager && bComponentAttached )
1671 : {
1672 52878 : bNotify = pToolbarManager->requestToolbar( rResourceURL );
1673 : }
1674 : }
1675 40 : else if ( aElementType.equalsIgnoreAsciiCase("dockingwindow"))
1676 : {
1677 0 : uno::Reference< frame::XFrame > xFrame( m_xFrame );
1678 0 : aWriteLock.clear();
1679 :
1680 0 : CreateDockingWindow( xFrame, aElementName );
1681 : }
1682 :
1683 64887 : if ( bNotify )
1684 31642 : implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_VISIBLE, uno::makeAny( rResourceURL ) );
1685 :
1686 129774 : return bResult;
1687 : }
1688 :
1689 10164 : Reference< XUIElement > SAL_CALL LayoutManager::getElement( const OUString& aName )
1690 : throw (RuntimeException, std::exception)
1691 : {
1692 10164 : Reference< XUIElement > xUIElement = implts_findElement( aName );
1693 10164 : if ( !xUIElement.is() )
1694 : {
1695 22 : SolarMutexClearableGuard aReadLock;
1696 22 : ToolbarLayoutManager* pToolbarManager( m_pToolbarManager );
1697 22 : aReadLock.clear();
1698 :
1699 22 : if ( pToolbarManager )
1700 22 : xUIElement = pToolbarManager->getToolbar( aName );
1701 : }
1702 :
1703 10164 : return xUIElement;
1704 : }
1705 :
1706 4 : Sequence< Reference< ui::XUIElement > > SAL_CALL LayoutManager::getElements()
1707 : throw (uno::RuntimeException, std::exception)
1708 : {
1709 4 : SolarMutexClearableGuard aReadLock;
1710 8 : uno::Reference< ui::XUIElement > xMenuBar( m_xMenuBar );
1711 8 : uno::Reference< ui::XUIElement > xStatusBar( m_aStatusBarElement.m_xUIElement );
1712 4 : ToolbarLayoutManager* pToolbarManager( m_pToolbarManager );
1713 4 : aReadLock.clear();
1714 :
1715 4 : Sequence< Reference< ui::XUIElement > > aSeq;
1716 4 : if ( pToolbarManager )
1717 4 : aSeq = pToolbarManager->getToolbars();
1718 :
1719 4 : sal_Int32 nSize = aSeq.getLength();
1720 4 : sal_Int32 nMenuBarIndex(-1);
1721 4 : sal_Int32 nStatusBarIndex(-1);
1722 4 : if ( xMenuBar.is() )
1723 : {
1724 2 : nMenuBarIndex = nSize;
1725 2 : ++nSize;
1726 : }
1727 4 : if ( xStatusBar.is() )
1728 : {
1729 2 : nStatusBarIndex = nSize;
1730 2 : ++nSize;
1731 : }
1732 :
1733 4 : aSeq.realloc(nSize);
1734 4 : if ( nMenuBarIndex >= 0 )
1735 2 : aSeq[nMenuBarIndex] = xMenuBar;
1736 4 : if ( nStatusBarIndex >= 0 )
1737 2 : aSeq[nStatusBarIndex] = xStatusBar;
1738 :
1739 8 : return aSeq;
1740 : }
1741 :
1742 4576 : sal_Bool SAL_CALL LayoutManager::showElement( const OUString& aName )
1743 : throw (RuntimeException, std::exception)
1744 : {
1745 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::showElement" );
1746 :
1747 4576 : bool bResult( false );
1748 4576 : bool bNotify( false );
1749 4576 : bool bMustLayout( false );
1750 4576 : OUString aElementType;
1751 9152 : OUString aElementName;
1752 :
1753 4576 : parseResourceURL( aName, aElementType, aElementName );
1754 :
1755 9152 : OString aResName = OUStringToOString( aElementName, RTL_TEXTENCODING_ASCII_US );
1756 : SAL_INFO( "fwk", "framework (cd100003) Element " << aResName.getStr() );
1757 :
1758 4578 : if ( aElementType.equalsIgnoreAsciiCase("menubar") &&
1759 2 : aElementName.equalsIgnoreAsciiCase("menubar") )
1760 : {
1761 0 : SolarMutexClearableGuard aWriteLock;
1762 0 : m_bMenuVisible = true;
1763 0 : aWriteLock.clear();
1764 :
1765 0 : bResult = implts_resetMenuBar();
1766 0 : bNotify = bResult;
1767 : }
1768 9152 : else if (( aElementType.equalsIgnoreAsciiCase("statusbar") &&
1769 9152 : aElementName.equalsIgnoreAsciiCase("statusbar") ) ||
1770 4576 : ( m_aStatusBarElement.m_aName == aName ))
1771 : {
1772 0 : SolarMutexClearableGuard aWriteLock;
1773 0 : if ( m_aStatusBarElement.m_xUIElement.is() && !m_aStatusBarElement.m_bMasterHide &&
1774 0 : implts_showStatusBar( true ))
1775 : {
1776 0 : aWriteLock.clear();
1777 :
1778 0 : implts_writeWindowStateData( STATUS_BAR_ALIAS, m_aStatusBarElement );
1779 0 : bMustLayout = true;
1780 0 : bResult = true;
1781 0 : bNotify = true;
1782 0 : }
1783 : }
1784 9144 : else if ( aElementType.equalsIgnoreAsciiCase("progressbar") &&
1785 4568 : aElementName.equalsIgnoreAsciiCase("progressbar") )
1786 : {
1787 4568 : bNotify = bResult = implts_showProgressBar();
1788 : }
1789 8 : else if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
1790 : {
1791 6 : SolarMutexClearableGuard aReadLock;
1792 6 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1793 6 : aReadLock.clear();
1794 :
1795 6 : if ( pToolbarManager )
1796 : {
1797 6 : bNotify = pToolbarManager->showToolbar( aName );
1798 6 : bMustLayout = pToolbarManager->isLayoutDirty();
1799 6 : }
1800 : }
1801 2 : else if ( aElementType.equalsIgnoreAsciiCase("dockingwindow"))
1802 : {
1803 0 : SolarMutexClearableGuard aReadGuard;
1804 0 : uno::Reference< frame::XFrame > xFrame( m_xFrame );
1805 0 : uno::Reference< XComponentContext > xContext( m_xContext );
1806 0 : aReadGuard.clear();
1807 :
1808 0 : impl_setDockingWindowVisibility( xContext, xFrame, aElementName, true );
1809 : }
1810 2 : else if ( aElementType.equalsIgnoreAsciiCase("toolpanel"))
1811 : {
1812 0 : SolarMutexClearableGuard aReadGuard;
1813 0 : uno::Reference< frame::XFrame > xFrame( m_xFrame );
1814 0 : aReadGuard.clear();
1815 0 : ActivateToolPanel( m_xFrame, aName );
1816 : }
1817 :
1818 4576 : if ( bMustLayout )
1819 6 : doLayout();
1820 :
1821 4576 : if ( bNotify )
1822 4574 : implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_VISIBLE, uno::makeAny( aName ) );
1823 :
1824 9152 : return bResult;
1825 : }
1826 :
1827 9734 : sal_Bool SAL_CALL LayoutManager::hideElement( const OUString& aName )
1828 : throw (RuntimeException, std::exception)
1829 : {
1830 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::hideElement" );
1831 :
1832 9734 : bool bNotify( false );
1833 9734 : bool bMustLayout( false );
1834 9734 : OUString aElementType;
1835 19468 : OUString aElementName;
1836 :
1837 9734 : parseResourceURL( aName, aElementType, aElementName );
1838 19468 : OString aResName = OUStringToOString( aElementName, RTL_TEXTENCODING_ASCII_US );
1839 : SAL_INFO( "fwk", "framework (cd100003) Element " << aResName.getStr() );
1840 :
1841 9736 : if ( aElementType.equalsIgnoreAsciiCase("menubar") &&
1842 2 : aElementName.equalsIgnoreAsciiCase("menubar") )
1843 : {
1844 0 : SolarMutexGuard g;
1845 :
1846 0 : if ( m_xContainerWindow.is() )
1847 : {
1848 0 : m_bMenuVisible = false;
1849 :
1850 0 : SolarMutexGuard aGuard;
1851 0 : SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow );
1852 0 : if ( pSysWindow )
1853 : {
1854 0 : MenuBar* pMenuBar = pSysWindow->GetMenuBar();
1855 0 : if ( pMenuBar )
1856 : {
1857 0 : pMenuBar->SetDisplayable( false );
1858 0 : bNotify = true;
1859 : }
1860 0 : }
1861 0 : }
1862 : }
1863 19468 : else if (( aElementType.equalsIgnoreAsciiCase("statusbar") &&
1864 19468 : aElementName.equalsIgnoreAsciiCase("statusbar") ) ||
1865 9734 : ( m_aStatusBarElement.m_aName == aName ))
1866 : {
1867 0 : SolarMutexGuard g;
1868 0 : if ( m_aStatusBarElement.m_xUIElement.is() && !m_aStatusBarElement.m_bMasterHide &&
1869 0 : implts_hideStatusBar( true ))
1870 : {
1871 0 : implts_writeWindowStateData( STATUS_BAR_ALIAS, m_aStatusBarElement );
1872 0 : bMustLayout = true;
1873 0 : bNotify = true;
1874 0 : }
1875 : }
1876 19466 : else if ( aElementType.equalsIgnoreAsciiCase("progressbar") &&
1877 9732 : aElementName.equalsIgnoreAsciiCase("progressbar") )
1878 : {
1879 9732 : bNotify = implts_hideProgressBar();
1880 : }
1881 2 : else if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
1882 : {
1883 0 : SolarMutexClearableGuard aReadLock;
1884 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1885 0 : aReadLock.clear();
1886 :
1887 0 : if ( pToolbarManager )
1888 : {
1889 0 : bNotify = pToolbarManager->hideToolbar( aName );
1890 0 : bMustLayout = pToolbarManager->isLayoutDirty();
1891 0 : }
1892 : }
1893 2 : else if ( aElementType.equalsIgnoreAsciiCase("dockingwindow"))
1894 : {
1895 0 : SolarMutexClearableGuard aReadGuard;
1896 0 : uno::Reference< frame::XFrame > xFrame( m_xFrame );
1897 0 : uno::Reference< XComponentContext > xContext( m_xContext );
1898 0 : aReadGuard.clear();
1899 :
1900 0 : impl_setDockingWindowVisibility( xContext, xFrame, aElementName, false );
1901 : }
1902 :
1903 9734 : if ( bMustLayout )
1904 0 : doLayout();
1905 :
1906 9734 : if ( bNotify )
1907 3850 : implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_INVISIBLE, uno::makeAny( aName ) );
1908 :
1909 19468 : return sal_False;
1910 : }
1911 :
1912 2 : sal_Bool SAL_CALL LayoutManager::dockWindow( const OUString& aName, DockingArea DockingArea, const awt::Point& Pos )
1913 : throw (RuntimeException, std::exception)
1914 : {
1915 2 : OUString aElementType;
1916 4 : OUString aElementName;
1917 :
1918 2 : parseResourceURL( aName, aElementType, aElementName );
1919 2 : if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
1920 : {
1921 0 : SolarMutexClearableGuard aReadLock;
1922 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1923 0 : aReadLock.clear();
1924 :
1925 0 : if ( pToolbarManager )
1926 : {
1927 0 : pToolbarManager->dockToolbar( aName, DockingArea, Pos );
1928 0 : if ( pToolbarManager->isLayoutDirty() )
1929 0 : doLayout();
1930 0 : }
1931 : }
1932 4 : return sal_False;
1933 : }
1934 :
1935 0 : sal_Bool SAL_CALL LayoutManager::dockAllWindows( ::sal_Int16 /*nElementType*/ ) throw (uno::RuntimeException, std::exception)
1936 : {
1937 0 : SolarMutexClearableGuard aReadLock;
1938 0 : bool bResult( false );
1939 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1940 0 : aReadLock.clear();
1941 :
1942 0 : if ( pToolbarManager )
1943 : {
1944 0 : bResult = pToolbarManager->dockAllToolbars();
1945 0 : if ( pToolbarManager->isLayoutDirty() )
1946 0 : doLayout();
1947 : }
1948 0 : return bResult;
1949 : }
1950 :
1951 2 : sal_Bool SAL_CALL LayoutManager::floatWindow( const OUString& aName )
1952 : throw (RuntimeException, std::exception)
1953 : {
1954 2 : bool bResult( false );
1955 2 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
1956 : {
1957 0 : SolarMutexClearableGuard aReadLock;
1958 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1959 0 : aReadLock.clear();
1960 :
1961 0 : if ( pToolbarManager )
1962 : {
1963 0 : bResult = pToolbarManager->floatToolbar( aName );
1964 0 : if ( pToolbarManager->isLayoutDirty() )
1965 0 : doLayout();
1966 0 : }
1967 : }
1968 2 : return bResult;
1969 : }
1970 :
1971 0 : sal_Bool SAL_CALL LayoutManager::lockWindow( const OUString& aName )
1972 : throw (uno::RuntimeException, std::exception)
1973 : {
1974 0 : bool bResult( false );
1975 0 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
1976 : {
1977 0 : SolarMutexClearableGuard aReadLock;
1978 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1979 0 : aReadLock.clear();
1980 :
1981 0 : if ( pToolbarManager )
1982 : {
1983 0 : bResult = pToolbarManager->lockToolbar( aName );
1984 0 : if ( pToolbarManager->isLayoutDirty() )
1985 0 : doLayout();
1986 0 : }
1987 : }
1988 0 : return bResult;
1989 : }
1990 :
1991 0 : sal_Bool SAL_CALL LayoutManager::unlockWindow( const OUString& aName )
1992 : throw (uno::RuntimeException, std::exception)
1993 : {
1994 0 : bool bResult( false );
1995 0 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
1996 : {
1997 0 : SolarMutexClearableGuard aReadLock;
1998 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
1999 0 : aReadLock.clear();
2000 :
2001 0 : if ( pToolbarManager )
2002 : {
2003 0 : bResult = pToolbarManager->unlockToolbar( aName );
2004 0 : if ( pToolbarManager->isLayoutDirty() )
2005 0 : doLayout();
2006 0 : }
2007 : }
2008 0 : return bResult;
2009 : }
2010 :
2011 2 : void SAL_CALL LayoutManager::setElementSize( const OUString& aName, const awt::Size& aSize )
2012 : throw (RuntimeException, std::exception)
2013 : {
2014 2 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2015 : {
2016 0 : SolarMutexClearableGuard aReadLock;
2017 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2018 0 : aReadLock.clear();
2019 :
2020 0 : if ( pToolbarManager )
2021 : {
2022 0 : pToolbarManager->setToolbarSize( aName, aSize );
2023 0 : if ( pToolbarManager->isLayoutDirty() )
2024 0 : doLayout();
2025 0 : }
2026 : }
2027 2 : }
2028 :
2029 2 : void SAL_CALL LayoutManager::setElementPos( const OUString& aName, const awt::Point& aPos )
2030 : throw (RuntimeException, std::exception)
2031 : {
2032 2 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2033 : {
2034 0 : SolarMutexClearableGuard aReadLock;
2035 0 : ToolbarLayoutManager* pToolbarManager( m_pToolbarManager );
2036 0 : aReadLock.clear();
2037 :
2038 0 : if ( pToolbarManager )
2039 : {
2040 0 : pToolbarManager->setToolbarPos( aName, aPos );
2041 0 : if ( pToolbarManager->isLayoutDirty() )
2042 0 : doLayout();
2043 0 : }
2044 : }
2045 2 : }
2046 :
2047 2 : void SAL_CALL LayoutManager::setElementPosSize( const OUString& aName, const awt::Point& aPos, const awt::Size& aSize )
2048 : throw (RuntimeException, std::exception)
2049 : {
2050 2 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2051 : {
2052 0 : SolarMutexClearableGuard aReadLock;
2053 0 : ToolbarLayoutManager* pToolbarManager( m_pToolbarManager );
2054 0 : aReadLock.clear();
2055 :
2056 0 : if ( pToolbarManager )
2057 : {
2058 0 : pToolbarManager->setToolbarPosSize( aName, aPos, aSize );
2059 0 : if ( pToolbarManager->isLayoutDirty() )
2060 0 : doLayout();
2061 0 : }
2062 : }
2063 2 : }
2064 :
2065 186818 : sal_Bool SAL_CALL LayoutManager::isElementVisible( const OUString& aName )
2066 : throw (RuntimeException, std::exception)
2067 : {
2068 186818 : OUString aElementType;
2069 373636 : OUString aElementName;
2070 :
2071 186818 : parseResourceURL( aName, aElementType, aElementName );
2072 198737 : if ( aElementType.equalsIgnoreAsciiCase("menubar") &&
2073 11919 : aElementName.equalsIgnoreAsciiCase("menubar") )
2074 : {
2075 11917 : SolarMutexResettableGuard aReadLock;
2076 11917 : if ( m_xContainerWindow.is() )
2077 : {
2078 11917 : aReadLock.clear();
2079 :
2080 11917 : SolarMutexGuard aGuard;
2081 11917 : SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow );
2082 11917 : if ( pSysWindow )
2083 : {
2084 11917 : MenuBar* pMenuBar = pSysWindow->GetMenuBar();
2085 11917 : if ( pMenuBar && pMenuBar->IsDisplayable() )
2086 6461 : return sal_True;
2087 : }
2088 : else
2089 : {
2090 0 : aReadLock.reset();
2091 0 : return m_bMenuVisible;
2092 5456 : }
2093 5456 : }
2094 : }
2095 437454 : else if (( aElementType.equalsIgnoreAsciiCase("statusbar") &&
2096 262150 : aElementName.equalsIgnoreAsciiCase("statusbar") ) ||
2097 87249 : ( m_aStatusBarElement.m_aName == aName ))
2098 : {
2099 87652 : if ( m_aStatusBarElement.m_xUIElement.is() )
2100 : {
2101 39720 : Reference< awt::XWindow > xWindow( m_aStatusBarElement.m_xUIElement->getRealInterface(), UNO_QUERY );
2102 39720 : if ( xWindow.is() )
2103 : {
2104 39720 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
2105 39720 : if ( pWindow && pWindow->IsVisible() )
2106 39712 : return sal_True;
2107 : else
2108 8 : return sal_False;
2109 0 : }
2110 : }
2111 : }
2112 173288 : else if ( aElementType.equalsIgnoreAsciiCase("progressbar") &&
2113 86039 : aElementName.equalsIgnoreAsciiCase("progressbar") )
2114 : {
2115 86039 : if ( m_aProgressBarElement.m_xUIElement.is() )
2116 76023 : return m_aProgressBarElement.m_bVisible;
2117 : }
2118 1210 : else if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2119 : {
2120 1208 : SolarMutexClearableGuard aReadLock;
2121 1208 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2122 1208 : aReadLock.clear();
2123 :
2124 1208 : if ( pToolbarManager )
2125 1208 : return pToolbarManager->isToolbarVisible( aName );
2126 : }
2127 2 : else if ( aElementType.equalsIgnoreAsciiCase("dockingwindow"))
2128 : {
2129 0 : SolarMutexClearableGuard aReadGuard;
2130 0 : uno::Reference< frame::XFrame > xFrame( m_xFrame );
2131 0 : aReadGuard.clear();
2132 :
2133 0 : return IsDockingWindowVisible( xFrame, aElementName );
2134 : }
2135 :
2136 250224 : return sal_False;
2137 : }
2138 :
2139 2 : sal_Bool SAL_CALL LayoutManager::isElementFloating( const OUString& aName )
2140 : throw (RuntimeException, std::exception)
2141 : {
2142 2 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2143 : {
2144 0 : SolarMutexClearableGuard aReadLock;
2145 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2146 0 : aReadLock.clear();
2147 :
2148 0 : if ( pToolbarManager )
2149 0 : return pToolbarManager->isToolbarFloating( aName );
2150 : }
2151 :
2152 2 : return sal_False;
2153 : }
2154 :
2155 2 : sal_Bool SAL_CALL LayoutManager::isElementDocked( const OUString& aName )
2156 : throw (RuntimeException, std::exception)
2157 : {
2158 2 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2159 : {
2160 0 : SolarMutexClearableGuard aReadLock;
2161 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2162 0 : aReadLock.clear();
2163 :
2164 0 : if ( pToolbarManager )
2165 0 : return pToolbarManager->isToolbarDocked( aName );
2166 : }
2167 :
2168 2 : return sal_False;
2169 : }
2170 :
2171 0 : sal_Bool SAL_CALL LayoutManager::isElementLocked( const OUString& aName )
2172 : throw (uno::RuntimeException, std::exception)
2173 : {
2174 0 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2175 : {
2176 0 : SolarMutexClearableGuard aReadLock;
2177 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2178 0 : aReadLock.clear();
2179 :
2180 0 : if ( pToolbarManager )
2181 0 : return pToolbarManager->isToolbarLocked( aName );
2182 : }
2183 :
2184 0 : return sal_False;
2185 : }
2186 :
2187 2 : awt::Size SAL_CALL LayoutManager::getElementSize( const OUString& aName )
2188 : throw (RuntimeException, std::exception)
2189 : {
2190 2 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2191 : {
2192 0 : SolarMutexClearableGuard aReadLock;
2193 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2194 0 : aReadLock.clear();
2195 :
2196 0 : if ( pToolbarManager )
2197 0 : return pToolbarManager->getToolbarSize( aName );
2198 : }
2199 :
2200 2 : return awt::Size();
2201 : }
2202 :
2203 2 : awt::Point SAL_CALL LayoutManager::getElementPos( const OUString& aName )
2204 : throw (RuntimeException, std::exception)
2205 : {
2206 2 : if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2207 : {
2208 0 : SolarMutexClearableGuard aReadLock;
2209 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2210 0 : aReadLock.clear();
2211 :
2212 0 : if ( pToolbarManager )
2213 0 : return pToolbarManager->getToolbarPos( aName );
2214 : }
2215 :
2216 2 : return awt::Point();
2217 : }
2218 :
2219 35702 : void SAL_CALL LayoutManager::lock()
2220 : throw (RuntimeException, std::exception)
2221 : {
2222 35702 : implts_lock();
2223 :
2224 35702 : SolarMutexClearableGuard aReadLock;
2225 35702 : sal_Int32 nLockCount( m_nLockCount );
2226 35702 : aReadLock.clear();
2227 :
2228 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::lock lockCount=" << nLockCount );
2229 : #ifdef DBG_UTIL
2230 : OStringBuffer aStr("LayoutManager::lock ");
2231 : aStr.append(reinterpret_cast<sal_Int64>(this));
2232 : aStr.append(" - ");
2233 : aStr.append(nLockCount);
2234 : SAL_INFO( "fwk", "" << aStr.getStr());
2235 : #endif
2236 :
2237 71404 : Any a( nLockCount );
2238 71404 : implts_notifyListeners( frame::LayoutManagerEvents::LOCK, a );
2239 35702 : }
2240 :
2241 35700 : void SAL_CALL LayoutManager::unlock()
2242 : throw (RuntimeException, std::exception)
2243 : {
2244 35700 : bool bDoLayout( implts_unlock() );
2245 :
2246 35700 : SolarMutexClearableGuard aReadLock;
2247 35700 : sal_Int32 nLockCount( m_nLockCount );
2248 35700 : aReadLock.clear();
2249 :
2250 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::unlock lockCount=" << nLockCount );
2251 : #ifdef DBG_UTIL
2252 : OStringBuffer aStr("LayoutManager::unlock ");
2253 : aStr.append(reinterpret_cast<sal_Int64>(this));
2254 : aStr.append(" - ");
2255 : aStr.append(nLockCount);
2256 : SAL_INFO( "fwk", "" << aStr.getStr());
2257 : #endif
2258 : // conform to documentation: unlock with lock count == 0 means force a layout
2259 :
2260 71400 : SolarMutexClearableGuard aWriteLock;
2261 35700 : if ( bDoLayout )
2262 23671 : m_aAsyncLayoutTimer.Stop();
2263 35700 : aWriteLock.clear();
2264 :
2265 71400 : Any a( nLockCount );
2266 35700 : implts_notifyListeners( frame::LayoutManagerEvents::UNLOCK, a );
2267 :
2268 35700 : if ( bDoLayout )
2269 59371 : implts_doLayout_notify( true );
2270 35700 : }
2271 :
2272 2215 : void SAL_CALL LayoutManager::doLayout()
2273 : throw (RuntimeException, std::exception)
2274 : {
2275 2215 : implts_doLayout_notify( true );
2276 2215 : }
2277 :
2278 : // ILayoutNotifications
2279 :
2280 134 : void LayoutManager::requestLayout( Hint eHint )
2281 : {
2282 134 : if ( eHint == HINT_TOOLBARSPACE_HAS_CHANGED )
2283 134 : doLayout();
2284 134 : }
2285 :
2286 39240 : void LayoutManager::implts_doLayout_notify( bool bOuterResize )
2287 : {
2288 39240 : bool bLayouted = implts_doLayout( false, bOuterResize );
2289 39240 : if ( bLayouted )
2290 10527 : implts_notifyListeners( frame::LayoutManagerEvents::LAYOUT, Any() );
2291 39240 : }
2292 :
2293 70761 : bool LayoutManager::implts_doLayout( bool bForceRequestBorderSpace, bool bOuterResize )
2294 : {
2295 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::implts_doLayout" );
2296 :
2297 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
2298 70761 : SolarMutexClearableGuard aReadLock;
2299 :
2300 70761 : if ( !m_xFrame.is() || !m_bParentWindowVisible )
2301 35231 : return false;
2302 :
2303 35530 : bool bPreserveContentSize( m_bPreserveContentSize );
2304 35530 : bool bMustDoLayout( m_bMustDoLayout );
2305 35530 : bool bNoLock = ( m_nLockCount == 0 );
2306 35530 : awt::Rectangle aCurrBorderSpace( m_aDockingArea );
2307 71060 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2308 71060 : Reference< awt::XTopWindow2 > xContainerTopWindow( m_xContainerTopWindow );
2309 71060 : Reference< awt::XWindow > xComponentWindow( m_xFrame->getComponentWindow() );
2310 71060 : Reference< XDockingAreaAcceptor > xDockingAreaAcceptor( m_xDockingAreaAcceptor );
2311 35530 : aReadLock.clear();
2312 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
2313 :
2314 35530 : bool bLayouted( false );
2315 :
2316 35530 : if ( bNoLock && xDockingAreaAcceptor.is() && xContainerWindow.is() && xComponentWindow.is() )
2317 : {
2318 18859 : bLayouted = true;
2319 :
2320 18859 : SolarMutexResettableGuard aWriteGuard;
2321 18859 : m_bDoLayout = true;
2322 18859 : aWriteGuard.clear();
2323 :
2324 18859 : awt::Rectangle aDockSpace( implts_calcDockingAreaSizes() );
2325 18859 : awt::Rectangle aBorderSpace( aDockSpace );
2326 18859 : bool bGotRequestedBorderSpace( true );
2327 :
2328 : // We have to add the height of a possible status bar
2329 18859 : aBorderSpace.Height += implts_getStatusBarSize().Height();
2330 :
2331 18859 : if ( !equalRectangles( aBorderSpace, aCurrBorderSpace ) || bForceRequestBorderSpace || bMustDoLayout )
2332 : {
2333 : // we always resize the content window (instead of the complete container window) if we're not set up
2334 : // to (attempt to) preserve the content window's size
2335 17498 : if ( bOuterResize && !bPreserveContentSize )
2336 11290 : bOuterResize = false;
2337 :
2338 : // maximized windows can resized their content window only, not their container window
2339 17498 : if ( bOuterResize && xContainerTopWindow.is() && xContainerTopWindow->getIsMaximized() )
2340 0 : bOuterResize = false;
2341 :
2342 : // if the component window does not have a size (yet), then we can't use it to calc the container
2343 : // window size
2344 17498 : awt::Rectangle aComponentRect = xComponentWindow->getPosSize();
2345 17498 : if ( bOuterResize && ( aComponentRect.Width == 0 ) && ( aComponentRect.Height == 0 ) )
2346 0 : bOuterResize = false;
2347 :
2348 17498 : bGotRequestedBorderSpace = false;
2349 17498 : if ( bOuterResize )
2350 : {
2351 0 : Reference< awt::XDevice > xDevice( xContainerWindow, uno::UNO_QUERY );
2352 0 : awt::DeviceInfo aContainerInfo = xDevice->getInfo();
2353 :
2354 0 : awt::Size aRequestedSize( aComponentRect.Width + aContainerInfo.LeftInset + aContainerInfo.RightInset + aBorderSpace.X + aBorderSpace.Width,
2355 0 : aComponentRect.Height + aContainerInfo.TopInset + aContainerInfo.BottomInset + aBorderSpace.Y + aBorderSpace.Height );
2356 0 : awt::Point aComponentPos( aBorderSpace.X, aBorderSpace.Y );
2357 :
2358 0 : bGotRequestedBorderSpace = implts_resizeContainerWindow( aRequestedSize, aComponentPos );
2359 : }
2360 :
2361 : // if we did not do an container window resize, or it failed, then use the DockingAcceptor as usual
2362 17498 : if ( !bGotRequestedBorderSpace )
2363 17498 : bGotRequestedBorderSpace = xDockingAreaAcceptor->requestDockingAreaSpace( aBorderSpace );
2364 :
2365 17498 : if ( bGotRequestedBorderSpace )
2366 : {
2367 17436 : aWriteGuard.reset();
2368 17436 : m_aDockingArea = aBorderSpace;
2369 17436 : m_bMustDoLayout = false;
2370 17436 : aWriteGuard.clear();
2371 : }
2372 : }
2373 :
2374 18859 : if ( bGotRequestedBorderSpace )
2375 : {
2376 18797 : ::Size aContainerSize;
2377 18797 : ::Size aStatusBarSize;
2378 :
2379 : // Interim solution to let the layout method within the
2380 : // toolbar layout manager.
2381 18797 : implts_setOffset( implts_getStatusBarSize().Height() );
2382 18797 : if ( m_pToolbarManager )
2383 18797 : m_pToolbarManager->setDockingArea( aDockSpace );
2384 :
2385 : // Subtract status bar size from our container output size. Docking area windows
2386 : // don't contain the status bar!
2387 18797 : aStatusBarSize = implts_getStatusBarSize();
2388 18797 : aContainerSize = implts_getContainerWindowOutputSize();
2389 18797 : aContainerSize.Height() -= aStatusBarSize.Height();
2390 :
2391 18797 : if ( m_pToolbarManager )
2392 18797 : m_pToolbarManager->doLayout(aContainerSize);
2393 :
2394 : // Position the status bar
2395 18797 : if ( aStatusBarSize.Height() > 0 )
2396 : {
2397 22246 : implts_setStatusBarPosSize( ::Point( 0, std::max(( aContainerSize.Height() ), long( 0 ))),
2398 33369 : ::Size( aContainerSize.Width(),aStatusBarSize.Height() ));
2399 : }
2400 :
2401 18797 : xDockingAreaAcceptor->setDockingAreaSpace( aBorderSpace );
2402 :
2403 18797 : aWriteGuard.reset();
2404 18797 : m_bDoLayout = false;
2405 18797 : aWriteGuard.clear();
2406 18859 : }
2407 : }
2408 :
2409 106291 : return bLayouted;
2410 : }
2411 :
2412 0 : bool LayoutManager::implts_resizeContainerWindow( const awt::Size& rContainerSize,
2413 : const awt::Point& rComponentPos )
2414 : {
2415 0 : SolarMutexClearableGuard aReadLock;
2416 0 : Reference< awt::XWindow > xContainerWindow = m_xContainerWindow;
2417 0 : Reference< awt::XTopWindow2 > xContainerTopWindow = m_xContainerTopWindow;
2418 0 : Reference< awt::XWindow > xComponentWindow = m_xFrame->getComponentWindow();
2419 0 : aReadLock.clear();
2420 :
2421 : // calculate the maximum size we have for the container window
2422 0 : sal_Int32 nDisplay = xContainerTopWindow->getDisplay();
2423 0 : Rectangle aWorkArea = Application::GetScreenPosSizePixel( nDisplay );
2424 :
2425 0 : if (( aWorkArea.GetWidth() > 0 ) && ( aWorkArea.GetHeight() > 0 ))
2426 : {
2427 0 : if (( rContainerSize.Width > aWorkArea.GetWidth() ) || ( rContainerSize.Height > aWorkArea.GetHeight() ))
2428 0 : return false;
2429 : // Strictly, this is not correct. If we have a multi-screen display (css.awt.DisplayAccess.MultiDisplay == true),
2430 : // the "effective work area" would be much larger than the work area of a single display, since we could in theory
2431 : // position the container window across multiple screens.
2432 : // However, this should suffice as a heuristics here ... (nobody really wants to check whether the different screens are
2433 : // stacked horizontally or vertically, whether their work areas can really be combined, or are separated by non-work-areas,
2434 : // and the like ... right?)
2435 : }
2436 :
2437 : // resize our container window
2438 0 : xContainerWindow->setPosSize( 0, 0, rContainerSize.Width, rContainerSize.Height, awt::PosSize::SIZE );
2439 : // position the component window
2440 0 : xComponentWindow->setPosSize( rComponentPos.X, rComponentPos.Y, 0, 0, awt::PosSize::POS );
2441 0 : return true;
2442 : }
2443 :
2444 5464 : void SAL_CALL LayoutManager::setVisible( sal_Bool bVisible )
2445 : throw (uno::RuntimeException, std::exception)
2446 : {
2447 5464 : SolarMutexClearableGuard aWriteLock;
2448 5464 : bool bWasVisible( m_bVisible );
2449 5464 : m_bVisible = bVisible;
2450 5464 : aWriteLock.clear();
2451 :
2452 5464 : if ( (bWasVisible ? 1 : 0) != bVisible )
2453 10 : implts_setVisibleState( bVisible );
2454 5464 : }
2455 :
2456 3798 : sal_Bool SAL_CALL LayoutManager::isVisible()
2457 : throw (uno::RuntimeException, std::exception)
2458 : {
2459 3798 : SolarMutexGuard g;
2460 3798 : return m_bVisible;
2461 : }
2462 :
2463 86039 : ::Size LayoutManager::implts_getStatusBarSize()
2464 : {
2465 86039 : SolarMutexClearableGuard aReadLock;
2466 86039 : bool bStatusBarVisible( isElementVisible( STATUS_BAR_ALIAS ));
2467 86039 : bool bProgressBarVisible( isElementVisible( PROGRESS_BAR_ALIAS ));
2468 86039 : bool bVisible( m_bVisible );
2469 172078 : Reference< XUIElement > xStatusBar( m_aStatusBarElement.m_xUIElement );
2470 172078 : Reference< XUIElement > xProgressBar( m_aProgressBarElement.m_xUIElement );
2471 :
2472 172078 : Reference< awt::XWindow > xWindow;
2473 86039 : if ( bStatusBarVisible && bVisible && xStatusBar.is() )
2474 38099 : xWindow = Reference< awt::XWindow >( xStatusBar->getRealInterface(), UNO_QUERY );
2475 47940 : else if ( xProgressBar.is() && !xStatusBar.is() && bProgressBarVisible )
2476 : {
2477 9992 : ProgressBarWrapper* pWrapper = static_cast<ProgressBarWrapper*>(xProgressBar.get());
2478 9992 : if ( pWrapper )
2479 9992 : xWindow = pWrapper->getStatusBar();
2480 : }
2481 86039 : aReadLock.clear();
2482 :
2483 86039 : if ( xWindow.is() )
2484 : {
2485 48091 : awt::Rectangle aPosSize = xWindow->getPosSize();
2486 48091 : return ::Size( aPosSize.Width, aPosSize.Height );
2487 : }
2488 : else
2489 123987 : return ::Size();
2490 : }
2491 :
2492 18859 : awt::Rectangle LayoutManager::implts_calcDockingAreaSizes()
2493 : {
2494 18859 : SolarMutexClearableGuard aReadLock;
2495 37718 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2496 37718 : Reference< XDockingAreaAcceptor > xDockingAreaAcceptor( m_xDockingAreaAcceptor );
2497 18859 : aReadLock.clear();
2498 :
2499 18859 : awt::Rectangle aBorderSpace;
2500 18859 : if ( m_pToolbarManager && xDockingAreaAcceptor.is() && xContainerWindow.is() )
2501 18859 : aBorderSpace = m_pToolbarManager->getDockingArea();
2502 :
2503 37718 : return aBorderSpace;
2504 : }
2505 :
2506 14793 : void LayoutManager::implts_setDockingAreaWindowSizes( const awt::Rectangle& /*rBorderSpace*/ )
2507 : {
2508 14793 : SolarMutexClearableGuard aReadLock;
2509 29586 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2510 14793 : aReadLock.clear();
2511 :
2512 29586 : uno::Reference< awt::XDevice > xDevice( xContainerWindow, uno::UNO_QUERY );
2513 : // Convert relativ size to output size.
2514 14793 : awt::Rectangle aRectangle = xContainerWindow->getPosSize();
2515 14793 : awt::DeviceInfo aInfo = xDevice->getInfo();
2516 14793 : awt::Size aContainerClientSize = awt::Size( aRectangle.Width - aInfo.LeftInset - aInfo.RightInset,
2517 29586 : aRectangle.Height - aInfo.TopInset - aInfo.BottomInset );
2518 14793 : ::Size aStatusBarSize = implts_getStatusBarSize();
2519 :
2520 : // Position the status bar
2521 14793 : if ( aStatusBarSize.Height() > 0 )
2522 : {
2523 14692 : implts_setStatusBarPosSize( ::Point( 0, std::max(( aContainerClientSize.Height - aStatusBarSize.Height() ), long( 0 ))),
2524 22038 : ::Size( aContainerClientSize.Width, aStatusBarSize.Height() ));
2525 14793 : }
2526 14793 : }
2527 :
2528 16452 : void LayoutManager::implts_updateMenuBarClose()
2529 : {
2530 16452 : SolarMutexClearableGuard aWriteLock;
2531 16452 : bool bShowCloseButton( m_bMenuBarCloseButton );
2532 32904 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2533 16452 : aWriteLock.clear();
2534 :
2535 16452 : if ( xContainerWindow.is() )
2536 : {
2537 16452 : SolarMutexGuard aGuard;
2538 :
2539 16452 : SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow );
2540 16452 : if ( pSysWindow )
2541 : {
2542 16452 : MenuBar* pMenuBar = pSysWindow->GetMenuBar();
2543 16452 : if ( pMenuBar )
2544 : {
2545 : // TODO remove link on sal_False ?!
2546 7210 : pMenuBar->ShowCloseButton(bShowCloseButton);
2547 7210 : pMenuBar->SetCloseButtonClickHdl(LINK(this, LayoutManager, MenuBarClose));
2548 : }
2549 16452 : }
2550 16452 : }
2551 16452 : }
2552 :
2553 5576 : bool LayoutManager::implts_resetMenuBar()
2554 : {
2555 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
2556 5576 : SolarMutexClearableGuard aWriteLock;
2557 5576 : bool bMenuVisible( m_bMenuVisible );
2558 11152 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2559 :
2560 5576 : MenuBar* pSetMenuBar = 0;
2561 5576 : if ( m_xInplaceMenuBar.is() )
2562 0 : pSetMenuBar = static_cast<MenuBar *>(m_pInplaceMenuBar->GetMenuBar());
2563 : else
2564 : {
2565 5576 : MenuBarWrapper* pMenuBarWrapper = static_cast< MenuBarWrapper* >( m_xMenuBar.get() );
2566 5576 : if ( pMenuBarWrapper )
2567 0 : pSetMenuBar = static_cast<MenuBar*>(pMenuBarWrapper->GetMenuBarManager()->GetMenuBar());
2568 : }
2569 5576 : aWriteLock.clear();
2570 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
2571 :
2572 11152 : SolarMutexGuard aGuard;
2573 5576 : SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow );
2574 5576 : if ( pSysWindow && bMenuVisible && pSetMenuBar )
2575 : {
2576 0 : pSysWindow->SetMenuBar(pSetMenuBar, m_xFrame);
2577 0 : pSetMenuBar->SetDisplayable( true );
2578 0 : return true;
2579 : }
2580 :
2581 11152 : return false;
2582 : }
2583 :
2584 0 : IMPL_LINK_NOARG(LayoutManager, MenuBarClose)
2585 : {
2586 0 : SolarMutexClearableGuard aReadLock;
2587 0 : uno::Reference< frame::XDispatchProvider > xProvider(m_xFrame, uno::UNO_QUERY);
2588 0 : uno::Reference< XComponentContext > xContext( m_xContext );
2589 0 : aReadLock.clear();
2590 :
2591 0 : if ( !xProvider.is())
2592 0 : return 0;
2593 :
2594 0 : uno::Reference< frame::XDispatchHelper > xDispatcher = frame::DispatchHelper::create( xContext );
2595 :
2596 0 : xDispatcher->executeDispatch(
2597 : xProvider,
2598 : OUString(".uno:CloseWin"),
2599 : OUString("_self"),
2600 : 0,
2601 0 : uno::Sequence< beans::PropertyValue >());
2602 :
2603 0 : return 0;
2604 : }
2605 :
2606 12461630 : IMPL_LINK_NOARG(LayoutManager, SettingsChanged)
2607 : {
2608 6230815 : return 1;
2609 : }
2610 :
2611 : // XLayoutManagerEventBroadcaster
2612 :
2613 5542 : void SAL_CALL LayoutManager::addLayoutManagerEventListener( const uno::Reference< frame::XLayoutManagerListener >& xListener )
2614 : throw (uno::RuntimeException, std::exception)
2615 : {
2616 5542 : m_aListenerContainer.addInterface( cppu::UnoType<frame::XLayoutManagerListener>::get(), xListener );
2617 5542 : }
2618 :
2619 5508 : void SAL_CALL LayoutManager::removeLayoutManagerEventListener( const uno::Reference< frame::XLayoutManagerListener >& xListener )
2620 : throw (uno::RuntimeException, std::exception)
2621 : {
2622 5508 : m_aListenerContainer.removeInterface( cppu::UnoType<frame::XLayoutManagerListener>::get(), xListener );
2623 5508 : }
2624 :
2625 167127 : void LayoutManager::implts_notifyListeners( short nEvent, uno::Any aInfoParam )
2626 : {
2627 167127 : lang::EventObject aSource( static_cast< ::cppu::OWeakObject*>(this) );
2628 167127 : ::cppu::OInterfaceContainerHelper* pContainer = m_aListenerContainer.getContainer( cppu::UnoType<frame::XLayoutManagerListener>::get());
2629 167127 : if (pContainer!=NULL)
2630 : {
2631 123241 : ::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
2632 369715 : while (pIterator.hasMoreElements())
2633 : {
2634 : try
2635 : {
2636 123233 : static_cast<frame::XLayoutManagerListener*>(pIterator.next())->layoutEvent( aSource, nEvent, aInfoParam );
2637 : }
2638 0 : catch( const uno::RuntimeException& )
2639 : {
2640 0 : pIterator.remove();
2641 : }
2642 123241 : }
2643 167127 : }
2644 167127 : }
2645 :
2646 : // XWindowListener
2647 :
2648 18634 : void SAL_CALL LayoutManager::windowResized( const awt::WindowEvent& aEvent )
2649 : throw( uno::RuntimeException, std::exception )
2650 : {
2651 18634 : SolarMutexGuard g;
2652 37268 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2653 :
2654 37268 : Reference< XInterface > xIfac( xContainerWindow, UNO_QUERY );
2655 18634 : if ( xIfac == aEvent.Source && m_bVisible )
2656 : {
2657 : // We have to call our resize handler at least once synchronously, as some
2658 : // application modules need this. So we have to check if this is the first
2659 : // call after the async layout time expired.
2660 18632 : m_bMustDoLayout = true;
2661 18632 : if ( !m_aAsyncLayoutTimer.IsActive() )
2662 : {
2663 12266 : const Link& aLink = m_aAsyncLayoutTimer.GetTimeoutHdl();
2664 12266 : if ( aLink.IsSet() )
2665 12266 : aLink.Call( &m_aAsyncLayoutTimer );
2666 : }
2667 18632 : if ( m_nLockCount == 0 )
2668 9354 : m_aAsyncLayoutTimer.Start();
2669 : }
2670 2 : else if ( m_xFrame.is() && aEvent.Source == m_xFrame->getContainerWindow() )
2671 : {
2672 : // the container window of my DockingAreaAcceptor is not the same as of my frame
2673 : // I still have to resize my frames' window as nobody else will do it
2674 2 : Reference< awt::XWindow > xComponentWindow( m_xFrame->getComponentWindow() );
2675 2 : if( xComponentWindow.is() )
2676 : {
2677 2 : uno::Reference< awt::XDevice > xDevice( m_xFrame->getContainerWindow(), uno::UNO_QUERY );
2678 :
2679 : // Convert relativ size to output size.
2680 2 : awt::Rectangle aRectangle = m_xFrame->getContainerWindow()->getPosSize();
2681 2 : awt::DeviceInfo aInfo = xDevice->getInfo();
2682 2 : awt::Size aSize( aRectangle.Width - aInfo.LeftInset - aInfo.RightInset ,
2683 4 : aRectangle.Height - aInfo.TopInset - aInfo.BottomInset );
2684 :
2685 : // Resize our component window.
2686 2 : xComponentWindow->setPosSize( 0, 0, aSize.Width, aSize.Height, awt::PosSize::POSSIZE );
2687 2 : }
2688 18634 : }
2689 18634 : }
2690 :
2691 16486 : void SAL_CALL LayoutManager::windowMoved( const awt::WindowEvent& ) throw( uno::RuntimeException, std::exception )
2692 : {
2693 16486 : }
2694 :
2695 10980 : void SAL_CALL LayoutManager::windowShown( const lang::EventObject& aEvent ) throw( uno::RuntimeException, std::exception )
2696 : {
2697 10980 : SolarMutexClearableGuard aReadLock;
2698 21960 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2699 10980 : bool bParentWindowVisible( m_bParentWindowVisible );
2700 10980 : aReadLock.clear();
2701 :
2702 21960 : Reference< XInterface > xIfac( xContainerWindow, UNO_QUERY );
2703 10980 : if ( xIfac == aEvent.Source )
2704 : {
2705 10980 : SolarMutexClearableGuard aWriteLock;
2706 10980 : m_bParentWindowVisible = true;
2707 10980 : bool bSetVisible = ( m_bParentWindowVisible != bParentWindowVisible );
2708 10980 : aWriteLock.clear();
2709 :
2710 10980 : if ( bSetVisible )
2711 5490 : implts_updateUIElementsVisibleState( true );
2712 10980 : }
2713 10980 : }
2714 :
2715 14 : void SAL_CALL LayoutManager::windowHidden( const lang::EventObject& aEvent ) throw( uno::RuntimeException, std::exception )
2716 : {
2717 14 : SolarMutexClearableGuard aReadLock;
2718 28 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2719 14 : bool bParentWindowVisible( m_bParentWindowVisible );
2720 14 : aReadLock.clear();
2721 :
2722 28 : Reference< XInterface > xIfac( xContainerWindow, UNO_QUERY );
2723 14 : if ( xIfac == aEvent.Source )
2724 : {
2725 10 : SolarMutexClearableGuard aWriteLock;
2726 10 : m_bParentWindowVisible = false;
2727 10 : bool bSetInvisible = ( m_bParentWindowVisible != bParentWindowVisible );
2728 10 : aWriteLock.clear();
2729 :
2730 10 : if ( bSetInvisible )
2731 6 : implts_updateUIElementsVisibleState( false );
2732 14 : }
2733 14 : }
2734 :
2735 29586 : IMPL_LINK_NOARG(LayoutManager, AsyncLayoutHdl)
2736 : {
2737 14793 : SolarMutexClearableGuard aReadLock;
2738 14793 : m_aAsyncLayoutTimer.Stop();
2739 :
2740 14793 : if( !m_xContainerWindow.is() )
2741 0 : return 0;
2742 :
2743 14793 : awt::Rectangle aDockingArea( m_aDockingArea );
2744 14793 : ::Size aStatusBarSize( implts_getStatusBarSize() );
2745 :
2746 : // Subtract status bar height
2747 14793 : aDockingArea.Height -= aStatusBarSize.Height();
2748 14793 : aReadLock.clear();
2749 :
2750 14793 : implts_setDockingAreaWindowSizes( aDockingArea );
2751 14793 : implts_doLayout( true, false );
2752 :
2753 14793 : return 0;
2754 : }
2755 :
2756 : // XFrameActionListener
2757 :
2758 31272 : void SAL_CALL LayoutManager::frameAction( const FrameActionEvent& aEvent )
2759 : throw ( RuntimeException, std::exception )
2760 : {
2761 31272 : if (( aEvent.Action == FrameAction_COMPONENT_ATTACHED ) || ( aEvent.Action == FrameAction_COMPONENT_REATTACHED ))
2762 : {
2763 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::frameAction (COMPONENT_ATTACHED|REATTACHED)" );
2764 :
2765 5584 : SolarMutexClearableGuard aWriteLock;
2766 5584 : m_bComponentAttached = true;
2767 5584 : m_bMustDoLayout = true;
2768 5584 : aWriteLock.clear();
2769 :
2770 5584 : implts_reset( true );
2771 5576 : implts_doLayout( true, false );
2772 5584 : implts_doLayout( true, true );
2773 : }
2774 25688 : else if (( aEvent.Action == FrameAction_FRAME_UI_ACTIVATED ) || ( aEvent.Action == FrameAction_FRAME_UI_DEACTIVATING ))
2775 : {
2776 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::frameAction (FRAME_UI_ACTIVATED|DEACTIVATING)" );
2777 :
2778 5082 : SolarMutexClearableGuard aWriteLock;
2779 5082 : m_bActive = ( aEvent.Action == FrameAction_FRAME_UI_ACTIVATED );
2780 5082 : aWriteLock.clear();
2781 :
2782 5082 : implts_toggleFloatingUIElementsVisibility( aEvent.Action == FrameAction_FRAME_UI_ACTIVATED );
2783 : }
2784 20606 : else if ( aEvent.Action == FrameAction_COMPONENT_DETACHING )
2785 : {
2786 : SAL_INFO( "fwk", "framework (cd100003) ::LayoutManager::frameAction (COMPONENT_DETACHING)" );
2787 :
2788 5568 : SolarMutexClearableGuard aWriteLock;
2789 5568 : m_bComponentAttached = false;
2790 5568 : aWriteLock.clear();
2791 :
2792 5568 : implts_reset( false );
2793 : }
2794 31264 : }
2795 :
2796 8 : void SAL_CALL LayoutManager::disposing( const lang::EventObject& rEvent )
2797 : throw( RuntimeException, std::exception )
2798 : {
2799 8 : bool bDisposeAndClear( false );
2800 :
2801 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
2802 8 : SolarMutexClearableGuard aWriteLock;
2803 :
2804 8 : if ( rEvent.Source == Reference< XInterface >( m_xFrame, UNO_QUERY ))
2805 : {
2806 : // Our frame gets disposed, release all our references that depends on a working frame reference.
2807 0 : Application::RemoveEventListener( LINK( this, LayoutManager, SettingsChanged ) );
2808 :
2809 0 : setDockingAreaAcceptor( Reference< ui::XDockingAreaAcceptor >() );
2810 :
2811 : // destroy all elements, it's possible that dettaching is NOT called!
2812 0 : implts_destroyElements();
2813 0 : impl_clearUpMenuBar();
2814 0 : m_xMenuBar.clear();
2815 0 : if ( m_xInplaceMenuBar.is() )
2816 : {
2817 0 : m_pInplaceMenuBar = 0;
2818 0 : m_xInplaceMenuBar->dispose();
2819 : }
2820 0 : m_xInplaceMenuBar.clear();
2821 0 : m_xContainerWindow.clear();
2822 0 : m_xContainerTopWindow.clear();
2823 :
2824 : // forward disposing call to toolbar manager
2825 0 : if ( m_pToolbarManager != NULL )
2826 0 : m_pToolbarManager->disposing(rEvent);
2827 :
2828 0 : if ( m_xModuleCfgMgr.is() )
2829 : {
2830 : try
2831 : {
2832 0 : Reference< XUIConfiguration > xModuleCfgMgr( m_xModuleCfgMgr, UNO_QUERY );
2833 0 : xModuleCfgMgr->removeConfigurationListener(
2834 0 : Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
2835 : }
2836 0 : catch (const Exception&)
2837 : {
2838 : }
2839 : }
2840 :
2841 0 : if ( m_xDocCfgMgr.is() )
2842 : {
2843 : try
2844 : {
2845 0 : Reference< XUIConfiguration > xDocCfgMgr( m_xDocCfgMgr, UNO_QUERY );
2846 0 : xDocCfgMgr->removeConfigurationListener(
2847 0 : Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY ));
2848 : }
2849 0 : catch (const Exception&)
2850 : {
2851 : }
2852 : }
2853 :
2854 0 : m_xDocCfgMgr.clear();
2855 0 : m_xModuleCfgMgr.clear();
2856 0 : m_xFrame.clear();
2857 0 : delete m_pGlobalSettings;
2858 0 : m_pGlobalSettings = 0;
2859 :
2860 0 : bDisposeAndClear = true;
2861 : }
2862 8 : else if ( rEvent.Source == Reference< XInterface >( m_xContainerWindow, UNO_QUERY ))
2863 : {
2864 : // Our container window gets disposed. Remove all user interface elements.
2865 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2866 0 : if ( pToolbarManager )
2867 : {
2868 0 : uno::Reference< awt::XWindowPeer > aEmptyWindowPeer;
2869 0 : pToolbarManager->setParentWindow( aEmptyWindowPeer );
2870 : }
2871 0 : impl_clearUpMenuBar();
2872 0 : m_xMenuBar.clear();
2873 0 : if ( m_xInplaceMenuBar.is() )
2874 : {
2875 0 : m_pInplaceMenuBar = 0;
2876 0 : m_xInplaceMenuBar->dispose();
2877 : }
2878 0 : m_xInplaceMenuBar.clear();
2879 0 : m_xContainerWindow.clear();
2880 0 : m_xContainerTopWindow.clear();
2881 : }
2882 8 : else if ( rEvent.Source == Reference< XInterface >( m_xDocCfgMgr, UNO_QUERY ))
2883 0 : m_xDocCfgMgr.clear();
2884 8 : else if ( rEvent.Source == Reference< XInterface >( m_xModuleCfgMgr , UNO_QUERY ))
2885 4 : m_xModuleCfgMgr.clear();
2886 :
2887 8 : aWriteLock.clear();
2888 : /* SAFE AREA ----------------------------------------------------------------------------------------------- */
2889 :
2890 : // Send disposing to our listener when we have lost our frame.
2891 8 : if ( bDisposeAndClear )
2892 : {
2893 : // Send message to all listener and forget her references.
2894 0 : uno::Reference< frame::XLayoutManager > xThis( static_cast< ::cppu::OWeakObject* >(this), uno::UNO_QUERY );
2895 0 : lang::EventObject aEvent( xThis );
2896 0 : m_aListenerContainer.disposeAndClear( aEvent );
2897 8 : }
2898 8 : }
2899 :
2900 4 : void SAL_CALL LayoutManager::elementInserted( const ui::ConfigurationEvent& Event ) throw (uno::RuntimeException, std::exception)
2901 : {
2902 4 : SolarMutexClearableGuard aReadLock;
2903 8 : Reference< XFrame > xFrame( m_xFrame );
2904 8 : Reference< ui::XUIConfigurationListener > xUICfgListener( m_xToolbarManager );
2905 4 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2906 4 : aReadLock.clear();
2907 :
2908 4 : if ( xFrame.is() )
2909 : {
2910 4 : OUString aElementType;
2911 8 : OUString aElementName;
2912 4 : bool bRefreshLayout(false);
2913 :
2914 4 : parseResourceURL( Event.ResourceURL, aElementType, aElementName );
2915 4 : if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2916 : {
2917 0 : if ( xUICfgListener.is() )
2918 : {
2919 0 : xUICfgListener->elementInserted( Event );
2920 0 : bRefreshLayout = pToolbarManager->isLayoutDirty();
2921 : }
2922 : }
2923 4 : else if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_MENUBAR ))
2924 : {
2925 2 : Reference< XUIElement > xUIElement = implts_findElement( Event.ResourceURL );
2926 4 : Reference< XUIElementSettings > xElementSettings( xUIElement, UNO_QUERY );
2927 2 : if ( xElementSettings.is() )
2928 : {
2929 0 : OUString aConfigSourcePropName( "ConfigurationSource" );
2930 0 : uno::Reference< XPropertySet > xPropSet( xElementSettings, uno::UNO_QUERY );
2931 0 : if ( xPropSet.is() )
2932 : {
2933 0 : if ( Event.Source == uno::Reference< uno::XInterface >( m_xDocCfgMgr, uno::UNO_QUERY ))
2934 0 : xPropSet->setPropertyValue( aConfigSourcePropName, makeAny( m_xDocCfgMgr ));
2935 : }
2936 0 : xElementSettings->updateSettings();
2937 2 : }
2938 : }
2939 :
2940 4 : if ( bRefreshLayout )
2941 4 : doLayout();
2942 4 : }
2943 4 : }
2944 :
2945 4 : void SAL_CALL LayoutManager::elementRemoved( const ui::ConfigurationEvent& Event ) throw (uno::RuntimeException, std::exception)
2946 : {
2947 4 : SolarMutexClearableGuard aReadLock;
2948 8 : Reference< frame::XFrame > xFrame( m_xFrame );
2949 8 : Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager );
2950 8 : Reference< awt::XWindow > xContainerWindow( m_xContainerWindow );
2951 8 : Reference< ui::XUIElement > xMenuBar( m_xMenuBar );
2952 8 : Reference< ui::XUIConfigurationManager > xModuleCfgMgr( m_xModuleCfgMgr );
2953 8 : Reference< ui::XUIConfigurationManager > xDocCfgMgr( m_xDocCfgMgr );
2954 4 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
2955 4 : aReadLock.clear();
2956 :
2957 4 : if ( xFrame.is() )
2958 : {
2959 4 : OUString aElementType;
2960 8 : OUString aElementName;
2961 4 : bool bRefreshLayout(false);
2962 :
2963 4 : parseResourceURL( Event.ResourceURL, aElementType, aElementName );
2964 4 : if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
2965 : {
2966 0 : if ( xToolbarManager.is() )
2967 : {
2968 0 : xToolbarManager->elementRemoved( Event );
2969 0 : bRefreshLayout = pToolbarManager->isLayoutDirty();
2970 : }
2971 : }
2972 : else
2973 : {
2974 4 : Reference< XUIElement > xUIElement = implts_findElement( Event.ResourceURL );
2975 8 : Reference< XUIElementSettings > xElementSettings( xUIElement, UNO_QUERY );
2976 4 : if ( xElementSettings.is() )
2977 : {
2978 0 : bool bNoSettings( false );
2979 0 : OUString aConfigSourcePropName( "ConfigurationSource" );
2980 0 : Reference< XInterface > xElementCfgMgr;
2981 0 : Reference< XPropertySet > xPropSet( xElementSettings, UNO_QUERY );
2982 :
2983 0 : if ( xPropSet.is() )
2984 0 : xPropSet->getPropertyValue( aConfigSourcePropName ) >>= xElementCfgMgr;
2985 :
2986 0 : if ( !xElementCfgMgr.is() )
2987 0 : return;
2988 :
2989 : // Check if the same UI configuration manager has changed => check further
2990 0 : if ( Event.Source == xElementCfgMgr )
2991 : {
2992 : // Same UI configuration manager where our element has its settings
2993 0 : if ( Event.Source == Reference< XInterface >( xDocCfgMgr, UNO_QUERY ))
2994 : {
2995 : // document settings removed
2996 0 : if ( xModuleCfgMgr->hasSettings( Event.ResourceURL ))
2997 : {
2998 0 : xPropSet->setPropertyValue( aConfigSourcePropName, makeAny( m_xModuleCfgMgr ));
2999 0 : xElementSettings->updateSettings();
3000 0 : return;
3001 : }
3002 : }
3003 :
3004 0 : bNoSettings = true;
3005 : }
3006 :
3007 : // No settings anymore, element must be destroyed
3008 0 : if ( xContainerWindow.is() && bNoSettings )
3009 : {
3010 0 : if ( aElementType.equalsIgnoreAsciiCase("menubar") &&
3011 0 : aElementName.equalsIgnoreAsciiCase("menubar") )
3012 : {
3013 0 : SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow );
3014 0 : if ( pSysWindow && !m_bInplaceMenuSet )
3015 0 : pSysWindow->SetMenuBar( 0 );
3016 :
3017 0 : Reference< XComponent > xComp( xMenuBar, UNO_QUERY );
3018 0 : if ( xComp.is() )
3019 0 : xComp->dispose();
3020 :
3021 0 : SolarMutexGuard g;
3022 0 : m_xMenuBar.clear();
3023 : }
3024 0 : }
3025 4 : }
3026 : }
3027 :
3028 4 : if ( bRefreshLayout )
3029 4 : doLayout();
3030 4 : }
3031 : }
3032 :
3033 14 : void SAL_CALL LayoutManager::elementReplaced( const ui::ConfigurationEvent& Event ) throw (uno::RuntimeException, std::exception)
3034 : {
3035 14 : SolarMutexClearableGuard aReadLock;
3036 28 : Reference< XFrame > xFrame( m_xFrame );
3037 28 : Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager );
3038 14 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
3039 14 : aReadLock.clear();
3040 :
3041 14 : if ( xFrame.is() )
3042 : {
3043 14 : OUString aElementType;
3044 28 : OUString aElementName;
3045 14 : bool bRefreshLayout(false);
3046 :
3047 14 : parseResourceURL( Event.ResourceURL, aElementType, aElementName );
3048 14 : if ( aElementType.equalsIgnoreAsciiCase( UIRESOURCETYPE_TOOLBAR ))
3049 : {
3050 0 : if ( xToolbarManager.is() )
3051 : {
3052 0 : xToolbarManager->elementReplaced( Event );
3053 0 : bRefreshLayout = pToolbarManager->isLayoutDirty();
3054 : }
3055 : }
3056 : else
3057 : {
3058 14 : Reference< XUIElement > xUIElement = implts_findElement( Event.ResourceURL );
3059 28 : Reference< XUIElementSettings > xElementSettings( xUIElement, UNO_QUERY );
3060 14 : if ( xElementSettings.is() )
3061 : {
3062 12 : OUString aConfigSourcePropName( "ConfigurationSource" );
3063 24 : Reference< XInterface > xElementCfgMgr;
3064 24 : Reference< XPropertySet > xPropSet( xElementSettings, UNO_QUERY );
3065 :
3066 12 : if ( xPropSet.is() )
3067 12 : xPropSet->getPropertyValue( aConfigSourcePropName ) >>= xElementCfgMgr;
3068 :
3069 12 : if ( !xElementCfgMgr.is() )
3070 14 : return;
3071 :
3072 : // Check if the same UI configuration manager has changed => update settings
3073 12 : if ( Event.Source == xElementCfgMgr )
3074 24 : xElementSettings->updateSettings();
3075 14 : }
3076 : }
3077 :
3078 14 : if ( bRefreshLayout )
3079 14 : doLayout();
3080 14 : }
3081 : }
3082 :
3083 : // OPropertySetHelper
3084 :
3085 10980 : sal_Bool SAL_CALL LayoutManager::convertFastPropertyValue( Any& aConvertedValue,
3086 : Any& aOldValue,
3087 : sal_Int32 nHandle,
3088 : const Any& aValue ) throw( lang::IllegalArgumentException )
3089 : {
3090 10980 : return LayoutManager_PBase::convertFastPropertyValue( aConvertedValue, aOldValue, nHandle, aValue );
3091 : }
3092 :
3093 10980 : void SAL_CALL LayoutManager::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle,
3094 : const uno::Any& aValue ) throw( uno::Exception, std::exception )
3095 : {
3096 10980 : if ( nHandle != LAYOUTMANAGER_PROPHANDLE_REFRESHVISIBILITY )
3097 10980 : LayoutManager_PBase::setFastPropertyValue_NoBroadcast( nHandle, aValue );
3098 :
3099 10980 : switch( nHandle )
3100 : {
3101 : case LAYOUTMANAGER_PROPHANDLE_MENUBARCLOSER:
3102 10976 : implts_updateMenuBarClose();
3103 10976 : break;
3104 :
3105 : case LAYOUTMANAGER_PROPHANDLE_REFRESHVISIBILITY:
3106 : {
3107 0 : bool bValue(false);
3108 0 : if (( aValue >>= bValue ) && bValue )
3109 : {
3110 0 : SolarMutexClearableGuard aReadLock;
3111 0 : ToolbarLayoutManager* pToolbarManager = m_pToolbarManager;
3112 0 : bool bAutomaticToolbars( m_bAutomaticToolbars );
3113 0 : aReadLock.clear();
3114 :
3115 0 : if ( pToolbarManager )
3116 0 : pToolbarManager->refreshToolbarsVisibility( bAutomaticToolbars );
3117 : }
3118 0 : break;
3119 : }
3120 :
3121 : case LAYOUTMANAGER_PROPHANDLE_HIDECURRENTUI:
3122 0 : implts_setCurrentUIVisibility( !m_bHideCurrentUI );
3123 0 : break;
3124 4 : default: break;
3125 : }
3126 10980 : }
3127 :
3128 5508 : void SAL_CALL LayoutManager::getFastPropertyValue( uno::Any& aValue, sal_Int32 nHandle ) const
3129 : {
3130 5508 : LayoutManager_PBase::getFastPropertyValue( aValue, nHandle );
3131 5508 : }
3132 :
3133 : namespace detail
3134 : {
3135 : class InfoHelperBuilder : private ::boost::noncopyable
3136 : {
3137 : private:
3138 : ::cppu::OPropertyArrayHelper *m_pInfoHelper;
3139 : public:
3140 160 : InfoHelperBuilder(const LayoutManager &rManager)
3141 160 : {
3142 160 : uno::Sequence< beans::Property > aProperties;
3143 160 : rManager.describeProperties(aProperties);
3144 160 : m_pInfoHelper = new ::cppu::OPropertyArrayHelper(aProperties, sal_True);
3145 160 : }
3146 160 : ~InfoHelperBuilder()
3147 : {
3148 160 : delete m_pInfoHelper;
3149 160 : }
3150 :
3151 43956 : ::cppu::OPropertyArrayHelper& getHelper() { return *m_pInfoHelper; }
3152 : };
3153 : }
3154 : namespace
3155 : {
3156 : struct theInfoHelper :
3157 : public rtl::StaticWithArg< detail::InfoHelperBuilder, LayoutManager,
3158 : theInfoHelper >
3159 : {
3160 : };
3161 : }
3162 :
3163 43956 : ::cppu::IPropertyArrayHelper& SAL_CALL LayoutManager::getInfoHelper()
3164 : {
3165 43956 : return theInfoHelper::get(*this).getHelper();
3166 : }
3167 :
3168 0 : uno::Reference< beans::XPropertySetInfo > SAL_CALL LayoutManager::getPropertySetInfo() throw (uno::RuntimeException, std::exception)
3169 : {
3170 : static uno::Reference< beans::XPropertySetInfo >* pInfo = NULL;
3171 :
3172 0 : if( pInfo == NULL )
3173 : {
3174 0 : osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() );
3175 :
3176 0 : if( pInfo == NULL )
3177 : {
3178 0 : static uno::Reference< beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
3179 0 : pInfo = &xInfo;
3180 0 : }
3181 : }
3182 :
3183 0 : return (*pInfo);
3184 : }
3185 :
3186 : } // namespace framework
3187 :
3188 : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
3189 5576 : com_sun_star_comp_framework_LayoutManager_get_implementation(
3190 : css::uno::XComponentContext *context,
3191 : css::uno::Sequence<css::uno::Any> const &)
3192 : {
3193 5576 : return cppu::acquire(new framework::LayoutManager(context));
3194 951 : }
3195 :
3196 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|