X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e75491071dbefcada61175e3eb89ce4edf335983..61cca9d24ee3f935f2581e3cfb894e46181290e6:/src/mac/carbon/listbox.cpp?ds=sidebyside diff --git a/src/mac/carbon/listbox.cpp b/src/mac/carbon/listbox.cpp index 3b9c54ce77..1ed703e186 100644 --- a/src/mac/carbon/listbox.cpp +++ b/src/mac/carbon/listbox.cpp @@ -13,13 +13,18 @@ #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) @@ -43,6 +48,7 @@ wxListBox::wxListBox() { m_noItems = 0; m_selected = 0; + m_macList = NULL ; } bool wxListBox::Create(wxWindow *parent, wxWindowID id, @@ -58,8 +64,6 @@ 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 ) ; @@ -69,9 +73,10 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, 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 = lOnlyOne ; - if ( style & wxLB_MULTIPLE ) + (**m_macList).selFlags = 0 ; + if ( style & wxLB_MULTIPLE ) { (**m_macList).selFlags += lNoExtend ; } @@ -79,6 +84,10 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, { (**m_macList).selFlags += lExtendDrag ; } + else + { + (**m_macList).selFlags = lOnlyOne ; + } Point pt = (**m_macList).cellSize ; pt.v = 14 ; LCellSize( pt , m_macList ) ; @@ -107,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() @@ -153,10 +166,10 @@ void wxListBox::Delete(int N) } #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN m_stringArray.Remove( N ) ; - m_noItems --; + m_dataArray.Remove( N ) ; + m_noItems --; MacDelete( N ) ; - SetHorizontalExtent(""); } int wxListBox::DoAppend(const wxString& item) @@ -165,14 +178,16 @@ 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 ) ; - SetHorizontalExtent(item); - return index ; } @@ -190,7 +205,7 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) wxASSERT_MSG(clientData[i] == NULL, wxT("Can't use client data with owner-drawn listboxes")); #else // !wxUSE_OWNER_DRAWN - Append( choices[i] , clientData[0] ) ; + Append( choices[i] , clientData[i] ) ; #endif } else @@ -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; } @@ -260,7 +315,6 @@ void wxListBox::Clear() m_stringArray.Empty() ; m_dataArray.Empty() ; MacClear() ; - SetHorizontalExtent(); } void wxListBox::SetSelection(int N, bool select) @@ -286,6 +340,11 @@ void *wxListBox::DoGetItemClientData(int N) const return (void *)m_dataArray[N]; } +wxClientData *wxListBox::DoGetItemClientObject(int N) const +{ + return (wxClientData *) DoGetItemClientData( N ) ; +} + void wxListBox::DoSetItemClientData(int N, void *Client_data) { wxCHECK_RET( N >= 0 && N < m_noItems, @@ -299,7 +358,16 @@ void wxListBox::DoSetItemClientData(int N, void *Client_data) wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes")); } #endif // wxUSE_OWNER_DRAWN - m_dataArray[N] = (char*) Client_data ; + wxASSERT_MSG( m_dataArray.GetCount() >= N , "invalid client_data array" ) ; + + if ( m_dataArray.GetCount() > N ) + { + m_dataArray[N] = (char*) Client_data ; + } + else + { + m_dataArray.Add( (char*) Client_data ) ; + } } void wxListBox::DoSetItemClientObject(int n, wxClientData* clientData) @@ -366,15 +434,53 @@ 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 ) ; } -wxSize wxListBox::DoGetBestSize() +wxSize wxListBox::DoGetBestSize() const { return wxSize(100, 100); } +int wxListBox::GetCount() const +{ + return m_noItems; +} + +void wxListBox::SetupColours() +{ + SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW)); + SetForegroundColour(GetParent()->GetForegroundColour()); +} + +#if wxUSE_OWNER_DRAWN + +class wxListBoxItem : public wxOwnerDrawn +{ +public: + wxListBoxItem(const wxString& str = ""); +}; + +wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, FALSE) +{ + // no bitmaps/checkmarks + SetMarginWidth(0); +} + +wxOwnerDrawn *wxListBox::CreateItem(size_t n) +{ + return new wxListBoxItem(); +} + +#endif //USE_OWNER_DRAWN // ============================================================================ // list box control implementation @@ -399,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 ) ; } @@ -495,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 ) ; } @@ -530,8 +635,8 @@ void wxListBox::MacDoClick() int n, count = GetSelections(aSelections); if ( count > 0 ) { - event.m_commandInt = aSelections[0] ; - if ( HasClientObjectData() ) + n = aSelections[0]; + if ( HasClientObjectData() ) event.SetClientObject( GetClientObject(n) ); else if ( HasClientUntypedData() ) event.SetClientData( GetClientData(n) );