diff options
Diffstat (limited to 'framework/source/layoutmanager/toolbarlayoutmanager.cxx')
-rw-r--r-- | framework/source/layoutmanager/toolbarlayoutmanager.cxx | 4363 |
1 files changed, 0 insertions, 4363 deletions
diff --git a/framework/source/layoutmanager/toolbarlayoutmanager.cxx b/framework/source/layoutmanager/toolbarlayoutmanager.cxx deleted file mode 100644 index 83b8b34a3d..0000000000 --- a/framework/source/layoutmanager/toolbarlayoutmanager.cxx +++ /dev/null @@ -1,4363 +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 2008 by Sun Microsystems, Inc. - * - * 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 <toolbarlayoutmanager.hxx> -#include <helpers.hxx> -#include <services.h> -#include <classes/resource.hrc> -#include <classes/fwkresid.hxx> -#include <uiconfiguration/windowstateconfiguration.hxx> - -// interface includes -#include <com/sun/star/awt/PosSize.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/ui/XUIElementSettings.hpp> -#include <com/sun/star/ui/XUIFunctionListener.hpp> - -// other includes -#include <unotools/cmdoptions.hxx> -#include <toolkit/unohlp.hxx> -#include <toolkit/helper/convert.hxx> -#include <toolkit/awt/vclxwindow.hxx> -#include <vcl/i18nhelp.hxx> -#include <vcl/dockingarea.hxx> -#include <boost/bind.hpp> - -using namespace ::com::sun::star; - -namespace framework -{ - -ToolbarLayoutManager::ToolbarLayoutManager( - const uno::Reference< lang::XMultiServiceFactory >& xSMGR, - const uno::Reference< ui::XUIElementFactory >& xUIElementFactory, - ILayoutNotifications* pParentLayouter ) - : ThreadHelpBase( &Application::GetSolarMutex() ), - m_xSMGR( xSMGR ), - m_xUIElementFactoryManager( xUIElementFactory ), - m_pParentLayouter( pParentLayouter ), - m_eDockOperation( DOCKOP_ON_COLROW ), - m_pAddonOptions( 0 ), - m_pGlobalSettings( 0 ), - m_bComponentAttached( false ), - m_bMustLayout( false ), - m_bLayoutDirty( false ), - m_bStoreWindowState( false ), - m_bGlobalSettings( false ), - m_bDockingInProgress( false ), - m_bVisible( true ), - m_bLayoutInProgress( false ), - m_bToolbarCreation( false ), - m_aFullAddonTbxPrefix( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/addon_" )), - m_aCustomTbxPrefix( RTL_CONSTASCII_USTRINGPARAM( "custom_" )), - m_aCustomizeCmd( RTL_CONSTASCII_USTRINGPARAM( "ConfigureDialog" )), - m_aToolbarTypeString( RTL_CONSTASCII_USTRINGPARAM( UIRESOURCETYPE_TOOLBAR )) -{ - // initialize rectangles to zero values - setZeroRectangle( m_aDockingAreaOffsets ); - setZeroRectangle( m_aDockingArea ); - - // create toolkit object - m_xToolkit = uno::Reference< awt::XToolkit >( m_xSMGR->createInstance( SERVICENAME_VCLTOOLKIT ), uno::UNO_QUERY ); -} - -ToolbarLayoutManager::~ToolbarLayoutManager() -{ - delete m_pGlobalSettings; - delete m_pAddonOptions; -} - -//--------------------------------------------------------------------------------------------------------- -// XInterface -//--------------------------------------------------------------------------------------------------------- -void SAL_CALL ToolbarLayoutManager::acquire() throw() -{ - OWeakObject::acquire(); -} - -void SAL_CALL ToolbarLayoutManager::release() throw() -{ - OWeakObject::release(); -} - -uno::Any SAL_CALL ToolbarLayoutManager::queryInterface( const uno::Type & rType ) throw( uno::RuntimeException ) -{ - uno::Any a = ::cppu::queryInterface( rType, - SAL_STATIC_CAST( awt::XDockableWindowListener*, this ), - SAL_STATIC_CAST( ui::XUIConfigurationListener*, this ), - SAL_STATIC_CAST( awt::XWindowListener*, this )); - - if ( a.hasValue() ) - return a; - - return OWeakObject::queryInterface( rType ); -} - -void SAL_CALL ToolbarLayoutManager::disposing( const lang::EventObject& aEvent ) throw( uno::RuntimeException ) -{ - if ( aEvent.Source == m_xFrame ) - { - // Reset all internal references - reset(); - implts_destroyDockingAreaWindows(); - } -} - -awt::Rectangle ToolbarLayoutManager::getDockingArea() -{ - WriteGuard aWriteLock( m_aLock ); - Rectangle aNewDockingArea( m_aDockingArea ); - aWriteLock.unlock(); - - if ( isLayoutDirty() ) - aNewDockingArea = implts_calcDockingArea(); - - aWriteLock.lock(); - m_aDockingArea = aNewDockingArea; - aWriteLock.unlock(); - - return putRectangleValueToAWT(aNewDockingArea); -} - -void ToolbarLayoutManager::setDockingArea( const awt::Rectangle& rDockingArea ) -{ - WriteGuard aWriteLock( m_aLock ); - m_aDockingArea = putAWTToRectangle( rDockingArea ); - m_bLayoutDirty = true; - aWriteLock.unlock(); -} - -void ToolbarLayoutManager::implts_setDockingAreaWindowSizes( const awt::Rectangle& rBorderSpace ) -{ - ReadGuard aReadLock( m_aLock ); - Rectangle aDockOffsets = m_aDockingAreaOffsets; - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow ); - uno::Reference< awt::XWindow > xTopDockAreaWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP] ); - uno::Reference< awt::XWindow > xBottomDockAreaWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_BOTTOM] ); - uno::Reference< awt::XWindow > xLeftDockAreaWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_LEFT] ); - uno::Reference< awt::XWindow > xRightDockAreaWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_RIGHT] ); - 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 ); - long aStatusBarHeight = aDockOffsets.GetHeight(); - - sal_Int32 nLeftRightDockingAreaHeight( aContainerClientSize.Height ); - if ( rBorderSpace.Y >= 0 ) - { - // Top docking area window - xTopDockAreaWindow->setPosSize( 0, 0, aContainerClientSize.Width, rBorderSpace.Y, awt::PosSize::POSSIZE ); - xTopDockAreaWindow->setVisible( sal_True ); - nLeftRightDockingAreaHeight -= rBorderSpace.Y; - } - - if ( rBorderSpace.Height >= 0 ) - { - // Bottom docking area window - sal_Int32 nBottomPos = std::max( sal_Int32( aContainerClientSize.Height - rBorderSpace.Height - aStatusBarHeight ), sal_Int32( 0 )); - sal_Int32 nHeight = ( nBottomPos == 0 ) ? 0 : rBorderSpace.Height; - - xBottomDockAreaWindow->setPosSize( 0, nBottomPos, aContainerClientSize.Width, nHeight, awt::PosSize::POSSIZE ); - xBottomDockAreaWindow->setVisible( sal_True ); - nLeftRightDockingAreaHeight -= nHeight; - } - - nLeftRightDockingAreaHeight -= aStatusBarHeight; - if ( rBorderSpace.X >= 0 || nLeftRightDockingAreaHeight > 0 ) - { - // Left docking area window - // We also have to change our right docking area window if the top or bottom area has changed. They have a higher priority! - sal_Int32 nHeight = std::max( sal_Int32( 0 ), sal_Int32( nLeftRightDockingAreaHeight )); - - xLeftDockAreaWindow->setPosSize( 0, rBorderSpace.Y, rBorderSpace.X, nHeight, awt::PosSize::POSSIZE ); - xLeftDockAreaWindow->setVisible( sal_True ); - } - if ( rBorderSpace.Width >= 0 || nLeftRightDockingAreaHeight > 0 ) - { - // Right docking area window - // We also have to change our right docking area window if the top or bottom area has changed. They have a higher priority! - sal_Int32 nLeftPos = std::max( sal_Int32( 0 ), sal_Int32( aContainerClientSize.Width - rBorderSpace.Width )); - sal_Int32 nHeight = std::max( sal_Int32( 0 ), sal_Int32( nLeftRightDockingAreaHeight )); - sal_Int32 nWidth = ( nLeftPos == 0 ) ? 0 : rBorderSpace.Width; - - xRightDockAreaWindow->setPosSize( nLeftPos, rBorderSpace.Y, nWidth, nHeight, awt::PosSize::POSSIZE ); - xRightDockAreaWindow->setVisible( sal_True ); - } -} - -bool ToolbarLayoutManager::isLayoutDirty() -{ - return m_bLayoutDirty; -} - -void ToolbarLayoutManager::doLayout(const ::Size& aContainerSize) -{ - WriteGuard aWriteLock( m_aLock ); - bool bLayoutInProgress( m_bLayoutInProgress ); - m_bLayoutInProgress = true; - awt::Rectangle aDockingArea = putRectangleValueToAWT( m_aDockingArea ); - aWriteLock.unlock(); - - if ( bLayoutInProgress ) - return; - - // Retrieve row/column dependent data from all docked user-interface elements - for ( sal_Int32 i = 0; i < DOCKINGAREAS_COUNT; i++ ) - { - bool bReverse( isReverseOrderDockingArea( i )); - std::vector< SingleRowColumnWindowData > aRowColumnsWindowData; - - implts_getDockingAreaElementInfos( (ui::DockingArea)i, aRowColumnsWindowData ); - - sal_Int32 nOffset( 0 ); - const sal_uInt32 nCount = aRowColumnsWindowData.size(); - for ( sal_uInt32 j = 0; j < nCount; ++j ) - { - sal_uInt32 nIndex = bReverse ? nCount-j-1 : j; - implts_calcWindowPosSizeOnSingleRowColumn( i, nOffset, aRowColumnsWindowData[nIndex], aContainerSize ); - nOffset += aRowColumnsWindowData[j].nStaticSize; - } - } - - implts_setDockingAreaWindowSizes( aDockingArea ); - - aWriteLock.lock(); - m_bLayoutDirty = false; - m_bLayoutInProgress = false; - aWriteLock.unlock(); -} - -bool ToolbarLayoutManager::implts_isParentWindowVisible() const -{ - ReadGuard aReadLock( m_aLock ); - bool bVisible( false ); - if ( m_xContainerWindow.is() ) - bVisible = m_xContainerWindow->isVisible(); - - return bVisible; -} - -Rectangle ToolbarLayoutManager::implts_calcDockingArea() -{ - ReadGuard aReadLock( m_aLock ); - UIElementVector aWindowVector( m_aUIElements ); - aReadLock.unlock(); - - Rectangle aBorderSpace; - sal_Int32 nCurrRowColumn( 0 ); - sal_Int32 nCurrPos( 0 ); - sal_Int32 nCurrDockingArea( ui::DockingArea_DOCKINGAREA_TOP ); - std::vector< sal_Int32 > aRowColumnSizes[DOCKINGAREAS_COUNT]; - UIElementVector::const_iterator pConstIter; - - // initialize rectangle with zero values! - aBorderSpace.setWidth(0); - aBorderSpace.setHeight(0); - - aRowColumnSizes[nCurrDockingArea].clear(); - aRowColumnSizes[nCurrDockingArea].push_back( 0 ); - - for ( pConstIter = aWindowVector.begin(); pConstIter != aWindowVector.end(); ++pConstIter ) - { - uno::Reference< ui::XUIElement > xUIElement( pConstIter->m_xUIElement, uno::UNO_QUERY ); - if ( xUIElement.is() ) - { - uno::Reference< awt::XWindow > xWindow( xUIElement->getRealInterface(), uno::UNO_QUERY ); - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - if ( xWindow.is() && xDockWindow.is() ) - { - SolarMutexGuard aGuard; - - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && !xDockWindow->isFloating() && pConstIter->m_bVisible ) - { - awt::Rectangle aPosSize = xWindow->getPosSize(); - if ( pConstIter->m_aDockedData.m_nDockedArea != nCurrDockingArea ) - { - nCurrDockingArea = pConstIter->m_aDockedData.m_nDockedArea; - nCurrRowColumn = 0; - nCurrPos = 0; - aRowColumnSizes[nCurrDockingArea].clear(); - aRowColumnSizes[nCurrDockingArea].push_back( 0 ); - } - - if ( pConstIter->m_aDockedData.m_nDockedArea == nCurrDockingArea ) - { - if ( isHorizontalDockingArea( pConstIter->m_aDockedData.m_nDockedArea )) - { - if ( pConstIter->m_aDockedData.m_aPos.Y > nCurrPos ) - { - ++nCurrRowColumn; - nCurrPos = pConstIter->m_aDockedData.m_aPos.Y; - aRowColumnSizes[nCurrDockingArea].push_back( 0 ); - } - - if ( aPosSize.Height > aRowColumnSizes[nCurrDockingArea][nCurrRowColumn] ) - aRowColumnSizes[nCurrDockingArea][nCurrRowColumn] = aPosSize.Height; - } - else - { - if ( pConstIter->m_aDockedData.m_aPos.X > nCurrPos ) - { - ++nCurrRowColumn; - nCurrPos = pConstIter->m_aDockedData.m_aPos.X; - aRowColumnSizes[nCurrDockingArea].push_back( 0 ); - } - - if ( aPosSize.Width > aRowColumnSizes[nCurrDockingArea][nCurrRowColumn] ) - aRowColumnSizes[nCurrDockingArea][nCurrRowColumn] = aPosSize.Width; - } - } - } - } - } - } - - // Sum up max heights from every row/column - if ( !aWindowVector.empty() ) - { - for ( sal_Int32 i = 0; i <= ui::DockingArea_DOCKINGAREA_RIGHT; i++ ) - { - sal_Int32 nSize( 0 ); - const sal_uInt32 nCount = aRowColumnSizes[i].size(); - for ( sal_uInt32 j = 0; j < nCount; j++ ) - nSize += aRowColumnSizes[i][j]; - - if ( i == ui::DockingArea_DOCKINGAREA_TOP ) - aBorderSpace.Top() = nSize; - else if ( i == ui::DockingArea_DOCKINGAREA_BOTTOM ) - aBorderSpace.Bottom() = nSize; - else if ( i == ui::DockingArea_DOCKINGAREA_LEFT ) - aBorderSpace.Left() = nSize; - else - aBorderSpace.Right() = nSize; - } - } - - return aBorderSpace; -} - -void ToolbarLayoutManager::reset() -{ - WriteGuard aWriteLock( m_aLock ); - uno::Reference< ui::XUIConfigurationManager > xModuleCfgMgr( m_xModuleCfgMgr ); - uno::Reference< ui::XUIConfigurationManager > xDocCfgMgr( m_xDocCfgMgr ); - m_xModuleCfgMgr.clear(); - m_xDocCfgMgr.clear(); - m_bComponentAttached = false; - aWriteLock.unlock(); - - destroyToolbars(); - resetDockingArea(); -} - -void ToolbarLayoutManager::attach( - const uno::Reference< frame::XFrame >& xFrame, - const uno::Reference< ui::XUIConfigurationManager >& xModuleCfgMgr, - const uno::Reference< ui::XUIConfigurationManager >& xDocCfgMgr, - const uno::Reference< container::XNameAccess >& xPersistentWindowState ) -{ - // reset toolbar manager if we lose our current frame - if ( m_xFrame.is() && m_xFrame != xFrame ) - reset(); - - WriteGuard aWriteLock( m_aLock ); - m_xFrame = xFrame; - m_xModuleCfgMgr = xModuleCfgMgr; - m_xDocCfgMgr = xDocCfgMgr; - m_xPersistentWindowState = xPersistentWindowState; - m_bComponentAttached = true; -} - -void ToolbarLayoutManager::createStaticToolbars() -{ - resetDockingArea(); - implts_createCustomToolBars(); - implts_createAddonsToolBars(); - implts_createNonContextSensitiveToolBars(); - implts_sortUIElements(); -} - -bool ToolbarLayoutManager::requestToolbar( const ::rtl::OUString& rResourceURL ) -{ - bool bNotify( false ); - bool bMustCallCreate( false ); - uno::Reference< ui::XUIElement > xUIElement; - - ReadGuard aReadLock( m_aLock ); - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - aReadLock.unlock(); - - uno::Reference< frame::XModel > xModel( impl_getModelFromFrame( xFrame )); - if ( implts_isPreviewModel( xModel )) - return false; // no toolbars for preview frame! - - UIElement aRequestedToolbar = impl_findToolbar( rResourceURL ); - if ( aRequestedToolbar.m_aName != rResourceURL ) - { - bMustCallCreate = true; - aRequestedToolbar.m_aName = rResourceURL; - aRequestedToolbar.m_aType = m_aToolbarTypeString; - aRequestedToolbar.m_xUIElement = xUIElement; - implts_readWindowStateData( rResourceURL, aRequestedToolbar ); - } - - xUIElement = aRequestedToolbar.m_xUIElement; - if ( !xUIElement.is() ) - bMustCallCreate = true; - - bool bCreateOrShowToolbar( aRequestedToolbar.m_bVisible & !aRequestedToolbar.m_bMasterHide ); - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow, uno::UNO_QUERY ); - if ( xContainerWindow.is() && aRequestedToolbar.m_bFloating ) - bCreateOrShowToolbar &= bool( xContainerWindow->isActive()); - - if ( bCreateOrShowToolbar ) - bNotify = ( bMustCallCreate ) ? createToolbar( rResourceURL ) : showToolbar( rResourceURL ); - - return bNotify; -} - -bool ToolbarLayoutManager::createToolbar( const ::rtl::OUString& rResourceURL ) -{ - bool bNotify( false ); - uno::Reference< ui::XUIElement > xUITempElement; - - implts_createToolBar( rResourceURL, bNotify, xUITempElement ); - return bNotify; -} - -bool ToolbarLayoutManager::destroyToolbar( const ::rtl::OUString& rResourceURL ) -{ - const rtl::OUString aAddonTbResourceName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/addon_" )); - - UIElementVector::iterator pIter; - uno::Reference< lang::XComponent > xComponent; - - bool bNotify( false ); - bool bMustBeSorted( false ); - bool bMustLayouted( false ); - bool bMustBeDestroyed( rResourceURL.indexOf( aAddonTbResourceName ) != 0 ); - - WriteGuard aWriteLock( m_aLock ); - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_aName == rResourceURL ) - { - xComponent.set( pIter->m_xUIElement, uno::UNO_QUERY ); - if ( bMustBeDestroyed ) - pIter->m_xUIElement.clear(); - else - pIter->m_bVisible = false; - break; - } - } - aWriteLock.unlock(); - - uno::Reference< ui::XUIElement > xUIElement( xComponent, uno::UNO_QUERY ); - if ( xUIElement.is() ) - { - uno::Reference< awt::XWindow > xWindow( xUIElement->getRealInterface(), uno::UNO_QUERY ); - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - - if ( bMustBeDestroyed ) - { - try - { - if ( xWindow.is() ) - xWindow->removeWindowListener( uno::Reference< awt::XWindowListener >( - static_cast< OWeakObject * >( this ), uno::UNO_QUERY )); - } - catch (const uno::Exception&) - { - } - - try - { - if ( xDockWindow.is() ) - xDockWindow->removeDockableWindowListener( uno::Reference< awt::XDockableWindowListener >( - static_cast< OWeakObject * >( this ), uno::UNO_QUERY )); - } - catch (const uno::Exception&) - { - } - } - else - { - if ( xWindow.is() ) - xWindow->setVisible( sal_False ); - bNotify = true; - } - - if ( !xDockWindow->isFloating() ) - bMustLayouted = true; - bMustBeSorted = true; - } - - if ( bMustBeDestroyed ) - { - if ( xComponent.is() ) - xComponent->dispose(); - bNotify = true; - } - - if ( bMustLayouted ) - implts_setLayoutDirty(); - - if ( bMustBeSorted ) - implts_sortUIElements(); - - return bNotify; -} - -void ToolbarLayoutManager::destroyToolbars() -{ - UIElementVector aUIElementVector; - implts_getUIElementVectorCopy( aUIElementVector ); - - WriteGuard aWriteLock( m_aLock ); - m_aUIElements.clear(); - m_bLayoutDirty = true; - aWriteLock.unlock(); - - UIElementVector::iterator pIter; - for ( pIter = aUIElementVector.begin(); pIter != aUIElementVector.end(); ++pIter ) - { - uno::Reference< lang::XComponent > xComponent( pIter->m_xUIElement, uno::UNO_QUERY ); - if ( xComponent.is() ) - xComponent->dispose(); - } -} - -bool ToolbarLayoutManager::showToolbar( const ::rtl::OUString& rResourceURL ) -{ - UIElement aUIElement = implts_findToolbar( rResourceURL ); - - SolarMutexGuard aGuard; - Window* pWindow = getWindowFromXUIElement( aUIElement.m_xUIElement ); - if ( pWindow ) - { - if ( !aUIElement.m_bFloating ) - implts_setLayoutDirty(); - else - pWindow->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); - - aUIElement.m_bVisible = true; - implts_writeWindowStateData( aUIElement ); - implts_setToolbar( aUIElement ); - implts_sortUIElements(); - return true; - } - - return false; -} - -bool ToolbarLayoutManager::hideToolbar( const ::rtl::OUString& rResourceURL ) -{ - UIElement aUIElement = implts_findToolbar( rResourceURL ); - - SolarMutexGuard aGuard; - Window* pWindow = getWindowFromXUIElement( aUIElement.m_xUIElement ); - if ( pWindow ) - { - pWindow->Show( sal_False ); - if ( !aUIElement.m_bFloating ) - implts_setLayoutDirty(); - - aUIElement.m_bVisible = false; - implts_writeWindowStateData( aUIElement ); - implts_setToolbar( aUIElement ); - return true; - } - - return false; -} - -void ToolbarLayoutManager::refreshToolbarsVisibility( bool bAutomaticToolbars ) -{ - UIElementVector aUIElementVector; - - ReadGuard aReadLock( m_aLock ); - bool bVisible( m_bVisible ); - aReadLock.unlock(); - - if ( !bVisible || !bAutomaticToolbars ) - return; - - implts_getUIElementVectorCopy( aUIElementVector ); - - UIElement aUIElement; - SolarMutexGuard aGuard; - UIElementVector::iterator pIter; - for ( pIter = aUIElementVector.begin(); pIter != aUIElementVector.end(); ++pIter ) - { - if ( implts_readWindowStateData( pIter->m_aName, aUIElement ) && - ( pIter->m_bVisible != aUIElement.m_bVisible ) && !pIter->m_bMasterHide ) - { - WriteGuard aWriteLock( m_aLock ); - UIElement& rUIElement = impl_findToolbar( pIter->m_aName ); - if ( rUIElement.m_aName == pIter->m_aName ) - { - rUIElement.m_bVisible = aUIElement.m_bVisible; - implts_setLayoutDirty(); - } - } - } -} - -void ToolbarLayoutManager::setFloatingToolbarsVisibility( bool bVisible ) -{ - UIElementVector aUIElementVector; - implts_getUIElementVectorCopy( aUIElementVector ); - - SolarMutexGuard aGuard; - UIElementVector::iterator pIter; - for ( pIter = aUIElementVector.begin(); pIter != aUIElementVector.end(); ++pIter ) - { - Window* pWindow = getWindowFromXUIElement( pIter->m_xUIElement ); - if ( pWindow && pIter->m_bFloating ) - { - if ( bVisible ) - { - if ( pIter->m_bVisible && !pIter->m_bMasterHide ) - pWindow->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); - } - else - pWindow->Show( sal_False ); - } - } -} - -void ToolbarLayoutManager::setVisible( bool bVisible ) -{ - UIElementVector aUIElementVector; - implts_getUIElementVectorCopy( aUIElementVector ); - - SolarMutexGuard aGuard; - UIElementVector::iterator pIter; - for ( pIter = aUIElementVector.begin(); pIter != aUIElementVector.end(); ++pIter ) - { - pIter->m_bMasterHide = !bVisible; - Window* pWindow = getWindowFromXUIElement( pIter->m_xUIElement ); - if ( pWindow ) - { - bool bSetVisible( pIter->m_bVisible & bVisible ); - if ( !bSetVisible ) - pWindow->Hide(); - else - { - if ( pIter->m_bFloating ) - pWindow->Show(true, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); - else - implts_setLayoutDirty(); - } - } - } - - if ( !bVisible ) - resetDockingArea(); -} - -bool ToolbarLayoutManager::dockToolbar( const ::rtl::OUString& rResourceURL, ui::DockingArea eDockingArea, const awt::Point& aPos ) -{ - UIElement aUIElement = implts_findToolbar( rResourceURL ); - - if ( aUIElement.m_xUIElement.is() ) - { - try - { - uno::Reference< awt::XWindow > xWindow( aUIElement.m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - if ( xDockWindow.is() ) - { - if ( eDockingArea != ui::DockingArea_DOCKINGAREA_DEFAULT ) - aUIElement.m_aDockedData.m_nDockedArea = sal_Int16( eDockingArea ); - - if ( !isDefaultPos( aPos )) - aUIElement.m_aDockedData.m_aPos = aPos; - - if ( !xDockWindow->isFloating() ) - { - Window* pWindow( 0 ); - ToolBox* pToolBox( 0 ); - - { - SolarMutexGuard aGuard; - pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - { - pToolBox = (ToolBox *)pWindow; - - // We have to set the alignment of the toolbox. It's possible that the toolbox is moved from a - // horizontal to a vertical docking area! - pToolBox->SetAlign( ImplConvertAlignment( aUIElement.m_aDockedData.m_nDockedArea )); - } - } - - if ( hasDefaultPosValue( aUIElement.m_aDockedData.m_aPos )) - { - // Docking on its default position without a preset position - - // we have to find a good place for it. - ::Size aSize; - - SolarMutexGuard aGuard; - { - if ( pToolBox ) - aSize = pToolBox->CalcWindowSizePixel( 1, ImplConvertAlignment( aUIElement.m_aDockedData.m_nDockedArea ) ); - else - aSize = pWindow->GetSizePixel(); - } - - ::Point aPixelPos; - awt::Point aDockPos; - implts_findNextDockingPos((ui::DockingArea)aUIElement.m_aDockedData.m_nDockedArea, aSize, aDockPos, aPixelPos ); - aUIElement.m_aDockedData.m_aPos = aDockPos; - } - } - - implts_setToolbar( aUIElement ); - - if ( xDockWindow->isFloating() ) - { - // ATTENTION: This will call toggleFloatingMode() via notifications which - // sets the floating member of the UIElement correctly! - xDockWindow->setFloatingMode( sal_False ); - } - else - { - implts_writeWindowStateData( aUIElement ); - implts_sortUIElements(); - - if ( aUIElement.m_bVisible ) - implts_setLayoutDirty(); - } - return true; - } - } - catch (const lang::DisposedException&) - { - } - } - - return false; -} - -bool ToolbarLayoutManager::dockAllToolbars() -{ - std::vector< ::rtl::OUString > aToolBarNameVector; - - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - - ReadGuard aReadLock( m_aLock ); - UIElementVector::iterator pIter; - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_aType.equalsAscii( "toolbar" ) && pIter->m_xUIElement.is() && - pIter->m_bFloating && pIter->m_bVisible ) - aToolBarNameVector.push_back( pIter->m_aName ); - } - aReadLock.unlock(); - - bool bResult(true); - const sal_uInt32 nCount = aToolBarNameVector.size(); - for ( sal_uInt32 i = 0; i < nCount; ++i ) - { - awt::Point aPoint; - aPoint.X = aPoint.Y = SAL_MAX_INT32; - bResult &= dockToolbar( aToolBarNameVector[i], ui::DockingArea_DOCKINGAREA_DEFAULT, aPoint ); - } - - return bResult; -} - -long ToolbarLayoutManager::childWindowEvent( VclSimpleEvent* pEvent ) -{ - // To enable toolbar controllers to change their image when a sub-toolbar function - // is activated, we need this mechanism. We have NO connection between these toolbars - // anymore! - if ( pEvent && pEvent->ISA( VclWindowEvent )) - { - if ( pEvent->GetId() == VCLEVENT_TOOLBOX_SELECT ) - { - ::rtl::OUString aToolbarName; - ::rtl::OUString aCommand; - ToolBox* pToolBox = getToolboxPtr( ((VclWindowEvent*)pEvent)->GetWindow() ); - - if ( pToolBox ) - { - aToolbarName = retrieveToolbarNameFromHelpURL( pToolBox ); - sal_uInt16 nId = pToolBox->GetCurItemId(); - if ( nId > 0 ) - aCommand = pToolBox->GetItemCommand( nId ); - } - - if (( aToolbarName.getLength() > 0 ) && ( aCommand.getLength() > 0 )) - { - ReadGuard aReadLock( m_aLock ); - ::std::vector< uno::Reference< ui::XUIFunctionListener > > aListenerArray; - UIElementVector::iterator pIter; - - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_xUIElement.is() ) - { - uno::Reference< ui::XUIFunctionListener > xListener( pIter->m_xUIElement, uno::UNO_QUERY ); - if ( xListener.is() ) - aListenerArray.push_back( xListener ); - } - } - aReadLock.unlock(); - - const sal_uInt32 nCount = aListenerArray.size(); - for ( sal_uInt32 i = 0; i < nCount; ++i ) - { - try - { - aListenerArray[i]->functionExecute( aToolbarName, aCommand ); - } - catch (const uno::RuntimeException&) - { - throw; - } - catch (const uno::Exception&) - { - } - } - } - } - else if ( pEvent->GetId() == VCLEVENT_TOOLBOX_FORMATCHANGED ) - { - if ( !implts_isToolbarCreationActive() ) - { - ToolBox* pToolBox = getToolboxPtr( ((VclWindowEvent*)pEvent)->GetWindow() ); - if ( pToolBox ) - { - ::rtl::OUString aToolbarName = retrieveToolbarNameFromHelpURL( pToolBox ); - if ( aToolbarName.getLength() > 0 ) - { - ::rtl::OUStringBuffer aBuf(100); - aBuf.appendAscii( "private:resource/toolbar/" ); - aBuf.append( aToolbarName ); - - UIElement aToolbar = implts_findToolbar( aBuf.makeStringAndClear() ); - if ( aToolbar.m_xUIElement.is() && !aToolbar.m_bFloating ) - { - implts_setLayoutDirty(); - m_pParentLayouter->requestLayout( ILayoutNotifications::HINT_TOOLBARSPACE_HAS_CHANGED ); - } - } - } - } - } - } - - return 1; -} - -void ToolbarLayoutManager::resetDockingArea() -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< awt::XWindow > xTopDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP] ); - uno::Reference< awt::XWindow > xLeftDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_LEFT] ); - uno::Reference< awt::XWindow > xRightDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_RIGHT] ); - uno::Reference< awt::XWindow > xBottomDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_BOTTOM] ); - aReadLock.unlock(); - - if ( xTopDockingWindow.is() ) - xTopDockingWindow->setPosSize( 0, 0, 0, 0, awt::PosSize::POSSIZE ); - if ( xLeftDockingWindow.is() ) - xLeftDockingWindow->setPosSize( 0, 0, 0, 0, awt::PosSize::POSSIZE ); - if ( xRightDockingWindow.is() ) - xRightDockingWindow->setPosSize( 0, 0, 0, 0, awt::PosSize::POSSIZE ); - if ( xBottomDockingWindow.is() ) - xBottomDockingWindow->setPosSize( 0, 0, 0, 0, awt::PosSize::POSSIZE ); -} - -void ToolbarLayoutManager::setParentWindow( - const uno::Reference< awt::XWindowPeer >& xParentWindow ) -{ - static const char DOCKINGAREASTRING[] = "dockingarea"; - - uno::Reference< awt::XWindow > xTopDockWindow = uno::Reference< awt::XWindow >( createToolkitWindow( m_xSMGR, xParentWindow, DOCKINGAREASTRING ), uno::UNO_QUERY ); - uno::Reference< awt::XWindow > xLeftDockWindow = uno::Reference< awt::XWindow >( createToolkitWindow( m_xSMGR, xParentWindow, DOCKINGAREASTRING ), uno::UNO_QUERY ); - uno::Reference< awt::XWindow > xRightDockWindow = uno::Reference< awt::XWindow >( createToolkitWindow( m_xSMGR, xParentWindow, DOCKINGAREASTRING ), uno::UNO_QUERY ); - uno::Reference< awt::XWindow > xBottomDockWindow = uno::Reference< awt::XWindow >( createToolkitWindow( m_xSMGR, xParentWindow, DOCKINGAREASTRING ), uno::UNO_QUERY ); - - WriteGuard aWriteLock( m_aLock ); - m_xContainerWindow = uno::Reference< awt::XWindow2 >( xParentWindow, uno::UNO_QUERY ); - m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP] = xTopDockWindow; - m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_LEFT] = xLeftDockWindow; - m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_RIGHT] = xRightDockWindow; - m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_BOTTOM] = xBottomDockWindow; - aWriteLock.unlock(); - - if ( xParentWindow.is() ) - { - SolarMutexGuard aGuard; - ::DockingAreaWindow* pWindow = dynamic_cast< ::DockingAreaWindow* >(VCLUnoHelper::GetWindow( xTopDockWindow ) ); - if( pWindow ) pWindow->SetAlign( WINDOWALIGN_TOP ); - pWindow = dynamic_cast< ::DockingAreaWindow* >(VCLUnoHelper::GetWindow( xBottomDockWindow ) ); - if( pWindow ) pWindow->SetAlign( WINDOWALIGN_BOTTOM ); - pWindow = dynamic_cast< ::DockingAreaWindow* >(VCLUnoHelper::GetWindow( xLeftDockWindow ) ); - if( pWindow ) pWindow->SetAlign( WINDOWALIGN_LEFT ); - pWindow = dynamic_cast< ::DockingAreaWindow* >(VCLUnoHelper::GetWindow( xRightDockWindow ) ); - if( pWindow ) pWindow->SetAlign( WINDOWALIGN_RIGHT ); - implts_reparentToolbars(); - } - else - { - destroyToolbars(); - resetDockingArea(); - } -} - -void ToolbarLayoutManager::setDockingAreaOffsets( const ::Rectangle aOffsets ) -{ - WriteGuard aWriteLock( m_aLock ); - m_aDockingAreaOffsets = aOffsets; - m_bLayoutDirty = true; -} - -rtl::OUString ToolbarLayoutManager::implts_generateGenericAddonToolbarTitle( sal_Int32 nNumber ) const -{ - String aAddonGenericTitle; - - aAddonGenericTitle = String( FwkResId( STR_TOOLBAR_TITLE_ADDON )); - const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper(); - - String aNumStr = rI18nHelper.GetNum( nNumber, 0, sal_False, sal_False ); - aAddonGenericTitle.SearchAndReplaceAscii( "%num%", aNumStr ); - - return rtl::OUString( aAddonGenericTitle ); -} - -void ToolbarLayoutManager::implts_createAddonsToolBars() -{ - WriteGuard aWriteLock( m_aLock ); - if ( !m_pAddonOptions ) - m_pAddonOptions = new AddonsOptions; - - uno::Reference< ui::XUIElementFactory > xUIElementFactory( m_xUIElementFactoryManager ); - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - aWriteLock.unlock(); - - uno::Reference< frame::XModel > xModel( impl_getModelFromFrame( xFrame )); - if ( implts_isPreviewModel( xModel )) - return; // no addon toolbars for preview frame! - - UIElementVector aUIElementVector; - uno::Sequence< uno::Sequence< beans::PropertyValue > > aAddonToolBarData; - uno::Reference< ui::XUIElement > xUIElement; - - sal_uInt32 nCount = m_pAddonOptions->GetAddonsToolBarCount(); - ::rtl::OUString aAddonsToolBarStaticName( m_aFullAddonTbxPrefix ); - ::rtl::OUString aElementType( RTL_CONSTASCII_USTRINGPARAM( "toolbar" )); - - uno::Sequence< beans::PropertyValue > aPropSeq( 2 ); - aPropSeq[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Frame" )); - aPropSeq[0].Value <<= xFrame; - aPropSeq[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ConfigurationData" )); - for ( sal_uInt32 i = 0; i < nCount; i++ ) - { - ::rtl::OUString aAddonToolBarName( aAddonsToolBarStaticName + m_pAddonOptions->GetAddonsToolbarResourceName(i) ); - aAddonToolBarData = m_pAddonOptions->GetAddonsToolBarPart( i ); - aPropSeq[1].Value <<= aAddonToolBarData; - - UIElement aElement = implts_findToolbar( aAddonToolBarName ); - - // #i79828 - // It's now possible that we are called more than once. Be sure to not create - // add-on toolbars more than once! - if ( aElement.m_xUIElement.is() ) - continue; - - try - { - xUIElement = xUIElementFactory->createUIElement( aAddonToolBarName, aPropSeq ); - if ( xUIElement.is() ) - { - uno::Reference< awt::XDockableWindow > xDockWindow( xUIElement->getRealInterface(), uno::UNO_QUERY ); - if ( xDockWindow.is() ) - { - try - { - xDockWindow->addDockableWindowListener( uno::Reference< awt::XDockableWindowListener >( static_cast< OWeakObject * >( this ), uno::UNO_QUERY )); - xDockWindow->enableDocking( sal_True ); - uno::Reference< awt::XWindow > xWindow( xDockWindow, uno::UNO_QUERY ); - if ( xWindow.is() ) - xWindow->addWindowListener( uno::Reference< awt::XWindowListener >( static_cast< OWeakObject * >( this ), uno::UNO_QUERY )); - } - catch (const uno::Exception&) - { - } - } - - ::rtl::OUString aGenericAddonTitle = implts_generateGenericAddonToolbarTitle( i+1 ); - - if ( aElement.m_aName.getLength() > 0 ) - { - // Reuse a local entry so we are able to use the latest - // UI changes for this document. - implts_setElementData( aElement, xDockWindow ); - aElement.m_xUIElement = xUIElement; - if ( aElement.m_aUIName.getLength() == 0 ) - { - aElement.m_aUIName = aGenericAddonTitle; - implts_writeWindowStateData( aElement ); - } - } - else - { - // Create new UI element and try to read its state data - UIElement aNewToolbar( aAddonToolBarName, aElementType, xUIElement ); - aNewToolbar.m_bFloating = true; - implts_readWindowStateData( aAddonToolBarName, aNewToolbar ); - implts_setElementData( aNewToolbar, xDockWindow ); - if ( aNewToolbar.m_aUIName.getLength() == 0 ) - { - aNewToolbar.m_aUIName = aGenericAddonTitle; - implts_writeWindowStateData( aNewToolbar ); - } - implts_insertToolbar( aNewToolbar ); - } - - uno::Reference< awt::XWindow > xWindow( xDockWindow, uno::UNO_QUERY ); - if ( xWindow.is() ) - { - // Set generic title for add-on toolbar - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow->GetText().Len() == 0 ) - pWindow->SetText( aGenericAddonTitle ); - if ( pWindow->GetType() == WINDOW_TOOLBOX ) - { - ToolBox* pToolbar = (ToolBox *)pWindow; - pToolbar->SetMenuType(); - } - } - } - } - catch (const container::NoSuchElementException&) - { - } - catch (const lang::IllegalArgumentException&) - { - } - } -} - -void ToolbarLayoutManager::implts_createCustomToolBars() -{ - ReadGuard aReadLock( m_aLock ); - if ( !m_bComponentAttached ) - return; - - uno::Reference< ui::XUIElementFactory > xUIElementFactory( m_xUIElementFactoryManager ); - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - uno::Reference< frame::XModel > xModel; - uno::Reference< ui::XUIConfigurationManager > xModuleCfgMgr( m_xModuleCfgMgr, uno::UNO_QUERY ); - uno::Reference< ui::XUIConfigurationManager > xDocCfgMgr( m_xDocCfgMgr, uno::UNO_QUERY ); - aReadLock.unlock(); - - if ( xFrame.is() ) - { - xModel = impl_getModelFromFrame( xFrame ); - if ( implts_isPreviewModel( xModel )) - return; // no custom toolbars for preview frame! - - uno::Sequence< uno::Sequence< beans::PropertyValue > > aTbxSeq; - if ( xDocCfgMgr.is() ) - { - aTbxSeq = xDocCfgMgr->getUIElementsInfo( ui::UIElementType::TOOLBAR ); - implts_createCustomToolBars( aTbxSeq ); // first create all document based toolbars - } - if ( xModuleCfgMgr.is() ) - { - aTbxSeq = xModuleCfgMgr->getUIElementsInfo( ui::UIElementType::TOOLBAR ); - implts_createCustomToolBars( aTbxSeq ); // second create module based toolbars - } - } -} - -void ToolbarLayoutManager::implts_createNonContextSensitiveToolBars() -{ - ReadGuard aReadLock( m_aLock ); - - if ( !m_xPersistentWindowState.is() || !m_xFrame.is() || !m_bComponentAttached ) - return; - - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - uno::Reference< ui::XUIElementFactory > xUIElementFactory( m_xUIElementFactoryManager ); - uno::Reference< container::XNameAccess > xPersistentWindowState( m_xPersistentWindowState ); - aReadLock.unlock(); - - if ( implts_isPreviewModel( impl_getModelFromFrame( xFrame ))) - return; - - std::vector< rtl::OUString > aMakeVisibleToolbars; - - try - { - uno::Sequence< ::rtl::OUString > aToolbarNames = xPersistentWindowState->getElementNames(); - - if ( aToolbarNames.getLength() > 0 ) - { - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - ::rtl::OUString aName; - - uno::Reference< ui::XUIElement > xUIElement; - aMakeVisibleToolbars.reserve(aToolbarNames.getLength()); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - const rtl::OUString* pTbNames = aToolbarNames.getConstArray(); - for ( sal_Int32 i = 0; i < aToolbarNames.getLength(); i++ ) - { - aName = pTbNames[i]; - parseResourceURL( aName, aElementType, aElementName ); - - // Check that we only create: - // - Toolbars (the statusbar is also member of the persistent window state) - // - Not custom toolbars, there are created with their own method (implts_createCustomToolbars) - if ( aElementType.equalsIgnoreAsciiCaseAscii( "toolbar" ) && aElementName.indexOf( m_aCustomTbxPrefix ) == -1 ) - { - UIElement aNewToolbar = implts_findToolbar( aName ); - bool bFound = ( aNewToolbar.m_aName == aName ); - if ( !bFound ) - implts_readWindowStateData( aName, aNewToolbar ); - - if ( aNewToolbar.m_bVisible && !aNewToolbar.m_bContextSensitive ) - { - if ( !bFound ) - implts_insertToolbar( aNewToolbar ); - aMakeVisibleToolbars.push_back( aName ); - } - } - } - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - } - } - catch (const uno::RuntimeException&) - { - throw; - } - catch (const uno::Exception&) - { - } - - if ( !aMakeVisibleToolbars.empty() ) - ::std::for_each( aMakeVisibleToolbars.begin(), aMakeVisibleToolbars.end(),::boost::bind( &ToolbarLayoutManager::requestToolbar, this,_1 )); -} - -void ToolbarLayoutManager::implts_createCustomToolBars( const uno::Sequence< uno::Sequence< beans::PropertyValue > >& aTbxSeqSeq ) -{ - const uno::Sequence< beans::PropertyValue >* pTbxSeq = aTbxSeqSeq.getConstArray(); - for ( sal_Int32 i = 0; i < aTbxSeqSeq.getLength(); i++ ) - { - const uno::Sequence< beans::PropertyValue >& rTbxSeq = pTbxSeq[i]; - ::rtl::OUString aTbxResName; - ::rtl::OUString aTbxTitle; - for ( sal_Int32 j = 0; j < rTbxSeq.getLength(); j++ ) - { - if ( rTbxSeq[j].Name.equalsAscii( "ResourceURL" )) - rTbxSeq[j].Value >>= aTbxResName; - else if ( rTbxSeq[j].Name.equalsAscii( "UIName" )) - rTbxSeq[j].Value >>= aTbxTitle; - } - - // Only create custom toolbars. Their name have to start with "custom_"! - if ( aTbxResName.getLength() > 0 && aTbxResName.indexOf( m_aCustomTbxPrefix ) != -1 ) - implts_createCustomToolBar( aTbxResName, aTbxTitle ); - } -} - -void ToolbarLayoutManager::implts_createCustomToolBar( const rtl::OUString& aTbxResName, const rtl::OUString& aTitle ) -{ - if ( aTbxResName.getLength() > 0 ) - { - bool bNotify( false ); - uno::Reference< ui::XUIElement > xUIElement; - implts_createToolBar( aTbxResName, bNotify, xUIElement ); - - if ( aTitle && xUIElement.is() ) - { - SolarMutexGuard aGuard; - - Window* pWindow = getWindowFromXUIElement( xUIElement ); - if ( pWindow ) - pWindow->SetText( aTitle ); - } - } -} - -void ToolbarLayoutManager::implts_reparentToolbars() -{ - WriteGuard aWriteLock( m_aLock ); - UIElementVector aUIElementVector = m_aUIElements; - Window* pContainerWindow = VCLUnoHelper::GetWindow( m_xContainerWindow ); - Window* pTopDockWindow = VCLUnoHelper::GetWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP] ); - Window* pBottomDockWindow = VCLUnoHelper::GetWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_BOTTOM] ); - Window* pLeftDockWindow = VCLUnoHelper::GetWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_LEFT] ); - Window* pRightDockWindow = VCLUnoHelper::GetWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_RIGHT] ); - aWriteLock.unlock(); - - SolarMutexGuard aGuard; - if ( pContainerWindow ) - { - UIElementVector::iterator pIter; - for ( pIter = aUIElementVector.begin(); pIter != aUIElementVector.end(); ++pIter ) - { - uno::Reference< ui::XUIElement > xUIElement( pIter->m_xUIElement ); - if ( xUIElement.is() ) - { - uno::Reference< awt::XWindow > xWindow; - try - { - // We have to retreive the window reference with try/catch as it is - // possible that all elements have been disposed! - xWindow = uno::Reference< awt::XWindow >( xUIElement->getRealInterface(), uno::UNO_QUERY ); - } - catch (const uno::RuntimeException&) - { - throw; - } - catch (const uno::Exception&) - { - } - - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow ) - { - // Reparent our child windows acording to their current state. - if ( pIter->m_bFloating ) - pWindow->SetParent( pContainerWindow ); - else - { - if ( pIter->m_aDockedData.m_nDockedArea == ui::DockingArea_DOCKINGAREA_TOP ) - pWindow->SetParent( pTopDockWindow ); - else if ( pIter->m_aDockedData.m_nDockedArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) - pWindow->SetParent( pBottomDockWindow ); - else if ( pIter->m_aDockedData.m_nDockedArea == ui::DockingArea_DOCKINGAREA_LEFT ) - pWindow->SetParent( pLeftDockWindow ); - else - pWindow->SetParent( pRightDockWindow ); - } - } - } - } - } -} - -void ToolbarLayoutManager::implts_setToolbarCreation( bool bStart ) -{ - WriteGuard aWriteLock( m_aLock ); - m_bToolbarCreation = bStart; -} - -bool ToolbarLayoutManager::implts_isToolbarCreationActive() -{ - ReadGuard aReadLock( m_aLock ); - return m_bToolbarCreation; -} - -void ToolbarLayoutManager::implts_createToolBar( const ::rtl::OUString& aName, bool& bNotify, uno::Reference< ui::XUIElement >& rUIElement ) -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< frame::XFrame > xFrame( m_xFrame ); - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow ); - aReadLock.unlock(); - - bNotify = false; - - if ( !xFrame.is() || !xContainerWindow.is() ) - return; - - UIElement aToolbarElement = implts_findToolbar( aName ); - if ( !aToolbarElement.m_xUIElement.is() ) - { - uno::Reference< ui::XUIElement > xUIElement = implts_createElement( aName ); - - bool bVisible( false ); - bool bFloating( false ); - if ( xUIElement.is() ) - { - rUIElement = xUIElement; - - uno::Reference< awt::XWindow > xWindow( xUIElement->getRealInterface(), uno::UNO_QUERY ); - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - if ( xDockWindow.is() && xWindow.is() ) - { - try - { - xDockWindow->addDockableWindowListener( uno::Reference< awt::XDockableWindowListener >( - static_cast< OWeakObject * >( this ), uno::UNO_QUERY )); - xWindow->addWindowListener( uno::Reference< awt::XWindowListener >( - static_cast< OWeakObject * >( this ), uno::UNO_QUERY )); - xDockWindow->enableDocking( sal_True ); - } - catch (const uno::Exception&) - { - } - } - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - - UIElement& rElement = impl_findToolbar( aName ); - if ( rElement.m_aName.getLength() > 0 ) - { - // Reuse a local entry so we are able to use the latest - // UI changes for this document. - implts_setElementData( rElement, xDockWindow ); - rElement.m_xUIElement = xUIElement; - bVisible = rElement.m_bVisible; - bFloating = rElement.m_bFloating; - } - else - { - // Create new UI element and try to read its state data - UIElement aNewToolbar( aName, m_aToolbarTypeString, xUIElement ); - implts_readWindowStateData( aName, aNewToolbar ); - implts_setElementData( aNewToolbar, xDockWindow ); - implts_insertToolbar( aNewToolbar ); - bVisible = aNewToolbar.m_bVisible; - bFloating = rElement.m_bFloating; - } - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - // set toolbar menu style according to customize command state - SvtCommandOptions aCmdOptions; - - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - { - ToolBox* pToolbar = (ToolBox *)pWindow; - sal_uInt16 nMenuType = pToolbar->GetMenuType(); - if ( aCmdOptions.Lookup( SvtCommandOptions::CMDOPTION_DISABLED, m_aCustomizeCmd )) - pToolbar->SetMenuType( nMenuType & ~TOOLBOX_MENUTYPE_CUSTOMIZE ); - else - pToolbar->SetMenuType( nMenuType | TOOLBOX_MENUTYPE_CUSTOMIZE ); - } - bNotify = true; - - implts_sortUIElements(); - - if ( bVisible && !bFloating ) - implts_setLayoutDirty(); - } - } -} - -uno::Reference< ui::XUIElement > ToolbarLayoutManager::implts_createElement( const ::rtl::OUString& aName ) -{ - uno::Reference< ui::XUIElement > xUIElement; - - ReadGuard aReadLock( m_aLock ); - uno::Sequence< beans::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 <<= true; - uno::Reference< ui::XUIElementFactory > xUIElementFactory( m_xUIElementFactoryManager ); - aReadLock.unlock(); - - implts_setToolbarCreation( true ); - try - { - if ( xUIElementFactory.is() ) - xUIElement = xUIElementFactory->createUIElement( aName, aPropSeq ); - } - catch (const container::NoSuchElementException&) - { - } - catch (const lang::IllegalArgumentException&) - { - } - implts_setToolbarCreation( false ); - - return xUIElement; -} - -void ToolbarLayoutManager::implts_setElementData( UIElement& rElement, const uno::Reference< awt::XDockableWindow >& rDockWindow ) -{ - ReadGuard aReadLock( m_aLock ); - bool bShowElement( rElement.m_bVisible && !rElement.m_bMasterHide && implts_isParentWindowVisible() ); - aReadLock.unlock(); - - uno::Reference< awt::XDockableWindow > xDockWindow( rDockWindow ); - uno::Reference< awt::XWindow2 > xWindow( xDockWindow, uno::UNO_QUERY ); - - Window* pWindow( 0 ); - ToolBox* pToolBox( 0 ); - - if ( xDockWindow.is() && xWindow.is() ) - { - { - SolarMutexGuard aGuard; - pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow ) - { - String aText = pWindow->GetText(); - if ( aText.Len() == 0 ) - pWindow->SetText( rElement.m_aUIName ); - if ( rElement.m_bNoClose ) - pWindow->SetStyle( pWindow->GetStyle() & ~WB_CLOSEABLE ); - if ( pWindow->GetType() == WINDOW_TOOLBOX ) - pToolBox = (ToolBox *)pWindow; - } - if ( pToolBox ) - { - if (( rElement.m_nStyle < 0 ) || ( rElement.m_nStyle > BUTTON_SYMBOLTEXT )) - rElement.m_nStyle = BUTTON_SYMBOL; - pToolBox->SetButtonType( (ButtonType)rElement.m_nStyle ); - if ( rElement.m_bNoClose ) - pToolBox->SetFloatStyle( pToolBox->GetFloatStyle() & ~WB_CLOSEABLE ); - } - } - - if ( rElement.m_bFloating ) - { - if ( pWindow ) - { - SolarMutexGuard aGuard; - String aText = pWindow->GetText(); - if ( aText.Len() == 0 ) - pWindow->SetText( rElement.m_aUIName ); - } - - awt::Point aPos(rElement.m_aFloatingData.m_aPos); - bool bWriteData( false ); - bool bUndefPos = hasDefaultPosValue( rElement.m_aFloatingData.m_aPos ); - bool bSetSize = ( rElement.m_aFloatingData.m_aSize.Width != 0 && - rElement.m_aFloatingData.m_aSize.Height != 0 ); - xDockWindow->setFloatingMode( sal_True ); - if ( bUndefPos ) - { - aPos = implts_findNextCascadeFloatingPos(); - rElement.m_aFloatingData.m_aPos = aPos; // set new cascaded position - bWriteData = true; - } - - if( bSetSize ) - xWindow->setOutputSize(rElement.m_aFloatingData.m_aSize); - else - { - if( pToolBox ) - { - // set an optimal initial floating size - SolarMutexGuard aGuard; - ::Size aSize( pToolBox->CalcFloatingWindowSizePixel() ); - pToolBox->SetOutputSizePixel( aSize ); - } - } - - // #i60882# IMPORTANT: Set position after size as it is - // possible that we position some part of the toolbar - // outside of the desktop. A default constructed toolbar - // always has one line. Now VCL automatically - // position the toolbar back into the desktop. Therefore - // we resize the toolbar with the new (wrong) position. - // To fix this problem we have to set the size BEFORE the - // position. - xWindow->setPosSize( aPos.X, aPos.Y, 0, 0, awt::PosSize::POS ); - - if ( bWriteData ) - implts_writeWindowStateData( rElement ); - if ( bShowElement && pWindow ) - { - SolarMutexGuard aGuard; - pWindow->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); - } - } - else - { - bool bSetSize( false ); - awt::Point aDockPos; - ::Point aPixelPos; - ::Size aSize; - - if ( pToolBox ) - { - SolarMutexGuard aGuard; - pToolBox->SetAlign( ImplConvertAlignment(rElement.m_aDockedData.m_nDockedArea ) ); - pToolBox->SetLineCount( 1 ); - xDockWindow->setFloatingMode( sal_False ); - if ( rElement.m_aDockedData.m_bLocked ) - xDockWindow->lock(); - aSize = pToolBox->CalcWindowSizePixel(); - bSetSize = true; - - if ( isDefaultPos( rElement.m_aDockedData.m_aPos )) - { - implts_findNextDockingPos( (ui::DockingArea)rElement.m_aDockedData.m_nDockedArea, aSize, aDockPos, aPixelPos ); - rElement.m_aDockedData.m_aPos = aDockPos; - } - } - - xWindow->setPosSize( aPixelPos.X(), aPixelPos.Y(), 0, 0, awt::PosSize::POS ); - if( bSetSize ) - xWindow->setOutputSize( AWTSize( aSize) ); - - if ( pWindow ) - { - SolarMutexGuard aGuard; - if ( !bShowElement ) - pWindow->Hide(); - } - } - } -} - -void ToolbarLayoutManager::implts_destroyDockingAreaWindows() -{ - WriteGuard aWriteLock( m_aLock ); - uno::Reference< awt::XWindow > xTopDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP] ); - uno::Reference< awt::XWindow > xLeftDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_LEFT] ); - uno::Reference< awt::XWindow > xRightDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_RIGHT] ); - uno::Reference< awt::XWindow > xBottomDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_BOTTOM] ); - m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP].clear(); - m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_LEFT].clear(); - m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_RIGHT].clear(); - m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_BOTTOM].clear(); - aWriteLock.unlock(); - - // destroy windows - xTopDockingWindow->dispose(); - xLeftDockingWindow->dispose(); - xRightDockingWindow->dispose(); - xBottomDockingWindow->dispose(); -} - -//--------------------------------------------------------------------------------------------------------- -// persistence methods -//--------------------------------------------------------------------------------------------------------- - -sal_Bool ToolbarLayoutManager::implts_readWindowStateData( const rtl::OUString& aName, UIElement& rElementData ) -{ - WriteGuard aWriteLock( m_aLock ); - uno::Reference< container::XNameAccess > xPersistentWindowState( m_xPersistentWindowState ); - bool bGetSettingsState( false ); - aWriteLock.unlock(); - - if ( xPersistentWindowState.is() ) - { - aWriteLock.lock(); - bool bGlobalSettings( m_bGlobalSettings ); - GlobalSettings* pGlobalSettings( 0 ); - if ( m_pGlobalSettings == 0 ) - { - m_pGlobalSettings = new GlobalSettings( m_xSMGR ); - bGetSettingsState = true; - } - pGlobalSettings = m_pGlobalSettings; - aWriteLock.unlock(); - - try - { - uno::Sequence< beans::PropertyValue > aWindowState; - if ( xPersistentWindowState->getByName( aName ) >>= aWindowState ) - { - sal_Bool bValue( sal_False ); - for ( sal_Int32 n = 0; n < aWindowState.getLength(); n++ ) - { - if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_DOCKED )) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bFloating = !bValue; - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_VISIBLE )) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bVisible = bValue; - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_DOCKINGAREA )) - { - ui::DockingArea eDockingArea; - if ( aWindowState[n].Value >>= eDockingArea ) - rElementData.m_aDockedData.m_nDockedArea = sal_Int16( eDockingArea ); - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_DOCKPOS )) - { - awt::Point aPoint; - if ( aWindowState[n].Value >>= aPoint ) - rElementData.m_aDockedData.m_aPos = aPoint; - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_POS )) - { - awt::Point aPoint; - if ( aWindowState[n].Value >>= aPoint ) - rElementData.m_aFloatingData.m_aPos = aPoint; - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_SIZE )) - { - awt::Size aSize; - if ( aWindowState[n].Value >>= aSize ) - rElementData.m_aFloatingData.m_aSize = aSize; - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_UINAME )) - aWindowState[n].Value >>= rElementData.m_aUIName; - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_STYLE )) - { - sal_Int32 nStyle = 0; - if ( aWindowState[n].Value >>= nStyle ) - rElementData.m_nStyle = sal_Int16( nStyle ); - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_LOCKED )) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_aDockedData.m_bLocked = bValue; - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_CONTEXT )) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bContextSensitive = bValue; - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_NOCLOSE )) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bNoClose = bValue; - } - else if ( aWindowState[n].Name.equalsAscii( WINDOWSTATE_PROPERTY_CONTEXTACTIVE )) - { - if ( aWindowState[n].Value >>= bValue ) - rElementData.m_bContextActive = bValue; - } - else if ( aWindowState[n].Name.equalsAscii( 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 = 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 container::NoSuchElementException&) - { - } - } - - return sal_False; -} - -void ToolbarLayoutManager::implts_writeWindowStateData( const UIElement& rElementData ) -{ - WriteGuard aWriteLock( m_aLock ); - uno::Reference< container::XNameAccess > xPersistentWindowState( m_xPersistentWindowState ); - m_bStoreWindowState = true; // set flag to determine that we triggered the notification - aWriteLock.unlock(); - - bool bPersistent( sal_False ); - uno::Reference< beans::XPropertySet > xPropSet( rElementData.m_xUIElement, uno::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&) - { - bPersistent = true; // Non-configurable elements should at least store their dimension/position - } - catch (const lang::WrappedTargetException&) - { - } - } - - if ( bPersistent && xPersistentWindowState.is() ) - { - try - { - uno::Sequence< beans::PropertyValue > aWindowState( 8 ); - - aWindowState[0].Name = ::rtl::OUString::createFromAscii( WINDOWSTATE_PROPERTY_DOCKED ); - aWindowState[0].Value = ::uno::makeAny( sal_Bool( !rElementData.m_bFloating )); - aWindowState[1].Name = ::rtl::OUString::createFromAscii( WINDOWSTATE_PROPERTY_VISIBLE ); - aWindowState[1].Value = uno::makeAny( sal_Bool( rElementData.m_bVisible )); - aWindowState[2].Name = ::rtl::OUString::createFromAscii( WINDOWSTATE_PROPERTY_DOCKINGAREA ); - aWindowState[2].Value = uno::makeAny( static_cast< ui::DockingArea >( rElementData.m_aDockedData.m_nDockedArea ) ); - - awt::Point aPos = rElementData.m_aDockedData.m_aPos; - aWindowState[3].Name = ::rtl::OUString::createFromAscii( WINDOWSTATE_PROPERTY_DOCKPOS ); - aWindowState[3].Value <<= aPos; - - aPos = rElementData.m_aFloatingData.m_aPos; - aWindowState[4].Name = ::rtl::OUString::createFromAscii( WINDOWSTATE_PROPERTY_POS ); - aWindowState[4].Value <<= aPos; - - aWindowState[5].Name = ::rtl::OUString::createFromAscii( WINDOWSTATE_PROPERTY_SIZE ); - aWindowState[5].Value <<= rElementData.m_aFloatingData.m_aSize; - aWindowState[6].Name = ::rtl::OUString::createFromAscii( WINDOWSTATE_PROPERTY_UINAME ); - aWindowState[6].Value = uno::makeAny( rElementData.m_aUIName ); - aWindowState[7].Name = ::rtl::OUString::createFromAscii( WINDOWSTATE_PROPERTY_LOCKED ); - aWindowState[7].Value = uno::makeAny( rElementData.m_aDockedData.m_bLocked ); - - ::rtl::OUString aName = rElementData.m_aName; - if ( xPersistentWindowState->hasByName( aName )) - { - uno::Reference< container::XNameReplace > xReplace( xPersistentWindowState, uno::UNO_QUERY ); - xReplace->replaceByName( aName, uno::makeAny( aWindowState )); - } - else - { - uno::Reference< container::XNameContainer > xInsert( xPersistentWindowState, uno::UNO_QUERY ); - xInsert->insertByName( aName, uno::makeAny( aWindowState )); - } - } - catch (const uno::Exception&) - { - } - } - - // Reset flag - aWriteLock.lock(); - m_bStoreWindowState = false; - aWriteLock.unlock(); -} - -void ToolbarLayoutManager::implts_writeNewWindowStateData( const rtl::OUString aName, const uno::Reference< awt::XWindow >& xWindow ) -{ - bool bVisible( false ); - bool bFloating( true ); - awt::Rectangle aPos; - awt::Size aSize; - - if ( xWindow.is() ) - { - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - if ( xDockWindow.is() ) - bFloating = xDockWindow->isFloating(); - - uno::Reference< awt::XWindow2 > xWindow2( xWindow, uno::UNO_QUERY ); - if( xWindow2.is() ) - { - aPos = xWindow2->getPosSize(); - aSize = xWindow2->getOutputSize(); // always use output size for consistency - bVisible = xWindow2->isVisible(); - } - - WriteGuard aWriteLock( m_aLock ); - UIElement& rUIElement = impl_findToolbar( aName ); - if ( rUIElement.m_xUIElement.is() ) - { - rUIElement.m_bVisible = bVisible; - rUIElement.m_bFloating = bFloating; - if ( bFloating ) - { - rUIElement.m_aFloatingData.m_aPos = awt::Point(aPos.X, aPos.Y); - rUIElement.m_aFloatingData.m_aSize = aSize; - } - } - implts_writeWindowStateData( rUIElement ); - aWriteLock.unlock(); - } -} - -/****************************************************************************** - LOOKUP PART FOR TOOLBARS -******************************************************************************/ - -UIElement& ToolbarLayoutManager::impl_findToolbar( const rtl::OUString& aName ) -{ - static UIElement aEmptyElement; - UIElementVector::iterator pIter; - - ReadGuard aReadLock( m_aLock ); - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_aName == aName ) - return *pIter; - } - - return aEmptyElement; -} - -UIElement ToolbarLayoutManager::implts_findToolbar( const rtl::OUString& aName ) -{ - ReadGuard aReadLock( m_aLock ); - UIElement aElement = impl_findToolbar( aName ); - aReadLock.unlock(); - - return aElement; -} - -UIElement ToolbarLayoutManager::implts_findToolbar( const uno::Reference< uno::XInterface >& xToolbar ) -{ - UIElement aToolbar; - UIElementVector::const_iterator pIter; - - ReadGuard aReadLock( m_aLock ); - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_xUIElement.is() ) - { - uno::Reference< uno::XInterface > xIfac( pIter->m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - if ( xIfac == xToolbar ) - { - aToolbar = *pIter; - break; - } - } - } - - return aToolbar; -} - -uno::Reference< awt::XWindow > ToolbarLayoutManager::implts_getXWindow( const ::rtl::OUString& aName ) -{ - UIElementVector::iterator pIter; - uno::Reference< awt::XWindow > xWindow; - - ReadGuard aReadLock( m_aLock ); - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_aName == aName && pIter->m_xUIElement.is() ) - { - xWindow = uno::Reference< awt::XWindow >( pIter->m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - break; - } - } - - return xWindow; -} - -Window* ToolbarLayoutManager::implts_getWindow( const ::rtl::OUString& aName ) -{ - uno::Reference< awt::XWindow > xWindow = implts_getXWindow( aName ); - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - - return pWindow; -} - -bool ToolbarLayoutManager::implts_insertToolbar( const UIElement& rUIElement ) -{ - UIElement aTempData; - bool bFound( false ); - bool bResult( false ); - - aTempData = implts_findToolbar( rUIElement.m_aName ); - if ( aTempData.m_aName == rUIElement.m_aName ) - bFound = true; - - if ( !bFound ) - { - WriteGuard aWriteLock( m_aLock ); - m_aUIElements.push_back( rUIElement ); - bResult = true; - } - - return bResult; -} - -void ToolbarLayoutManager::implts_setToolbar( const UIElement& rUIElement ) -{ - WriteGuard aWriteLock( m_aLock ); - UIElement& rData = impl_findToolbar( rUIElement.m_aName ); - if ( rData.m_aName == rUIElement.m_aName ) - rData = rUIElement; - else - m_aUIElements.push_back( rUIElement ); -} - -/****************************************************************************** - LAYOUT CODE PART FOR TOOLBARS -******************************************************************************/ - -awt::Point ToolbarLayoutManager::implts_findNextCascadeFloatingPos() -{ - const sal_Int32 nHotZoneX = 50; - const sal_Int32 nHotZoneY = 50; - const sal_Int32 nCascadeIndentX = 15; - const sal_Int32 nCascadeIndentY = 15; - - ReadGuard aReadLock( m_aLock ); - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow ); - uno::Reference< awt::XWindow > xTopDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP] ); - uno::Reference< awt::XWindow > xLeftDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_LEFT] ); - aReadLock.unlock(); - - awt::Point aStartPos( nCascadeIndentX, nCascadeIndentY ); - awt::Point aCurrPos( aStartPos ); - awt::Rectangle aRect; - - Window* pContainerWindow( 0 ); - if ( xContainerWindow.is() ) - { - SolarMutexGuard aGuard; - pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow ); - if ( pContainerWindow ) - aStartPos = AWTPoint(pContainerWindow->OutputToScreenPixel(VCLPoint(aStartPos))); - } - - // Determine size of top and left docking area - awt::Rectangle aTopRect( xTopDockingWindow->getPosSize() ); - awt::Rectangle aLeftRect( xLeftDockingWindow->getPosSize() ); - - aStartPos.X += aLeftRect.Width + nCascadeIndentX; - aStartPos.Y += aTopRect.Height + nCascadeIndentY; - aCurrPos = aStartPos; - - // Try to find a cascaded position for the new floating window - UIElementVector::const_iterator pIter; - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_xUIElement.is() ) - { - uno::Reference< awt::XDockableWindow > xDockWindow( pIter->m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - uno::Reference< awt::XWindow > xWindow( xDockWindow, uno::UNO_QUERY ); - if ( xDockWindow.is() && xDockWindow->isFloating() ) - { - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->IsVisible() ) - { - awt::Rectangle aFloatRect = xWindow->getPosSize(); - if ((( aFloatRect.X - nHotZoneX ) <= aCurrPos.X ) && - ( aFloatRect.X >= aCurrPos.X ) && - (( aFloatRect.Y - nHotZoneY ) <= aCurrPos.Y ) && - ( aFloatRect.Y >= aCurrPos.Y )) - { - aCurrPos.X = aFloatRect.X + nCascadeIndentX; - aCurrPos.Y = aFloatRect.Y + nCascadeIndentY; - } - } - } - } - } - - return aCurrPos; -} - -void ToolbarLayoutManager::implts_sortUIElements() -{ - WriteGuard aWriteLock( m_aLock ); - UIElementVector::iterator pIterStart = m_aUIElements.begin(); - UIElementVector::iterator pIterEnd = m_aUIElements.end(); - - std::stable_sort( pIterStart, pIterEnd ); // first created element should first - - // We have to reset our temporary flags. - UIElementVector::iterator pIter; - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - pIter->m_bUserActive = sal_False; - aWriteLock.unlock(); -} - -void ToolbarLayoutManager::implts_getUIElementVectorCopy( UIElementVector& rCopy ) -{ - ReadGuard aReadLock( m_aLock ); - rCopy = m_aUIElements; -} - -::Size ToolbarLayoutManager::implts_getTopBottomDockingAreaSizes() -{ - ::Size aSize; - uno::Reference< awt::XWindow > xTopDockingAreaWindow; - uno::Reference< awt::XWindow > xBottomDockingAreaWindow; - - ReadGuard aReadLock( m_aLock ); - xTopDockingAreaWindow = m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP]; - xBottomDockingAreaWindow = m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_BOTTOM]; - aReadLock.unlock(); - - if ( xTopDockingAreaWindow.is() ) - aSize.Width() = xTopDockingAreaWindow->getPosSize().Height; - if ( xBottomDockingAreaWindow.is() ) - aSize.Height() = xBottomDockingAreaWindow->getPosSize().Height; - - return aSize; -} - -void ToolbarLayoutManager::implts_getDockingAreaElementInfos( ui::DockingArea eDockingArea, std::vector< SingleRowColumnWindowData >& rRowColumnsWindowData ) -{ - std::vector< UIElement > aWindowVector; - - if (( eDockingArea < ui::DockingArea_DOCKINGAREA_TOP ) || ( eDockingArea > ui::DockingArea_DOCKINGAREA_RIGHT )) - eDockingArea = ui::DockingArea_DOCKINGAREA_TOP; - - uno::Reference< awt::XWindow > xDockAreaWindow; - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - aWindowVector.reserve(m_aUIElements.size()); - xDockAreaWindow = m_xDockAreaWindows[eDockingArea]; - UIElementVector::iterator pIter; - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_aDockedData.m_nDockedArea == eDockingArea && pIter->m_bVisible && !pIter->m_bFloating ) - { - uno::Reference< ui::XUIElement > xUIElement( pIter->m_xUIElement ); - if ( xUIElement.is() ) - { - uno::Reference< awt::XWindow > xWindow( xUIElement->getRealInterface(), uno::UNO_QUERY ); - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - if ( xDockWindow.is() ) - { - // docked windows - aWindowVector.push_back( *pIter ); - } - } - } - } - aReadLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - rRowColumnsWindowData.clear(); - - // Collect data from windows that are on the same row/column - sal_Int32 j; - sal_Int32 nIndex( 0 ); - sal_Int32 nLastPos( 0 ); - sal_Int32 nCurrPos( -1 ); - sal_Int32 nLastRowColPixelPos( 0 ); - awt::Rectangle aDockAreaRect; - - if ( xDockAreaWindow.is() ) - aDockAreaRect = xDockAreaWindow->getPosSize(); - - if ( eDockingArea == ui::DockingArea_DOCKINGAREA_TOP ) - nLastRowColPixelPos = 0; - else if ( eDockingArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) - nLastRowColPixelPos = aDockAreaRect.Height; - else if ( eDockingArea == ui::DockingArea_DOCKINGAREA_LEFT ) - nLastRowColPixelPos = 0; - else - nLastRowColPixelPos = aDockAreaRect.Width; - - const sal_uInt32 nCount = aWindowVector.size(); - for ( j = 0; j < sal_Int32( nCount); j++ ) - { - const UIElement& rElement = aWindowVector[j]; - uno::Reference< awt::XWindow > xWindow; - uno::Reference< ui::XUIElement > xUIElement( rElement.m_xUIElement ); - awt::Rectangle aPosSize; - - if ( !lcl_checkUIElement(xUIElement,aPosSize,xWindow) ) - continue; - if ( isHorizontalDockingArea( eDockingArea )) - { - if ( nCurrPos == -1 ) - { - nCurrPos = rElement.m_aDockedData.m_aPos.Y; - nLastPos = 0; - - SingleRowColumnWindowData aRowColumnWindowData; - aRowColumnWindowData.nRowColumn = nCurrPos; - rRowColumnsWindowData.push_back( aRowColumnWindowData ); - } - - sal_Int32 nSpace( 0 ); - if ( rElement.m_aDockedData.m_aPos.Y != nCurrPos ) - { - if ( eDockingArea == ui::DockingArea_DOCKINGAREA_TOP ) - nLastRowColPixelPos += rRowColumnsWindowData[nIndex].nStaticSize; - else - nLastRowColPixelPos -= rRowColumnsWindowData[nIndex].nStaticSize; - ++nIndex; - nLastPos = 0; - nCurrPos = rElement.m_aDockedData.m_aPos.Y; - SingleRowColumnWindowData aRowColumnWindowData; - aRowColumnWindowData.nRowColumn = nCurrPos; - rRowColumnsWindowData.push_back( aRowColumnWindowData ); - } - - // Calc space before an element and store it - nSpace = ( rElement.m_aDockedData.m_aPos.X - nLastPos ); - if ( rElement.m_aDockedData.m_aPos.X >= nLastPos ) - { - rRowColumnsWindowData[nIndex].nSpace += nSpace; - nLastPos = rElement.m_aDockedData.m_aPos.X + aPosSize.Width; - } - else - { - nSpace = 0; - nLastPos += aPosSize.Width; - } - rRowColumnsWindowData[nIndex].aRowColumnSpace.push_back( nSpace ); - - rRowColumnsWindowData[nIndex].aRowColumnWindows.push_back( xWindow ); - rRowColumnsWindowData[nIndex].aUIElementNames.push_back( rElement.m_aName ); - rRowColumnsWindowData[nIndex].aRowColumnWindowSizes.push_back( - awt::Rectangle( rElement.m_aDockedData.m_aPos.X, - rElement.m_aDockedData.m_aPos.Y, - aPosSize.Width, - aPosSize.Height )); - if ( rRowColumnsWindowData[nIndex].nStaticSize < aPosSize.Height ) - rRowColumnsWindowData[nIndex].nStaticSize = aPosSize.Height; - if ( eDockingArea == ui::DockingArea_DOCKINGAREA_TOP ) - rRowColumnsWindowData[nIndex].aRowColumnRect = awt::Rectangle( 0, nLastRowColPixelPos, - aDockAreaRect.Width, aPosSize.Height ); - else - rRowColumnsWindowData[nIndex].aRowColumnRect = awt::Rectangle( 0, ( nLastRowColPixelPos - aPosSize.Height ), - aDockAreaRect.Width, aPosSize.Height ); - rRowColumnsWindowData[nIndex].nVarSize += aPosSize.Width + nSpace; - } - else - { - if ( nCurrPos == -1 ) - { - nCurrPos = rElement.m_aDockedData.m_aPos.X; - nLastPos = 0; - - SingleRowColumnWindowData aRowColumnWindowData; - aRowColumnWindowData.nRowColumn = nCurrPos; - rRowColumnsWindowData.push_back( aRowColumnWindowData ); - } - - sal_Int32 nSpace( 0 ); - if ( rElement.m_aDockedData.m_aPos.X != nCurrPos ) - { - if ( eDockingArea == ui::DockingArea_DOCKINGAREA_LEFT ) - nLastRowColPixelPos += rRowColumnsWindowData[nIndex].nStaticSize; - else - nLastRowColPixelPos -= rRowColumnsWindowData[nIndex].nStaticSize; - ++nIndex; - nLastPos = 0; - nCurrPos = rElement.m_aDockedData.m_aPos.X; - SingleRowColumnWindowData aRowColumnWindowData; - aRowColumnWindowData.nRowColumn = nCurrPos; - rRowColumnsWindowData.push_back( aRowColumnWindowData ); - } - - // Calc space before an element and store it - nSpace = ( rElement.m_aDockedData.m_aPos.Y - nLastPos ); - if ( rElement.m_aDockedData.m_aPos.Y > nLastPos ) - { - rRowColumnsWindowData[nIndex].nSpace += nSpace; - nLastPos = rElement.m_aDockedData.m_aPos.Y + aPosSize.Height; - } - else - { - nSpace = 0; - nLastPos += aPosSize.Height; - } - rRowColumnsWindowData[nIndex].aRowColumnSpace.push_back( nSpace ); - - rRowColumnsWindowData[nIndex].aRowColumnWindows.push_back( xWindow ); - rRowColumnsWindowData[nIndex].aUIElementNames.push_back( rElement.m_aName ); - rRowColumnsWindowData[nIndex].aRowColumnWindowSizes.push_back( - awt::Rectangle( rElement.m_aDockedData.m_aPos.X, - rElement.m_aDockedData.m_aPos.Y, - aPosSize.Width, - aPosSize.Height )); - if ( rRowColumnsWindowData[nIndex].nStaticSize < aPosSize.Width ) - rRowColumnsWindowData[nIndex].nStaticSize = aPosSize.Width; - if ( eDockingArea == ui::DockingArea_DOCKINGAREA_LEFT ) - rRowColumnsWindowData[nIndex].aRowColumnRect = awt::Rectangle( nLastRowColPixelPos, 0, - aPosSize.Width, aDockAreaRect.Height ); - else - rRowColumnsWindowData[nIndex].aRowColumnRect = awt::Rectangle( ( nLastRowColPixelPos - aPosSize.Width ), 0, - aPosSize.Width, aDockAreaRect.Height ); - rRowColumnsWindowData[nIndex].nVarSize += aPosSize.Height + nSpace; - } - } -} - -void ToolbarLayoutManager::implts_getDockingAreaElementInfoOnSingleRowCol( ui::DockingArea eDockingArea, sal_Int32 nRowCol, SingleRowColumnWindowData& rRowColumnWindowData ) -{ - std::vector< UIElement > aWindowVector; - - if (( eDockingArea < ui::DockingArea_DOCKINGAREA_TOP ) || ( eDockingArea > ui::DockingArea_DOCKINGAREA_RIGHT )) - eDockingArea = ui::DockingArea_DOCKINGAREA_TOP; - - bool bHorzDockArea = isHorizontalDockingArea( eDockingArea ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - ReadGuard aReadLock( m_aLock ); - UIElementVector::iterator pIter; - UIElementVector::iterator pEnd = m_aUIElements.end(); - for ( pIter = m_aUIElements.begin(); pIter != pEnd; ++pIter ) - { - if ( pIter->m_aDockedData.m_nDockedArea == eDockingArea ) - { - bool bSameRowCol = bHorzDockArea ? ( pIter->m_aDockedData.m_aPos.Y == nRowCol ) : ( pIter->m_aDockedData.m_aPos.X == nRowCol ); - uno::Reference< ui::XUIElement > xUIElement( pIter->m_xUIElement ); - - if ( bSameRowCol && xUIElement.is() ) - { - uno::Reference< awt::XWindow > xWindow( xUIElement->getRealInterface(), uno::UNO_QUERY ); - if ( xWindow.is() ) - { - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - if ( pWindow && pIter->m_bVisible && xDockWindow.is() && !pIter->m_bFloating ) - aWindowVector.push_back( *pIter ); // docked windows - } - } - } - } - aReadLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - // Initialize structure - rRowColumnWindowData.aUIElementNames.clear(); - rRowColumnWindowData.aRowColumnWindows.clear(); - rRowColumnWindowData.aRowColumnWindowSizes.clear(); - rRowColumnWindowData.aRowColumnSpace.clear(); - rRowColumnWindowData.nVarSize = 0; - rRowColumnWindowData.nStaticSize = 0; - rRowColumnWindowData.nSpace = 0; - rRowColumnWindowData.nRowColumn = nRowCol; - - // Collect data from windows that are on the same row/column - sal_Int32 j; - sal_Int32 nLastPos( 0 ); - - const sal_uInt32 nCount = aWindowVector.size(); - for ( j = 0; j < sal_Int32( nCount); j++ ) - { - const UIElement& rElement = aWindowVector[j]; - uno::Reference< awt::XWindow > xWindow; - uno::Reference< ui::XUIElement > xUIElement( rElement.m_xUIElement ); - awt::Rectangle aPosSize; - if ( !lcl_checkUIElement(xUIElement,aPosSize,xWindow) ) - continue; - - sal_Int32 nSpace; - if ( isHorizontalDockingArea( eDockingArea )) - { - nSpace = ( rElement.m_aDockedData.m_aPos.X - nLastPos ); - - // Calc space before an element and store it - if ( rElement.m_aDockedData.m_aPos.X > nLastPos ) - rRowColumnWindowData.nSpace += nSpace; - else - nSpace = 0; - - nLastPos = rElement.m_aDockedData.m_aPos.X + aPosSize.Width; - - - rRowColumnWindowData.aRowColumnWindowSizes.push_back( - awt::Rectangle( rElement.m_aDockedData.m_aPos.X, rElement.m_aDockedData.m_aPos.Y, - aPosSize.Width, aPosSize.Height )); - if ( rRowColumnWindowData.nStaticSize < aPosSize.Height ) - rRowColumnWindowData.nStaticSize = aPosSize.Height; - rRowColumnWindowData.nVarSize += aPosSize.Width; - } - else - { - // Calc space before an element and store it - nSpace = ( rElement.m_aDockedData.m_aPos.Y - nLastPos ); - if ( rElement.m_aDockedData.m_aPos.Y > nLastPos ) - rRowColumnWindowData.nSpace += nSpace; - else - nSpace = 0; - - nLastPos = rElement.m_aDockedData.m_aPos.Y + aPosSize.Height; - - rRowColumnWindowData.aRowColumnWindowSizes.push_back( - awt::Rectangle( rElement.m_aDockedData.m_aPos.X, rElement.m_aDockedData.m_aPos.Y, - aPosSize.Width, aPosSize.Height )); - if ( rRowColumnWindowData.nStaticSize < aPosSize.Width ) - rRowColumnWindowData.nStaticSize = aPosSize.Width; - rRowColumnWindowData.nVarSize += aPosSize.Height; - } - - rRowColumnWindowData.aUIElementNames.push_back( rElement.m_aName ); - rRowColumnWindowData.aRowColumnWindows.push_back( xWindow ); - rRowColumnWindowData.aRowColumnSpace.push_back( nSpace ); - rRowColumnWindowData.nVarSize += nSpace; - } -} - -::Rectangle ToolbarLayoutManager::implts_getWindowRectFromRowColumn( - ui::DockingArea DockingArea, - const SingleRowColumnWindowData& rRowColumnWindowData, - const ::Point& rMousePos, - const rtl::OUString& rExcludeElementName ) -{ - ::Rectangle aWinRect; - - if (( DockingArea < ui::DockingArea_DOCKINGAREA_TOP ) || ( DockingArea > ui::DockingArea_DOCKINGAREA_RIGHT )) - DockingArea = ui::DockingArea_DOCKINGAREA_TOP; - - if ( rRowColumnWindowData.aRowColumnWindows.empty() ) - return aWinRect; - else - { - ReadGuard aReadLock( m_aLock ); - Window* pContainerWindow( VCLUnoHelper::GetWindow( m_xContainerWindow )); - Window* pDockingAreaWindow( VCLUnoHelper::GetWindow( m_xDockAreaWindows[DockingArea] )); - aReadLock.unlock(); - - // Calc correct position of the column/row rectangle to be able to compare it with mouse pos/tracking rect - SolarMutexGuard aGuard; - - // Retrieve output size from container Window - if ( pDockingAreaWindow && pContainerWindow ) - { - const sal_uInt32 nCount = rRowColumnWindowData.aRowColumnWindows.size(); - for ( sal_uInt32 i = 0; i < nCount; i++ ) - { - awt::Rectangle aWindowRect = rRowColumnWindowData.aRowColumnWindows[i]->getPosSize(); - ::Rectangle aRect( aWindowRect.X, aWindowRect.Y, aWindowRect.X+aWindowRect.Width, aWindowRect.Y+aWindowRect.Height ); - aRect.SetPos( pContainerWindow->ScreenToOutputPixel( pDockingAreaWindow->OutputToScreenPixel( aRect.TopLeft() ))); - if ( aRect.IsInside( rMousePos )) - { - // Check if we have found the excluded element. If yes, we have to provide an empty rectangle. - // We prevent that a toolbar cannot be moved when the mouse pointer is inside its own rectangle! - if ( rExcludeElementName != rRowColumnWindowData.aUIElementNames[i] ) - return aRect; - else - break; - } - } - } - } - - return aWinRect; -} - -::Rectangle ToolbarLayoutManager::implts_determineFrontDockingRect( - ui::DockingArea eDockingArea, - sal_Int32 nRowCol, - const ::Rectangle& rDockedElementRect, - const ::rtl::OUString& rMovedElementName, - const ::Rectangle& rMovedElementRect ) -{ - SingleRowColumnWindowData aRowColumnWindowData; - - sal_Bool bHorzDockArea( isHorizontalDockingArea( eDockingArea )); - implts_getDockingAreaElementInfoOnSingleRowCol( eDockingArea, nRowCol, aRowColumnWindowData ); - if ( aRowColumnWindowData.aRowColumnWindows.empty() ) - return rMovedElementRect; - else - { - sal_Int32 nSpace( 0 ); - ::Rectangle aFrontDockingRect( rMovedElementRect ); - const sal_uInt32 nCount = aRowColumnWindowData.aRowColumnWindows.size(); - for ( sal_uInt32 i = 0; i < nCount; i++ ) - { - if ( bHorzDockArea ) - { - if ( aRowColumnWindowData.aRowColumnWindowSizes[i].X >= rDockedElementRect.Left() ) - { - nSpace += aRowColumnWindowData.aRowColumnSpace[i]; - break; - } - else if ( aRowColumnWindowData.aUIElementNames[i] == rMovedElementName ) - nSpace += aRowColumnWindowData.aRowColumnWindowSizes[i].Width + - aRowColumnWindowData.aRowColumnSpace[i]; - else - nSpace = 0; - } - else - { - if ( aRowColumnWindowData.aRowColumnWindowSizes[i].Y >= rDockedElementRect.Top() ) - { - nSpace += aRowColumnWindowData.aRowColumnSpace[i]; - break; - } - else if ( aRowColumnWindowData.aUIElementNames[i] == rMovedElementName ) - nSpace += aRowColumnWindowData.aRowColumnWindowSizes[i].Height + - aRowColumnWindowData.aRowColumnSpace[i]; - else - nSpace = 0; - } - } - - if ( nSpace > 0 ) - { - sal_Int32 nMove = std::min( nSpace, static_cast<sal_Int32>(aFrontDockingRect.getWidth()) ); - if ( bHorzDockArea ) - aFrontDockingRect.Move( -nMove, 0 ); - else - aFrontDockingRect.Move( 0, -nMove ); - } - - return aFrontDockingRect; - } -} - -void ToolbarLayoutManager::implts_findNextDockingPos( ui::DockingArea DockingArea, const ::Size& aUIElementSize, awt::Point& rVirtualPos, ::Point& rPixelPos ) -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< awt::XWindow > xDockingWindow( m_xDockAreaWindows[DockingArea] ); - ::Size aDockingWinSize; - Window* pDockingWindow( 0 ); - aReadLock.unlock(); - - if (( DockingArea < ui::DockingArea_DOCKINGAREA_TOP ) || ( DockingArea > ui::DockingArea_DOCKINGAREA_RIGHT )) - DockingArea = ui::DockingArea_DOCKINGAREA_TOP; - - { - // Retrieve output size from container Window - SolarMutexGuard aGuard; - pDockingWindow = VCLUnoHelper::GetWindow( xDockingWindow ); - if ( pDockingWindow ) - aDockingWinSize = pDockingWindow->GetOutputSizePixel(); - } - - sal_Int32 nFreeRowColPixelPos( 0 ); - sal_Int32 nMaxSpace( 0 ); - sal_Int32 nNeededSpace( 0 ); - sal_Int32 nTopDockingAreaSize( 0 ); - - if ( isHorizontalDockingArea( DockingArea )) - { - nMaxSpace = aDockingWinSize.Width(); - nNeededSpace = aUIElementSize.Width(); - } - else - { - nMaxSpace = aDockingWinSize.Height(); - nNeededSpace = aUIElementSize.Height(); - nTopDockingAreaSize = implts_getTopBottomDockingAreaSizes().Width(); - } - - std::vector< SingleRowColumnWindowData > aRowColumnsWindowData; - - implts_getDockingAreaElementInfos( DockingArea, aRowColumnsWindowData ); - sal_Int32 nPixelPos( 0 ); - const sal_uInt32 nCount = aRowColumnsWindowData.size(); - for ( sal_uInt32 i = 0; i < nCount; i++ ) - { - SingleRowColumnWindowData& rRowColumnWindowData = aRowColumnsWindowData[i]; - - if (( DockingArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) || - ( DockingArea == ui::DockingArea_DOCKINGAREA_RIGHT )) - nPixelPos += rRowColumnWindowData.nStaticSize; - - if ((( nMaxSpace - rRowColumnWindowData.nVarSize ) >= nNeededSpace ) || - ( rRowColumnWindowData.nSpace >= nNeededSpace )) - { - // Check current row where we can find the needed space - sal_Int32 nCurrPos( 0 ); - const sal_uInt32 nWindowSizesCount = rRowColumnWindowData.aRowColumnWindowSizes.size(); - for ( sal_uInt32 j = 0; j < nWindowSizesCount; j++ ) - { - awt::Rectangle rRect = rRowColumnWindowData.aRowColumnWindowSizes[j]; - sal_Int32& rSpace = rRowColumnWindowData.aRowColumnSpace[j]; - if ( isHorizontalDockingArea( DockingArea )) - { - if ( rSpace >= nNeededSpace ) - { - rVirtualPos = awt::Point( nCurrPos, rRowColumnWindowData.nRowColumn ); - if ( DockingArea == ui::DockingArea_DOCKINGAREA_TOP ) - rPixelPos = ::Point( nCurrPos, nPixelPos ); - else - rPixelPos = ::Point( nCurrPos, aDockingWinSize.Height() - nPixelPos ); - return; - } - nCurrPos = rRect.X + rRect.Width; - } - else - { - if ( rSpace >= nNeededSpace ) - { - rVirtualPos = awt::Point( rRowColumnWindowData.nRowColumn, nCurrPos ); - if ( DockingArea == ui::DockingArea_DOCKINGAREA_LEFT ) - rPixelPos = ::Point( nPixelPos, nTopDockingAreaSize + nCurrPos ); - else - rPixelPos = ::Point( aDockingWinSize.Width() - nPixelPos , nTopDockingAreaSize + nCurrPos ); - return; - } - nCurrPos = rRect.Y + rRect.Height; - } - } - - if (( nCurrPos + nNeededSpace ) <= nMaxSpace ) - { - if ( isHorizontalDockingArea( DockingArea )) - { - rVirtualPos = awt::Point( nCurrPos, rRowColumnWindowData.nRowColumn ); - if ( DockingArea == ui::DockingArea_DOCKINGAREA_TOP ) - rPixelPos = ::Point( nCurrPos, nPixelPos ); - else - rPixelPos = ::Point( nCurrPos, aDockingWinSize.Height() - nPixelPos ); - return; - } - else - { - rVirtualPos = awt::Point( rRowColumnWindowData.nRowColumn, nCurrPos ); - if ( DockingArea == ui::DockingArea_DOCKINGAREA_LEFT ) - rPixelPos = ::Point( nPixelPos, nTopDockingAreaSize + nCurrPos ); - else - rPixelPos = ::Point( aDockingWinSize.Width() - nPixelPos , nTopDockingAreaSize + nCurrPos ); - return; - } - } - } - - if (( DockingArea == ui::DockingArea_DOCKINGAREA_TOP ) || ( DockingArea == ui::DockingArea_DOCKINGAREA_LEFT )) - nPixelPos += rRowColumnWindowData.nStaticSize; - } - - sal_Int32 nNextFreeRowCol( 0 ); - sal_Int32 nRowColumnsCount = aRowColumnsWindowData.size(); - if ( nRowColumnsCount > 0 ) - nNextFreeRowCol = aRowColumnsWindowData[nRowColumnsCount-1].nRowColumn+1; - else - nNextFreeRowCol = 0; - - if ( nNextFreeRowCol == 0 ) - { - if ( DockingArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) - nFreeRowColPixelPos = aDockingWinSize.Height() - aUIElementSize.Height(); - else if ( DockingArea == ui::DockingArea_DOCKINGAREA_RIGHT ) - nFreeRowColPixelPos = aDockingWinSize.Width() - aUIElementSize.Width(); - } - - if ( isHorizontalDockingArea( DockingArea )) - { - rVirtualPos = awt::Point( 0, nNextFreeRowCol ); - if ( DockingArea == ui::DockingArea_DOCKINGAREA_TOP ) - rPixelPos = ::Point( 0, nFreeRowColPixelPos ); - else - rPixelPos = ::Point( 0, aDockingWinSize.Height() - nFreeRowColPixelPos ); - } - else - { - rVirtualPos = awt::Point( nNextFreeRowCol, 0 ); - rPixelPos = ::Point( aDockingWinSize.Width() - nFreeRowColPixelPos, 0 ); - } -} - -void ToolbarLayoutManager::implts_calcWindowPosSizeOnSingleRowColumn( - sal_Int32 nDockingArea, - sal_Int32 nOffset, - SingleRowColumnWindowData& rRowColumnWindowData, - const ::Size& rContainerSize ) -{ - sal_Int32 nDiff(0); - sal_Int32 nRCSpace( rRowColumnWindowData.nSpace ); - sal_Int32 nTopDockingAreaSize(0); - sal_Int32 nBottomDockingAreaSize(0); - sal_Int32 nContainerClientSize(0); - - if ( rRowColumnWindowData.aRowColumnWindows.empty() ) - return; - - if ( isHorizontalDockingArea( nDockingArea )) - { - nContainerClientSize = rContainerSize.Width(); - nDiff = nContainerClientSize - rRowColumnWindowData.nVarSize; - } - else - { - nTopDockingAreaSize = implts_getTopBottomDockingAreaSizes().Width(); - nBottomDockingAreaSize = implts_getTopBottomDockingAreaSizes().Height(); - nContainerClientSize = ( rContainerSize.Height() - nTopDockingAreaSize - nBottomDockingAreaSize ); - nDiff = nContainerClientSize - rRowColumnWindowData.nVarSize; - } - - const sal_uInt32 nCount = rRowColumnWindowData.aRowColumnWindowSizes.size(); - if (( nDiff < 0 ) && ( nRCSpace > 0 )) - { - // First we try to reduce the size of blank space before/behind docked windows - sal_Int32 i = nCount - 1; - while ( i >= 0 ) - { - sal_Int32 nSpace = rRowColumnWindowData.aRowColumnSpace[i]; - if ( nSpace >= -nDiff ) - { - if ( isHorizontalDockingArea( nDockingArea )) - { - // Try to move this and all user elements behind with the calculated difference - for ( sal_uInt32 j = i; j < nCount ; j++ ) - rRowColumnWindowData.aRowColumnWindowSizes[j].X += nDiff; - } - else - { - // Try to move this and all user elements behind with the calculated difference - for ( sal_uInt32 j = i; j < nCount ; j++ ) - rRowColumnWindowData.aRowColumnWindowSizes[j].Y += nDiff; - } - nDiff = 0; - - break; - } - else if ( nSpace > 0 ) - { - if ( isHorizontalDockingArea( nDockingArea )) - { - // Try to move this and all user elements behind with the calculated difference - for ( sal_uInt32 j = i; j < nCount; j++ ) - rRowColumnWindowData.aRowColumnWindowSizes[j].X -= nSpace; - } - else - { - // Try to move this and all user elements behind with the calculated difference - for ( sal_uInt32 j = i; j < nCount; j++ ) - rRowColumnWindowData.aRowColumnWindowSizes[j].Y -= nSpace; - } - nDiff += nSpace; - } - --i; - } - } - - // Check if we have to reduce further - if ( nDiff < 0 ) - { - // Now we have to reduce the size of certain docked windows - sal_Int32 i = sal_Int32( nCount - 1 ); - while ( i >= 0 ) - { - awt::Rectangle& rWinRect = rRowColumnWindowData.aRowColumnWindowSizes[i]; - ::Size aMinSize; - - SolarMutexGuard aGuard; - { - uno::Reference< awt::XWindow > xWindow = rRowColumnWindowData.aRowColumnWindows[i]; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - aMinSize = ((ToolBox *)pWindow)->CalcMinimumWindowSizePixel(); - } - - if (( aMinSize.Width() > 0 ) && ( aMinSize.Height() > 0 )) - { - if ( isHorizontalDockingArea( nDockingArea )) - { - sal_Int32 nMaxReducation = ( rWinRect.Width - aMinSize.Width() ); - if ( nMaxReducation >= -nDiff ) - { - rWinRect.Width = rWinRect.Width + nDiff; - nDiff = 0; - } - else - { - rWinRect.Width = aMinSize.Width(); - nDiff += nMaxReducation; - } - - // Try to move this and all user elements behind with the calculated difference - for ( sal_uInt32 j = i; j < nCount; j++ ) - rRowColumnWindowData.aRowColumnWindowSizes[j].X += nDiff; - } - else - { - sal_Int32 nMaxReducation = ( rWinRect.Height - aMinSize.Height() ); - if ( nMaxReducation >= -nDiff ) - { - rWinRect.Height = rWinRect.Height + nDiff; - nDiff = 0; - } - else - { - rWinRect.Height = aMinSize.Height(); - nDiff += nMaxReducation; - } - - // Try to move this and all user elements behind with the calculated difference - for ( sal_uInt32 j = i; j < nCount; j++ ) - rRowColumnWindowData.aRowColumnWindowSizes[j].Y += nDiff; - } - } - - if ( nDiff >= 0 ) - break; - - --i; - } - } - - ReadGuard aReadLock( m_aLock ); - Window* pDockAreaWindow = VCLUnoHelper::GetWindow( m_xDockAreaWindows[nDockingArea] ); - aReadLock.unlock(); - - sal_Int32 nCurrPos( 0 ); - - SolarMutexGuard aGuard; - for ( sal_uInt32 i = 0; i < nCount; i++ ) - { - uno::Reference< awt::XWindow > xWindow = rRowColumnWindowData.aRowColumnWindows[i]; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - Window* pOldParentWindow = pWindow->GetParent(); - - if ( pDockAreaWindow != pOldParentWindow ) - pWindow->SetParent( pDockAreaWindow ); - - awt::Rectangle aWinRect = rRowColumnWindowData.aRowColumnWindowSizes[i]; - if ( isHorizontalDockingArea( nDockingArea )) - { - if ( aWinRect.X < nCurrPos ) - aWinRect.X = nCurrPos; - pWindow->SetPosSizePixel( ::Point( aWinRect.X, nOffset ), ::Size( aWinRect.Width, rRowColumnWindowData.nStaticSize )); - pWindow->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); - nCurrPos += ( aWinRect.X - nCurrPos ) + aWinRect.Width; - } - else - { - if ( aWinRect.Y < nCurrPos ) - aWinRect.Y = nCurrPos; - pWindow->SetPosSizePixel( ::Point( nOffset, aWinRect.Y ), ::Size( rRowColumnWindowData.nStaticSize, aWinRect.Height )); - pWindow->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); - nCurrPos += ( aWinRect.Y - nCurrPos ) + aWinRect.Height; - } - } -} - -void ToolbarLayoutManager::implts_setLayoutDirty() -{ - WriteGuard aWriteLock( m_aLock ); - m_bLayoutDirty = true; -} - -void ToolbarLayoutManager::implts_setLayoutInProgress( bool bInProgress ) -{ - WriteGuard aWriteLock( m_aLock ); - m_bLayoutInProgress = bInProgress; -} - -::Rectangle ToolbarLayoutManager::implts_calcHotZoneRect( const ::Rectangle& rRect, sal_Int32 nHotZoneOffset ) -{ - ::Rectangle aRect( rRect ); - - aRect.Left() -= nHotZoneOffset; - aRect.Top() -= nHotZoneOffset; - aRect.Right() += nHotZoneOffset; - aRect.Bottom() += nHotZoneOffset; - - return aRect; -} - -void ToolbarLayoutManager::implts_calcDockingPosSize( - UIElement& rUIElement, - DockingOperation& rDockingOperation, - ::Rectangle& rTrackingRect, - const Point& rMousePos ) -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow ); - ::Size aContainerWinSize; - Window* pContainerWindow( 0 ); - ::Rectangle aDockingAreaOffsets( m_aDockingAreaOffsets ); - aReadLock.unlock(); - - if ( !rUIElement.m_xUIElement.is() ) - { - rTrackingRect = ::Rectangle(); - return; - } - - { - // Retrieve output size from container Window - SolarMutexGuard aGuard; - pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow ); - aContainerWinSize = pContainerWindow->GetOutputSizePixel(); - } - - Window* pDockWindow( 0 ); - Window* pDockingAreaWindow( 0 ); - ToolBox* pToolBox( 0 ); - uno::Reference< awt::XWindow > xWindow( rUIElement.m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - uno::Reference< awt::XWindow > xDockingAreaWindow; - ::Rectangle aTrackingRect( rTrackingRect ); - ui::DockingArea eDockedArea( (ui::DockingArea)rUIElement.m_aDockedData.m_nDockedArea ); - sal_Int32 nTopDockingAreaSize( implts_getTopBottomDockingAreaSizes().Width() ); - sal_Int32 nBottomDockingAreaSize( implts_getTopBottomDockingAreaSizes().Height() ); - bool bHorizontalDockArea(( eDockedArea == ui::DockingArea_DOCKINGAREA_TOP ) || - ( eDockedArea == ui::DockingArea_DOCKINGAREA_BOTTOM )); - sal_Int32 nMaxLeftRightDockAreaSize = aContainerWinSize.Height() - - nTopDockingAreaSize - - nBottomDockingAreaSize - - aDockingAreaOffsets.Top() - - aDockingAreaOffsets.Bottom(); - ::Rectangle aDockingAreaRect; - - aReadLock.lock(); - xDockingAreaWindow = m_xDockAreaWindows[eDockedArea]; - aReadLock.unlock(); - - { - SolarMutexGuard aGuard; - pDockingAreaWindow = VCLUnoHelper::GetWindow( xDockingAreaWindow ); - pDockWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pDockWindow && pDockWindow->GetType() == WINDOW_TOOLBOX ) - pToolBox = (ToolBox *)pDockWindow; - - aDockingAreaRect = ::Rectangle( pDockingAreaWindow->GetPosPixel(), pDockingAreaWindow->GetSizePixel() ); - if ( pToolBox ) - { - // docked toolbars always have one line - ::Size aSize = pToolBox->CalcWindowSizePixel( 1, ImplConvertAlignment( sal_Int16( eDockedArea )) ); - aTrackingRect.SetSize( ::Size( aSize.Width(), aSize.Height() )); - } - } - - // default docking operation, dock on the given row/column - bool bOpOutsideOfDockingArea( !aDockingAreaRect.IsInside( rMousePos )); - - std::vector< SingleRowColumnWindowData > aRowColumnsWindowData; - - rDockingOperation = DOCKOP_ON_COLROW; - implts_getDockingAreaElementInfos( eDockedArea, aRowColumnsWindowData ); - - // determine current first row/column and last row/column - sal_Int32 nMaxRowCol( -1 ); - sal_Int32 nMinRowCol( SAL_MAX_INT32 ); - const sal_uInt32 nCount = aRowColumnsWindowData.size(); - for ( sal_uInt32 i = 0; i < nCount; i++ ) - { - if ( aRowColumnsWindowData[i].nRowColumn > nMaxRowCol ) - nMaxRowCol = aRowColumnsWindowData[i].nRowColumn; - if ( aRowColumnsWindowData[i].nRowColumn < nMinRowCol ) - nMinRowCol = aRowColumnsWindowData[i].nRowColumn; - } - - if ( !bOpOutsideOfDockingArea ) - { - // docking inside our docking area - sal_Int32 nIndex( -1 ); - sal_Int32 nRowCol( -1 ); - ::Rectangle aWindowRect; - ::Rectangle aRowColumnRect; - - const sal_uInt32 nWindowDataCount = aRowColumnsWindowData.size(); - for ( sal_uInt32 i = 0; i < nWindowDataCount; i++ ) - { - ::Rectangle aRect( aRowColumnsWindowData[i].aRowColumnRect.X, - aRowColumnsWindowData[i].aRowColumnRect.Y, - aRowColumnsWindowData[i].aRowColumnRect.X + aRowColumnsWindowData[i].aRowColumnRect.Width, - aRowColumnsWindowData[i].aRowColumnRect.Y + aRowColumnsWindowData[i].aRowColumnRect.Height ); - - { - // Calc correct position of the column/row rectangle to be able to compare it with mouse pos/tracking rect - SolarMutexGuard aGuard; - aRect.SetPos( pContainerWindow->ScreenToOutputPixel( pDockingAreaWindow->OutputToScreenPixel( aRect.TopLeft() ))); - } - - bool bIsInsideRowCol( aRect.IsInside( rMousePos ) ); - if ( bIsInsideRowCol ) - { - nIndex = i; - nRowCol = aRowColumnsWindowData[i].nRowColumn; - rDockingOperation = implts_determineDockingOperation( eDockedArea, aRect, rMousePos ); - aWindowRect = implts_getWindowRectFromRowColumn( eDockedArea, aRowColumnsWindowData[i], rMousePos, rUIElement.m_aName ); - aRowColumnRect = aRect; - break; - } - } - - OSL_ENSURE( ( nIndex >= 0 ) && ( nRowCol >= 0 ), "Impossible case - no row/column found but mouse pointer is inside our docking area" ); - if (( nIndex >= 0 ) && ( nRowCol >= 0 )) - { - if ( rDockingOperation == DOCKOP_ON_COLROW ) - { - if ( !aWindowRect.IsEmpty()) - { - // Tracking rect is on a row/column and mouse is over a docked toolbar. - // Determine if the tracking rect must be located before/after the docked toolbar. - - ::Rectangle aUIElementRect( aWindowRect ); - sal_Int32 nMiddle( bHorizontalDockArea ? ( aWindowRect.Left() + aWindowRect.getWidth() / 2 ) : - ( aWindowRect.Top() + aWindowRect.getHeight() / 2 )); - sal_Bool bInsertBefore( bHorizontalDockArea ? ( rMousePos.X() < nMiddle ) : ( rMousePos.Y() < nMiddle )); - if ( bInsertBefore ) - { - if ( bHorizontalDockArea ) - { - sal_Int32 nSize = ::std::max( sal_Int32( 0 ), std::min( sal_Int32( aContainerWinSize.Width() - aWindowRect.Left() ), - sal_Int32( aTrackingRect.getWidth() ))); - if ( nSize == 0 ) - nSize = aWindowRect.getWidth(); - - aUIElementRect.SetSize( ::Size( nSize, aWindowRect.getHeight() )); - aWindowRect = implts_determineFrontDockingRect( eDockedArea, nRowCol, aWindowRect,rUIElement.m_aName, aUIElementRect ); - - // Set virtual position - rUIElement.m_aDockedData.m_aPos.X = aWindowRect.Left(); - rUIElement.m_aDockedData.m_aPos.Y = nRowCol; - } - else - { - sal_Int32 nSize = ::std::max( sal_Int32( 0 ), std::min( sal_Int32( - nTopDockingAreaSize + nMaxLeftRightDockAreaSize - aWindowRect.Top() ), - sal_Int32( aTrackingRect.getHeight() ))); - if ( nSize == 0 ) - nSize = aWindowRect.getHeight(); - - aUIElementRect.SetSize( ::Size( aWindowRect.getWidth(), nSize )); - aWindowRect = implts_determineFrontDockingRect( eDockedArea, nRowCol, aWindowRect, rUIElement.m_aName, aUIElementRect ); - - // Set virtual position - sal_Int32 nPosY = pDockingAreaWindow->ScreenToOutputPixel( - pContainerWindow->OutputToScreenPixel( aWindowRect.TopLeft() )).Y(); - rUIElement.m_aDockedData.m_aPos.X = nRowCol; - rUIElement.m_aDockedData.m_aPos.Y = nPosY; - } - - rTrackingRect = aWindowRect; - return; - } - else - { - if ( bHorizontalDockArea ) - { - sal_Int32 nSize = ::std::max( sal_Int32( 0 ), std::min( sal_Int32(( aContainerWinSize.Width() ) - aWindowRect.Right() ), - sal_Int32( aTrackingRect.getWidth() ))); - if ( nSize == 0 ) - { - aUIElementRect.SetPos( ::Point( aContainerWinSize.Width() - aTrackingRect.getWidth(), aWindowRect.Top() )); - aUIElementRect.SetSize( ::Size( aTrackingRect.getWidth(), aWindowRect.getHeight() )); - rUIElement.m_aDockedData.m_aPos.X = aUIElementRect.Left(); - - } - else - { - aUIElementRect.SetPos( ::Point( aWindowRect.Right(), aWindowRect.Top() )); - aUIElementRect.SetSize( ::Size( nSize, aWindowRect.getHeight() )); - rUIElement.m_aDockedData.m_aPos.X = aWindowRect.Right(); - } - - // Set virtual position - rUIElement.m_aDockedData.m_aPos.Y = nRowCol; - } - else - { - sal_Int32 nSize = ::std::max( sal_Int32( 0 ), std::min( sal_Int32( nTopDockingAreaSize + nMaxLeftRightDockAreaSize - aWindowRect.Bottom() ), - sal_Int32( aTrackingRect.getHeight() ))); - aUIElementRect.SetPos( ::Point( aWindowRect.Left(), aWindowRect.Bottom() )); - aUIElementRect.SetSize( ::Size( aWindowRect.getWidth(), nSize )); - - // Set virtual position - sal_Int32 nPosY( 0 ); - { - SolarMutexGuard aGuard; - nPosY = pDockingAreaWindow->ScreenToOutputPixel( - pContainerWindow->OutputToScreenPixel( aWindowRect.BottomRight() )).Y(); - } - rUIElement.m_aDockedData.m_aPos.X = nRowCol; - rUIElement.m_aDockedData.m_aPos.Y = nPosY; - } - - rTrackingRect = aUIElementRect; - return; - } - } - else - { - implts_setTrackingRect( eDockedArea, rMousePos, aTrackingRect ); - rTrackingRect = implts_calcTrackingAndElementRect( - eDockedArea, nRowCol, rUIElement, - aTrackingRect, aRowColumnRect, aContainerWinSize ); - return; - } - } - else - { - if ((( nRowCol == nMinRowCol ) && ( rDockingOperation == DOCKOP_BEFORE_COLROW )) || - (( nRowCol == nMaxRowCol ) && ( rDockingOperation == DOCKOP_AFTER_COLROW ))) - bOpOutsideOfDockingArea = true; - else - { - // handle docking before/after a row - implts_setTrackingRect( eDockedArea, rMousePos, aTrackingRect ); - rTrackingRect = implts_calcTrackingAndElementRect( - eDockedArea, nRowCol, rUIElement, - aTrackingRect, aRowColumnRect, aContainerWinSize ); - - sal_Int32 nOffsetX( 0 ); - sal_Int32 nOffsetY( 0 ); - if ( bHorizontalDockArea ) - nOffsetY = sal_Int32( floor( aRowColumnRect.getHeight() / 2 + 0.5 )); - else - nOffsetX = sal_Int32( floor( aRowColumnRect.getWidth() / 2 + 0.5 )); - - if ( rDockingOperation == DOCKOP_BEFORE_COLROW ) - { - if (( eDockedArea == ui::DockingArea_DOCKINGAREA_TOP ) || ( eDockedArea == ui::DockingArea_DOCKINGAREA_LEFT )) - { - // Docking before/after means move track rectangle half column/row. - // As left and top are ordered 0...n instead of right and bottom - // which uses n...0, we have to use negative values for top/left. - nOffsetX *= -1; - nOffsetY *= -1; - } - } - else - { - if (( eDockedArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) || ( eDockedArea == ui::DockingArea_DOCKINGAREA_RIGHT )) - { - // Docking before/after means move track rectangle half column/row. - // As left and top are ordered 0...n instead of right and bottom - // which uses n...0, we have to use negative values for top/left. - nOffsetX *= -1; - nOffsetY *= -1; - } - nRowCol++; - } - - if ( bHorizontalDockArea ) - rUIElement.m_aDockedData.m_aPos.Y = nRowCol; - else - rUIElement.m_aDockedData.m_aPos.X = nRowCol; - - rTrackingRect.Move( nOffsetX, nOffsetY ); - rTrackingRect.SetSize( aTrackingRect.GetSize() ); - } - } - } - } - - // Docking outside of our docking window area => - // Users want to dock before/after first/last docked element or to an empty docking area - if ( bOpOutsideOfDockingArea ) - { - // set correct size for docking - implts_setTrackingRect( eDockedArea, rMousePos, aTrackingRect ); - rTrackingRect = aTrackingRect; - - if ( bHorizontalDockArea ) - { - sal_Int32 nPosX( std::max( sal_Int32( rTrackingRect.Left()), sal_Int32( 0 ))); - if (( nPosX + rTrackingRect.getWidth()) > aContainerWinSize.Width() ) - nPosX = std::min( nPosX, - std::max( sal_Int32( aContainerWinSize.Width() - rTrackingRect.getWidth() ), - sal_Int32( 0 ))); - - sal_Int32 nSize = std::min( aContainerWinSize.Width(), rTrackingRect.getWidth() ); - sal_Int32 nDockHeight = std::max( static_cast<sal_Int32>(aDockingAreaRect.getHeight()), sal_Int32( 0 )); - if ( nDockHeight == 0 ) - { - sal_Int32 nPosY( std::max( aDockingAreaRect.Top(), aDockingAreaRect.Bottom() )); - if ( eDockedArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) - nPosY -= rTrackingRect.getHeight(); - rTrackingRect.SetPos( Point( nPosX, nPosY )); - rUIElement.m_aDockedData.m_aPos.Y = 0; - } - else if ( rMousePos.Y() < ( aDockingAreaRect.Top() + ( nDockHeight / 2 ))) - { - rTrackingRect.SetPos( Point( nPosX, aDockingAreaRect.Top() - rTrackingRect.getHeight() )); - if ( eDockedArea == ui::DockingArea_DOCKINGAREA_TOP ) - rUIElement.m_aDockedData.m_aPos.Y = 0; - else - rUIElement.m_aDockedData.m_aPos.Y = ( nMaxRowCol >= 0 ) ? nMaxRowCol+1 : 0; - rDockingOperation = DOCKOP_BEFORE_COLROW; - } - else - { - rTrackingRect.SetPos( Point( nPosX, aDockingAreaRect.Bottom() )); - if ( eDockedArea == ui::DockingArea_DOCKINGAREA_TOP ) - rUIElement.m_aDockedData.m_aPos.Y = ( nMaxRowCol >= 0 ) ? nMaxRowCol+1 : 0; - else - rUIElement.m_aDockedData.m_aPos.Y = 0; - rDockingOperation = DOCKOP_AFTER_COLROW; - } - rTrackingRect.setWidth( nSize ); - - { - SolarMutexGuard aGuard; - nPosX = pDockingAreaWindow->ScreenToOutputPixel( - pContainerWindow->OutputToScreenPixel( rTrackingRect.TopLeft() )).X(); - } - rUIElement.m_aDockedData.m_aPos.X = nPosX; - } - else - { - sal_Int32 nMaxDockingAreaHeight = std::max( sal_Int32( 0 ), sal_Int32( nMaxLeftRightDockAreaSize )); - sal_Int32 nPosY( std::max( sal_Int32( aTrackingRect.Top()), sal_Int32( nTopDockingAreaSize ))); - if (( nPosY + aTrackingRect.getHeight()) > ( nTopDockingAreaSize + nMaxDockingAreaHeight )) - nPosY = std::min( nPosY, - std::max( sal_Int32( nTopDockingAreaSize + ( nMaxDockingAreaHeight - aTrackingRect.getHeight() )), - sal_Int32( nTopDockingAreaSize ))); - - sal_Int32 nSize = std::min( nMaxDockingAreaHeight, static_cast<sal_Int32>(aTrackingRect.getHeight()) ); - sal_Int32 nDockWidth = std::max( static_cast<sal_Int32>(aDockingAreaRect.getWidth()), sal_Int32( 0 )); - if ( nDockWidth == 0 ) - { - sal_Int32 nPosX( std::max( aDockingAreaRect.Left(), aDockingAreaRect.Right() )); - if ( eDockedArea == ui::DockingArea_DOCKINGAREA_RIGHT ) - nPosX -= rTrackingRect.getWidth(); - rTrackingRect.SetPos( Point( nPosX, nPosY )); - rUIElement.m_aDockedData.m_aPos.X = 0; - } - else if ( rMousePos.X() < ( aDockingAreaRect.Left() + ( nDockWidth / 2 ))) - { - rTrackingRect.SetPos( Point( aDockingAreaRect.Left() - rTrackingRect.getWidth(), nPosY )); - if ( eDockedArea == ui::DockingArea_DOCKINGAREA_LEFT ) - rUIElement.m_aDockedData.m_aPos.X = 0; - else - rUIElement.m_aDockedData.m_aPos.X = ( nMaxRowCol >= 0 ) ? nMaxRowCol+1 : 0; - rDockingOperation = DOCKOP_BEFORE_COLROW; - } - else - { - rTrackingRect.SetPos( Point( aDockingAreaRect.Right(), nPosY )); - if ( eDockedArea == ui::DockingArea_DOCKINGAREA_LEFT ) - rUIElement.m_aDockedData.m_aPos.X = ( nMaxRowCol >= 0 ) ? nMaxRowCol+1 : 0; - else - rUIElement.m_aDockedData.m_aPos.X = 0; - rDockingOperation = DOCKOP_AFTER_COLROW; - } - rTrackingRect.setHeight( nSize ); - - { - SolarMutexGuard aGuard; - nPosY = pDockingAreaWindow->ScreenToOutputPixel( - pContainerWindow->OutputToScreenPixel( rTrackingRect.TopLeft() )).Y(); - } - rUIElement.m_aDockedData.m_aPos.Y = nPosY; - } - } -} - -framework::ToolbarLayoutManager::DockingOperation ToolbarLayoutManager::implts_determineDockingOperation( - ui::DockingArea DockingArea, - const ::Rectangle& rRowColRect, - const Point& rMousePos ) -{ - const sal_Int32 nHorzVerticalRegionSize = 6; - const sal_Int32 nHorzVerticalMoveRegion = 4; - - if ( rRowColRect.IsInside( rMousePos )) - { - if ( isHorizontalDockingArea( DockingArea )) - { - sal_Int32 nRegion = rRowColRect.getHeight() / nHorzVerticalRegionSize; - sal_Int32 nPosY = rRowColRect.Top() + nRegion; - - if ( rMousePos.Y() < nPosY ) - return ( DockingArea == ui::DockingArea_DOCKINGAREA_TOP ) ? DOCKOP_BEFORE_COLROW : DOCKOP_AFTER_COLROW; - else if ( rMousePos.Y() < ( nPosY + nRegion*nHorzVerticalMoveRegion )) - return DOCKOP_ON_COLROW; - else - return ( DockingArea == ui::DockingArea_DOCKINGAREA_TOP ) ? DOCKOP_AFTER_COLROW : DOCKOP_BEFORE_COLROW; - } - else - { - sal_Int32 nRegion = rRowColRect.getWidth() / nHorzVerticalRegionSize; - sal_Int32 nPosX = rRowColRect.Left() + nRegion; - - if ( rMousePos.X() < nPosX ) - return ( DockingArea == ui::DockingArea_DOCKINGAREA_LEFT ) ? DOCKOP_BEFORE_COLROW : DOCKOP_AFTER_COLROW; - else if ( rMousePos.X() < ( nPosX + nRegion*nHorzVerticalMoveRegion )) - return DOCKOP_ON_COLROW; - else - return ( DockingArea == ui::DockingArea_DOCKINGAREA_LEFT ) ? DOCKOP_AFTER_COLROW : DOCKOP_BEFORE_COLROW; - } - } - else - return DOCKOP_ON_COLROW; -} - -::Rectangle ToolbarLayoutManager::implts_calcTrackingAndElementRect( - ui::DockingArea eDockingArea, - sal_Int32 nRowCol, - UIElement& rUIElement, - const ::Rectangle& rTrackingRect, - const ::Rectangle& rRowColumnRect, - const ::Size& rContainerWinSize ) -{ - ReadGuard aReadGuard( m_aLock ); - ::Rectangle aDockingAreaOffsets( m_aDockingAreaOffsets ); - aReadGuard.unlock(); - - bool bHorizontalDockArea( isHorizontalDockingArea( eDockingArea )); - - sal_Int32 nTopDockingAreaSize( implts_getTopBottomDockingAreaSizes().Width() ); - sal_Int32 nBottomDockingAreaSize( implts_getTopBottomDockingAreaSizes().Height() ); - - sal_Int32 nMaxLeftRightDockAreaSize = rContainerWinSize.Height() - - nTopDockingAreaSize - - nBottomDockingAreaSize - - aDockingAreaOffsets.Top() - - aDockingAreaOffsets.Bottom(); - - ::Rectangle aTrackingRect( rTrackingRect ); - if ( bHorizontalDockArea ) - { - sal_Int32 nPosX( std::max( sal_Int32( rTrackingRect.Left()), sal_Int32( 0 ))); - if (( nPosX + rTrackingRect.getWidth()) > rContainerWinSize.Width() ) - nPosX = std::min( nPosX, - std::max( sal_Int32( rContainerWinSize.Width() - rTrackingRect.getWidth() ), - sal_Int32( 0 ))); - - sal_Int32 nSize = std::min( rContainerWinSize.Width(), rTrackingRect.getWidth() ); - - aTrackingRect.SetPos( ::Point( nPosX, rRowColumnRect.Top() )); - aTrackingRect.setWidth( nSize ); - aTrackingRect.setHeight( rRowColumnRect.getHeight() ); - - // Set virtual position - rUIElement.m_aDockedData.m_aPos.X = nPosX; - rUIElement.m_aDockedData.m_aPos.Y = nRowCol; - } - else - { - sal_Int32 nMaxDockingAreaHeight = std::max( sal_Int32( 0 ), - sal_Int32( nMaxLeftRightDockAreaSize )); - - sal_Int32 nPosY( std::max( sal_Int32( aTrackingRect.Top()), sal_Int32( nTopDockingAreaSize ))); - if (( nPosY + aTrackingRect.getHeight()) > ( nTopDockingAreaSize + nMaxDockingAreaHeight )) - nPosY = std::min( nPosY, - std::max( sal_Int32( nTopDockingAreaSize + ( nMaxDockingAreaHeight - aTrackingRect.getHeight() )), - sal_Int32( nTopDockingAreaSize ))); - - sal_Int32 nSize = std::min( nMaxDockingAreaHeight, static_cast<sal_Int32>(aTrackingRect.getHeight()) ); - - aTrackingRect.SetPos( ::Point( rRowColumnRect.Left(), nPosY )); - aTrackingRect.setWidth( rRowColumnRect.getWidth() ); - aTrackingRect.setHeight( nSize ); - - aReadGuard.lock(); - uno::Reference< awt::XWindow > xDockingAreaWindow( m_xDockAreaWindows[eDockingArea] ); - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow ); - aReadGuard.unlock(); - - sal_Int32 nDockPosY( 0 ); - Window* pDockingAreaWindow( 0 ); - Window* pContainerWindow( 0 ); - { - SolarMutexGuard aGuard; - pDockingAreaWindow = VCLUnoHelper::GetWindow( xDockingAreaWindow ); - pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow ); - nDockPosY = pDockingAreaWindow->ScreenToOutputPixel( pContainerWindow->OutputToScreenPixel( ::Point( 0, nPosY ))).Y(); - } - - // Set virtual position - rUIElement.m_aDockedData.m_aPos.X = nRowCol; - rUIElement.m_aDockedData.m_aPos.Y = nDockPosY; - } - - return aTrackingRect; -} - -void ToolbarLayoutManager::implts_setTrackingRect( ui::DockingArea eDockingArea, const ::Point& rMousePos, ::Rectangle& rTrackingRect ) -{ - ::Point aPoint( rTrackingRect.TopLeft()); - if ( isHorizontalDockingArea( eDockingArea )) - aPoint.X() = rMousePos.X(); - else - aPoint.Y() = rMousePos.Y(); - rTrackingRect.SetPos( aPoint ); -} - -void ToolbarLayoutManager::implts_renumberRowColumnData( - ui::DockingArea eDockingArea, - DockingOperation /*eDockingOperation*/, - const UIElement& rUIElement ) -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< container::XNameAccess > xPersistentWindowState( m_xPersistentWindowState ); - aReadLock.unlock(); - - bool bHorzDockingArea( isHorizontalDockingArea( eDockingArea )); - sal_Int32 nRowCol( bHorzDockingArea ? rUIElement.m_aDockedData.m_aPos.Y : rUIElement.m_aDockedData.m_aPos.X ); - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - UIElementVector::iterator pIter; - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if (( pIter->m_aDockedData.m_nDockedArea == sal_Int16( eDockingArea )) && ( pIter->m_aName != rUIElement.m_aName )) - { - // Don't change toolbars without a valid docking position! - if ( isDefaultPos( pIter->m_aDockedData.m_aPos )) - continue; - - sal_Int32 nWindowRowCol = ( bHorzDockingArea ) ? pIter->m_aDockedData.m_aPos.Y : pIter->m_aDockedData.m_aPos.X; - if ( nWindowRowCol >= nRowCol ) - { - if ( bHorzDockingArea ) - pIter->m_aDockedData.m_aPos.Y += 1; - else - pIter->m_aDockedData.m_aPos.X += 1; - } - } - } - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - // We have to change the persistent window state part - if ( xPersistentWindowState.is() ) - { - try - { - uno::Sequence< ::rtl::OUString > aWindowElements = xPersistentWindowState->getElementNames(); - for ( sal_Int32 i = 0; i < aWindowElements.getLength(); i++ ) - { - if ( rUIElement.m_aName != aWindowElements[i] ) - { - try - { - uno::Sequence< beans::PropertyValue > aPropValueSeq; - awt::Point aDockedPos; - ui::DockingArea nDockedArea( ui::DockingArea_DOCKINGAREA_DEFAULT ); - - xPersistentWindowState->getByName( aWindowElements[i] ) >>= aPropValueSeq; - for ( sal_Int32 j = 0; j < aPropValueSeq.getLength(); j++ ) - { - if ( aPropValueSeq[j].Name.equalsAscii( WINDOWSTATE_PROPERTY_DOCKINGAREA )) - aPropValueSeq[j].Value >>= nDockedArea; - else if ( aPropValueSeq[j].Name.equalsAscii( WINDOWSTATE_PROPERTY_DOCKPOS )) - aPropValueSeq[j].Value >>= aDockedPos; - } - - // Don't change toolbars without a valid docking position! - if ( isDefaultPos( aDockedPos )) - continue; - - sal_Int32 nWindowRowCol = ( bHorzDockingArea ) ? aDockedPos.Y : aDockedPos.X; - if (( nDockedArea == eDockingArea ) && ( nWindowRowCol >= nRowCol )) - { - if ( bHorzDockingArea ) - aDockedPos.Y += 1; - else - aDockedPos.X += 1; - - uno::Reference< container::XNameReplace > xReplace( xPersistentWindowState, uno::UNO_QUERY ); - xReplace->replaceByName( aWindowElements[i], makeAny( aPropValueSeq )); - } - } - catch (const uno::Exception&) - { - } - } - } - } - catch (const uno::Exception&) - { - } - } -} - -//--------------------------------------------------------------------------------------------------------- -// XWindowListener -//--------------------------------------------------------------------------------------------------------- -void SAL_CALL ToolbarLayoutManager::windowResized( const awt::WindowEvent& aEvent ) -throw( uno::RuntimeException ) -{ - WriteGuard aWriteLock( m_aLock ); - bool bLocked( m_bDockingInProgress ); - bool bLayoutInProgress( m_bLayoutInProgress ); - aWriteLock.unlock(); - - // Do not do anything if we are in the middle of a docking process. This would interfere all other - // operations. We will store the new position and size in the docking handlers. - // Do not do anything if we are in the middle of our layouting process. We will adapt the position - // and size of the user interface elements. - if ( !bLocked && !bLayoutInProgress ) - { - bool bNotify( false ); - uno::Reference< awt::XWindow > xWindow( aEvent.Source, uno::UNO_QUERY ); - - UIElement aUIElement = implts_findToolbar( aEvent.Source ); - if ( aUIElement.m_xUIElement.is() ) - { - if ( aUIElement.m_bFloating ) - { - uno::Reference< awt::XWindow2 > xWindow2( xWindow, uno::UNO_QUERY ); - - if( xWindow2.is() ) - { - awt::Rectangle aPos = xWindow2->getPosSize(); - awt::Size aSize = xWindow2->getOutputSize(); // always use output size for consistency - bool bVisible = xWindow2->isVisible(); - - // update element data - aUIElement.m_aFloatingData.m_aPos = awt::Point(aPos.X, aPos.Y); - aUIElement.m_aFloatingData.m_aSize = aSize; - aUIElement.m_bVisible = bVisible; - } - - implts_writeWindowStateData( aUIElement ); - } - else - { - implts_setLayoutDirty(); - bNotify = true; - } - } - - if ( bNotify ) - m_pParentLayouter->requestLayout( ILayoutNotifications::HINT_TOOLBARSPACE_HAS_CHANGED ); - } -} - -void SAL_CALL ToolbarLayoutManager::windowMoved( const awt::WindowEvent& /*aEvent*/ ) -throw( uno::RuntimeException ) -{ -} - -void SAL_CALL ToolbarLayoutManager::windowShown( const lang::EventObject& /*aEvent*/ ) -throw( uno::RuntimeException ) -{ -} - -void SAL_CALL ToolbarLayoutManager::windowHidden( const lang::EventObject& /*aEvent*/ ) -throw( uno::RuntimeException ) -{ -} - -//--------------------------------------------------------------------------------------------------------- -// XDockableWindowListener -//--------------------------------------------------------------------------------------------------------- -void SAL_CALL ToolbarLayoutManager::startDocking( const awt::DockingEvent& e ) -throw (uno::RuntimeException) -{ - bool bWinFound( false ); - - ReadGuard aReadGuard( m_aLock ); - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow ); - uno::Reference< awt::XWindow2 > xWindow( e.Source, uno::UNO_QUERY ); - aReadGuard.unlock(); - - Window* pContainerWindow( 0 ); - Window* pWindow( 0 ); - ::Point aMousePos; - { - SolarMutexGuard aGuard; - pContainerWindow = VCLUnoHelper::GetWindow( xContainerWindow ); - aMousePos = pContainerWindow->ScreenToOutputPixel( ::Point( e.MousePos.X, e.MousePos.Y )); - } - - UIElement aUIElement = implts_findToolbar( e.Source ); - - if ( aUIElement.m_xUIElement.is() && xWindow.is() ) - { - awt::Rectangle aRect; - - bWinFound = true; - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - if ( xDockWindow->isFloating() ) - { - awt::Rectangle aPos = xWindow->getPosSize(); - awt::Size aSize = xWindow->getOutputSize(); - - aUIElement.m_aFloatingData.m_aPos = awt::Point(aPos.X, aPos.Y); - aUIElement.m_aFloatingData.m_aSize = aSize; - - SolarMutexGuard aGuard; - - pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - { - ToolBox* pToolBox = (ToolBox *)pWindow; - aUIElement.m_aFloatingData.m_nLines = pToolBox->GetFloatingLines(); - aUIElement.m_aFloatingData.m_bIsHorizontal = isToolboxHorizontalAligned( pToolBox ); - } - } - } - - WriteGuard aWriteLock( m_aLock ); - m_bDockingInProgress = bWinFound; - m_aDockUIElement = aUIElement; - m_aDockUIElement.m_bUserActive = true; - m_aStartDockMousePos = aMousePos; - aWriteLock.unlock(); -} - -awt::DockingData SAL_CALL ToolbarLayoutManager::docking( const awt::DockingEvent& e ) -throw (uno::RuntimeException) -{ - const sal_Int32 MAGNETIC_DISTANCE_UNDOCK = 25; - const sal_Int32 MAGNETIC_DISTANCE_DOCK = 20; - - ReadGuard aReadLock( m_aLock ); - awt::DockingData aDockingData; - uno::Reference< awt::XDockableWindow > xDockWindow( e.Source, uno::UNO_QUERY ); - uno::Reference< awt::XWindow > xWindow( e.Source, uno::UNO_QUERY ); - uno::Reference< awt::XWindow > xTopDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_TOP] ); - uno::Reference< awt::XWindow > xLeftDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_LEFT] ); - uno::Reference< awt::XWindow > xRightDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_RIGHT] ); - uno::Reference< awt::XWindow > xBottomDockingWindow( m_xDockAreaWindows[ui::DockingArea_DOCKINGAREA_BOTTOM] ); - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow ); - UIElement aUIDockingElement( m_aDockUIElement ); - - - DockingOperation eDockingOperation( DOCKOP_ON_COLROW ); - bool bDockingInProgress( m_bDockingInProgress ); - aReadLock.unlock(); - - if ( bDockingInProgress ) - aDockingData.TrackingRectangle = e.TrackingRectangle; - - if ( bDockingInProgress && xDockWindow.is() && xWindow.is() ) - { - try - { - SolarMutexGuard aGuard; - - sal_Int16 eDockingArea( -1 ); // none - sal_Int32 nMagneticZone( aUIDockingElement.m_bFloating ? MAGNETIC_DISTANCE_DOCK : MAGNETIC_DISTANCE_UNDOCK ); - awt::Rectangle aNewTrackingRect; - ::Rectangle aTrackingRect( e.TrackingRectangle.X, e.TrackingRectangle.Y, - ( e.TrackingRectangle.X + e.TrackingRectangle.Width ), - ( e.TrackingRectangle.Y + e.TrackingRectangle.Height )); - - awt::Rectangle aTmpRect = xTopDockingWindow->getPosSize(); - ::Rectangle aTopDockRect( aTmpRect.X, aTmpRect.Y, aTmpRect.Width, aTmpRect.Height ); - ::Rectangle aHotZoneTopDockRect( implts_calcHotZoneRect( aTopDockRect, nMagneticZone )); - - aTmpRect = xBottomDockingWindow->getPosSize(); - ::Rectangle aBottomDockRect( aTmpRect.X, aTmpRect.Y, ( aTmpRect.X + aTmpRect.Width), ( aTmpRect.Y + aTmpRect.Height )); - ::Rectangle aHotZoneBottomDockRect( implts_calcHotZoneRect( aBottomDockRect, nMagneticZone )); - - aTmpRect = xLeftDockingWindow->getPosSize(); - ::Rectangle aLeftDockRect( aTmpRect.X, aTmpRect.Y, ( aTmpRect.X + aTmpRect.Width ), ( aTmpRect.Y + aTmpRect.Height )); - ::Rectangle aHotZoneLeftDockRect( implts_calcHotZoneRect( aLeftDockRect, nMagneticZone )); - - aTmpRect = xRightDockingWindow->getPosSize(); - ::Rectangle aRightDockRect( aTmpRect.X, aTmpRect.Y, ( aTmpRect.X + aTmpRect.Width ), ( aTmpRect.Y + aTmpRect.Height )); - ::Rectangle aHotZoneRightDockRect( implts_calcHotZoneRect( aRightDockRect, nMagneticZone )); - - Window* pContainerWindow( VCLUnoHelper::GetWindow( xContainerWindow ) ); - ::Point aMousePos( pContainerWindow->ScreenToOutputPixel( ::Point( e.MousePos.X, e.MousePos.Y ))); - - if ( aHotZoneTopDockRect.IsInside( aMousePos )) - eDockingArea = ui::DockingArea_DOCKINGAREA_TOP; - else if ( aHotZoneBottomDockRect.IsInside( aMousePos )) - eDockingArea = ui::DockingArea_DOCKINGAREA_BOTTOM; - else if ( aHotZoneLeftDockRect.IsInside( aMousePos )) - eDockingArea = ui::DockingArea_DOCKINGAREA_LEFT; - else if ( aHotZoneRightDockRect.IsInside( aMousePos )) - eDockingArea = ui::DockingArea_DOCKINGAREA_RIGHT; - - // Higher priority for movements inside the real docking area - if ( aTopDockRect.IsInside( aMousePos )) - eDockingArea = ui::DockingArea_DOCKINGAREA_TOP; - else if ( aBottomDockRect.IsInside( aMousePos )) - eDockingArea = ui::DockingArea_DOCKINGAREA_BOTTOM; - else if ( aLeftDockRect.IsInside( aMousePos )) - eDockingArea = ui::DockingArea_DOCKINGAREA_LEFT; - else if ( aRightDockRect.IsInside( aMousePos )) - eDockingArea = ui::DockingArea_DOCKINGAREA_RIGHT; - - // Determine if we have a toolbar and set alignment according to the docking area! - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - ToolBox* pToolBox = 0; - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - pToolBox = (ToolBox *)pWindow; - - if ( eDockingArea != -1 ) - { - if ( eDockingArea == ui::DockingArea_DOCKINGAREA_TOP ) - { - aUIDockingElement.m_aDockedData.m_nDockedArea = ui::DockingArea_DOCKINGAREA_TOP; - aUIDockingElement.m_bFloating = false; - } - else if ( eDockingArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) - { - aUIDockingElement.m_aDockedData.m_nDockedArea = ui::DockingArea_DOCKINGAREA_BOTTOM; - aUIDockingElement.m_bFloating = false; - } - else if ( eDockingArea == ui::DockingArea_DOCKINGAREA_LEFT ) - { - aUIDockingElement.m_aDockedData.m_nDockedArea = ui::DockingArea_DOCKINGAREA_LEFT; - aUIDockingElement.m_bFloating = false; - } - else if ( eDockingArea == ui::DockingArea_DOCKINGAREA_RIGHT ) - { - aUIDockingElement.m_aDockedData.m_nDockedArea = ui::DockingArea_DOCKINGAREA_RIGHT; - aUIDockingElement.m_bFloating = false; - } - - ::Point aOutputPos = pContainerWindow->ScreenToOutputPixel( aTrackingRect.TopLeft() ); - aTrackingRect.SetPos( aOutputPos ); - - ::Rectangle aNewDockingRect( aTrackingRect ); - - - implts_calcDockingPosSize( aUIDockingElement, eDockingOperation, aNewDockingRect, aMousePos ); - - ::Point aScreenPos = pContainerWindow->OutputToScreenPixel( aNewDockingRect.TopLeft() ); - aNewTrackingRect = awt::Rectangle( aScreenPos.X(), aScreenPos.Y(), - aNewDockingRect.getWidth(), aNewDockingRect.getHeight() ); - aDockingData.TrackingRectangle = aNewTrackingRect; - } - else if ( pToolBox && bDockingInProgress ) - { - bool bIsHorizontal = isToolboxHorizontalAligned( pToolBox ); - awt::Size aFloatSize = aUIDockingElement.m_aFloatingData.m_aSize; - if ( aFloatSize.Width > 0 && aFloatSize.Height > 0 ) - { - aUIDockingElement.m_aFloatingData.m_aPos = AWTPoint(pContainerWindow->ScreenToOutputPixel(VCLPoint(e.MousePos))); - aDockingData.TrackingRectangle.Height = aFloatSize.Height; - aDockingData.TrackingRectangle.Width = aFloatSize.Width; - } - else - { - aFloatSize = AWTSize(pToolBox->CalcWindowSizePixel()); - if ( !bIsHorizontal ) - { - // Floating toolbars are always horizontal aligned! We have to swap - // width/height if we have a vertical aligned toolbar. - sal_Int32 nTemp = aFloatSize.Height; - aFloatSize.Height = aFloatSize.Width; - aFloatSize.Width = nTemp; - } - - aDockingData.TrackingRectangle.Height = aFloatSize.Height; - aDockingData.TrackingRectangle.Width = aFloatSize.Width; - - // For the first time we don't have any data about the floating size of a toolbar. - // We calculate it and store it for later use. - aUIDockingElement.m_aFloatingData.m_aPos = AWTPoint(pContainerWindow->ScreenToOutputPixel(VCLPoint(e.MousePos))); - aUIDockingElement.m_aFloatingData.m_aSize = aFloatSize; - aUIDockingElement.m_aFloatingData.m_nLines = pToolBox->GetFloatingLines(); - aUIDockingElement.m_aFloatingData.m_bIsHorizontal = isToolboxHorizontalAligned( pToolBox ); - } - aDockingData.TrackingRectangle.X = e.MousePos.X; - aDockingData.TrackingRectangle.Y = e.MousePos.Y; - } - - aDockingData.bFloating = ( eDockingArea == -1 ); - - // Write current data to the member docking progress data - WriteGuard aWriteLock( m_aLock ); - m_aDockUIElement.m_bFloating = aDockingData.bFloating; - if ( !aDockingData.bFloating ) - { - m_aDockUIElement.m_aDockedData = aUIDockingElement.m_aDockedData; - - - m_eDockOperation = eDockingOperation; - } - else - m_aDockUIElement.m_aFloatingData = aUIDockingElement.m_aFloatingData; - aWriteLock.unlock(); - } - catch (const uno::Exception&) - { - } - } - - return aDockingData; -} - -void SAL_CALL ToolbarLayoutManager::endDocking( const awt::EndDockingEvent& e ) -throw (uno::RuntimeException) -{ - bool bDockingInProgress( false ); - bool bStartDockFloated( false ); - bool bFloating( false ); - UIElement aUIDockingElement; - - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - WriteGuard aWriteLock( m_aLock ); - bDockingInProgress = m_bDockingInProgress; - aUIDockingElement = m_aDockUIElement; - bFloating = aUIDockingElement.m_bFloating; - - UIElement& rUIElement = impl_findToolbar( aUIDockingElement.m_aName ); - if ( rUIElement.m_aName == aUIDockingElement.m_aName ) - { - if ( aUIDockingElement.m_bFloating ) - { - // Write last position into position data - uno::Reference< awt::XWindow > xWindow( aUIDockingElement.m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - rUIElement.m_aFloatingData = aUIDockingElement.m_aFloatingData; - awt::Rectangle aTmpRect = xWindow->getPosSize(); - rUIElement.m_aFloatingData.m_aPos = awt::Point(aTmpRect.X, aTmpRect.Y); - // make changes also for our local data as we use it to make data persistent - aUIDockingElement.m_aFloatingData = rUIElement.m_aFloatingData; - } - else - { - rUIElement.m_aDockedData = aUIDockingElement.m_aDockedData; - rUIElement.m_aFloatingData.m_aSize = aUIDockingElement.m_aFloatingData.m_aSize; - - if ( m_eDockOperation != DOCKOP_ON_COLROW ) - { - // we have to renumber our row/column data to insert a new row/column - implts_renumberRowColumnData((ui::DockingArea)aUIDockingElement.m_aDockedData.m_nDockedArea, m_eDockOperation, aUIDockingElement ); - } - } - - bStartDockFloated = rUIElement.m_bFloating; - rUIElement.m_bFloating = m_aDockUIElement.m_bFloating; - rUIElement.m_bUserActive = true; - } - - // reset member for next docking operation - m_aDockUIElement.m_xUIElement.clear(); - m_eDockOperation = DOCKOP_ON_COLROW; - aWriteLock.unlock(); - /* SAFE AREA ----------------------------------------------------------------------------------------------- */ - - implts_writeWindowStateData( aUIDockingElement ); - - if ( bDockingInProgress ) - { - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( uno::Reference< awt::XWindow >( e.Source, uno::UNO_QUERY )); - ToolBox* pToolBox = 0; - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - pToolBox = (ToolBox *)pWindow; - - if ( pToolBox ) - { - if( e.bFloating ) - { - if ( aUIDockingElement.m_aFloatingData.m_bIsHorizontal ) - pToolBox->SetAlign( WINDOWALIGN_TOP ); - else - pToolBox->SetAlign( WINDOWALIGN_LEFT ); - } - else - { - ::Size aSize; - - pToolBox->SetAlign( ImplConvertAlignment( aUIDockingElement.m_aDockedData.m_nDockedArea) ); - - // Docked toolbars have always one line - aSize = pToolBox->CalcWindowSizePixel( 1 ); - - // Lock layouting updates as our listener would be called due to SetSizePixel - pToolBox->SetOutputSizePixel( aSize ); - } - } - } - - implts_sortUIElements(); - - aWriteLock.lock(); - m_bDockingInProgress = sal_False; - m_bLayoutDirty = !bStartDockFloated || !bFloating; - bool bNotify = m_bLayoutDirty; - aWriteLock.unlock(); - - if ( bNotify ) - m_pParentLayouter->requestLayout( ILayoutNotifications::HINT_TOOLBARSPACE_HAS_CHANGED ); -} - -sal_Bool SAL_CALL ToolbarLayoutManager::prepareToggleFloatingMode( const lang::EventObject& e ) -throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - bool bDockingInProgress = m_bDockingInProgress; - aReadLock.unlock(); - - UIElement aUIDockingElement = implts_findToolbar( e.Source ); - bool bWinFound( aUIDockingElement.m_aName.getLength() > 0 ); - uno::Reference< awt::XWindow > xWindow( e.Source, uno::UNO_QUERY ); - - if ( bWinFound && xWindow.is() ) - { - if ( !bDockingInProgress ) - { - awt::Rectangle aRect; - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - if ( xDockWindow->isFloating() ) - { - { - SolarMutexGuard aGuard; - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - { - ToolBox* pToolBox = static_cast< ToolBox *>( pWindow ); - aUIDockingElement.m_aFloatingData.m_aPos = AWTPoint(pToolBox->GetPosPixel()); - aUIDockingElement.m_aFloatingData.m_aSize = AWTSize(pToolBox->GetOutputSizePixel()); - aUIDockingElement.m_aFloatingData.m_nLines = pToolBox->GetFloatingLines(); - aUIDockingElement.m_aFloatingData.m_bIsHorizontal = isToolboxHorizontalAligned( pToolBox ); - } - } - - UIElement aUIElement = implts_findToolbar( aUIDockingElement.m_aName ); - if ( aUIElement.m_aName == aUIDockingElement.m_aName ) - implts_setToolbar( aUIDockingElement ); - } - } - } - - return sal_True; -} - -void SAL_CALL ToolbarLayoutManager::toggleFloatingMode( const lang::EventObject& e ) -throw (uno::RuntimeException) -{ - UIElement aUIDockingElement; - - ReadGuard aReadLock( m_aLock ); - bool bDockingInProgress( m_bDockingInProgress ); - if ( bDockingInProgress ) - aUIDockingElement = m_aDockUIElement; - aReadLock.unlock(); - - Window* pWindow( 0 ); - ToolBox* pToolBox( 0 ); - uno::Reference< awt::XWindow2 > xWindow; - - { - SolarMutexGuard aGuard; - xWindow = uno::Reference< awt::XWindow2 >( e.Source, uno::UNO_QUERY ); - pWindow = VCLUnoHelper::GetWindow( xWindow ); - - if ( pWindow && pWindow->GetType() == WINDOW_TOOLBOX ) - pToolBox = (ToolBox *)pWindow; - } - - if ( !bDockingInProgress ) - { - aUIDockingElement = implts_findToolbar( e.Source ); - bool bWinFound = ( aUIDockingElement.m_aName.getLength() > 0 ); - - if ( bWinFound && xWindow.is() ) - { - aUIDockingElement.m_bFloating = !aUIDockingElement.m_bFloating; - aUIDockingElement.m_bUserActive = true; - - implts_setLayoutInProgress( true ); - if ( aUIDockingElement.m_bFloating ) - { - SolarMutexGuard aGuard; - if ( pToolBox ) - { - pToolBox->SetLineCount( aUIDockingElement.m_aFloatingData.m_nLines ); - if ( aUIDockingElement.m_aFloatingData.m_bIsHorizontal ) - pToolBox->SetAlign( WINDOWALIGN_TOP ); - else - pToolBox->SetAlign( WINDOWALIGN_LEFT ); - } - - bool bUndefPos = hasDefaultPosValue( aUIDockingElement.m_aFloatingData.m_aPos ); - bool bSetSize = !hasEmptySize( aUIDockingElement.m_aFloatingData.m_aSize ); - - if ( bUndefPos ) - aUIDockingElement.m_aFloatingData.m_aPos = implts_findNextCascadeFloatingPos(); - - if ( !bSetSize ) - { - if ( pToolBox ) - aUIDockingElement.m_aFloatingData.m_aSize = AWTSize(pToolBox->CalcFloatingWindowSizePixel()); - else - aUIDockingElement.m_aFloatingData.m_aSize = AWTSize(pWindow->GetOutputSizePixel()); - } - - xWindow->setPosSize( aUIDockingElement.m_aFloatingData.m_aPos.X, - aUIDockingElement.m_aFloatingData.m_aPos.Y, - 0, 0, awt::PosSize::POS ); - xWindow->setOutputSize(aUIDockingElement.m_aFloatingData.m_aSize); - } - else - { - if ( isDefaultPos( aUIDockingElement.m_aDockedData.m_aPos )) - { - // Docking on its default position without a preset position - - // we have to find a good place for it. - ::Point aPixelPos; - awt::Point aDockPos; - ::Size aSize; - - { - SolarMutexGuard aGuard; - if ( pToolBox ) - aSize = pToolBox->CalcWindowSizePixel( 1, ImplConvertAlignment( aUIDockingElement.m_aDockedData.m_nDockedArea ) ); - else - aSize = pWindow->GetSizePixel(); - } - - implts_findNextDockingPos((ui::DockingArea)aUIDockingElement.m_aDockedData.m_nDockedArea, aSize, aDockPos, aPixelPos ); - aUIDockingElement.m_aDockedData.m_aPos = aDockPos; - } - - SolarMutexGuard aGuard; - if ( pToolBox ) - { - pToolBox->SetAlign( ImplConvertAlignment( aUIDockingElement.m_aDockedData.m_nDockedArea) ); - ::Size aSize = pToolBox->CalcWindowSizePixel( 1 ); - awt::Rectangle aRect = xWindow->getPosSize(); - xWindow->setPosSize( aRect.X, aRect.Y, 0, 0, awt::PosSize::POS ); - xWindow->setOutputSize( AWTSize( aSize ) ); - } - } - - implts_setLayoutInProgress( false ); - implts_setToolbar( aUIDockingElement ); - implts_writeWindowStateData( aUIDockingElement ); - implts_sortUIElements(); - implts_setLayoutDirty(); - - aReadLock.lock(); - ILayoutNotifications* pParentLayouter( m_pParentLayouter ); - aReadLock.unlock(); - - if ( pParentLayouter ) - pParentLayouter->requestLayout( ILayoutNotifications::HINT_TOOLBARSPACE_HAS_CHANGED ); - } - } - else - { - SolarMutexGuard aGuard; - if ( pToolBox ) - { - if ( aUIDockingElement.m_bFloating ) - { - if ( aUIDockingElement.m_aFloatingData.m_bIsHorizontal ) - pToolBox->SetAlign( WINDOWALIGN_TOP ); - else - pToolBox->SetAlign( WINDOWALIGN_LEFT ); - } - else - pToolBox->SetAlign( ImplConvertAlignment( aUIDockingElement.m_aDockedData.m_nDockedArea) ); - } - } -} - -void SAL_CALL ToolbarLayoutManager::closed( const lang::EventObject& e ) -throw (uno::RuntimeException) -{ - rtl::OUString aName; - UIElement aUIElement; - UIElementVector::iterator pIter; - - WriteGuard aWriteLock( m_aLock ); - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - uno::Reference< ui::XUIElement > xUIElement( pIter->m_xUIElement ); - if ( xUIElement.is() ) - { - uno::Reference< uno::XInterface > xIfac( xUIElement->getRealInterface(), uno::UNO_QUERY ); - if ( xIfac == e.Source ) - { - aName = pIter->m_aName; - - // user closes a toolbar => - // context sensitive toolbar: only destroy toolbar and store state. - // context sensitive toolbar: make it invisible, store state and destroy it. - if ( !pIter->m_bContextSensitive ) - pIter->m_bVisible = sal_False; - - aUIElement = *pIter; - break; - } - } - } - aWriteLock.unlock(); - - // destroy element - if ( aName.getLength() > 0 ) - { - implts_writeWindowStateData( aUIElement ); - destroyToolbar( aName ); - } -} - -void SAL_CALL ToolbarLayoutManager::endPopupMode( const awt::EndPopupModeEvent& /*e*/ ) -throw (uno::RuntimeException) -{ -} - -//--------------------------------------------------------------------------------------------------------- -// XUIConfigurationListener -//--------------------------------------------------------------------------------------------------------- -void SAL_CALL ToolbarLayoutManager::elementInserted( const ui::ConfigurationEvent& rEvent ) -throw (uno::RuntimeException) -{ - UIElement aUIElement = implts_findToolbar( rEvent.ResourceURL ); - - uno::Reference< ui::XUIElementSettings > xElementSettings( aUIElement.m_xUIElement, uno::UNO_QUERY ); - if ( xElementSettings.is() ) - { - ::rtl::OUString aConfigSourcePropName( RTL_CONSTASCII_USTRINGPARAM( "ConfigurationSource" )); - uno::Reference< beans::XPropertySet > xPropSet( xElementSettings, uno::UNO_QUERY ); - if ( xPropSet.is() ) - { - if ( rEvent.Source == uno::Reference< uno::XInterface >( m_xDocCfgMgr, uno::UNO_QUERY )) - xPropSet->setPropertyValue( aConfigSourcePropName, makeAny( m_xDocCfgMgr )); - } - xElementSettings->updateSettings(); - } - else - { - ::rtl::OUString aElementType; - ::rtl::OUString aElementName; - parseResourceURL( rEvent.ResourceURL, aElementType, aElementName ); - if ( aElementName.indexOf( m_aCustomTbxPrefix ) != -1 ) - { - // custom toolbar must be directly created, shown and layouted! - createToolbar( rEvent.ResourceURL ); - uno::Reference< ui::XUIElement > xUIElement = getToolbar( rEvent.ResourceURL ); - if ( xUIElement.is() ) - { - ::rtl::OUString aUIName; - uno::Reference< ui::XUIConfigurationManager > xCfgMgr; - uno::Reference< beans::XPropertySet > xPropSet; - - try - { - xCfgMgr = uno::Reference< ui::XUIConfigurationManager >( rEvent.Source, uno::UNO_QUERY ); - xPropSet = uno::Reference< beans::XPropertySet >( xCfgMgr->getSettings( rEvent.ResourceURL, sal_False ), uno::UNO_QUERY ); - - if ( xPropSet.is() ) - xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UIName" ))) >>= aUIName; - } - catch (const container::NoSuchElementException&) - { - } - catch (const beans::UnknownPropertyException&) - { - } - catch (const lang::WrappedTargetException&) - { - } - - { - SolarMutexGuard aGuard; - Window* pWindow = getWindowFromXUIElement( xUIElement ); - if ( pWindow ) - pWindow->SetText( aUIName ); - } - - showToolbar( rEvent.ResourceURL ); - } - } - } -} - -void SAL_CALL ToolbarLayoutManager::elementRemoved( const ui::ConfigurationEvent& rEvent ) -throw (uno::RuntimeException) -{ - ReadGuard aReadLock( m_aLock ); - uno::Reference< awt::XWindow > xContainerWindow( m_xContainerWindow, uno::UNO_QUERY ); - uno::Reference< ui::XUIConfigurationManager > xModuleCfgMgr( m_xModuleCfgMgr ); - uno::Reference< ui::XUIConfigurationManager > xDocCfgMgr( m_xDocCfgMgr ); - aReadLock.unlock(); - - UIElement aUIElement = implts_findToolbar( rEvent.ResourceURL ); - uno::Reference< ui::XUIElementSettings > xElementSettings( aUIElement.m_xUIElement, uno::UNO_QUERY ); - if ( xElementSettings.is() ) - { - bool bNoSettings( false ); - ::rtl::OUString aConfigSourcePropName( RTL_CONSTASCII_USTRINGPARAM( "ConfigurationSource" )); - uno::Reference< uno::XInterface > xElementCfgMgr; - uno::Reference< beans::XPropertySet > xPropSet( xElementSettings, uno::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 ( rEvent.Source == xElementCfgMgr ) - { - // Same UI configuration manager where our element has its settings - if ( rEvent.Source == uno::Reference< uno::XInterface >( xDocCfgMgr, uno::UNO_QUERY )) - { - // document settings removed - if ( xModuleCfgMgr->hasSettings( rEvent.ResourceURL )) - { - xPropSet->setPropertyValue( aConfigSourcePropName, makeAny( xModuleCfgMgr )); - xElementSettings->updateSettings(); - return; - } - } - - bNoSettings = true; - } - - // No settings anymore, element must be destroyed - if ( xContainerWindow.is() && bNoSettings ) - destroyToolbar( rEvent.ResourceURL ); - } -} - -void SAL_CALL ToolbarLayoutManager::elementReplaced( const ui::ConfigurationEvent& rEvent ) -throw (uno::RuntimeException) -{ - UIElement aUIElement = implts_findToolbar( rEvent.ResourceURL ); - - uno::Reference< ui::XUIElementSettings > xElementSettings( aUIElement.m_xUIElement, uno::UNO_QUERY ); - if ( xElementSettings.is() ) - { - ::rtl::OUString aConfigSourcePropName( RTL_CONSTASCII_USTRINGPARAM( "ConfigurationSource" )); - uno::Reference< uno::XInterface > xElementCfgMgr; - uno::Reference< beans::XPropertySet > xPropSet( xElementSettings, uno::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 ( rEvent.Source == xElementCfgMgr ) - { - xElementSettings->updateSettings(); - - WriteGuard aWriteLock( m_aLock ); - bool bNotify = !aUIElement.m_bFloating; - m_bLayoutDirty = bNotify; - ILayoutNotifications* pParentLayouter( m_pParentLayouter ); - aWriteLock.unlock(); - - if ( bNotify && pParentLayouter ) - pParentLayouter->requestLayout( ILayoutNotifications::HINT_TOOLBARSPACE_HAS_CHANGED ); - } - } -} - -uno::Reference< ui::XUIElement > ToolbarLayoutManager::getToolbar( const ::rtl::OUString& aName ) -{ - return implts_findToolbar( aName ).m_xUIElement; -} - -uno::Sequence< uno::Reference< ui::XUIElement > > ToolbarLayoutManager::getToolbars() -{ - uno::Sequence< uno::Reference< ui::XUIElement > > aSeq; - - ReadGuard aReadLock( m_aLock ); - if ( m_aUIElements.size() > 0 ) - { - sal_uInt32 nCount(0); - UIElementVector::iterator pIter; - for ( pIter = m_aUIElements.begin(); pIter != m_aUIElements.end(); ++pIter ) - { - if ( pIter->m_xUIElement.is() ) - { - ++nCount; - aSeq.realloc( nCount ); - aSeq[nCount-1] = pIter->m_xUIElement; - } - } - } - - return aSeq; -} - -bool ToolbarLayoutManager::floatToolbar( const ::rtl::OUString& rResourceURL ) -{ - UIElement aUIElement = implts_findToolbar( rResourceURL ); - if ( aUIElement.m_xUIElement.is() ) - { - try - { - uno::Reference< awt::XDockableWindow > xDockWindow( aUIElement.m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - if ( xDockWindow.is() && !xDockWindow->isFloating() ) - { - aUIElement.m_bFloating = true; - implts_writeWindowStateData( aUIElement ); - xDockWindow->setFloatingMode( true ); - - implts_setLayoutDirty(); - implts_setToolbar( aUIElement ); - return true; - } - } - catch (const lang::DisposedException&) - { - } - } - - return false; -} - -bool ToolbarLayoutManager::lockToolbar( const ::rtl::OUString& rResourceURL ) -{ - UIElement aUIElement = implts_findToolbar( rResourceURL ); - if ( aUIElement.m_xUIElement.is() ) - { - try - { - uno::Reference< awt::XDockableWindow > xDockWindow( aUIElement.m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - if ( xDockWindow.is() && !xDockWindow->isFloating() && !xDockWindow->isLocked() ) - { - aUIElement.m_aDockedData.m_bLocked = true; - implts_writeWindowStateData( aUIElement ); - xDockWindow->lock(); - - implts_setLayoutDirty(); - implts_setToolbar( aUIElement ); - return true; - } - } - catch (const lang::DisposedException&) - { - } - } - - return false; -} - -bool ToolbarLayoutManager::unlockToolbar( const ::rtl::OUString& rResourceURL ) -{ - UIElement aUIElement = implts_findToolbar( rResourceURL ); - if ( aUIElement.m_xUIElement.is() ) - { - try - { - uno::Reference< awt::XDockableWindow > xDockWindow( aUIElement.m_xUIElement->getRealInterface(), uno::UNO_QUERY ); - if ( xDockWindow.is() && !xDockWindow->isFloating() && xDockWindow->isLocked() ) - { - aUIElement.m_aDockedData.m_bLocked = false; - implts_writeWindowStateData( aUIElement ); - xDockWindow->unlock(); - - implts_setLayoutDirty(); - implts_setToolbar( aUIElement ); - return true; - } - } - catch (const lang::DisposedException&) - { - } - } - - return false; -} - -bool ToolbarLayoutManager::isToolbarVisible( const ::rtl::OUString& rResourceURL ) -{ - uno::Reference< awt::XWindow2 > xWindow2( implts_getXWindow( rResourceURL ), uno::UNO_QUERY ); - return ( xWindow2.is() && xWindow2->isVisible() ); -} - -bool ToolbarLayoutManager::isToolbarFloating( const ::rtl::OUString& rResourceURL ) -{ - uno::Reference< awt::XDockableWindow > xDockWindow( implts_getXWindow( rResourceURL ), uno::UNO_QUERY ); - return ( xDockWindow.is() && xDockWindow->isFloating() ); -} - -bool ToolbarLayoutManager::isToolbarDocked( const ::rtl::OUString& rResourceURL ) -{ - return !isToolbarFloating( rResourceURL ); -} - -bool ToolbarLayoutManager::isToolbarLocked( const ::rtl::OUString& rResourceURL ) -{ - uno::Reference< awt::XDockableWindow > xDockWindow( implts_getXWindow( rResourceURL ), uno::UNO_QUERY ); - return ( xDockWindow.is() && xDockWindow->isLocked() ); -} - -awt::Size ToolbarLayoutManager::getToolbarSize( const ::rtl::OUString& rResourceURL ) -{ - Window* pWindow = implts_getWindow( rResourceURL ); - - SolarMutexGuard aGuard; - if ( pWindow ) - { - ::Size aSize = pWindow->GetSizePixel(); - awt::Size aWinSize; - aWinSize.Width = aSize.Width(); - aWinSize.Height = aSize.Height(); - return aWinSize; - } - - return awt::Size(); -} - -awt::Point ToolbarLayoutManager::getToolbarPos( const ::rtl::OUString& rResourceURL ) -{ - awt::Point aPos; - UIElement aUIElement = implts_findToolbar( rResourceURL ); - - uno::Reference< awt::XWindow > xWindow( implts_getXWindow( rResourceURL )); - if ( xWindow.is() ) - { - if ( aUIElement.m_bFloating ) - { - awt::Rectangle aRect = xWindow->getPosSize(); - aPos.X = aRect.X; - aPos.Y = aRect.Y; - } - else - aPos = aUIElement.m_aDockedData.m_aPos; - } - - return aPos; -} - -void ToolbarLayoutManager::setToolbarSize( const ::rtl::OUString& rResourceURL, const awt::Size& aSize ) -{ - uno::Reference< awt::XWindow2 > xWindow( implts_getXWindow( rResourceURL ), uno::UNO_QUERY ); - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - UIElement aUIElement = implts_findToolbar( rResourceURL ); - - if ( xWindow.is() && xDockWindow.is() && xDockWindow->isFloating() ) - { - xWindow->setOutputSize( aSize ); - aUIElement.m_aFloatingData.m_aSize = aSize; - implts_setToolbar( aUIElement ); - implts_writeWindowStateData( aUIElement ); - implts_sortUIElements(); - } -} - -void ToolbarLayoutManager::setToolbarPos( const ::rtl::OUString& rResourceURL, const awt::Point& aPos ) -{ - uno::Reference< awt::XWindow > xWindow( implts_getXWindow( rResourceURL )); - uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY ); - UIElement aUIElement = implts_findToolbar( rResourceURL ); - - if ( xWindow.is() && xDockWindow.is() && xDockWindow->isFloating() ) - { - xWindow->setPosSize( aPos.X, aPos.Y, 0, 0, awt::PosSize::POS ); - aUIElement.m_aFloatingData.m_aPos = aPos; - implts_setToolbar( aUIElement ); - implts_writeWindowStateData( aUIElement ); - implts_sortUIElements(); - } -} - -void ToolbarLayoutManager::setToolbarPosSize( const ::rtl::OUString& rResourceURL, const awt::Point& aPos, const awt::Size& aSize ) -{ - setToolbarPos( rResourceURL, aPos ); - setToolbarSize( rResourceURL, aSize ); -} - -} // namespace framework - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |