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 void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const;
virtual wxCoord OnMeasureItem(size_t n) const; virtual wxCoord OnMeasureItem(size_t n) const;
// This method may be overriden to handle clicking on a link in // override this one to draw custom background for selected items correctly
// the listbox. By default, clicking links is ignored. 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); virtual void OnLinkClicked(size_t n, const wxHtmlLinkInfo& link);
// event handlers // event handlers

View File

@@ -269,6 +269,14 @@ protected:
// common part of keyboard and mouse handling processing code // common part of keyboard and mouse handling processing code
void DoHandleItemClick(int item, int flags); 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: private:
// the current item or wxNOT_FOUND // the current item or wxNOT_FOUND
// //

View File

@@ -165,12 +165,27 @@ public:
virtual wxColour GetSelectedTextColour(const wxColour& colFg) 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) 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: private:
@@ -254,16 +269,16 @@ wxHtmlListBox::~wxHtmlListBox()
// wxHtmlListBox appearance // wxHtmlListBox appearance
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
wxColour wxHtmlListBox::GetSelectedTextColour(const wxColour& colFg) const wxColour
wxHtmlListBox::GetSelectedTextColour(const wxColour& WXUNUSED(colFg)) const
{ {
return m_htmlRendStyle-> return wxNullColour;
wxDefaultHtmlRenderingStyle::GetSelectedTextColour(colFg);
} }
wxColour wxColour
wxHtmlListBox::GetSelectedTextBgColour(const wxColour& WXUNUSED(colBg)) const 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 // 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 void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const
{ {
CacheItem(n); CacheItem(n);
@@ -365,6 +401,22 @@ void wxHtmlListBox::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const
wxHtmlRenderingInfo htmlRendInfo; 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 // 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 // even the visible cells part could be not drawn, so always draw the
// entire cell // entire cell

View File

@@ -355,29 +355,40 @@ void wxVListBox::OnDrawSeparator(wxDC& WXUNUSED(dc),
{ {
} }
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);
if ( isSelected || isCurrent )
{
if ( isSelected )
{
dc.SetBrush(wxBrush(col, wxSOLID));
}
else // !selected
{
dc.SetBrush(*wxTRANSPARENT_BRUSH);
}
dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN));
dc.DrawRectangle(rect);
}
//else: do nothing for the normal items
return true;
}
void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
{ {
if ( m_colBgSel.IsOk() ) // use wxRendererNative for more native look unless we use custom bg colour
{ if ( !DoDrawSolidBackground(m_colBgSel, dc, rect, n) )
// we need to render selected and current items differently
const bool isSelected = IsSelected(n),
isCurrent = IsCurrent(n);
if ( isSelected || isCurrent )
{
if ( isSelected )
{
dc.SetBrush(wxBrush(m_colBgSel, wxSOLID));
}
else // !selected
{
dc.SetBrush(*wxTRANSPARENT_BRUSH);
}
dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN));
dc.DrawRectangle(rect);
}
//else: do nothing for the normal items
}
else // use wxRendererNative for a more native look&feel:
{ {
int flags = 0; int flags = 0;
if ( IsSelected(n) ) if ( IsSelected(n) )