move ColorListBox beside sole thing that uses it

Change-Id: Ia458ded8881c415badd5d75bddad0daca57a1a25
diff --git a/include/svtools/ctrlbox.hxx b/include/svtools/ctrlbox.hxx
index c1ad071..28d1a34 100644
--- a/include/svtools/ctrlbox.hxx
+++ b/include/svtools/ctrlbox.hxx
@@ -42,17 +42,6 @@ typedef ::std::vector< FontMetric         > ImplFontList;

/*************************************************************************

Description
============

class ColorListBox

Description

Allows color selection

--------------------------------------------------------------------------

class LineListBox

Description
@@ -141,75 +130,6 @@ FontList; FontNameBox; FontStyleBox; FontSizeMenu

*************************************************************************/

class SVT_DLLPUBLIC ColorListBox : public ListBox
{
    ImpColorList*   pColorList; // separate liste, in case of user data are required from outside
    Size            aImageSize;

    using Window::ImplInit;
    SVT_DLLPRIVATE void         ImplInit();
    SVT_DLLPRIVATE void         ImplDestroyColorEntries();

public:
                    ColorListBox( vcl::Window* pParent,
                                  WinBits nWinStyle = WB_BORDER );
    virtual         ~ColorListBox() override;
    virtual void    dispose() override;

    virtual void    UserDraw( const UserDrawEvent& rUDEvt ) override;

    using ListBox::InsertEntry;
    sal_Int32       InsertEntry( const OUString& rStr,
                                 sal_Int32  nPos = LISTBOX_APPEND );
    sal_Int32       InsertEntry( const Color& rColor, const OUString& rStr,
                                 sal_Int32  nPos = LISTBOX_APPEND );
    void            InsertAutomaticEntryColor(const Color &rAutoColorValue);
    bool            IsAutomaticSelected() { return !GetSelectEntryPos(); }
    using ListBox::RemoveEntry;
    void            RemoveEntry( sal_Int32  nPos );
    void            Clear();
    void            CopyEntries( const ColorListBox& rBox );

    using ListBox::GetEntryPos;
    sal_Int32       GetEntryPos( const Color& rColor ) const;
    Color           GetEntryColor( sal_Int32  nPos ) const;

    void            SelectEntry( const OUString& rStr )
                        { ListBox::SelectEntry( rStr ); }
    void            SelectEntry( const Color& rColor );
    Color           GetSelectEntryColor() const;
    using ListBox::IsEntrySelected;

    bool            IsEntrySelected(const Color& rColor) const
    {
        sal_Int32  nPos = GetEntryPos( rColor );
        if ( nPos != LISTBOX_ENTRY_NOTFOUND )
            return IsEntryPosSelected( nPos );
        else
            return false;
    }

private:
                    ColorListBox( const ColorListBox& ) = delete;
    ColorListBox&   operator =( const ColorListBox& ) = delete;
};

inline void ColorListBox::SelectEntry( const Color& rColor )
{
    sal_Int32  nPos = GetEntryPos( rColor );
    if ( nPos != LISTBOX_ENTRY_NOTFOUND )
        ListBox::SelectEntryPos( nPos );
}

inline Color ColorListBox::GetSelectEntryColor() const
{
    sal_Int32  nPos = GetSelectEntryPos();
    Color aColor;
    if ( nPos != LISTBOX_ENTRY_NOTFOUND )
        aColor = GetEntryColor( nPos );
    return aColor;
}

/**
    Class computing border widths shared between Line style listbox and the
    SvxBorderLine implementation.
diff --git a/include/svtools/svtools.hrc b/include/svtools/svtools.hrc
index 92cc809..c149f86 100644
--- a/include/svtools/svtools.hrc
+++ b/include/svtools/svtools.hrc
@@ -26,8 +26,6 @@

// various unsorted stuff

#define STR_SVT_AUTOMATIC_COLOR         (RID_SVTOOLS_START+16)

#define STR_SVT_FILEVIEW_COLUMN_TITLE   (RID_SVTOOLS_START + 20)
#define STR_SVT_FILEVIEW_COLUMN_SIZE    (RID_SVTOOLS_START + 21)
#define STR_SVT_FILEVIEW_COLUMN_DATE    (RID_SVTOOLS_START + 22)
diff --git a/include/svx/dlgctrl.hxx b/include/svx/dlgctrl.hxx
index 5a2c217..64ec881 100644
--- a/include/svx/dlgctrl.hxx
+++ b/include/svx/dlgctrl.hxx
@@ -207,6 +207,75 @@ public:

/************************************************************************/

class SAL_WARN_UNUSED SVX_DLLPUBLIC ColorListBox : public ListBox
{
    ImpColorList*   pColorList; // separate liste, in case of user data are required from outside
    Size            aImageSize;

    using Window::ImplInit;
    SVT_DLLPRIVATE void         ImplInit();
    SVT_DLLPRIVATE void         ImplDestroyColorEntries();

public:
                    ColorListBox( vcl::Window* pParent,
                                  WinBits nWinStyle = WB_BORDER );
    virtual         ~ColorListBox() override;
    virtual void    dispose() override;

    virtual void    UserDraw( const UserDrawEvent& rUDEvt ) override;

    using ListBox::InsertEntry;
    sal_Int32       InsertEntry( const OUString& rStr,
                                 sal_Int32  nPos = LISTBOX_APPEND );
    sal_Int32       InsertEntry( const Color& rColor, const OUString& rStr,
                                 sal_Int32  nPos = LISTBOX_APPEND );
    bool            IsAutomaticSelected() { return !GetSelectEntryPos(); }
    using ListBox::RemoveEntry;
    void            RemoveEntry( sal_Int32  nPos );
    void            Clear();
    void            CopyEntries( const ColorListBox& rBox );

    using ListBox::GetEntryPos;
    sal_Int32       GetEntryPos( const Color& rColor ) const;
    Color           GetEntryColor( sal_Int32  nPos ) const;

    void            SelectEntry( const OUString& rStr )
                        { ListBox::SelectEntry( rStr ); }
    void            SelectEntry( const Color& rColor );
    Color           GetSelectEntryColor() const;
    using ListBox::IsEntrySelected;

    bool            IsEntrySelected(const Color& rColor) const
    {
        sal_Int32  nPos = GetEntryPos( rColor );
        if ( nPos != LISTBOX_ENTRY_NOTFOUND )
            return IsEntryPosSelected( nPos );
        else
            return false;
    }

private:
                    ColorListBox( const ColorListBox& ) = delete;
    ColorListBox&   operator =( const ColorListBox& ) = delete;
};

inline void ColorListBox::SelectEntry( const Color& rColor )
{
    sal_Int32  nPos = GetEntryPos( rColor );
    if ( nPos != LISTBOX_ENTRY_NOTFOUND )
        ListBox::SelectEntryPos( nPos );
}

inline Color ColorListBox::GetSelectEntryColor() const
{
    sal_Int32  nPos = GetSelectEntryPos();
    Color aColor;
    if ( nPos != LISTBOX_ENTRY_NOTFOUND )
        aColor = GetEntryColor( nPos );
    return aColor;
}


class SAL_WARN_UNUSED SVX_DLLPUBLIC ColorLB : public ColorListBox
{

diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx
index b54e54c..ce72348 100644
--- a/svtools/source/control/ctrlbox.cxx
+++ b/svtools/source/control/ctrlbox.cxx
@@ -59,218 +59,6 @@
#define FONTNAMEBOXMRUENTRIESFILE "/user/config/fontnameboxmruentries"


class ImplColorListData
{
public:
    Color       aColor;
    bool        bColor;

                ImplColorListData() : aColor( COL_BLACK ) { bColor = false; }
                explicit ImplColorListData( const Color& rColor ) : aColor( rColor ) { bColor = true; }
};

void ColorListBox::ImplInit()
{
    pColorList = new ImpColorList();

    const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
    aImageSize = rStyleSettings.GetListBoxPreviewDefaultPixelSize();
    EnableUserDraw( true );
    SetUserItemSize( aImageSize );
}

void ColorListBox::ImplDestroyColorEntries()
{
    for ( size_t n = pColorList->size(); n; )
        delete (*pColorList)[ --n ];
    pColorList->clear();
}

ColorListBox::ColorListBox( vcl::Window* pParent, WinBits nWinStyle ) :
    ListBox( pParent, nWinStyle )
{
    ImplInit();
    SetEdgeBlending(true);
}

ColorListBox::~ColorListBox()
{
    disposeOnce();
}

void ColorListBox::dispose()
{
    if ( pColorList )
    {
        ImplDestroyColorEntries();
        delete pColorList;
        pColorList = nullptr;
    }
    ListBox::dispose();
}

sal_Int32 ColorListBox::InsertEntry( const OUString& rStr, sal_Int32 nPos )
{
    nPos = ListBox::InsertEntry( rStr, nPos );
    if ( nPos != LISTBOX_ERROR )
    {
        ImplColorListData* pData = new ImplColorListData;
        if ( static_cast<size_t>(nPos) < pColorList->size() )
        {
            ImpColorList::iterator it = pColorList->begin();
            ::std::advance( it, nPos );
            pColorList->insert( it, pData );
        }
        else
        {
            pColorList->push_back( pData );
            nPos = pColorList->size() - 1;
        }
    }
    return nPos;
}

sal_Int32 ColorListBox::InsertEntry( const Color& rColor, const OUString& rStr,
                                sal_Int32 nPos )
{
    nPos = ListBox::InsertEntry( rStr, nPos );
    if ( nPos != LISTBOX_ERROR )
    {
        ImplColorListData* pData = new ImplColorListData( rColor );
        if ( static_cast<size_t>(nPos) < pColorList->size() )
        {
            ImpColorList::iterator it = pColorList->begin();
            ::std::advance( it, nPos );
            pColorList->insert( it, pData );
        }
        else
        {
            pColorList->push_back( pData );
            nPos = pColorList->size() - 1;
        }
    }
    return nPos;
}

void ColorListBox::InsertAutomaticEntryColor(const Color &rColor)
{
    // insert the "Automatic"-entry always on the first position
    InsertEntry( rColor, SVT_RESSTR(STR_SVT_AUTOMATIC_COLOR), 0 );
}

void ColorListBox::RemoveEntry( sal_Int32 nPos )
{
    ListBox::RemoveEntry( nPos );
    if ( 0 <= nPos && static_cast<size_t>(nPos) < pColorList->size() )
    {
            ImpColorList::iterator it = pColorList->begin();
            ::std::advance( it, nPos );
            delete *it;
            pColorList->erase( it );
    }
}

void ColorListBox::Clear()
{
    ImplDestroyColorEntries();
    ListBox::Clear();
}

void ColorListBox::CopyEntries( const ColorListBox& rBox )
{
    // Liste leeren
    ImplDestroyColorEntries();

    // Daten kopieren
    size_t nCount = rBox.pColorList->size();
    for ( size_t n = 0; n < nCount; n++ )
    {
        ImplColorListData* pData = (*rBox.pColorList)[ n ];
        sal_Int32 nPos = InsertEntry( rBox.GetEntry( n ) );
        if ( nPos != LISTBOX_ERROR )
        {
            if ( static_cast<size_t>(nPos) < pColorList->size() )
            {
                ImpColorList::iterator it = pColorList->begin();
                ::std::advance( it, nPos );
                pColorList->insert( it, new ImplColorListData( *pData ) );
            }
            else
            {
                pColorList->push_back( new ImplColorListData( *pData ) );
            }
        }
    }
}

sal_Int32 ColorListBox::GetEntryPos( const Color& rColor ) const
{
    for( sal_Int32 n = (sal_Int32) pColorList->size(); n; )
    {
        ImplColorListData* pData = (*pColorList)[ --n ];
        if ( pData->bColor && ( pData->aColor == rColor ) )
            return n;
    }
    return LISTBOX_ENTRY_NOTFOUND;
}

Color ColorListBox::GetEntryColor( sal_Int32 nPos ) const
{
    Color aColor;
    ImplColorListData* pData = ( 0 <= nPos && static_cast<size_t>(nPos) < pColorList->size() ) ?
        (*pColorList)[ nPos ] : nullptr;
    if ( pData && pData->bColor )
        aColor = pData->aColor;
    return aColor;
}

void ColorListBox::UserDraw( const UserDrawEvent& rUDEvt )
{
    size_t nPos = rUDEvt.GetItemId();
    ImplColorListData* pData = ( nPos < pColorList->size() ) ? (*pColorList)[ nPos ] : nullptr;
    if ( pData )
    {
        if ( pData->bColor )
        {
            Point aPos( rUDEvt.GetRect().TopLeft() );

            aPos.X() += 2;
            aPos.Y() += ( rUDEvt.GetRect().GetHeight() - aImageSize.Height() ) / 2;

            const Rectangle aRect(aPos, aImageSize);

            vcl::RenderContext* pRenderContext = rUDEvt.GetRenderContext();
            pRenderContext->Push();
            pRenderContext->SetFillColor(pData->aColor);
            pRenderContext->SetLineColor(pRenderContext->GetTextColor());
            pRenderContext->DrawRect(aRect);
            pRenderContext->Pop();

            const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
            const sal_uInt16 nEdgeBlendingPercent(GetEdgeBlending() ? rStyleSettings.GetEdgeBlending() : 0);

            if(nEdgeBlendingPercent)
            {
                const Color& rTopLeft(rStyleSettings.GetEdgeBlendingTopLeftColor());
                const Color& rBottomRight(rStyleSettings.GetEdgeBlendingBottomRightColor());
                const sal_uInt8 nAlpha((nEdgeBlendingPercent * 255) / 100);
                const BitmapEx aBlendFrame(createBlendFrame(aRect.GetSize(), nAlpha, rTopLeft, rBottomRight));

                if(!aBlendFrame.IsEmpty())
                {
                    pRenderContext->DrawBitmapEx(aRect.TopLeft(), aBlendFrame);
                }
            }

            ListBox::DrawEntry( rUDEvt, false, false );
        }
        else
            ListBox::DrawEntry( rUDEvt, false, true );
    }
    else
        ListBox::DrawEntry( rUDEvt, true, false );
}

BorderWidthImpl::BorderWidthImpl( BorderWidthImplFlags nFlags, double nRate1, double nRate2, double nRateGap ):
    m_nFlags( nFlags ),
    m_nRate1( nRate1 ),
diff --git a/svtools/source/control/ctrlbox.src b/svtools/source/control/ctrlbox.src
index 36036d9..4d04006c 100644
--- a/svtools/source/control/ctrlbox.src
+++ b/svtools/source/control/ctrlbox.src
@@ -18,11 +18,6 @@
 */
#include <svtools/svtools.hrc>

String STR_SVT_AUTOMATIC_COLOR
{
    Text [ en-US ] = "Automatic";
};

/*
 * resources for CollatorResource / CollatorResourceData resp.
 */
diff --git a/svx/source/dialog/dlgctrl.cxx b/svx/source/dialog/dlgctrl.cxx
index 0ee46f7..8793cfd 100644
--- a/svx/source/dialog/dlgctrl.cxx
+++ b/svx/source/dialog/dlgctrl.cxx
@@ -1117,6 +1117,213 @@ VCL_BUILDER_DECL_FACTORY(ColorLB)
    rRet = pListBox;
}

class ImplColorListData
{
public:
    Color       aColor;
    bool        bColor;

                ImplColorListData() : aColor( COL_BLACK ) { bColor = false; }
                explicit ImplColorListData( const Color& rColor ) : aColor( rColor ) { bColor = true; }
};

void ColorListBox::ImplInit()
{
    pColorList = new ImpColorList();

    const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
    aImageSize = rStyleSettings.GetListBoxPreviewDefaultPixelSize();
    EnableUserDraw( true );
    SetUserItemSize( aImageSize );
}

void ColorListBox::ImplDestroyColorEntries()
{
    for ( size_t n = pColorList->size(); n; )
        delete (*pColorList)[ --n ];
    pColorList->clear();
}

ColorListBox::ColorListBox( vcl::Window* pParent, WinBits nWinStyle ) :
    ListBox( pParent, nWinStyle )
{
    ImplInit();
    SetEdgeBlending(true);
}

ColorListBox::~ColorListBox()
{
    disposeOnce();
}

void ColorListBox::dispose()
{
    if ( pColorList )
    {
        ImplDestroyColorEntries();
        delete pColorList;
        pColorList = nullptr;
    }
    ListBox::dispose();
}

sal_Int32 ColorListBox::InsertEntry( const OUString& rStr, sal_Int32 nPos )
{
    nPos = ListBox::InsertEntry( rStr, nPos );
    if ( nPos != LISTBOX_ERROR )
    {
        ImplColorListData* pData = new ImplColorListData;
        if ( static_cast<size_t>(nPos) < pColorList->size() )
        {
            ImpColorList::iterator it = pColorList->begin();
            ::std::advance( it, nPos );
            pColorList->insert( it, pData );
        }
        else
        {
            pColorList->push_back( pData );
            nPos = pColorList->size() - 1;
        }
    }
    return nPos;
}

sal_Int32 ColorListBox::InsertEntry( const Color& rColor, const OUString& rStr,
                                sal_Int32 nPos )
{
    nPos = ListBox::InsertEntry( rStr, nPos );
    if ( nPos != LISTBOX_ERROR )
    {
        ImplColorListData* pData = new ImplColorListData( rColor );
        if ( static_cast<size_t>(nPos) < pColorList->size() )
        {
            ImpColorList::iterator it = pColorList->begin();
            ::std::advance( it, nPos );
            pColorList->insert( it, pData );
        }
        else
        {
            pColorList->push_back( pData );
            nPos = pColorList->size() - 1;
        }
    }
    return nPos;
}

void ColorListBox::RemoveEntry( sal_Int32 nPos )
{
    ListBox::RemoveEntry( nPos );
    if ( 0 <= nPos && static_cast<size_t>(nPos) < pColorList->size() )
    {
            ImpColorList::iterator it = pColorList->begin();
            ::std::advance( it, nPos );
            delete *it;
            pColorList->erase( it );
    }
}

void ColorListBox::Clear()
{
    ImplDestroyColorEntries();
    ListBox::Clear();
}

void ColorListBox::CopyEntries( const ColorListBox& rBox )
{
    // Liste leeren
    ImplDestroyColorEntries();

    // Daten kopieren
    size_t nCount = rBox.pColorList->size();
    for ( size_t n = 0; n < nCount; n++ )
    {
        ImplColorListData* pData = (*rBox.pColorList)[ n ];
        sal_Int32 nPos = InsertEntry( rBox.GetEntry( n ) );
        if ( nPos != LISTBOX_ERROR )
        {
            if ( static_cast<size_t>(nPos) < pColorList->size() )
            {
                ImpColorList::iterator it = pColorList->begin();
                ::std::advance( it, nPos );
                pColorList->insert( it, new ImplColorListData( *pData ) );
            }
            else
            {
                pColorList->push_back( new ImplColorListData( *pData ) );
            }
        }
    }
}

sal_Int32 ColorListBox::GetEntryPos( const Color& rColor ) const
{
    for( sal_Int32 n = (sal_Int32) pColorList->size(); n; )
    {
        ImplColorListData* pData = (*pColorList)[ --n ];
        if ( pData->bColor && ( pData->aColor == rColor ) )
            return n;
    }
    return LISTBOX_ENTRY_NOTFOUND;
}

Color ColorListBox::GetEntryColor( sal_Int32 nPos ) const
{
    Color aColor;
    ImplColorListData* pData = ( 0 <= nPos && static_cast<size_t>(nPos) < pColorList->size() ) ?
        (*pColorList)[ nPos ] : nullptr;
    if ( pData && pData->bColor )
        aColor = pData->aColor;
    return aColor;
}

void ColorListBox::UserDraw( const UserDrawEvent& rUDEvt )
{
    size_t nPos = rUDEvt.GetItemId();
    ImplColorListData* pData = ( nPos < pColorList->size() ) ? (*pColorList)[ nPos ] : nullptr;
    if ( pData )
    {
        if ( pData->bColor )
        {
            Point aPos( rUDEvt.GetRect().TopLeft() );

            aPos.X() += 2;
            aPos.Y() += ( rUDEvt.GetRect().GetHeight() - aImageSize.Height() ) / 2;

            const Rectangle aRect(aPos, aImageSize);

            vcl::RenderContext* pRenderContext = rUDEvt.GetRenderContext();
            pRenderContext->Push();
            pRenderContext->SetFillColor(pData->aColor);
            pRenderContext->SetLineColor(pRenderContext->GetTextColor());
            pRenderContext->DrawRect(aRect);
            pRenderContext->Pop();

            const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
            const sal_uInt16 nEdgeBlendingPercent(GetEdgeBlending() ? rStyleSettings.GetEdgeBlending() : 0);

            if(nEdgeBlendingPercent)
            {
                const Color& rTopLeft(rStyleSettings.GetEdgeBlendingTopLeftColor());
                const Color& rBottomRight(rStyleSettings.GetEdgeBlendingBottomRightColor());
                const sal_uInt8 nAlpha((nEdgeBlendingPercent * 255) / 100);
                const BitmapEx aBlendFrame(createBlendFrame(aRect.GetSize(), nAlpha, rTopLeft, rBottomRight));

                if(!aBlendFrame.IsEmpty())
                {
                    pRenderContext->DrawBitmapEx(aRect.TopLeft(), aBlendFrame);
                }
            }

            ListBox::DrawEntry( rUDEvt, false, false );
        }
        else
            ListBox::DrawEntry( rUDEvt, false, true );
    }
    else
        ListBox::DrawEntry( rUDEvt, true, false );
}


// Fills the Listbox with color and strings

void ColorLB::Fill( const XColorListRef &pColorTab )