+wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxListBox *peer , const wxPoint& pos, const wxSize& size, long style) :
+ wxMacListControl( peer )
+{
+ bool isCheckList = peer->IsKindOf( CLASSINFO(wxCheckListBox));
+
+ m_suppressSelection = false;
+ Rect bounds = wxMacGetBoundsForControl( peer , pos , size );
+ verify_noerr( ::CreateDataBrowserControl( MAC_WXHWND(peer->MacGetTopLevelWindowRef()), &bounds, kDataBrowserListView , &m_controlRef ) );
+
+ DataBrowserSelectionFlags options = kDataBrowserDragSelect;
+ if ( style & wxLB_MULTIPLE )
+ {
+ options += kDataBrowserAlwaysExtendSelection + kDataBrowserCmdTogglesSelection ;
+ }
+ else if ( style & wxLB_EXTENDED )
+ {
+ // default behaviour
+ }
+ else
+ {
+ options += kDataBrowserSelectOnlyOne;
+ }
+ verify_noerr(SetSelectionFlags( options ) );
+
+ if ( gDataBrowserItemDataUPP == NULL ) gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(ListBoxGetSetItemData);
+ if ( gDataBrowserItemNotificationUPP == NULL )
+ {
+ gDataBrowserItemNotificationUPP =
+#if TARGET_API_MAC_OSX
+ (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
+#else
+ NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc);
+#endif
+ }
+
+ DataBrowserCallbacks callbacks;
+ InitializeDataBrowserCallbacks( &callbacks , kDataBrowserLatestCallbacks );
+
+ callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP;
+ callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP;
+ SetCallbacks( &callbacks);
+
+ DataBrowserListViewColumnDesc columnDesc;
+ columnDesc.headerBtnDesc.titleOffset = 0;
+ columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
+
+ columnDesc.headerBtnDesc.btnFontStyle.flags =
+ kControlUseFontMask | kControlUseJustMask;
+
+ columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent;
+ columnDesc.headerBtnDesc.btnFontStyle.just = teFlushDefault;
+ columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
+ columnDesc.headerBtnDesc.btnFontStyle.style = normal;
+ columnDesc.headerBtnDesc.titleString = NULL;
+
+ if( isCheckList )
+ {
+ columnDesc.headerBtnDesc.minimumWidth = 30;
+ columnDesc.headerBtnDesc.maximumWidth = 30;
+
+ columnDesc.propertyDesc.propertyID = kCheckboxColumnId;
+ columnDesc.propertyDesc.propertyType = kDataBrowserCheckboxType;
+ columnDesc.propertyDesc.propertyFlags = kDataBrowserPropertyIsMutable | kDataBrowserTableViewSelectionColumn |
+ kDataBrowserDefaultPropertyFlags;
+ verify_noerr(AddListViewColumn( &columnDesc, kDataBrowserListViewAppendColumn) );
+ }
+
+ columnDesc.headerBtnDesc.minimumWidth = 0;
+ columnDesc.headerBtnDesc.maximumWidth = 10000;
+
+
+ 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(AddListViewColumn( &columnDesc, kDataBrowserListViewAppendColumn) );
+ verify_noerr(AutoSizeListViewColumns() );
+ verify_noerr(SetHasScrollBars(false , true ) );
+ verify_noerr(SetTableViewHiliteStyle(kDataBrowserTableViewFillHilite ) );
+ verify_noerr(SetListViewHeaderBtnHeight( 0 ) );
+
+#if 0
+ // shouldn't be necessary anymore under 10.2
+ m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean) false );
+ m_peer->SetNeedsFocusRect( true );
+#endif
+}
+wxMacDataBrowserListControl::~wxMacDataBrowserListControl()
+{
+
+}
+
+void wxMacDataBrowserListControl::MacDelete( int n )
+{
+ wxArrayInt selectionBefore;
+ MacGetSelections( selectionBefore );
+
+ UInt32 id = GetPeer()->GetCount()+1;
+ verify_noerr( RemoveItems( kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) );
+ for ( size_t i = 0; i < selectionBefore.GetCount(); ++i )
+ {
+ int current = selectionBefore[i];
+ if ( current == n )
+ {
+ // selection was deleted
+ MacSetSelection( current , false );
+ }
+ else if ( current > n )
+ {
+ // something behind the deleted item was selected -> move up
+ MacSetSelection( current - 1 , true );
+ MacSetSelection( current , false );
+ }
+ }
+ // refresh all
+ verify_noerr( UpdateItems( kDataBrowserNoItem , 1 , (UInt32*) kDataBrowserNoItem , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) );
+}
+
+void wxMacDataBrowserListControl::MacInsert( int n , const wxString& text)
+{
+ wxArrayInt selectionBefore;
+ MacGetSelections( selectionBefore );
+
+ UInt32 id = GetPeer()->GetCount(); // this has already been increased
+ verify_noerr( AddItems( kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) );
+
+ for ( int i = selectionBefore.GetCount()-1; i >= 0; --i )
+ {
+ int current = selectionBefore[i];
+ if ( current >= n )
+ {
+ MacSetSelection( current + 1 , true );
+ MacSetSelection( current , false );
+ }
+ }
+
+ // refresh all
+ verify_noerr( UpdateItems( kDataBrowserNoItem , 1 , (UInt32*) kDataBrowserNoItem , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) );
+}
+
+void wxMacDataBrowserListControl::MacInsert( int n , const wxArrayString& items)
+{
+ wxArrayInt selectionBefore;
+ MacGetSelections( selectionBefore );
+ size_t itemsCount = items.GetCount();
+
+ UInt32 *ids = new UInt32[itemsCount];
+ for ( unsigned int i = 0; i < itemsCount;++i )
+ ids[i] = GetPeer()->GetCount() - itemsCount + i + 1;
+
+ verify_noerr( AddItems( kDataBrowserNoItem , itemsCount , ids , kDataBrowserItemNoProperty ) );
+ delete[] ids;
+
+ for ( int i = selectionBefore.GetCount()-1; i >= 0; --i )
+ {
+ int current = selectionBefore[i];
+ if ( current >= n )
+ {
+ MacSetSelection( current + 1 , true );
+ MacSetSelection( current , false );
+ }
+ }
+
+ // refresh all
+ verify_noerr( UpdateItems( kDataBrowserNoItem , 1 , (UInt32*) kDataBrowserNoItem , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) );
+}
+
+void wxMacDataBrowserListControl::MacAppend( const wxString& text)
+{
+ UInt32 id = GetPeer()->GetCount(); // this has already been increased
+ verify_noerr( AddItems( kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) );
+ // no need to deal with selections nor refreshed, as we have appended
+}
+
+void wxMacDataBrowserListControl::MacClear()
+{
+ verify_noerr( RemoveItems( kDataBrowserNoItem , 0 , NULL , kDataBrowserItemNoProperty ) );
+}
+
+void wxMacDataBrowserListControl::MacDeselectAll()
+{
+ bool former = MacSuppressSelection( true );
+ verify_noerr(SetSelectedItems( 0 , NULL , kDataBrowserItemsRemove ) );
+ MacSuppressSelection( former );
+}
+
+void wxMacDataBrowserListControl::MacSetSelection( int n , bool select )
+{
+ bool former = MacSuppressSelection( true );
+ UInt32 id = n + 1;
+
+ if ( IsItemSelected( id ) != select )
+ {
+ if ( select )
+ verify_noerr(SetSelectedItems( 1 , & id , GetPeer()->HasMultipleSelection() ? kDataBrowserItemsAdd : kDataBrowserItemsAssign ) );
+ else
+ verify_noerr(SetSelectedItems( 1 , & id , kDataBrowserItemsRemove ) );
+ }
+ MacScrollTo( n );
+ MacSuppressSelection( former );
+}
+
+bool wxMacDataBrowserListControl::MacSuppressSelection( bool suppress )
+{
+ bool former = m_suppressSelection;
+ m_suppressSelection = suppress;
+ return former;
+}
+
+bool wxMacDataBrowserListControl::MacIsSelected( int n ) const
+{
+ return IsItemSelected( n + 1 );
+}
+
+int wxMacDataBrowserListControl::MacGetSelection() const
+{
+ for ( unsigned int i = 0; i < GetPeer()->GetCount(); ++i )
+ {
+ if ( IsItemSelected( i + 1 ) )
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+int wxMacDataBrowserListControl::MacGetSelections( wxArrayInt& aSelections ) const
+{
+ int no_sel = 0;
+
+ aSelections.Empty();
+
+ UInt32 first , last;
+ GetSelectionAnchor( &first , &last );
+ if ( first != kDataBrowserNoItem )
+ {
+ for ( size_t i = first; i <= last; ++i )
+ {
+ if ( IsItemSelected( i ) )
+ {
+ aSelections.Add( i - 1 );
+ no_sel++;
+ }
+ }
+ }
+ return no_sel;
+}
+
+void wxMacDataBrowserListControl::MacSet( int n , const wxString& text )
+{
+ // as we don't store the strings we only have to issue a redraw
+ UInt32 id = n + 1;
+ verify_noerr( UpdateItems( kDataBrowserNoItem , 1 , &id , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) );
+}
+
+void wxMacDataBrowserListControl::MacScrollTo( int n )
+{
+ UInt32 id = n + 1;
+ verify_noerr( RevealItem( id , kTextColumnId , kDataBrowserRevealWithoutSelecting ) );
+}
+
+void wxMacDataBrowserListControl::UpdateLine( int n )
+{
+ UInt32 id = n + 1;
+ verify_noerr( UpdateItems(kDataBrowserNoItem , 1 , &id , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) );
+}
+
+//
+// Databrowser
+//
+
+OSStatus wxMacDataBrowserListControl::SetSelectionFlags( DataBrowserSelectionFlags options )
+{
+ return SetDataBrowserSelectionFlags( m_controlRef , options );
+}
+
+OSStatus wxMacDataBrowserListControl::AddListViewColumn( DataBrowserListViewColumnDesc *columnDesc,
+ DataBrowserTableViewColumnIndex position )
+{
+ return AddDataBrowserListViewColumn( m_controlRef , columnDesc, position );
+}
+
+OSStatus wxMacDataBrowserListControl::AutoSizeListViewColumns()
+{
+ return AutoSizeDataBrowserListViewColumns(m_controlRef);
+}
+
+OSStatus wxMacDataBrowserListControl::SetHasScrollBars( bool horiz , bool vert )
+{
+ return SetDataBrowserHasScrollBars( m_controlRef , horiz , vert );
+}
+
+OSStatus wxMacDataBrowserListControl::SetTableViewHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
+{
+ return SetDataBrowserTableViewHiliteStyle( m_controlRef , hiliteStyle );
+}
+
+OSStatus wxMacDataBrowserListControl::SetListViewHeaderBtnHeight(UInt16 height)
+{
+ return SetDataBrowserListViewHeaderBtnHeight( m_controlRef ,height );
+}
+
+OSStatus wxMacDataBrowserListControl::SetCallbacks(const DataBrowserCallbacks * callbacks)
+{
+ return SetDataBrowserCallbacks( m_controlRef , callbacks );
+}
+
+OSStatus wxMacDataBrowserListControl::UpdateItems( DataBrowserItemID container, UInt32 numItems,
+ const DataBrowserItemID* items,
+ DataBrowserPropertyID preSortProperty,
+ DataBrowserPropertyID propertyID )
+{
+ return UpdateDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty, propertyID );
+}
+
+bool wxMacDataBrowserListControl::IsItemSelected( DataBrowserItemID item ) const
+{
+ return IsDataBrowserItemSelected( m_controlRef , item );
+}
+
+OSStatus wxMacDataBrowserListControl::AddItems( DataBrowserItemID container, UInt32 numItems,
+ const DataBrowserItemID* items,
+ DataBrowserPropertyID preSortProperty )
+{
+ return AddDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty );
+}
+
+OSStatus wxMacDataBrowserListControl::RemoveItems( DataBrowserItemID container, UInt32 numItems,
+ const DataBrowserItemID* items,
+ DataBrowserPropertyID preSortProperty )
+{
+ return RemoveDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty );
+}
+
+OSStatus wxMacDataBrowserListControl::RevealItem( DataBrowserItemID item,
+ DataBrowserPropertyID propertyID,
+ DataBrowserRevealOptions options )
+{
+ return RevealDataBrowserItem( m_controlRef , item , propertyID , options );
+}
+
+OSStatus wxMacDataBrowserListControl::SetSelectedItems(UInt32 numItems,
+ const DataBrowserItemID * items,
+ DataBrowserSetOption operation )
+{
+ return SetDataBrowserSelectedItems( m_controlRef , numItems , items, operation );
+}
+
+OSStatus wxMacDataBrowserListControl::GetSelectionAnchor( DataBrowserItemID * first, DataBrowserItemID * last ) const
+{
+ return GetDataBrowserSelectionAnchor( m_controlRef , first , last );
+}
+
+#if 0
+
+// in case we need that one day
+
+// ============================================================================
+// HIView owner draw based implementation
+// ============================================================================
+