]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/combobox.cpp
notify the event loop that synthesized events are on the queue, wait for them to...
[wxWidgets.git] / src / osx / carbon / combobox.cpp
index 807194c8d7af8eda18ab8fc1344780909608a612..8d6dec95e291852bc95de479bb75d5747c294b85 100644 (file)
@@ -11,7 +11,7 @@
 
 #include "wx/wxprec.h"
 
-#if wxUSE_COMBOBOX
+#if wxUSE_COMBOBOX && wxOSX_USE_CARBON
 
 #include "wx/combobox.h"
 
 
 #include "wx/osx/private.h"
 
-IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl)
-
-WX_DELEGATE_TO_CONTROL_CONTAINER(wxComboBox, wxControl)
-
-BEGIN_EVENT_TABLE(wxComboBox, wxControl)
-    WX_EVENT_TABLE_CONTROL_CONTAINER(wxComboBox)
-END_EVENT_TABLE()
-
-
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
@@ -57,7 +48,6 @@ public:
         : wxTextCtrl( cb , 1 )
     {
         m_cb = cb;
-        SetTriggerOnSetValue( false );
     }
 
 protected:
@@ -68,7 +58,7 @@ protected:
         {
             wxNavigationKeyEvent NavEvent;
             NavEvent.SetEventObject(this);
-            NavEvent.SetDirection(true);
+            NavEvent.SetDirection(!event.ShiftDown());
             NavEvent.SetWindowChange(false);
 
             // Get the parent of the combo and have it process the navigation?
@@ -85,7 +75,7 @@ protected:
 
         if ( event.GetKeyCode() == WXK_RETURN )
         {
-            wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_cb->GetId());
+            wxCommandEvent event(wxEVT_TEXT_ENTER, m_cb->GetId());
             event.SetString( GetValue() );
             event.SetInt( m_cb->GetSelection() );
             event.SetEventObject( m_cb );
@@ -100,7 +90,7 @@ protected:
                     wxButton *def = wxDynamicCast(tlw->GetDefaultItem(), wxButton);
                     if ( def && def->IsEnabled() )
                     {
-                        wxCommandEvent event( wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() );
+                        wxCommandEvent event( wxEVT_BUTTON, def->GetId() );
                         event.SetEventObject(def);
                         def->Command(event);
                     }
@@ -147,6 +137,7 @@ protected:
 
         event.Skip();
     }
+
 private:
     wxComboBox *m_cb;
 
@@ -190,7 +181,7 @@ protected:
         wxString    s = e.GetString();
 
         m_cb->DelegateChoice( s );
-        wxCommandEvent event2(wxEVT_COMMAND_COMBOBOX_SELECTED, m_cb->GetId() );
+        wxCommandEvent event2(wxEVT_COMBOBOX, m_cb->GetId() );
         event2.SetInt(m_cb->GetSelection());
         event2.SetEventObject(m_cb);
         event2.SetString(m_cb->GetStringSelection());
@@ -198,7 +189,7 @@ protected:
 
         // For consistency with MSW and GTK, also send a text updated event
         // After all, the text is updated when a selection is made
-        wxCommandEvent TextEvent( wxEVT_COMMAND_TEXT_UPDATED, m_cb->GetId() );
+        wxCommandEvent TextEvent( wxEVT_TEXT, m_cb->GetId() );
         TextEvent.SetString( m_cb->GetStringSelection() );
         TextEvent.SetEventObject( m_cb );
         m_cb->ProcessCommand( TextEvent );
@@ -230,17 +221,8 @@ wxComboBox::~wxComboBox()
     // delete the controls now, don't leave them alive even though they would
     // still be eventually deleted by our parent - but it will be too late, the
     // user code expects them to be gone now
-    if (m_text != NULL)
-    {
-        delete m_text;
-        m_text = NULL;
-    }
-
-    if (m_choice != NULL)
-    {
-        delete m_choice;
-        m_choice = NULL;
-    }
+    wxDELETE(m_text);
+    wxDELETE(m_choice);
 }
 
 // ----------------------------------------------------------------------------
@@ -257,12 +239,11 @@ wxSize wxComboBox::DoGetBestSize() const
     if ( m_text != NULL )
     {
         wxSize  sizeText = m_text->GetBestSize();
-        if (sizeText.y > size.y)
-            size.y = sizeText.y;
+        if (sizeText.y + 2 * TEXTFOCUSBORDER > size.y)
+            size.y = sizeText.y + 2 * TEXTFOCUSBORDER;
 
         size.x = m_choice->GetPopupWidth() + sizeText.x + MARGIN;
         size.x += TEXTFOCUSBORDER ;
-        size.y += 2 * TEXTFOCUSBORDER ;
     }
     else
     {
@@ -287,9 +268,13 @@ void wxComboBox::DoMoveWindow(int x, int y, int width, int height)
     {
         wxCoord wText = width - m_choice->GetPopupWidth() - MARGIN;
         m_text->SetSize(TEXTFOCUSBORDER, TEXTFOCUSBORDER, wText, -1);
+        wxSize tSize = m_text->GetSize();
+        wxSize cSize = m_choice->GetSize();
+
+        int yOffset = ( tSize.y + 2 * TEXTFOCUSBORDER - cSize.y ) / 2;
 
         // put it at an inset of 1 to have outer area shadows drawn as well
-        m_choice->SetSize(TEXTFOCUSBORDER + wText + MARGIN - 1 , TEXTFOCUSBORDER, m_choice->GetPopupWidth() , -1);
+        m_choice->SetSize(TEXTFOCUSBORDER + wText + MARGIN - 1 , yOffset, m_choice->GetPopupWidth() , -1);
     }
 }
 
@@ -326,11 +311,6 @@ void wxComboBox::DelegateChoice( const wxString& value )
     SetStringSelection( value );
 }
 
-void wxComboBox::Init()
-{
-    WX_INIT_CONTROL_CONTAINER();
-}
-
 bool wxComboBox::Create(wxWindow *parent,
     wxWindowID id,
     const wxString& value,
@@ -394,6 +374,19 @@ bool wxComboBox::Create(wxWindow *parent,
     return true;
 }
 
+void wxComboBox::EnableTextChangedEvents(bool enable)
+{
+    if ( m_text )
+        m_text->ForwardEnableTextChangedEvents(enable);
+}
+
+wxString wxComboBox::DoGetValue() const
+{
+    wxCHECK_MSG( m_text, wxString(), "can't be called for read-only combobox" );
+
+    return m_text->GetValue();
+}
+
 wxString wxComboBox::GetValue() const
 {
     wxString        result;
@@ -455,10 +448,9 @@ void wxComboBox::SetEditable(bool editable)
     {
         m_text = new wxComboBoxText( this );
     }
-    else if ( ( m_text != NULL ) && !editable )
+    else if ( !editable )
     {
-        delete m_text;
-        m_text = NULL;
+        wxDELETE(m_text);
     }
 
     int currentX, currentY;
@@ -652,11 +644,11 @@ bool wxComboBox::CanRedo() const
         return false;
 }
 
-bool wxComboBox::OSXHandleClicked( double timestampsec )
+bool wxComboBox::OSXHandleClicked( double WXUNUSED(timestampsec) )
 {
 /*
     For consistency with other platforms, clicking in the text area does not constitute a selection
-    wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, m_windowId );
+    wxCommandEvent event(wxEVT_COMBOBOX, m_windowId );
     event.SetInt(GetSelection());
     event.SetEventObject(this);
     event.SetString(GetStringSelection());
@@ -666,4 +658,12 @@ bool wxComboBox::OSXHandleClicked( double timestampsec )
     return true ;
 }
 
-#endif // wxUSE_COMBOBOX
+wxTextWidgetImpl* wxComboBox::GetTextPeer() const
+{
+    if (m_text)
+        return m_text->GetTextPeer();
+
+    return NULL;
+}
+
+#endif // wxUSE_COMBOBOX && wxOSX_USE_CARBON