diff options
Diffstat (limited to 'framework/source/layoutmanager/layoutmanager.cxx')
-rw-r--r-- | framework/source/layoutmanager/layoutmanager.cxx | 3271 |
1 files changed, 0 insertions, 3271 deletions
diff --git a/framework/source/layoutmanager/layoutmanager.cxx b/framework/source/layoutmanager/layoutmanager.cxx deleted file mode 100644 index 47368e6f3f..0000000000 --- a/framework/source/layoutmanager/layoutmanager.cxx +++ /dev/null @@ -1,3271 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: layoutmanager.cxx,v $ - * $Revision: 1.72 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_framework.hxx" - -// my own includes -#include <services/layoutmanager.hxx> -#include <helpers.hxx> -#include <threadhelp/resetableguard.hxx> -#include <services.h> - -#include <framework/sfxhelperfunctions.hxx> -#include <framework/sfxhelperfunctions.hxx> -#include <uielement/menubarwrapper.hxx> -#include <framework/addonsoptions.hxx> -#include <uiconfiguration/windowstateconfiguration.hxx> -#include <classes/fwkresid.hxx> -#include <classes/resource.hrc> -#include <toolkit/helper/convert.hxx> -#include <uielement/progressbarwrapper.hxx> -#include <uiconfiguration/globalsettings.hxx> -#include <toolbarlayoutmanager.hxx> - -// interface includes -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/frame/XModel.hpp> -#include <com/sun/star/frame/FrameAction.hpp> -#include <com/sun/star/frame/XUIControllerRegistration.hpp> -#include <com/sun/star/lang/XMultiComponentFactory.hpp> -#include <com/sun/star/awt/XTopWindow.hpp> -#include <com/sun/star/awt/XSystemDependentMenuPeer.hpp> -#include <com/sun/star/lang/SystemDependent.hpp> -#include <com/sun/star/awt/VclWindowPeerAttribute.hpp> -#include <com/sun/star/awt/PosSize.hpp> -#include <com/sun/star/awt/XDevice.hpp> -#include <com/sun/star/awt/XSystemDependentWindowPeer.hpp> -#include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> -#include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp> -#include <com/sun/star/ui/UIElementType.hpp> -#include <com/sun/star/container/XNameReplace.hpp> -#include <com/sun/star/container/XNameContainer.hpp> -#include <com/sun/star/frame/LayoutManagerEvents.hpp> -#include <com/sun/star/frame/XDispatchProvider.hpp> -#include <com/sun/star/frame/XDispatchHelper.hpp> -#include <com/sun/star/lang/DisposedException.hpp> - -// other includes -#include <svtools/imgdef.hxx> -#include <tools/diagnose_ex.h> -#include <vcl/window.hxx> -#include <vcl/wrkwin.hxx> -#include <vcl/dockingarea.hxx> -#include <vcl/svapp.hxx> -#include <vcl/i18nhelp.hxx> -#include <vcl/wall.hxx> -#include <toolkit/unohlp.hxx> -#include <toolkit/awt/vclxwindow.hxx> -#include <toolkit/awt/vclxmenu.hxx> -#include <comphelper/mediadescriptor.hxx> -#include <comphelper/uno3.hxx> -#include <rtl/logfile.hxx> -#include <rtl/instance.hxx> -#include <unotools/cmdoptions.hxx> - -#include <rtl/strbuf.hxx> - -#include <algorithm> -#include <boost/bind.hpp> - -// using namespace -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::util; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::ui; -using namespace ::com::sun::star::frame; - - -// ATTENTION! -// This value is directly copied from the sfx2 project. -// You have to change BOTH values, see sfx2/inc/sfx2/sfxsids.hrc (SID_DOCKWIN_START) -static const sal_Int32 DOCKWIN_ID_BASE = 9800; - -namespace framework -{ - -IMPLEMENT_FORWARD_XTYPEPROVIDER2( LayoutManager, LayoutManager_Base, LayoutManager_PBase ) -IMPLEMENT_FORWARD_XINTERFACE2( LayoutManager, LayoutManager_Base, LayoutManager_PBase ) -DEFINE_XSERVICEINFO_MULTISERVICE( LayoutManager, ::cppu::OWeakObject, SERVICENAME_LAYOUTMANAGER, IMPLEMENTATIONNAME_LAYOUTMANAGER) -DEFINE_INIT_SERVICE( LayoutManager, {} ) - -LayoutManager::LayoutManager( const Reference< XMultiServiceFactory >& xServiceManager ) : LayoutManager_Base() - , ThreadHelpBase( &Application::GetSolarMutex()) - , ::cppu::OBroadcastHelperVar< ::cppu::OMultiTypeInterfaceContainerHelper, ::cppu::OMultiTypeInterfaceContainerHelper::keyType >( m_aLock.getShareableOslMutex()) - , LayoutManager_PBase( *(static_cast< ::cppu::OBroadcastHelper* >(this)) ) - , m_xSMGR( xServiceManager ) - , m_xURLTransformer( xServiceManager->createInstance( SERVICENAME_URLTRANSFORMER ), UNO_QUERY ) - , m_xDisplayAccess( xServiceManager->createInstance( SERVICENAME_DISPLAYACCESS ), UNO_QUERY ) - , m_nLockCount( 0 ) - , m_bActive( false ) - , m_bInplaceMenuSet( false ) - , m_bDockingInProgress( false ) - , m_bMenuVisible( true ) - , m_bComponentAttached( false ) - , m_bDoLayout( false ) - , m_bVisible( true ) - , m_bParentWindowVisible( false ) - , m_bMustDoLayout( true ) - , m_bAutomaticToolbars( true ) - , m_bStoreWindowState( false ) - , m_bHideCurrentUI( false ) - , m_bGlobalSettings( false ) - , m_bPreserveContentSize( false ) - , m_bMenuBarCloser( false ) - , m_pInplaceMenuBar( NULL ) - , m_xModuleManager( Reference< XModuleManager >( xServiceManager->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY )) - , m_xUIElementFactoryManager( Reference< ui::XUIElementFactory >( - xServiceManager->createInstance( SERVICENAME_UIELEMENTFACTORYMANAGER ), UNO_QUERY )) - , m_xPersistentWindowStateSupplier( Reference< XNameAccess >( - xServiceManager->createInstance( SERVICENAME_WINDOWSTATECONFIGURATION ), UNO_QUERY )) - , m_pGlobalSettings( 0 ) - , m_aStatusBarAlias( RTL_CONSTASCII_USTRINGPARAM( "private:resource/statusbar/statusbar" )) - , m_aProgressBarAlias( RTL_CONSTASCII_USTRINGPARAM( "private:resource/progressbar/progressbar" )) - , m_aPropDocked( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_DOCKED )) - , m_aPropVisible( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_VISIBLE )) - , m_aPropDockingArea( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_DOCKINGAREA )) - , m_aPropDockPos( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_DOCKPOS )) - , m_aPropPos( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_POS )) - , m_aPropSize( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_SIZE )) - , m_aPropUIName( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_UINAME )) - , m_aPropStyle( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_STYLE )) - , m_aPropLocked( RTL_CONSTASCII_USTRINGPARAM( WINDOWSTATE_PROPERTY_LOCKED )) - , m_aCustomizeCmd( RTL_CONSTASCII_USTRINGPARAM( "ConfigureDialog" )) - , m_aListenerContainer( m_aLock.getShareableOslMutex() ) - , m_pToolbarManager( 0 ) -{ - // Initialize statusbar member - const sal_Bool bRefreshVisibility = sal_False; - m_aStatusBarElement.m_aType = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "statusbar" )); - m_aStatusBarElement.m_aName = m_aStatusBarAlias; - - m_pToolbarManager = new ToolbarLayoutManager( xServiceManager, m_xUIElementFactoryManager, this ); - m_xToolbarManager = uno::Reference< ui::XUIConfigurationListener >( static_cast< OWeakObject* >( m_pToolbarManager ), uno::UNO_QUERY ); - - Application::AddEventListener( LINK( this, LayoutManager, SettingsChanged ) ); - - m_aAsyncLayoutTimer.SetTimeout( 50 ); - m_aAsyncLayoutTimer.SetTimeoutHdl( LINK( this, LayoutManager, AsyncLayoutHdl ) ); - - registerProperty( LAYOUTMANAGER_PROPNAME_AUTOMATICTOOLBARS, LAYOUTMANAGER_PROPHANDLE_AUTOMATICTOOLBARS, css::beans::PropertyAttribute::TRANSIENT, &m_bAutomaticToolbars, ::getCppuType( &m_bAutomaticToolbars ) ); - registerProperty( LAYOUTMANAGER_PROPNAME_HIDECURRENTUI, LAYOUTMANAGER_PROPHANDLE_HIDECURRENTUI, beans::PropertyAttribute::TRANSIENT, &m_bHideCurrentUI, ::getCppuType( &m_bHideCurrentUI ) ); - registerProperty( LAYOUTMANAGER_PROPNAME_LOCKCOUNT, LAYOUTMANAGER_PROPHANDLE_LOCKCOUNT, beans::PropertyAttribute::TRANSIENT | beans::PropertyAttribute::READONLY, &m_nLockCount, getCppuType( &m_nLockCount ) ); - registerProperty( LAYOUTMANAGER_PROPNAME_MENUBARCLOSER, LAYOUTMANAGER_PROPHANDLE_MENUBARCLOSER, beans::PropertyAttribute::TRANSIENT, &m_bMenuBarCloser, ::getCppuType( &m_bMenuBarCloser ) ); - registerPropertyNoMember( LAYOUTMANAGER_PROPNAME_REFRESHVISIBILITY, LAYOUTMANAGER_PROPHANDLE_REFRESHVISIBILITY, beans::PropertyAttribute::TRANSIENT, ::getCppuType( &bRefreshVisibility ), &bRefreshVisibility ); - registerProperty( LAYOUTMANAGER_PROPNAME_PRESERVE_CONTENT_SIZE, LAYOUTMANAGER_PROPHANDLE_PRESERVE_CONTENT_SIZE, beans::PropertyAttribute::TRANSIENT, &m_bPreserveContentSize, ::getCppuType( &m_bPreserveContentSize ) ); -} - -LayoutManager::~LayoutManager() -{ - Application::RemoveEventListener( LINK( this, LayoutManager, SettingsChanged ) ); - m_aAsyncLayoutTimer.Stop(); - delete m_pGlobalSettings; -} - -// Internal helper function -void LayoutManager::impl_clearUpMenuBar() -{ - implts_lock(); - - // Clear up VCL menu bar to prepare shutdown - if ( m_xContainerWindow.is() ) - { - SolarMutexGuard aGuard; - - SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow ); - if ( pSysWindow ) - { - MenuBar* pSetMenuBar = 0; - if ( m_xInplaceMenuBar.is() ) - pSetMenuBar = (MenuBar *)m_pInplaceMenuBar->GetMenuBar(); - else - { - Reference< awt::XMenuBar > xMenuBar; - - Reference< XPropertySet > xPropSet( m_xMenuBar, UNO_QUERY ); - if ( xPropSet.is() ) - { - try - { - xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMenuBar" ))) >>= xMenuBar; - } - catch (const beans::UnknownPropertyException&) - { - } - catch (const lang::WrappedTargetException&) - { - } - } - - VCLXMenu* pAwtMenuBar = VCLXMenu::GetImplementation( xMenuBar ); - if ( pAwtMenuBar ) - pSetMenuBar = (MenuBar*)pAwtMenuBar->GetMenu(); - } - - MenuBar* pTopMenuBar = pSysWindow->GetMenuBar(); - if ( pSetMenuBar == pTopMenuBar ) - pSysWindow->SetMenuBar( 0 ); - } - } - - // reset inplace menubar manager - m_pInplaceMenuBar = 0; - if ( m_xInplaceMenuBar.is() ) - { - m_xInplaceMenuBar->dispose(); - m_xInplaceMenuBar.clear(); - } - - Reference< XComponent > xComp( m_xMenuBar, UNO_QUERY ); - if ( xComp.is() ) - xComp->dispose(); - m_xMenuBar.clear(); - implts_unlock(); -} - -void LayoutManager::implts_lock() -{ - WriteGuard aWriteLock( m_aLock ); - ++m_nLockCount; -} - -sal_Bool LayoutManager::implts_unlock() -{ - WriteGuard aWriteLock( m_aLock ); - m_nLockCount = std::max( m_nLockCount-1, static_cast<sal_Int32>(0) ); - return ( m_nLockCount == 0 ); -} - -void LayoutManager::implts_reset( sal_Bool bAttached ) -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - Reference< XFrame > xFrame = m_xFrame; - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - Reference< XUIConfiguration > xModuleCfgMgr( m_xModuleCfgMgr, UNO_QUERY ); - Reference< XUIConfiguration > xDocCfgMgr( m_xDocCfgMgr, UNO_QUERY ); - Reference< XNameAccess > xPersistentWindowState( m_xPersistentWindowState ); - Reference< XMultiServiceFactory > xServiceManager( m_xSMGR ); - Reference< XNameAccess > xPersistentWindowStateSupplier( m_xPersistentWindowStateSupplier ); - Reference< awt::XWindowListener > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager( m_pToolbarManager ); - ::rtl::OUString aModuleIdentifier( m_aModuleIdentifier ); - bool bAutomaticToolbars( m_bAutomaticToolbars ); - aReadLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - implts_lock(); - - Reference< XModel > xModel; - if ( xFrame.is() ) - { - if ( bAttached ) - { - ::rtl::OUString aOldModuleIdentifier( aModuleIdentifier ); - try - { - aModuleIdentifier = m_xModuleManager->identify( Reference< XInterface >( xFrame, UNO_QUERY ) ); - } - catch( Exception& ) {} - - if ( aModuleIdentifier.getLength() && aOldModuleIdentifier != aModuleIdentifier ) - { - Reference< XModuleUIConfigurationManagerSupplier > xModuleCfgSupplier; - if ( xServiceManager.is() ) - xModuleCfgSupplier = Reference< XModuleUIConfigurationManagerSupplier >( - xServiceManager->createInstance( SERVICENAME_MODULEUICONFIGURATIONMANAGERSUPPLIER ), UNO_QUERY ); - - if ( xModuleCfgMgr.is() ) - { - try - { - // Remove listener to old module ui configuration manager - xModuleCfgMgr->removeConfigurationListener( Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - } - catch (const Exception&) - { - } - } - - try - { - // Add listener to new module ui configuration manager - xModuleCfgMgr = Reference< XUIConfiguration >( xModuleCfgSupplier->getUIConfigurationManager( aModuleIdentifier ), UNO_QUERY ); - if ( xModuleCfgMgr.is() ) - xModuleCfgMgr->addConfigurationListener( Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - } - catch (const Exception&) - { - } - - try - { - // Retrieve persistent window state reference for our new module - if ( xPersistentWindowStateSupplier.is() ) - xPersistentWindowStateSupplier->getByName( aModuleIdentifier ) >>= xPersistentWindowState; - } - catch (const NoSuchElementException&) - { - } - catch (const WrappedTargetException&) - { - } - } - - xModel = impl_getModelFromFrame( xFrame ); - if ( xModel.is() ) - { - Reference< XUIConfigurationManagerSupplier > xUIConfigurationManagerSupplier( xModel, UNO_QUERY ); - if ( xUIConfigurationManagerSupplier.is() ) - { - if ( xDocCfgMgr.is() ) - { - try - { - // Remove listener to old ui configuration manager - xDocCfgMgr->removeConfigurationListener( Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - } - catch (const Exception&) - { - } - } - - try - { - xDocCfgMgr = Reference< XUIConfiguration >( xUIConfigurationManagerSupplier->getUIConfigurationManager(), UNO_QUERY ); - if ( xDocCfgMgr.is() ) - xDocCfgMgr->addConfigurationListener( Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - } - catch (const Exception&) - { - } - } - } - } - else - { - // Remove configuration listeners before we can release our references - if ( xModuleCfgMgr.is() ) - { - try - { - xModuleCfgMgr->removeConfigurationListener( - Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - } - catch (const Exception&) - { - } - } - - if ( xDocCfgMgr.is() ) - { - try - { - xDocCfgMgr->removeConfigurationListener( - Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - } - catch (const Exception&) - { - } - } - - // Release references to our configuration managers as we currently don't have - // an attached module. - xModuleCfgMgr.clear(); - xDocCfgMgr.clear(); - xPersistentWindowState.clear(); - aModuleIdentifier = ::rtl::OUString(); - } - - Reference< XUIConfigurationManager > xModCfgMgr( xModuleCfgMgr, UNO_QUERY ); - Reference< XUIConfigurationManager > xDokCfgMgr( xDocCfgMgr, UNO_QUERY ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - m_xModel = xModel; - m_aDockingArea = awt::Rectangle(); - m_bComponentAttached = bAttached; - m_aModuleIdentifier = aModuleIdentifier; - m_xModuleCfgMgr = xModCfgMgr; - m_xDocCfgMgr = xDokCfgMgr; - m_xPersistentWindowState = xPersistentWindowState; - m_aStatusBarElement.m_bStateRead = sal_False; // reset state to read data again! - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - // reset/notify toolbar layout manager - if ( pToolbarManager ) - { - if ( bAttached ) - { - pToolbarManager->attach( xFrame, xModCfgMgr, xDokCfgMgr, xPersistentWindowState ); - uno::Reference< awt::XWindowPeer > xParent( xContainerWindow, UNO_QUERY ); - pToolbarManager->setParentWindow( xParent ); - if ( bAutomaticToolbars ) - pToolbarManager->createStaticToolbars(); - } - else - { - pToolbarManager->reset(); - implts_destroyElements(); - } - } - } - - implts_unlock(); -} - -sal_Bool LayoutManager::implts_isEmbeddedLayoutManager() const -{ - ReadGuard aReadLock( m_aLock ); - Reference< XFrame > xFrame = m_xFrame; - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - aReadLock.unlock(); - - Reference< awt::XWindow > xFrameContainerWindow = xFrame->getContainerWindow(); - if ( xFrameContainerWindow == xContainerWindow ) - return sal_False; - else - return sal_True; -} - -void LayoutManager::implts_destroyElements() -{ - WriteGuard aWriteLock( m_aLock ); - uno::Reference< ui::XUIConfigurationListener > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aWriteLock.unlock(); - - if ( pToolbarManager ) - pToolbarManager->destroyToolbars(); - - implts_destroyStatusBar(); - - aWriteLock.lock(); - impl_clearUpMenuBar(); - aWriteLock.unlock(); -} - -void LayoutManager::implts_toggleFloatingUIElementsVisibility( sal_Bool bActive ) -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< ui::XUIConfigurationListener > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - pToolbarManager->setFloatingToolbarsVisibility( bActive ); -} - -uno::Reference< ui::XUIElement > LayoutManager::implts_findElement( const rtl::OUString& aName ) -{ - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - parseResourceURL( aName, aElementType, aElementName ); - if ( aElementType.equalsIgnoreAsciiCaseAscii( "menubar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "menubar" )) - return m_xMenuBar; - else if (( aElementType.equalsIgnoreAsciiCaseAscii( "statusbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "statusbar" )) || ( m_aStatusBarElement.m_aName == aName )) - return m_aStatusBarElement.m_xUIElement; - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "progressbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "progressbar" )) - return m_aProgressBarElement.m_xUIElement; - - return uno::Reference< ui::XUIElement >(); -} - -sal_Bool LayoutManager::implts_readWindowStateData( const rtl::OUString& aName, UIElement& rElementData ) -{ - sal_Bool bGetSettingsState( sal_False ); - - WriteGuard aWriteLock( m_aLock ); - Reference< XNameAccess > xPersistentWindowState( m_xPersistentWindowState ); - aWriteLock.unlock(); - - if ( xPersistentWindowState.is() ) - { - aWriteLock.lock(); - sal_Bool bGlobalSettings( m_bGlobalSettings ); - GlobalSettings* pGlobalSettings( 0 ); - if ( m_pGlobalSettings == 0 ) - { - m_pGlobalSettings = new GlobalSettings( m_xSMGR ); - bGetSettingsState = sal_True; - } - pGlobalSettings = m_pGlobalSettings; - aWriteLock.unlock(); - - try - { - Sequence< PropertyValue > aWindowState; - if ( xPersistentWindowState->hasByName( aName ) && (xPersistentWindowState->getByName( aName ) >>= aWindowState) ) - { - sal_Bool bValue( sal_False ); - for ( sal_Int32 n = 0; n < aWindowState.getLength(); n++ ) - { - if ( aWindowState[n].Name == m_aPropDocked ) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bFloating = !bValue; - } - else if ( aWindowState[n].Name == m_aPropVisible ) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bVisible = bValue; - } - else if ( aWindowState[n].Name == m_aPropDockingArea ) - { - ui::DockingArea eDockingArea; - if ( aWindowState[n].Value >>= eDockingArea ) - rElementData.m_aDockedData.m_nDockedArea = sal_Int16( eDockingArea ); - } - else if ( aWindowState[n].Name == m_aPropDockPos ) - { - awt::Point aPoint; - if ( aWindowState[n].Value >>= aPoint ) - rElementData.m_aDockedData.m_aPos = aPoint; - } - else if ( aWindowState[n].Name == m_aPropPos ) - { - awt::Point aPoint; - if ( aWindowState[n].Value >>= aPoint ) - rElementData.m_aFloatingData.m_aPos = aPoint; - } - else if ( aWindowState[n].Name == m_aPropSize ) - { - awt::Size aSize; - if ( aWindowState[n].Value >>= aSize ) - rElementData.m_aFloatingData.m_aSize = aSize; - } - else if ( aWindowState[n].Name == m_aPropUIName ) - aWindowState[n].Value >>= rElementData.m_aUIName; - else if ( aWindowState[n].Name == m_aPropStyle ) - { - sal_Int32 nStyle = 0; - if ( aWindowState[n].Value >>= nStyle ) - rElementData.m_nStyle = sal_Int16( nStyle ); - } - else if ( aWindowState[n].Name == m_aPropLocked ) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_aDockedData.m_bLocked = bValue; - } - else if ( aWindowState[n].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(WINDOWSTATE_PROPERTY_CONTEXT))) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bContextSensitive = bValue; - } - else if ( aWindowState[n].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(WINDOWSTATE_PROPERTY_NOCLOSE))) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bNoClose = bValue; - } - else if ( aWindowState[n].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(WINDOWSTATE_PROPERTY_CONTEXTACTIVE))) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bContextActive = bValue; - } - else if ( aWindowState[n].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(WINDOWSTATE_PROPERTY_SOFTCLOSE))) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bSoftClose = bValue; - } - } - } - - // oversteer values with global settings - if ( pGlobalSettings && ( bGetSettingsState || bGlobalSettings )) - { - if ( pGlobalSettings->HasStatesInfo( GlobalSettings::UIELEMENT_TYPE_TOOLBAR )) - { - WriteGuard aWriteLock2( m_aLock ); - m_bGlobalSettings = sal_True; - aWriteLock2.unlock(); - - uno::Any aValue; - sal_Bool bValue = sal_Bool(); - if ( pGlobalSettings->GetStateInfo( GlobalSettings::UIELEMENT_TYPE_TOOLBAR, - GlobalSettings::STATEINFO_LOCKED, - aValue )) - aValue >>= rElementData.m_aDockedData.m_bLocked; - if ( pGlobalSettings->GetStateInfo( GlobalSettings::UIELEMENT_TYPE_TOOLBAR, - GlobalSettings::STATEINFO_DOCKED, - aValue )) - { - if ( aValue >>= bValue ) - rElementData.m_bFloating = !bValue; - } - } - } - - return sal_True; - } - catch (const NoSuchElementException&) - { - } - } - - return sal_False; -} - -void LayoutManager::implts_writeWindowStateData( const rtl::OUString& aName, const UIElement& rElementData ) -{ - WriteGuard aWriteLock( m_aLock ); - Reference< XNameAccess > xPersistentWindowState( m_xPersistentWindowState ); - - // set flag to determine that we triggered the notification - m_bStoreWindowState = sal_True; - aWriteLock.unlock(); - - sal_Bool bPersistent( sal_False ); - Reference< XPropertySet > xPropSet( rElementData.m_xUIElement, UNO_QUERY ); - if ( xPropSet.is() ) - { - try - { - // Check persistent flag of the user interface element - xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Persistent" ))) >>= bPersistent; - } - catch (const beans::UnknownPropertyException&) - { - // Non-configurable elements should at least store their dimension/position - bPersistent = sal_True; - } - catch (const lang::WrappedTargetException&) - { - } - } - - if ( bPersistent && xPersistentWindowState.is() ) - { - try - { - Sequence< PropertyValue > aWindowState( 8 ); - - aWindowState[0].Name = m_aPropDocked; - aWindowState[0].Value = makeAny( sal_Bool( !rElementData.m_bFloating )); - aWindowState[1].Name = m_aPropVisible; - aWindowState[1].Value = makeAny( sal_Bool( rElementData.m_bVisible )); - - aWindowState[2].Name = m_aPropDockingArea; - aWindowState[2].Value = makeAny( static_cast< DockingArea >( rElementData.m_aDockedData.m_nDockedArea ) ); - - aWindowState[3].Name = m_aPropDockPos; - aWindowState[3].Value <<= rElementData.m_aDockedData.m_aPos; - - aWindowState[4].Name = m_aPropPos; - aWindowState[4].Value <<= rElementData.m_aFloatingData.m_aPos; - - aWindowState[5].Name = m_aPropSize; - aWindowState[5].Value <<= rElementData.m_aFloatingData.m_aSize; - aWindowState[6].Name = m_aPropUIName; - aWindowState[6].Value = makeAny( rElementData.m_aUIName ); - aWindowState[7].Name = m_aPropLocked; - aWindowState[7].Value = makeAny( rElementData.m_aDockedData.m_bLocked ); - - if ( xPersistentWindowState->hasByName( aName )) - { - Reference< XNameReplace > xReplace( xPersistentWindowState, uno::UNO_QUERY ); - xReplace->replaceByName( aName, makeAny( aWindowState )); - } - else - { - Reference< XNameContainer > xInsert( xPersistentWindowState, uno::UNO_QUERY ); - xInsert->insertByName( aName, makeAny( aWindowState )); - } - } - catch (const Exception&) - { - } - } - - // Reset flag - aWriteLock.lock(); - m_bStoreWindowState = sal_False; - aWriteLock.unlock(); -} - -::Size LayoutManager::implts_getContainerWindowOutputSize() -{ - ::Size aContainerWinSize; - Window* pContainerWindow( 0 ); - - // Retrieve output size from container Window - SolarMutexGuard aGuard; - pContainerWindow = VCLUnoHelper::GetWindow( m_xContainerWindow ); - if ( pContainerWindow ) - aContainerWinSize = pContainerWindow->GetOutputSizePixel(); - - return aContainerWinSize; -} - -Reference< XUIElement > LayoutManager::implts_createElement( const rtl::OUString& aName ) -{ - Reference< ui::XUIElement > xUIElement; - - ReadGuard aReadLock( m_aLock ); - Sequence< PropertyValue > aPropSeq( 2 ); - aPropSeq[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Frame" )); - aPropSeq[0].Value <<= m_xFrame; - aPropSeq[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Persistent" )); - aPropSeq[1].Value <<= sal_True; - - try - { - xUIElement = m_xUIElementFactoryManager->createUIElement( aName, aPropSeq ); - } - catch (const NoSuchElementException&) - { - } - catch (const IllegalArgumentException&) - { - } - - return xUIElement; -} - -void LayoutManager::implts_setVisibleState( sal_Bool bShow ) -{ - WriteGuard aWriteLock( m_aLock ); - m_aStatusBarElement.m_bMasterHide = !bShow; - aWriteLock.unlock(); - - implts_updateUIElementsVisibleState( bShow ); -} - -void LayoutManager::implts_updateUIElementsVisibleState( sal_Bool bSetVisible ) -{ - // notify listeners - uno::Any a; - if ( bSetVisible ) - implts_notifyListeners( frame::LayoutManagerEvents::VISIBLE, a ); - else - implts_notifyListeners( frame::LayoutManagerEvents::INVISIBLE, a ); - std::vector< Reference< awt::XWindow > > aWinVector; - - WriteGuard aWriteLock( m_aLock ); - Reference< XUIElement > xMenuBar( m_xMenuBar, UNO_QUERY ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - Reference< XComponent > xInplaceMenuBar( m_xInplaceMenuBar ); - MenuBarManager* pInplaceMenuBar( m_pInplaceMenuBar ); - aWriteLock.unlock(); - - bool bMustDoLayout(false); - if (( xMenuBar.is() || xInplaceMenuBar.is() ) && xContainerWindow.is() ) - { - SolarMutexGuard aGuard; - - MenuBar* pMenuBar( 0 ); - if ( xInplaceMenuBar.is() ) - pMenuBar = (MenuBar *)pInplaceMenuBar->GetMenuBar(); - else - { - MenuBarWrapper* pMenuBarWrapper = SAL_STATIC_CAST( MenuBarWrapper*, xMenuBar.get() ); - pMenuBar = (MenuBar *)pMenuBarWrapper->GetMenuBarManager()->GetMenuBar(); - } - - SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow ); - if ( pSysWindow ) - { - if ( bSetVisible ) - pSysWindow->SetMenuBar( pMenuBar ); - else - pSysWindow->SetMenuBar( 0 ); - bMustDoLayout = true; - } - } - - // Hide/show the statusbar according to bSetVisible - if ( bSetVisible ) - bMustDoLayout = !implts_showStatusBar(); - else - bMustDoLayout = !implts_hideStatusBar(); - - aWriteLock.lock(); - uno::Reference< ui::XUIConfigurationListener > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager( m_pToolbarManager ); - aWriteLock.unlock(); - - if ( pToolbarManager ) - { - pToolbarManager->setVisible( bSetVisible ); - bMustDoLayout = pToolbarManager->isLayoutDirty(); - } - - if ( bMustDoLayout ) - implts_doLayout_notify( sal_False ); -} - -void LayoutManager::implts_setCurrentUIVisibility( sal_Bool bShow ) -{ - WriteGuard aWriteLock( m_aLock ); - if ( !bShow && m_aStatusBarElement.m_bVisible && m_aStatusBarElement.m_xUIElement.is() ) - m_aStatusBarElement.m_bMasterHide = true; - else if ( bShow && m_aStatusBarElement.m_bVisible ) - m_aStatusBarElement.m_bMasterHide = false; - aWriteLock.unlock(); - - implts_updateUIElementsVisibleState( bShow ); -} - -void LayoutManager::implts_destroyStatusBar() -{ - Reference< XComponent > xCompStatusBar; - - WriteGuard aWriteLock( m_aLock ); - m_aStatusBarElement.m_aName = rtl::OUString(); - xCompStatusBar = Reference< XComponent >( m_aStatusBarElement.m_xUIElement, UNO_QUERY ); - m_aStatusBarElement.m_xUIElement.clear(); - aWriteLock.unlock(); - - if ( xCompStatusBar.is() ) - xCompStatusBar->dispose(); - - implts_destroyProgressBar(); -} - -void LayoutManager::implts_createStatusBar( const rtl::OUString& aStatusBarName ) -{ - WriteGuard aWriteLock( m_aLock ); - if ( !m_aStatusBarElement.m_xUIElement.is() ) - { - implts_readStatusBarState( aStatusBarName ); - m_aStatusBarElement.m_aName = aStatusBarName; - m_aStatusBarElement.m_xUIElement = implts_createElement( aStatusBarName ); - } - aWriteLock.unlock(); - - implts_createProgressBar(); -} - -void LayoutManager::implts_readStatusBarState( const rtl::OUString& rStatusBarName ) -{ - WriteGuard aWriteLock( m_aLock ); - if ( !m_aStatusBarElement.m_bStateRead ) - { - // Read persistent data for status bar if not yet read! - if ( implts_readWindowStateData( rStatusBarName, m_aStatusBarElement )) - m_aStatusBarElement.m_bStateRead = sal_True; - } -} - -void LayoutManager::implts_createProgressBar() -{ - Reference< XUIElement > xStatusBar; - Reference< XUIElement > xProgressBar; - Reference< XUIElement > xProgressBarBackup; - Reference< awt::XWindow > xContainerWindow; - - WriteGuard aWriteLock( m_aLock ); - xStatusBar = Reference< XUIElement >( m_aStatusBarElement.m_xUIElement, UNO_QUERY ); - xProgressBar = Reference< XUIElement >( m_aProgressBarElement.m_xUIElement, UNO_QUERY ); - xProgressBarBackup = m_xProgressBarBackup; - m_xProgressBarBackup.clear(); - xContainerWindow = m_xContainerWindow; - aWriteLock.unlock(); - - sal_Bool bRecycled = xProgressBarBackup.is(); - ProgressBarWrapper* pWrapper = 0; - if ( bRecycled ) - pWrapper = (ProgressBarWrapper*)xProgressBarBackup.get(); - else if ( xProgressBar.is() ) - pWrapper = (ProgressBarWrapper*)xProgressBar.get(); - else - pWrapper = new ProgressBarWrapper(); - - if ( xStatusBar.is() ) - { - Reference< awt::XWindow > xWindow( xStatusBar->getRealInterface(), UNO_QUERY ); - pWrapper->setStatusBar( xWindow ); - } - else - { - Reference< awt::XWindow > xStatusBarWindow = pWrapper->getStatusBar(); - - SolarMutexGuard aGuard; - Window* pStatusBarWnd = VCLUnoHelper::GetWindow( xStatusBarWindow ); - if ( !pStatusBarWnd ) - { - Window* pWindow = VCLUnoHelper::GetWindow( xContainerWindow ); - if ( pWindow ) - { - StatusBar* pStatusBar = new StatusBar( pWindow, WinBits( WB_LEFT | WB_3DLOOK ) ); - Reference< awt::XWindow > xStatusBarWindow2( VCLUnoHelper::GetInterface( pStatusBar )); - pWrapper->setStatusBar( xStatusBarWindow2, sal_True ); - } - } - } - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - aWriteLock.lock(); - m_aProgressBarElement.m_xUIElement = Reference< XUIElement >( - static_cast< cppu::OWeakObject* >( pWrapper ), UNO_QUERY ); - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - if ( bRecycled ) - implts_showProgressBar(); -} - -void LayoutManager::implts_backupProgressBarWrapper() -{ - // SAFE -> ---------------------------------- - WriteGuard aWriteLock(m_aLock); - - if (m_xProgressBarBackup.is()) - return; - - // safe a backup copy of the current progress! - // This copy will be used automaticly inside createProgressBar() which is called - // implictly from implts_doLayout() .-) - m_xProgressBarBackup = m_aProgressBarElement.m_xUIElement; - - // remove the relation between this old progress bar and our old status bar. - // Otherwhise we work on disposed items ... - // The internal used ProgressBarWrapper can handle a NULL reference. - if ( m_xProgressBarBackup.is() ) - { - ProgressBarWrapper* pWrapper = (ProgressBarWrapper*)m_xProgressBarBackup.get(); - if ( pWrapper ) - pWrapper->setStatusBar( Reference< awt::XWindow >(), sal_False ); - } - - // prevent us from dispose() the m_aProgressBarElement.m_xUIElement inside implts_reset() - m_aProgressBarElement.m_xUIElement.clear(); - - aWriteLock.unlock(); - // <- SAFE ---------------------------------- -} - -void LayoutManager::implts_destroyProgressBar() -{ - // dont remove the progressbar in general - // We must reuse it if a new status bar is created later. - // Of course there exists one backup only. - // And further this backup will be released inside our dtor. - implts_backupProgressBarWrapper(); -} - -void LayoutManager::implts_setStatusBarPosSize( const ::Point& rPos, const ::Size& rSize ) -{ - Reference< XUIElement > xStatusBar; - Reference< XUIElement > xProgressBar; - Reference< awt::XWindow > xContainerWindow; - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - xStatusBar = Reference< XUIElement >( m_aStatusBarElement.m_xUIElement, UNO_QUERY ); - xProgressBar = Reference< XUIElement >( m_aProgressBarElement.m_xUIElement, UNO_QUERY ); - xContainerWindow = m_xContainerWindow; - - Reference< awt::XWindow > xWindow; - if ( xStatusBar.is() ) - xWindow = Reference< awt::XWindow >( xStatusBar->getRealInterface(), UNO_QUERY ); - else if ( xProgressBar.is() ) - { - ProgressBarWrapper* pWrapper = (ProgressBarWrapper*)xProgressBar.get(); - if ( pWrapper ) - xWindow = pWrapper->getStatusBar(); - } - aReadLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - if ( xWindow.is() ) - { - SolarMutexGuard aGuard; - Window* pParentWindow = VCLUnoHelper::GetWindow( xContainerWindow ); - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pParentWindow && ( pWindow && pWindow->GetType() == WINDOW_STATUSBAR )) - { - Window* pOldParentWindow = pWindow->GetParent(); - if ( pParentWindow != pOldParentWindow ) - pWindow->SetParent( pParentWindow ); - ((StatusBar *)pWindow)->SetPosSizePixel( rPos, rSize ); - } - } -} - -sal_Bool LayoutManager::implts_showProgressBar() -{ - Reference< XUIElement > xStatusBar; - Reference< XUIElement > xProgressBar; - Reference< awt::XWindow > xWindow; - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - xStatusBar = Reference< XUIElement >( m_aStatusBarElement.m_xUIElement, UNO_QUERY ); - xProgressBar = Reference< XUIElement >( m_aProgressBarElement.m_xUIElement, UNO_QUERY ); - sal_Bool bVisible( m_bVisible ); - - m_aProgressBarElement.m_bVisible = sal_True; - if ( bVisible ) - { - if ( xStatusBar.is() && !m_aStatusBarElement.m_bMasterHide ) - { - xWindow = Reference< awt::XWindow >( xStatusBar->getRealInterface(), UNO_QUERY ); - } - else if ( xProgressBar.is() ) - { - ProgressBarWrapper* pWrapper = (ProgressBarWrapper*)xProgressBar.get(); - if ( pWrapper ) - xWindow = pWrapper->getStatusBar(); - } - } - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow ) - { - if ( !pWindow->IsVisible() ) - { - implts_setOffset( pWindow->GetSizePixel().Height() ); - pWindow->Show(); - implts_doLayout_notify( sal_False ); - } - return sal_True; - } - - return sal_False; -} - -sal_Bool LayoutManager::implts_hideProgressBar() -{ - Reference< XUIElement > xProgressBar; - Reference< awt::XWindow > xWindow; - sal_Bool bHideStatusBar( sal_False ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - xProgressBar = Reference< XUIElement >( m_aProgressBarElement.m_xUIElement, UNO_QUERY ); - - sal_Bool bInternalStatusBar( sal_False ); - if ( xProgressBar.is() ) - { - Reference< awt::XWindow > xStatusBar; - ProgressBarWrapper* pWrapper = (ProgressBarWrapper*)xProgressBar.get(); - if ( pWrapper ) - xWindow = pWrapper->getStatusBar(); - Reference< ui::XUIElement > xStatusBarElement = m_aStatusBarElement.m_xUIElement; - if ( xStatusBarElement.is() ) - xStatusBar = Reference< awt::XWindow >( xStatusBarElement->getRealInterface(), UNO_QUERY ); - bInternalStatusBar = xStatusBar != xWindow; - } - m_aProgressBarElement.m_bVisible = sal_False; - implts_readStatusBarState( m_aStatusBarAlias ); - bHideStatusBar = !m_aStatusBarElement.m_bVisible; - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->IsVisible() && ( bHideStatusBar || bInternalStatusBar )) - { - implts_setOffset( 0 ); - pWindow->Hide(); - implts_doLayout_notify( sal_False ); - return sal_True; - } - - return sal_False; -} - -sal_Bool LayoutManager::implts_showStatusBar( sal_Bool bStoreState ) -{ - WriteGuard aWriteLock( m_aLock ); - Reference< ui::XUIElement > xStatusBar = m_aStatusBarElement.m_xUIElement; - if ( bStoreState ) - m_aStatusBarElement.m_bVisible = sal_True; - aWriteLock.unlock(); - - if ( xStatusBar.is() ) - { - Reference< awt::XWindow > xWindow( xStatusBar->getRealInterface(), UNO_QUERY ); - - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && !pWindow->IsVisible() ) - { - implts_setOffset( pWindow->GetSizePixel().Height() ); - pWindow->Show(); - implts_doLayout_notify( sal_False ); - return sal_True; - } - } - - return sal_False; -} - -sal_Bool LayoutManager::implts_hideStatusBar( sal_Bool bStoreState ) -{ - WriteGuard aWriteLock( m_aLock ); - Reference< ui::XUIElement > xStatusBar = m_aStatusBarElement.m_xUIElement; - if ( bStoreState ) - m_aStatusBarElement.m_bVisible = sal_False; - aWriteLock.unlock(); - - if ( xStatusBar.is() ) - { - Reference< awt::XWindow > xWindow( xStatusBar->getRealInterface(), UNO_QUERY ); - - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->IsVisible() ) - { - implts_setOffset( 0 ); - pWindow->Hide(); - implts_doLayout_notify( sal_False ); - return sal_True; - } - } - - return sal_False; -} - -void LayoutManager::implts_setOffset( const sal_Int32 nBottomOffset ) -{ - ::Rectangle aOffsetRect; - setZeroRectangle( aOffsetRect ); - aOffsetRect.setHeight( nBottomOffset ); - - // make sure that the toolbar manager refernence/pointer is valid - uno::Reference< ui::XUIConfigurationListener > xThis( m_xToolbarManager ); - if ( xThis.is() ) - m_pToolbarManager->setDockingAreaOffsets( aOffsetRect ); -} - -void LayoutManager::implts_setInplaceMenuBar( const Reference< XIndexAccess >& xMergedMenuBar ) -throw (uno::RuntimeException) -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - if ( !m_bInplaceMenuSet ) - { - SolarMutexGuard aGuard; - - // Reset old inplace menubar! - m_pInplaceMenuBar = 0; - if ( m_xInplaceMenuBar.is() ) - m_xInplaceMenuBar->dispose(); - m_xInplaceMenuBar.clear(); - m_bInplaceMenuSet = sal_False; - - if ( m_xFrame.is() && m_xContainerWindow.is() ) - { - rtl::OUString aModuleIdentifier; - Reference< XDispatchProvider > xDispatchProvider; - - MenuBar* pMenuBar = new MenuBar; - m_pInplaceMenuBar = new MenuBarManager( m_xSMGR, m_xFrame, m_xURLTransformer,xDispatchProvider, aModuleIdentifier, pMenuBar, sal_True, sal_True ); - m_pInplaceMenuBar->SetItemContainer( xMergedMenuBar ); - - SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow ); - if ( pSysWindow ) - pSysWindow->SetMenuBar( pMenuBar ); - - m_bInplaceMenuSet = sal_True; - m_xInplaceMenuBar = Reference< XComponent >( (OWeakObject *)m_pInplaceMenuBar, UNO_QUERY ); - } - - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - implts_updateMenuBarClose(); - } -} - -void LayoutManager::implts_resetInplaceMenuBar() -throw (uno::RuntimeException) -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - m_bInplaceMenuSet = sal_False; - - if ( m_xContainerWindow.is() ) - { - SolarMutexGuard aGuard; - MenuBarWrapper* pMenuBarWrapper = SAL_STATIC_CAST( MenuBarWrapper*, m_xMenuBar.get() ); - SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow ); - if ( pSysWindow ) - { - if ( pMenuBarWrapper ) - pSysWindow->SetMenuBar( (MenuBar *)pMenuBarWrapper->GetMenuBarManager()->GetMenuBar() ); - else - pSysWindow->SetMenuBar( 0 ); - } - } - - // Remove inplace menu bar - m_pInplaceMenuBar = 0; - if ( m_xInplaceMenuBar.is() ) - m_xInplaceMenuBar->dispose(); - m_xInplaceMenuBar.clear(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ -} - -void SAL_CALL LayoutManager::attachFrame( const Reference< XFrame >& xFrame ) -throw (uno::RuntimeException) -{ - WriteGuard aWriteLock( m_aLock ); - m_xFrame = xFrame; -} - -void SAL_CALL LayoutManager::reset() -throw (RuntimeException) -{ - implts_reset( sal_True ); -} - -void SAL_CALL LayoutManager::setInplaceMenuBar( sal_Int64 ) -throw (uno::RuntimeException) -{ - OSL_FAIL( "This method is obsolete and should not be used!\n" ); -} - -void SAL_CALL LayoutManager::resetInplaceMenuBar() -throw (uno::RuntimeException) -{ - OSL_FAIL( "This method is obsolete and should not be used!\n" ); -} - -//--------------------------------------------------------------------------------------------------------- -// XMenuBarMergingAcceptor -//--------------------------------------------------------------------------------------------------------- -sal_Bool SAL_CALL LayoutManager::setMergedMenuBar( - const Reference< XIndexAccess >& xMergedMenuBar ) -throw (uno::RuntimeException) -{ - implts_setInplaceMenuBar( xMergedMenuBar ); - - uno::Any a; - implts_notifyListeners( frame::LayoutManagerEvents::MERGEDMENUBAR, a ); - return sal_True; -} - -void SAL_CALL LayoutManager::removeMergedMenuBar() -throw (uno::RuntimeException) -{ - implts_resetInplaceMenuBar(); -} - -awt::Rectangle SAL_CALL LayoutManager::getCurrentDockingArea() -throw ( RuntimeException ) -{ - ReadGuard aReadLock( m_aLock ); - return m_aDockingArea; -} - -Reference< XDockingAreaAcceptor > SAL_CALL LayoutManager::getDockingAreaAcceptor() -throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - return m_xDockingAreaAcceptor; -} - -void SAL_CALL LayoutManager::setDockingAreaAcceptor( const Reference< ui::XDockingAreaAcceptor >& xDockingAreaAcceptor ) -throw ( RuntimeException ) -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - if (( m_xDockingAreaAcceptor == xDockingAreaAcceptor ) || !m_xFrame.is() ) - return; - - // IMPORTANT: Be sure to stop layout timer if don't have a docking area acceptor! - if ( !xDockingAreaAcceptor.is() ) - m_aAsyncLayoutTimer.Stop(); - - sal_Bool bAutomaticToolbars( m_bAutomaticToolbars ); - std::vector< Reference< awt::XWindow > > oldDockingAreaWindows; - - uno::Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - - if ( !xDockingAreaAcceptor.is() ) - m_aAsyncLayoutTimer.Stop(); - - // Remove listener from old docking area acceptor - if ( m_xDockingAreaAcceptor.is() ) - { - Reference< awt::XWindow > xWindow( m_xDockingAreaAcceptor->getContainerWindow() ); - if ( xWindow.is() && ( m_xFrame->getContainerWindow() != m_xContainerWindow || !xDockingAreaAcceptor.is() ) ) - xWindow->removeWindowListener( Reference< awt::XWindowListener >( static_cast< OWeakObject * >( this ), UNO_QUERY )); - - m_aDockingArea = awt::Rectangle(); - if ( pToolbarManager ) - pToolbarManager->resetDockingArea(); - - Window* pContainerWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pContainerWindow ) - pContainerWindow->RemoveChildEventListener( LINK( this, LayoutManager, WindowEventListener ) ); - } - - Reference< ui::XDockingAreaAcceptor > xOldDockingAreaAcceptor( m_xDockingAreaAcceptor ); - m_xDockingAreaAcceptor = xDockingAreaAcceptor; - if ( m_xDockingAreaAcceptor.is() ) - { - m_aDockingArea = awt::Rectangle(); - m_xContainerWindow = m_xDockingAreaAcceptor->getContainerWindow(); - m_xContainerTopWindow.set( m_xContainerWindow, UNO_QUERY ); - m_xContainerWindow->addWindowListener( Reference< awt::XWindowListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - - // we always must keep a connection to the window of our frame for resize events - if ( m_xContainerWindow != m_xFrame->getContainerWindow() ) - m_xFrame->getContainerWindow()->addWindowListener( Reference< awt::XWindowListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - - // #i37884# set initial visibility state - in the plugin case the container window is already shown - // and we get no notification anymore - { - SolarMutexGuard aGuard; - Window* pContainerWindow = VCLUnoHelper::GetWindow( m_xContainerWindow ); - if( pContainerWindow ) - m_bParentWindowVisible = pContainerWindow->IsVisible(); - } - - uno::Reference< awt::XWindowPeer > xParent( m_xContainerWindow, UNO_QUERY ); - } - - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - if ( xDockingAreaAcceptor.is() ) - { - SolarMutexGuard aGuard; - - // Add layout manager as listener to get notifications about toolbar button activties - Window* pContainerWindow = VCLUnoHelper::GetWindow( m_xContainerWindow ); - if ( pContainerWindow ) - pContainerWindow->AddChildEventListener( LINK( this, LayoutManager, WindowEventListener ) ); - - // We have now a new container window, reparent all child windows! - implts_reparentChildWindows(); - } - else - implts_destroyElements(); // remove all elements - - if ( !oldDockingAreaWindows.empty() ) - { - // Reset docking area size for our old docking area acceptor - awt::Rectangle aEmptyRect; - xOldDockingAreaAcceptor->setDockingAreaSpace( aEmptyRect ); - } - - if ( xDockingAreaAcceptor.is() ) - { - if ( bAutomaticToolbars ) - { - lock(); - pToolbarManager->createStaticToolbars(); - unlock(); - } - implts_doLayout( sal_True, sal_False ); - } -} - -void LayoutManager::implts_reparentChildWindows() -{ - WriteGuard aWriteLock( m_aLock ); - UIElement aStatusBarElement = m_aStatusBarElement; - uno::Reference< awt::XWindow > xContainerWindow = m_xContainerWindow; - aWriteLock.unlock(); - - uno::Reference< awt::XWindow > xStatusBarWindow; - if ( aStatusBarElement.m_xUIElement.is() ) - { - try - { - xStatusBarWindow = Reference< awt::XWindow >( aStatusBarElement.m_xUIElement->getRealInterface(), UNO_QUERY ); - } - catch (const RuntimeException&) - { - throw; - } - catch (const Exception&) - { - } - } - - if ( xStatusBarWindow.is() ) - { - SolarMutexGuard aGuard; - Window* pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow ); - Window* pWindow = VCLUnoHelper::GetWindow( xStatusBarWindow ); - if ( pWindow && pContainerWindow ) - pWindow->SetParent( pContainerWindow ); - } - - implts_resetMenuBar(); - - aWriteLock.lock(); - uno::Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - if ( pToolbarManager ) - pToolbarManager->setParentWindow( uno::Reference< awt::XWindowPeer >( xContainerWindow, uno::UNO_QUERY )); - aWriteLock.unlock(); -} - -uno::Reference< ui::XUIElement > LayoutManager::implts_createDockingWindow( const ::rtl::OUString& aElementName ) -{ - Reference< XUIElement > xUIElement = implts_createElement( aElementName ); - return xUIElement; -} - -IMPL_LINK( LayoutManager, WindowEventListener, VclSimpleEvent*, pEvent ) -{ - long nResult( 1 ); - - if ( pEvent && pEvent->ISA( VclWindowEvent )) - { - Window* pWindow = static_cast< VclWindowEvent* >(pEvent)->GetWindow(); - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< ui::XUIConfigurationListener > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager( m_pToolbarManager ); - aReadLock.unlock(); - - if ( pToolbarManager ) - nResult = pToolbarManager->childWindowEvent( pEvent ); - } - } - - return nResult; -} - -void SAL_CALL LayoutManager::createElement( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::LayoutManager::createElement" ); - - ReadGuard aReadLock( m_aLock ); - Reference< XFrame > xFrame = m_xFrame; - Reference< XURLTransformer > xURLTransformer = m_xURLTransformer; - sal_Bool bInPlaceMenu = m_bInplaceMenuSet; - aReadLock.unlock(); - - if ( !xFrame.is() ) - return; - - Reference< XModel > xModel( impl_getModelFromFrame( xFrame ) ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - bool bMustBeLayouted( false ); - bool bNotify( false ); - - if ( m_xContainerWindow.is() && !implts_isPreviewModel( xModel ) ) // no UI elements on preview frames - { - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - parseResourceURL( aName, aElementType, aElementName ); - - if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR ) && m_pToolbarManager != NULL ) - { - bNotify = m_pToolbarManager->createToolbar( aName ); - bMustBeLayouted = m_pToolbarManager->isLayoutDirty(); - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "menubar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "menubar" )) - { - // #i38743# don't create a menubar if frame isn't top - if ( !bInPlaceMenu && !m_xMenuBar.is() && implts_isFrameOrWindowTop( xFrame )) - { - m_xMenuBar = implts_createElement( aName ); - if ( m_xMenuBar.is() ) - { - SolarMutexGuard aGuard; - - SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow ); - if ( pSysWindow ) - { - Reference< awt::XMenuBar > xMenuBar; - - Reference< XPropertySet > xPropSet( m_xMenuBar, UNO_QUERY ); - if ( xPropSet.is() ) - { - try - { - xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMenuBar" ))) >>= xMenuBar; - } - catch (const beans::UnknownPropertyException&) - { - } - catch (const lang::WrappedTargetException&) - { - } - } - - if ( xMenuBar.is() ) - { - VCLXMenu* pAwtMenuBar = VCLXMenu::GetImplementation( xMenuBar ); - if ( pAwtMenuBar ) - { - MenuBar* pMenuBar = (MenuBar*)pAwtMenuBar->GetMenu(); - if ( pMenuBar ) - { - pSysWindow->SetMenuBar( pMenuBar ); - pMenuBar->SetDisplayable( m_bMenuVisible ); - if ( m_bMenuVisible ) - bNotify = sal_True; - implts_updateMenuBarClose(); - } - } - } - } - } - } - aWriteLock.unlock(); - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "statusbar" ) && ( implts_isFrameOrWindowTop(xFrame) || implts_isEmbeddedLayoutManager() )) - { - implts_createStatusBar( aName ); - bNotify = sal_True; - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "progressbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "progressbar" ) && implts_isFrameOrWindowTop(xFrame) ) - { - implts_createProgressBar(); - bNotify = sal_True; - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "dockingwindow" )) - { - // Add layout manager as listener for docking and other window events - uno::Reference< uno::XInterface > xThis( static_cast< OWeakObject* >(this), uno::UNO_QUERY ); - uno::Reference< ui::XUIElement > xUIElement( implts_createDockingWindow( aName )); - - if ( xUIElement.is() ) - { - impl_addWindowListeners( xThis, xUIElement ); - } - - // The docking window is created by a factory method located in the sfx2 library. -// CreateDockingWindow( xFrame, aElementName ); - } - } - - if ( bMustBeLayouted ) - implts_doLayout_notify( sal_True ); - - if ( bNotify ) - { - // UI element is invisible - provide information to listeners - implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_VISIBLE, uno::makeAny( aName ) ); - } -} - -void SAL_CALL LayoutManager::destroyElement( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::LayoutManager::destroyElement" ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - bool bMustBeLayouted( sal_False ); - bool bMustBeDestroyed( sal_False ); - bool bNotify( sal_False ); - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - Reference< XComponent > xComponent; - parseResourceURL( aName, aElementType, aElementName ); - - if ( aElementType.equalsIgnoreAsciiCaseAscii( "menubar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "menubar" )) - { - if ( !m_bInplaceMenuSet ) - { - impl_clearUpMenuBar(); - m_xMenuBar.clear(); - bNotify = true; - } - } - else if (( aElementType.equalsIgnoreAsciiCaseAscii( "statusbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "statusbar" )) || - ( m_aStatusBarElement.m_aName == aName )) - { - aWriteLock.unlock(); - implts_destroyStatusBar(); - bMustBeLayouted = true; - bNotify = true; - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "progressbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "progressbar" )) - { - aWriteLock.unlock(); - implts_createProgressBar(); - bMustBeLayouted = true; - bNotify = sal_True; - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR ) && m_pToolbarManager != NULL ) - { - aWriteLock.unlock(); - bNotify = m_pToolbarManager->destroyToolbar( aName ); - bMustBeLayouted = m_pToolbarManager->isLayoutDirty(); - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "dockingwindow" )) - { - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - uno::Reference< lang::XMultiServiceFactory > xSMGR( m_xSMGR ); - aWriteLock.unlock(); - - impl_setDockingWindowVisibility( xSMGR, xFrame, aElementName, false ); - bMustBeLayouted = false; - bNotify = false; - } - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - if ( bMustBeDestroyed ) - { - if ( xComponent.is() ) - xComponent->dispose(); - bNotify = true; - } - - if ( bMustBeLayouted ) - doLayout(); - - if ( bNotify ) - implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_INVISIBLE, uno::makeAny( aName ) ); -} - -::sal_Bool SAL_CALL LayoutManager::requestElement( const ::rtl::OUString& rResourceURL ) -throw (uno::RuntimeException) -{ - bool bResult( false ); - bool bNotify( false ); - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - parseResourceURL( rResourceURL, aElementType, aElementName ); - - WriteGuard aWriteLock( m_aLock ); - - ::rtl::OString aResName = rtl::OUStringToOString( aElementName, RTL_TEXTENCODING_ASCII_US ); - RTL_LOGFILE_CONTEXT_TRACE1( aLog, "framework (cd100003) Element %s requested.", aResName.getStr() ); - - if (( aElementType.equalsIgnoreAsciiCaseAscii( "statusbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "statusbar" )) || ( m_aStatusBarElement.m_aName == rResourceURL )) - { - implts_readStatusBarState( rResourceURL ); - if ( m_aStatusBarElement.m_bVisible && !m_aStatusBarElement.m_bMasterHide ) - { - aWriteLock.unlock(); - createElement( rResourceURL ); - - // There are some situation where we are not able to create an element. - // Therefore we have to check the reference before further action. - // See #i70019# - uno::Reference< ui::XUIElement > xUIElement( m_aStatusBarElement.m_xUIElement ); - if ( xUIElement.is() ) - { - // we need VCL here to pass special flags to Show() - SolarMutexGuard aGuard; - Reference< awt::XWindow > xWindow( xUIElement->getRealInterface(), UNO_QUERY ); - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow ) - { - pWindow->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); - bResult = true; - bNotify = true; - } - } - } - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "progressbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "progressbar" ) ) - { - aWriteLock.unlock(); - implts_showProgressBar(); - bResult = true; - bNotify = true; - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR ) && m_bVisible ) - { - bool bComponentAttached( m_aModuleIdentifier.getLength() > 0 ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aWriteLock.unlock(); - - if ( pToolbarManager && bComponentAttached ) - { - bNotify = pToolbarManager->requestToolbar( rResourceURL ); - } - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "dockingwindow" )) - { - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - aWriteLock.unlock(); - - CreateDockingWindow( xFrame, aElementName ); - } - - if ( bNotify ) - implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_VISIBLE, uno::makeAny( rResourceURL ) ); - - return bResult; -} - -Reference< XUIElement > SAL_CALL LayoutManager::getElement( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - Reference< XUIElement > xUIElement = implts_findElement( aName ); - if ( !xUIElement.is() ) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager( m_pToolbarManager ); - aReadLock.unlock(); - - if ( pToolbarManager ) - xUIElement = pToolbarManager->getToolbar( aName ); - } - - return xUIElement; -} - -Sequence< Reference< ui::XUIElement > > SAL_CALL LayoutManager::getElements() -throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< ui::XUIElement > xMenuBar( m_xMenuBar ); - uno::Reference< ui::XUIElement > xStatusBar( m_aStatusBarElement.m_xUIElement ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager( m_pToolbarManager ); - aReadLock.unlock(); - - Sequence< Reference< ui::XUIElement > > aSeq; - if ( pToolbarManager ) - aSeq = pToolbarManager->getToolbars(); - - sal_Int32 nSize = aSeq.getLength(); - sal_Int32 nMenuBarIndex(-1); - sal_Int32 nStatusBarIndex(-1); - if ( xMenuBar.is() ) - { - nMenuBarIndex = nSize; - ++nSize; - } - if ( xStatusBar.is() ) - { - nStatusBarIndex = nSize; - ++nSize; - } - - aSeq.realloc(nSize); - if ( nMenuBarIndex >= 0 ) - aSeq[nMenuBarIndex] = xMenuBar; - if ( nStatusBarIndex >= 0 ) - aSeq[nStatusBarIndex] = xStatusBar; - - return aSeq; -} - -sal_Bool SAL_CALL LayoutManager::showElement( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::LayoutManager::showElement" ); - - bool bResult( false ); - bool bNotify( false ); - bool bMustLayout( false ); - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - parseResourceURL( aName, aElementType, aElementName ); - - ::rtl::OString aResName = rtl::OUStringToOString( aElementName, RTL_TEXTENCODING_ASCII_US ); - RTL_LOGFILE_CONTEXT_TRACE1( aLog, "framework (cd100003) Element %s", aResName.getStr() ); - - if ( aElementType.equalsIgnoreAsciiCaseAscii( "menubar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "menubar" )) - { - WriteGuard aWriteLock( m_aLock ); - m_bMenuVisible = sal_True; - aWriteLock.unlock(); - - bResult = implts_resetMenuBar(); - bNotify = bResult; - } - else if (( aElementType.equalsIgnoreAsciiCaseAscii( "statusbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "statusbar" )) || ( m_aStatusBarElement.m_aName == aName )) - { - WriteGuard aWriteLock( m_aLock ); - if ( m_aStatusBarElement.m_xUIElement.is() && !m_aStatusBarElement.m_bMasterHide && - implts_showStatusBar( sal_True )) - { - aWriteLock.unlock(); - - implts_writeWindowStateData( m_aStatusBarAlias, m_aStatusBarElement ); - bMustLayout = true; - bResult = true; - bNotify = true; - } - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "progressbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "progressbar" )) - { - bNotify = bResult = implts_showProgressBar(); - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< awt::XWindowListener > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - { - bNotify = pToolbarManager->showToolbar( aName ); - bMustLayout = pToolbarManager->isLayoutDirty(); - } - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "dockingwindow" )) - { - ReadGuard aReadGuard( m_aLock ); - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - uno::Reference< lang::XMultiServiceFactory > xSMGR( m_xSMGR ); - aReadGuard.unlock(); - - impl_setDockingWindowVisibility( xSMGR, xFrame, aElementName, true ); - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "toolpanel" )) - { - ReadGuard aReadGuard( m_aLock ); - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - aReadGuard.unlock(); - ActivateToolPanel( m_xFrame, aName ); - } - - if ( bMustLayout ) - doLayout(); - - if ( bNotify ) - implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_VISIBLE, uno::makeAny( aName ) ); - - return bResult; -} - -sal_Bool SAL_CALL LayoutManager::hideElement( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::LayoutManager::hideElement" ); - - bool bNotify( false ); - bool bMustLayout( false ); - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - parseResourceURL( aName, aElementType, aElementName ); - ::rtl::OString aResName = rtl::OUStringToOString( aElementName, RTL_TEXTENCODING_ASCII_US ); - RTL_LOGFILE_CONTEXT_TRACE1( aLog, "framework (cd100003) Element %s", aResName.getStr() ); - - if ( aElementType.equalsIgnoreAsciiCaseAscii( "menubar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "menubar" )) - { - WriteGuard aWriteLock( m_aLock ); - - if ( m_xContainerWindow.is() ) - { - m_bMenuVisible = sal_False; - - SolarMutexGuard aGuard; - SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow ); - if ( pSysWindow ) - { - MenuBar* pMenuBar = pSysWindow->GetMenuBar(); - if ( pMenuBar ) - { - pMenuBar->SetDisplayable( sal_False ); - bNotify = true; - } - } - } - } - else if (( aElementType.equalsIgnoreAsciiCaseAscii( "statusbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "statusbar" )) || ( m_aStatusBarElement.m_aName == aName )) - { - WriteGuard aWriteLock( m_aLock ); - if ( m_aStatusBarElement.m_xUIElement.is() && !m_aStatusBarElement.m_bMasterHide && - implts_hideStatusBar( sal_True )) - { - implts_writeWindowStateData( m_aStatusBarAlias, m_aStatusBarElement ); - bMustLayout = sal_True; - bNotify = sal_True; - } - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "progressbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "progressbar" )) - { - bNotify = implts_hideProgressBar(); - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - bNotify = pToolbarManager->hideToolbar( aName ); - bMustLayout = pToolbarManager->isLayoutDirty(); - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "dockingwindow" )) - { - ReadGuard aReadGuard( m_aLock ); - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - uno::Reference< lang::XMultiServiceFactory > xSMGR( m_xSMGR ); - aReadGuard.unlock(); - - impl_setDockingWindowVisibility( xSMGR, xFrame, aElementName, false ); - } - - if ( bMustLayout ) - doLayout(); - - if ( bNotify ) - implts_notifyListeners( frame::LayoutManagerEvents::UIELEMENT_INVISIBLE, uno::makeAny( aName ) ); - - return sal_False; -} - -sal_Bool SAL_CALL LayoutManager::dockWindow( const ::rtl::OUString& aName, DockingArea DockingArea, const awt::Point& Pos ) -throw (RuntimeException) -{ - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - parseResourceURL( aName, aElementType, aElementName ); - if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - { - pToolbarManager->dockToolbar( aName, DockingArea, Pos ); - if ( pToolbarManager->isLayoutDirty() ) - doLayout(); - } - } - return sal_False; -} - -::sal_Bool SAL_CALL LayoutManager::dockAllWindows( ::sal_Int16 /*nElementType*/ ) throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - bool bResult( false ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - { - bResult = pToolbarManager->dockAllToolbars(); - if ( pToolbarManager->isLayoutDirty() ) - doLayout(); - } - return bResult; -} - -sal_Bool SAL_CALL LayoutManager::floatWindow( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - bool bResult( false ); - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - { - bResult = pToolbarManager->floatToolbar( aName ); - if ( pToolbarManager->isLayoutDirty() ) - doLayout(); - } - } - return bResult; -} - -::sal_Bool SAL_CALL LayoutManager::lockWindow( const ::rtl::OUString& aName ) -throw (uno::RuntimeException) -{ - bool bResult( false ); - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - { - bResult = pToolbarManager->lockToolbar( aName ); - if ( pToolbarManager->isLayoutDirty() ) - doLayout(); - } - } - return bResult; -} - -::sal_Bool SAL_CALL LayoutManager::unlockWindow( const ::rtl::OUString& aName ) -throw (uno::RuntimeException) -{ - bool bResult( false ); - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - { - bResult = pToolbarManager->unlockToolbar( aName ); - if ( pToolbarManager->isLayoutDirty() ) - doLayout(); - } - } - return bResult; -} - -void SAL_CALL LayoutManager::setElementSize( const ::rtl::OUString& aName, const awt::Size& aSize ) -throw (RuntimeException) -{ - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xThis( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - { - pToolbarManager->setToolbarSize( aName, aSize ); - if ( pToolbarManager->isLayoutDirty() ) - doLayout(); - } - } -} - -void SAL_CALL LayoutManager::setElementPos( const ::rtl::OUString& aName, const awt::Point& aPos ) -throw (RuntimeException) -{ - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager( m_pToolbarManager ); - aReadLock.unlock(); - - if ( pToolbarManager ) - { - pToolbarManager->setToolbarPos( aName, aPos ); - if ( pToolbarManager->isLayoutDirty() ) - doLayout(); - } - } -} - -void SAL_CALL LayoutManager::setElementPosSize( const ::rtl::OUString& aName, const awt::Point& aPos, const awt::Size& aSize ) -throw (RuntimeException) -{ - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager( m_pToolbarManager ); - aReadLock.unlock(); - - if ( pToolbarManager ) - { - pToolbarManager->setToolbarPosSize( aName, aPos, aSize ); - if ( pToolbarManager->isLayoutDirty() ) - doLayout(); - } - } -} - -sal_Bool SAL_CALL LayoutManager::isElementVisible( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - parseResourceURL( aName, aElementType, aElementName ); - if ( aElementType.equalsIgnoreAsciiCaseAscii( "menubar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "menubar" )) - { - ReadGuard aReadLock( m_aLock ); - if ( m_xContainerWindow.is() ) - { - aReadLock.unlock(); - - SolarMutexGuard aGuard; - SystemWindow* pSysWindow = getTopSystemWindow( m_xContainerWindow ); - if ( pSysWindow ) - { - MenuBar* pMenuBar = pSysWindow->GetMenuBar(); - if ( pMenuBar && pMenuBar->IsDisplayable() ) - return sal_True; - } - else - { - aReadLock.lock(); - return m_bMenuVisible; - } - } - } - else if (( aElementType.equalsIgnoreAsciiCaseAscii( "statusbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "statusbar" )) || ( m_aStatusBarElement.m_aName == aName )) - { - if ( m_aStatusBarElement.m_xUIElement.is() ) - { - Reference< awt::XWindow > xWindow( m_aStatusBarElement.m_xUIElement->getRealInterface(), UNO_QUERY ); - if ( xWindow.is() ) - { - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->IsVisible() ) - return sal_True; - else - return sal_False; - } - } - } - else if (( aElementType.equalsIgnoreAsciiCaseAscii( "progressbar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "progressbar" ))) - { - if ( m_aProgressBarElement.m_xUIElement.is() ) - return m_aProgressBarElement.m_bVisible; - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< frame::XLayoutManager > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - return pToolbarManager->isToolbarVisible( aName ); - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( "dockingwindow" )) - { - ReadGuard aReadGuard( m_aLock ); - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - aReadGuard.unlock(); - - return IsDockingWindowVisible( xFrame, aElementName ); - } - - return sal_False; -} - -sal_Bool SAL_CALL LayoutManager::isElementFloating( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - return pToolbarManager->isToolbarFloating( aName ); - } - - return sal_False; -} - -sal_Bool SAL_CALL LayoutManager::isElementDocked( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - return pToolbarManager->isToolbarDocked( aName ); - } - - return sal_False; -} - -::sal_Bool SAL_CALL LayoutManager::isElementLocked( const ::rtl::OUString& aName ) -throw (uno::RuntimeException) -{ - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - return pToolbarManager->isToolbarLocked( aName ); - } - - return sal_False; -} - -awt::Size SAL_CALL LayoutManager::getElementSize( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - return pToolbarManager->getToolbarSize( aName ); - } - - return awt::Size(); -} - -awt::Point SAL_CALL LayoutManager::getElementPos( const ::rtl::OUString& aName ) -throw (RuntimeException) -{ - if ( getElementTypeFromResourceURL( aName ).equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - ReadGuard aReadLock( m_aLock ); - uno::Reference< uno::XInterface > xToolbarManager( m_xToolbarManager, uno::UNO_QUERY ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( pToolbarManager ) - return pToolbarManager->getToolbarPos( aName ); - } - - return awt::Point(); -} - -void SAL_CALL LayoutManager::lock() -throw (RuntimeException) -{ - implts_lock(); - - ReadGuard aReadLock( m_aLock ); - sal_Int32 nLockCount( m_nLockCount ); - aReadLock.unlock(); - - RTL_LOGFILE_TRACE1( "framework (cd100003) ::LayoutManager::lock lockCount=%d", nLockCount ); -#ifdef DBG_UTIL - rtl::OStringBuffer aStr(RTL_CONSTASCII_STRINGPARAM("LayoutManager::lock ")); - aStr.append(reinterpret_cast<sal_Int64>(this)); - aStr.append(RTL_CONSTASCII_STRINGPARAM(" - ")); - aStr.append(nLockCount); - OSL_TRACE(aStr.getStr()); -#endif - - Any a( nLockCount ); - implts_notifyListeners( frame::LayoutManagerEvents::LOCK, a ); -} - -void SAL_CALL LayoutManager::unlock() -throw (RuntimeException) -{ - sal_Bool bDoLayout( implts_unlock() ); - - ReadGuard aReadLock( m_aLock ); - sal_Int32 nLockCount( m_nLockCount ); - aReadLock.unlock(); - - RTL_LOGFILE_TRACE1( "framework (cd100003) ::LayoutManager::unlock lockCount=%d", nLockCount ); -#ifdef DBG_UTIL - rtl::OStringBuffer aStr(RTL_CONSTASCII_STRINGPARAM("LayoutManager::unlock ")); - aStr.append(reinterpret_cast<sal_Int64>(this)); - aStr.append(RTL_CONSTASCII_STRINGPARAM(" - ")); - aStr.append(nLockCount); - OSL_TRACE(aStr.getStr()); -#endif - // conform to documentation: unlock with lock count == 0 means force a layout - - WriteGuard aWriteLock( m_aLock ); - if ( bDoLayout ) - m_aAsyncLayoutTimer.Stop(); - aWriteLock.unlock(); - - Any a( nLockCount ); - implts_notifyListeners( frame::LayoutManagerEvents::UNLOCK, a ); - - if ( bDoLayout ) - implts_doLayout_notify( sal_True ); -} - -void SAL_CALL LayoutManager::doLayout() -throw (RuntimeException) -{ - implts_doLayout_notify( sal_True ); -} - -//--------------------------------------------------------------------------------------------------------- -// ILayoutNotifications -//--------------------------------------------------------------------------------------------------------- -void LayoutManager::requestLayout( Hint eHint ) -{ - if ( eHint == HINT_TOOLBARSPACE_HAS_CHANGED ) - doLayout(); -} - -void LayoutManager::implts_doLayout_notify( sal_Bool bOuterResize ) -{ - bool bLayouted = implts_doLayout( false, bOuterResize ); - if ( bLayouted ) - implts_notifyListeners( frame::LayoutManagerEvents::LAYOUT, Any() ); -} - -sal_Bool LayoutManager::implts_doLayout( sal_Bool bForceRequestBorderSpace, sal_Bool bOuterResize ) -{ - RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::LayoutManager::implts_doLayout" ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - - if ( !m_xFrame.is() || !m_bParentWindowVisible ) - return sal_False; - - bool bPreserveContentSize( m_bPreserveContentSize ); - bool bMustDoLayout( m_bMustDoLayout ); - bool bNoLock = ( m_nLockCount == 0 ); - awt::Rectangle aCurrBorderSpace( m_aDockingArea ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - Reference< awt::XTopWindow2 > xContainerTopWindow( m_xContainerTopWindow ); - Reference< awt::XWindow > xComponentWindow( m_xFrame->getComponentWindow() ); - Reference< XDockingAreaAcceptor > xDockingAreaAcceptor( m_xDockingAreaAcceptor ); - aReadLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - sal_Bool bLayouted( sal_False ); - - if ( bNoLock && xDockingAreaAcceptor.is() && xContainerWindow.is() && xComponentWindow.is() ) - { - bLayouted = sal_True; - - WriteGuard aWriteGuard( m_aLock ); - m_bDoLayout = sal_True; - aWriteGuard.unlock(); - - awt::Rectangle aDockSpace( implts_calcDockingAreaSizes() ); - awt::Rectangle aBorderSpace( aDockSpace ); - sal_Bool bGotRequestedBorderSpace( sal_True ); - - // We have to add the height of a possible status bar - aBorderSpace.Height += implts_getStatusBarSize().Height(); - - if ( !equalRectangles( aBorderSpace, aCurrBorderSpace ) || bForceRequestBorderSpace || bMustDoLayout ) - { - // we always resize the content window (instead of the complete container window) if we're not set up - // to (attempt to) preserve the content window's size - if ( bOuterResize && !bPreserveContentSize ) - bOuterResize = sal_False; - - // maximized windows can resized their content window only, not their container window - if ( bOuterResize && xContainerTopWindow.is() && xContainerTopWindow->getIsMaximized() ) - bOuterResize = sal_False; - - // if the component window does not have a size (yet), then we can't use it to calc the container - // window size - awt::Rectangle aComponentRect = xComponentWindow->getPosSize(); - if ( bOuterResize && ( aComponentRect.Width == 0 ) && ( aComponentRect.Height == 0 ) ) - bOuterResize = sal_False; - - bGotRequestedBorderSpace = sal_False; - if ( bOuterResize ) - { - Reference< awt::XDevice > xDevice( xContainerWindow, uno::UNO_QUERY ); - awt::DeviceInfo aContainerInfo = xDevice->getInfo(); - - awt::Size aRequestedSize( aComponentRect.Width + aContainerInfo.LeftInset + aContainerInfo.RightInset + aBorderSpace.X + aBorderSpace.Width, - aComponentRect.Height + aContainerInfo.TopInset + aContainerInfo.BottomInset + aBorderSpace.Y + aBorderSpace.Height ); - awt::Point aComponentPos( aBorderSpace.X, aBorderSpace.Y ); - - bGotRequestedBorderSpace = implts_resizeContainerWindow( aRequestedSize, aComponentPos ); - } - - // if we did not do an container window resize, or it failed, then use the DockingAcceptor as usual - if ( !bGotRequestedBorderSpace ) - bGotRequestedBorderSpace = xDockingAreaAcceptor->requestDockingAreaSpace( aBorderSpace ); - - if ( bGotRequestedBorderSpace ) - { - aWriteGuard.lock(); - m_aDockingArea = aBorderSpace; - m_bMustDoLayout = sal_False; - aWriteGuard.unlock(); - } - } - - if ( bGotRequestedBorderSpace ) - { - ::Size aContainerSize; - ::Size aStatusBarSize; - - // Interim solution to let the layout method within the - // toolbar layout manager. - implts_setOffset( implts_getStatusBarSize().Height() ); - m_pToolbarManager->setDockingArea( aDockSpace ); - - // Subtract status bar size from our container output size. Docking area windows - // don't contain the status bar! - aStatusBarSize = implts_getStatusBarSize(); - aContainerSize = implts_getContainerWindowOutputSize(); - aContainerSize.Height() -= aStatusBarSize.Height(); - - m_pToolbarManager->doLayout(aContainerSize); - - // Position the status bar - if ( aStatusBarSize.Height() > 0 ) - { - implts_setStatusBarPosSize( ::Point( 0, std::max(( aContainerSize.Height() ), long( 0 ))), - ::Size( aContainerSize.Width(),aStatusBarSize.Height() )); - } - - xDockingAreaAcceptor->setDockingAreaSpace( aBorderSpace ); - - aWriteGuard.lock(); - m_bDoLayout = sal_False; - aWriteGuard.unlock(); - } - } - - return bLayouted; -} - -sal_Bool LayoutManager::implts_resizeContainerWindow( const awt::Size& rContainerSize, - const awt::Point& rComponentPos ) -{ - ReadGuard aReadLock( m_aLock ); - Reference< awt::XWindow > xContainerWindow = m_xContainerWindow; - Reference< awt::XTopWindow2 > xContainerTopWindow = m_xContainerTopWindow; - Reference< awt::XWindow > xComponentWindow = m_xFrame->getComponentWindow(); - Reference< container::XIndexAccess > xDisplayAccess = m_xDisplayAccess; - aReadLock.unlock(); - - // calculate the maximum size we have for the container window - awt::Rectangle aWorkArea; - try - { - sal_Int32 nDisplay = xContainerTopWindow->getDisplay(); - Reference< beans::XPropertySet > xDisplayInfo( xDisplayAccess->getByIndex( nDisplay ), UNO_QUERY_THROW ); - OSL_VERIFY( xDisplayInfo->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "WorkArea" ) ) ) >>= aWorkArea ); - } - catch( const Exception& ) - { - DBG_UNHANDLED_EXCEPTION(); - } - - if (( aWorkArea.Width > 0 ) && ( aWorkArea.Height > 0 )) - { - if (( rContainerSize.Width > aWorkArea.Width ) || ( rContainerSize.Height > aWorkArea.Height )) - return sal_False; - // Strictly, this is not correct. If we have a multi-screen display (css.awt.DisplayAccess.MultiDisplay == true), - // the the "effective work area" would be much larger than the work area of a single display, since we could in theory - // position the container window across multiple screens. - // However, this should suffice as a heuristics here ... (nobody really wants to check whether the different screens are - // stacked horizontally or vertically, whether their work areas can really be combined, or are separated by non-work-areas, - // and the like ... right?) - } - - // resize our container window - xContainerWindow->setPosSize( 0, 0, rContainerSize.Width, rContainerSize.Height, awt::PosSize::SIZE ); - // position the component window - xComponentWindow->setPosSize( rComponentPos.X, rComponentPos.Y, 0, 0, awt::PosSize::POS ); - return sal_True; -} - -void SAL_CALL LayoutManager::setVisible( sal_Bool bVisible ) -throw (uno::RuntimeException) -{ - WriteGuard aWriteLock( m_aLock ); - sal_Bool bWasVisible( m_bVisible ); - m_bVisible = bVisible; - aWriteLock.unlock(); - - if ( bWasVisible != bVisible ) - implts_setVisibleState( bVisible ); -} - -sal_Bool SAL_CALL LayoutManager::isVisible() -throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - return m_bVisible; -} - -::Size LayoutManager::implts_getStatusBarSize() -{ - ReadGuard aReadLock( m_aLock ); - bool bStatusBarVisible( isElementVisible( m_aStatusBarAlias )); - bool bProgressBarVisible( isElementVisible( m_aProgressBarAlias )); - bool bVisible( m_bVisible ); - Reference< XUIElement > xStatusBar( m_aStatusBarElement.m_xUIElement ); - Reference< XUIElement > xProgressBar( m_aProgressBarElement.m_xUIElement ); - - Reference< awt::XWindow > xWindow; - if ( bStatusBarVisible && bVisible && xStatusBar.is() ) - xWindow = Reference< awt::XWindow >( xStatusBar->getRealInterface(), UNO_QUERY ); - else if ( xProgressBar.is() && !xStatusBar.is() && bProgressBarVisible ) - { - ProgressBarWrapper* pWrapper = (ProgressBarWrapper*)xProgressBar.get(); - if ( pWrapper ) - xWindow = pWrapper->getStatusBar(); - } - aReadLock.unlock(); - - if ( xWindow.is() ) - { - awt::Rectangle aPosSize = xWindow->getPosSize(); - return ::Size( aPosSize.Width, aPosSize.Height ); - } - else - return ::Size(); -} - -awt::Rectangle LayoutManager::implts_calcDockingAreaSizes() -{ - ReadGuard aReadLock( m_aLock ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - Reference< XDockingAreaAcceptor > xDockingAreaAcceptor( m_xDockingAreaAcceptor ); - aReadLock.unlock(); - - awt::Rectangle aBorderSpace; - if ( xDockingAreaAcceptor.is() && xContainerWindow.is() ) - aBorderSpace = m_pToolbarManager->getDockingArea(); - - return aBorderSpace; -} - -void LayoutManager::implts_setDockingAreaWindowSizes( const awt::Rectangle& /*rBorderSpace*/ ) -{ - ReadGuard aReadLock( m_aLock ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - aReadLock.unlock(); - - uno::Reference< awt::XDevice > xDevice( xContainerWindow, uno::UNO_QUERY ); - // Convert relativ size to output size. - awt::Rectangle aRectangle = xContainerWindow->getPosSize(); - awt::DeviceInfo aInfo = xDevice->getInfo(); - awt::Size aContainerClientSize = awt::Size( aRectangle.Width - aInfo.LeftInset - aInfo.RightInset, - aRectangle.Height - aInfo.TopInset - aInfo.BottomInset ); - ::Size aStatusBarSize = implts_getStatusBarSize(); - - // Position the status bar - if ( aStatusBarSize.Height() > 0 ) - { - implts_setStatusBarPosSize( ::Point( 0, std::max(( aContainerClientSize.Height - aStatusBarSize.Height() ), long( 0 ))), - ::Size( aContainerClientSize.Width, aStatusBarSize.Height() )); - } -} - -//--------------------------------------------------------------------------------------------------------- -// XMenuCloser -//--------------------------------------------------------------------------------------------------------- -void LayoutManager::implts_updateMenuBarClose() -{ - WriteGuard aWriteLock( m_aLock ); - bool bShowCloser( m_bMenuBarCloser ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - aWriteLock.unlock(); - - if ( xContainerWindow.is() ) - { - SolarMutexGuard aGuard; - - SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow ); - if ( pSysWindow ) - { - MenuBar* pMenuBar = pSysWindow->GetMenuBar(); - if ( pMenuBar ) - { - // TODO remove link on sal_False ?! - pMenuBar->ShowCloser( bShowCloser ); - pMenuBar->SetCloserHdl( LINK( this, LayoutManager, MenuBarClose )); - } - } - } -} - -sal_Bool LayoutManager::implts_resetMenuBar() -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - sal_Bool bMenuVisible( m_bMenuVisible ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - - MenuBar* pSetMenuBar = 0; - if ( m_xInplaceMenuBar.is() ) - pSetMenuBar = (MenuBar *)m_pInplaceMenuBar->GetMenuBar(); - else - { - MenuBarWrapper* pMenuBarWrapper = static_cast< MenuBarWrapper* >( m_xMenuBar.get() ); - if ( pMenuBarWrapper ) - pSetMenuBar = (MenuBar *)pMenuBarWrapper->GetMenuBarManager()->GetMenuBar(); - } - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - SolarMutexGuard aGuard; - SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow ); - if ( pSysWindow && bMenuVisible && pSetMenuBar ) - { - pSysWindow->SetMenuBar( pSetMenuBar ); - pSetMenuBar->SetDisplayable( sal_True ); - return sal_True; - } - - return sal_False; -} - -IMPL_LINK( LayoutManager, MenuBarClose, MenuBar *, EMPTYARG ) -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< frame::XDispatchProvider > xProvider(m_xFrame, uno::UNO_QUERY); - uno::Reference< lang::XMultiServiceFactory > xSMGR = m_xSMGR; - aReadLock.unlock(); - - if ( !xProvider.is()) - return 0; - - uno::Reference< frame::XDispatchHelper > xDispatcher( - xSMGR->createInstance(SERVICENAME_DISPATCHHELPER), uno::UNO_QUERY_THROW); - - xDispatcher->executeDispatch( - xProvider, - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:CloseWin")), - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_self")), - 0, - uno::Sequence< beans::PropertyValue >()); - - return 0; -} - -IMPL_LINK( LayoutManager, SettingsChanged, void*, EMPTYARG ) -{ - return 1; -} - -//--------------------------------------------------------------------------------------------------------- -// XLayoutManagerEventBroadcaster -//--------------------------------------------------------------------------------------------------------- -void SAL_CALL LayoutManager::addLayoutManagerEventListener( const uno::Reference< frame::XLayoutManagerListener >& xListener ) -throw (uno::RuntimeException) -{ - m_aListenerContainer.addInterface( ::getCppuType( (const uno::Reference< frame::XLayoutManagerListener >*)NULL ), xListener ); -} - -void SAL_CALL LayoutManager::removeLayoutManagerEventListener( const uno::Reference< frame::XLayoutManagerListener >& xListener ) -throw (uno::RuntimeException) -{ - m_aListenerContainer.removeInterface( ::getCppuType( (const uno::Reference< frame::XLayoutManagerListener >*)NULL ), xListener ); -} - -void LayoutManager::implts_notifyListeners( short nEvent, uno::Any aInfoParam ) -{ - lang::EventObject aSource( static_cast< ::cppu::OWeakObject*>(this) ); - ::cppu::OInterfaceContainerHelper* pContainer = m_aListenerContainer.getContainer( ::getCppuType( ( const uno::Reference< frame::XLayoutManagerListener >*) NULL ) ); - if (pContainer!=NULL) - { - ::cppu::OInterfaceIteratorHelper pIterator(*pContainer); - while (pIterator.hasMoreElements()) - { - try - { - ((frame::XLayoutManagerListener*)pIterator.next())->layoutEvent( aSource, nEvent, aInfoParam ); - } - catch( uno::RuntimeException& ) - { - pIterator.remove(); - } - } - } -} - -//--------------------------------------------------------------------------------------------------------- -// XWindowListener -//--------------------------------------------------------------------------------------------------------- -void SAL_CALL LayoutManager::windowResized( const awt::WindowEvent& aEvent ) -throw( uno::RuntimeException ) -{ - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - if ( !m_xDockingAreaAcceptor.is() ) - return; - - // Request to set docking area space again. - awt::Rectangle aDockingArea( m_aDockingArea ); - Reference< XDockingAreaAcceptor > xDockingAreaAcceptor( m_xDockingAreaAcceptor ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - - Reference< XInterface > xIfac( xContainerWindow, UNO_QUERY ); - if ( xIfac == aEvent.Source && m_bVisible ) - { - // We have to call our resize handler at least once synchronously, as some - // application modules need this. So we have to check if this is the first - // call after the async layout time expired. - m_bMustDoLayout = sal_True; - if ( !m_aAsyncLayoutTimer.IsActive() ) - { - const Link& aLink = m_aAsyncLayoutTimer.GetTimeoutHdl(); - if ( aLink.IsSet() ) - aLink.Call( &m_aAsyncLayoutTimer ); - } - if ( m_nLockCount == 0 ) - m_aAsyncLayoutTimer.Start(); - } - else if ( m_xFrame.is() && aEvent.Source == m_xFrame->getContainerWindow() ) - { - // the container window of my DockingAreaAcceptor is not the same as of my frame - // I still have to resize my frames' window as nobody else will do it - Reference< awt::XWindow > xComponentWindow( m_xFrame->getComponentWindow() ); - if( xComponentWindow.is() == sal_True ) - { - uno::Reference< awt::XDevice > xDevice( m_xFrame->getContainerWindow(), uno::UNO_QUERY ); - - // Convert relativ size to output size. - awt::Rectangle aRectangle = m_xFrame->getContainerWindow()->getPosSize(); - awt::DeviceInfo aInfo = xDevice->getInfo(); - awt::Size aSize( aRectangle.Width - aInfo.LeftInset - aInfo.RightInset , - aRectangle.Height - aInfo.TopInset - aInfo.BottomInset ); - - // Resize our component window. - xComponentWindow->setPosSize( 0, 0, aSize.Width, aSize.Height, awt::PosSize::POSSIZE ); - } - } -} - -void SAL_CALL LayoutManager::windowMoved( const awt::WindowEvent& ) throw( uno::RuntimeException ) -{ -} - -void SAL_CALL LayoutManager::windowShown( const lang::EventObject& aEvent ) throw( uno::RuntimeException ) -{ - ReadGuard aReadLock( m_aLock ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - bool bParentWindowVisible( m_bParentWindowVisible ); - aReadLock.unlock(); - - Reference< XInterface > xIfac( xContainerWindow, UNO_QUERY ); - if ( xIfac == aEvent.Source ) - { - bool bSetVisible = false; - - WriteGuard aWriteLock( m_aLock ); - m_bParentWindowVisible = true; - bSetVisible = ( m_bParentWindowVisible != bParentWindowVisible ); - aWriteLock.unlock(); - - if ( bSetVisible ) - implts_updateUIElementsVisibleState( sal_True ); - } -} - -void SAL_CALL LayoutManager::windowHidden( const lang::EventObject& aEvent ) throw( uno::RuntimeException ) -{ - ReadGuard aReadLock( m_aLock ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - bool bParentWindowVisible( m_bParentWindowVisible ); - aReadLock.unlock(); - - Reference< XInterface > xIfac( xContainerWindow, UNO_QUERY ); - if ( xIfac == aEvent.Source ) - { - bool bSetInvisible = false; - - WriteGuard aWriteLock( m_aLock ); - m_bParentWindowVisible = false; - bSetInvisible = ( m_bParentWindowVisible != bParentWindowVisible ); - aWriteLock.unlock(); - - if ( bSetInvisible ) - implts_updateUIElementsVisibleState( sal_False ); - } -} - -IMPL_LINK( LayoutManager, AsyncLayoutHdl, Timer *, EMPTYARG ) -{ - ReadGuard aReadLock( m_aLock ); - m_aAsyncLayoutTimer.Stop(); - - if( !m_xContainerWindow.is() ) - return 0; - - awt::Rectangle aDockingArea( m_aDockingArea ); - ::Size aStatusBarSize( implts_getStatusBarSize() ); - - // Subtract status bar height - aDockingArea.Height -= aStatusBarSize.Height(); - aReadLock.unlock(); - - implts_setDockingAreaWindowSizes( aDockingArea ); - implts_doLayout( sal_True, sal_False ); - - return 0; -} - -//--------------------------------------------------------------------------------------------------------- -// XFrameActionListener -//--------------------------------------------------------------------------------------------------------- -void SAL_CALL LayoutManager::frameAction( const FrameActionEvent& aEvent ) -throw ( RuntimeException ) -{ - if (( aEvent.Action == FrameAction_COMPONENT_ATTACHED ) || ( aEvent.Action == FrameAction_COMPONENT_REATTACHED )) - { - RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::LayoutManager::frameAction (COMPONENT_ATTACHED|REATTACHED)" ); - - WriteGuard aWriteLock( m_aLock ); - m_bComponentAttached = sal_True; - m_bMustDoLayout = sal_True; - aWriteLock.unlock(); - - implts_reset( sal_True ); - implts_doLayout( sal_True, sal_False ); - implts_doLayout( sal_True, sal_True ); - } - else if (( aEvent.Action == FrameAction_FRAME_UI_ACTIVATED ) || ( aEvent.Action == FrameAction_FRAME_UI_DEACTIVATING )) - { - RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::LayoutManager::frameAction (FRAME_UI_ACTIVATED|DEACTIVATING)" ); - - WriteGuard aWriteLock( m_aLock ); - m_bActive = ( aEvent.Action == FrameAction_FRAME_UI_ACTIVATED ); - aWriteLock.unlock(); - - implts_toggleFloatingUIElementsVisibility( aEvent.Action == FrameAction_FRAME_UI_ACTIVATED ); - } - else if ( aEvent.Action == FrameAction_COMPONENT_DETACHING ) - { - RTL_LOGFILE_CONTEXT( aLog, "framework (cd100003) ::LayoutManager::frameAction (COMPONENT_DETACHING)" ); - - WriteGuard aWriteLock( m_aLock ); - m_bComponentAttached = sal_False; - aWriteLock.unlock(); - - implts_reset( sal_False ); - } -} - -// ______________________________________________ - -void SAL_CALL LayoutManager::disposing( const lang::EventObject& rEvent ) -throw( RuntimeException ) -{ - sal_Bool bDisposeAndClear( sal_False ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - if ( rEvent.Source == Reference< XInterface >( m_xFrame, UNO_QUERY )) - { - // Our frame gets disposed, release all our references that depends on a working frame reference. - Application::RemoveEventListener( LINK( this, LayoutManager, SettingsChanged ) ); - - // destroy all elements, it's possible that dettaching is NOT called! - implts_destroyElements(); - impl_clearUpMenuBar(); - m_xMenuBar.clear(); - if ( m_xInplaceMenuBar.is() ) - { - m_pInplaceMenuBar = 0; - m_xInplaceMenuBar->dispose(); - } - m_xInplaceMenuBar.clear(); - m_xContainerWindow.clear(); - m_xContainerTopWindow.clear(); - - // forward disposing call to toolbar manager - if ( m_pToolbarManager != NULL ) - m_pToolbarManager->disposing(rEvent); - - if ( m_xModuleCfgMgr.is() ) - { - try - { - Reference< XUIConfiguration > xModuleCfgMgr( m_xModuleCfgMgr, UNO_QUERY ); - xModuleCfgMgr->removeConfigurationListener( - Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - } - catch (const Exception&) - { - } - } - - if ( m_xDocCfgMgr.is() ) - { - try - { - Reference< XUIConfiguration > xDocCfgMgr( m_xDocCfgMgr, UNO_QUERY ); - xDocCfgMgr->removeConfigurationListener( - Reference< XUIConfigurationListener >( static_cast< OWeakObject* >( this ), UNO_QUERY )); - } - catch (const Exception&) - { - } - } - - m_xDocCfgMgr.clear(); - m_xModuleCfgMgr.clear(); - m_xFrame.clear(); - delete m_pGlobalSettings; - m_pGlobalSettings = 0; - m_xDockingAreaAcceptor = Reference< ui::XDockingAreaAcceptor >(); - - bDisposeAndClear = sal_True; - } - else if ( rEvent.Source == Reference< XInterface >( m_xContainerWindow, UNO_QUERY )) - { - // Our container window gets disposed. Remove all user interface elements. - uno::Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - if ( pToolbarManager ) - { - uno::Reference< awt::XWindowPeer > aEmptyWindowPeer; - pToolbarManager->setParentWindow( aEmptyWindowPeer ); - } - impl_clearUpMenuBar(); - m_xMenuBar.clear(); - if ( m_xInplaceMenuBar.is() ) - { - m_pInplaceMenuBar = 0; - m_xInplaceMenuBar->dispose(); - } - m_xInplaceMenuBar.clear(); - m_xContainerWindow.clear(); - m_xContainerTopWindow.clear(); - } - else if ( rEvent.Source == Reference< XInterface >( m_xDocCfgMgr, UNO_QUERY )) - m_xDocCfgMgr.clear(); - else if ( rEvent.Source == Reference< XInterface >( m_xModuleCfgMgr , UNO_QUERY )) - m_xModuleCfgMgr.clear(); - - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - // Send disposing to our listener when we have lost our frame. - if ( bDisposeAndClear ) - { - // Send message to all listener and forget her references. - uno::Reference< frame::XLayoutManager > xThis( static_cast< ::cppu::OWeakObject* >(this), uno::UNO_QUERY ); - lang::EventObject aEvent( xThis ); - m_aListenerContainer.disposeAndClear( aEvent ); - } -} - -void SAL_CALL LayoutManager::elementInserted( const ui::ConfigurationEvent& Event ) throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - Reference< XFrame > xFrame( m_xFrame ); - Reference< ui::XUIConfigurationListener > xUICfgListener( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( xFrame.is() ) - { - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - bool bRefreshLayout(false); - - parseResourceURL( Event.ResourceURL, aElementType, aElementName ); - if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - if ( xUICfgListener.is() ) - { - xUICfgListener->elementInserted( Event ); - bRefreshLayout = pToolbarManager->isLayoutDirty(); - } - } - else if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_MENUBAR )) - { - Reference< XUIElement > xUIElement = implts_findElement( Event.ResourceURL ); - Reference< XUIElementSettings > xElementSettings( xUIElement, UNO_QUERY ); - if ( xElementSettings.is() ) - { - ::rtl::OUString aConfigSourcePropName( RTL_CONSTASCII_USTRINGPARAM( "ConfigurationSource" )); - uno::Reference< XPropertySet > xPropSet( xElementSettings, uno::UNO_QUERY ); - if ( xPropSet.is() ) - { - if ( Event.Source == uno::Reference< uno::XInterface >( m_xDocCfgMgr, uno::UNO_QUERY )) - xPropSet->setPropertyValue( aConfigSourcePropName, makeAny( m_xDocCfgMgr )); - } - xElementSettings->updateSettings(); - } - } - - if ( bRefreshLayout ) - doLayout(); - } -} - -void SAL_CALL LayoutManager::elementRemoved( const ui::ConfigurationEvent& Event ) throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - Reference< frame::XFrame > xFrame( m_xFrame ); - Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager ); - Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); - Reference< ui::XUIElement > xMenuBar( m_xMenuBar ); - Reference< ui::XUIConfigurationManager > xModuleCfgMgr( m_xModuleCfgMgr ); - Reference< ui::XUIConfigurationManager > xDocCfgMgr( m_xDocCfgMgr ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( xFrame.is() ) - { - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - bool bRefreshLayout(false); - - parseResourceURL( Event.ResourceURL, aElementType, aElementName ); - if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - if ( xToolbarManager.is() ) - { - xToolbarManager->elementRemoved( Event ); - bRefreshLayout = pToolbarManager->isLayoutDirty(); - } - } - else - { - Reference< XUIElement > xUIElement = implts_findElement( Event.ResourceURL ); - Reference< XUIElementSettings > xElementSettings( xUIElement, UNO_QUERY ); - if ( xElementSettings.is() ) - { - bool bNoSettings( false ); - ::rtl::OUString aConfigSourcePropName( RTL_CONSTASCII_USTRINGPARAM( "ConfigurationSource" )); - Reference< XInterface > xElementCfgMgr; - Reference< XPropertySet > xPropSet( xElementSettings, UNO_QUERY ); - - if ( xPropSet.is() ) - xPropSet->getPropertyValue( aConfigSourcePropName ) >>= xElementCfgMgr; - - if ( !xElementCfgMgr.is() ) - return; - - // Check if the same UI configuration manager has changed => check further - if ( Event.Source == xElementCfgMgr ) - { - // Same UI configuration manager where our element has its settings - if ( Event.Source == Reference< XInterface >( xDocCfgMgr, UNO_QUERY )) - { - // document settings removed - if ( xModuleCfgMgr->hasSettings( Event.ResourceURL )) - { - xPropSet->setPropertyValue( aConfigSourcePropName, makeAny( m_xModuleCfgMgr )); - xElementSettings->updateSettings(); - return; - } - } - - bNoSettings = true; - } - - // No settings anymore, element must be destroyed - if ( xContainerWindow.is() && bNoSettings ) - { - if ( aElementType.equalsIgnoreAsciiCaseAscii( "menubar" ) && aElementName.equalsIgnoreAsciiCaseAscii( "menubar" )) - { - SystemWindow* pSysWindow = getTopSystemWindow( xContainerWindow ); - if ( pSysWindow && !m_bInplaceMenuSet ) - pSysWindow->SetMenuBar( 0 ); - - Reference< XComponent > xComp( xMenuBar, UNO_QUERY ); - if ( xComp.is() ) - xComp->dispose(); - - WriteGuard aWriteLock( m_aLock ); - m_xMenuBar.clear(); - } - } - } - } - - if ( bRefreshLayout ) - doLayout(); - } -} - -void SAL_CALL LayoutManager::elementReplaced( const ui::ConfigurationEvent& Event ) throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - Reference< XFrame > xFrame( m_xFrame ); - Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - aReadLock.unlock(); - - if ( xFrame.is() ) - { - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - bool bRefreshLayout(false); - - parseResourceURL( Event.ResourceURL, aElementType, aElementName ); - if ( aElementType.equalsIgnoreAsciiCaseAscii( UIRESOURCETYPE_TOOLBAR )) - { - if ( xToolbarManager.is() ) - { - xToolbarManager->elementReplaced( Event ); - bRefreshLayout = pToolbarManager->isLayoutDirty(); - } - } - else - { - Reference< XUIElement > xUIElement = implts_findElement( Event.ResourceURL ); - Reference< XUIElementSettings > xElementSettings( xUIElement, UNO_QUERY ); - if ( xElementSettings.is() ) - { - ::rtl::OUString aConfigSourcePropName( RTL_CONSTASCII_USTRINGPARAM( "ConfigurationSource" )); - Reference< XInterface > xElementCfgMgr; - Reference< XPropertySet > xPropSet( xElementSettings, UNO_QUERY ); - - if ( xPropSet.is() ) - xPropSet->getPropertyValue( aConfigSourcePropName ) >>= xElementCfgMgr; - - if ( !xElementCfgMgr.is() ) - return; - - // Check if the same UI configuration manager has changed => update settings - if ( Event.Source == xElementCfgMgr ) - xElementSettings->updateSettings(); - } - } - - if ( bRefreshLayout ) - doLayout(); - } -} - -//--------------------------------------------------------------------------------------------------------- -// OPropertySetHelper -//--------------------------------------------------------------------------------------------------------- -sal_Bool SAL_CALL LayoutManager::convertFastPropertyValue( Any& aConvertedValue, - Any& aOldValue, - sal_Int32 nHandle, - const Any& aValue ) throw( lang::IllegalArgumentException ) -{ - return LayoutManager_PBase::convertFastPropertyValue( aConvertedValue, aOldValue, nHandle, aValue ); -} - -void SAL_CALL LayoutManager::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, - const uno::Any& aValue ) throw( uno::Exception ) -{ - if ( nHandle != LAYOUTMANAGER_PROPHANDLE_REFRESHVISIBILITY ) - LayoutManager_PBase::setFastPropertyValue_NoBroadcast( nHandle, aValue ); - - switch( nHandle ) - { - case LAYOUTMANAGER_PROPHANDLE_MENUBARCLOSER: - implts_updateMenuBarClose(); - break; - - case LAYOUTMANAGER_PROPHANDLE_REFRESHVISIBILITY: - { - sal_Bool bValue(sal_False); - if (( aValue >>= bValue ) && bValue ) - { - ReadGuard aReadLock( m_aLock ); - Reference< ui::XUIConfigurationListener > xToolbarManager( m_xToolbarManager ); - ToolbarLayoutManager* pToolbarManager = m_pToolbarManager; - bool bAutomaticToolbars( m_bAutomaticToolbars ); - aReadLock.unlock(); - - if ( pToolbarManager ) - pToolbarManager->refreshToolbarsVisibility( bAutomaticToolbars ); - } - break; - } - - case LAYOUTMANAGER_PROPHANDLE_HIDECURRENTUI: - implts_setCurrentUIVisibility( !m_bHideCurrentUI ); - break; - default: break; - } -} - -void SAL_CALL LayoutManager::getFastPropertyValue( uno::Any& aValue, sal_Int32 nHandle ) const -{ - LayoutManager_PBase::getFastPropertyValue( aValue, nHandle ); -} - -namespace detail -{ - class InfoHelperBuilder : private ::boost::noncopyable - { - private: - ::cppu::OPropertyArrayHelper *m_pInfoHelper; - public: - InfoHelperBuilder(const LayoutManager &rManager) - { - uno::Sequence< beans::Property > aProperties; - rManager.describeProperties(aProperties); - m_pInfoHelper = new ::cppu::OPropertyArrayHelper(aProperties, sal_True); - } - ~InfoHelperBuilder() - { - delete m_pInfoHelper; - } - - ::cppu::OPropertyArrayHelper& getHelper() { return *m_pInfoHelper; } - }; -} -namespace -{ - struct theInfoHelper : - public rtl::StaticWithArg< detail::InfoHelperBuilder, LayoutManager, - theInfoHelper > - { - }; -} - -::cppu::IPropertyArrayHelper& SAL_CALL LayoutManager::getInfoHelper() -{ - return theInfoHelper::get(*this).getHelper(); -} - -uno::Reference< beans::XPropertySetInfo > SAL_CALL LayoutManager::getPropertySetInfo() throw (uno::RuntimeException) -{ - static uno::Reference< beans::XPropertySetInfo >* pInfo = NULL; - - if( pInfo == NULL ) - { - osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ; - - if( pInfo == NULL ) - { - static uno::Reference< beans::XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) ); - pInfo = &xInfo; - } - } - - return (*pInfo); -} - -} // namespace framework - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |