[ 1572220 ] Show popup when wxComboCtrl image area clicked
authorRobert Roebling <robert@roebling.de>
Sun, 8 Oct 2006 15:59:53 +0000 (15:59 +0000)
committerRobert Roebling <robert@roebling.de>
Sun, 8 Oct 2006 15:59:53 +0000 (15:59 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41731 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

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

index 25dc298df483175e21a1e8cd91f9373c89b2ec6d..55b1e2d481a9daa6b7f103bff36cc943652aff77 100644 (file)
@@ -90,7 +90,9 @@ enum
 // 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.
 };
 
 
index deeff9218ac13b883a8d89feb29cd64e39d184e6..44bdce81032341c4c2491df02cea24275db2239f 100644 (file)
@@ -1302,26 +1302,17 @@ bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event,
     }
     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 )
     {
@@ -1335,7 +1326,7 @@ bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event,
             // 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();
             }
 
index 1ad84ee1db6f0576b51fd7a55f2ef938f769570c..5864782b95c2730728afb0380f86035dd3206675 100644 (file)
@@ -280,11 +280,10 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 
 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;
 
@@ -301,8 +300,11 @@ void wxGenericComboCtrl::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;
         }
index 3c289257191905a23dc5bcb6043e9f64cbede853..85866cb9eb381e2844f525102d455c50f1f87fc2 100644 (file)
@@ -489,11 +489,10 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 
 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;
 
@@ -507,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;
         }