// Flags used by PreprocessMouseEvent and HandleButtonMouseEvent
enum
{
- wxCC_MF_ON_BUTTON = 0x0001 // cursor is on dropbutton area
+ wxCC_MF_ON_BUTTON = 0x0001, // cursor is on dropbutton area
+ wxCC_MF_ON_CLICK_AREA = 0x0002 // cursor is on dropbutton or other area
+ // that can be clicked to show the popup.
};
}
else if ( type == wxEVT_LEFT_DOWN )
{
- // Only accept event if it wasn't right after popup dismiss
- //if ( ::wxGetLocalTimeMillis() > m_timeCanClick )
+ if ( flags & (wxCC_MF_ON_CLICK_AREA|wxCC_MF_ON_BUTTON) )
{
- // Need to test this, because it might be outside.
- if ( flags & wxCC_MF_ON_BUTTON )
- {
- m_btnState |= wxCONTROL_PRESSED;
- Refresh();
+ m_btnState |= wxCONTROL_PRESSED;
+ Refresh();
- if ( !(m_iFlags & wxCC_POPUP_ON_MOUSE_UP) )
- OnButtonClick();
- else
- // If showing popup now, do not capture mouse or there will be interference
- CaptureMouse();
- }
+ if ( !(m_iFlags & wxCC_POPUP_ON_MOUSE_UP) )
+ OnButtonClick();
+ else
+ // If showing popup now, do not capture mouse or there will be interference
+ CaptureMouse();
}
- /*else
- {
- m_btnState = 0;
- }*/
}
else if ( type == wxEVT_LEFT_UP )
{
// If mouse was inside, fire the click event.
if ( m_iFlags & wxCC_POPUP_ON_MOUSE_UP )
{
- if ( flags & wxCC_MF_ON_BUTTON )
+ if ( flags & (wxCC_MF_ON_CLICK_AREA|wxCC_MF_ON_BUTTON) )
OnButtonClick();
}
void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event )
{
- bool isOnButtonArea = m_btnArea.Contains(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,handlerFlags) )
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;
}
void wxComboCtrl::OnMouseEvent( wxMouseEvent& event )
{
- bool isOnButtonArea = m_btnArea.Contains(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;
}