[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - sw/source

Michael Stahl mstahl at redhat.com
Tue Jun 25 10:06:16 PDT 2013


 sw/source/core/view/viewsh.cxx |   73 ++++++++++++++++++++++-------------------
 1 file changed, 40 insertions(+), 33 deletions(-)

New commits:
commit 280a43a8e35993eb5ec7d317599eb7cffb5d8e7f
Author: Michael Stahl <mstahl at redhat.com>
Date:   Mon Jun 24 18:09:35 2013 +0200

    fdo#43765, fdo#57884, fdo#58052, fdo#63949: disappearing form controls
    
    Transparent form controls in Writer may not be painted properly, if
    painted from ViewShell::ImplUnlockPaint(true), called from
    SwLayIdle::SwLayIdle.
    
    The problem is that SdrPaintWindow::OutputPreRenderDevice will paint
    the background of the transparent form controls (thus over-painting the
    controls), so it has to be followed by painting the controls themselves.
    
    Change-Id: Icda4ad835a398bbd50139be32ff5014a34f23bd5
    (cherry picked from commit cfa994ccbd6ee681f5ab3648ce068c4881b495f5)
    Reviewed-on: https://gerrit.libreoffice.org/4486
    Reviewed-by: Thorsten Behrens <tbehrens at suse.com>
    Tested-by: Thorsten Behrens <tbehrens at suse.com>

diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index b1ac5c3..993a037 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -101,6 +101,43 @@ void ViewShell::ToggleHeaderFooterEdit()
     GetWin()->Invalidate();
 }
 
+static void
+lcl_PaintTransparentFormControls(ViewShell & rShell, SwRect const& rRect)
+{
+    // Direct paint has been performed: the background of transparent child
+    // windows has been painted, so need to paint the child windows now.
+    if (rShell.GetWin())
+    {
+        Window& rWindow = *(rShell.GetWin());
+        if (rWindow.IsChildTransparentModeEnabled())
+        {
+            Window * pCandidate = rWindow.GetWindow( WINDOW_FIRSTCHILD );
+            if (pCandidate)
+            {
+                const Rectangle aRectanglePixel(
+                            rWindow.LogicToPixel(rRect.SVRect()));
+                while (pCandidate)
+                {
+                    if (pCandidate->IsPaintTransparent())
+                    {
+                        const Rectangle aCandidatePosSizePixel(
+                                        pCandidate->GetPosPixel(),
+                                        pCandidate->GetSizePixel());
+
+                        if (aCandidatePosSizePixel.IsOver(aRectanglePixel))
+                        {
+                            pCandidate->Invalidate(
+                                INVALIDATE_NOTRANSPARENT|INVALIDATE_CHILDREN );
+                            pCandidate->Update();
+                        }
+                    }
+                    pCandidate = pCandidate->GetWindow( WINDOW_NEXT );
+                }
+            }
+        }
+    }
+}
+
 // #i72754# 2nd set of Pre/PostPaints
 // This time it uses the lock counter (mPrePostPaintRegions empty/non-empty) to allow only one activation
 // and deactivation and mpPrePostOutDev to remember the OutDev from the BeginDrawLayers
@@ -358,39 +395,7 @@ void ViewShell::ImplEndAction( const sal_Bool bIdleEnd )
                         DLPostPaint2(true);
                     }
 
-                    // #i107365#
-                    // Direct paint has been performed. Thus, take care of
-                    // transparent child windows.
-                    if ( GetWin() )
-                    {
-                        Window& rWindow = *(GetWin());
-                        if (rWindow.IsChildTransparentModeEnabled())
-                        {
-                            Window* pCandidate = rWindow.GetWindow( WINDOW_FIRSTCHILD );
-                            if (pCandidate)
-                            {
-                                const Rectangle aRectanglePixel(rWindow.LogicToPixel(aRect.SVRect()));
-
-                                while (pCandidate)
-                                {
-                                    if ( pCandidate->IsPaintTransparent() )
-                                    {
-                                        const Rectangle aCandidatePosSizePixel(
-                                                        pCandidate->GetPosPixel(),
-                                                        pCandidate->GetSizePixel());
-
-                                        if ( aCandidatePosSizePixel.IsOver(aRectanglePixel) )
-                                        {
-                                            pCandidate->Invalidate( INVALIDATE_NOTRANSPARENT|INVALIDATE_CHILDREN );
-                                            pCandidate->Update();
-                                        }
-                                    }
-
-                                    pCandidate = pCandidate->GetWindow( WINDOW_NEXT );
-                                }
-                            }
-                        }
-                    }
+                    lcl_PaintTransparentFormControls(*this, aRect); // i#107365
                 }
 
                 delete pVout;
@@ -473,6 +478,8 @@ void ViewShell::ImplUnlockPaint( sal_Bool bVirDev )
 
                 // #i72754# end Pre/PostPaint encapsulation when mpOut is back and content is painted
                 DLPostPaint2(true);
+
+                lcl_PaintTransparentFormControls(*this, VisArea()); // fdo#63949
             }
             else
             {


More information about the Libreoffice-commits mailing list