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 )