CreateTextCtrl( wxNO_BORDER, validator );
// Add keyboard input handlers for main control and textctrl
- InstallInputHandlers( true );
+ InstallInputHandlers();
// Prepare background for double-buffering
SetBackgroundStyle( wxBG_STYLE_CUSTOM );
}
// draw focus background on area in a way typical on platform
-void wxComboCtrl::DrawFocusBackground( wxDC& dc, const wxRect& rect, int flags )
+void wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const
{
wxUxThemeEngine* theme = (wxUxThemeEngine*) NULL;
+
+ // Constructor only calls GetHWND() const, so it should be safe
+ // to cast "this" to const.
wxUxThemeHandle hTheme(this, L"COMBOBOX");
//COLORREF cref;
wxRect selRect(rect);
selRect.y += focusSpacingY;
selRect.height -= (focusSpacingY*2);
- selRect.x += m_widthCustomPaint + focusSpacingX;
- selRect.width -= m_widthCustomPaint + (focusSpacingX*2);
+
+ int wcp = 0;
+
+ if ( !(flags & wxCONTROL_ISSUBMENU) )
+ wcp += m_widthCustomPaint;
+
+ selRect.x += wcp + focusSpacingX;
+ selRect.width -= wcp + (focusSpacingX*2);
if ( hTheme )
theme = wxUxThemeEngine::GetIfActive();
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) )
// 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;
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;
}
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;
}
return NATIVE_TEXT_INDENT_CLASSIC;
}
+bool wxComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
+{
+ const bool isPopupShown = IsPopupShown();
+
+ switch ( event.GetKeyCode() )
+ {
+ 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;
+}
#endif // wxUSE_COMBOCTRL