244 lines
6.9 KiB
C++
244 lines
6.9 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/common/bmpcboxcmn.cpp
|
|
// Purpose: wxBitmapComboBox
|
|
// Author: Jaakko Salli
|
|
// Created: 2008-04-09
|
|
// Copyright: (c) 2008 Jaakko Salli
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#include "wx/bmpcbox.h"
|
|
|
|
#if wxUSE_BITMAPCOMBOBOX
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/log.h"
|
|
#include "wx/dc.h"
|
|
#include "wx/ctrlsub.h"
|
|
#endif
|
|
|
|
#include "wx/settings.h"
|
|
|
|
// For wxODCB_XXX flags
|
|
#include "wx/odcombo.h"
|
|
|
|
|
|
const char wxBitmapComboBoxNameStr[] = "bitmapComboBox";
|
|
|
|
#if defined(wxBITMAPCOMBOBOX_OWNERDRAWN_BASED)
|
|
|
|
#define IMAGE_SPACING_RIGHT 4 // Space left of image
|
|
|
|
#define IMAGE_SPACING_LEFT 4 // Space right of image, left of text
|
|
|
|
#define EXTRA_FONT_HEIGHT 0 // Add to increase min. height of list items
|
|
|
|
#define wxBCB_DEFAULT_ITEM_HEIGHT 13
|
|
|
|
|
|
// This macros allows wxArrayPtrVoid to be used in more convenient manner
|
|
#define GetBitmapPtr(n) ((wxBitmap*)m_bitmaps[n])
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Initialization
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxBitmapComboBoxBase::Init()
|
|
{
|
|
m_fontHeight = 0;
|
|
m_imgAreaWidth = 0;
|
|
m_indent = 0;
|
|
m_usedImgSize = wxSize(-1, -1);
|
|
}
|
|
|
|
void wxBitmapComboBoxBase::UpdateInternals()
|
|
{
|
|
m_fontHeight = GetControl()->GetCharHeight() + EXTRA_FONT_HEIGHT;
|
|
|
|
while ( m_bitmaps.GetCount() < GetItemContainer()->GetCount() )
|
|
m_bitmaps.Add( new wxBitmap() );
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Item manipulation
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxBitmapComboBoxBase::DoSetItemBitmap(unsigned int n, const wxBitmap& bitmap)
|
|
{
|
|
wxCHECK_RET( n < m_bitmaps.size(), "invalid item index" );
|
|
*GetBitmapPtr(n) = bitmap;
|
|
}
|
|
|
|
wxBitmap wxBitmapComboBoxBase::GetItemBitmap(unsigned int n) const
|
|
{
|
|
wxCHECK_MSG( n < m_bitmaps.size(), wxNullBitmap, "invalid item index" );
|
|
return *GetBitmapPtr(n);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxItemContainer methods
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxBitmapComboBoxBase::BCBDoClear()
|
|
{
|
|
for ( unsigned i = 0; i < m_bitmaps.size(); i++ )
|
|
delete GetBitmapPtr(i);
|
|
|
|
m_bitmaps.Empty();
|
|
|
|
m_usedImgSize.x = -1;
|
|
m_usedImgSize.y = -1;
|
|
|
|
DetermineIndent();
|
|
}
|
|
|
|
void wxBitmapComboBoxBase::BCBDoDeleteOneItem(unsigned int n)
|
|
{
|
|
delete GetBitmapPtr(n);
|
|
m_bitmaps.RemoveAt(n);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Preparation and Calculations
|
|
// ----------------------------------------------------------------------------
|
|
|
|
bool wxBitmapComboBoxBase::OnAddBitmap(const wxBitmap& bitmap)
|
|
{
|
|
if ( bitmap.IsOk() )
|
|
{
|
|
int width = bitmap.GetWidth();
|
|
int height = bitmap.GetHeight();
|
|
|
|
if ( m_usedImgSize.x < 0 )
|
|
{
|
|
// If size not yet determined, get it from this image.
|
|
m_usedImgSize.x = width;
|
|
m_usedImgSize.y = height;
|
|
|
|
// Adjust control size to vertically fit the bitmap
|
|
wxWindow* ctrl = GetControl();
|
|
ctrl->InvalidateBestSize();
|
|
wxSize newSz = ctrl->GetBestSize();
|
|
wxSize sz = ctrl->GetSize();
|
|
if ( newSz.y > sz.y )
|
|
ctrl->SetSize(sz.x, newSz.y);
|
|
else
|
|
DetermineIndent();
|
|
}
|
|
|
|
wxCHECK_MSG( width == m_usedImgSize.x && height == m_usedImgSize.y,
|
|
false,
|
|
"you can only add images of same size" );
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
int wxBitmapComboBoxBase::DetermineIndent()
|
|
{
|
|
// Recalculate amount of empty space needed in front of
|
|
// text in control itself.
|
|
int indent = m_imgAreaWidth = 0;
|
|
|
|
if ( m_usedImgSize.x > 0 )
|
|
{
|
|
indent = m_usedImgSize.x + IMAGE_SPACING_LEFT + IMAGE_SPACING_RIGHT;
|
|
m_imgAreaWidth = indent;
|
|
|
|
indent -= 3;
|
|
}
|
|
|
|
return indent;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Item drawing and measuring
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxBitmapComboBoxBase::DrawBackground(wxDC& dc,
|
|
const wxRect& rect,
|
|
int WXUNUSED(item),
|
|
int flags) const
|
|
{
|
|
if ( flags & wxODCB_PAINTING_SELECTED )
|
|
{
|
|
const int vSizeDec = 0; // Vertical size reduction of selection rectangle edges
|
|
|
|
dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT));
|
|
|
|
wxColour selCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
|
|
dc.SetPen(selCol);
|
|
dc.SetBrush(selCol);
|
|
dc.DrawRectangle(rect.x,
|
|
rect.y+vSizeDec,
|
|
rect.width,
|
|
rect.height-(vSizeDec*2));
|
|
}
|
|
else
|
|
{
|
|
dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
|
|
|
|
wxColour selCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
|
dc.SetPen(selCol);
|
|
dc.SetBrush(selCol);
|
|
dc.DrawRectangle(rect);
|
|
}
|
|
}
|
|
|
|
void wxBitmapComboBoxBase::DrawItem(wxDC& dc,
|
|
const wxRect& rect,
|
|
int item,
|
|
const wxString& text,
|
|
int WXUNUSED(flags)) const
|
|
{
|
|
const wxBitmap& bmp = *GetBitmapPtr(item);
|
|
if ( bmp.IsOk() )
|
|
{
|
|
wxCoord w = bmp.GetWidth();
|
|
wxCoord h = bmp.GetHeight();
|
|
|
|
// Draw the image centered
|
|
dc.DrawBitmap(bmp,
|
|
rect.x + (m_usedImgSize.x-w)/2 + IMAGE_SPACING_LEFT,
|
|
rect.y + (rect.height-h)/2,
|
|
true);
|
|
}
|
|
|
|
if ( !text.empty() )
|
|
dc.DrawText(text,
|
|
rect.x + m_imgAreaWidth + 1,
|
|
rect.y + (rect.height-dc.GetCharHeight())/2);
|
|
}
|
|
|
|
wxCoord wxBitmapComboBoxBase::MeasureItem(size_t WXUNUSED(item)) const
|
|
{
|
|
if ( m_usedImgSize.y >= 0 )
|
|
{
|
|
int imgHeightArea = m_usedImgSize.y + 2;
|
|
return imgHeightArea > m_fontHeight ? imgHeightArea : m_fontHeight;
|
|
}
|
|
|
|
return wxBCB_DEFAULT_ITEM_HEIGHT;
|
|
}
|
|
|
|
#endif // wxBITMAPCOMBOBOX_OWNERDRAWN_BASED
|
|
|
|
#endif // wxUSE_BITMAPCOMBOBOX
|