X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/46cc7c4e64bd885818aa6022e182fce4d2ca6992..7ad25aed02fa53612cd94a422904667c46fafcbb:/src/mac/carbon/combobxc.cpp?ds=sidebyside diff --git a/src/mac/carbon/combobxc.cpp b/src/mac/carbon/combobxc.cpp index e0549c540a..abb642fcde 100644 --- a/src/mac/carbon/combobxc.cpp +++ b/src/mac/carbon/combobxc.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: combobox.cpp +// Name: src/mac/carbon/combobox.cpp // Purpose: wxComboBox class // Author: Stefan Csomor // Modified by: @@ -9,34 +9,78 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "combobox.h" -#endif +#include "wx/wxprec.h" #include "wx/combobox.h" #include "wx/button.h" #include "wx/menu.h" #include "wx/mac/uma.h" +#if TARGET_API_MAC_OSX #ifndef __HIVIEW__ - #include + #include +#endif #endif -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl) -#endif // composite combobox implementation by Dan "Bud" Keith bud@otsys.com +#if TARGET_API_MAC_OSX #define USE_HICOMBOBOX 1 //use hi combobox define +#else +#define USE_HICOMBOBOX 0 +#endif static int nextPopUpMenuId = 1000 ; -MenuHandle NewUniqueMenu() +MenuHandle NewUniqueMenu() { MenuHandle handle = NewMenu( nextPopUpMenuId , "\pMenu" ) ; nextPopUpMenuId++ ; return handle ; } +#if USE_HICOMBOBOX +static const EventTypeSpec eventList[] = +{ + { kEventClassTextField , kEventTextAccepted } , +} ; + +static pascal OSStatus wxMacComboBoxEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) +{ + OSStatus result = eventNotHandledErr ; + wxComboBox* cb = (wxComboBox*) data ; + + wxMacCarbonEvent cEvent( event ) ; + + switch( cEvent.GetClass() ) + { + case kEventClassTextField : + switch( cEvent.GetKind() ) + { + case kEventTextAccepted : + { + wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, cb->GetId() ); + event.SetInt( cb->GetSelection() ); + event.SetString( cb->GetStringSelection() ); + event.SetEventObject( cb ); + cb->GetEventHandler()->ProcessEvent( event ); + } + break ; + default : + break ; + } + break ; + default : + break ; + } + + + return result ; +} + +DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacComboBoxEventHandler ) + +#endif // ---------------------------------------------------------------------------- // constants @@ -115,13 +159,13 @@ protected: event.SetEventObject(def); def->Command(event); return ; - } + } } return; } } - + event.Skip(); } private: @@ -160,7 +204,7 @@ protected: wxSize sz = wxChoice::DoGetBestSize() ; sz.x = POPUPWIDTH ; return sz ; - } + } private: wxComboBox *m_cb; @@ -169,7 +213,7 @@ private: }; BEGIN_EVENT_TABLE(wxComboBoxChoice, wxChoice) - EVT_CHOICE(-1, wxComboBoxChoice::OnChoice) + EVT_CHOICE(wxID_ANY, wxComboBoxChoice::OnChoice) END_EVENT_TABLE() wxComboBox::~wxComboBox() @@ -198,14 +242,14 @@ wxComboBox::~wxComboBox() wxSize wxComboBox::DoGetBestSize() const { #if USE_HICOMBOBOX - return wxControl::DoGetBestSize(); + return wxControl::DoGetBestSize(); #else wxSize size = m_choice->GetBestSize(); - + if ( m_text != NULL ) { wxSize sizeText = m_text->GetBestSize(); - + size.x = POPUPWIDTH + sizeText.x + MARGIN; } @@ -215,25 +259,25 @@ wxSize wxComboBox::DoGetBestSize() const void wxComboBox::DoMoveWindow(int x, int y, int width, int height) { #if USE_HICOMBOBOX - wxControl::DoMoveWindow(x, y, width, height); + wxControl::DoMoveWindow(x, y, width, height); #else height = POPUPHEIGHT; - + wxControl::DoMoveWindow(x, y, width, height); if ( m_text == NULL ) { // we might not be fully constructed yet, therefore watch out... if ( m_choice ) - m_choice->SetSize(0, 0 , width, -1); + m_choice->SetSize(0, 0 , width, wxDefaultCoord); } else { wxCoord wText = width - POPUPWIDTH - MARGIN; m_text->SetSize(0, 0, wText, height); - m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, -1); + m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, wxDefaultCoord); } -#endif +#endif } @@ -245,23 +289,23 @@ void wxComboBox::DoMoveWindow(int x, int y, int width, int height) { bool wxComboBox::Enable(bool enable) { if ( !wxControl::Enable(enable) ) - return FALSE; + return false; - return TRUE; + return true; } bool wxComboBox::Show(bool show) { if ( !wxControl::Show(show) ) - return FALSE; + return false; - return TRUE; + return true; } void wxComboBox::SetFocus() { #if USE_HICOMBOBOX - wxControl::SetFocus(); + wxControl::SetFocus(); #else if ( m_text != NULL) { m_text->SetFocus(); @@ -310,51 +354,57 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, m_text = NULL; m_choice = NULL; #if USE_HICOMBOBOX - m_macIsUserPane = FALSE ; + m_macIsUserPane = false ; #endif if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style , wxDefaultValidator, name) ) { - return FALSE; + return false; } #if USE_HICOMBOBOX Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ; HIRect hiRect; - + hiRect.origin.x = 20; //bounds.left; hiRect.origin.y = 25; //bounds.top; hiRect.size.width = 120;// bounds.right - bounds.left; - hiRect.size.height = 24; - + hiRect.size.height = 24; + //For some reason, this code causes the combo box not to be displayed at all. //hiRect.origin.x = bounds.left; //hiRect.origin.y = bounds.top; //hiRect.size.width = bounds.right - bounds.left; //hiRect.size.height = bounds.bottom - bounds.top; //printf("left = %d, right = %d, top = %d, bottom = %d\n", bounds.left, bounds.right, bounds.top, bounds.bottom); - //printf("x = %d, y = %d, width = %d, height = %d\n", hibounds.origin.x, hibounds.origin.y, hibounds.size.width, hibounds.size.height); - verify_noerr( HIComboBoxCreate( &hiRect, CFSTR(""), NULL, NULL, kHIComboBoxStandardAttributes, (HIViewRef*) &m_macControl) ); + //printf("x = %d, y = %d, width = %d, height = %d\n", hibounds.origin.x, hibounds.origin.y, hibounds.size.width, hibounds.size.height); + m_peer = new wxMacControl(this) ; + verify_noerr( HIComboBoxCreate( &hiRect, CFSTR(""), NULL, NULL, kHIComboBoxStandardAttributes, *m_peer ) ); + - SetControl32BitMinimum( (ControlRef) m_macControl , 0 ) ; - SetControl32BitMaximum( (ControlRef) m_macControl , 100) ; + SetControl32BitMinimum( *m_peer , 0 ) ; + SetControl32BitMaximum( *m_peer , 100) ; if ( n > 0 ) - SetControl32BitValue( (ControlRef) m_macControl , 1 ) ; - + SetControl32BitValue( *m_peer , 1 ) ; + MacPostControlCreate(pos,size) ; - + for ( int i = 0 ; i < n ; i++ ) { DoAppend( choices[ i ] ); } - - HIViewSetVisible( (HIViewRef) m_macControl, true ); + + HIViewSetVisible( *m_peer, true ); SetSelection(0); + EventHandlerRef comboEventHandler ; + InstallControlEventHandler( *m_peer, GetwxMacComboBoxEventHandlerUPP(), + GetEventTypeCount(eventList), eventList, this, + (EventHandlerRef *)&comboEventHandler); #else m_choice = new wxComboBoxChoice(this, style ); m_choice = new wxComboBoxChoice(this, style ); m_choice->SetSizeHints( wxSize( POPUPWIDTH , POPUPHEIGHT ) ) ; - + wxSize csize = size; if ( style & wxCB_READONLY ) { @@ -363,13 +413,13 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, else { m_text = new wxComboBoxText(this); - if ( size.y == -1 ) { + if ( size.y == wxDefaultCoord ) { csize.y = m_text->GetSize().y ; } } - + DoSetSize(pos.x, pos.y, csize.x, csize.y); - + for ( int i = 0 ; i < n ; i++ ) { m_choice->DoAppend( choices[ i ] ); @@ -377,18 +427,18 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, SetBestSize(csize); // Needed because it is a wxControlWithItems #endif - return TRUE; + return true; } wxString wxComboBox::GetValue() const { #if USE_HICOMBOBOX CFStringRef myString; - HIComboBoxCopyTextItemAtIndex( (HIViewRef) m_macControl, (CFIndex)GetSelection(), &myString ); + HIComboBoxCopyTextItemAtIndex( *m_peer, (CFIndex)GetSelection(), &myString ); return wxMacCFStringHolder( myString, m_font.GetEncoding() ).AsString(); #else wxString result; - + if ( m_text == NULL ) { result = m_choice->GetString( m_choice->GetSelection() ); @@ -397,7 +447,7 @@ wxString wxComboBox::GetValue() const { result = m_text->GetValue(); } - + return result; #endif } @@ -405,7 +455,7 @@ wxString wxComboBox::GetValue() const void wxComboBox::SetValue(const wxString& value) { #if USE_HICOMBOBOX - + #else int s = FindString (value); if (s == wxNOT_FOUND && !HasFlag(wxCB_READONLY) ) @@ -455,7 +505,7 @@ void wxComboBox::SetEditable(bool editable) int currentX, currentY; GetPosition( ¤tX, ¤tY ); - + int currentW, currentH; GetSize( ¤tW, ¤tH ); @@ -478,7 +528,7 @@ long wxComboBox::GetInsertionPoint() const return 0; } -long wxComboBox::GetLastPosition() const +wxTextPos wxComboBox::GetLastPosition() const { // TODO return 0; @@ -499,32 +549,32 @@ void wxComboBox::SetSelection(long from, long to) // TODO } -int wxComboBox::DoAppend(const wxString& item) +int wxComboBox::DoAppend(const wxString& item) { #if USE_HICOMBOBOX CFIndex outIndex; - HIComboBoxAppendTextItem( (HIViewRef) m_macControl, wxMacCFStringHolder( item, m_font.GetEncoding() ), &outIndex ); - //SetControl32BitMaximum( (HIViewRef) m_macControl, GetCount() ); + HIComboBoxAppendTextItem( *m_peer, wxMacCFStringHolder( item, m_font.GetEncoding() ), &outIndex ); + //SetControl32BitMaximum( *m_peer, GetCount() ); return (int) outIndex; #else return m_choice->DoAppend( item ) ; #endif } -int wxComboBox::DoInsert(const wxString& item, int pos) +int wxComboBox::DoInsert(const wxString& item, int pos) { #if USE_HICOMBOBOX - HIComboBoxInsertTextItemAtIndex( (HIViewRef) m_macControl, (CFIndex)pos, wxMacCFStringHolder(item, m_font.GetEncoding()) ); - - //SetControl32BitMaximum( (HIViewRef) m_macControl, GetCount() ); - + HIComboBoxInsertTextItemAtIndex( *m_peer, (CFIndex)pos, wxMacCFStringHolder(item, m_font.GetEncoding()) ); + + //SetControl32BitMaximum( *m_peer, GetCount() ); + return pos; #else return m_choice->DoInsert( item , pos ) ; #endif } -void wxComboBox::DoSetItemClientData(int n, void* clientData) +void wxComboBox::DoSetItemClientData(int n, void* clientData) { #if USE_HICOMBOBOX return; //TODO @@ -551,7 +601,7 @@ void wxComboBox::DoSetItemClientObject(int n, wxClientData* clientData) #endif } -wxClientData* wxComboBox::DoGetItemClientObject(int n) const +wxClientData* wxComboBox::DoGetItemClientObject(int n) const { #if USE_HICOMBOBOX return NULL; @@ -574,16 +624,16 @@ void wxComboBox::FreeData() int wxComboBox::GetCount() const { #if USE_HICOMBOBOX - return (int) HIComboBoxGetItemCount( (HIViewRef) m_macControl ); + return (int) HIComboBoxGetItemCount( *m_peer ); #else - return m_choice->GetCount() ; + return m_choice->GetCount() ; #endif } void wxComboBox::Delete(int n) { #if USE_HICOMBOBOX - HIComboBoxRemoveItemAtIndex( (HIViewRef) m_macControl, (CFIndex)n ); + HIComboBoxRemoveItemAtIndex( *m_peer, (CFIndex)n ); #else // force client object deletion if( HasClientObjectData() ) @@ -594,10 +644,12 @@ void wxComboBox::Delete(int n) void wxComboBox::Clear() { + FreeData(); #if USE_HICOMBOBOX - //TODO + for ( CFIndex i = GetCount() - 1 ; i >= 0 ; ++ i ) + verify_noerr( HIComboBoxRemoveItemAtIndex( *m_peer, i ) ); + m_peer->SetData(kHIComboBoxEditTextPart,kControlEditTextCFStringTag,CFSTR("")); #else - FreeData(); m_choice->Clear(); #endif } @@ -605,8 +657,7 @@ void wxComboBox::Clear() int wxComboBox::GetSelection() const { #if USE_HICOMBOBOX - int result = GetControl32BitValue( (HIViewRef) m_macControl ) -1; - return result; + return FindString( GetStringSelection() ) ; #else return m_choice->GetSelection(); #endif @@ -615,10 +666,10 @@ int wxComboBox::GetSelection() const void wxComboBox::SetSelection(int n) { #if USE_HICOMBOBOX - SetControl32BitValue( (ControlRef) m_macControl , n + 1 ) ; + SetControl32BitValue( *m_peer , n + 1 ) ; #else m_choice->SetSelection( n ); - + if ( m_text != NULL ) { m_text->SetValue( GetString( n ) ); @@ -626,17 +677,17 @@ void wxComboBox::SetSelection(int n) #endif } -int wxComboBox::FindString(const wxString& s) const +int wxComboBox::FindString(const wxString& s, bool bCase) const { #if USE_HICOMBOBOX for( int i = 0 ; i < GetCount() ; i++ ) { - if ( GetString( i ).IsSameAs(s, FALSE) ) + if ( GetString( i ).IsSameAs(s, bCase) ) return i ; } return wxNOT_FOUND ; #else - return m_choice->FindString( s ); + return m_choice->FindString( s, bCase ); #endif } @@ -644,7 +695,7 @@ wxString wxComboBox::GetString(int n) const { #if USE_HICOMBOBOX CFStringRef itemText; - HIComboBoxCopyTextItemAtIndex( (HIViewRef) m_macControl, (CFIndex)n, &itemText ); + HIComboBoxCopyTextItemAtIndex( *m_peer, (CFIndex)n, &itemText ); return wxMacCFStringHolder(itemText).AsString(); #else return m_choice->GetString( n ); @@ -653,45 +704,139 @@ wxString wxComboBox::GetString(int n) const wxString wxComboBox::GetStringSelection() const { +#if USE_HICOMBOBOX + return wxMacCFStringHolder(m_peer->GetData(kHIComboBoxEditTextPart,kControlEditTextCFStringTag)).AsString() ; +#else int sel = GetSelection (); if (sel > -1) return wxString(this->GetString (sel)); else return wxEmptyString; +#endif } -bool wxComboBox::SetStringSelection(const wxString& sel) +void wxComboBox::SetString(int n, const wxString& s) { - int s = FindString (sel); - if (s > -1) - { - SetSelection (s); - return TRUE; - } +#if USE_HICOMBOBOX + verify_noerr ( HIComboBoxInsertTextItemAtIndex( *m_peer, (CFIndex) n, + wxMacCFStringHolder(s, m_font.GetEncoding()) ) ); + verify_noerr ( HIComboBoxRemoveItemAtIndex( *m_peer, (CFIndex) n + 1 ) ); +#else + m_choice->SetString( n , s ) ; +#endif +} + +bool wxComboBox::IsEditable() const +{ +#if USE_HICOMBOBOX + // TODO + return !HasFlag(wxCB_READONLY); +#else + return m_text != NULL && !HasFlag(wxCB_READONLY); +#endif +} + +void wxComboBox::Undo() +{ +#if USE_HICOMBOBOX + // TODO +#else + if (m_text != NULL) + m_text->Undo(); +#endif +} + +void wxComboBox::Redo() +{ +#if USE_HICOMBOBOX + // TODO +#else + if (m_text != NULL) + m_text->Redo(); +#endif +} + +void wxComboBox::SelectAll() +{ +#if USE_HICOMBOBOX + // TODO +#else + if (m_text != NULL) + m_text->SelectAll(); +#endif +} + +bool wxComboBox::CanCopy() const +{ +#if USE_HICOMBOBOX + // TODO + return false; +#else + if (m_text != NULL) + return m_text->CanCopy(); else - return FALSE; + return false; +#endif } -void wxComboBox::SetString(int n, const wxString& s) +bool wxComboBox::CanCut() const { #if USE_HICOMBOBOX + // TODO + return false; +#else + if (m_text != NULL) + return m_text->CanCut(); + else + return false; +#endif +} +bool wxComboBox::CanPaste() const +{ +#if USE_HICOMBOBOX + // TODO + return false; #else - m_choice->SetString( n , s ) ; + if (m_text != NULL) + return m_text->CanPaste(); + else + return false; +#endif +} + +bool wxComboBox::CanUndo() const +{ +#if USE_HICOMBOBOX + // TODO + return false; +#else + if (m_text != NULL) + return m_text->CanUndo(); + else + return false; #endif } +bool wxComboBox::CanRedo() const +{ +#if USE_HICOMBOBOX + // TODO + return false; +#else + if (m_text != NULL) + return m_text->CanRedo(); + else + return false; +#endif +} -wxInt32 wxComboBox::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) ) +wxInt32 wxComboBox::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) ) { -/* wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, m_windowId ); event.SetInt(GetSelection()); event.SetEventObject(this); event.SetString(GetStringSelection()); ProcessCommand(event); return noErr ; -*/ - return eventNotHandledErr ; } -