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;
};
//-------------------------------------------------------------------------