}
// 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;
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) )
void wxComboCtrl::OnMouseEvent( wxMouseEvent& event )
{
- bool isOnButtonArea = m_btnArea.Inside(event.m_x,event.m_y);
+ bool isOnButtonArea = m_btnArea.Contains(event.m_x,event.m_y);
int handlerFlags = isOnButtonArea ? wxCC_MF_ON_BUTTON : 0;
// Preprocessing fabricates double-clicks and prevents
bool wxComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
{
- int keycode = event.GetKeyCode();
- bool isPopupShown = IsPopupShown();
+ const bool isPopupShown = IsPopupShown();
- if ( isPopupShown && keycode == WXK_ESCAPE )
- return true;
-
- // 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;