From f941a30bef665561d96d29c4cee07471dbbd497f Mon Sep 17 00:00:00 2001 From: Kevin Ollivier Date: Mon, 4 Jan 2010 01:57:42 +0000 Subject: [PATCH] Get the OS X Cocoa native combobox building by having the native code compile if wxOSX_USE_NATIVE_COMBOBOX is defined. It must be explicitly enabled by adding that define to the build flags as the native implementation is mostly just stubs right now. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63053 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- build/bakefiles/files.bkl | 2 + include/wx/osx/combobox.h | 8 + include/wx/osx/core/private.h | 11 + src/osx/carbon/combobox.cpp | 4 +- src/osx/cocoa/combobox.mm | 6 +- src/osx/combobox_osx.cpp | 472 ++++++---------------------------- 6 files changed, 109 insertions(+), 394 deletions(-) diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 790f4a4041..404da548a2 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -2232,6 +2232,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/osx/checkbox_osx.cpp src/osx/checklst_osx.cpp src/osx/choice_osx.cpp + src/osx/combobox_osx.cpp src/osx/gauge_osx.cpp src/osx/listbox_osx.cpp src/osx/menu_osx.cpp @@ -2464,6 +2465,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/osx/cocoa/checkbox.mm src/osx/cocoa/choice.mm src/osx/cocoa/colour.mm + src/osx/cocoa/combobox.mm src/osx/cocoa/dialog.mm src/osx/cocoa/dirdlg.mm src/osx/cocoa/evtloop.mm diff --git a/include/wx/osx/combobox.h b/include/wx/osx/combobox.h index 92ff947afe..7eef53a199 100644 --- a/include/wx/osx/combobox.h +++ b/include/wx/osx/combobox.h @@ -30,9 +30,11 @@ class WXDLLIMPEXP_CORE wxComboBox : public wxControl, public wxComboBoxBase public: virtual ~wxComboBox(); +#ifndef wxOSX_USE_NATIVE_COMBOBOX // forward these functions to all subcontrols virtual bool Enable(bool enable = true); virtual bool Show(bool show = true); +#endif // callback functions virtual void DelegateTextChanged( const wxString& value ); @@ -129,9 +131,11 @@ class WXDLLIMPEXP_CORE wxComboBox : public wxControl, public wxComboBoxBase virtual bool OSXHandleClicked( double timestampsec ); +#ifndef wxOSX_USE_NATIVE_COMBOBOX wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST WX_DECLARE_CONTROL_CONTAINER(); +#endif protected: // common part of all ctors @@ -145,9 +149,11 @@ protected: virtual wxString DoGetValue() const; virtual wxWindow *GetEditableWindow() { return this; } +#ifndef wxOSX_USE_NATIVE_COMBOBOX // override the base class virtuals involved in geometry calculations virtual wxSize DoGetBestSize() const; virtual void DoMoveWindow(int x, int y, int width, int height); +#endif virtual int DoInsertItems(const wxArrayStringsAdapter& items, unsigned int pos, @@ -164,7 +170,9 @@ protected: wxComboBoxText* m_text; wxComboBoxChoice* m_choice; +#ifndef wxOSX_USE_NATIVE_COMBOBOX DECLARE_EVENT_TABLE() +#endif }; #endif // _WX_COMBOBOX_H_ diff --git a/include/wx/osx/core/private.h b/include/wx/osx/core/private.h index c0de78f269..c106c39ca7 100644 --- a/include/wx/osx/core/private.h +++ b/include/wx/osx/core/private.h @@ -470,6 +470,17 @@ public : long style, long extraStyle); +#ifdef wxOSX_USE_NATIVE_COMBOBOX + static wxWidgetImplType* CreateComboBox( wxWindowMac* wxpeer, + wxWindowMac* parent, + wxWindowID id, + wxMenu* menu, + const wxPoint& pos, + const wxSize& size, + long style, + long extraStyle); +#endif + // converts from Toplevel-Content relative to local static void Convert( wxPoint *pt , wxWidgetImpl *from , wxWidgetImpl *to ); protected : diff --git a/src/osx/carbon/combobox.cpp b/src/osx/carbon/combobox.cpp index f8223c9108..c37811805c 100644 --- a/src/osx/carbon/combobox.cpp +++ b/src/osx/carbon/combobox.cpp @@ -11,7 +11,7 @@ #include "wx/wxprec.h" -#if wxUSE_COMBOBOX +#if wxUSE_COMBOBOX && !defined(wxOSX_USE_NATIVE_COMBOBOX) #include "wx/combobox.h" @@ -686,4 +686,4 @@ bool wxComboBox::OSXHandleClicked( double WXUNUSED(timestampsec) ) return true ; } -#endif // wxUSE_COMBOBOX +#endif // wxUSE_COMBOBOX && !defined(wxOSX_USE_NATIVE_COMBOBOX) diff --git a/src/osx/cocoa/combobox.mm b/src/osx/cocoa/combobox.mm index b090c3ae83..bd58b492d7 100644 --- a/src/osx/cocoa/combobox.mm +++ b/src/osx/cocoa/combobox.mm @@ -11,7 +11,7 @@ #include "wx/wxprec.h" -#if wxUSE_COMBOBOX +#if wxUSE_COMBOBOX && defined(wxOSX_USE_NATIVE_COMBOBOX) #include "wx/combobox.h" @@ -64,9 +64,9 @@ wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxWindowMac* wxpeer, long WXUNUSED(extraStyle)) { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; - wxNSComboBox* v = [[wxNSComboBox alloc] initWithFrame:r pullsDown:NO]; + wxNSComboBox* v = [[wxNSComboBox alloc] initWithFrame:r]; wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v ); return c; } -#endif // wxUSE_CHOICE +#endif // wxUSE_COMBOBOX && defined(wxOSX_USE_NATIVE_COMBOBOX) diff --git a/src/osx/combobox_osx.cpp b/src/osx/combobox_osx.cpp index 7e127cce14..3a0e884c7a 100644 --- a/src/osx/combobox_osx.cpp +++ b/src/osx/combobox_osx.cpp @@ -11,9 +11,10 @@ #include "wx/wxprec.h" -#if wxUSE_COMBOBOX +#if wxUSE_COMBOBOX && defined(wxOSX_USE_NATIVE_COMBOBOX) #include "wx/combobox.h" +#include "wx/osx/private.h" #ifndef WX_PRECOMP #endif @@ -26,6 +27,10 @@ wxComboBox::~wxComboBox() { } +void wxComboBox::Init() +{ +} + bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& value, const wxPoint& pos, @@ -58,16 +63,10 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, if ( !wxControl::Create( parent, id, pos, size, style, validator, name ) ) return false; - m_peer = wxWidgetImpl::CreateComboBox( this, parent, id, m_popUpMenu, pos, size, style, GetExtraStyle() ); + m_peer = wxWidgetImpl::CreateComboBox( this, parent, id, NULL, pos, size, style, GetExtraStyle() ); MacPostControlCreate( pos, size ); -#if !wxUSE_STL - if ( style & wxCB_SORT ) - // autosort - m_strings = wxArrayString( 1 ); -#endif - Append(n, choices); // Set the first item as being selected @@ -80,539 +79,234 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, return true; } -// ---------------------------------------------------------------------------- -// geometry -// ---------------------------------------------------------------------------- - -wxSize wxComboBox::DoGetBestSize() const -{ -#if USE_HICOMBOBOX - return wxControl::DoGetBestSize(); -#else - wxSize size = m_choice->GetBestSize(); - - if ( m_text != NULL ) - { - wxSize sizeText = m_text->GetBestSize(); - - size.x = POPUPWIDTH + sizeText.x + MARGIN; - } - - return size; -#endif -} - -void wxComboBox::DoMoveWindow(int x, int y, int width, int height) { -#if USE_HICOMBOBOX - 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, wxDefaultCoord); - } - else - { - wxCoord wText = width - POPUPWIDTH - MARGIN; - m_text->SetSize(0, 0, wText, height); - m_choice->SetSize(0 + wText + MARGIN, 0, POPUPWIDTH, wxDefaultCoord); - } -#endif -} - - - -// ---------------------------------------------------------------------------- -// operations forwarded to the subcontrols -// ---------------------------------------------------------------------------- - -bool wxComboBox::Enable(bool enable) -{ - if ( !wxControl::Enable(enable) ) - return false; - - return true; -} - -bool wxComboBox::Show(bool show) -{ - if ( !wxControl::Show(show) ) - return false; - - return true; -} - -void wxComboBox::SetFocus() -{ -#if USE_HICOMBOBOX - wxControl::SetFocus(); -#else - if ( m_text != NULL) { - m_text->SetFocus(); - } -#endif -} - - void wxComboBox::DelegateTextChanged( const wxString& value ) { SetStringSelection( value ); } - void wxComboBox::DelegateChoice( const wxString& value ) { SetStringSelection( value ); } -bool wxComboBox::Create(wxWindow *parent, wxWindowID id, - const wxString& value, - const wxPoint& pos, - const wxSize& size, - int n, const wxString choices[], - long style, - const wxValidator& validator, - const wxString& name) -{ - m_text = NULL; - m_choice = NULL; -#if USE_HICOMBOBOX - m_macIsUserPane = false; -#endif - if ( !wxControl::Create(parent, id, wxDefaultPosition, wxDefaultSize, style , - wxDefaultValidator, name) ) - { - 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; - - //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); - m_peer = new wxMacControl(this); - verify_noerr( HIComboBoxCreate( &hiRect, CFSTR(""), NULL, NULL, kHIComboBoxStandardAttributes, m_peer->GetControlRefAddr() ) ); - - - m_peer->SetMinimum( 0 ); - m_peer->SetMaximum( 100); - if ( n > 0 ) - m_peer->SetValue( 1 ); - - MacPostControlCreate(pos,size); - - Append( choices[ i ] ); - - HIViewSetVisible( m_peer->GetControlRef(), true ); - SetSelection(0); - EventHandlerRef comboEventHandler; - InstallControlEventHandler( m_peer->GetControlRef(), GetwxMacComboBoxEventHandlerUPP(), - GetEventTypeCount(eventList), eventList, this, - (EventHandlerRef *)&comboEventHandler); -#else - m_choice = new wxComboBoxChoice(this, style ); - m_choice->SetMinSize( wxSize( POPUPWIDTH , POPUPHEIGHT ) ); - - wxSize csize = size; - if ( style & wxCB_READONLY ) - { - m_text = NULL; - } - else - { - m_text = new wxComboBoxText(this); - if ( size.y == wxDefaultCoord ) { - csize.y = m_text->GetSize().y; - } - } - - DoSetSize(pos.x, pos.y, csize.x, csize.y); - - m_choice->Append( n, choices ); - SetInitialSize(csize); // Needed because it is a wxControlWithItems -#endif - - return true; -} - wxString wxComboBox::GetValue() const { -#if USE_HICOMBOBOX - CFStringRef myString; - HIComboBoxCopyTextItemAtIndex( m_peer->GetControlRef(), (CFIndex)GetSelection(), &myString ); - return wxMacCFStringHolder( myString, GetFont().GetEncoding() ).AsString(); -#else - wxString result; - - if ( m_text == NULL ) - { - result = m_choice->GetString( m_choice->GetSelection() ); - } - else - { - result = m_text->GetValue(); - } - - return result; -#endif + wxFAIL_MSG("Method Not Implemented."); + return wxEmptyString; } void wxComboBox::SetValue(const wxString& value) { -#if USE_HICOMBOBOX - -#else - int s = FindString (value); - if (s == wxNOT_FOUND && !HasFlag(wxCB_READONLY) ) - { - m_choice->Append(value); - } - SetStringSelection( value ); -#endif + wxFAIL_MSG("Method Not Implemented."); } // Clipboard operations void wxComboBox::Copy() { - if ( m_text != NULL ) - { - m_text->Copy(); - } + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::Cut() { - if ( m_text != NULL ) - { - m_text->Cut(); - } + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::Paste() { - if ( m_text != NULL ) - { - m_text->Paste(); - } + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::SetEditable(bool editable) { - if ( ( m_text == NULL ) && editable ) - { - m_text = new wxComboBoxText( this ); - } - else if ( ( m_text != NULL ) && !editable ) - { - delete m_text; - m_text = NULL; - } - - int currentX, currentY; - GetPosition( ¤tX, ¤tY ); - - int currentW, currentH; - GetSize( ¤tW, ¤tH ); - - DoMoveWindow( currentX, currentY, currentW, currentH ); + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::SetInsertionPoint(long pos) { - // TODO + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::SetInsertionPointEnd() { - // TODO + wxFAIL_MSG("Method Not Implemented."); } long wxComboBox::GetInsertionPoint() const { - // TODO + wxFAIL_MSG("Method Not Implemented."); return 0; } wxTextPos wxComboBox::GetLastPosition() const { - // TODO + wxFAIL_MSG("Method Not Implemented."); return 0; } void wxComboBox::Replace(long from, long to, const wxString& value) { - // TODO + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::Remove(long from, long to) { - // TODO + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::SetSelection(long from, long to) { - // TODO + wxFAIL_MSG("Method Not Implemented."); } int wxComboBox::DoInsertItems(const wxArrayStringsAdapter& items, unsigned int pos, void **clientData, wxClientDataType type) { -#if USE_HICOMBOBOX - const unsigned int count = items.GetCount(); - for ( unsigned int i = 0; i < count; ++i, ++pos ) - { - HIComboBoxInsertTextItemAtIndex(m_peer->GetControlRef(), - (CFIndex)pos, - wxMacCFStringHolder(items[i], - GetFont().GetEncoding())); - AssignNewItemClientData(pos, clientData, i, type); - } - - //SetControl32BitMaximum( m_peer->GetControlRef(), GetCount() ); - - return pos - 1; -#else - return m_choice->DoInsertItems( items, pos, clientData, type ); -#endif + wxFAIL_MSG("Method Not Implemented."); + return 0; } void wxComboBox::DoSetItemClientData(unsigned int n, void* clientData) { -#if USE_HICOMBOBOX - return; //TODO -#else - return m_choice->DoSetItemClientData( n , clientData ); -#endif + wxFAIL_MSG("Method Not Implemented."); } void* wxComboBox::DoGetItemClientData(unsigned int n) const { -#if USE_HICOMBOBOX - return NULL; //TODO -#else - return m_choice->DoGetItemClientData( n ); -#endif + wxFAIL_MSG("Method Not Implemented."); + return NULL; } -unsigned int wxComboBox::GetCount() const { -#if USE_HICOMBOBOX - return (unsigned int) HIComboBoxGetItemCount( m_peer->GetControlRef() ); -#else - return m_choice->GetCount(); -#endif +unsigned int wxComboBox::GetCount() const +{ + wxFAIL_MSG("Method Not Implemented."); + return 0; } void wxComboBox::DoDeleteOneItem(unsigned int n) { -#if USE_HICOMBOBOX - HIComboBoxRemoveItemAtIndex( m_peer->GetControlRef(), (CFIndex)n ); -#else - m_choice->Delete( n ); -#endif + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::DoClear() { -#if USE_HICOMBOBOX - for ( CFIndex i = GetCount() - 1; i >= 0; ++ i ) - verify_noerr( HIComboBoxRemoveItemAtIndex( m_peer->GetControlRef(), i ) ); - m_peer->SetData(kHIComboBoxEditTextPart,kControlEditTextCFStringTag,CFSTR("")); -#else - m_choice->Clear(); -#endif + wxFAIL_MSG("Method Not Implemented."); } int wxComboBox::GetSelection() const { -#if USE_HICOMBOBOX - return FindString( GetStringSelection() ); -#else - return m_choice->GetSelection(); -#endif + wxFAIL_MSG("Method Not Implemented."); + return 0; } -void wxComboBox::SetSelection(int n) +void wxComboBox::GetSelection(long *from, long *to) const { -#if USE_HICOMBOBOX - SetControl32BitValue( m_peer->GetControlRef() , n + 1 ); -#else - m_choice->SetSelection( n ); + wxFAIL_MSG("Method Not Implemented."); +} - if ( m_text != NULL ) - { - m_text->SetValue(GetString(n)); - } -#endif +void wxComboBox::SetSelection(int n) +{ + wxFAIL_MSG("Method Not Implemented."); } int wxComboBox::FindString(const wxString& s, bool bCase) const { -#if USE_HICOMBOBOX - for( unsigned int i = 0 ; i < GetCount() ; i++ ) - { - if (GetString(i).IsSameAs(s, bCase) ) - return i ; - } - return wxNOT_FOUND; -#else - return m_choice->FindString( s, bCase ); -#endif + wxFAIL_MSG("Method Not Implemented."); + return 0; } wxString wxComboBox::GetString(unsigned int n) const { -#if USE_HICOMBOBOX - CFStringRef itemText; - HIComboBoxCopyTextItemAtIndex( m_peer->GetControlRef(), (CFIndex)n, &itemText ); - return wxMacCFStringHolder(itemText).AsString(); -#else - return m_choice->GetString( n ); -#endif + wxFAIL_MSG("Method Not Implemented."); + return wxEmptyString; } wxString wxComboBox::GetStringSelection() const { -#if USE_HICOMBOBOX - return wxMacCFStringHolder(m_peer->GetData(kHIComboBoxEditTextPart,kControlEditTextCFStringTag)).AsString(); -#else - int sel = GetSelection (); - if (sel != wxNOT_FOUND) - return wxString(this->GetString((unsigned int)sel)); - else - return wxEmptyString; -#endif + wxFAIL_MSG("Method Not Implemented."); + return wxEmptyString; } void wxComboBox::SetString(unsigned int n, const wxString& s) { -#if USE_HICOMBOBOX - verify_noerr ( HIComboBoxInsertTextItemAtIndex( m_peer->GetControlRef(), (CFIndex) n, - wxMacCFStringHolder(s, GetFont().GetEncoding()) ) ); - verify_noerr ( HIComboBoxRemoveItemAtIndex( m_peer->GetControlRef(), (CFIndex) n + 1 ) ); -#else - m_choice->SetString( n , s ); -#endif + wxFAIL_MSG("Method Not Implemented."); } 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 + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::Redo() { -#if USE_HICOMBOBOX - // TODO -#else - if (m_text != NULL) - m_text->Redo(); -#endif + wxFAIL_MSG("Method Not Implemented."); } void wxComboBox::SelectAll() { -#if USE_HICOMBOBOX - // TODO -#else - if (m_text != NULL) - m_text->SelectAll(); -#endif + wxFAIL_MSG("Method Not Implemented."); } bool wxComboBox::CanCopy() const { -#if USE_HICOMBOBOX - // TODO + wxFAIL_MSG("Method Not Implemented."); return false; -#else - if (m_text != NULL) - return m_text->CanCopy(); - else - return false; -#endif } bool wxComboBox::CanCut() const { -#if USE_HICOMBOBOX - // TODO + wxFAIL_MSG("Method Not Implemented."); return false; -#else - if (m_text != NULL) - return m_text->CanCut(); - else - return false; -#endif } bool wxComboBox::CanPaste() const { -#if USE_HICOMBOBOX - // TODO + wxFAIL_MSG("Method Not Implemented."); return false; -#else - if (m_text != NULL) - return m_text->CanPaste(); - else - return false; -#endif } bool wxComboBox::CanUndo() const { -#if USE_HICOMBOBOX - // TODO + wxFAIL_MSG("Method Not Implemented."); return false; -#else - if (m_text != NULL) - return m_text->CanUndo(); - else - return false; -#endif } bool wxComboBox::CanRedo() const { -#if USE_HICOMBOBOX - // TODO + wxFAIL_MSG("Method Not Implemented."); return false; -#else - if (m_text != NULL) - return m_text->CanRedo(); - else - return false; -#endif +} + +void wxComboBox::EnableTextChangedEvents(bool enable) +{ + wxFAIL_MSG("Method Not Implemented."); +} + +void wxComboBox::WriteText(const wxString& text) +{ + wxFAIL_MSG("Method Not Implemented."); +} + +wxString wxComboBox::DoGetValue() const +{ + wxFAIL_MSG("Method Not Implemented."); + return wxEmptyString; +} + +wxClientDataType wxComboBox::GetClientDataType() const +{ + wxFAIL_MSG("Method Not Implemented."); + return wxClientData_None; +} + +void wxComboBox::SetClientDataType(wxClientDataType clientDataItemsType) +{ + wxFAIL_MSG("Method Not Implemented."); } bool wxComboBox::OSXHandleClicked( double timestampsec ) @@ -625,4 +319,4 @@ bool wxComboBox::OSXHandleClicked( double timestampsec ) return true; } -#endif +#endif // wxUSE_COMBOBOX && defined(wxOSX_USE_NATIVE_COMBOBOX) -- 2.49.0