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