fixes for crashes after DeleteItem and DeleteAllItems
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10933 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -571,12 +571,17 @@ public:
|
|||||||
void ReverseHighlight( size_t line )
|
void ReverseHighlight( size_t line )
|
||||||
{ HighlightLine(line, !IsHighlighted(line)); RefreshLine(line); }
|
{ HighlightLine(line, !IsHighlighted(line)); RefreshLine(line); }
|
||||||
|
|
||||||
|
// return true if the line is highlighted
|
||||||
|
bool IsHighlighted(size_t line) const;
|
||||||
|
|
||||||
// refresh one or several lines at once
|
// refresh one or several lines at once
|
||||||
void RefreshLine( size_t line );
|
void RefreshLine( size_t line );
|
||||||
void RefreshLines( size_t lineFrom, size_t lineTo );
|
void RefreshLines( size_t lineFrom, size_t lineTo );
|
||||||
|
|
||||||
// return true if the line is highlighted
|
// refresh all lines below the given one: the difference with
|
||||||
bool IsHighlighted(size_t line) const;
|
// RefreshLines() is that the index here might not be a valid one (happens
|
||||||
|
// when the last line is deleted)
|
||||||
|
void RefreshAfter( size_t lineFrom );
|
||||||
|
|
||||||
// the methods which are forwarded to wxListLineData itself in list/icon
|
// the methods which are forwarded to wxListLineData itself in list/icon
|
||||||
// modes but are here because the lines don't store their positions in the
|
// modes but are here because the lines don't store their positions in the
|
||||||
@@ -2340,6 +2345,8 @@ void wxListMainWindow::RefreshLines( size_t lineFrom, size_t lineTo )
|
|||||||
// we suppose that they are ordered by caller
|
// we suppose that they are ordered by caller
|
||||||
wxASSERT_MSG( lineFrom <= lineTo, _T("indices in disorder") );
|
wxASSERT_MSG( lineFrom <= lineTo, _T("indices in disorder") );
|
||||||
|
|
||||||
|
wxASSERT_MSG( lineTo < GetItemCount(), _T("invalid line range") );
|
||||||
|
|
||||||
if ( HasFlag(wxLC_REPORT) )
|
if ( HasFlag(wxLC_REPORT) )
|
||||||
{
|
{
|
||||||
size_t visibleFrom, visibleTo;
|
size_t visibleFrom, visibleTo;
|
||||||
@@ -2369,6 +2376,36 @@ void wxListMainWindow::RefreshLines( size_t lineFrom, size_t lineTo )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxListMainWindow::RefreshAfter( size_t lineFrom )
|
||||||
|
{
|
||||||
|
if ( HasFlag(wxLC_REPORT) )
|
||||||
|
{
|
||||||
|
size_t visibleFrom;
|
||||||
|
GetVisibleLinesRange(&visibleFrom, NULL);
|
||||||
|
|
||||||
|
if ( lineFrom < visibleFrom )
|
||||||
|
lineFrom = visibleFrom;
|
||||||
|
|
||||||
|
wxRect rect;
|
||||||
|
rect.x = 0;
|
||||||
|
rect.y = GetLineY(lineFrom);
|
||||||
|
|
||||||
|
wxSize size = GetClientSize();
|
||||||
|
rect.width = size.x;
|
||||||
|
// refresh till the bottom of the window
|
||||||
|
rect.height = size.y - rect.y;
|
||||||
|
|
||||||
|
CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
|
||||||
|
RefreshRect( rect );
|
||||||
|
|
||||||
|
}
|
||||||
|
else // !report
|
||||||
|
{
|
||||||
|
// TODO: how to do it more efficiently?
|
||||||
|
m_dirty = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
||||||
{
|
{
|
||||||
// Note: a wxPaintDC must be constructed even if no drawing is
|
// Note: a wxPaintDC must be constructed even if no drawing is
|
||||||
@@ -3702,15 +3739,9 @@ void wxListMainWindow::DeleteItem( long lindex )
|
|||||||
|
|
||||||
if ( InReportView() )
|
if ( InReportView() )
|
||||||
{
|
{
|
||||||
if ( m_lineTo == GetItemCount() - 1 )
|
ResetVisibleLinesRange();
|
||||||
{
|
|
||||||
m_lineTo--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// refresh before removing the line
|
|
||||||
RefreshLines(index, GetItemCount() - 1);
|
|
||||||
|
|
||||||
if ( IsVirtual() )
|
if ( IsVirtual() )
|
||||||
{
|
{
|
||||||
m_countVirt--;
|
m_countVirt--;
|
||||||
@@ -3721,6 +3752,8 @@ void wxListMainWindow::DeleteItem( long lindex )
|
|||||||
{
|
{
|
||||||
m_lines.RemoveAt( index );
|
m_lines.RemoveAt( index );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RefreshAfter(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxListMainWindow::DeleteColumn( int col )
|
void wxListMainWindow::DeleteColumn( int col )
|
||||||
@@ -3761,6 +3794,11 @@ void wxListMainWindow::DeleteAllItems()
|
|||||||
ResetVisibleLinesRange();
|
ResetVisibleLinesRange();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( InReportView() )
|
||||||
|
{
|
||||||
|
ResetVisibleLinesRange();
|
||||||
|
}
|
||||||
|
|
||||||
m_lines.Clear();
|
m_lines.Clear();
|
||||||
|
|
||||||
m_selStore.Clear();
|
m_selStore.Clear();
|
||||||
@@ -4002,6 +4040,9 @@ void wxListMainWindow::GetVisibleLinesRange(size_t *from, size_t *to)
|
|||||||
m_lineTo = count - 1;
|
m_lineTo = count - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxASSERT_MSG( m_lineFrom <= m_lineTo && m_lineTo < GetItemCount(),
|
||||||
|
_T("GetVisibleLinesRange() returns incorrect result") );
|
||||||
|
|
||||||
if ( from )
|
if ( from )
|
||||||
*from = m_lineFrom;
|
*from = m_lineFrom;
|
||||||
if ( to )
|
if ( to )
|
||||||
|
Reference in New Issue
Block a user