You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by or...@apache.org on 2014/03/10 10:37:03 UTC
svn commit: r1575876 - in
/openoffice/trunk/main/framework/source/layoutmanager:
toolbarlayoutmanager.cxx toolbarlayoutmanager.hxx
Author: orw
Date: Mon Mar 10 09:37:02 2014
New Revision: 1575876
URL: http://svn.apache.org/r1575876
Log:
124355: Toolbarmanager: correct show/hide of toolbars; correct calculation of docking area sizes
Modified:
openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.cxx
openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.hxx
Modified: openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.cxx?rev=1575876&r1=1575875&r2=1575876&view=diff
==============================================================================
--- openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.cxx (original)
+++ openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.cxx Mon Mar 10 09:37:02 2014
@@ -259,110 +259,107 @@ void ToolbarLayoutManager::doLayout(cons
bool ToolbarLayoutManager::implts_isParentWindowVisible() const
{
ReadGuard aReadLock( m_aLock );
- bool bVisible( false );
+ bool bVisible( false );
if ( m_xContainerWindow.is() )
bVisible = m_xContainerWindow->isVisible();
return bVisible;
}
-Rectangle ToolbarLayoutManager::implts_calcDockingArea()
+namespace
{
- ReadGuard aReadLock( m_aLock );
- UIElementVector aWindowVector( m_aUIElements );
- aReadLock.unlock();
+ void insertDockingAreaSize(
+ const UIElement& rUIElement,
+ const awt::Rectangle& rUIElementPosSize,
+ std::vector< sal_Int32 >& rDockingAreaData )
+ {
+ sal_Int32 nAreaPos = 0;
+ sal_Int32 nSize = 0;
+ if ( isHorizontalDockingArea( rUIElement.m_aDockedData.m_nDockedArea ) )
+ {
+ nAreaPos = rUIElement.m_aDockedData.m_aPos.Y();
+ nSize = rUIElementPosSize.Height;
+ }
+ else
+ {
+ nAreaPos = rUIElement.m_aDockedData.m_aPos.X();
+ nSize = rUIElementPosSize.Width;
+ }
- 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;
+ const sal_uInt32 nIndexPos = nAreaPos >= 0 ? static_cast< sal_uInt32 >(nAreaPos) : 0;
+ if ( rDockingAreaData.size() < nIndexPos + 1 )
+ {
+ rDockingAreaData.resize( nIndexPos + 1, 0 );
+ }
- // initialize rectangle with zero values!
- aBorderSpace.setWidth(0);
- aBorderSpace.setHeight(0);
+ if ( rDockingAreaData[nIndexPos] < nSize )
+ {
+ rDockingAreaData[nIndexPos] = nSize;
+ }
+ }
- aRowColumnSizes[nCurrDockingArea].clear();
- aRowColumnSizes[nCurrDockingArea].push_back( 0 );
- for ( pConstIter = aWindowVector.begin(); pConstIter != aWindowVector.end(); pConstIter++ )
+ sal_Int32 calcDockingAreaSize( const std::vector< sal_Int32 >& rDockingAreaData )
{
- uno::Reference< ui::XUIElement > xUIElement( pConstIter->m_xUIElement, uno::UNO_QUERY );
- if ( xUIElement.is() )
+ sal_Int32 nDockingAreaSize = 0;
+
+ std::vector< sal_Int32 >::const_iterator iDockingAreaDataEnd = rDockingAreaData.end();
+ for ( std::vector< sal_Int32 >::const_iterator iDockingAreaData = rDockingAreaData.begin();
+ iDockingAreaData != iDockingAreaDataEnd;
+ ++iDockingAreaData )
{
- uno::Reference< awt::XWindow > xWindow( xUIElement->getRealInterface(), uno::UNO_QUERY );
- uno::Reference< awt::XDockableWindow > xDockWindow( xWindow, uno::UNO_QUERY );
- if ( xWindow.is() && xDockWindow.is() )
- {
- vos::OGuard aGuard( Application::GetSolarMutex() );
+ nDockingAreaSize += *(iDockingAreaData);
+ }
- 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 );
- }
+ return nDockingAreaSize;
+ }
+}
- 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 );
- }
+Rectangle ToolbarLayoutManager::implts_calcDockingArea()
+{
+ Rectangle aBorderSpace( 0, 0, 0, 0 );
- if ( aPosSize.Width > aRowColumnSizes[nCurrDockingArea][nCurrRowColumn] )
- aRowColumnSizes[nCurrDockingArea][nCurrRowColumn] = aPosSize.Width;
- }
+ // For each docking area one container of UIElement sizes.
+ std::vector< std::vector< sal_Int32 > >aDockingAreaSizeDatas( DOCKINGAREAS_COUNT );
+
+ {
+ ReadGuard aReadLock( m_aLock );
+ vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ // Iterate over the UIElements and collect corresponding docking area data
+ // for non-floating and visible ones separated for the each docking area.
+ // Note: For each docking area row resp. column only the size of largest UIElement is collected.
+ for ( UIElementVector::const_iterator pConstIter = m_aUIElements.begin(); pConstIter != m_aUIElements.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() )
+ {
+ Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
+ if ( pWindow && !xDockWindow->isFloating() && pConstIter->m_bVisible )
+ {
+ const awt::Rectangle aPosSize = xWindow->getPosSize();
+ insertDockingAreaSize(
+ *(pConstIter),
+ aPosSize,
+ aDockingAreaSizeDatas[pConstIter->m_aDockedData.m_nDockedArea] );
}
}
}
}
- }
- // 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;
- }
+ aReadLock.unlock();
}
+ aBorderSpace.Top() = calcDockingAreaSize( aDockingAreaSizeDatas[ui::DockingArea_DOCKINGAREA_TOP] );
+ aBorderSpace.Bottom() = calcDockingAreaSize( aDockingAreaSizeDatas[ui::DockingArea_DOCKINGAREA_BOTTOM] );
+ aBorderSpace.Left() = calcDockingAreaSize( aDockingAreaSizeDatas[ui::DockingArea_DOCKINGAREA_LEFT] );
+ aBorderSpace.Right() = calcDockingAreaSize( aDockingAreaSizeDatas[ui::DockingArea_DOCKINGAREA_RIGHT] );
+
return aBorderSpace;
}
@@ -553,62 +550,67 @@ void ToolbarLayoutManager::destroyToolba
}
}
-bool ToolbarLayoutManager::showToolbar( const ::rtl::OUString& rResourceURL )
+bool ToolbarLayoutManager::implts_setToolbarVisibility(
+ bool bVisible,
+ UIElement aUIElement )
{
- UIElement aUIElement = implts_findToolbar( rResourceURL );
-
+ bool bRet = false;
+
vos::OGuard aGuard( Application::GetSolarMutex() );
Window* pWindow = getWindowFromXUIElement( aUIElement.m_xUIElement );
if ( pWindow )
{
+ if ( bVisible )
+ {
+ pWindow->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE );
+ }
+ else
+ {
+ pWindow->Show( sal_False );
+ }
if ( !aUIElement.m_bFloating )
+ {
implts_setLayoutDirty();
- else
- pWindow->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE );
-
- aUIElement.m_bVisible = true;
+ }
+ aUIElement.m_bVisible = bVisible;
implts_writeWindowStateData( aUIElement );
implts_setToolbar( aUIElement );
- return true;
+
+ bRet = true;
}
-
- return false;
+
+ return bRet;
}
-bool ToolbarLayoutManager::hideToolbar( const ::rtl::OUString& rResourceURL )
+bool ToolbarLayoutManager::showToolbar( const ::rtl::OUString& rResourceURL )
{
UIElement aUIElement = implts_findToolbar( rResourceURL );
+ const bool bRet = implts_setToolbarVisibility( true, aUIElement );
+ implts_sortUIElements();
+ return bRet;
+}
- vos::OGuard aGuard( Application::GetSolarMutex() );
- 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;
+bool ToolbarLayoutManager::hideToolbar( const ::rtl::OUString& rResourceURL )
+{
+ UIElement aUIElement = implts_findToolbar( rResourceURL );
+ const bool bRet = implts_setToolbarVisibility( false, aUIElement );
+ implts_sortUIElements();
+ return bRet;
}
void ToolbarLayoutManager::refreshToolbarsVisibility( bool bAutomaticToolbars )
{
- UIElementVector aUIElementVector;
+ if ( !bAutomaticToolbars )
+ return;
ReadGuard aReadLock( m_aLock );
- bool bVisible( m_bVisible );
- aReadLock.unlock();
-
- if ( !bVisible || !bAutomaticToolbars )
+ if ( !m_bVisible )
return;
+ aReadLock.unlock();
+ UIElementVector aUIElementVector;
implts_getUIElementVectorCopy( aUIElementVector );
-
+
UIElement aUIElement;
vos::OGuard aGuard( Application::GetSolarMutex() );
UIElementVector::iterator pIter;
@@ -655,28 +657,17 @@ void ToolbarLayoutManager::setVisible( b
{
UIElementVector aUIElementVector;
implts_getUIElementVectorCopy( aUIElementVector );
-
+
vos::OGuard aGuard( Application::GetSolarMutex() );
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();
- }
- }
+ implts_setToolbarVisibility( bVisible, *pIter );
}
-
+
+ implts_sortUIElements();
+
if ( !bVisible )
resetDockingArea();
}
Modified: openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.hxx?rev=1575876&r1=1575875&r2=1575876&view=diff
==============================================================================
--- openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.hxx (original)
+++ openoffice/trunk/main/framework/source/layoutmanager/toolbarlayoutmanager.hxx Mon Mar 10 09:37:02 2014
@@ -219,6 +219,7 @@ class ToolbarLayoutManager : public ::cp
rtl::OUString implts_generateGenericAddonToolbarTitle( sal_Int32 nNumber ) const;
void implts_setElementData( UIElement& rUIElement, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDockableWindow >& rDockWindow );
void implts_destroyDockingAreaWindows();
+ bool implts_setToolbarVisibility( bool bVisible, UIElement aUIElement );
//---------------------------------------------------------------------------------------------------------
// layout methods
@@ -233,7 +234,7 @@ class ToolbarLayoutManager : public ::cp
void implts_setLayoutDirty();
void implts_setLayoutInProgress( bool bInProgress = true );
bool implts_isLayoutInProgress() const { return m_bLayoutInProgress; }
-
+
//---------------------------------------------------------------------------------------------------------
// lookup/container methods
//---------------------------------------------------------------------------------------------------------
@@ -246,7 +247,7 @@ class ToolbarLayoutManager : public ::cp
void implts_setToolbar( const UIElement& rUIElement );
::Size implts_getTopBottomDockingAreaSizes();
void implts_getUIElementVectorCopy( UIElementVector& rCopy );
-
+
//---------------------------------------------------------------------------------------------------------
// internal docking methods
//---------------------------------------------------------------------------------------------------------
@@ -265,12 +266,12 @@ class ToolbarLayoutManager : public ::cp
const ::Rectangle& rTrackingRect,
const ::Rectangle& rRowColumnRect,
const ::Size& rContainerWinSize );
-
+
void implts_getDockingAreaElementInfos( ::com::sun::star::ui::DockingArea DockingArea, std::vector< SingleRowColumnWindowData >& rRowColumnsWindowData );
void implts_getDockingAreaElementInfoOnSingleRowCol( ::com::sun::star::ui::DockingArea, sal_Int32 nRowCol, SingleRowColumnWindowData& rRowColumnWindowData );
void implts_findNextDockingPos( ::com::sun::star::ui::DockingArea DockingArea, const ::Size& aUIElementSize, ::Point& rVirtualPos, ::Point& rPixelPos );
void implts_setTrackingRect( ::com::sun::star::ui::DockingArea eDockingArea, const ::Point& rMousePos, ::Rectangle& rTrackingRect );
-
+
//---------------------------------------------------------------------------------------------------------
// creation methods
//---------------------------------------------------------------------------------------------------------
@@ -283,14 +284,14 @@ class ToolbarLayoutManager : public ::cp
css::uno::Reference< css::ui::XUIElement > implts_createElement( const ::rtl::OUString& aName );
void implts_setToolbarCreation( bool bStart = true );
bool implts_isToolbarCreationActive();
-
+
//---------------------------------------------------------------------------------------------------------
// persistence methods
//---------------------------------------------------------------------------------------------------------
sal_Bool implts_readWindowStateData( const rtl::OUString& aName, UIElement& rElementData );
void implts_writeWindowStateData( const UIElement& rElementData );
void implts_writeNewWindowStateData( const rtl::OUString aName, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& xWindow );
-
+
//---------------------------------------------------------------------------------------------------------
// members
//---------------------------------------------------------------------------------------------------------