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