X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..0f85d5e799ce87db7a5a5291bb258ee22e4ff256:/src/mac/classic/listbox.cpp diff --git a/src/mac/classic/listbox.cpp b/src/mac/classic/listbox.cpp index 8322a7a2f2..125b84b682 100644 --- a/src/mac/classic/listbox.cpp +++ b/src/mac/classic/listbox.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: listbox.cpp +// Name: src/mac/classic/listbox.cpp // Purpose: wxListBox // Author: Stefan Csomor // Modified by: @@ -9,10 +9,6 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "listbox.h" -#endif - #include "wx/app.h" #include "wx/listbox.h" #include "wx/button.h" @@ -23,14 +19,12 @@ #include "wx/utils.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) BEGIN_EVENT_TABLE(wxListBox, wxControl) EVT_SIZE( wxListBox::OnSize ) EVT_CHAR( wxListBox::OnChar ) END_EVENT_TABLE() -#endif #include "wx/mac/uma.h" @@ -76,7 +70,7 @@ static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect list = (wxListBox*) GetControlReference( (ControlHandle) GetListRefCon(listHandle) ); if ( list == NULL ) return ; - + GrafPtr savePort; GrafPtr grafPtr; RgnHandle savedClipRegion; @@ -85,29 +79,29 @@ static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect SetPort((**listHandle).port); grafPtr = (**listHandle).port ; // typecast our refCon - + // Calculate the cell rect. - + switch( message ) { case lInitMsg: break; - + case lCloseMsg: break; - + case lDrawMsg: { const wxString linetext = list->m_stringArray[cell.v] ; - + // Save the current clip region, and set the clip region to the area we are about // to draw. - + savedClipRegion = NewRgn(); GetClip( savedClipRegion ); - + ClipRect( drawRect ); EraseRect( drawRect ); - + const wxFont& font = list->GetFont(); if ( font.Ok() ) { @@ -121,50 +115,50 @@ static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect ::TextSize( 9 ); ::TextFace( 0 ) ; } - + #if TARGET_CARBON - { - Rect frame = { drawRect->top, drawRect->left + 4, - drawRect->top + kwxMacListItemHeight, drawRect->right + 10000 } ; - CFMutableStringRef mString = CFStringCreateMutableCopy( NULL , 0 , wxMacCFStringHolder(linetext , list->GetFont().GetEncoding()) ) ; - ::TruncateThemeText( mString , kThemeCurrentPortFont, kThemeStateActive, drawRect->right - drawRect->left , truncEnd , NULL ) ; - ::DrawThemeTextBox( mString, - kThemeCurrentPortFont, - kThemeStateActive, - false, - &frame, - teJustLeft, - nil ); - CFRelease( mString ) ; - } + { + Rect frame = { drawRect->top, drawRect->left + 4, + drawRect->top + kwxMacListItemHeight, drawRect->right + 10000 } ; + CFMutableStringRef mString = CFStringCreateMutableCopy( NULL , 0 , wxMacCFStringHolder(linetext , list->GetFont().GetEncoding()) ) ; + ::TruncateThemeText( mString , kThemeCurrentPortFont, kThemeStateActive, drawRect->right - drawRect->left , truncEnd , NULL ) ; + ::DrawThemeTextBox( mString, + kThemeCurrentPortFont, + kThemeStateActive, + false, + &frame, + teJustLeft, + nil ); + CFRelease( mString ) ; + } #else - { - wxCharBuffer text = linetext.mb_str( wxConvLocal) ; + { + wxCharBuffer text = linetext.mb_str( wxConvLocal) ; MoveTo(drawRect->left + 4 , drawRect->top + 10 ); DrawText(text, 0 , strlen(text) ); } -#endif +#endif // If the cell is hilited, do the hilite now. Paint the cell contents with the // appropriate QuickDraw transform mode. - + if( isSelected ) { savedPenMode = GetPortPenMode( (CGrafPtr) grafPtr ); SetPortPenMode( (CGrafPtr)grafPtr, hilitetransfermode ); PaintRect( drawRect ); SetPortPenMode( (CGrafPtr)grafPtr, savedPenMode ); } - + // Restore the saved clip region. - + SetClip( savedClipRegion ); DisposeRgn( savedClipRegion ); } break; case lHiliteMsg: - + // Hilite or unhilite the cell. Paint the cell contents with the // appropriate QuickDraw transform mode. - + GetPort( &grafPtr ); savedPenMode = GetPortPenMode( (CGrafPtr)grafPtr ); SetPortPenMode( (CGrafPtr)grafPtr, hilitetransfermode ); @@ -226,9 +220,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, Rect bounds ; Str255 title ; - + MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, validator , name , &bounds , title ) ; - + ListDefSpec listDef; listDef.defType = kListDefUserProcType; if ( macListDefUPP == NULL ) @@ -236,7 +230,7 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, macListDefUPP = NewListDefUPP( wxMacListDefinition ); } listDef.u.userProc = macListDefUPP ; - + Str255 fontName ; SInt16 fontSize ; Style fontStyle ; @@ -246,7 +240,7 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, GetFontName( kFontIDMonaco , fontName ) ; fontSize = 9 ; fontStyle = normal ; -#endif +#endif SetFont( wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , wxMacMakeStringFromPascal( fontName ) ) ) ; #if TARGET_CARBON Size asize; @@ -265,8 +259,8 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, long result ; wxStAppResource resload ; - m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , - (style & wxLB_HSCROLL) ? kwxMacListWithVerticalAndHorizontalScrollbar : kwxMacListWithVerticalScrollbar , + m_macControl = (WXWidget) ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , + (style & wxLB_HSCROLL) ? kwxMacListWithVerticalAndHorizontalScrollbar : kwxMacListWithVerticalScrollbar , 0 , 0, kControlListBoxProc , (long) this ) ; ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxListHandleTag , sizeof( ListHandle ) , (char*) &m_macList , &result ) ; @@ -401,6 +395,8 @@ void wxListBox::Delete(int N) int wxListBox::DoAppend(const wxString& item) { + InvalidateBestSize(); + int index = m_noItems ; m_stringArray.Add( item ) ; m_dataArray.Add( NULL ); @@ -416,7 +412,7 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) MacSetRedraw( false ) ; Clear() ; int n = choices.GetCount(); - + for( int i = 0 ; i < n ; ++i ) { if ( clientData ) @@ -431,7 +427,7 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) else Append( choices[i] ) ; } - + #if wxUSE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { // first delete old items @@ -441,7 +437,7 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) m_aItems[ui] = NULL; } m_aItems.Empty(); - + // then create new ones for ( ui = 0; ui < (size_t)m_noItems; ui++ ) { wxOwnerDrawn *pNewItem = CreateItem(ui); @@ -458,21 +454,20 @@ bool wxListBox::HasMultipleSelection() const return (m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED); } -int wxListBox::FindString(const wxString& s) const +int wxListBox::FindString(const wxString& s, bool bCase) const { - if ( s.Right(1) == wxT("*") ) { wxString search = s.Left( s.Length() - 1 ) ; int len = search.Length() ; Str255 s1 , s2 ; wxMacStringToPascal( search , s2 ) ; - + for ( int i = 0 ; i < m_noItems ; ++ i ) { - wxMacStringToPascal( m_stringArray[i].Left( len ) , s1 ) ; + wxMacStringToPascal( m_stringArray[i].Left( len ) , s1 ) ; - if ( EqualString( s1 , s2 , false , false ) ) + if ( EqualString( s1 , s2 , bCase , false ) ) return i ; } if ( s.Left(1) == wxT("*") && s.Length() > 1 ) @@ -485,23 +480,24 @@ int wxListBox::FindString(const wxString& s) const return i ; } } - + } else { Str255 s1 , s2 ; - + wxMacStringToPascal( s , s2 ) ; - + for ( int i = 0 ; i < m_noItems ; ++ i ) { - wxMacStringToPascal( m_stringArray[i] , s1 ) ; + wxMacStringToPascal( m_stringArray[i] , s1 ) ; - if ( EqualString( s1 , s2 , false , false ) ) + if ( EqualString( s1 , s2 , bCase , false ) ) return i ; } } - return -1; + + return wxNOT_FOUND; } void wxListBox::Clear() @@ -513,7 +509,7 @@ void wxListBox::Clear() MacClear() ; } -void wxListBox::SetSelection(int N, bool select) +void wxListBox::DoSetSelection(int N, bool select) { wxCHECK_RET( N >= 0 && N < m_noItems, wxT("invalid index in wxListBox::SetSelection") ); @@ -525,7 +521,7 @@ bool wxListBox::IsSelected(int N) const { wxCHECK_MSG( N >= 0 && N < m_noItems, FALSE, wxT("invalid index in wxListBox::Selected") ); - + return MacIsSelected( N ) ; } @@ -533,7 +529,7 @@ void *wxListBox::DoGetItemClientData(int N) const { wxCHECK_MSG( N >= 0 && N < m_noItems, NULL, wxT("invalid index in wxListBox::GetClientData")); - + return (void *)m_dataArray[N]; } @@ -546,7 +542,7 @@ void wxListBox::DoSetItemClientData(int N, void *Client_data) { wxCHECK_RET( N >= 0 && N < m_noItems, wxT("invalid index in wxListBox::SetClientData") ); - + #if wxUSE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { @@ -556,7 +552,7 @@ void wxListBox::DoSetItemClientData(int N, void *Client_data) } #endif // wxUSE_OWNER_DRAWN wxASSERT_MSG( m_dataArray.GetCount() >= (size_t) N , wxT("invalid client_data array") ) ; - + if ( m_dataArray.GetCount() > (size_t) N ) { m_dataArray[N] = (char*) Client_data ; @@ -587,23 +583,25 @@ int wxListBox::GetSelection() const // Find string for position wxString wxListBox::GetString(int N) const { - return m_stringArray[N] ; + return m_stringArray[N] ; } void wxListBox::DoInsertItems(const wxArrayString& items, int pos) { wxCHECK_RET( pos >= 0 && pos <= m_noItems, wxT("invalid index in wxListBox::InsertItems") ); - + + InvalidateBestSize(); + int nItems = items.GetCount(); - + for ( int i = 0 ; i < nItems ; i++ ) { m_stringArray.Insert( items[i] , pos + i ) ; m_dataArray.Insert( NULL , pos + i ) ; MacInsert( pos + i , items[i] ) ; } - + m_noItems += nItems; } @@ -618,10 +616,10 @@ wxSize wxListBox::DoGetBestSize() const int lbWidth = 100; // some defaults int lbHeight = 110; int wLine; - + { - wxMacPortStateHelper st( UMAGetWindowPort( (WindowRef) MacGetRootWindow() ) ) ; - + wxMacPortStateHelper st( UMAGetWindowPort( (WindowRef) MacGetRootWindow() ) ) ; + if ( m_font.Ok() ) { ::TextFont( m_font.GetMacFontNum() ) ; @@ -634,7 +632,7 @@ wxSize wxListBox::DoGetBestSize() const ::TextSize( 9 ); ::TextFace( 0 ) ; } - + // Find the widest line for(int i = 0; i < GetCount(); i++) { wxString str(GetString(i)); @@ -653,15 +651,15 @@ wxSize wxListBox::DoGetBestSize() const #endif lbWidth = wxMax(lbWidth, wLine); } - + // Add room for the scrollbar lbWidth += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); - + // And just a bit more int cy = 12 ; int cx = ::TextWidth( "X" , 0 , 1 ) ; lbWidth += cx ; - + // don't make the listbox too tall (limit height to around 10 items) but don't // make it too small neither lbHeight = (cy+4) * wxMin(wxMax(GetCount(), 3), 10); @@ -691,7 +689,7 @@ void wxListBox::Refresh(bool eraseBack, const wxRect *rect) class wxListBoxItem : public wxOwnerDrawn { public: - wxListBoxItem(const wxString& str = ""); + wxListBoxItem(const wxString& str = wxEmptyString); }; wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, FALSE) @@ -724,7 +722,7 @@ list = (wxListBox*)refCon; ::TextSize( 9 ); ::TextFace( 0 ) ; DrawText(text, 0 , text.Length()); - + } */ void wxListBox::MacDelete( int N ) @@ -767,7 +765,7 @@ void wxListBox::MacSetSelection( int n , bool select ) LSetSelect( false , cell , (ListHandle)m_macList ) ; } } - + cell.v = n ; LSetSelect( select , cell , (ListHandle)m_macList ) ; LAutoScroll( (ListHandle)m_macList ) ; @@ -798,12 +796,12 @@ int wxListBox::MacGetSelection() const int wxListBox::MacGetSelections( wxArrayInt& aSelections ) const { int no_sel = 0 ; - + aSelections.Empty(); - + Cell cell = { 0 , 0 } ; cell.v = 0 ; - + while ( LGetSelect( true , &cell ,(ListHandle) m_macList ) ) { aSelections.Add( cell.v ) ; @@ -831,7 +829,7 @@ void wxListBox::MacScrollTo( int n ) void wxListBox::OnSize( wxSizeEvent &event) { Point pt; - + #if TARGET_CARBON GetListCellSize((ListHandle)m_macList, &pt); #else @@ -845,7 +843,7 @@ void wxListBox::MacHandleControlClick( WXWidget control , wxInt16 controlpart , { Boolean wasDoubleClick = false ; long result ; - + ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick , &result ) ; if ( !wasDoubleClick ) { @@ -860,7 +858,6 @@ void wxListBox::MacHandleControlClick( WXWidget control , wxInt16 controlpart , void wxListBox::MacSetRedraw( bool doDraw ) { LSetDrawingMode( doDraw , (ListHandle)m_macList ) ; - } void wxListBox::MacDoClick() @@ -868,7 +865,7 @@ void wxListBox::MacDoClick() wxArrayInt aSelections; int n ; size_t count = GetSelections(aSelections); - + if ( count == m_selectionPreImage.GetCount() ) { bool hasChanged = false ; @@ -885,12 +882,12 @@ void wxListBox::MacDoClick() return ; } } - + m_selectionPreImage = aSelections; - + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); event.SetEventObject( this ); - + if ( count > 0 ) { n = aSelections[0]; @@ -904,9 +901,9 @@ void wxListBox::MacDoClick() { n = -1; } - - event.m_commandInt = n; - + + event.SetInt(n); + GetEventHandler()->ProcessEvent(event); } @@ -924,7 +921,7 @@ void wxListBox::OnChar(wxKeyEvent& event) wxWindow* parent = GetParent() ; while( parent && !parent->IsTopLevel() && parent->GetDefaultItem() == NULL ) parent = parent->GetParent() ; - + if ( parent && parent->GetDefaultItem() ) { wxButton *def = wxDynamicCast(parent->GetDefaultItem(), @@ -942,14 +939,14 @@ void wxListBox::OnChar(wxKeyEvent& event) /* generate wxID_CANCEL if command-. or has been pressed (typically in dialogs) */ else if (event.GetKeyCode() == WXK_ESCAPE || (event.GetKeyCode() == '.' && event.MetaDown() ) ) { - // FIXME: look in ancestors, not just parent. + // FIXME: look in ancestors, not just parent. wxWindow* win = GetParent()->FindWindow( wxID_CANCEL ) ; if (win) { - wxCommandEvent new_event(wxEVT_COMMAND_BUTTON_CLICKED,wxID_CANCEL); - new_event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( new_event ); - } + wxCommandEvent new_event(wxEVT_COMMAND_BUTTON_CLICKED,wxID_CANCEL); + new_event.SetEventObject( win ); + win->GetEventHandler()->ProcessEvent( new_event ); + } } else if ( event.GetKeyCode() == WXK_TAB ) { @@ -966,10 +963,10 @@ void wxListBox::OnChar(wxKeyEvent& event) { // perform the default key handling first wxControl::OnKeyDown( event ) ; - + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); event.SetEventObject( this ); - + wxArrayInt aSelections; int n, count = GetSelections(aSelections); if ( count > 0 ) @@ -985,9 +982,9 @@ void wxListBox::OnChar(wxKeyEvent& event) { n = -1; } - - event.m_commandInt = n; - + + event.SetInt(n); + GetEventHandler()->ProcessEvent(event); } else @@ -1006,18 +1003,17 @@ void wxListBox::OnChar(wxKeyEvent& event) SetSelection(line) ; wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); event.SetEventObject( this ); - + if ( HasClientObjectData() ) event.SetClientObject( GetClientObject( line ) ); else if ( HasClientUntypedData() ) event.SetClientData( GetClientData(line) ); event.SetString( GetString(line) ); - - event.m_commandInt = line ; - + + event.SetInt(line); + GetEventHandler()->ProcessEvent(event); } } } } -