Author: orw Date: Fri Apr 5 11:24:49 2013 New Revision: 1464927 URL: http://svn.apache.org/r1464927 Log: #121933# - some improvement to the docking area layout on a undock-dock-cycle of a window
Modified: openoffice/trunk/main/sfx2/source/dialog/splitwin.cxx Modified: openoffice/trunk/main/sfx2/source/dialog/splitwin.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sfx2/source/dialog/splitwin.cxx?rev=1464927&r1=1464926&r2=1464927&view=diff ============================================================================== --- openoffice/trunk/main/sfx2/source/dialog/splitwin.cxx (original) +++ openoffice/trunk/main/sfx2/source/dialog/splitwin.cxx Fri Apr 5 11:24:49 2013 @@ -51,6 +51,9 @@ #include <sfx2/msgpool.hxx> #include <sfx2/viewfrm.hxx> +#include <vector> +#include <utility> + using namespace ::com::sun::star::uno; using namespace ::rtl; @@ -58,6 +61,35 @@ using namespace ::rtl; #define nPixel 30L #define USERITEM_NAME OUString::createFromAscii( "UserItem" ) +namespace { + // helper class to deactivate UpdateMode, if needed, for the life time of an instance + class DeactivateUpdateMode + { + public: + explicit DeactivateUpdateMode( SfxSplitWindow& rSplitWindow ) + : mrSplitWindow( rSplitWindow ) + , mbUpdateMode( rSplitWindow.IsUpdateMode() ) + { + if ( mbUpdateMode ) + { + mrSplitWindow.SetUpdateMode( sal_False ); + } + } + + ~DeactivateUpdateMode( void ) + { + if ( mbUpdateMode ) + { + mrSplitWindow.SetUpdateMode( sal_True ); + } + } + + private: + SfxSplitWindow& mrSplitWindow; + const sal_Bool mbUpdateMode; + }; +} + struct SfxDock_Impl { sal_uInt16 nType; @@ -394,38 +426,52 @@ void SfxSplitWindow::SplitResize() void SfxSplitWindow::Split() { - if ( pEmptyWin ) - pEmptyWin->bSplit = sal_False; + if ( pEmptyWin ) + pEmptyWin->bSplit = sal_False; - SplitWindow::Split(); + SplitWindow::Split(); - sal_uInt16 nCount = pDockArr->Count(); - for ( sal_uInt16 n=0; n<nCount; n++ ) - { - SfxDock_Impl *pD = (*pDockArr)[n]; - if ( pD->pWin ) - { - sal_uInt16 nId = pD->nType; - long nSize = GetItemSize( nId, SWIB_FIXED ); - long nSetSize = GetItemSize( GetSet( nId ) ); - Size aSize; + std::vector< std::pair< sal_uInt16, long > > aNewOrgSizes; - if ( IsHorizontal() ) - { - aSize.Width() = nSize; - aSize.Height() = nSetSize; - } - else - { - aSize.Width() = nSetSize; - aSize.Height() = nSize; - } + sal_uInt16 nCount = pDockArr->Count(); + for ( sal_uInt16 n=0; n<nCount; n++ ) + { + SfxDock_Impl *pD = (*pDockArr)[n]; + if ( pD->pWin ) + { + const sal_uInt16 nId = pD->nType; + const long nSize = GetItemSize( nId, SWIB_FIXED ); + const long nSetSize = GetItemSize( GetSet( nId ) ); + Size aSize; - pD->pWin->SetItemSize_Impl( aSize ); - } - } + if ( IsHorizontal() ) + { + aSize.Width() = nSize; + aSize.Height() = nSetSize; + } + else + { + aSize.Width() = nSetSize; + aSize.Height() = nSize; + } - SaveConfig_Impl(); + pD->pWin->SetItemSize_Impl( aSize ); + + aNewOrgSizes.push_back( std::pair< sal_uInt16, long >( nId, nSize ) ); + } + } + + // workaround insuffiency of <SplitWindow> regarding dock layouting: + // apply FIXED item size as 'original' item size to improve layouting of undock-dock-cycle of a window + { + DeactivateUpdateMode aDeactivateUpdateMode( *this ); + for ( sal_uInt16 i = 0; i < aNewOrgSizes.size(); ++i ) + { + SetItemSize( aNewOrgSizes[i].first, aNewOrgSizes[i].second ); + } + } + + SaveConfig_Impl(); } //------------------------------------------------------------------------- @@ -684,9 +730,7 @@ void SfxSplitWindow::InsertWindow_Impl( pDock->nSize = nWinSize; - sal_Bool bUpdateMode = IsUpdateMode(); - if ( bUpdateMode ) - SetUpdateMode( sal_False ); + DeactivateUpdateMode* pDeactivateUpdateMode = new DeactivateUpdateMode( *this ); if ( bNewLine || nLine == GetItemCount( 0 ) ) { @@ -759,9 +803,32 @@ void SfxSplitWindow::InsertWindow_Impl( pWorkWin->ShowChilds_Impl(); } - if ( bUpdateMode ) - SetUpdateMode( sal_True ); - bLocked = sal_False; + delete pDeactivateUpdateMode; + bLocked = sal_False; + + // workaround insuffiency of <SplitWindow> regarding dock layouting: + // apply FIXED item size as 'original' item size to improve layouting of undock-dock-cycle of a window + { + std::vector< std::pair< sal_uInt16, long > > aNewOrgSizes; + // get FIXED item sizes + sal_uInt16 nCount = pDockArr->Count(); + for ( sal_uInt16 n=0; n<nCount; n++ ) + { + SfxDock_Impl *pD = (*pDockArr)[n]; + if ( pD->pWin ) + { + const sal_uInt16 nId = pD->nType; + const long nSize = GetItemSize( nId, SWIB_FIXED ); + aNewOrgSizes.push_back( std::pair< sal_uInt16, long >( nId, nSize ) ); + } + } + // apply new item sizes + DeactivateUpdateMode aDeactivateUpdateMode( *this ); + for ( sal_uInt16 i = 0; i < aNewOrgSizes.size(); ++i ) + { + SetItemSize( aNewOrgSizes[i].first, aNewOrgSizes[i].second ); + } + } } //------------------------------------------------------------------------- @@ -817,19 +884,16 @@ void SfxSplitWindow::RemoveWindow( SfxDo // Fenster removen, und wenn es das letzte der Zeile war, auch die Zeile // ( Zeile = ItemSet ) - sal_Bool bUpdateMode = IsUpdateMode(); - if ( bUpdateMode ) - SetUpdateMode( sal_False ); - bLocked = sal_True; + DeactivateUpdateMode* pDeactivateUpdateMode = new DeactivateUpdateMode( *this ); + bLocked = sal_True; RemoveItem( pDockWin->GetType() ); if ( nSet && !GetItemCount( nSet ) ) RemoveItem( nSet ); - if ( bUpdateMode ) - SetUpdateMode( sal_True ); - bLocked = sal_False; + delete pDeactivateUpdateMode; + bLocked = sal_False; }; //-------------------------------------------------------------------------