[PATCH] DecoView cleanup: rework ImplDrawFrame

Matteo Casalin matteo.casalin at poste.it
Fri Dec 9 12:13:58 PST 2011


---
 vcl/source/window/decoview.cxx |  398 +++++++++++++++++++---------------------
 1 files changed, 187 insertions(+), 211 deletions(-)

diff --git a/vcl/source/window/decoview.cxx b/vcl/source/window/decoview.cxx
index a1511ab..38dbe74 100644
--- a/vcl/source/window/decoview.cxx
+++ b/vcl/source/window/decoview.cxx
@@ -633,6 +633,193 @@ void ImplDrawButton( OutputDevice *const pDev, Rectangle aFillRect,
     }
 }
 
+void ImplDrawFrame( OutputDevice *const pDev, Rectangle& rRect,
+                    const StyleSettings& rStyleSettings, sal_uInt16 nStyle )
+{
+    Window *const pWin = (pDev->GetOutDevType()==OUTDEV_WINDOW) ? (Window*) pDev : NULL;
+
+    const bool bMenuStyle = nStyle & FRAME_DRAW_MENU;
+
+    // UseFlatBorders disables 3D style for all frames except menus
+    // menus may use different border colors (eg on XP)
+    // normal frames will be drawn using the shadow color
+    // whereas window frame borders will use black
+    bool bFlatBorders = !bMenuStyle && rStyleSettings.GetUseFlatBorders();
+
+    // no flat borders for standard VCL controls (ie formcontrols that keep their classic look)
+    // will not affect frame windows (like dropdowns)
+    if( bFlatBorders && pWin && pWin->GetType() == WINDOW_BORDERWINDOW && (pWin != pWin->ImplGetFrameWindow()) )
+    {
+        // check for formcontrol, i.e., a control without NWF enabled
+        Control *const pControl = dynamic_cast< Control* >( pWin->GetWindow( WINDOW_CLIENT ) );
+        if( !pControl || !pControl->IsNativeWidgetEnabled() )
+            bFlatBorders = false;
+    }
+
+    const bool bNoDraw = nStyle & FRAME_DRAW_NODRAW;
+
+    if ( (rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ||
+         (pDev->GetOutDevType() == OUTDEV_PRINTER) ||
+         bFlatBorders )
+        nStyle |= FRAME_DRAW_MONO;
+
+    if( pWin && pWin->IsNativeControlSupported(CTRL_FRAME, PART_BORDER) )
+    {
+        ImplControlValue aControlValue( nStyle |
+                                        (pWin->GetType()==WINDOW_BORDERWINDOW) ?
+                                        FRAME_DRAW_BORDERWINDOWBORDER : 0 );
+        Rectangle aBound, aContent;
+        Rectangle aNatRgn( rRect );
+        if( pWin->GetNativeControlRegion(CTRL_FRAME, PART_BORDER,
+            aNatRgn, 0, aControlValue, rtl::OUString(), aBound, aContent) )
+        {
+            // if bNoDraw is true then don't call the drawing routine
+            // but just update the target rectangle
+            if( bNoDraw ||
+                pWin->DrawNativeControl( CTRL_FRAME, PART_BORDER, aContent, CTRL_STATE_ENABLED,
+                                         aControlValue, rtl::OUString()) )
+            {
+                rRect = aContent;
+                return;
+            }
+        }
+    }
+
+    if ( nStyle & FRAME_DRAW_MONO )
+    {
+        // no round corners for window frame borders
+        const bool bRound = bFlatBorders && !(nStyle & FRAME_DRAW_WINDOWBORDER);
+
+        if ( bNoDraw )
+        {
+            ImplDrawDPILineRect( pDev, rRect, NULL, bRound );
+        }
+        else
+        {
+            Color aColor = bRound ? rStyleSettings.GetShadowColor()
+                                  : pDev->GetSettings().GetStyleSettings().GetMonoColor();
+            // when the MonoColor wasn't set, check face color
+            if (
+                (bRound && aColor.IsDark()) ||
+                (
+                  (aColor == Color(COL_BLACK)) &&
+                  pDev->GetSettings().GetStyleSettings().GetFaceColor().IsDark()
+                )
+               )
+            {
+                aColor = Color( COL_WHITE );
+            }
+            ImplDrawDPILineRect( pDev, rRect, &aColor, bRound );
+        }
+    }
+    else
+    {
+        if ( bNoDraw )
+        {
+            switch ( nStyle & FRAME_DRAW_STYLE )
+            {
+                case FRAME_DRAW_IN:
+                case FRAME_DRAW_OUT:
+                    ++rRect.Left();
+                    ++rRect.Top();
+                    --rRect.Right();
+                    --rRect.Bottom();
+                    break;
+
+                case FRAME_DRAW_GROUP:
+                case FRAME_DRAW_DOUBLEIN:
+                case FRAME_DRAW_DOUBLEOUT:
+                    rRect.Left()   += 2;
+                    rRect.Top()    += 2;
+                    rRect.Right()  -= 2;
+                    rRect.Bottom() -= 2;
+                    break;
+            }
+        }
+        else
+        {
+            switch ( nStyle & FRAME_DRAW_STYLE )
+            {
+                case FRAME_DRAW_GROUP:
+                    pDev->SetFillColor();
+                    pDev->SetLineColor( rStyleSettings.GetLightColor() );
+                    pDev->DrawRect( Rectangle( rRect.Left()+1, rRect.Top()+1,
+                                            rRect.Right(), rRect.Bottom() ) );
+                    pDev->SetLineColor( rStyleSettings.GetShadowColor() );
+                    pDev->DrawRect( Rectangle( rRect.Left(), rRect.Top(),
+                                            rRect.Right()+1, rRect.Bottom()+1 ) );
+
+                    // adjust target rectangle
+                    rRect.Left()   += 2;
+                    rRect.Top()    += 2;
+                    rRect.Right()  -= 2;
+                    rRect.Bottom() -= 2;
+                    break;
+
+                case FRAME_DRAW_IN:
+                    ImplDraw2ColorFrame( pDev, rRect,
+                                         rStyleSettings.GetShadowColor(),
+                                         rStyleSettings.GetLightColor() );
+                    break;
+
+                case FRAME_DRAW_OUT:
+                    ImplDraw2ColorFrame( pDev, rRect,
+                                         rStyleSettings.GetLightColor(),
+                                         rStyleSettings.GetShadowColor() );
+                    break;
+
+                case FRAME_DRAW_DOUBLEIN:
+                    if( bFlatBorders )
+                    {
+                        // no 3d effect
+                        ImplDraw2ColorFrame( pDev, rRect,
+                                             rStyleSettings.GetShadowColor(),
+                                             rStyleSettings.GetShadowColor() );
+                        ImplDraw2ColorFrame( pDev, rRect,
+                                             rStyleSettings.GetFaceColor(),
+                                             rStyleSettings.GetFaceColor() );
+                    }
+                    else
+                    {
+                        ImplDraw2ColorFrame( pDev, rRect,
+                                             rStyleSettings.GetShadowColor(),
+                                             rStyleSettings.GetLightColor() );
+                        ImplDraw2ColorFrame( pDev, rRect,
+                                             rStyleSettings.GetDarkShadowColor(),
+                                             rStyleSettings.GetLightBorderColor() );
+                    }
+                    break;
+
+                case FRAME_DRAW_DOUBLEOUT:
+                    if( bMenuStyle )
+                    {
+                        ImplDraw2ColorFrame( pDev, rRect,
+                                             rStyleSettings.GetMenuBorderColor(),
+                                             rStyleSettings.GetDarkShadowColor() );
+                        if ( !rStyleSettings.GetUseFlatMenues() )
+                        {
+                            ImplDraw2ColorFrame( pDev, rRect,
+                                                 rStyleSettings.GetLightColor(),
+                                                 rStyleSettings.GetShadowColor() );
+                        }
+                    }
+                    else
+                    {
+                        ImplDraw2ColorFrame( pDev, rRect,
+                                             bFlatBorders ? // no 3d effect
+                                             rStyleSettings.GetDarkShadowColor() :
+                                             rStyleSettings.GetLightBorderColor(),
+                                             rStyleSettings.GetDarkShadowColor() );
+                        ImplDraw2ColorFrame( pDev, rRect,
+                                             rStyleSettings.GetLightColor(),
+                                             rStyleSettings.GetShadowColor() );
+                    }
+                    break;
+            }
+        }
+    }
+}
+
 }
 
 
@@ -748,217 +935,6 @@ void DecorationView::DrawHighlightFrame( const Rectangle& rRect,
 
 // =======================================================================
 
-static void ImplDrawFrame( OutputDevice* pDev, Rectangle& rRect,
-                           const StyleSettings& rStyleSettings, sal_uInt16 nStyle )
-{
-    // mask menu style
-    sal_Bool bMenuStyle = (nStyle & FRAME_DRAW_MENU) ? sal_True : sal_False;
-    nStyle &= ~FRAME_DRAW_MENU;
-
-    Window *pWin = NULL;
-    if( pDev->GetOutDevType() == OUTDEV_WINDOW )
-        pWin = (Window*) pDev;
-
-    // UseFlatBorders disables 3D style for all frames except menus
-    // menus may use different border colors (eg on XP)
-    // normal frames will be drawn using the shadow color
-    // whereas window frame borders will use black
-    sal_Bool bFlatBorders = ( !bMenuStyle && rStyleSettings.GetUseFlatBorders() );
-
-    // no flat borders for standard VCL controls (ie formcontrols that keep their classic look)
-    // will not affect frame windows (like dropdowns)
-    if( bFlatBorders && pWin && pWin->GetType() == WINDOW_BORDERWINDOW && (pWin != pWin->ImplGetFrameWindow()) )
-    {
-        // check for formcontrol, i.e., a control without NWF enabled
-        Control *pControl = dynamic_cast< Control* >( pWin->GetWindow( WINDOW_CLIENT ) );
-        if( pControl && pControl->IsNativeWidgetEnabled() )
-            bFlatBorders = sal_True;
-        else
-            bFlatBorders = sal_False;
-    }
-
-    // no round corners for window frame borders
-    sal_Bool bRound = (bFlatBorders && !(nStyle & FRAME_DRAW_WINDOWBORDER));
-
-    if ( (rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ||
-         (pDev->GetOutDevType() == OUTDEV_PRINTER) ||
-         bFlatBorders )
-        nStyle |= FRAME_DRAW_MONO;
-
-    if ( nStyle & FRAME_DRAW_NODRAW )
-    {
-        sal_uInt16 nValueStyle = bMenuStyle ? nStyle | FRAME_DRAW_MENU : nStyle;
-        if( pWin && pWin->GetType() == WINDOW_BORDERWINDOW )
-            nValueStyle |= FRAME_DRAW_BORDERWINDOWBORDER;
-        ImplControlValue aControlValue( nValueStyle );
-        Rectangle aBound, aContent;
-        Rectangle aNatRgn( rRect );
-        if(pWin && pWin->GetNativeControlRegion(CTRL_FRAME, PART_BORDER,
-            aNatRgn, 0, aControlValue, rtl::OUString(), aBound, aContent) )
-        {
-            rRect = aContent;
-        }
-        else if ( nStyle & FRAME_DRAW_MONO )
-            ImplDrawDPILineRect( pDev, rRect, NULL, bRound );
-        else
-        {
-            sal_uInt16 nFrameStyle = nStyle & FRAME_DRAW_STYLE;
-
-            if ( nFrameStyle == FRAME_DRAW_GROUP )
-            {
-                rRect.Left()    += 2;
-                rRect.Top()     += 2;
-                rRect.Right()   -= 2;
-                rRect.Bottom()  -= 2;
-            }
-            else if ( (nFrameStyle == FRAME_DRAW_IN) ||
-                      (nFrameStyle == FRAME_DRAW_OUT) )
-            {
-                rRect.Left()++;
-                rRect.Top()++;
-                rRect.Right()--;
-                rRect.Bottom()--;
-            }
-            else // FRAME_DRAW_DOUBLEIN || FRAME_DRAW_DOUBLEOUT
-            {
-                rRect.Left()    += 2;
-                rRect.Top()     += 2;
-                rRect.Right()   -= 2;
-                rRect.Bottom()  -= 2;
-            }
-        }
-    }
-    else
-    {
-        if( pWin && pWin->IsNativeControlSupported(CTRL_FRAME, PART_BORDER) )
-        {
-            sal_uInt16 nValueStyle = bMenuStyle ? nStyle | FRAME_DRAW_MENU : nStyle;
-            if( pWin->GetType() == WINDOW_BORDERWINDOW )
-                nValueStyle |= FRAME_DRAW_BORDERWINDOWBORDER;
-            ImplControlValue aControlValue( nValueStyle );
-            Rectangle aBound, aContent;
-            Rectangle aNatRgn( rRect );
-            if( pWin->GetNativeControlRegion(CTRL_FRAME, PART_BORDER,
-                aNatRgn, 0, aControlValue, rtl::OUString(), aBound, aContent) )
-            {
-                if( pWin->DrawNativeControl( CTRL_FRAME, PART_BORDER, aContent, CTRL_STATE_ENABLED,
-                             aControlValue, rtl::OUString()) )
-                {
-                    rRect = aContent;
-                    return;
-                }
-            }
-        }
-
-        if ( nStyle & FRAME_DRAW_MONO )
-        {
-            Color aColor = bRound ? rStyleSettings.GetShadowColor()
-                                  : pDev->GetSettings().GetStyleSettings().GetMonoColor();
-            // when the MonoColor wasn't set, check face color
-            if (
-                (bRound && aColor.IsDark()) ||
-                (
-                  (aColor == Color(COL_BLACK)) &&
-                  (pDev->GetSettings().GetStyleSettings().GetFaceColor().IsDark())
-                )
-               )
-            {
-                aColor = Color( COL_WHITE );
-            }
-            ImplDrawDPILineRect( pDev, rRect, &aColor, bRound );
-        }
-        else
-        {
-            sal_uInt16 nFrameStyle = nStyle & FRAME_DRAW_STYLE;
-            if ( nFrameStyle == FRAME_DRAW_GROUP )
-            {
-                pDev->SetFillColor();
-                pDev->SetLineColor( rStyleSettings.GetLightColor() );
-                rRect.Top()++;
-                rRect.Left()++;
-                pDev->DrawRect( rRect );
-                rRect.Top()--;
-                rRect.Left()--;
-                pDev->SetLineColor( rStyleSettings.GetShadowColor() );
-                rRect.Right()--;
-                rRect.Bottom()--;
-                pDev->DrawRect( rRect );
-                rRect.Right()++;
-                rRect.Bottom()++;
-            }
-            else
-            {
-                if ( (nFrameStyle == FRAME_DRAW_IN) ||
-                     (nFrameStyle == FRAME_DRAW_OUT) )
-                {
-                    if ( nFrameStyle == FRAME_DRAW_IN )
-                    {
-                        ImplDraw2ColorFrame( pDev, rRect,
-                                             rStyleSettings.GetShadowColor(),
-                                             rStyleSettings.GetLightColor() );
-                    }
-                    else
-                    {
-                        ImplDraw2ColorFrame( pDev, rRect,
-                                             rStyleSettings.GetLightColor(),
-                                             rStyleSettings.GetShadowColor() );
-                    }
-                }
-                else // FRAME_DRAW_DOUBLEIN || FRAME_DRAW_DOUBLEOUT
-                {
-                    if ( nFrameStyle == FRAME_DRAW_DOUBLEIN )
-                    {
-                        if( bFlatBorders ) // no 3d effect
-                            ImplDraw2ColorFrame( pDev, rRect,
-                                                 rStyleSettings.GetShadowColor(),
-                                                 rStyleSettings.GetShadowColor() );
-                        else
-                            ImplDraw2ColorFrame( pDev, rRect,
-                                                 rStyleSettings.GetShadowColor(),
-                                                 rStyleSettings.GetLightColor() );
-                    }
-                    else
-                    {
-                        if( bMenuStyle )
-                            ImplDraw2ColorFrame( pDev, rRect,
-                                                 rStyleSettings.GetMenuBorderColor(),
-                                                 rStyleSettings.GetDarkShadowColor() );
-                        else
-                            ImplDraw2ColorFrame( pDev, rRect,
-                                                 bFlatBorders ? // no 3d effect
-                                                 rStyleSettings.GetDarkShadowColor() :
-                                                 rStyleSettings.GetLightBorderColor(),
-                                                 rStyleSettings.GetDarkShadowColor() );
-
-                    }
-
-                    if ( nFrameStyle == FRAME_DRAW_DOUBLEIN )
-                    {
-                        if( bFlatBorders ) // no 3d effect
-                            ImplDraw2ColorFrame( pDev, rRect,
-                                                 rStyleSettings.GetFaceColor(),
-                                                 rStyleSettings.GetFaceColor() );
-                        else
-                            ImplDraw2ColorFrame( pDev, rRect,
-                                                 rStyleSettings.GetDarkShadowColor(),
-                                                 rStyleSettings.GetLightBorderColor() );
-                    }
-                    else
-                    {
-                        // flat menus have no shadow border
-                        if( !bMenuStyle || !rStyleSettings.GetUseFlatMenues() )
-                            ImplDraw2ColorFrame( pDev, rRect,
-                                                 rStyleSettings.GetLightColor(),
-                                                 rStyleSettings.GetShadowColor() );
-                    }
-                }
-            }
-        }
-    }
-}
-
-// -----------------------------------------------------------------------
-
 Rectangle DecorationView::DrawFrame( const Rectangle& rRect, sal_uInt16 nStyle )
 {
     Rectangle   aRect = rRect;
-- 
1.7.5.4


--------------060407050804080508040401--


More information about the LibreOffice mailing list