/////////////////////////////////////////////////////////////////////////////
-// Name: src/mac/carbon/combobox.cpp
+// Name: src/osx/carbon/combobox.cpp
// Purpose: wxComboBox class
// Author: Stefan Csomor, Dan "Bud" Keith (composite combobox)
// Modified by:
#include "wx/wxprec.h"
-#if wxUSE_COMBOBOX
+#if wxUSE_COMBOBOX && wxOSX_USE_CARBON
#include "wx/combobox.h"
#include "wx/textctrl.h"
#endif
-#include "wx/osx/uma.h"
-
-IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl)
+#include "wx/osx/private.h"
WX_DELEGATE_TO_CONTROL_CONTAINER(wxComboBox, wxControl)
END_EVENT_TABLE()
-static int nextPopUpMenuId = 1000 ;
-
-MenuHandle NewUniqueMenu()
-{
- MenuHandle handle = UMANewMenu(nextPopUpMenuId, wxString(wxT("Menu")), wxFont::GetDefaultEncoding() );
- nextPopUpMenuId++ ;
-
- return handle ;
-}
-
-
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
: wxTextCtrl( cb , 1 )
{
m_cb = cb;
- SetTriggerOnSetValue( false );
}
protected:
event.Skip();
}
+ void OnFocus( wxFocusEvent& event )
+ {
+ // in case the textcontrol gets the focus we propagate
+ // it to the parent's handlers.
+ wxFocusEvent evt2(event.GetEventType(),m_cb->GetId());
+ evt2.SetEventObject(m_cb);
+ m_cb->GetEventHandler()->ProcessEvent(evt2);
+
+ event.Skip();
+ }
+
private:
wxComboBox *m_cb;
EVT_KEY_DOWN(wxComboBoxText::OnKeyDown)
EVT_CHAR(wxComboBoxText::OnChar)
EVT_KEY_UP(wxComboBoxText::OnKeyUp)
+ EVT_SET_FOCUS(wxComboBoxText::OnFocus)
+ EVT_KILL_FOCUS(wxComboBoxText::OnFocus)
EVT_TEXT(wxID_ANY, wxComboBoxText::OnText)
END_EVENT_TABLE()
// 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);
}
// ----------------------------------------------------------------------------
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
{
{
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);
}
}
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;
{
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;
return false;
}
-wxInt32 wxComboBox::MacControlHit( WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) )
+bool wxComboBox::OSXHandleClicked( double WXUNUSED(timestampsec) )
{
/*
For consistency with other platforms, clicking in the text area does not constitute a selection
ProcessCommand(event);
*/
- return noErr ;
+ return true ;
+}
+
+wxTextWidgetImpl* wxComboBox::GetTextPeer() const
+{
+ if (m_text)
+ return m_text->GetTextPeer();
+
+ return NULL;
}
-#endif // wxUSE_COMBOBOX
+#endif // wxUSE_COMBOBOX && wxOSX_USE_CARBON