summaryrefslogtreecommitdiff
path: root/cui/source/options/optchart.cxx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-11-04 14:19:44 +0000
committerCaolán McNamara <caolanm@redhat.com>2016-11-04 17:14:27 +0000
commita19b18ad7c9eb0197c10e6d7e451ec4542e4bc9e (patch)
tree5c7c440cdd8e279c51681a5119beef21246b4ca9 /cui/source/options/optchart.cxx
parenta989a0b1f2b425f05b58d0e44ce2de31c842ed65 (diff)
move now combined ColorLB to location of last user
Change-Id: I5dc1204c28b65d5dca993bf38aea217bbb49e913
Diffstat (limited to 'cui/source/options/optchart.cxx')
-rw-r--r--cui/source/options/optchart.cxx328
1 files changed, 328 insertions, 0 deletions
diff --git a/cui/source/options/optchart.cxx b/cui/source/options/optchart.cxx
index 3d95da759c74..254b464f9890 100644
--- a/cui/source/options/optchart.cxx
+++ b/cui/source/options/optchart.cxx
@@ -21,9 +21,337 @@
#include <cuires.hrc>
#include "optchart.hxx"
#include <dialmgr.hxx>
+#include <vcl/builderfactory.hxx>
#include <vcl/msgbox.hxx>
+#include <vcl/svapp.hxx>
#include <svx/svxids.hrc>
+class SAL_WARN_UNUSED SVX_DLLPUBLIC ColorLB : 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:
+ ColorLB( vcl::Window* pParent,
+ WinBits nWinStyle = WB_BORDER );
+ virtual ~ColorLB() 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 ColorLB& 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 )
+ {
+ sal_Int32 nPos = GetEntryPos( rColor );
+ if ( nPos != LISTBOX_ENTRY_NOTFOUND )
+ ListBox::SelectEntryPos( nPos );
+ }
+
+ Color GetSelectEntryColor() const
+ {
+ sal_Int32 nPos = GetSelectEntryPos();
+ Color aColor;
+ if ( nPos != LISTBOX_ENTRY_NOTFOUND )
+ aColor = GetEntryColor( nPos );
+ return aColor;
+ }
+
+ 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;
+ }
+
+ void Fill( const XColorListRef &pTab );
+
+ void Append( const XColorEntry& rEntry );
+ void Modify( const XColorEntry& rEntry, sal_Int32 nPos );
+
+private:
+ ColorLB( const ColorLB& ) = delete;
+ ColorLB& operator =( const ColorLB& ) = delete;
+};
+
+VCL_BUILDER_DECL_FACTORY(ColorLB)
+{
+ bool bDropdown = VclBuilder::extractDropdown(rMap);
+ WinBits nWinBits = WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_SIMPLEMODE|WB_TABSTOP;
+ if (bDropdown)
+ nWinBits |= WB_DROPDOWN;
+ OString sBorder = VclBuilder::extractCustomProperty(rMap);
+ if (!sBorder.isEmpty())
+ nWinBits |= WB_BORDER;
+ VclPtrInstance<ColorLB> pListBox(pParent, nWinBits);
+ pListBox->EnableAutoSize(true);
+ 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 ColorLB::ImplInit()
+{
+ pColorList = new ImpColorList();
+
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ aImageSize = rStyleSettings.GetListBoxPreviewDefaultPixelSize();
+ EnableUserDraw( true );
+ SetUserItemSize( aImageSize );
+}
+
+void ColorLB::ImplDestroyColorEntries()
+{
+ for ( size_t n = pColorList->size(); n; )
+ delete (*pColorList)[ --n ];
+ pColorList->clear();
+}
+
+ColorLB::ColorLB( vcl::Window* pParent, WinBits nWinStyle ) :
+ ListBox( pParent, nWinStyle )
+{
+ ImplInit();
+ SetEdgeBlending(true);
+}
+
+ColorLB::~ColorLB()
+{
+ disposeOnce();
+}
+
+void ColorLB::dispose()
+{
+ if ( pColorList )
+ {
+ ImplDestroyColorEntries();
+ delete pColorList;
+ pColorList = nullptr;
+ }
+ ListBox::dispose();
+}
+
+sal_Int32 ColorLB::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 ColorLB::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 ColorLB::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 ColorLB::Clear()
+{
+ ImplDestroyColorEntries();
+ ListBox::Clear();
+}
+
+void ColorLB::CopyEntries( const ColorLB& 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 ColorLB::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 ColorLB::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 ColorLB::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 )
+{
+ if( !pColorTab.is() )
+ return;
+
+ long nCount = pColorTab->Count();
+ SetUpdateMode( false );
+
+ for( long i = 0; i < nCount; i++ )
+ {
+ const XColorEntry* pEntry = pColorTab->GetColor(i);
+ InsertEntry( pEntry->GetColor(), pEntry->GetName() );
+ }
+
+ AdaptDropDownLineCountToMaximum();
+ SetUpdateMode( true );
+}
+
+void ColorLB::Append( const XColorEntry& rEntry )
+{
+ InsertEntry( rEntry.GetColor(), rEntry.GetName() );
+ AdaptDropDownLineCountToMaximum();
+}
+
+void ColorLB::Modify( const XColorEntry& rEntry, sal_Int32 nPos )
+{
+ RemoveEntry( nPos );
+ InsertEntry( rEntry.GetColor(), rEntry.GetName(), nPos );
+}
+
+
namespace
{
void FillBoxChartColorLB(ColorLB *pLB, const SvxChartColorTable & rTab)