wxListCtrl::DeleteAllItems() doesn't send notification events (as documented)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4588 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-11-16 13:14:06 +00:00
parent bbdc9a8780
commit bffa1c7746
2 changed files with 135 additions and 122 deletions

View File

@@ -140,7 +140,10 @@ Deletes all items and all columns.
\func{bool}{DeleteItem}{\param{long }{item}} \func{bool}{DeleteItem}{\param{long }{item}}
Deletes the specified item. Deletes the specified item. This function sends the
{\tt wxEVT\_COMMAND\_LIST\_DELETE\_ITEM} event for the item being deleted.
See also: \helpref{DeleteAllItems}{wxlistctrldeleteallitems}
\membersection{wxListCtrl::DeleteAllItems}\label{wxlistctrldeleteallitems} \membersection{wxListCtrl::DeleteAllItems}\label{wxlistctrldeleteallitems}
@@ -148,6 +151,11 @@ Deletes the specified item.
Deletes all the items in the list control. Deletes all the items in the list control.
{\bf NB:} This function does {\it not} send the
{\tt wxEVT\_COMMAND\_LIST\_DELETE\_ITEM} event because deleting many items
from the control would be too slow then (unlike
\helpref{DeleteItem}{wxlistctrldeleteitem})
\membersection{wxListCtrl::DeleteColumn}\label{wxlistctrldeletecolumn} \membersection{wxListCtrl::DeleteColumn}\label{wxlistctrldeletecolumn}
\func{bool}{DeleteColumn}{\param{int }{col}} \func{bool}{DeleteColumn}{\param{int }{col}}

View File

@@ -311,9 +311,9 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
int w = 0; int w = 0;
int h = 0; int h = 0;
m_owner->GetImageSize( item->GetImage(), w, h ); m_owner->GetImageSize( item->GetImage(), w, h );
m_bound_all.width += 4 + w; m_bound_all.width += 4 + w;
if (h > m_bound_all.height) m_bound_all.height = h; if (h > m_bound_all.height) m_bound_all.height = h;
} }
} }
break; break;
} }
@@ -410,18 +410,18 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
{ {
wxListItemData *item = (wxListItemData*)node->Data(); wxListItemData *item = (wxListItemData*)node->Data();
if (item->HasImage()) if (item->HasImage())
{ {
m_bound_icon.x = m_bound_all.x + 2; m_bound_icon.x = m_bound_all.x + 2;
m_bound_icon.y = m_bound_all.y + 2; m_bound_icon.y = m_bound_all.y + 2;
int w; int w;
int h; int h;
m_owner->GetImageSize( item->GetImage(), w, h ); m_owner->GetImageSize( item->GetImage(), w, h );
m_bound_icon.width = w; m_bound_icon.width = w;
m_bound_icon.height = h; m_bound_icon.height = h;
m_bound_label.x += 4 + w; m_bound_label.x += 4 + w;
m_bound_label.width -= 4 + w; m_bound_label.width -= 4 + w;
} }
} }
break; break;
} }
case wxLC_REPORT: case wxLC_REPORT:
@@ -441,23 +441,23 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
wxListItemData *item = (wxListItemData*)node->Data(); wxListItemData *item = (wxListItemData*)node->Data();
wxString s; wxString s;
item->GetText( s ); item->GetText( s );
if (s.IsEmpty()) s = wxT("H"); if (s.IsEmpty()) s = wxT("H");
long lw,lh; long lw,lh;
dc->GetTextExtent( s, &lw, &lh ); dc->GetTextExtent( s, &lw, &lh );
m_bound_label.width = lw; m_bound_label.width = lw;
m_bound_label.height = lh; m_bound_label.height = lh;
if (item->HasImage()) if (item->HasImage())
{ {
m_bound_icon.x = m_bound_all.x + 2; m_bound_icon.x = m_bound_all.x + 2;
m_bound_icon.y = m_bound_all.y + 2; m_bound_icon.y = m_bound_all.y + 2;
int w; int w;
int h; int h;
m_owner->GetImageSize( item->GetImage(), w, h ); m_owner->GetImageSize( item->GetImage(), w, h );
m_bound_icon.width = w; m_bound_icon.width = w;
m_bound_icon.height = h; m_bound_icon.height = h;
m_bound_label.x += 4 + w; m_bound_label.x += 4 + w;
} }
} }
break; break;
} }
} }
@@ -787,15 +787,15 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
wxPaintDC dc( this ); wxPaintDC dc( this );
PrepareDC( dc ); PrepareDC( dc );
#if wxUSE_GENERIC_LIST_EXTENSIONS #if wxUSE_GENERIC_LIST_EXTENSIONS
if ( m_owner->GetMode() & wxLC_REPORT ) if ( m_owner->GetMode() & wxLC_REPORT )
{ {
int x , y ; int x , y ;
int xpix , ypix ; int xpix , ypix ;
m_owner->GetScrollPixelsPerUnit( &xpix , &ypix ) ; m_owner->GetScrollPixelsPerUnit( &xpix , &ypix ) ;
m_owner->ViewStart( &x, &y ) ; m_owner->ViewStart( &x, &y ) ;
dc.SetDeviceOrigin( -x * xpix, 0 ); dc.SetDeviceOrigin( -x * xpix, 0 );
} }
#endif #endif
dc.BeginDrawing(); dc.BeginDrawing();
@@ -820,8 +820,8 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
m_owner->GetColumn( i, item ); m_owner->GetColumn( i, item );
int cw = item.m_width-2; int cw = item.m_width-2;
#if wxUSE_GENERIC_LIST_EXTENSIONS #if wxUSE_GENERIC_LIST_EXTENSIONS
if ((i+1 == numColumns) || ( dc.LogicalToDeviceX(x+item.m_width) > w-5)) if ((i+1 == numColumns) || ( dc.LogicalToDeviceX(x+item.m_width) > w-5))
cw = dc.DeviceToLogicalX(w)-x-1; cw = dc.DeviceToLogicalX(w)-x-1;
#else #else
if ((i+1 == numColumns) || (x+item.m_width > w-5)) cw = w-x-1; if ((i+1 == numColumns) || (x+item.m_width > w-5)) cw = w-x-1;
#endif #endif
@@ -905,31 +905,31 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
hit_border = TRUE; hit_border = TRUE;
break; break;
} }
if (x-xpos < 0) if (x-xpos < 0)
{ {
break; break;
} }
m_minX = xpos; m_minX = xpos;
} }
if (event.LeftDown()) if (event.LeftDown())
{ {
if (hit_border) if (hit_border)
{ {
m_isDragging = TRUE; m_isDragging = TRUE;
m_currentX = x; m_currentX = x;
DrawCurrent(); DrawCurrent();
CaptureMouse(); CaptureMouse();
return; return;
} }
else else
{ {
wxListEvent le( wxEVT_COMMAND_LIST_COL_CLICK, GetParent()->GetId() ); wxListEvent le( wxEVT_COMMAND_LIST_COL_CLICK, GetParent()->GetId() );
le.SetEventObject( GetParent() ); le.SetEventObject( GetParent() );
le.m_col = m_column; le.m_col = m_column;
GetParent()->GetEventHandler()->ProcessEvent( le ); GetParent()->GetEventHandler()->ProcessEvent( le );
return; return;
} }
} }
if (event.Moving()) if (event.Moving())
@@ -1003,14 +1003,14 @@ void wxListTextCtrl::OnChar( wxKeyEvent &event )
{ {
(*m_accept) = TRUE; (*m_accept) = TRUE;
(*m_res) = GetValue(); (*m_res) = GetValue();
m_owner->SetFocus(); m_owner->SetFocus();
return; return;
} }
if (event.m_keyCode == WXK_ESCAPE) if (event.m_keyCode == WXK_ESCAPE)
{ {
(*m_accept) = FALSE; (*m_accept) = FALSE;
(*m_res) = ""; (*m_res) = "";
m_owner->SetFocus(); m_owner->SetFocus();
return; return;
} }
event.Skip(); event.Skip();
@@ -1040,7 +1040,7 @@ BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow)
EVT_KEY_DOWN (wxListMainWindow::OnKeyDown) EVT_KEY_DOWN (wxListMainWindow::OnKeyDown)
EVT_SET_FOCUS (wxListMainWindow::OnSetFocus) EVT_SET_FOCUS (wxListMainWindow::OnSetFocus)
EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus) EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus)
EVT_SCROLLWIN (wxListMainWindow::OnScroll) EVT_SCROLLWIN (wxListMainWindow::OnScroll)
END_EVENT_TABLE() END_EVENT_TABLE()
wxListMainWindow::wxListMainWindow() wxListMainWindow::wxListMainWindow()
@@ -1161,18 +1161,18 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
int dummy = 0; int dummy = 0;
line->GetSize( dummy, lineSpacing ); line->GetSize( dummy, lineSpacing );
lineSpacing += 1; lineSpacing += 1;
int y_s = m_yScroll*GetScrollPos( wxVERTICAL ); int y_s = m_yScroll*GetScrollPos( wxVERTICAL );
wxNode *node = m_lines.Nth( y_s / lineSpacing ); wxNode *node = m_lines.Nth( y_s / lineSpacing );
for (int i = 0; i < m_visibleLines+2; i++) for (int i = 0; i < m_visibleLines+2; i++)
{ {
if (!node) break; if (!node) break;
line = (wxListLineData*)node->Data(); line = (wxListLineData*)node->Data();
line->Draw( &dc ); line->Draw( &dc );
node = node->Next(); node = node->Next();
} }
} }
else else
{ {
@@ -1335,21 +1335,21 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event )
if (event.Dragging()) if (event.Dragging())
{ {
if (m_dragCount == 0) if (m_dragCount == 0)
m_dragStart = wxPoint(x,y); m_dragStart = wxPoint(x,y);
m_dragCount++; m_dragCount++;
if (m_dragCount != 3) return; if (m_dragCount != 3) return;
int command = wxEVT_COMMAND_LIST_BEGIN_DRAG; int command = wxEVT_COMMAND_LIST_BEGIN_DRAG;
if (event.RightIsDown()) command = wxEVT_COMMAND_LIST_BEGIN_RDRAG; if (event.RightIsDown()) command = wxEVT_COMMAND_LIST_BEGIN_RDRAG;
wxListEvent le( command, GetParent()->GetId() ); wxListEvent le( command, GetParent()->GetId() );
le.SetEventObject( GetParent() ); le.SetEventObject( GetParent() );
le.m_pointDrag = m_dragStart; le.m_pointDrag = m_dragStart;
GetParent()->GetEventHandler()->ProcessEvent( le ); GetParent()->GetEventHandler()->ProcessEvent( le );
return; return;
} }
else else
{ {
@@ -1416,7 +1416,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event )
else if (event.ControlDown()) else if (event.ControlDown())
{ {
m_current = line; m_current = line;
int numOfCurrent = -1; int numOfCurrent = -1;
node = m_lines.First(); node = m_lines.First();
while (node) while (node)
@@ -1426,7 +1426,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event )
if (test_line == oldCurrent) break; if (test_line == oldCurrent) break;
node = node->Next(); node = node->Next();
} }
int numOfLine = -1; int numOfLine = -1;
node = m_lines.First(); node = m_lines.First();
while (node) while (node)
@@ -1439,11 +1439,11 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event )
if (numOfLine < numOfCurrent) if (numOfLine < numOfCurrent)
{ {
int i = numOfLine; int i = numOfLine;
numOfLine = numOfCurrent; numOfLine = numOfCurrent;
numOfCurrent = i; numOfCurrent = i;
} }
wxNode *node = m_lines.Nth( numOfCurrent ); wxNode *node = m_lines.Nth( numOfCurrent );
for (int i = 0; i <= numOfLine-numOfCurrent; i++) for (int i = 0; i <= numOfLine-numOfCurrent; i++)
{ {
@@ -1601,9 +1601,9 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
{ {
int steps = 0; int steps = 0;
if (m_mode & wxLC_REPORT) if (m_mode & wxLC_REPORT)
{ {
steps = m_visibleLines-1; steps = m_visibleLines-1;
} }
else else
{ {
int pos = 0; int pos = 0;
@@ -1620,9 +1620,9 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
{ {
int steps = 0; int steps = 0;
if (m_mode & wxLC_REPORT) if (m_mode & wxLC_REPORT)
{ {
steps = m_visibleLines-1; steps = m_visibleLines-1;
} }
else else
{ {
int pos = 0; wxNode *node = m_lines.First(); int pos = 0; wxNode *node = m_lines.First();
@@ -1860,25 +1860,25 @@ void wxListMainWindow::SetColumnWidth( int col, int width )
if (n) if (n)
{ {
wxListItemData *item = (wxListItemData*)n->Data(); wxListItemData *item = (wxListItemData*)n->Data();
int current = 0, ix = 0, iy = 0; int current = 0, ix = 0, iy = 0;
long lx = 0, ly = 0; long lx = 0, ly = 0;
if (item->HasImage()) if (item->HasImage())
{ {
GetImageSize( item->GetImage(), ix, iy ); GetImageSize( item->GetImage(), ix, iy );
current = ix + 5; current = ix + 5;
} }
if (item->HasText()) if (item->HasText())
{ {
wxString str; wxString str;
item->GetText( str ); item->GetText( str );
dc.GetTextExtent( str, &lx, &ly ); dc.GetTextExtent( str, &lx, &ly );
current += lx; current += lx;
} }
if (current > max) max = current; if (current > max) max = current;
} }
node = node->Next(); node = node->Next();
} }
width = max+10; width = max+10;
} }
node = m_columns.Nth( col ); node = m_columns.Nth( col );
@@ -1998,11 +1998,11 @@ void wxListMainWindow::SetItemState( long item, long state, long stateMask )
if (oldCurrent) RefreshLine( oldCurrent ); if (oldCurrent) RefreshLine( oldCurrent );
} }
bool on = state & wxLIST_STATE_SELECTED; bool on = state & wxLIST_STATE_SELECTED;
if (on != line->IsHilighted()) if (on != line->IsHilighted())
{ {
line->Hilight( on ); line->Hilight( on );
RefreshLine( line ); RefreshLine( line );
} }
} }
} }
} }
@@ -2191,9 +2191,9 @@ void wxListMainWindow::CalculatePositions()
y += lineSpacing; // one pixel blank line between items y += lineSpacing; // one pixel blank line between items
node = node->Next(); node = node->Next();
} }
m_visibleLines = clientHeight / lineSpacing; m_visibleLines = clientHeight / lineSpacing;
#if wxUSE_GENERIC_LIST_EXTENSIONS #if wxUSE_GENERIC_LIST_EXTENSIONS
SetScrollbars( m_xScroll, m_yScroll, entireWidth / m_xScroll , (entireHeight+15) / m_yScroll, x_scroll_pos , scroll_pos, TRUE ); SetScrollbars( m_xScroll, m_yScroll, entireWidth / m_xScroll , (entireHeight+15) / m_yScroll, x_scroll_pos , scroll_pos, TRUE );
#endif #endif
} }
else else
@@ -2203,7 +2203,7 @@ void wxListMainWindow::CalculatePositions()
// approximated 15 pt for the horizontal scrollbar // approximated 15 pt for the horizontal scrollbar
GetSize( &clientWidth, &clientHeight ); GetSize( &clientWidth, &clientHeight );
clientHeight -= 4; // sunken frame clientHeight -= 4; // sunken frame
int entireWidth = 0; int entireWidth = 0;
@@ -2214,22 +2214,22 @@ void wxListMainWindow::CalculatePositions()
int y = 5; // painting is done at y-2 int y = 5; // painting is done at y-2
int maxWidth = 0; int maxWidth = 0;
m_visibleLines = 0; m_visibleLines = 0;
int m_currentVisibleLines = 0; int m_currentVisibleLines = 0;
wxNode *node = m_lines.First(); wxNode *node = m_lines.First();
while (node) while (node)
{ {
m_currentVisibleLines++; m_currentVisibleLines++;
wxListLineData *line = (wxListLineData*)node->Data(); wxListLineData *line = (wxListLineData*)node->Data();
line->CalculateSize( &dc, iconSpacing ); line->CalculateSize( &dc, iconSpacing );
line->SetPosition( &dc, x, y, clientWidth ); line->SetPosition( &dc, x, y, clientWidth );
line->GetSize( lineWidth, lineHeight ); line->GetSize( lineWidth, lineHeight );
if (lineWidth > maxWidth) maxWidth = lineWidth; if (lineWidth > maxWidth) maxWidth = lineWidth;
y += lineSpacing; y += lineSpacing;
if (m_currentVisibleLines > m_visibleLines) if (m_currentVisibleLines > m_visibleLines)
m_visibleLines = m_currentVisibleLines; m_visibleLines = m_currentVisibleLines;
if (y+lineSpacing-6 >= clientHeight) // -6 for earlier "line breaking" if (y+lineSpacing-6 >= clientHeight) // -6 for earlier "line breaking"
{ {
m_currentVisibleLines = 0; m_currentVisibleLines = 0;
y = 5; y = 5;
x += maxWidth+6; x += maxWidth+6;
entireWidth += maxWidth+6; entireWidth += maxWidth+6;
@@ -2241,13 +2241,13 @@ void wxListMainWindow::CalculatePositions()
{ {
clientHeight -= 15; // scrollbar height clientHeight -= 15; // scrollbar height
m_visibleLines = 0; m_visibleLines = 0;
m_currentVisibleLines = 0; m_currentVisibleLines = 0;
break; break;
} }
if (!node) tries = 1; // everything fits, no second try required if (!node) tries = 1; // everything fits, no second try required
} }
} }
int scroll_pos = GetScrollPos( wxHORIZONTAL ); int scroll_pos = GetScrollPos( wxHORIZONTAL );
SetScrollbars( m_xScroll, m_yScroll, (entireWidth+15) / m_xScroll, 0, scroll_pos, 0, TRUE ); SetScrollbars( m_xScroll, m_yScroll, (entireWidth+15) / m_xScroll, 0, scroll_pos, 0, TRUE );
} }
@@ -2316,7 +2316,12 @@ void wxListMainWindow::DeleteAllItems( void )
while (node) while (node)
{ {
wxListLineData *line = (wxListLineData*)node->Data(); wxListLineData *line = (wxListLineData*)node->Data();
DeleteLine( line );
// to make the deletion of all items faster, we don't send the
// notifications in this case: this is compatible with wxMSW and
// documented in DeleteAllItems() description
//DeleteLine( line );
node = node->Next(); node = node->Next();
} }
m_lines.Clear(); m_lines.Clear();
@@ -2485,19 +2490,19 @@ void wxListMainWindow::SortItems( wxListCtrlCompare fn, long data )
void wxListMainWindow::OnScroll(wxScrollWinEvent& event) void wxListMainWindow::OnScroll(wxScrollWinEvent& event)
{ {
wxScrolledWindow::OnScroll( event ) ; wxScrolledWindow::OnScroll( event ) ;
#if wxUSE_GENERIC_LIST_EXTENSIONS #if wxUSE_GENERIC_LIST_EXTENSIONS
if (event.GetOrientation() == wxHORIZONTAL && ( m_mode & wxLC_REPORT )) if (event.GetOrientation() == wxHORIZONTAL && ( m_mode & wxLC_REPORT ))
{ {
wxListCtrl* lc = wxDynamicCast( GetParent() , wxListCtrl ) ; wxListCtrl* lc = wxDynamicCast( GetParent() , wxListCtrl ) ;
if ( lc ) if ( lc )
{ {
lc->m_headerWin->Refresh() ; lc->m_headerWin->Refresh() ;
#ifdef __WXMAC__ #ifdef __WXMAC__
lc->m_headerWin->MacUpdateImmediately() ; lc->m_headerWin->MacUpdateImmediately() ;
#endif #endif
} }
} }
#endif #endif
} }
@@ -2659,15 +2664,15 @@ void wxListCtrl::SetWindowStyleFlag( long flag )
if (!m_headerWin) if (!m_headerWin)
{ {
m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin,
wxPoint(0,0), wxSize(width,23), wxTAB_TRAVERSAL ); wxPoint(0,0), wxSize(width,23), wxTAB_TRAVERSAL );
if (HasFlag(wxLC_NO_HEADER)) if (HasFlag(wxLC_NO_HEADER))
m_headerWin->Show( FALSE ); m_headerWin->Show( FALSE );
} }
else else
{ {
if (flag & wxLC_NO_HEADER) if (flag & wxLC_NO_HEADER)
m_headerWin->Show( FALSE ); m_headerWin->Show( FALSE );
else else
m_headerWin->Show( TRUE ); m_headerWin->Show( TRUE );
} }
} }
@@ -2678,7 +2683,7 @@ void wxListCtrl::SetWindowStyleFlag( long flag )
{ {
m_headerWin->Show( FALSE ); m_headerWin->Show( FALSE );
} }
} }
} }
wxWindow::SetWindowStyleFlag( flag ); wxWindow::SetWindowStyleFlag( flag );
@@ -2901,7 +2906,7 @@ bool wxListCtrl::DeleteAllColumns()
{ {
for ( size_t n = 0; n < m_mainWin->m_columns.GetCount(); n++ ) for ( size_t n = 0; n < m_mainWin->m_columns.GetCount(); n++ )
DeleteColumn(n); DeleteColumn(n);
return TRUE; return TRUE;
} }