X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/864db5de611f630d8b64dec6b648117187381d99..a485ee6f5a09c84e2a3164ad0d7d4cbf3662a434:/src/mac/carbon/listbox.cpp diff --git a/src/mac/carbon/listbox.cpp b/src/mac/carbon/listbox.cpp index 4a623eb59b..361bc4def7 100644 --- a/src/mac/carbon/listbox.cpp +++ b/src/mac/carbon/listbox.cpp @@ -27,161 +27,18 @@ 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 - -#if TARGET_CARBON -const short kwxMacListItemHeight = 19 ; -#else -const short kwxMacListItemHeight = 14 ; -#endif - -extern "C" -{ -static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect, - Cell cell, short dataOffset, short dataLength, - ListHandle listHandle ) ; -} - -static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect, - Cell cell, short dataOffset, short dataLength, - ListHandle listHandle ) -{ - 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 - { - ::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 , 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) ; - 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 ); - } - - // 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 -// ============================================================================ +// new databrowserbased version // Listbox item wxListBox::wxListBox() @@ -191,8 +48,6 @@ wxListBox::wxListBox() m_macList = NULL ; } -static ListDefUPP macListDefUPP = NULL ; - bool wxListBox::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, @@ -207,6 +62,97 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, style, validator, name); } +#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 +{ + 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 ) + { + 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 ; + } + } +} + + +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; +} bool wxListBox::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, @@ -215,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 ; } } @@ -352,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 ) ; @@ -408,7 +336,6 @@ int wxListBox::DoAppend(const wxString& item) void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) { - MacSetRedraw( false ) ; Clear() ; int n = choices.GetCount(); @@ -445,12 +372,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 @@ -613,15 +534,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 { @@ -661,6 +582,7 @@ wxSize wxListBox::DoGetBestSize() const // make it too small neither lbHeight = (cy+4) * wxMin(wxMax(GetCount(), 3), 10); } + return wxSize(lbWidth, lbHeight); } @@ -669,12 +591,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 ) ; @@ -706,87 +622,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 ; } @@ -795,71 +690,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 ) ) ; } +#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); @@ -903,17 +770,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() ; @@ -1016,3 +892,5 @@ void wxListBox::OnChar(wxKeyEvent& event) } } +#endif +