Refactor Buttons to use RenderContext when painting

Change-Id: I4ebecb2bda44319a3590a62a2c113c73c94ba974
diff --git a/cui/source/dialogs/hangulhanjadlg.cxx b/cui/source/dialogs/hangulhanjadlg.cxx
index eb8b195..69632fa 100644
--- a/cui/source/dialogs/hangulhanjadlg.cxx
+++ b/cui/source/dialogs/hangulhanjadlg.cxx
@@ -234,7 +234,7 @@ namespace svx
    }


    void RubyRadioButton::Paint( vcl::RenderContext& /*rRenderContext*/, const Rectangle& )
    void RubyRadioButton::Paint( vcl::RenderContext& rRenderContext, const Rectangle& )
    {
        HideFocus();

@@ -289,7 +289,7 @@ namespace svx
        aImageLocation.Top() = aPrimaryTextLocation.Top() + ( nTextHeight - aImageSize.Height() ) / 2;
        aImageLocation.Bottom() = aImageLocation.Top() + aImageSize.Height();
        SetStateRect( aImageLocation );
        DrawRadioButtonState( );
        DrawRadioButtonState(rRenderContext);

        // mouse clicks should be recognized in a rect which is one pixel larger in each direction, plus
        // includes the image
diff --git a/include/vcl/button.hxx b/include/vcl/button.hxx
index 8ecf063..bfa3f20 100644
--- a/include/vcl/button.hxx
+++ b/include/vcl/button.hxx
@@ -49,7 +49,7 @@ public:
    SAL_DLLPRIVATE sal_uInt16       ImplGetButtonState() const;
    SAL_DLLPRIVATE sal_uInt16&      ImplGetButtonState();
    SAL_DLLPRIVATE sal_uInt16       ImplGetTextStyle( OUString& rText, WinBits nWinStyle, sal_uLong nDrawFlags );
    SAL_DLLPRIVATE void             ImplDrawAlignedImage( OutputDevice* pDev, Point& rPos, Size& rSize,
    SAL_DLLPRIVATE void             ImplDrawAlignedImage(OutputDevice* pDev, Point& rPos, Size& rSize,
                                              bool bLayout, sal_uLong nImageSep, sal_uLong nDrawFlags,
                                              sal_uInt16 nTextStyle, Rectangle *pSymbolRect=NULL, bool bAddImageSep = false );
    SAL_DLLPRIVATE void             ImplSetFocusRect( const Rectangle &rFocusRect );
@@ -121,8 +121,8 @@ protected:
    SAL_DLLPRIVATE void            ImplInitPushButtonData();
    SAL_DLLPRIVATE WinBits         ImplInitStyle( const vcl::Window* pPrevWindow, WinBits nStyle );
    SAL_DLLPRIVATE void            ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
    SAL_DLLPRIVATE void            ImplDrawPushButtonContent( OutputDevice* pDev, sal_uLong nDrawFlags,
                                               const Rectangle& rRect, bool bLayout, bool bMenuBtnSep );
    SAL_DLLPRIVATE void            ImplDrawPushButtonContent(OutputDevice* pDev, sal_uLong nDrawFlags,
                                                             const Rectangle& rRect, bool bLayout, bool bMenuBtnSep);
    SAL_DLLPRIVATE void            ImplDrawPushButton(vcl::RenderContext& rRenderContext, bool bLayout = false);
    using Button::ImplGetTextStyle;
    SAL_DLLPRIVATE sal_uInt16          ImplGetTextStyle( sal_uLong nDrawFlags ) const;
@@ -139,8 +139,8 @@ protected:
    using Window::ImplInit;
public:
    SAL_DLLPRIVATE void            ImplSetDefButton( bool bSet );
    SAL_DLLPRIVATE static void     ImplDrawPushButtonFrame( vcl::Window* pDev, Rectangle& rRect, sal_uInt16 nStyle );
    SAL_DLLPRIVATE static bool     ImplHitTestPushButton( vcl::Window* pDev, const Point& rPos );
    SAL_DLLPRIVATE void            ImplDrawPushButtonFrame(vcl::RenderContext& rRenderContext, Rectangle& rRect, sal_uInt16 nStyle);
    SAL_DLLPRIVATE static bool     ImplHitTestPushButton(vcl::Window* pDev, const Point& rPos);
    SAL_DLLPRIVATE bool            ImplIsDefButton() const;

protected:
@@ -291,13 +291,12 @@ private:
    SAL_DLLPRIVATE void     ImplInitRadioButtonData();
    SAL_DLLPRIVATE WinBits  ImplInitStyle( const vcl::Window* pPrevWindow, WinBits nStyle );
    SAL_DLLPRIVATE void     ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
    SAL_DLLPRIVATE void     ImplDrawRadioButtonState();
    SAL_DLLPRIVATE void     ImplDrawRadioButtonState(vcl::RenderContext& rRenderContext);
    SAL_DLLPRIVATE void     ImplDraw( OutputDevice* pDev, sal_uLong nDrawFlags,
                              const Point& rPos, const Size& rSize,
                              const Size& rImageSize, Rectangle& rStateRect,
                              Rectangle& rMouseRect, bool bLayout = false );
    SAL_DLLPRIVATE void     ImplDrawRadioButton(vcl::RenderContext& rRenderContext, bool bLayout = false );
    SAL_DLLPRIVATE void     ImplInvalidateOrDrawRadioButtonState();
    SAL_DLLPRIVATE void     ImplUncheckAllOther();
    SAL_DLLPRIVATE Size     ImplGetRadioImageSize() const;
    SAL_DLLPRIVATE long     ImplGetImageToTextDistance() const;
@@ -329,7 +328,7 @@ protected:

    // draws the radio button (the knob image), in its current state (pressed/checked)
    // at the usual location, which can be overridden with SetStateRect
    void            DrawRadioButtonState( );
    void            DrawRadioButtonState(vcl::RenderContext& rRenderContext);

public:
    explicit        RadioButton( vcl::Window* pParent, WinBits nWinStyle = 0 );
@@ -420,7 +419,6 @@ private:
    SAL_DLLPRIVATE void         ImplInitCheckBoxData();
    SAL_DLLPRIVATE WinBits      ImplInitStyle( const vcl::Window* pPrevWindow, WinBits nStyle );
    SAL_DLLPRIVATE void         ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
    SAL_DLLPRIVATE void         ImplInvalidateOrDrawCheckBoxState();
    SAL_DLLPRIVATE void         ImplDraw( OutputDevice* pDev, sal_uLong nDrawFlags,
                                    const Point& rPos, const Size& rSize,
                                    const Size& rImageSize, Rectangle& rStateRect,
@@ -441,7 +439,7 @@ protected:
    virtual const vcl::Font&    GetCanonicalFont( const StyleSettings& _rStyle ) const SAL_OVERRIDE;
    virtual const Color&        GetCanonicalTextColor( const StyleSettings& _rStyle ) const SAL_OVERRIDE;

    virtual void ImplDrawCheckBoxState();
    virtual void ImplDrawCheckBoxState(vcl::RenderContext& rRenderContext);
    SAL_DLLPRIVATE const Rectangle& GetStateRect() const { return maStateRect; }
    SAL_DLLPRIVATE const Rectangle& GetMouseRect() const { return maMouseRect; }

@@ -543,7 +541,7 @@ public:
class VCL_DLLPUBLIC DisclosureButton : public CheckBox
{
protected:
    SAL_DLLPRIVATE virtual void ImplDrawCheckBoxState() SAL_OVERRIDE;
    SAL_DLLPRIVATE virtual void ImplDrawCheckBoxState(vcl::RenderContext& rRenderContext) SAL_OVERRIDE;
public:
    explicit DisclosureButton( vcl::Window* pParent, WinBits nStyle = 0 );

diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx
index 39fd3c6..7bbe33a 100644
--- a/vcl/source/control/button.cxx
+++ b/vcl/source/control/button.cxx
@@ -210,7 +210,7 @@ void Button::ImplSetSeparatorX( long nX )
sal_uInt16 Button::ImplGetTextStyle( OUString& rText, WinBits nWinStyle,
                                 sal_uLong nDrawFlags )
{
    const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
    const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
    sal_uInt16 nTextStyle = FixedText::ImplGetTextStyle( nWinStyle & ~WB_DEFBUTTON );

    if ( nDrawFlags & WINDOW_DRAW_NOMNEMONIC )
@@ -701,30 +701,30 @@ void PushButton::ImplInitSettings( bool bFont,
    }
}

void PushButton::ImplDrawPushButtonFrame( vcl::Window* pDev,
                                          Rectangle& rRect, sal_uInt16 nStyle )
void PushButton::ImplDrawPushButtonFrame(vcl::RenderContext& rRenderContext,
                                         Rectangle& rRect, sal_uInt16 nStyle)
{
    if ( !(pDev->GetStyle() & (WB_RECTSTYLE | WB_SMALLSTYLE)) )
    if (!(GetStyle() & (WB_RECTSTYLE | WB_SMALLSTYLE)))
    {
        StyleSettings aStyleSettings = pDev->GetSettings().GetStyleSettings();
        if ( pDev->IsControlBackground() )
            aStyleSettings.Set3DColors( pDev->GetControlBackground() );
        StyleSettings aStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
        if (IsControlBackground())
            aStyleSettings.Set3DColors(GetControlBackground());
    }

    DecorationView aDecoView( pDev );
    if ( pDev->IsControlBackground() )
    DecorationView aDecoView(&rRenderContext);
    if (IsControlBackground())
    {
        AllSettings     aSettings = pDev->GetSettings();
        AllSettings     aOldSettings = aSettings;
        StyleSettings   aStyleSettings = aSettings.GetStyleSettings();
        aStyleSettings.Set3DColors( pDev->GetControlBackground() );
        aSettings.SetStyleSettings( aStyleSettings );
        pDev->OutputDevice::SetSettings( aSettings );
        rRect = aDecoView.DrawButton( rRect, nStyle );
        pDev->OutputDevice::SetSettings( aOldSettings );
        AllSettings aSettings = rRenderContext.GetSettings();
        AllSettings aOldSettings = aSettings;
        StyleSettings aStyleSettings = aSettings.GetStyleSettings();
        aStyleSettings.Set3DColors(GetControlBackground());
        aSettings.SetStyleSettings(aStyleSettings);
        rRenderContext.SetSettings(aSettings);
        rRect = aDecoView.DrawButton(rRect, nStyle);
        rRenderContext.SetSettings(aOldSettings);
    }
    else
        rRect = aDecoView.DrawButton( rRect, nStyle );
        rRect = aDecoView.DrawButton(rRect, nStyle);
}

bool PushButton::ImplHitTestPushButton( vcl::Window* pDev,
@@ -797,11 +797,8 @@ static void ImplDrawBtnDropDownArrow( OutputDevice* pDev,
    pDev->SetFillColor( aOldFillColor );
}

void PushButton::ImplDrawPushButtonContent( OutputDevice* pDev, sal_uLong nDrawFlags,
                                            const Rectangle& rRect,
                                            bool bLayout,
                                            bool bMenuBtnSep
                                            )
void PushButton::ImplDrawPushButtonContent(OutputDevice* pDev, sal_uLong nDrawFlags,
                                           const Rectangle& rRect, bool bLayout, bool bMenuBtnSep)
{
    const StyleSettings&    rStyleSettings = GetSettings().GetStyleSettings();
    Rectangle               aInRect = rRect;
@@ -914,25 +911,25 @@ void PushButton::ImplDrawPushButtonContent( OutputDevice* pDev, sal_uLong nDrawF
    pDev->Pop();  // restore clipregion
}

void PushButton::ImplDrawPushButton(vcl::RenderContext& /*rRenderContext*/, bool bLayout)
void PushButton::ImplDrawPushButton(vcl::RenderContext& rRenderContext, bool bLayout)
{
    if( !bLayout )
    if (!bLayout)
        HideFocus();

    sal_uInt16                  nButtonStyle = ImplGetButtonState();
    Point                   aPoint;
    Size                    aOutSz( GetOutputSizePixel() );
    Rectangle               aRect( aPoint, aOutSz );
    Rectangle               aInRect = aRect;
    bool                    bNativeOK = false;
    sal_uInt16 nButtonStyle = ImplGetButtonState();
    Point aPoint;
    Size aOutSz(GetOutputSizePixel());
    Rectangle aRect(aPoint, aOutSz);
    Rectangle aInRect = aRect;
    bool bNativeOK = false;

    // adjust style if button should be rendered 'pressed'
    if ( mbPressed )
    if (mbPressed)
        nButtonStyle |= BUTTON_DRAW_PRESSED;

    // TODO: move this to Window class or make it a member !!!
    ControlType aCtrlType = 0;
    switch( GetParent()->GetType() )
    switch(GetParent()->GetType())
    {
        case WINDOW_LISTBOX:
        case WINDOW_MULTILISTBOX:
@@ -958,68 +955,79 @@ void PushButton::ImplDrawPushButton(vcl::RenderContext& /*rRenderContext*/, bool

    if( bDropDown && (aCtrlType == CTRL_COMBOBOX || aCtrlType == CTRL_LISTBOX ) )
    {
        if( GetParent()->IsNativeControlSupported( aCtrlType, PART_ENTIRE_CONTROL) )
        if (GetParent()->IsNativeControlSupported(aCtrlType, PART_ENTIRE_CONTROL))
        {
            // skip painting if the button was already drawn by the theme
            if( aCtrlType == CTRL_COMBOBOX )
            if (aCtrlType == CTRL_COMBOBOX)
            {
                Edit* pEdit = static_cast<Edit*>(GetParent());
                if( pEdit->ImplUseNativeBorder( pEdit->GetStyle() ) )
                if (pEdit->ImplUseNativeBorder(pEdit->GetStyle()))
                    bNativeOK = true;
            }
            else if( GetParent()->IsNativeControlSupported( aCtrlType, HAS_BACKGROUND_TEXTURE) )
            else if (GetParent()->IsNativeControlSupported(aCtrlType, HAS_BACKGROUND_TEXTURE))
            {
                bNativeOK = true;
            }
            if( !bNativeOK && GetParent()->IsNativeControlSupported( aCtrlType, PART_BUTTON_DOWN ) )

            if (!bNativeOK && GetParent()->IsNativeControlSupported(aCtrlType, PART_BUTTON_DOWN))
            {
                // let the theme draw it, note we then need support
                // for CTRL_LISTBOX/PART_BUTTON_DOWN and CTRL_COMBOBOX/PART_BUTTON_DOWN

                ImplControlValue    aControlValue;
                ControlState        nState = ControlState::NONE;
                ImplControlValue aControlValue;
                ControlState nState = ControlState::NONE;

                if ( mbPressed )                        nState |= ControlState::PRESSED;
                if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED )   nState |= ControlState::PRESSED;
                if ( HasFocus() )                       nState |= ControlState::FOCUSED;
                if ( ImplGetButtonState() & BUTTON_DRAW_DEFAULT )   nState |= ControlState::DEFAULT;
                if ( Window::IsEnabled() )              nState |= ControlState::ENABLED;
                if (mbPressed)
                    nState |= ControlState::PRESSED;
                if (ImplGetButtonState() & BUTTON_DRAW_PRESSED)
                    nState |= ControlState::PRESSED;
                if (HasFocus())
                    nState |= ControlState::FOCUSED;
                if (ImplGetButtonState() & BUTTON_DRAW_DEFAULT)
                    nState |= ControlState::DEFAULT;
                if (Window::IsEnabled())
                    nState |= ControlState::ENABLED;

                if ( IsMouseOver() && aInRect.IsInside( GetPointerPosPixel() ) )
                if (IsMouseOver() && aInRect.IsInside(GetPointerPosPixel()))
                    nState |= ControlState::ROLLOVER;

                bNativeOK = DrawNativeControl( aCtrlType, PART_BUTTON_DOWN, aInRect, nState,
                                                aControlValue, OUString() );
                bNativeOK = rRenderContext.DrawNativeControl(aCtrlType, PART_BUTTON_DOWN, aInRect, nState,
                                                             aControlValue, OUString());
            }
        }
    }

    if( bNativeOK )
    if (bNativeOK)
        return;

    bool bRollOver = (IsMouseOver() && aInRect.IsInside( GetPointerPosPixel() ));
    bool bRollOver = IsMouseOver() && aInRect.IsInside(GetPointerPosPixel());
    bool bDrawMenuSep = true;
    if( (GetStyle() & WB_FLATBUTTON) )
    if (GetStyle() & WB_FLATBUTTON)
    {
        if( ! bRollOver && ! HasFocus() )
        if (!bRollOver && !HasFocus())
            bDrawMenuSep = false;
    }
    if ( (bNativeOK=IsNativeControlSupported(CTRL_PUSHBUTTON, PART_ENTIRE_CONTROL)) )
    if ((bNativeOK = IsNativeControlSupported(CTRL_PUSHBUTTON, PART_ENTIRE_CONTROL)))
    {
        PushButtonValue aControlValue;
        Rectangle        aCtrlRegion( aInRect );
        ControlState     nState = ControlState::NONE;
        Rectangle aCtrlRegion(aInRect);
        ControlState nState = ControlState::NONE;

        if ( mbPressed || IsChecked() )                   nState |= ControlState::PRESSED;
        if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED ) nState |= ControlState::PRESSED;
        if ( HasFocus() )                       nState |= ControlState::FOCUSED;
        if ( ImplGetButtonState() & BUTTON_DRAW_DEFAULT )   nState |= ControlState::DEFAULT;
        if ( Window::IsEnabled() )              nState |= ControlState::ENABLED;
        if (mbPressed || IsChecked())
            nState |= ControlState::PRESSED;
        if (ImplGetButtonState() & BUTTON_DRAW_PRESSED)
            nState |= ControlState::PRESSED;
        if (HasFocus())
            nState |= ControlState::FOCUSED;
        if (ImplGetButtonState() & BUTTON_DRAW_DEFAULT)
            nState |= ControlState::DEFAULT;
        if (Window::IsEnabled())
            nState |= ControlState::ENABLED;

        if ( bRollOver )
        if (bRollOver)
            nState |= ControlState::ROLLOVER;

        if( GetStyle() & WB_BEVELBUTTON )
        if (GetStyle() & WB_BEVELBUTTON)
            aControlValue.mbBevelButton = true;

        // draw frame into invisible window to have aInRect modified correctly
@@ -1036,15 +1044,15 @@ void PushButton::ImplDrawPushButton(vcl::RenderContext& /*rRenderContext*/, bool

        // prepare single line hint (needed on mac to decide between normal push button and
        // rectangular bevel button look)
        Size aFontSize( Application::GetSettings().GetStyleSettings().GetPushButtonFont().GetSize() );
        aFontSize = LogicToPixel( aFontSize, MapMode( MAP_POINT ) );
        Size aInRectSize( LogicToPixel( Size( aInRect.GetWidth(), aInRect.GetHeight() ) ) );
        aControlValue.mbSingleLine = (aInRectSize.Height() < 2 * aFontSize.Height() );
        Size aFontSize(Application::GetSettings().GetStyleSettings().GetPushButtonFont().GetSize());
        aFontSize = LogicToPixel(aFontSize, MapMode(MAP_POINT));
        Size aInRectSize(LogicToPixel(Size(aInRect.GetWidth(), aInRect.GetHeight())));
        aControlValue.mbSingleLine = (aInRectSize.Height() < 2 * aFontSize.Height());

        if( ((nState & ControlState::ROLLOVER)) || ! (GetStyle() & WB_FLATBUTTON) )
        if (((nState & ControlState::ROLLOVER)) || !(GetStyle() & WB_FLATBUTTON))
        {
            bNativeOK = DrawNativeControl( CTRL_PUSHBUTTON, PART_ENTIRE_CONTROL, aCtrlRegion, nState,
                            aControlValue, OUString()/*PushButton::GetText()*/ );
            bNativeOK = rRenderContext.DrawNativeControl(CTRL_PUSHBUTTON, PART_ENTIRE_CONTROL, aCtrlRegion, nState,
                                                         aControlValue, OUString() /*PushButton::GetText()*/);
        }
        else
        {
@@ -1052,22 +1060,21 @@ void PushButton::ImplDrawPushButton(vcl::RenderContext& /*rRenderContext*/, bool
        }

        // draw content using the same aInRect as non-native VCL would do
        ImplDrawPushButtonContent( this,
                                   (nState&ControlState::ROLLOVER) ? WINDOW_DRAW_ROLLOVER : 0,
                                   aInRect, bLayout, bDrawMenuSep );
        ImplDrawPushButtonContent(this, (nState&ControlState::ROLLOVER) ? WINDOW_DRAW_ROLLOVER : 0,
                                  aInRect, bLayout, bDrawMenuSep);

        if ( HasFocus() )
            ShowFocus( ImplGetFocusRect() );
        if (HasFocus())
            ShowFocus(ImplGetFocusRect());
    }

    if ( !bNativeOK )
    if (!bNativeOK)
    {
        // draw PushButtonFrame, aInRect has content size afterwards
        if( (GetStyle() & WB_FLATBUTTON) )
        if (GetStyle() & WB_FLATBUTTON)
        {
            Rectangle aTempRect( aInRect );
            if( ! bLayout && bRollOver )
                ImplDrawPushButtonFrame( this, aTempRect, nButtonStyle );
            Rectangle aTempRect(aInRect);
            if (!bLayout && bRollOver)
                ImplDrawPushButtonFrame(rRenderContext, aTempRect, nButtonStyle);
            aInRect.Left()   += 2;
            aInRect.Top()    += 2;
            aInRect.Right()  -= 2;
@@ -1075,16 +1082,16 @@ void PushButton::ImplDrawPushButton(vcl::RenderContext& /*rRenderContext*/, bool
        }
        else
        {
            if( ! bLayout )
                ImplDrawPushButtonFrame( this, aInRect, nButtonStyle );
            if (!bLayout)
                ImplDrawPushButtonFrame(rRenderContext, aInRect, nButtonStyle);
        }

        // draw content
        ImplDrawPushButtonContent( this, 0, aInRect, bLayout, bDrawMenuSep );
        ImplDrawPushButtonContent(&rRenderContext, 0, aInRect, bLayout, bDrawMenuSep);

        if( ! bLayout && HasFocus() )
        if (!bLayout && HasFocus())
        {
            ShowFocus( ImplGetFocusRect() );
            ShowFocus(ImplGetFocusRect());
        }
    }
}
@@ -1847,131 +1854,119 @@ void RadioButton::ImplInitSettings( bool bFont,
    }
}

void RadioButton::DrawRadioButtonState( )
void RadioButton::DrawRadioButtonState(vcl::RenderContext& rRenderContext)
{
    ImplDrawRadioButtonState( );
    ImplDrawRadioButtonState(rRenderContext);
}

void RadioButton::ImplInvalidateOrDrawRadioButtonState()
void RadioButton::ImplDrawRadioButtonState(vcl::RenderContext& rRenderContext)
{
    if( ImplGetSVData()->maNWFData.mbCheckBoxNeedsErase )
    {
        if ( IsNativeControlSupported(CTRL_RADIOBUTTON, PART_ENTIRE_CONTROL) )
        {
            Invalidate();
            Update();
            return;
        }
    }
    ImplDrawRadioButtonState();
}

void RadioButton::ImplDrawRadioButtonState()
{
    bool   bNativeOK = false;
    bool bNativeOK = false;

    // no native drawing for image radio buttons
    if ( !maImage && (bNativeOK=IsNativeControlSupported(CTRL_RADIOBUTTON, PART_ENTIRE_CONTROL)) )
    if (!maImage && (bNativeOK = rRenderContext.IsNativeControlSupported(CTRL_RADIOBUTTON, PART_ENTIRE_CONTROL)))
    {
        ImplControlValue            aControlValue( mbChecked ? BUTTONVALUE_ON : BUTTONVALUE_OFF );
        Rectangle                   aCtrlRect( maStateRect.TopLeft(), maStateRect.GetSize() );
        ControlState                nState = ControlState::NONE;
        ImplControlValue aControlValue( mbChecked ? BUTTONVALUE_ON : BUTTONVALUE_OFF );
        Rectangle aCtrlRect(maStateRect.TopLeft(), maStateRect.GetSize());
        ControlState nState = ControlState::NONE;

        if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED )   nState |= ControlState::PRESSED;
        if ( HasFocus() )                       nState |= ControlState::FOCUSED;
        if ( ImplGetButtonState() & BUTTON_DRAW_DEFAULT )   nState |= ControlState::DEFAULT;
        if ( IsEnabled() )                      nState |= ControlState::ENABLED;
        if (ImplGetButtonState() & BUTTON_DRAW_PRESSED)
            nState |= ControlState::PRESSED;
        if (HasFocus())
            nState |= ControlState::FOCUSED;
        if (ImplGetButtonState() & BUTTON_DRAW_DEFAULT)
            nState |= ControlState::DEFAULT;
        if (IsEnabled())
            nState |= ControlState::ENABLED;

        if ( IsMouseOver() && maMouseRect.IsInside( GetPointerPosPixel() ) )
        if (IsMouseOver() && maMouseRect.IsInside(GetPointerPosPixel()))
            nState |= ControlState::ROLLOVER;

        bNativeOK = DrawNativeControl( CTRL_RADIOBUTTON, PART_ENTIRE_CONTROL, aCtrlRect, nState,
                    aControlValue,OUString() );

        bNativeOK = rRenderContext.DrawNativeControl(CTRL_RADIOBUTTON, PART_ENTIRE_CONTROL, aCtrlRect,
                                                     nState, aControlValue, OUString());
    }

    if ( !bNativeOK )
    if (!bNativeOK)
    {
        // kein Image-RadioButton
        if ( !maImage )
        if (!maImage)
        {
            sal_uInt16 nStyle = ImplGetButtonState();
            if ( !IsEnabled() )
            if (!IsEnabled())
                nStyle |= BUTTON_DRAW_DISABLED;
            if ( mbChecked )
            if (mbChecked)
                nStyle |= BUTTON_DRAW_CHECKED;
            Image aImage = GetRadioImage( GetSettings(), nStyle );
            if ( IsZoom() )
                DrawImage( maStateRect.TopLeft(), maStateRect.GetSize(), aImage );
            Image aImage = GetRadioImage(rRenderContext.GetSettings(), nStyle);
            if (IsZoom())
                rRenderContext.DrawImage(maStateRect.TopLeft(), maStateRect.GetSize(), aImage);
            else
                DrawImage( maStateRect.TopLeft(), aImage );
                rRenderContext.DrawImage(maStateRect.TopLeft(), aImage);
        }
        else
        {
            HideFocus();

            DecorationView          aDecoView( this );
            const StyleSettings&    rStyleSettings = GetSettings().GetStyleSettings();
            Rectangle               aImageRect  = maStateRect;
            Size                    aImageSize  = maImage.GetSizePixel();
            bool                    bEnabled    = IsEnabled();
            DecorationView aDecoView(&rRenderContext);
            const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
            Rectangle aImageRect  = maStateRect;
            Size aImageSize = maImage.GetSizePixel();
            bool bEnabled = IsEnabled();
            sal_uInt16 nButtonStyle = FRAME_DRAW_DOUBLEIN;

            aImageSize.Width()  = CalcZoom( aImageSize.Width() );
            aImageSize.Height() = CalcZoom( aImageSize.Height() );
            aImageSize.Width()  = CalcZoom(aImageSize.Width());
            aImageSize.Height() = CalcZoom(aImageSize.Height());

            // display border and selection status
            aImageRect = aDecoView.DrawFrame( aImageRect, nButtonStyle );
            if ( (ImplGetButtonState() & BUTTON_DRAW_PRESSED) || !bEnabled )
                SetFillColor( rStyleSettings.GetFaceColor() );
            aImageRect = aDecoView.DrawFrame(aImageRect, nButtonStyle);
            if ((ImplGetButtonState() & BUTTON_DRAW_PRESSED) || !bEnabled)
                rRenderContext.SetFillColor( rStyleSettings.GetFaceColor());
            else
                SetFillColor( rStyleSettings.GetFieldColor() );
            SetLineColor();
            DrawRect( aImageRect );
                rRenderContext.SetFillColor(rStyleSettings.GetFieldColor());
            rRenderContext.SetLineColor();
            rRenderContext.DrawRect(aImageRect);

            // display image
            nButtonStyle = 0;
            if ( !bEnabled )
            if (!bEnabled)
                nButtonStyle |= IMAGE_DRAW_DISABLE;

            Image *pImage = &maImage;
            Image* pImage = &maImage;

            Point aImagePos( aImageRect.TopLeft() );
            aImagePos.X() += (aImageRect.GetWidth()-aImageSize.Width())/2;
            aImagePos.Y() += (aImageRect.GetHeight()-aImageSize.Height())/2;
            if ( IsZoom() )
                DrawImage( aImagePos, aImageSize, *pImage, nButtonStyle );
            Point aImagePos(aImageRect.TopLeft());
            aImagePos.X() += (aImageRect.GetWidth() - aImageSize.Width()) / 2;
            aImagePos.Y() += (aImageRect.GetHeight() - aImageSize.Height()) / 2;
            if (IsZoom())
                rRenderContext.DrawImage(aImagePos, aImageSize, *pImage, nButtonStyle);
            else
                DrawImage( aImagePos, *pImage, nButtonStyle );
                rRenderContext.DrawImage(aImagePos, *pImage, nButtonStyle);

            aImageRect.Left()++;
            aImageRect.Top()++;
            aImageRect.Right()--;
            aImageRect.Bottom()--;

            ImplSetFocusRect( aImageRect );
            ImplSetFocusRect(aImageRect);

            if ( mbChecked )
            if (mbChecked)
            {
                SetLineColor( rStyleSettings.GetHighlightColor() );
                SetFillColor();
                if ( (aImageSize.Width() >= 20) || (aImageSize.Height() >= 20) )
                rRenderContext.SetLineColor(rStyleSettings.GetHighlightColor());
                rRenderContext.SetFillColor();
                if ((aImageSize.Width() >= 20) || (aImageSize.Height() >= 20))
                {
                    aImageRect.Left()++;
                    aImageRect.Top()++;
                    aImageRect.Right()--;
                    aImageRect.Bottom()--;
                }
                DrawRect( aImageRect );
                rRenderContext.DrawRect(aImageRect);
                aImageRect.Left()++;
                aImageRect.Top()++;
                aImageRect.Right()--;
                aImageRect.Bottom()--;
                DrawRect( aImageRect );
                rRenderContext.DrawRect(aImageRect);
            }

            if ( HasFocus() )
                ShowFocus( ImplGetFocusRect() );
            if (HasFocus())
                ShowFocus(ImplGetFocusRect());
        }
    }
}
@@ -2112,29 +2107,30 @@ void RadioButton::ImplDraw( OutputDevice* pDev, sal_uLong nDrawFlags,
    pDev->Pop();
}

void RadioButton::ImplDrawRadioButton(vcl::RenderContext& /*rRenderContext*/, bool bLayout)
void RadioButton::ImplDrawRadioButton(vcl::RenderContext& rRenderContext, bool bLayout)
{
    if( !bLayout )
    if (!bLayout)
        HideFocus();

    Size aImageSize;
    if ( !maImage )
    if (!maImage)
        aImageSize = ImplGetRadioImageSize();
    else
        aImageSize  = maImage.GetSizePixel();
    aImageSize.Width()  = CalcZoom( aImageSize.Width() );
    aImageSize.Height() = CalcZoom( aImageSize.Height() );

    aImageSize.Width()  = CalcZoom(aImageSize.Width());
    aImageSize.Height() = CalcZoom(aImageSize.Height());

    // Draw control text
    ImplDraw( this, 0, Point(), GetOutputSizePixel(),
              aImageSize, maStateRect, maMouseRect, bLayout );
    ImplDraw(&rRenderContext, 0, Point(), GetOutputSizePixel(),
             aImageSize, maStateRect, maMouseRect, bLayout);

    if( !bLayout || IsNativeControlSupported(CTRL_RADIOBUTTON, PART_ENTIRE_CONTROL) )
    if (!bLayout || rRenderContext.IsNativeControlSupported(CTRL_RADIOBUTTON, PART_ENTIRE_CONTROL))
    {
        if ( !maImage && HasFocus() )
            ShowFocus( ImplGetFocusRect() );
        if (!maImage && HasFocus())
            ShowFocus(ImplGetFocusRect());

        ImplDrawRadioButtonState();
        ImplDrawRadioButtonState(rRenderContext);
    }
}

@@ -2252,7 +2248,8 @@ void RadioButton::ImplCallClick( bool bGrabFocus, sal_uInt16 nFocusFlags )
    mbStateChanged = !mbChecked;
    mbChecked = true;
    mpWindowImpl->mnStyle |= WB_TABSTOP;
    ImplInvalidateOrDrawRadioButtonState();
    Invalidate();
    Update();
    ImplDelData aDelData;
    ImplAddDel( &aDelData );
    if ( mbRadioCheck )
@@ -2325,7 +2322,8 @@ void RadioButton::MouseButtonDown( const MouseEvent& rMEvt )
    if ( rMEvt.IsLeft() && maMouseRect.IsInside( rMEvt.GetPosPixel() ) )
    {
        ImplGetButtonState() |= BUTTON_DRAW_PRESSED;
        ImplInvalidateOrDrawRadioButtonState();
        Invalidate();
        Update();
        StartTracking();
        return;
    }
@@ -2348,7 +2346,10 @@ void RadioButton::Tracking( const TrackingEvent& rTEvt )
            if ( !rTEvt.IsTrackingCanceled() )
                ImplCallClick();
            else
                ImplInvalidateOrDrawRadioButtonState();
            {
                Invalidate();
                Update();
            }
        }
    }
    else
@@ -2358,7 +2359,8 @@ void RadioButton::Tracking( const TrackingEvent& rTEvt )
            if ( !(ImplGetButtonState() & BUTTON_DRAW_PRESSED) )
            {
                ImplGetButtonState() |= BUTTON_DRAW_PRESSED;
                ImplInvalidateOrDrawRadioButtonState();
                Invalidate();
                Update();
            }
        }
        else
@@ -2366,7 +2368,8 @@ void RadioButton::Tracking( const TrackingEvent& rTEvt )
            if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED )
            {
                ImplGetButtonState() &= ~BUTTON_DRAW_PRESSED;
                ImplInvalidateOrDrawRadioButtonState();
                Invalidate();
                Update();
            }
        }
    }
@@ -2381,13 +2384,15 @@ void RadioButton::KeyInput( const KeyEvent& rKEvt )
        if ( !(ImplGetButtonState() & BUTTON_DRAW_PRESSED) )
        {
            ImplGetButtonState() |= BUTTON_DRAW_PRESSED;
            ImplInvalidateOrDrawRadioButtonState();
            Invalidate();
            Update();
        }
    }
    else if ( (ImplGetButtonState() & BUTTON_DRAW_PRESSED) && (aKeyCode.GetCode() == KEY_ESCAPE) )
    {
        ImplGetButtonState() &= ~BUTTON_DRAW_PRESSED;
        ImplInvalidateOrDrawRadioButtonState();
        Invalidate();
        Update();
    }
    else
        Button::KeyInput( rKEvt );
@@ -2509,7 +2514,8 @@ void RadioButton::LoseFocus()
    if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED )
    {
        ImplGetButtonState() &= ~BUTTON_DRAW_PRESSED;
        ImplInvalidateOrDrawRadioButtonState();
        Invalidate();
        Update();
    }

    HideFocus();
@@ -2975,61 +2981,51 @@ void CheckBox::ImplLoadRes( const ResId& rResId )
        Check( true );
}

void CheckBox::ImplInvalidateOrDrawCheckBoxState()
void CheckBox::ImplDrawCheckBoxState(vcl::RenderContext& rRenderContext)
{
    if( ImplGetSVData()->maNWFData.mbCheckBoxNeedsErase )
    bool bNativeOK = true;

    if ((bNativeOK = rRenderContext.IsNativeControlSupported(CTRL_CHECKBOX, PART_ENTIRE_CONTROL)))
    {
        if ( IsNativeControlSupported(CTRL_CHECKBOX, PART_ENTIRE_CONTROL) )
        {
            Invalidate();
            Update();
            return;
        }
    }
    ImplDrawCheckBoxState();
}
        ImplControlValue aControlValue(meState == TRISTATE_TRUE ? BUTTONVALUE_ON : BUTTONVALUE_OFF);
        Rectangle aCtrlRegion(maStateRect);
        ControlState nState = ControlState::NONE;

void CheckBox::ImplDrawCheckBoxState()
{
    bool    bNativeOK = true;
        if (HasFocus())
            nState |= ControlState::FOCUSED;
        if (ImplGetButtonState() & BUTTON_DRAW_DEFAULT)
            nState |= ControlState::DEFAULT;
        if (ImplGetButtonState() & BUTTON_DRAW_PRESSED)
            nState |= ControlState::PRESSED;
        if (IsEnabled())
            nState |= ControlState::ENABLED;

    if ( (bNativeOK=IsNativeControlSupported(CTRL_CHECKBOX, PART_ENTIRE_CONTROL)) )
    {
        ImplControlValue    aControlValue( meState == TRISTATE_TRUE ? BUTTONVALUE_ON : BUTTONVALUE_OFF );
        Rectangle           aCtrlRegion( maStateRect );
        ControlState        nState = ControlState::NONE;
        if (meState == TRISTATE_TRUE)
            aControlValue.setTristateVal(BUTTONVALUE_ON);
        else if (meState == TRISTATE_INDET)
            aControlValue.setTristateVal(BUTTONVALUE_MIXED);

        if ( HasFocus() )                       nState |= ControlState::FOCUSED;
        if ( ImplGetButtonState() & BUTTON_DRAW_DEFAULT )   nState |= ControlState::DEFAULT;
        if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED )   nState |= ControlState::PRESSED;
        if ( IsEnabled() )                      nState |= ControlState::ENABLED;

        if ( meState == TRISTATE_TRUE )
            aControlValue.setTristateVal( BUTTONVALUE_ON );
        else if ( meState == TRISTATE_INDET )
            aControlValue.setTristateVal( BUTTONVALUE_MIXED );

        if ( IsMouseOver() && maMouseRect.IsInside( GetPointerPosPixel() ) )
        if (IsMouseOver() && maMouseRect.IsInside(GetPointerPosPixel()))
            nState |= ControlState::ROLLOVER;

        bNativeOK = DrawNativeControl( CTRL_CHECKBOX, PART_ENTIRE_CONTROL, aCtrlRegion, nState,
                                 aControlValue, OUString() );
        bNativeOK = rRenderContext.DrawNativeControl(CTRL_CHECKBOX, PART_ENTIRE_CONTROL, aCtrlRegion,
                                                     nState, aControlValue, OUString());
    }

    if ( !bNativeOK )
    if (!bNativeOK)
    {
        sal_uInt16 nStyle = ImplGetButtonState();
        if ( !IsEnabled() )
        if (!IsEnabled())
            nStyle |= BUTTON_DRAW_DISABLED;
        if ( meState == TRISTATE_INDET )
        if (meState == TRISTATE_INDET)
            nStyle |= BUTTON_DRAW_DONTKNOW;
        else if ( meState == TRISTATE_TRUE )
        else if (meState == TRISTATE_TRUE)
            nStyle |= BUTTON_DRAW_CHECKED;
        Image aImage = GetCheckImage( GetSettings(), nStyle );
        if ( IsZoom() )
            DrawImage( maStateRect.TopLeft(), maStateRect.GetSize(), aImage );
        Image aImage = GetCheckImage(GetSettings(), nStyle);
        if (IsZoom())
            rRenderContext.DrawImage(maStateRect.TopLeft(), maStateRect.GetSize(), aImage);
        else
            DrawImage( maStateRect.TopLeft(), aImage );
            rRenderContext.DrawImage(maStateRect.TopLeft(), aImage);
    }
}

@@ -3142,17 +3138,17 @@ void CheckBox::ImplDrawCheckBox(vcl::RenderContext& rRenderContext, bool bLayout
    aImageSize.Width()  = CalcZoom( aImageSize.Width() );
    aImageSize.Height() = CalcZoom( aImageSize.Height() );

    if( !bLayout )
    if (!bLayout)
        HideFocus();

    ImplDraw( &rRenderContext, 0, Point(), GetOutputSizePixel(), aImageSize,
              maStateRect, maMouseRect, bLayout );
    ImplDraw(&rRenderContext, 0, Point(), GetOutputSizePixel(),
             aImageSize, maStateRect, maMouseRect, bLayout);

    if( !bLayout )
    if (!bLayout)
    {
        ImplDrawCheckBoxState();
        if ( HasFocus() )
            ShowFocus( ImplGetFocusRect() );
        ImplDrawCheckBoxState(rRenderContext);
        if (HasFocus())
            ShowFocus(ImplGetFocusRect());
    }
}

@@ -3173,7 +3169,8 @@ void CheckBox::ImplCheck()
    ImplAddDel( &aDelData );
    if( (GetStyle() & WB_EARLYTOGGLE) )
        Toggle();
    ImplInvalidateOrDrawCheckBoxState();
    Invalidate();
    Update();
    if( ! (GetStyle() & WB_EARLYTOGGLE) )
        Toggle();
    if ( aDelData.IsDead() )
@@ -3207,7 +3204,8 @@ void CheckBox::MouseButtonDown( const MouseEvent& rMEvt )
    if ( rMEvt.IsLeft() && maMouseRect.IsInside( rMEvt.GetPosPixel() ) )
    {
        ImplGetButtonState() |= BUTTON_DRAW_PRESSED;
        ImplInvalidateOrDrawCheckBoxState();
        Invalidate();
        Update();
        StartTracking();
        return;
    }
@@ -3230,7 +3228,10 @@ void CheckBox::Tracking( const TrackingEvent& rTEvt )
            if ( !rTEvt.IsTrackingCanceled() )
                ImplCheck();
            else
                ImplInvalidateOrDrawCheckBoxState();
            {
                Invalidate();
                Update();
            }
        }
    }
    else
@@ -3240,7 +3241,8 @@ void CheckBox::Tracking( const TrackingEvent& rTEvt )
            if ( !(ImplGetButtonState() & BUTTON_DRAW_PRESSED) )
            {
                ImplGetButtonState() |= BUTTON_DRAW_PRESSED;
                ImplInvalidateOrDrawCheckBoxState();
                Invalidate();
                Update();
            }
        }
        else
@@ -3248,7 +3250,8 @@ void CheckBox::Tracking( const TrackingEvent& rTEvt )
            if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED )
            {
                ImplGetButtonState() &= ~BUTTON_DRAW_PRESSED;
                ImplInvalidateOrDrawCheckBoxState();
                Invalidate();
                Update();
            }
        }
    }
@@ -3263,13 +3266,15 @@ void CheckBox::KeyInput( const KeyEvent& rKEvt )
        if ( !(ImplGetButtonState() & BUTTON_DRAW_PRESSED) )
        {
            ImplGetButtonState() |= BUTTON_DRAW_PRESSED;
            ImplInvalidateOrDrawCheckBoxState();
            Invalidate();
            Update();
        }
    }
    else if ( (ImplGetButtonState() & BUTTON_DRAW_PRESSED) && (aKeyCode.GetCode() == KEY_ESCAPE) )
    {
        ImplGetButtonState() &= ~BUTTON_DRAW_PRESSED;
        ImplInvalidateOrDrawCheckBoxState();
        Invalidate();
        Update();
    }
    else
        Button::KeyInput( rKEvt );
@@ -3294,7 +3299,7 @@ void CheckBox::FillLayoutData() const
    const_cast<CheckBox*>(this)->Invalidate();
}

void CheckBox::Paint( vcl::RenderContext& rRenderContext, const Rectangle& )
void CheckBox::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
{
    ImplDrawCheckBox(rRenderContext);
}
@@ -3430,7 +3435,8 @@ void CheckBox::LoseFocus()
    if ( ImplGetButtonState() & BUTTON_DRAW_PRESSED )
    {
        ImplGetButtonState() &= ~BUTTON_DRAW_PRESSED;
        ImplInvalidateOrDrawCheckBoxState();
        Invalidate();
        Update();
    }

    HideFocus();
@@ -3790,7 +3796,7 @@ DisclosureButton::DisclosureButton( vcl::Window* pParent, WinBits nStyle ) :
{
}

void DisclosureButton::ImplDrawCheckBoxState()
void DisclosureButton::ImplDrawCheckBoxState(vcl::RenderContext& rRenderContext)
{
    /* HACK: DisclosureButton is currently assuming, that the disclosure sign
       will fit into the rectangle occupied by a normal checkbox on all themes.
@@ -3799,44 +3805,47 @@ void DisclosureButton::ImplDrawCheckBoxState()
       for CTRL_LISTNODE would have to be implemented and taken into account
    */

    Rectangle aStateRect( GetStateRect() );
    Rectangle aStateRect(GetStateRect());

    ImplControlValue    aControlValue( GetState() == TRISTATE_TRUE ? BUTTONVALUE_ON : BUTTONVALUE_OFF );
    Rectangle           aCtrlRegion( aStateRect );
    ControlState        nState = ControlState::NONE;
    ImplControlValue aControlValue(GetState() == TRISTATE_TRUE ? BUTTONVALUE_ON : BUTTONVALUE_OFF);
    Rectangle aCtrlRegion(aStateRect);
    ControlState nState = ControlState::NONE;

    if ( HasFocus() )                       nState |= ControlState::FOCUSED;
    if ( ImplGetButtonState() & BUTTON_DRAW_DEFAULT )   nState |= ControlState::DEFAULT;
    if ( Window::IsEnabled() )              nState |= ControlState::ENABLED;
    if ( IsMouseOver() && GetMouseRect().IsInside( GetPointerPosPixel() ) )
    if (HasFocus())
        nState |= ControlState::FOCUSED;
    if (ImplGetButtonState() & BUTTON_DRAW_DEFAULT)
        nState |= ControlState::DEFAULT;
    if (Window::IsEnabled())
        nState |= ControlState::ENABLED;
    if (IsMouseOver() && GetMouseRect().IsInside(GetPointerPosPixel()))
        nState |= ControlState::ROLLOVER;

    if( ! DrawNativeControl( CTRL_LISTNODE, PART_ENTIRE_CONTROL, aCtrlRegion, nState,
                           aControlValue, OUString() ) )
    if (!rRenderContext.DrawNativeControl(CTRL_LISTNODE, PART_ENTIRE_CONTROL, aCtrlRegion,
                                          nState, aControlValue, OUString()))
    {
        ImplSVCtrlData& rCtrlData( ImplGetSVData()->maCtrlData );
        if( ! rCtrlData.mpDisclosurePlus )
            rCtrlData.mpDisclosurePlus = new Image( BitmapEx( VclResId( SV_DISCLOSURE_PLUS ) ) );
        if( ! rCtrlData.mpDisclosureMinus )
            rCtrlData.mpDisclosureMinus = new Image( BitmapEx( VclResId( SV_DISCLOSURE_MINUS ) ) );
        ImplSVCtrlData& rCtrlData(ImplGetSVData()->maCtrlData);
        if (!rCtrlData.mpDisclosurePlus)
            rCtrlData.mpDisclosurePlus = new Image(BitmapEx(VclResId(SV_DISCLOSURE_PLUS)));
        if (!rCtrlData.mpDisclosureMinus)
            rCtrlData.mpDisclosureMinus = new Image(BitmapEx(VclResId(SV_DISCLOSURE_MINUS)));

        Image* pImg = NULL;
        pImg = IsChecked() ? rCtrlData.mpDisclosureMinus : rCtrlData.mpDisclosurePlus;

        DBG_ASSERT( pImg, "no disclosure image" );
        if( ! pImg )
        DBG_ASSERT(pImg, "no disclosure image");
        if (!pImg)
            return;

        sal_uInt16 nStyle = 0;
        if( ! IsEnabled() )
        if (!IsEnabled())
            nStyle |= IMAGE_DRAW_DISABLE;

        Size aSize( aStateRect.GetSize() );
        Size aImgSize( pImg->GetSizePixel() );
        Point aOff( (aSize.Width() - aImgSize.Width())/2,
                    (aSize.Height() - aImgSize.Height())/2 );
        Size aSize(aStateRect.GetSize());
        Size aImgSize(pImg->GetSizePixel());
        Point aOff((aSize.Width() - aImgSize.Width()) / 2,
                   (aSize.Height() - aImgSize.Height()) / 2);
        aOff += aStateRect.TopLeft();
        DrawImage( aOff, *pImg, nStyle );
        rRenderContext.DrawImage(aOff, *pImg, nStyle);
    }
}