X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8208e181cb576ec6cda37624923f95a59af43072..f21b2fd89d02837dfd0d195f8ff0f3f5640af017:/src/mac/carbon/listbox.cpp diff --git a/src/mac/carbon/listbox.cpp b/src/mac/carbon/listbox.cpp index c518ad035c..05cc0e249a 100644 --- a/src/mac/carbon/listbox.cpp +++ b/src/mac/carbon/listbox.cpp @@ -13,19 +13,26 @@ #pragma implementation "listbox.h" #endif +#include "wx/app.h" #include "wx/listbox.h" #include "wx/settings.h" #include "wx/dynarray.h" #include "wx/log.h" #include "wx/utils.h" -#include "extldef.h" +#ifdef __UNIX__ + #include "ldef/extldef.h" +#else + #include "extldef.h" +#endif +#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) BEGIN_EVENT_TABLE(wxListBox, wxControl) EVT_SIZE( wxListBox::OnSize ) END_EVENT_TABLE() +#endif #include @@ -41,6 +48,7 @@ wxListBox::wxListBox() { m_noItems = 0; m_selected = 0; + m_macList = NULL ; } bool wxListBox::Create(wxWindow *parent, wxWindowID id, @@ -56,17 +64,16 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, Rect bounds ; Str255 title ; - m_macHorizontalBorder = 5 ; // additional pixels around the real control - m_macVerticalBorder = 5 ; MacPreControlCreate( parent , id , "" , pos , size ,style, validator , name , &bounds , title ) ; - m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , kwxMacListWithVerticalScrollbar , 0 , 0, + m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , false , kwxMacListWithVerticalScrollbar , 0 , 0, kControlListBoxProc , (long) this ) ; long result ; UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag , sizeof( ListHandle ) , (char*) &m_macList , &result ) ; + HLock( (Handle) m_macList ) ; NewExtLDEFInfo( m_macList , MacDrawStringCell , (long) this ) ; (**m_macList).selFlags = 0 ; if ( style & wxLB_MULTIPLE ) @@ -109,7 +116,11 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, wxListBox::~wxListBox() { Free() ; - DisposeExtLDEFInfo( m_macList ) ; + if ( m_macList ) + { + DisposeExtLDEFInfo( m_macList ) ; + m_macList = NULL ; + } } void wxListBox::Free() @@ -156,7 +167,7 @@ void wxListBox::Delete(int N) #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN m_stringArray.Remove( N ) ; m_dataArray.Remove( N ) ; - m_noItems --; + m_noItems --; MacDelete( N ) ; } @@ -167,10 +178,14 @@ int wxListBox::DoAppend(const wxString& item) if( wxApp::s_macDefaultEncodingIsPC ) { m_stringArray.Add( wxMacMakeMacStringFromPC( item ) ) ; + m_dataArray.Add( NULL ); } - else + else { m_stringArray.Add( item ) ; + m_dataArray.Add( NULL ); + } m_noItems ++; + DoSetItemClientData( index , NULL ) ; MacAppend( item ) ; return index ; @@ -236,19 +251,59 @@ int wxListBox::FindString(const wxString& st) const { wxString search = s.Left( s.Length() - 1 ) ; int len = search.Length() ; - for ( int i = 0 ; i < m_noItems ; ++ i ) - { - if ( equalstring( m_stringArray[i].Left( len ) , search , false , false ) ) - return i ; - } + Str255 s1 , s2 ; + +#if TARGET_CARBON + c2pstrcpy( (StringPtr) s2 , search.c_str() ) ; +#else + strcpy( (char *) s2 , search.c_str() ) ; + c2pstr( (char *) s2 ) ; +#endif + + for ( int i = 0 ; i < m_noItems ; ++ i ) + { +#if TARGET_CARBON + c2pstrcpy( (StringPtr) s1 , m_stringArray[i].Left( len ).c_str() ) ; +#else + strcpy( (char *) s1 , m_stringArray[i].Left( len ).c_str() ) ; + c2pstr( (char *) s1 ) ; +#endif + if ( EqualString( s1 , s2 , false , false ) ) + return i ; + } + if ( s.Left(1) = "*" && s.Length() > 1 ) + { + s.MakeLower() ; + for ( int i = 0 ; i < m_noItems ; ++i ) + { + if ( GetString(i).Lower().Matches(s) ) + return i ; + } + } + } else { - for ( int i = 0 ; i < m_noItems ; ++ i ) - { - if ( equalstring( m_stringArray[i] , s , false , false ) ) - return i ; - } + Str255 s1 , s2 ; + +#if TARGET_CARBON + c2pstrcpy( (StringPtr) s2 , s.c_str() ) ; +#else + strcpy( (char *) s2 , s.c_str() ) ; + c2pstr( (char *) s2 ) ; +#endif + + for ( int i = 0 ; i < m_noItems ; ++ i ) + { +#if TARGET_CARBON + c2pstrcpy( (StringPtr) s1 , m_stringArray[i].c_str() ) ; +#else + strcpy( (char *) s1 , m_stringArray[i].c_str() ) ; + c2pstr( (char *) s1 ) ; +#endif + if ( EqualString( s1 , s2 , false , false ) ) + return i ; + } } return -1; } @@ -308,7 +363,7 @@ void wxListBox::DoSetItemClientData(int N, void *Client_data) if ( m_dataArray.GetCount() > N ) { m_dataArray[N] = (char*) Client_data ; - } + } else { m_dataArray.Add( (char*) Client_data ) ; @@ -379,7 +434,14 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos) void wxListBox::SetString(int N, const wxString& s) { - m_stringArray[N] = s ; + wxString str ; + if( wxApp::s_macDefaultEncodingIsPC ) + { + str = wxMacMakeMacStringFromPC( s ) ; + } + else + str = s ; + m_stringArray[N] = str ; MacSet( N , s ) ; } @@ -443,7 +505,6 @@ void wxListBox::MacDelete( int N ) { ListHandle list ; long result ; - Cell cell = { 0 , 0 } ; UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag , sizeof( ListHandle ) , (char*) &list , &result ) ; LDelRow( 1 , N , list ) ; } @@ -539,7 +600,7 @@ void wxListBox::MacScrollTo( int n ) void wxListBox::OnSize( const wxSizeEvent &event) { Point pt = (**m_macList).cellSize ; - pt.h = m_width - 15 /* scrollbar */ - m_macHorizontalBorder * 2 ; + pt.h = m_width - 15 ; LCellSize( pt , m_macList ) ; }