X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fcb35beb942ced9d2552b5ab5b4fe0df8e6df93a..1189618f7adcb02b44e6ce5e92b0fe5ba173a4aa:/src/mac/carbon/listbox.cpp diff --git a/src/mac/carbon/listbox.cpp b/src/mac/carbon/listbox.cpp index fe39a0a19f..4fe7f3e815 100644 --- a/src/mac/carbon/listbox.cpp +++ b/src/mac/carbon/listbox.cpp @@ -27,172 +27,132 @@ IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) BEGIN_EVENT_TABLE(wxListBox, wxControl) +#if !__WXMAC_OSX__ EVT_SIZE( wxListBox::OnSize ) EVT_CHAR( wxListBox::OnChar ) +#endif END_EVENT_TABLE() #endif #include "wx/mac/uma.h" -#if PRAGMA_STRUCT_ALIGN - #pragma options align=mac68k -#elif PRAGMA_STRUCT_PACKPUSH - #pragma pack(push, 2) -#elif PRAGMA_STRUCT_PACK - #pragma pack(2) -#endif +const short kTextColumnId = 1024 ; -typedef struct { - unsigned short instruction; - void (*function)(); -} ldefRec, *ldefPtr, **ldefHandle; - -#if PRAGMA_STRUCT_ALIGN - #pragma options align=reset -#elif PRAGMA_STRUCT_PACKPUSH - #pragma pack(pop) -#elif PRAGMA_STRUCT_PACK - #pragma pack() -#endif +// new databrowserbased version -#if TARGET_CARBON -const short kwxMacListItemHeight = 19 ; -#else -const short kwxMacListItemHeight = 14 ; -#endif +// Listbox item +wxListBox::wxListBox() +{ + m_noItems = 0; + m_selected = 0; + m_macList = NULL ; +} -extern "C" +bool wxListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) { -static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect, - Cell cell, short dataOffset, short dataLength, - ListHandle listHandle ) ; + wxCArrayString chs(choices); + + return Create(parent, id, pos, size, chs.GetCount(), chs.GetStrings(), + style, validator, name); } -static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect, - Cell cell, short dataOffset, short dataLength, - ListHandle listHandle ) +#if TARGET_API_MAC_OSX +static pascal void DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, + DataBrowserItemNotification message, DataBrowserItemDataRef itemData) +#else +static pascal void DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, + DataBrowserItemNotification message) +#endif { - GrafPtr savePort; - GrafPtr grafPtr; - RgnHandle savedClipRegion; - SInt32 savedPenMode; - wxListBox* list; - GetPort(&savePort); - SetPort((**listHandle).port); - grafPtr = (**listHandle).port ; - // typecast our refCon - list = (wxListBox*) GetControlReference( (ControlHandle) GetListRefCon(listHandle) ); - - // 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() ) - { - ::TextFont( font.GetMacFontNum() ) ; - ::TextSize( font.GetMacFontSize() ) ; - ::TextFace( font.GetMacFontStyle() ) ; - } - else + long ref = GetControlReference( browser ) ; + if ( ref ) + { + wxListBox* list = wxDynamicCast( (wxObject*) ref , wxListBox ) ; + for ( size_t i = 0 ; i < list->m_idArray.GetCount() ; ++i ) + if ( list->m_idArray[i] == (long) itemID ) { - ::TextFont( kFontIDMonaco ) ; - ::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) ) ; - ::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) ; - MoveTo(drawRect->left + 4 , drawRect->top + 10 ); - DrawText(text, 0 , strlen(text) ); - } -#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 ); + bool trigger = false ; + wxCommandEvent event( + wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() ); + switch( message ) + { + case kDataBrowserItemDeselected : + if ( list->HasMultipleSelection() ) + trigger = true ; + break ; + case kDataBrowserItemSelected : + trigger = true ; + break ; + case kDataBrowserItemDoubleClicked : + event.SetEventType(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED) ; + trigger = true ; + break ; + default : + break ; + } + if ( trigger ) + { + event.SetEventObject( list ); + if ( list->HasClientObjectData() ) + event.SetClientObject( list->GetClientObject(i) ); + else if ( list->HasClientUntypedData() ) + event.SetClientData( list->GetClientData(i) ); + event.SetString( list->GetString(i) ); + event.SetInt(i) ; + event.SetExtraLong( list->HasMultipleSelection() ? message == kDataBrowserItemSelected : TRUE ); + wxPostEvent( list->GetEventHandler() , event ) ; + // direct notification is not always having the listbox GetSelection() having in synch with event + // list->GetEventHandler()->ProcessEvent(event) ; + } + break ; } - - // 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 ); - PaintRect( drawRect ); - SetPortPenMode( (CGrafPtr)grafPtr, savedPenMode ); - break; - default : - break ; } - SetPort(savePort); } -extern "C" void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) ; -// resources ldef ids -const short kwxMacListWithVerticalScrollbar = 128 ; -const short kwxMacListWithVerticalAndHorizontalScrollbar = 129 ; -// ============================================================================ -// list box control implementation -// ============================================================================ - -// Listbox item -wxListBox::wxListBox() -{ - m_noItems = 0; - m_selected = 0; - m_macList = NULL ; +static pascal OSStatus ListBoxGetSetItemData(ControlRef browser, + DataBrowserItemID itemID, DataBrowserPropertyID property, + DataBrowserItemDataRef itemData, Boolean changeValue) +{ + OSStatus err = errDataBrowserPropertyNotSupported; + + if ( ! changeValue ) + { + switch (property) + { + + case kTextColumnId: + { + long ref = GetControlReference( browser ) ; + if ( ref ) + { + wxListBox* list = wxDynamicCast( (wxObject*) ref , wxListBox ) ; + for ( size_t i = 0 ; i < list->m_idArray.GetCount() ; ++i ) + if ( list->m_idArray[i] == (long) itemID ) + { + wxMacCFStringHolder cf( list->GetString(i) , list->GetFont().GetEncoding() ) ; + verify_noerr( ::SetDataBrowserItemDataText( itemData , cf ) ) ; + err = noErr ; + break ; + } + } + } + break; + + default: + + break; + } + } + + return err; } - -static ListDefUPP macListDefUPP = NULL ; - bool wxListBox::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, @@ -201,110 +161,106 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { + m_macIsUserPane = FALSE ; + + wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED), + _T("only one of listbox selection modes can be specified") ); + if ( !wxListBoxBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) ) return false; m_noItems = 0 ; // this will be increased by our append command m_selected = 0; - - Rect bounds ; - Str255 title ; + m_nextId = 1 ; - MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, validator , name , &bounds , title ) ; - - ListDefSpec listDef; - listDef.defType = kListDefUserProcType; - if ( macListDefUPP == NULL ) - { - macListDefUPP = NewListDefUPP( wxMacListDefinition ); - } - listDef.u.userProc = macListDefUPP ; - - Str255 fontName ; - SInt16 fontSize ; - Style fontStyle ; -#if TARGET_CARBON - GetThemeFont(kThemeViewsFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; -#else - GetFontName( kFontIDMonaco , fontName ) ; - fontSize = 9 ; - fontStyle = normal ; -#endif - SetFont( wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , wxMacMakeStringFromPascal( fontName ) ) ) ; -#if TARGET_CARBON - Size asize; - - - CreateListBoxControl( MAC_WXHWND(parent->MacGetRootWindow()), &bounds, false, 0, 1, (style & wxLB_HSCROLL), true, - kwxMacListItemHeight, kwxMacListItemHeight, false, &listDef, (ControlRef *)&m_macControl ); - - GetControlData( (ControlHandle) m_macControl, kControlNoPart, kControlListBoxListHandleTag, - sizeof(ListHandle), (Ptr) &m_macList, &asize); - SetControlReference( (ControlHandle) m_macControl, (long) this); - SetControlVisibility( (ControlHandle) m_macControl, false, false); + Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ; -#else - - long result ; - wxStAppResource resload ; - m_macControl = ::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 ) ; - - HLock( (Handle) m_macList ) ; - ldefHandle ldef ; - ldef = (ldefHandle) NewHandle( sizeof(ldefRec) ) ; - if ( (**(ListHandle)m_macList).listDefProc != NULL ) - { - (**ldef).instruction = 0x4EF9; /* JMP instruction */ - (**ldef).function = (void(*)()) listDef.u.userProc; - (**(ListHandle)m_macList).listDefProc = (Handle) ldef ; - } + m_peer = new wxMacControl() ; + verify_noerr( ::CreateDataBrowserControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, kDataBrowserListView , *m_peer ) ); - Point pt = (**(ListHandle)m_macList).cellSize ; - pt.v = kwxMacListItemHeight ; - LCellSize( pt , (ListHandle)m_macList ) ; - LAddColumn( 1 , 0 , (ListHandle)m_macList ) ; -#endif - OptionBits options = 0; + DataBrowserSelectionFlags options = kDataBrowserDragSelect ; if ( style & wxLB_MULTIPLE ) { - options += lNoExtend ; + options += kDataBrowserAlwaysExtendSelection + kDataBrowserCmdTogglesSelection ; } else if ( style & wxLB_EXTENDED ) { - options += lExtendDrag ; + // default behaviour } else { - options = (OptionBits) lOnlyOne ; - } - SetListSelectionFlags((ListHandle)m_macList, options); + options += kDataBrowserSelectOnlyOne ; + } + verify_noerr(SetDataBrowserSelectionFlags (*m_peer, options ) ); + + DataBrowserListViewColumnDesc columnDesc ; + columnDesc.headerBtnDesc.titleOffset = 0; + columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc; + + columnDesc.headerBtnDesc.btnFontStyle.flags = + kControlUseFontMask | kControlUseJustMask; + + columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent; + columnDesc.propertyDesc.propertyType = kDataBrowserTextType; + columnDesc.headerBtnDesc.btnFontStyle.just = teFlushDefault; + columnDesc.headerBtnDesc.minimumWidth = 0; + columnDesc.headerBtnDesc.maximumWidth = 10000; + + columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont; + columnDesc.headerBtnDesc.btnFontStyle.style = normal; + columnDesc.headerBtnDesc.titleString = NULL ; // CFSTR( "" ); + + columnDesc.propertyDesc.propertyID = kTextColumnId; + columnDesc.propertyDesc.propertyType = kDataBrowserTextType; + columnDesc.propertyDesc.propertyFlags = +#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 + kDataBrowserListViewTypeSelectColumn | +#endif + kDataBrowserTableViewSelectionColumn ; + + + verify_noerr(::AddDataBrowserListViewColumn(*m_peer, &columnDesc, kDataBrowserListViewAppendColumn) ) ; + verify_noerr(::AutoSizeDataBrowserListViewColumns( *m_peer ) ) ; + verify_noerr(::SetDataBrowserHasScrollBars( *m_peer , false , true ) ) ; + verify_noerr(::SetDataBrowserTableViewHiliteStyle( *m_peer, kDataBrowserTableViewFillHilite ) ) ; + verify_noerr(::SetDataBrowserListViewHeaderBtnHeight( *m_peer , 0 ) ) ; + DataBrowserCallbacks callbacks ; + + callbacks.version = kDataBrowserLatestCallbacks; + + InitDataBrowserCallbacks(&callbacks); + + callbacks.u.v1.itemDataCallback = + NewDataBrowserItemDataUPP(ListBoxGetSetItemData); + + callbacks.u.v1.itemNotificationCallback = +#if TARGET_API_MAC_OSX + (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc) ; +#else + NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc) ; +#endif + SetDataBrowserCallbacks(*m_peer, &callbacks); + + MacPostControlCreate(pos,size) ; for ( int i = 0 ; i < n ; i++ ) { Append( choices[i] ) ; } - MacPostControlCreate() ; - - LSetDrawingMode( true , (ListHandle)m_macList ) ; - + SetBestSize(size); // Needed because it is a wxControlWithItems + return TRUE; } wxListBox::~wxListBox() { + SetControlReference( *m_peer , NULL ) ; FreeData() ; + // avoid access during destruction if ( m_macList ) { -#if !TARGET_CARBON - DisposeHandle( (**(ListHandle)m_macList).listDefProc ) ; - (**(ListHandle)m_macList).listDefProc = NULL ; -#endif m_macList = NULL ; } } @@ -338,22 +294,8 @@ void wxListBox::DoSetSize(int x, int y, int sizeFlags ) { wxControl::DoSetSize( x , y , width , height , sizeFlags ) ; -#if TARGET_CARBON - Rect bounds ; - GetControlBounds( (ControlHandle) m_macControl , &bounds ) ; - ControlRef control = GetListVerticalScrollBar( (ListHandle)m_macList ) ; - if ( control ) - { - Rect scrollbounds ; - GetControlBounds( control , &scrollbounds ) ; - if( scrollbounds.right != bounds.right + 1 ) - { - UMAMoveControl( control , bounds.right - (scrollbounds.right - scrollbounds.left) + 1 , - scrollbounds.top ) ; - } - } -#endif } + void wxListBox::DoSetFirstItem(int N) { MacScrollTo( N ) ; @@ -382,6 +324,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 ); @@ -394,7 +338,6 @@ int wxListBox::DoAppend(const wxString& item) void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) { - MacSetRedraw( false ) ; Clear() ; int n = choices.GetCount(); @@ -431,12 +374,6 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) } } #endif // wxUSE_OWNER_DRAWN - MacSetRedraw( true ) ; -} - -bool wxListBox::HasMultipleSelection() const -{ - return (m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED); } int wxListBox::FindString(const wxString& s) const @@ -576,6 +513,8 @@ 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++ ) @@ -599,15 +538,15 @@ wxSize wxListBox::DoGetBestSize() const int lbWidth = 100; // some defaults int lbHeight = 110; int wLine; - + { - wxMacPortStateHelper st( UMAGetWindowPort( (WindowRef) MacGetRootWindow() ) ) ; + wxMacPortStateHelper st( UMAGetWindowPort( (WindowRef) MacGetTopLevelWindowRef() ) ) ; if ( m_font.Ok() ) { - ::TextFont( m_font.GetMacFontNum() ) ; - ::TextSize( m_font.GetMacFontSize() ) ; - ::TextFace( m_font.GetMacFontStyle() ) ; + ::TextFont( m_font.MacGetFontNum() ) ; + ::TextSize( m_font.MacGetFontSize() ) ; + ::TextFace( m_font.MacGetFontStyle() ) ; } else { @@ -622,7 +561,7 @@ wxSize wxListBox::DoGetBestSize() const #if wxUSE_UNICODE Point bounds={0,0} ; SInt16 baseline ; - ::GetThemeTextDimensions( wxMacCFStringHolder( str ) , + ::GetThemeTextDimensions( wxMacCFStringHolder( str , m_font.GetEncoding() ) , kThemeCurrentPortFont, kThemeStateActive, false, @@ -647,6 +586,7 @@ wxSize wxListBox::DoGetBestSize() const // make it too small neither lbHeight = (cy+4) * wxMin(wxMax(GetCount(), 3), 10); } + return wxSize(lbWidth, lbHeight); } @@ -655,12 +595,6 @@ int wxListBox::GetCount() const return m_noItems; } -void wxListBox::SetupColours() -{ - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - SetForegroundColour(GetParent()->GetForegroundColour()); -} - void wxListBox::Refresh(bool eraseBack, const wxRect *rect) { wxControl::Refresh( eraseBack , rect ) ; @@ -692,87 +626,66 @@ wxOwnerDrawn *wxListBox::CreateItem(size_t n) // list box control implementation // ============================================================================ -/* -void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) -{ -wxListBox* list; -// typecast our refCon -list = (wxListBox*)refCon; - - MoveTo(cellRect->left + 4 , cellRect->top + 10 ); - const wxString text = list->m_stringArray[lCell.v] ; - ::TextFont( kFontIDMonaco ) ; - ::TextSize( 9 ); - ::TextFace( 0 ) ; - DrawText(text, 0 , text.Length()); - - } -*/ void wxListBox::MacDelete( int N ) { - LDelRow( 1 , N , (ListHandle)m_macList) ; - Refresh(); + UInt32 id = m_idArray[N] ; + verify_noerr(::RemoveDataBrowserItems(*m_peer , kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) ) ; + m_idArray.RemoveAt( N ) ; } void wxListBox::MacInsert( int n , const wxString& text) { - Cell cell = { 0 , 0 } ; - cell.v = n ; - LAddRow( 1 , cell.v , (ListHandle)m_macList ) ; - // LSetCell(text, strlen(text), cell, m_macList); - Refresh(); + verify_noerr(::AddDataBrowserItems( *m_peer , kDataBrowserNoItem , 1 , (UInt32*) &m_nextId , kDataBrowserItemNoProperty ) ) ; + m_idArray.Insert( m_nextId , n ) ; + ++m_nextId ; } void wxListBox::MacAppend( const wxString& text) { - Cell cell = { 0 , 0 } ; - cell.v = (**(ListHandle)m_macList).dataBounds.bottom ; - LAddRow( 1 , cell.v , (ListHandle)m_macList ) ; - // LSetCell(text, strlen(text), cell, m_macList); - Refresh(); + verify_noerr(::AddDataBrowserItems( *m_peer , kDataBrowserNoItem , 1 , (UInt32*) &m_nextId , kDataBrowserItemNoProperty ) ) ; + m_idArray.Add( m_nextId ) ; + ++m_nextId ; } void wxListBox::MacClear() { - LDelRow( (**(ListHandle)m_macList).dataBounds.bottom , 0 ,(ListHandle) m_macList ) ; - Refresh(); + verify_noerr(::RemoveDataBrowserItems(*m_peer , kDataBrowserNoItem , 0 , NULL , kDataBrowserItemNoProperty ) ) ; + m_idArray.Empty() ; } void wxListBox::MacSetSelection( int n , bool select ) { - Cell cell = { 0 , 0 } ; - if ( ! (m_windowStyle & wxLB_MULTIPLE) ) + UInt32 id = m_idArray[n] ; + if ( !(GetWindowStyle() & (wxLB_MULTIPLE|wxLB_EXTENDED) ) ) { - if ( LGetSelect( true , &cell , (ListHandle)m_macList ) ) + int n = MacGetSelection() ; + if ( n >= 0 ) { - LSetSelect( false , cell , (ListHandle)m_macList ) ; + UInt32 idOld = m_idArray[n] ; + SetDataBrowserSelectedItems(*m_peer , 1 , & idOld , kDataBrowserItemsRemove ) ; } } - - cell.v = n ; - LSetSelect( select , cell , (ListHandle)m_macList ) ; - LAutoScroll( (ListHandle)m_macList ) ; - Refresh(); + if ( ::IsDataBrowserItemSelected( *m_peer , id ) != select ) + { + verify_noerr(::SetDataBrowserSelectedItems(*m_peer , 1 , & id , kDataBrowserItemsToggle ) ) ; + } + MacScrollTo( n ) ; } bool wxListBox::MacIsSelected( int n ) const { - Cell cell = { 0 , 0 } ; - cell.v = n ; - return LGetSelect( false , &cell , (ListHandle)m_macList ) ; -} - -void wxListBox::MacDestroy() -{ - // DisposeExtLDEFInfo( m_macList ) ; + return ::IsDataBrowserItemSelected( *m_peer , m_idArray[n] ) ; } int wxListBox::MacGetSelection() const { - Cell cell = { 0 , 0 } ; - if ( LGetSelect( true , &cell , (ListHandle)m_macList ) ) - return cell.v ; - else + for ( size_t i = 0 ; i < m_idArray.GetCount() ; ++i ) + { + if ( ::IsDataBrowserItemSelected(*m_peer , m_idArray[i] ) ) + { + return i ; + } + } return -1 ; } @@ -781,71 +694,43 @@ 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 ) ) + for ( size_t i = 0 ; i < m_idArray.GetCount() ; ++i ) { - aSelections.Add( cell.v ) ; - no_sel++ ; - cell.v++ ; + if ( ::IsDataBrowserItemSelected(*m_peer , m_idArray[i] ) ) + { + aSelections.Add( i ) ; + no_sel++ ; + } } return no_sel ; } void wxListBox::MacSet( int n , const wxString& text ) { - // our implementation does not store anything in the list - // so we just have to redraw - Cell cell = { 0 , 0 } ; - cell.v = n ; - // LSetCell(text, strlen(text), cell, m_macList); - Refresh(); + // as we don't store the strings we only have to issue a redraw + UInt32 id = m_idArray[n] ; + verify_noerr( ::UpdateDataBrowserItems( *m_peer , kDataBrowserNoItem , 1 , &id , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) ) ; } void wxListBox::MacScrollTo( int n ) { - // TODO implement scrolling + UInt32 id = m_idArray[n] ; + verify_noerr( ::RevealDataBrowserItem(*m_peer , id , kTextColumnId , kDataBrowserRevealWithoutSelecting ) ) ; } -void wxListBox::OnSize( const wxSizeEvent &event) +#if !TARGET_API_MAC_OSX +void wxListBox::OnSize( wxSizeEvent &event) { - Point pt; - -#if TARGET_CARBON - GetListCellSize((ListHandle)m_macList, &pt); -#else - pt = (**(ListHandle)m_macList).cellSize ; -#endif - pt.h = m_width - 15 ; - LCellSize( pt , (ListHandle)m_macList ) ; -} - -void wxListBox::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED(mouseStillDown)) -{ - Boolean wasDoubleClick = false ; - long result ; - - ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick , &result ) ; - if ( !wasDoubleClick ) - { - MacDoClick() ; - } - else - { - MacDoDoubleClick() ; - } } +#endif void wxListBox::MacSetRedraw( bool doDraw ) { - LSetDrawingMode( doDraw , (ListHandle)m_macList ) ; - + // nothing to do in compositing mode } void wxListBox::MacDoClick() -{ +{/* wxArrayInt aSelections; int n ; size_t count = GetSelections(aSelections); @@ -889,17 +774,26 @@ void wxListBox::MacDoClick() event.m_commandInt = n; GetEventHandler()->ProcessEvent(event); +*/ } void wxListBox::MacDoDoubleClick() { +/* wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId); event.SetEventObject( this ); GetEventHandler()->ProcessEvent(event) ; +*/ } +#if !TARGET_API_MAC_OSX + void wxListBox::OnChar(wxKeyEvent& event) { + // todo trigger proper events here + event.Skip() ; + return ; + if ( event.GetKeyCode() == WXK_RETURN || event.GetKeyCode() == WXK_NUMPAD_ENTER) { wxWindow* parent = GetParent() ; @@ -1002,3 +896,5 @@ void wxListBox::OnChar(wxKeyEvent& event) } } +#endif +