refactor HeadBar to use RenderContext

Change-Id: Ica05591754633fc64216aecbdf8010800133dfd4
diff --git a/include/svtools/headbar.hxx b/include/svtools/headbar.hxx
index 0f411f2..cd99e31 100644
--- a/include/svtools/headbar.hxx
+++ b/include/svtools/headbar.hxx
@@ -271,14 +271,10 @@
    using Window::ImplHitTest;
    SVT_DLLPRIVATE sal_uInt16               ImplHitTest( const Point& rPos, long& nMouseOff, sal_uInt16& nPos ) const;
    SVT_DLLPRIVATE void             ImplInvertDrag( sal_uInt16 nStartPos, sal_uInt16 nEndPos );
    SVT_DLLPRIVATE void             ImplDrawItem( OutputDevice* pDev,
                                      sal_uInt16 nPos, bool bHigh, bool bDrag,
                                      const Rectangle& rItemRect,
                                      const Rectangle* pRect,
                                      sal_uLong nFlags );
    SVT_DLLPRIVATE void             ImplDrawItem( sal_uInt16 nPos, bool bHigh = false,
                                      bool bDrag = false,
                                      const Rectangle* pRect = NULL );
    SVT_DLLPRIVATE void             ImplDrawItem(vcl::RenderContext& rRenderContext, sal_uInt16 nPos, bool bHigh, bool bDrag,
                                                 const Rectangle& rItemRect, const Rectangle* pRect, sal_uLong nFlags);
    SVT_DLLPRIVATE void             ImplDrawItem(vcl::RenderContext& rRenderContext, sal_uInt16 nPos, bool bHigh = false,
                                                 bool bDrag = false, const Rectangle* pRect = NULL);
    SVT_DLLPRIVATE void             ImplUpdate( sal_uInt16 nPos,
                                       bool bEnd = false, bool bDirect = false );
    SVT_DLLPRIVATE void             ImplStartDrag( const Point& rPos, bool bCommand );
@@ -293,7 +289,7 @@
    virtual void        MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
    virtual void        MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
    virtual void        Tracking( const TrackingEvent& rTEvt ) SAL_OVERRIDE;
    virtual void        Paint( vcl::RenderContext& rRenderContext, const Rectangle& rRect ) SAL_OVERRIDE;
    virtual void        Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) SAL_OVERRIDE;
    virtual void        Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) SAL_OVERRIDE;
    virtual void        Resize() SAL_OVERRIDE;
    virtual void        Command( const CommandEvent& rCEvt ) SAL_OVERRIDE;
diff --git a/svtools/source/control/headbar.cxx b/svtools/source/control/headbar.cxx
index 01e9445..bc05547 100644
--- a/svtools/source/control/headbar.cxx
+++ b/svtools/source/control/headbar.cxx
@@ -302,13 +302,9 @@



void HeaderBar::ImplDrawItem( OutputDevice* pDev,
                              sal_uInt16 nPos, bool bHigh, bool bDrag,
                              const Rectangle& rItemRect,
                              const Rectangle* pRect,
                              sal_uLong )
void HeaderBar::ImplDrawItem(vcl::RenderContext& rRenderContext, sal_uInt16 nPos, bool bHigh, bool bDrag,
                             const Rectangle& rItemRect, const Rectangle* pRect, sal_uLong )
{
    vcl::Window *const pWin = (pDev->GetOutDevType()==OUTDEV_WINDOW) ? static_cast<vcl::Window*>(pDev) : NULL;
    ImplControlValue aControlValue(0);
    Rectangle aCtrlRegion;
    ControlState nState(ControlState::NONE);
@@ -316,35 +312,34 @@
    Rectangle aRect = rItemRect;

    // do not display if there is no space
    if ( aRect.GetWidth() <= 1 )
    if (aRect.GetWidth() <= 1)
        return;

    // check of rectangle is visible
    if ( pRect )
    if (pRect)
    {
        if ( aRect.Right() < pRect->Left() )
        if (aRect.Right() < pRect->Left())
            return;
        else if ( aRect.Left() > pRect->Right() )
        else if (aRect.Left() > pRect->Right())
            return;
    }
    else
    {
        if ( aRect.Right() < 0 )
        if (aRect.Right() < 0)
            return;
        else if ( aRect.Left() > mnDX )
        else if (aRect.Left() > mnDX)
            return;
    }

    ImplHeadItem*           pItem  = (*mpItemList)[ nPos ];
    HeaderBarItemBits       nBits = pItem->mnBits;
    const StyleSettings&    rStyleSettings = GetSettings().GetStyleSettings();
    ImplHeadItem* pItem  = (*mpItemList)[nPos];
    HeaderBarItemBits nBits = pItem->mnBits;
    const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();

    if( pWin && pWin->IsNativeControlSupported(CTRL_WINDOW_BACKGROUND, PART_ENTIRE_CONTROL) )
    if (rRenderContext.IsNativeControlSupported(CTRL_WINDOW_BACKGROUND, PART_ENTIRE_CONTROL))
    {
        aCtrlRegion=aRect;
        pWin->DrawNativeControl( CTRL_WINDOW_BACKGROUND, PART_ENTIRE_CONTROL,
                                 aCtrlRegion, nState, aControlValue,
                                 OUString() );
        rRenderContext.DrawNativeControl(CTRL_WINDOW_BACKGROUND, PART_ENTIRE_CONTROL,
                                         aCtrlRegion, nState, aControlValue, OUString());

    }
    else
@@ -356,64 +351,62 @@
        // delete background
        if ( !pRect || bDrag )
        {
            if ( bDrag )
            if (bDrag)
            {
                pDev->SetLineColor();
                pDev->SetFillColor( rStyleSettings.GetCheckedColor() );
                pDev->DrawRect( aRect );
                rRenderContext.SetLineColor();
                rRenderContext.SetFillColor(rStyleSettings.GetCheckedColor());
                rRenderContext.DrawRect(aRect);
            }
            else
                pDev->DrawWallpaper( aRect, GetBackground() );
                rRenderContext.DrawWallpaper(aRect, rRenderContext.GetBackground());
        }
    }

    Color aSelectionTextColor( COL_TRANSPARENT );
    Color aSelectionTextColor(COL_TRANSPARENT);

    if( pWin && pWin->IsNativeControlSupported(CTRL_LISTHEADER, PART_BUTTON) )
    if (rRenderContext.IsNativeControlSupported(CTRL_LISTHEADER, PART_BUTTON))
    {
        aCtrlRegion=aRect;
        aCtrlRegion = aRect;
        aControlValue.setTristateVal(BUTTONVALUE_ON);
        nState|=ControlState::ENABLED;
        if(bHigh)
            nState|=ControlState::PRESSED;
        pWin->DrawNativeControl( CTRL_LISTHEADER, PART_BUTTON,
                                 aCtrlRegion, nState, aControlValue,
                                 OUString() );
        nState |= ControlState::ENABLED;
        if (bHigh)
            nState |= ControlState::PRESSED;
        rRenderContext.DrawNativeControl(CTRL_LISTHEADER, PART_BUTTON,
                                         aCtrlRegion, nState, aControlValue, OUString());
    }
    else
    {
        // draw separation line
        pDev->SetLineColor( rStyleSettings.GetDarkShadowColor() );
        pDev->DrawLine( Point( aRect.Right(), aRect.Top() ),
                        Point( aRect.Right(), aRect.Bottom() ) );
        rRenderContext.SetLineColor(rStyleSettings.GetDarkShadowColor());
        rRenderContext.DrawLine(Point(aRect.Right(), aRect.Top()), Point(aRect.Right(), aRect.Bottom()));

        // draw ButtonStyle
        // avoid 3D borders
        if( bHigh )
            DrawSelectionBackground( aRect, 1, true, false, false, &aSelectionTextColor );
        else if ( !mbButtonStyle || (nBits & HeaderBarItemBits::FLAT) )
            DrawSelectionBackground( aRect, 0, true, false, false, &aSelectionTextColor );
        if (bHigh)
            DrawSelectionBackground(aRect, 1, true, false, false, &aSelectionTextColor);
        else if (!mbButtonStyle || (nBits & HeaderBarItemBits::FLAT))
            DrawSelectionBackground(aRect, 0, true, false, false, &aSelectionTextColor);
    }

    // do not draw if there is no space
    if ( aRect.GetWidth() < 1 )
    if (aRect.GetWidth() < 1)
        return;

    // calculate size and position and draw content
    pItem->maOutText = pItem->maText;
    Size aImageSize = pItem->maImage.GetSizePixel();
    Size aTxtSize( pDev->GetTextWidth( pItem->maOutText ), 0  );
    Size aTxtSize(rRenderContext.GetTextWidth(pItem->maOutText), 0);
    if (!pItem->maOutText.isEmpty())
        aTxtSize.Height() = pDev->GetTextHeight();
        aTxtSize.Height() = rRenderContext.GetTextHeight();
    long nArrowWidth = 0;
    if ( nBits & (HeaderBarItemBits::UPARROW | HeaderBarItemBits::DOWNARROW) )
        nArrowWidth = HEAD_ARROWSIZE2+HEADERBAR_ARROWOFF;
    if (nBits & (HeaderBarItemBits::UPARROW | HeaderBarItemBits::DOWNARROW))
        nArrowWidth = HEAD_ARROWSIZE2 + HEADERBAR_ARROWOFF;

    // do not draw if there is not enough space for the image
    long nTestHeight = aImageSize.Height();
    if ( !(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)) )
    if (!(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)))
        nTestHeight += aTxtSize.Height();
    if ( (aImageSize.Width() > aRect.GetWidth()) || (nTestHeight > aRect.GetHeight()) )
    if ((aImageSize.Width() > aRect.GetWidth()) || (nTestHeight > aRect.GetHeight()))
    {
        aImageSize.Width() = 0;
        aImageSize.Height() = 0;
@@ -421,83 +414,82 @@

    // cut text to correct length
    bool bLeftText = false;
    long nMaxTxtWidth = aRect.GetWidth()-(HEADERBAR_TEXTOFF*2)-nArrowWidth;
    if ( nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE) )
    long nMaxTxtWidth = aRect.GetWidth() - (HEADERBAR_TEXTOFF * 2) - nArrowWidth;
    if (nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE))
        nMaxTxtWidth -= aImageSize.Width();
    long nTxtWidth = aTxtSize.Width();
    if ( nTxtWidth > nMaxTxtWidth )
    if (nTxtWidth > nMaxTxtWidth)
    {
        bLeftText = true;
        OUStringBuffer aBuf(pItem->maOutText);
        aBuf.append("...");
        do
        {
            aBuf.remove(aBuf.getLength()-3-1, 1);
            nTxtWidth = pDev->GetTextWidth( aBuf.toString() );
            aBuf.remove(aBuf.getLength() - 3 - 1, 1);
            nTxtWidth = rRenderContext.GetTextWidth(aBuf.toString());
        }
        while ( (nTxtWidth > nMaxTxtWidth) && (aBuf.getLength() > 3) );
        while ((nTxtWidth > nMaxTxtWidth) && (aBuf.getLength() > 3));
        pItem->maOutText = aBuf.makeStringAndClear();
        if ( pItem->maOutText.getLength() == 3 )
        if (pItem->maOutText.getLength() == 3)
        {
            nTxtWidth = 0;
            (pItem->maOutText).clear();
            pItem->maOutText.clear();
        }
    }

    // calculate text/imageposition
    long nTxtPos;
    if ( !bLeftText && (nBits & HeaderBarItemBits::RIGHT) )
    if (!bLeftText && (nBits & HeaderBarItemBits::RIGHT))
    {
        nTxtPos = aRect.Right()-nTxtWidth-HEADERBAR_TEXTOFF;
        if ( nBits & HeaderBarItemBits::RIGHTIMAGE )
        nTxtPos = aRect.Right() - nTxtWidth - HEADERBAR_TEXTOFF;
        if (nBits & HeaderBarItemBits::RIGHTIMAGE)
            nTxtPos -= aImageSize.Width();
    }
    else if ( !bLeftText && (nBits & HeaderBarItemBits::CENTER) )
    else if (!bLeftText && (nBits & HeaderBarItemBits::CENTER))
    {
        long nTempWidth = nTxtWidth;
        if ( nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE) )
        if (nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE))
            nTempWidth += aImageSize.Width();
        nTxtPos = aRect.Left()+(aRect.GetWidth()-nTempWidth)/2;
        if ( nBits & HeaderBarItemBits::LEFTIMAGE )
        nTxtPos = aRect.Left() + (aRect.GetWidth() - nTempWidth) / 2;
        if (nBits & HeaderBarItemBits::LEFTIMAGE)
            nTxtPos += aImageSize.Width();
        if ( nArrowWidth )
        if (nArrowWidth)
        {
            if ( nTxtPos+nTxtWidth+nArrowWidth >= aRect.Right() )
            if (nTxtPos + nTxtWidth + nArrowWidth >= aRect.Right())
            {
                nTxtPos = aRect.Left()+HEADERBAR_TEXTOFF;
                if ( nBits & HeaderBarItemBits::LEFTIMAGE )
                nTxtPos = aRect.Left() + HEADERBAR_TEXTOFF;
                if (nBits & HeaderBarItemBits::LEFTIMAGE)
                    nTxtPos += aImageSize.Width();
            }
        }
    }
    else
    {
        nTxtPos = aRect.Left()+HEADERBAR_TEXTOFF;
        if ( nBits & HeaderBarItemBits::LEFTIMAGE )
        nTxtPos = aRect.Left() + HEADERBAR_TEXTOFF;
        if (nBits & HeaderBarItemBits::LEFTIMAGE)
            nTxtPos += aImageSize.Width();
        if ( nBits & HeaderBarItemBits::RIGHT )
        if (nBits & HeaderBarItemBits::RIGHT)
            nTxtPos += nArrowWidth;
    }

    // calculate text/imageposition
    long nTxtPosY = 0;
    if ( !pItem->maOutText.isEmpty() || (nArrowWidth && aTxtSize.Height()) )
    if (!pItem->maOutText.isEmpty() || (nArrowWidth && aTxtSize.Height()))
    {
        if ( nBits & HeaderBarItemBits::TOP )
        if (nBits & HeaderBarItemBits::TOP)
        {
            nTxtPosY = aRect.Top();
            if ( !(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)) )
            if (!(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)))
                nTxtPosY += aImageSize.Height();
        }
        else if ( nBits & HeaderBarItemBits::BOTTOM )
        else if (nBits & HeaderBarItemBits::BOTTOM)
            nTxtPosY = aRect.Bottom()-aTxtSize.Height();
        else
        {
            long nTempHeight = aTxtSize.Height();
            if ( !(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)) )
                nTempHeight += aImageSize.Height();
            nTxtPosY = aRect.Top()+((aRect.GetHeight()-nTempHeight)/2);
            if ( !(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)) )
            if (!(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)))
                nTxtPosY += aImageSize.Height();
        }
    }
@@ -505,80 +497,80 @@
    // display text
    if (!pItem->maOutText.isEmpty())
    {
        if( aSelectionTextColor != Color( COL_TRANSPARENT ) )
        if (aSelectionTextColor != Color(COL_TRANSPARENT))
        {
            pDev->Push( PushFlags::TEXTCOLOR );
            pDev->SetTextColor( aSelectionTextColor );
            rRenderContext.Push(PushFlags::TEXTCOLOR);
            rRenderContext.SetTextColor(aSelectionTextColor);
        }
        if ( IsEnabled() )
            pDev->DrawText( Point( nTxtPos, nTxtPosY ), pItem->maOutText );
        if (IsEnabled())
            rRenderContext.DrawText(Point(nTxtPos, nTxtPosY), pItem->maOutText);
        else
            pDev->DrawCtrlText( Point( nTxtPos, nTxtPosY ), pItem->maOutText, 0, pItem->maOutText.getLength(), TEXT_DRAW_DISABLE );
        if( aSelectionTextColor != Color( COL_TRANSPARENT ) )
            pDev->Pop();
            rRenderContext.DrawCtrlText(Point(nTxtPos, nTxtPosY), pItem->maOutText, 0, pItem->maOutText.getLength(), TEXT_DRAW_DISABLE);
        if (aSelectionTextColor != Color(COL_TRANSPARENT))
            rRenderContext.Pop();
    }

    // calculate the position and draw image if it is available
    long nImagePosY = 0;
    if ( aImageSize.Width() && aImageSize.Height() )
    if (aImageSize.Width() && aImageSize.Height())
    {
        long nImagePos = nTxtPos;
        if ( nBits & HeaderBarItemBits::LEFTIMAGE )
        if (nBits & HeaderBarItemBits::LEFTIMAGE)
        {
            nImagePos -= aImageSize.Width();
            if ( nBits & HeaderBarItemBits::RIGHT )
            if (nBits & HeaderBarItemBits::RIGHT)
                nImagePos -= nArrowWidth;
        }
        else if ( nBits & HeaderBarItemBits::RIGHTIMAGE )
        else if (nBits & HeaderBarItemBits::RIGHTIMAGE)
        {
            nImagePos += nTxtWidth;
            if ( !(nBits & HeaderBarItemBits::RIGHT) )
            if (!(nBits & HeaderBarItemBits::RIGHT))
                nImagePos += nArrowWidth;
        }
        else
        {
            if ( nBits & HeaderBarItemBits::RIGHT )
            if (nBits & HeaderBarItemBits::RIGHT )
                nImagePos = aRect.Right()-aImageSize.Width();
            else if ( nBits & HeaderBarItemBits::CENTER )
                nImagePos = aRect.Left()+(aRect.GetWidth()-aImageSize.Width())/2;
            else if (nBits & HeaderBarItemBits::CENTER)
                nImagePos = aRect.Left() + (aRect.GetWidth() - aImageSize.Width()) / 2;
            else
                nImagePos = aRect.Left()+HEADERBAR_TEXTOFF;
                nImagePos = aRect.Left() + HEADERBAR_TEXTOFF;
        }

        if ( nBits & HeaderBarItemBits::TOP )
        if (nBits & HeaderBarItemBits::TOP)
            nImagePosY = aRect.Top();
        else if ( nBits & HeaderBarItemBits::BOTTOM )
        else if (nBits & HeaderBarItemBits::BOTTOM)
        {
            nImagePosY = aRect.Bottom()-aImageSize.Height();
            if ( !(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)) )
            nImagePosY = aRect.Bottom() - aImageSize.Height();
            if (!(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)))
                nImagePosY -= aTxtSize.Height();
        }
        else
        {
            long nTempHeight = aImageSize.Height();
            if ( !(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)) )
            if (!(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)))
                nTempHeight += aTxtSize.Height();
            nImagePosY = aRect.Top()+((aRect.GetHeight()-nTempHeight)/2);
            nImagePosY = aRect.Top() + ((aRect.GetHeight() - nTempHeight) / 2);
        }
        if ( nImagePos+aImageSize.Width() <= aRect.Right() )
        if (nImagePos + aImageSize.Width() <= aRect.Right())
        {
            sal_uInt16 nStyle = 0;
            if ( !IsEnabled() )
            if (!IsEnabled())
                nStyle |= IMAGE_DRAW_DISABLE;
            pDev->DrawImage( Point( nImagePos, nImagePosY ), pItem->maImage, nStyle );
            rRenderContext.DrawImage(Point(nImagePos, nImagePosY), pItem->maImage, nStyle);
        }
    }

    if ( nBits & (HeaderBarItemBits::UPARROW | HeaderBarItemBits::DOWNARROW) )
    if (nBits & (HeaderBarItemBits::UPARROW | HeaderBarItemBits::DOWNARROW))
    {
        long nArrowX = nTxtPos;
        if ( nBits & HeaderBarItemBits::RIGHT )
        if (nBits & HeaderBarItemBits::RIGHT)
            nArrowX -= nArrowWidth;
        else
            nArrowX += nTxtWidth+HEADERBAR_ARROWOFF;
        if ( !(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)) && pItem->maText.isEmpty() )
            nArrowX += nTxtWidth + HEADERBAR_ARROWOFF;
        if (!(nBits & (HeaderBarItemBits::LEFTIMAGE | HeaderBarItemBits::RIGHTIMAGE)) && pItem->maText.isEmpty())
        {
            if ( nBits & HeaderBarItemBits::RIGHT )
            if (nBits & HeaderBarItemBits::RIGHT)
                nArrowX -= aImageSize.Width();
            else
                nArrowX += aImageSize.Width();
@@ -586,63 +578,62 @@

        // is there enough space to draw the item?
        bool bDraw = true;
        if ( nArrowX < aRect.Left()+HEADERBAR_TEXTOFF )
        if (nArrowX < aRect.Left() + HEADERBAR_TEXTOFF)
            bDraw = false;
        else if ( nArrowX+HEAD_ARROWSIZE2 > aRect.Right() )
        else if (nArrowX + HEAD_ARROWSIZE2 > aRect.Right())
            bDraw = false;

        if ( bDraw )
        if (bDraw)
        {
            if( pWin && pWin->IsNativeControlSupported(CTRL_LISTHEADER, PART_ARROW) )
            if (rRenderContext.IsNativeControlSupported(CTRL_LISTHEADER, PART_ARROW))
            {
                aCtrlRegion=Rectangle(Point(nArrowX,aRect.Top()),Size(nArrowWidth,aRect.GetHeight()));
                aCtrlRegion = Rectangle(Point(nArrowX, aRect.Top()), Size(nArrowWidth, aRect.GetHeight()));
                // control value passes 1 if arrow points down, 0 otherwise
                aControlValue.setNumericVal((nBits&HeaderBarItemBits::DOWNARROW)?1:0);
                nState|=ControlState::ENABLED;
                if(bHigh)
                    nState|=ControlState::PRESSED;
                pWin->DrawNativeControl( CTRL_LISTHEADER, PART_ARROW,
                                         aCtrlRegion, nState, aControlValue,
                                         OUString() );
                aControlValue.setNumericVal((nBits & HeaderBarItemBits::DOWNARROW) ? 1 : 0);
                nState |= ControlState::ENABLED;
                if (bHigh)
                    nState |= ControlState::PRESSED;
                rRenderContext.DrawNativeControl(CTRL_LISTHEADER, PART_ARROW, aCtrlRegion,
                                                 nState, aControlValue, OUString());
            }
            else
            {
                long nArrowY;
                if ( aTxtSize.Height() )
                    nArrowY = nTxtPosY+(aTxtSize.Height()/2);
                else if ( aImageSize.Width() && aImageSize.Height() )
                    nArrowY = nImagePosY+(aImageSize.Height()/2);
                if (aTxtSize.Height())
                    nArrowY = nTxtPosY + (aTxtSize.Height() / 2);
                else if (aImageSize.Width() && aImageSize.Height())
                    nArrowY = nImagePosY + (aImageSize.Height() / 2);
                else
                {
                    if ( nBits & HeaderBarItemBits::TOP )
                        nArrowY = aRect.Top()+1;
                    else if ( nBits & HeaderBarItemBits::BOTTOM )
                        nArrowY = aRect.Bottom()-HEAD_ARROWSIZE2-1;
                    if (nBits & HeaderBarItemBits::TOP)
                        nArrowY = aRect.Top() + 1;
                    else if (nBits & HeaderBarItemBits::BOTTOM)
                        nArrowY = aRect.Bottom() - HEAD_ARROWSIZE2 - 1;
                    else
                        nArrowY = aRect.Top()+((aRect.GetHeight()-HEAD_ARROWSIZE2)/2);
                        nArrowY = aRect.Top() + ((aRect.GetHeight() - HEAD_ARROWSIZE2) / 2);
                }
                nArrowY -= HEAD_ARROWSIZE1-1;
                if ( nBits & HeaderBarItemBits::DOWNARROW )
                nArrowY -= HEAD_ARROWSIZE1 - 1;
                if (nBits & HeaderBarItemBits::DOWNARROW)
                {
                    pDev->SetLineColor( rStyleSettings.GetLightColor() );
                    pDev->DrawLine( Point( nArrowX, nArrowY ),
                                    Point( nArrowX+HEAD_ARROWSIZE2, nArrowY ) );
                    pDev->DrawLine( Point( nArrowX, nArrowY ),
                                    Point( nArrowX+HEAD_ARROWSIZE1, nArrowY+HEAD_ARROWSIZE2 ) );
                    pDev->SetLineColor( rStyleSettings.GetShadowColor() );
                    pDev->DrawLine( Point( nArrowX+HEAD_ARROWSIZE1, nArrowY+HEAD_ARROWSIZE2 ),
                                    Point( nArrowX+HEAD_ARROWSIZE2, nArrowY ) );
                    rRenderContext.SetLineColor(rStyleSettings.GetLightColor());
                    rRenderContext.DrawLine(Point(nArrowX, nArrowY),
                                            Point(nArrowX + HEAD_ARROWSIZE2, nArrowY));
                    rRenderContext.DrawLine(Point(nArrowX, nArrowY),
                                            Point(nArrowX + HEAD_ARROWSIZE1, nArrowY + HEAD_ARROWSIZE2));
                    rRenderContext.SetLineColor(rStyleSettings.GetShadowColor());
                    rRenderContext.DrawLine(Point(nArrowX + HEAD_ARROWSIZE1, nArrowY + HEAD_ARROWSIZE2),
                                            Point(nArrowX + HEAD_ARROWSIZE2, nArrowY));
                }
                else
                {
                    pDev->SetLineColor( rStyleSettings.GetLightColor() );
                    pDev->DrawLine( Point( nArrowX, nArrowY+HEAD_ARROWSIZE2 ),
                                    Point( nArrowX+HEAD_ARROWSIZE1, nArrowY ) );
                    pDev->SetLineColor( rStyleSettings.GetShadowColor() );
                    pDev->DrawLine( Point( nArrowX, nArrowY+HEAD_ARROWSIZE2 ),
                                    Point( nArrowX+HEAD_ARROWSIZE2, nArrowY+HEAD_ARROWSIZE2 ) );
                    pDev->DrawLine( Point( nArrowX+HEAD_ARROWSIZE2, nArrowY+HEAD_ARROWSIZE2 ),
                                    Point( nArrowX+HEAD_ARROWSIZE1, nArrowY ) );
                    rRenderContext.SetLineColor(rStyleSettings.GetLightColor());
                    rRenderContext.DrawLine(Point(nArrowX, nArrowY + HEAD_ARROWSIZE2),
                                            Point(nArrowX + HEAD_ARROWSIZE1, nArrowY));
                    rRenderContext.SetLineColor(rStyleSettings.GetShadowColor());
                    rRenderContext.DrawLine(Point(nArrowX, nArrowY + HEAD_ARROWSIZE2),
                                            Point(nArrowX + HEAD_ARROWSIZE2, nArrowY + HEAD_ARROWSIZE2));
                    rRenderContext.DrawLine(Point(nArrowX + HEAD_ARROWSIZE2, nArrowY + HEAD_ARROWSIZE2),
                                            Point(nArrowX + HEAD_ARROWSIZE1, nArrowY));
                }
            }
        }
@@ -651,54 +642,34 @@



void HeaderBar::ImplDrawItem( sal_uInt16 nPos, bool bHigh, bool bDrag,
                              const Rectangle* pRect )
void HeaderBar::ImplDrawItem(vcl::RenderContext& rRenderContext, sal_uInt16 nPos,
                             bool bHigh, bool bDrag, const Rectangle* pRect )
{
    Rectangle aRect = ImplGetItemRect( nPos );
    ImplDrawItem( this, nPos, bHigh, bDrag, aRect, pRect, 0 );
    Rectangle aRect = ImplGetItemRect(nPos);
    ImplDrawItem(rRenderContext, nPos, bHigh, bDrag, aRect, pRect, 0 );
}



void HeaderBar::ImplUpdate( sal_uInt16 nPos, bool bEnd, bool bDirect )
void HeaderBar::ImplUpdate(sal_uInt16 nPos, bool bEnd, bool /*bDirect*/)
{
    if ( IsVisible() && IsUpdateMode() )
    if (IsVisible() && IsUpdateMode())
    {
        if ( !bDirect )
        {
            Rectangle   aRect;
            size_t      nItemCount = mpItemList->size();
            if ( nPos < nItemCount )
                aRect = ImplGetItemRect( nPos );
            else
            {
                aRect.Bottom() = mnDY-1;
                if ( nItemCount )
                    aRect.Left() = ImplGetItemRect( nItemCount-1 ).Right();
            }
            if ( bEnd )
                aRect.Right() = mnDX-1;
            aRect.Top()     += mnBorderOff1;
            aRect.Bottom()  -= mnBorderOff2;
            Invalidate( aRect );
        }
        Rectangle aRect;
        size_t nItemCount = mpItemList->size();
        if (nPos < nItemCount)
            aRect = ImplGetItemRect(nPos);
        else
        {
            for ( size_t i = nPos; i < mpItemList->size(); i++ )
                ImplDrawItem( i );
            if ( bEnd )
            {
                Rectangle aRect = ImplGetItemRect( (sal_uInt16)mpItemList->size() );
                aRect.Left()  = aRect.Right();
                aRect.Right() = mnDX-1;
                if ( aRect.Left() < aRect.Right() )
                {
                    aRect.Top()     += mnBorderOff1;
                    aRect.Bottom()  -= mnBorderOff2;
                    Erase( aRect );
                }
            }
            aRect.Bottom() = mnDY - 1;
            if (nItemCount)
                aRect.Left() = ImplGetItemRect(nItemCount - 1).Right();
        }
        if (bEnd)
            aRect.Right() = mnDX - 1;
        aRect.Top() += mnBorderOff1;
        aRect.Bottom() -= mnBorderOff2;
        Invalidate(aRect);
    }
}

@@ -752,8 +723,8 @@
            mnStartPos = rMousePos.X()-mnMouseOff;
            mnDragPos = mnStartPos;
            StartDrag();
            if ( mbItemMode )
                ImplDrawItem( nPos, true, mbItemDrag );
            if (mbItemMode)
                Invalidate();
            else
            {
                Rectangle aSizeRect( mnDragPos, 0, mnDragPos, mnDragSize+mnDY );
@@ -789,7 +760,7 @@
            if ( (rMousePos.Y() >= aItemRect.Top()) && (rMousePos.Y() <= aItemRect.Bottom()) )
            {
                mbItemDrag = true;
                ImplDrawItem( nPos, true, mbItemDrag );
                Invalidate();
            }
        }

@@ -836,12 +807,12 @@
                 (nOldItemDragPos != HEADERBAR_ITEM_NOTFOUND) )
            {
                ImplInvertDrag( nPos, nOldItemDragPos );
                ImplDrawItem( nOldItemDragPos );
                Invalidate();
            }
        }

        if ( bNewOutDrag != mbOutDrag )
            ImplDrawItem( nPos, !bNewOutDrag, mbItemDrag );
            Invalidate();

        if ( mbItemDrag  )
        {
@@ -849,7 +820,7 @@
                 (mnItemDragPos != nPos) &&
                 (mnItemDragPos != HEADERBAR_ITEM_NOTFOUND) )
            {
                ImplDrawItem( mnItemDragPos, false, true );
                Invalidate();
                ImplInvertDrag( nPos, mnItemDragPos );
            }
        }
@@ -883,8 +854,7 @@
    {
        if ( mbItemMode && (!mbOutDrag || mbItemDrag) )
        {
            sal_uInt16 nPos = GetItemPos( mnCurItemId );
            ImplDrawItem( nPos );
            Invalidate();
        }

        mnCurItemId = 0;
@@ -905,7 +875,7 @@
                    MoveItem( mnCurItemId, mnItemDragPos );
                }
                else
                    ImplDrawItem( nPos );
                    Invalidate();
            }
            else
            {
@@ -992,31 +962,31 @@



void HeaderBar::Paint( vcl::RenderContext& /*rRenderContext*/, const Rectangle& rRect )
void HeaderBar::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect)
{
    if ( mnBorderOff1 || mnBorderOff2 )
    if (mnBorderOff1 || mnBorderOff2)
    {
        SetLineColor( GetSettings().GetStyleSettings().GetDarkShadowColor() );
        if ( mnBorderOff1 )
            DrawLine( Point( 0, 0 ), Point( mnDX-1, 0 ) );
        if ( mnBorderOff2 )
            DrawLine( Point( 0, mnDY-1 ), Point( mnDX-1, mnDY-1 ) );
        rRenderContext.SetLineColor(rRenderContext.GetSettings().GetStyleSettings().GetDarkShadowColor());
        if (mnBorderOff1)
            rRenderContext.DrawLine(Point(0, 0), Point(mnDX - 1, 0));
        if (mnBorderOff2)
            rRenderContext.DrawLine(Point(0, mnDY - 1), Point(mnDX - 1, mnDY - 1));
        // #i40393# draw left and right border, if WB_BORDER was set in ImplInit()
        if ( mnBorderOff1 && mnBorderOff2 )
        if (mnBorderOff1 && mnBorderOff2)
        {
            DrawLine( Point( 0, 0 ), Point( 0, mnDY-1 ) );
            DrawLine( Point( mnDX-1, 0 ), Point( mnDX-1, mnDY-1 ) );
            rRenderContext.DrawLine(Point(0, 0), Point(0, mnDY - 1));
            rRenderContext.DrawLine(Point(mnDX - 1, 0), Point(mnDX - 1, mnDY - 1));
        }
    }

    sal_uInt16 nCurItemPos;
    if ( mbDrag )
        nCurItemPos = GetItemPos( mnCurItemId );
    if (mbDrag)
        nCurItemPos = GetItemPos(mnCurItemId);
    else
        nCurItemPos = HEADERBAR_ITEM_NOTFOUND;
    sal_uInt16 nItemCount = (sal_uInt16)mpItemList->size();
    for ( sal_uInt16 i = 0; i < nItemCount; i++ )
        ImplDrawItem( i, (i == nCurItemPos), false, &rRect );
    sal_uInt16 nItemCount = static_cast<sal_uInt16>(mpItemList->size());
    for (sal_uInt16 i = 0; i < nItemCount; i++)
        ImplDrawItem(rRenderContext, i, (i == nCurItemPos), false, &rRect);
}


@@ -1068,7 +1038,7 @@
            aItemRect.Right() = 16000;
        vcl::Region aRegion( aRect );
        pDev->SetClipRegion( aRegion );
        ImplDrawItem( pDev, i, false, false, aItemRect, &aRect, nFlags );
        ImplDrawItem(*pDev, i, false, false, aItemRect, &aRect, nFlags );
        pDev->SetClipRegion();
    }