X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b905d6cc083a38d46ae48712f5221236247a39ce..917ae499da53826e9b154a786eae1b563317f47f:/src/mac/carbon/listbox.cpp diff --git a/src/mac/carbon/listbox.cpp b/src/mac/carbon/listbox.cpp index a9d1246fae..38bdecfd01 100644 --- a/src/mac/carbon/listbox.cpp +++ b/src/mac/carbon/listbox.cpp @@ -48,6 +48,10 @@ const short kTextColumnId = 1024 ; // we just introduce id s corresponding // to the line number +DataBrowserItemDataUPP gDataBrowserItemDataUPP = NULL ; +DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP = NULL ; +DataBrowserDrawItemUPP gDataBrowserDrawItemUPP = NULL ; + #if TARGET_API_MAC_OSX static pascal void DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData) @@ -137,6 +141,34 @@ static pascal OSStatus ListBoxGetSetItemData(ControlRef browser, return err; } +static pascal void ListBoxDrawProc( ControlRef browser , DataBrowserItemID item , DataBrowserPropertyID property , + DataBrowserItemState itemState , const Rect *itemRect , SInt16 depth , Boolean isColorDevice ) +{ + + CFStringRef cfString; + long systemVersion; + + cfString = CFStringCreateWithFormat( NULL, NULL, CFSTR("Row %d"), item ); + + ThemeDrawingState themeState ; + GetThemeDrawingState( &themeState ) ; + + if ( itemState == kDataBrowserItemIsSelected ) // In this sample we handle the "selected" state, all others fall through to our "active" state + { + Gestalt( gestaltSystemVersion, &systemVersion ); + if ( (systemVersion >= 0x00001030) && (IsControlActive( browser ) == false) ) // Panther DB starts using kThemeBrushSecondaryHighlightColor for inactive browser hilighting + SetThemePen( kThemeBrushSecondaryHighlightColor, 32, true ); + else + SetThemePen( kThemeBrushPrimaryHighlightColor, 32, true ); + + PaintRect( itemRect ); // First paint the hilite rect, then the text on top + SetThemeDrawingState( themeState , false ) ; + } + DrawThemeTextBox( cfString, kThemeApplicationFont, kThemeStateActive, true, itemRect, teFlushDefault, NULL ); + if ( cfString != NULL ) + CFRelease( cfString ); + SetThemeDrawingState( themeState , true ) ; +} // Listbox item wxListBox::wxListBox() @@ -199,7 +231,33 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, options += kDataBrowserSelectOnlyOne ; } verify_noerr(m_peer->SetSelectionFlags( options ) ); + + if ( gDataBrowserItemDataUPP == NULL ) gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(ListBoxGetSetItemData) ; + if ( gDataBrowserItemNotificationUPP == NULL ) + { + gDataBrowserItemNotificationUPP = +#if TARGET_API_MAC_OSX + (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc) ; +#else + NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc) ; +#endif + } + if ( gDataBrowserDrawItemUPP == NULL ) gDataBrowserDrawItemUPP = NewDataBrowserDrawItemUPP(ListBoxDrawProc) ; + + DataBrowserCallbacks callbacks ; + InitializeDataBrowserCallbacks( &callbacks , kDataBrowserLatestCallbacks ) ; + callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP; + callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP; + m_peer->SetCallbacks( &callbacks); + + DataBrowserCustomCallbacks customCallbacks ; + InitializeDataBrowserCustomCallbacks( &customCallbacks , kDataBrowserLatestCustomCallbacks ) ; + + customCallbacks.u.v1.drawItemCallback = gDataBrowserDrawItemUPP ; + + SetDataBrowserCustomCallbacks( m_peer->GetControlRef() , &customCallbacks ) ; + DataBrowserListViewColumnDesc columnDesc ; columnDesc.headerBtnDesc.titleOffset = 0; columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc; @@ -208,7 +266,6 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, kControlUseFontMask | kControlUseJustMask; columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent; - columnDesc.propertyDesc.propertyType = kDataBrowserTextType; columnDesc.headerBtnDesc.btnFontStyle.just = teFlushDefault; columnDesc.headerBtnDesc.minimumWidth = 0; columnDesc.headerBtnDesc.maximumWidth = 10000; @@ -218,41 +275,25 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, columnDesc.headerBtnDesc.titleString = NULL ; // CFSTR( "" ); columnDesc.propertyDesc.propertyID = kTextColumnId; - columnDesc.propertyDesc.propertyType = kDataBrowserTextType; + columnDesc.propertyDesc.propertyType = kDataBrowserTextType ; // kDataBrowserCustomType; columnDesc.propertyDesc.propertyFlags = #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 kDataBrowserListViewTypeSelectColumn | #endif kDataBrowserTableViewSelectionColumn ; - verify_noerr(m_peer->AddListViewColumn( &columnDesc, kDataBrowserListViewAppendColumn) ) ; verify_noerr(m_peer->AutoSizeListViewColumns() ) ; verify_noerr(m_peer->SetHasScrollBars(false , true ) ) ; verify_noerr(m_peer->SetTableViewHiliteStyle(kDataBrowserTableViewFillHilite ) ) ; verify_noerr(m_peer->SetListViewHeaderBtnHeight( 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) ; +#if 0 + // shouldn't be necessary anymore under 10.2 + m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean) false ) ; + m_peer->SetNeedsFocusRect( true ) ; #endif - m_peer->SetCallbacks( &callbacks); -#if TARGET_API_MAC_OSX - // there is a redraw bug in 10.2.X - if ( UMAGetSystemVersion() < 0x1030 ) - m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean) false ) ; -#endif MacPostControlCreate(pos,size) ; for ( int i = 0 ; i < n ; i++ ) @@ -519,7 +560,10 @@ int wxListBox::GetSelection() const // Find string for position wxString wxListBox::GetString(int N) const { - return m_stringArray[N] ; + wxCHECK_MSG( N >= 0 && N < m_noItems, wxEmptyString, + wxT("invalid index in wxListBox::GetString") ); + + return m_stringArray[N] ; } void wxListBox::DoInsertItems(const wxArrayString& items, int pos)