]> git.saurik.com Git - wxWidgets.git/commitdiff
Commit wxComboCtrl clipping patch from J. Salli
authorRobert Roebling <robert@roebling.de>
Sun, 3 Sep 2006 13:21:29 +0000 (13:21 +0000)
committerRobert Roebling <robert@roebling.de>
Sun, 3 Sep 2006 13:21:29 +0000 (13:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40980 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/combo.h
include/wx/msw/combo.h
src/common/combocmn.cpp
src/generic/odcombo.cpp
src/msw/combo.cpp

index ec19e490d1d84366932e41f46e31df96995b90ee..6fb77bd0c3acdfaa98da0346284ebb7dc464f525 100644 (file)
@@ -305,7 +305,9 @@ public:
     //        key handler).
     virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const = 0;
 
-    // Draws focus background (on combo control) in a way typical on platform.
+    // Prepare background of combo control or an item in a dropdown list
+    // in a way typical on platform. This includes painting the focus/disabled
+    // background and setting the clipping region.
     // Unless you plan to paint your own focus indicator, you should always call this
     // in your wxComboPopup::PaintComboControl implementation.
     // In addition, it sets pen and text colour to what looks good and proper
@@ -313,7 +315,7 @@ public:
     // flags: wxRendererNative flags: wxCONTROL_ISSUBMENU: is drawing a list item instead of combo control
     //                                wxCONTROL_SELECTED: list item is selected
     //                                wxCONTROL_DISABLED: control/item is disabled
-    virtual void DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) const;
+    virtual void PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const;
 
     // Returns true if focus indicator should be drawn in the control.
     bool ShouldDrawFocus() const
index 5c02285db64e894c1ef25d21f5bacc81e8b52726..1147db76e93f06478331d14f7f6170ef24a5c4fc 100644 (file)
@@ -59,7 +59,7 @@ public:
 
     virtual ~wxComboCtrl();
 
-    virtual void DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) const;
+    virtual void PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const;
     virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const;
 
     static int GetFeatures() { return wxComboCtrlFeatures::All; }
index fbad3278429902abe5fa26fed879f7aab04be8d2..01571525516cfb6dad392ae520f50305be26f00b 100644 (file)
@@ -386,7 +386,7 @@ void wxComboPopup::DefaultPaintComboControl( wxComboCtrlBase* combo,
 {
     if ( combo->GetWindowStyle() & wxCB_READONLY ) // ie. no textctrl
     {
-        combo->DrawFocusBackground(dc,rect,0);
+        combo->PrepareBackground(dc,rect,0);
 
         dc.DrawText( combo->GetValue(),
                      rect.x + combo->GetTextIndent(),
@@ -1036,8 +1036,9 @@ void wxComboCtrlBase::DoSetToolTip(wxToolTip *tooltip)
 // painting
 // ----------------------------------------------------------------------------
 
-// draw focus background on area in a way typical on platform
-void wxComboCtrlBase::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) const
+#if (!defined(__WXMSW__)) || defined(__WXUNIVERSAL__)
+// prepare combo box background on area in a way typical on platform
+void wxComboCtrlBase::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
 {
     wxSize sz = GetClientSize();
     bool isEnabled;
@@ -1106,7 +1107,19 @@ void wxComboCtrlBase::DrawFocusBackground( wxDC& dc, const wxRect& rect, int fla
     dc.SetBrush( bgCol );
     dc.SetPen( bgCol );
     dc.DrawRectangle( selRect );
+
+    // Don't clip exactly to the selection rectangle so we can draw
+    // to the non-selected area in front of it.
+    wxRect clipRect(rect.x,rect.y,
+                    (selRect.x+selRect.width)-rect.x,rect.height);
+    dc.SetClippingRegion(clipRect);
 }
+#else
+// Save the library size a bit for platforms that re-implement this.
+void wxComboCtrlBase::PrepareBackground( wxDC&, const wxRect&, int ) const
+{
+}
+#endif
 
 void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, bool paintBg )
 {
index 8e83c45616055189e314085f7a6e02fdf214a901..cccd7660f1848449b4534be951edb36584efabd8 100644 (file)
@@ -1059,12 +1059,15 @@ void wxOwnerDrawnComboBox::OnDrawBackground(wxDC& dc, const wxRect& rect, int it
     if ( GetVListBoxComboPopup()->IsCurrent((size_t)item) ||
          (flags & wxODCB_PAINTING_CONTROL) )
     {
-        int focusFlag = wxCONTROL_SELECTED;
+        int bgFlags = wxCONTROL_SELECTED;
 
         if ( (flags & wxODCB_PAINTING_CONTROL) != wxODCB_PAINTING_CONTROL )
-            focusFlag |= wxCONTROL_ISSUBMENU;
-
-        DrawFocusBackground(dc, rect, focusFlag );
+        {
+            bgFlags |= wxCONTROL_ISSUBMENU;
+            PrepareBackground(dc, rect, bgFlags);
+        }
+        else if ( HasFlag(wxCB_READONLY) )
+            PrepareBackground(dc, rect, bgFlags);
     }
     //else: do nothing for the normal items
 }
index 124204b43f69d7a614a3423b831fdc73a43ee834..50025b1eeda8bb3891413c947f0fcf06ce6789ff 100644 (file)
@@ -239,7 +239,7 @@ static void wxMSWDrawFocusRect( wxDC& dc, const wxRect& rect )
 }
 
 // draw focus background on area in a way typical on platform
-void wxComboCtrl::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags ) const
+void wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
 {
     wxUxThemeEngine* theme = (wxUxThemeEngine*) NULL;
 
@@ -376,6 +376,11 @@ void wxComboCtrl::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags )
     if ( drawDottedEdge )
         wxMSWDrawFocusRect(dc,selRect);
 
+    // Don't clip exactly to the selection rectangle so we can draw
+    // to the non-selected area in front of it.
+    wxRect clipRect(rect.x,rect.y,
+                    (selRect.x+selRect.width)-rect.x-1,rect.height);
+    dc.SetClippingRegion(clipRect);
 }
 
 void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )