]> git.saurik.com Git - wxWidgets.git/commitdiff
Have wxComboCtrl honour any custom foreground and background colour.
authorJaakko Salli <jaakko.salli@dnainternet.net>
Fri, 18 Dec 2009 17:28:42 +0000 (17:28 +0000)
committerJaakko Salli <jaakko.salli@dnainternet.net>
Fri, 18 Dec 2009 17:28:42 +0000 (17:28 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62930 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/combocmn.cpp
src/msw/combo.cpp

index fafd36425e7815fe16df95b901f1e4d8be1c4d29..fe54d240198f846dd46cb82871ab658864f528ac 100644 (file)
@@ -913,7 +913,12 @@ void wxComboCtrlBase::OnThemeChange()
     // be the correct colour and themed brush.  Instead we'll use
     // wxSYS_COLOUR_WINDOW in the EVT_PAINT handler as needed.
 #ifndef __WXMAC__
-    SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+    if ( !m_hasBgCol )
+    {
+        wxColour bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+        SetOwnBackgroundColour(bgCol);
+        m_hasBgCol = false;
+    }
 #endif
 }
 
@@ -1353,20 +1358,46 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
     selRect.width -= wcp + (focusSpacingX*2);
 
     wxColour bgCol;
+    wxColour fgCol;
+
     bool doDrawSelRect = true;
 
+    // Determine foreground colour
+    if ( isEnabled )
+    {
+        if ( doDrawFocusRect )
+        {
+            fgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
+        }
+        else if ( m_hasFgCol )
+        {
+            // Honour the custom foreground colour
+            fgCol = GetForegroundColour();
+        }
+        else
+        {
+            fgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
+        }
+    }
+    else
+    {
+        fgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT);
+    }
+
+    // Determine background colour
     if ( isEnabled )
     {
-        // If popup is hidden and this control is focused,
-        // then draw the focus-indicator (selbgcolor background etc.).
         if ( doDrawFocusRect )
         {
-            dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) );
             bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
         }
+        else if ( m_hasBgCol )
+        {
+            // Honour the custom background colour
+            bgCol = GetBackgroundColour();
+        }
         else
         {
-            dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT) );
 #ifndef __WXMAC__  // see note in OnThemeChange
             doDrawSelRect = false;
             bgCol = GetBackgroundColour();
@@ -1377,7 +1408,6 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
     }
     else
     {
-        dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT) );
 #ifndef __WXMAC__  // see note in OnThemeChange
         bgCol = GetBackgroundColour();
 #else
@@ -1385,6 +1415,7 @@ void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags
 #endif
     }
 
+    dc.SetTextForeground( fgCol );
     dc.SetBrush( bgCol );
     if ( doDrawSelRect )
     {
index f0c621d54df859c0d1453d1099afc8e113db3bae..f30d15982e990b5cde7c7297e3419490d860a525 100644 (file)
@@ -225,7 +225,14 @@ void wxComboCtrl::OnThemeChange()
 {
     // there doesn't seem to be any way to get the text colour using themes
     // API: TMT_TEXTCOLOR doesn't work neither for EDIT nor COMBOBOX
-    SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
+    if ( !m_hasFgCol )
+    {
+        wxColour fgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
+        SetForegroundColour(fgCol);
+        m_hasFgCol = false;
+    }
+
+    wxColour bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
 
 #if wxUSE_UXTHEME
     wxUxThemeEngine * const theme = wxUxThemeEngine::GetIfActive();
@@ -244,17 +251,21 @@ void wxComboCtrl::OnThemeChange()
                             );
         if ( SUCCEEDED(hr) )
         {
-            SetBackgroundColour(wxRGBToColour(col));
-
-            // skip the call below
-            return;
+            bgCol = wxRGBToColour(col);
+        }
+        else
+        {
+            wxLogApiError("GetThemeColor(EDIT, ETS_NORMAL, TMT_FILLCOLOR)",
+                          hr);
         }
-
-        wxLogApiError(wxT("GetThemeColor(EDIT, ETS_NORMAL, TMT_FILLCOLOR)"), hr);
     }
 #endif
 
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+    if ( !m_hasBgCol )
+    {
+        SetBackgroundColour(bgCol);
+        m_hasBgCol = false;
+    }
 }
 
 void wxComboCtrl::OnResize()
@@ -397,6 +408,7 @@ wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
     //if ( hTheme )
     //    theme = wxUxThemeEngine::GetIfActive();
 
+    wxColour fgCol;
     wxColour bgCol;
     bool doDrawDottedEdge = false;
     bool doDrawSelRect = true;
@@ -422,28 +434,31 @@ wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
             if ( (m_iFlags & wxCC_FULL_BUTTON) && !(flags & wxCONTROL_ISSUBMENU) )
             {
                 // Vista style read-only combo
+                fgCol = GetForegroundColour();
+                bgCol = GetBackgroundColour();
                 doDrawSelRect = false;
                 doDrawDottedEdge = true;
             }
             else
             {
-                dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) );
+                fgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
                 bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
             }
         }
         else
         {
-            dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT) );
+            fgCol = GetForegroundColour();
             bgCol = GetBackgroundColour();
             doDrawSelRect = false;
         }
     }
     else
     {
-        dc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT) );
+        fgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT);
         bgCol = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
     }
 
+    dc.SetTextForeground(fgCol);
     dc.SetBrush(bgCol);
     if ( doDrawSelRect )
     {