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