]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/combo.cpp
non-PCH build fix (according to Tinderbox).
[wxWidgets.git] / src / msw / combo.cpp
index 255869e59f190d77ab57d4a4f3ed4dcd584f3954..762b82eadc3bd3327a5aae05952b470129c35cbe 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) )
@@ -383,7 +388,7 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
     // TODO: Convert drawing in this function to Windows API Code
 
     wxSize sz = GetClientSize();
-    wxBufferedPaintDC dc(this,GetBufferBitmap(sz));
+    wxAutoBufferedPaintDC dc(this);
 
     const wxRect& rectb = m_btnArea;
     wxRect rect = m_tcArea;
@@ -484,11 +489,10 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 
 void wxComboCtrl::OnMouseEvent( wxMouseEvent& event )
 {
-    bool isOnButtonArea = m_btnArea.Inside(event.m_x,event.m_y);
+    int mx = event.m_x;
+    bool isOnButtonArea = m_btnArea.Contains(mx,event.m_y);
     int handlerFlags = isOnButtonArea ? wxCC_MF_ON_BUTTON : 0;
 
-    // Preprocessing fabricates double-clicks and prevents
-    // (it may also do other common things in future)
     if ( PreprocessMouseEvent(event,isOnButtonArea) )
         return;
 
@@ -502,8 +506,11 @@ void wxComboCtrl::OnMouseEvent( wxMouseEvent& event )
     }
     else
     {
-        if ( isOnButtonArea || HasCapture() )
+        if ( isOnButtonArea || HasCapture() ||
+             (m_widthCustomPaint && mx < (m_tcArea.x+m_widthCustomPaint)) )
         {
+            handlerFlags |= wxCC_MF_ON_CLICK_AREA;
+
             if ( HandleButtonMouseEvent(event,handlerFlags) )
                 return;
         }
@@ -531,25 +538,34 @@ wxCoord wxComboCtrl::GetNativeTextIndent() const
 
 bool wxComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
 {
-    int keycode = event.GetKeyCode();
-    bool isPopupShown = IsPopupShown();
-
-    if ( isPopupShown && keycode == WXK_ESCAPE )
-        return true;
+    const bool isPopupShown = IsPopupShown();
 
-    // On XP or with writable combo in Classic,
-    // Alt is required, in addition to up/down, to
-    // show the popup.
-    if ( keycode == WXK_DOWN || keycode == WXK_UP )
+    switch ( event.GetKeyCode() )
     {
-        if ( event.AltDown() ||
-                ( !isPopupShown &&
-                  HasFlag(wxCB_READONLY) &&
-                  !wxUxThemeEngine::GetIfActive()
-                ) )
-        {
-            return true;
-        }
+        case WXK_F4:
+            // F4 toggles the popup in the native comboboxes, so emulate them
+            if ( !event.AltDown() )
+                return true;
+            break;
+
+        case WXK_ESCAPE:
+            if ( isPopupShown )
+                return true;
+            break;
+
+        case WXK_DOWN:
+        case WXK_UP:
+            // On XP or with writable combo in Classic, arrows don't open the
+            // popup but Alt-arrow does
+            if ( event.AltDown() ||
+                    ( !isPopupShown &&
+                      HasFlag(wxCB_READONLY) &&
+                      !wxUxThemeEngine::GetIfActive()
+                    ) )
+            {
+                return true;
+            }
+            break;
     }
 
     return false;