Listbox fixes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30283 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2004-11-05 12:50:51 +00:00
parent c08a36538a
commit fe3dc50545
3 changed files with 107 additions and 120 deletions

View File

@@ -137,26 +137,23 @@ public:
void* m_macList ; void* m_macList ;
wxArrayString m_stringArray ; wxArrayString m_stringArray ;
wxListDataArray m_dataArray ; wxListDataArray m_dataArray ;
wxArrayInt m_selectionPreImage ;
void MacSetRedraw( bool doDraw ) ; // as we are getting the same events for human and API selection we have to suppress
// events in the latter case
bool MacIsSelectionSuppressed() const { return m_suppressSelection ; }
protected: protected:
void MacDelete( int n ) ; void MacDelete( int n ) ;
void MacInsert( int n , const wxString& item) ; void MacInsert( int n , const wxString& item) ;
void MacAppend( const wxString& item) ; void MacAppend( const wxString& item) ;
void MacSet( int n , const wxString& item ) ; void MacSet( int n , const wxString& item ) ;
void MacClear() ; void MacClear() ;
void MacDeselectAll() ;
void MacSetSelection( int n , bool select ) ; void MacSetSelection( int n , bool select ) ;
int MacGetSelection() const ; int MacGetSelection() const ;
int MacGetSelections(wxArrayInt& aSelections) const ; int MacGetSelections(wxArrayInt& aSelections) const ;
bool MacIsSelected( int n ) const ; bool MacIsSelected( int n ) const ;
void MacScrollTo( int n ) ; void MacScrollTo( int n ) ;
#ifndef __WXMAC_OSX__ bool MacSuppressSelection( bool suppress ) ;
void OnSize( wxSizeEvent &size ) ;
#endif
void MacDoClick() ;
void MacDoDoubleClick() ;
// free memory (common part of Clear() and dtor) // free memory (common part of Clear() and dtor)
// prevent collision with some BSD definitions of macro Free() // prevent collision with some BSD definitions of macro Free()
@@ -164,6 +161,7 @@ protected:
int m_noItems; int m_noItems;
int m_selected; int m_selected;
bool m_suppressSelection ;
wxString m_typeIn ; wxString m_typeIn ;
long m_lastTypeIn ; long m_lastTypeIn ;

View File

@@ -457,6 +457,7 @@ public :
virtual OSStatus RevealItem( DataBrowserItemID item, virtual OSStatus RevealItem( DataBrowserItemID item,
DataBrowserPropertyID propertyID, DataBrowserPropertyID propertyID,
DataBrowserRevealOptions options ) ; DataBrowserRevealOptions options ) ;
virtual OSStatus GetSelectionAnchor( DataBrowserItemID * first, DataBrowserItemID * last ) ;
virtual bool IsItemSelected( DataBrowserItemID item ) ; virtual bool IsItemSelected( DataBrowserItemID item ) ;
virtual OSStatus SetSelectedItems(UInt32 numItems, virtual OSStatus SetSelectedItems(UInt32 numItems,
const DataBrowserItemID * items, const DataBrowserItemID * items,

View File

@@ -44,28 +44,6 @@ const short kTextColumnId = 1024 ;
// we just introduce id s corresponding // we just introduce id s corresponding
// to the line number // to the line number
// Listbox item
wxListBox::wxListBox()
{
m_noItems = 0;
m_selected = 0;
m_macList = NULL ;
}
bool wxListBox::Create(wxWindow *parent, wxWindowID id,
const wxPoint& pos,
const wxSize& size,
const wxArrayString& choices,
long style,
const wxValidator& validator,
const wxString& name)
{
wxCArrayString chs(choices);
return Create(parent, id, pos, size, chs.GetCount(), chs.GetStrings(),
style, validator, name);
}
#if TARGET_API_MAC_OSX #if TARGET_API_MAC_OSX
static pascal void DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, static pascal void DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID,
DataBrowserItemNotification message, DataBrowserItemDataRef itemData) DataBrowserItemNotification message, DataBrowserItemDataRef itemData)
@@ -88,10 +66,10 @@ static pascal void DataBrowserItemNotificationProc(ControlRef browser, DataBrow
{ {
case kDataBrowserItemDeselected : case kDataBrowserItemDeselected :
if ( list->HasMultipleSelection() ) if ( list->HasMultipleSelection() )
trigger = true ; trigger = !list->MacIsSelectionSuppressed() ;
break ; break ;
case kDataBrowserItemSelected : case kDataBrowserItemSelected :
trigger = true ; trigger = !list->MacIsSelectionSuppressed() ;
break ; break ;
case kDataBrowserItemDoubleClicked : case kDataBrowserItemDoubleClicked :
event.SetEventType(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED) ; event.SetEventType(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED) ;
@@ -118,7 +96,6 @@ static pascal void DataBrowserItemNotificationProc(ControlRef browser, DataBrow
} }
} }
static pascal OSStatus ListBoxGetSetItemData(ControlRef browser, static pascal OSStatus ListBoxGetSetItemData(ControlRef browser,
DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemID itemID, DataBrowserPropertyID property,
DataBrowserItemDataRef itemData, Boolean changeValue) DataBrowserItemDataRef itemData, Boolean changeValue)
@@ -155,6 +132,31 @@ static pascal OSStatus ListBoxGetSetItemData(ControlRef browser,
return err; return err;
} }
// Listbox item
wxListBox::wxListBox()
{
m_noItems = 0;
m_selected = 0;
m_macList = NULL ;
m_suppressSelection = false ;
}
bool wxListBox::Create(wxWindow *parent, wxWindowID id,
const wxPoint& pos,
const wxSize& size,
const wxArrayString& choices,
long style,
const wxValidator& validator,
const wxString& name)
{
wxCArrayString chs(choices);
return Create(parent, id, pos, size, chs.GetCount(), chs.GetStrings(),
style, validator, name);
}
bool wxListBox::Create(wxWindow *parent, wxWindowID id, bool wxListBox::Create(wxWindow *parent, wxWindowID id,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
@@ -247,7 +249,6 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
if ( UMAGetSystemVersion() < 0x1030 ) if ( UMAGetSystemVersion() < 0x1030 )
m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean) false ) ; m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean) false ) ;
#endif #endif
MacPostControlCreate(pos,size) ; MacPostControlCreate(pos,size) ;
for ( int i = 0 ; i < n ; i++ ) for ( int i = 0 ; i < n ; i++ )
@@ -456,8 +457,11 @@ void wxListBox::SetSelection(int N, bool select)
wxCHECK_RET( N >= 0 && N < m_noItems, wxCHECK_RET( N >= 0 && N < m_noItems,
wxT("invalid index in wxListBox::SetSelection") ); wxT("invalid index in wxListBox::SetSelection") );
MacSetSelection( N , select ) ;
GetSelections( m_selectionPreImage ) ; if ( N == wxNOT_FOUND )
MacDeselectAll() ;
else
MacSetSelection( N , select ) ;
} }
bool wxListBox::IsSelected(int N) const bool wxListBox::IsSelected(int N) const
@@ -658,17 +662,51 @@ wxListBox::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
// list box control implementation // list box control implementation
// ============================================================================ // ============================================================================
void wxListBox::MacDelete( int N ) void wxListBox::MacDelete( int n )
{ {
wxArrayInt selectionBefore ;
MacGetSelections( selectionBefore ) ;
UInt32 id = m_noItems+1 ; UInt32 id = m_noItems+1 ;
verify_noerr( m_peer->RemoveItems( kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) ) ; verify_noerr( m_peer->RemoveItems( kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) ) ;
for ( int 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( m_peer->UpdateItems( kDataBrowserNoItem , 1 , (UInt32*) kDataBrowserNoItem , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) ) ; verify_noerr( m_peer->UpdateItems( kDataBrowserNoItem , 1 , (UInt32*) kDataBrowserNoItem , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) ) ;
} }
void wxListBox::MacInsert( int n , const wxString& text) void wxListBox::MacInsert( int n , const wxString& text)
{ {
wxArrayInt selectionBefore ;
MacGetSelections( selectionBefore ) ;
UInt32 id = m_noItems ; // this has already been increased UInt32 id = m_noItems ; // this has already been increased
verify_noerr( m_peer->AddItems( kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) ) ; verify_noerr( m_peer->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( m_peer->UpdateItems( kDataBrowserNoItem , 1 , (UInt32*) kDataBrowserNoItem , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) ) ; verify_noerr( m_peer->UpdateItems( kDataBrowserNoItem , 1 , (UInt32*) kDataBrowserNoItem , kDataBrowserItemNoProperty , kDataBrowserItemNoProperty ) ) ;
} }
@@ -676,6 +714,7 @@ void wxListBox::MacAppend( const wxString& text)
{ {
UInt32 id = m_noItems ; // this has already been increased UInt32 id = m_noItems ; // this has already been increased
verify_noerr( m_peer->AddItems( kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) ) ; verify_noerr( m_peer->AddItems( kDataBrowserNoItem , 1 , (UInt32*) &id , kDataBrowserItemNoProperty ) ) ;
// no need to deal with selections nor refreshed, as we have appended
} }
void wxListBox::MacClear() void wxListBox::MacClear()
@@ -683,23 +722,34 @@ void wxListBox::MacClear()
verify_noerr( m_peer->RemoveItems( kDataBrowserNoItem , 0 , NULL , kDataBrowserItemNoProperty ) ) ; verify_noerr( m_peer->RemoveItems( kDataBrowserNoItem , 0 , NULL , kDataBrowserItemNoProperty ) ) ;
} }
void wxListBox::MacDeselectAll()
{
bool former = MacSuppressSelection( true ) ;
verify_noerr(m_peer->SetSelectedItems( 0 , NULL , kDataBrowserItemsRemove ) ) ;
MacSuppressSelection( former ) ;
}
void wxListBox::MacSetSelection( int n , bool select ) void wxListBox::MacSetSelection( int n , bool select )
{ {
bool former = MacSuppressSelection( true ) ;
UInt32 id = n + 1 ; UInt32 id = n + 1 ;
if ( !(GetWindowStyle() & (wxLB_MULTIPLE|wxLB_EXTENDED) ) )
{
int n = MacGetSelection() ;
if ( n >= 0 )
{
UInt32 idOld = n + 1 ;
m_peer->SetSelectedItems( 1 , & idOld , kDataBrowserItemsRemove ) ;
}
}
if ( m_peer->IsItemSelected( id ) != select ) if ( m_peer->IsItemSelected( id ) != select )
{ {
verify_noerr(m_peer->SetSelectedItems( 1 , & id , kDataBrowserItemsToggle ) ) ; if ( select )
verify_noerr(m_peer->SetSelectedItems( 1 , & id , HasMultipleSelection() ? kDataBrowserItemsAdd : kDataBrowserItemsAssign ) ) ;
else
verify_noerr(m_peer->SetSelectedItems( 1 , & id , kDataBrowserItemsRemove ) ) ;
} }
MacScrollTo( n ) ; MacScrollTo( n ) ;
MacSuppressSelection( former ) ;
}
bool wxListBox::MacSuppressSelection( bool suppress )
{
bool former = m_suppressSelection ;
m_suppressSelection = suppress ;
return former ;
} }
bool wxListBox::MacIsSelected( int n ) const bool wxListBox::MacIsSelected( int n ) const
@@ -716,7 +766,7 @@ int wxListBox::MacGetSelection() const
return i ; return i ;
} }
} }
return -1 ; return -1 ;
} }
int wxListBox::MacGetSelections( wxArrayInt& aSelections ) const int wxListBox::MacGetSelections( wxArrayInt& aSelections ) const
@@ -724,12 +774,18 @@ int wxListBox::MacGetSelections( wxArrayInt& aSelections ) const
int no_sel = 0 ; int no_sel = 0 ;
aSelections.Empty(); aSelections.Empty();
for ( int i = 0 ; i < GetCount() ; ++i )
UInt32 first , last ;
m_peer->GetSelectionAnchor( &first , &last ) ;
if ( first != kDataBrowserNoItem )
{ {
if ( m_peer->IsItemSelected( i + 1 ) ) for ( int i = first ; i <= last ; ++i )
{ {
aSelections.Add( i ) ; if ( m_peer->IsItemSelected( i ) )
no_sel++ ; {
aSelections.Add( i - 1 ) ;
no_sel++ ;
}
} }
} }
return no_sel ; return no_sel ;
@@ -748,74 +804,6 @@ void wxListBox::MacScrollTo( int n )
verify_noerr( m_peer->RevealItem( id , kTextColumnId , kDataBrowserRevealWithoutSelecting ) ) ; verify_noerr( m_peer->RevealItem( id , kTextColumnId , kDataBrowserRevealWithoutSelecting ) ) ;
} }
#if !TARGET_API_MAC_OSX
void wxListBox::OnSize( wxSizeEvent &event)
{
}
#endif
void wxListBox::MacSetRedraw( bool doDraw )
{
// nothing to do in compositing mode
}
void wxListBox::MacDoClick()
{/*
wxArrayInt aSelections;
int n ;
size_t count = GetSelections(aSelections);
if ( count == m_selectionPreImage.GetCount() )
{
bool hasChanged = false ;
for ( size_t i = 0 ; i < count ; ++i )
{
if ( aSelections[i] != m_selectionPreImage[i] )
{
hasChanged = true ;
break ;
}
}
if ( !hasChanged )
{
return ;
}
}
m_selectionPreImage = aSelections;
wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
event.SetEventObject( this );
if ( count > 0 )
{
n = aSelections[0];
if ( HasClientObjectData() )
event.SetClientObject( GetClientObject(n) );
else if ( HasClientUntypedData() )
event.SetClientData( GetClientData(n) );
event.SetString( GetString(n) );
}
else
{
n = -1;
}
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 #if !TARGET_API_MAC_OSX
void wxListBox::OnChar(wxKeyEvent& event) void wxListBox::OnChar(wxKeyEvent& event)