]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/combocmn.cpp
Store property name and value in wxPropertyGridEvent, keep track of live event instan...
[wxWidgets.git] / src / common / combocmn.cpp
index 99c9a8bb7acfd8749e8faaa2c9157cb590442d25..5df0a61af55efdc0200ad2e92a0edb0e9f1db3ad 100644 (file)
 #define TEXTCTRL_TEXT_CENTERED        0 // 1 if text in textctrl is vertically centered
 #define FOCUS_RING                    0 // No focus ring on wxMSW
 
-#if !defined(__WXWINCE__)
-    // 1 if wxTextEntry::SetMargins() can be used to set the left margin
-    #define LEFT_MARGIN_CAN_BE_SET        1
-#else
-    #define LEFT_MARGIN_CAN_BE_SET        0
-#endif
-
 //#undef wxUSE_POPUPWIN
 //#define wxUSE_POPUPWIN 0
 
 #define TEXTCTRL_TEXT_CENTERED        1 // 1 if text in textctrl is vertically centered
 #define FOCUS_RING                    0 // No focus ring on wxGTK
 
-#if GTK_CHECK_VERSION(2,10,0)
-    // 1 if wxTextEntry::SetMargins() can be used to set the left margin
-    #define LEFT_MARGIN_CAN_BE_SET    1
-#else
-    #define LEFT_MARGIN_CAN_BE_SET    0
-#endif
-
 #elif defined(__WXMAC__)
 
 #define USE_TRANSIENT_POPUP           1 // Use wxPopupWindowTransient (preferred, if it works properly on platform)
 #undef COMBO_MARGIN
 #define COMBO_MARGIN                  FOCUS_RING
 
-// 1 if wxTextEntry::SetMargins() can be used to set the left margin
-#define LEFT_MARGIN_CAN_BE_SET        0
-
 #else
 
 #define USE_TRANSIENT_POPUP           0 // Use wxPopupWindowTransient (preferred, if it works properly on platform)
 #define TEXTCTRL_TEXT_CENTERED        1 // 1 if text in textctrl is vertically centered
 #define FOCUS_RING                    0
 
-// 1 if wxTextEntry::SetMargins() can be used to set the left margin
-#define LEFT_MARGIN_CAN_BE_SET        0
-
 #endif
 
 
@@ -311,7 +291,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event )
          winFocused != m_combo->GetButton() // GTK (atleast) requires this
         )
     {
-        m_combo->HidePopup();
+        m_combo->HidePopup(true);
     }
 
     event.Skip();
@@ -319,37 +299,37 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event )
 
 void wxComboFrameEventHandler::OnMenuEvent( wxMenuEvent& event )
 {
-    m_combo->HidePopup();
+    m_combo->HidePopup(true);
     event.Skip();
 }
 
 void wxComboFrameEventHandler::OnMouseEvent( wxMouseEvent& event )
 {
-    m_combo->HidePopup();
+    m_combo->HidePopup(true);
     event.Skip();
 }
 
 void wxComboFrameEventHandler::OnClose( wxCloseEvent& event )
 {
-    m_combo->HidePopup();
+    m_combo->HidePopup(true);
     event.Skip();
 }
 
 void wxComboFrameEventHandler::OnActivate( wxActivateEvent& event )
 {
-    m_combo->HidePopup();
+    m_combo->HidePopup(true);
     event.Skip();
 }
 
 void wxComboFrameEventHandler::OnResize( wxSizeEvent& event )
 {
-    m_combo->HidePopup();
+    m_combo->HidePopup(true);
     event.Skip();
 }
 
 void wxComboFrameEventHandler::OnMove( wxMoveEvent& event )
 {
-    m_combo->HidePopup();
+    m_combo->HidePopup(true);
     event.Skip();
 }
 
@@ -433,7 +413,7 @@ void wxComboPopupWindow::OnDismiss()
     wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxComboCtrlBase)),
                   wxT("parent might not be wxComboCtrl, but check IMPLEMENT_DYNAMIC_CLASS(2) macro for correctness") );
 
-    combo->OnPopupDismiss();
+    combo->OnPopupDismiss(true);
 }
 #endif // USES_WXPOPUPTRANSIENTWINDOW
 
@@ -496,7 +476,7 @@ void wxComboPopupWindowEvtHandler::OnActivate( wxActivateEvent& event )
     if ( !event.GetActive() )
     {
         // Tell combo control that we are dismissed.
-        m_combo->HidePopup();
+        m_combo->HidePopup(true);
 
         event.Skip();
     }
@@ -571,7 +551,7 @@ bool wxComboPopup::LazyCreate()
 
 void wxComboPopup::Dismiss()
 {
-    m_combo->HidePopup();
+    m_combo->HidePopup(true);
 }
 
 // ----------------------------------------------------------------------------
@@ -1085,14 +1065,26 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust
     int customBorder = m_widthCustomBorder;
     if ( (m_text->GetWindowStyleFlag() & wxBORDER_MASK) == wxNO_BORDER )
     {
-#if LEFT_MARGIN_CAN_BE_SET
-        // Call SetMargins() on textctrl if LEFT_MARGIN_CAN_BE_SET == 1
-        wxUnusedVar(textCtrlXAdjust);
-        m_text->SetMargins(0);
-        textCtrlXAdjust = 0;
-#endif
+        int x;
 
-        // Centre textctrl
+        if ( !m_widthCustomPaint )
+        {
+            // No special custom paint area - we can use 0 left margin
+            // with wxTextCtrl.
+            if ( m_text->SetMargins(0) )
+                textCtrlXAdjust = 0;
+            x = m_tcArea.x + m_marginLeft + textCtrlXAdjust;
+        }
+        else
+        {
+            // There is special custom paint area - it is better to
+            // use some margin with the wxTextCtrl.
+            m_text->SetMargins(m_marginLeft);
+            x = m_tcArea.x + m_widthCustomPaint + 
+                m_marginLeft + textCtrlXAdjust;
+        }
+
+        // Centre textctrl vertically, if needed
 #if !TEXTCTRL_TEXT_CENTERED
         int tcSizeY = m_text->GetBestSize().y;
         int diff0 = sz.y - tcSizeY;
@@ -1105,15 +1097,9 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust
         if ( y < customBorder )
             y = customBorder;
 
-        int x = m_tcArea.x + m_widthCustomPaint + 
-                m_marginLeft + textCtrlXAdjust;
-
         m_text->SetSize(x,
                         y,
                         m_tcArea.width - m_tcArea.x - x,
-                        /*m_tcArea.width - COMBO_MARGIN -
-                        (textCtrlXAdjust + m_widthCustomPaint +
-                         m_marginLeft),*/
                         -1 );
 
         // Make sure textctrl doesn't exceed the bottom custom border
@@ -1249,8 +1235,15 @@ bool wxComboCtrlBase::SetFont ( const wxFont& font )
     if ( !wxControl::SetFont(font) )
         return false;
 
-    if (m_text)
+    if ( m_text )
+    {
+        // Without hiding the wxTextCtrl there would be some
+        // visible 'flicker' (at least on Windows XP).
+        m_text->Hide();
         m_text->SetFont(font);
+        OnResize();
+        m_text->Show();
+    }
 
     return true;
 }
@@ -1631,7 +1624,7 @@ bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event,
         if ( IsPopupWindowState(Visible) &&
              ( evtType == wxEVT_LEFT_DOWN || evtType == wxEVT_RIGHT_DOWN ) )
         {
-            HidePopup();
+            HidePopup(true);
             return true;
         }
     }
@@ -1659,7 +1652,7 @@ void wxComboCtrlBase::HandleNormalMouseEvent( wxMouseEvent& event )
     #if USES_WXPOPUPWINDOW
             // Click here always hides the popup.
             if ( m_popupWinType == POPUPWIN_WXPOPUPWINDOW )
-                HidePopup();
+                HidePopup(true);
     #endif
         }
         else
@@ -1736,13 +1729,9 @@ void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event )
     {
         wxWindow* tc = GetTextCtrl();
         if ( tc && tc != DoFindFocus() )
-#ifdef __WXMAC__
-            m_resetFocus = true;
-#else
         {
             tc->SetFocus();
         }
-#endif
     }
 
     Refresh();
@@ -1819,7 +1808,7 @@ void wxComboCtrlBase::CreatePopup()
 // Destroy popup window and the child control
 void wxComboCtrlBase::DestroyPopup()
 {
-    HidePopup();
+    HidePopup(true);
 
     if ( m_popup )
         m_popup->RemoveEventHandler(m_popupExtraHandler);
@@ -1882,9 +1871,17 @@ void wxComboCtrlBase::OnButtonClick()
     // Derived classes can override this method for totally custom
     // popup action
     if ( !IsPopupWindowState(Visible) )
+    {
+        wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId());
+        event.SetEventObject(this);
+        HandleWindowEvent(event);
+
         ShowPopup();
+    }
     else
-        HidePopup();
+    {
+        HidePopup(true);
+    }
 }
 
 void wxComboCtrlBase::ShowPopup()
@@ -2103,7 +2100,7 @@ void wxComboCtrlBase::DoShowPopup( const wxRect& rect, int WXUNUSED(flags) )
     Refresh();
 }
 
-void wxComboCtrlBase::OnPopupDismiss()
+void wxComboCtrlBase::OnPopupDismiss(bool generateEvent)
 {
     // Just in case, avoid double dismiss
     if ( IsPopupWindowState(Hidden) )
@@ -2155,9 +2152,16 @@ void wxComboCtrlBase::OnPopupDismiss()
     Refresh();
 
     SetFocus();
+
+    if ( generateEvent )
+    {
+        wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_CLOSEUP, GetId());
+        event.SetEventObject(this);
+        HandleWindowEvent(event);
+    }
 }
 
-void wxComboCtrlBase::HidePopup()
+void wxComboCtrlBase::HidePopup(bool generateEvent)
 {
     // Should be able to call this without popup interface
     if ( IsPopupWindowState(Hidden) )
@@ -2169,7 +2173,7 @@ void wxComboCtrlBase::HidePopup()
 
     m_winPopup->Hide();
 
-    OnPopupDismiss();
+    OnPopupDismiss(generateEvent);
 }
 
 // ----------------------------------------------------------------------------