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


Reply via email to