]> git.saurik.com Git - wxWidgets.git/commitdiff
use custom selection colours in wxHtmlListBox again (restores functionality broken...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 2 Mar 2008 23:05:35 +0000 (23:05 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 2 Mar 2008 23:05:35 +0000 (23:05 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52264 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/htmllbox.h
include/wx/vlbox.h
src/generic/htmllbox.cpp
src/generic/vlbox.cpp

index 21d354080c708e11e4f8b8890b27b24b74579eee..a8f41d7f76c92f968efcf0c033be6fbe140e991d 100644 (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
index e746c8f863cf893f27b81a4af83e5157b2fcd750..aa894553e5b8a35f1df232312684d00691794323 100644 (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
     //
index 796b5070c3988b45d28e186b3a3136d5f4deb4fd..c1cc584ae549084770857241b9f5855a904cb79f 100644 (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
index d75fc4f1304c25db1fc5e9d73b8b90d8df0935c0..4d2722220598fc0979ba576bd785844f7847dbd0 100644 (file)
@@ -355,29 +355,40 @@ void wxVListBox::OnDrawSeparator(wxDC& WXUNUSED(dc),
 {
 }
 
-void wxVListBox::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
+bool
+wxVListBox::DoDrawSolidBackground(const wxColour& col,
+                                  wxDC& dc,
+                                  const wxRect& rect,
+                                  size_t n) const
 {
-    if ( m_colBgSel.IsOk() )
+    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 )
     {
-        // we need to render selected and current items differently
-        const bool isSelected = IsSelected(n),
-                   isCurrent = IsCurrent(n);
-        if ( isSelected || isCurrent )
+        if ( isSelected )
         {
-            if ( isSelected )
-            {
-                dc.SetBrush(wxBrush(m_colBgSel, wxSOLID));
-            }
-            else // !selected
-            {
-                dc.SetBrush(*wxTRANSPARENT_BRUSH);
-            }
-            dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN));
-            dc.DrawRectangle(rect);
+            dc.SetBrush(wxBrush(col, wxSOLID));
         }
-        //else: do nothing for the normal items
+        else // !selected
+        {
+            dc.SetBrush(*wxTRANSPARENT_BRUSH);
+        }
+        dc.SetPen(*(isCurrent ? wxBLACK_PEN : wxTRANSPARENT_PEN));
+        dc.DrawRectangle(rect);
     }
-    else // use wxRendererNative for a more native look&feel:
+    //else: do nothing for the normal items
+
+    return true;
+}
+
+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) )