use custom selection colours in wxHtmlListBox again (restores functionality broken by patch 1650804 in r44640)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52264 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-03-02 23:05:35 +00:00
parent 86faa458df
commit c848185a6e
4 changed files with 103 additions and 29 deletions

View File

@@ -111,8 +111,11 @@ protected:
virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const;
virtual wxCoord OnMeasureItem(size_t n) const;
// This method may be overriden to handle clicking on a link in
// the listbox. By default, clicking links is ignored.
// override this one to draw custom background for selected items correctly
virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const;
// this method may be overridden to handle clicking on a link in the
// listbox (by default, clicks on links are simply ignored)
virtual void OnLinkClicked(size_t n, const wxHtmlLinkInfo& link);
// event handlers

View File

@@ -269,6 +269,14 @@ protected:
// common part of keyboard and mouse handling processing code
void DoHandleItemClick(int item, int flags);
// paint the background of the given item using the provided colour if it's
// valid, otherwise just return false and do nothing (this is used by
// OnDrawBackground())
bool DoDrawSolidBackground(const wxColour& col,
wxDC& dc,
const wxRect& rect,
size_t n) const;
private:
// the current item or wxNOT_FOUND
//

View File

@@ -165,12 +165,27 @@ public:
virtual wxColour GetSelectedTextColour(const wxColour& colFg)
{
return m_hlbox.GetSelectedTextColour(colFg);
// by default wxHtmlListBox doesn't implement GetSelectedTextColour()
// and returns wxNullColour from it, so use the default HTML colour for
// selection
wxColour col = m_hlbox.GetSelectedTextColour(colFg);
if ( !col.IsOk() )
{
col = wxDefaultHtmlRenderingStyle::GetSelectedTextColour(colFg);
}
return col;
}
virtual wxColour GetSelectedTextBgColour(const wxColour& colBg)
{
return m_hlbox.GetSelectedTextBgColour(colBg);
wxColour col = m_hlbox.GetSelectedTextBgColour(colBg);
if ( !col.IsOk() )
{
col = wxDefaultHtmlRenderingStyle::GetSelectedTextBgColour(colBg);
}
return col;
}
private:
@@ -254,16 +269,16 @@ wxHtmlListBox::~wxHtmlListBox()
// wxHtmlListBox appearance
// ----------------------------------------------------------------------------
wxColour wxHtmlListBox::GetSelectedTextColour(const wxColour& colFg) const
wxColour
wxHtmlListBox::GetSelectedTextColour(const wxColour& WXUNUSED(colFg)) const
{
return m_htmlRendStyle->
wxDefaultHtmlRenderingStyle::GetSelectedTextColour(colFg);
return wxNullColour;
}
wxColour
wxHtmlListBox::GetSelectedTextBgColour(const wxColour& WXUNUSED(colBg)) const
{
return GetSelectionBackground();
return wxNullColour;
}
// ----------------------------------------------------------------------------
@@ -356,6 +371,27 @@ void wxHtmlListBox::SetItemCount(size_t count)
// wxHtmlListBox implementation of wxVListBox pure virtuals
// ----------------------------------------------------------------------------
void
wxHtmlListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
{
if ( IsSelected(n) )
{
if ( DoDrawSolidBackground
(
GetSelectedTextBgColour(GetBackgroundColour()),
dc,
rect,
n
) )
{
return;
}
//else: no custom selection background colour, use base class version
}
wxVListBox::OnDrawBackground(dc, rect, n);
}
void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const
{
CacheItem(n);
@@ -365,6 +401,22 @@ void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const
wxHtmlRenderingInfo htmlRendInfo;
// draw the selected cell in selected state ourselves if we're using custom
// colours (to test for this, check the callbacks by passing them any dummy
// (but valid, to avoid asserts) colour):
if ( IsSelected(n) &&
(GetSelectedTextColour(*wxBLACK).IsOk() ||
GetSelectedTextBgColour(*wxWHITE).IsOk()) )
{
wxHtmlSelection htmlSel;
htmlSel.Set(wxPoint(0,0), cell, wxPoint(INT_MAX, INT_MAX), cell);
htmlRendInfo.SetSelection(&htmlSel);
htmlRendInfo.SetStyle(m_htmlRendStyle);
htmlRendInfo.GetState().SetSelectionState(wxHTML_SEL_IN);
}
//else: normal item or selected item with default colours, its background
// was already taken care of in the base class
// note that we can't stop drawing exactly at the window boundary as then
// even the visible cells part could be not drawn, so always draw the
// entire cell

View File

@@ -355,10 +355,15 @@ void wxVListBox::OnDrawSeparator(wxDC& WXUNUSED(dc),
{
}
void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
{
if ( m_colBgSel.IsOk() )
bool
wxVListBox::DoDrawSolidBackground(const wxColour& col,
wxDC& dc,
const wxRect& rect,
size_t n) const
{
if ( !col.IsOk() )
return false;
// we need to render selected and current items differently
const bool isSelected = IsSelected(n),
isCurrent = IsCurrent(n);
@@ -366,7 +371,7 @@ void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
{
if ( isSelected )
{
dc.SetBrush(wxBrush(m_colBgSel, wxSOLID));
dc.SetBrush(wxBrush(col, wxSOLID));
}
else // !selected
{
@@ -376,8 +381,14 @@ void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
dc.DrawRectangle(rect);
}
//else: do nothing for the normal items
return true;
}
else // use wxRendererNative for a more native look&feel:
void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
{
// use wxRendererNative for more native look unless we use custom bg colour
if ( !DoDrawSolidBackground(m_colBgSel, dc, rect, n) )
{
int flags = 0;
if ( IsSelected(n) )