Update the current row after item deletion in generic wxDataViewCtrl.

Also change the code changing the current item to collect the range checks
inside OnVerticalNavigation() itself instead of doing them in the caller.

Closes #14802.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72906 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-11-06 16:51:18 +00:00
parent ddcc73a762
commit ed3aece5ae

View File

@@ -612,7 +612,7 @@ public:
void OnPaint( wxPaintEvent &event ); void OnPaint( wxPaintEvent &event );
void OnCharHook( wxKeyEvent &event ); void OnCharHook( wxKeyEvent &event );
void OnChar( wxKeyEvent &event ); void OnChar( wxKeyEvent &event );
void OnVerticalNavigation(unsigned int newCurrent, const wxKeyEvent& event); void OnVerticalNavigation(int delta, const wxKeyEvent& event);
void OnLeftKey(); void OnLeftKey();
void OnRightKey(); void OnRightKey();
void OnMouse( wxMouseEvent &event ); void OnMouse( wxMouseEvent &event );
@@ -1397,7 +1397,7 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i
m_currentCol = NULL; m_currentCol = NULL;
m_currentColSetByKeyboard = false; m_currentColSetByKeyboard = false;
m_useCellFocus = false; m_useCellFocus = false;
m_currentRow = 0; m_currentRow = (unsigned)-1;
#ifdef __WXMSW__ #ifdef __WXMSW__
// We would like to use the same line height that Explorer uses. This is // We would like to use the same line height that Explorer uses. This is
@@ -2398,7 +2398,7 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent,
} }
// Change the current row to the last row if the current exceed the max row number // Change the current row to the last row if the current exceed the max row number
if( m_currentRow > GetRowCount() ) if ( m_currentRow >= GetRowCount() )
ChangeCurrentRow(m_count - 1); ChangeCurrentRow(m_count - 1);
GetOwner()->InvalidateColBestWidths(); GetOwner()->InvalidateColBestWidths();
@@ -2472,6 +2472,7 @@ bool wxDataViewMainWindow::Cleared()
{ {
DestroyTree(); DestroyTree();
m_selection.Clear(); m_selection.Clear();
m_currentRow = (unsigned)-1;
if (GetModel()) if (GetModel())
{ {
@@ -3002,6 +3003,9 @@ wxDataViewTreeNode * wxDataViewMainWindow::GetTreeNodeByRow(unsigned int row) co
{ {
wxASSERT( !IsVirtualList() ); wxASSERT( !IsVirtualList() );
if ( row == (unsigned)-1 )
return NULL;
RowToTreeNodeJob job( row , -2, m_root ); RowToTreeNodeJob job( row , -2, m_root );
Walker( m_root , job ); Walker( m_root , job );
return job.GetResult(); return job.GetResult();
@@ -3704,13 +3708,11 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
break; break;
case WXK_UP: case WXK_UP:
if ( m_currentRow > 0 ) OnVerticalNavigation( -1, event );
OnVerticalNavigation( m_currentRow - 1, event );
break; break;
case WXK_DOWN: case WXK_DOWN:
if ( m_currentRow + 1 < GetRowCount() ) OnVerticalNavigation( +1, event );
OnVerticalNavigation( m_currentRow + 1, event );
break; break;
// Add the process for tree expanding/collapsing // Add the process for tree expanding/collapsing
case WXK_LEFT: case WXK_LEFT:
@@ -3722,37 +3724,19 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
break; break;
case WXK_END: case WXK_END:
{ OnVerticalNavigation( +(int)GetRowCount(), event );
if (!IsEmpty())
OnVerticalNavigation( GetRowCount() - 1, event );
break; break;
}
case WXK_HOME: case WXK_HOME:
if (!IsEmpty()) OnVerticalNavigation( -(int)GetRowCount(), event );
OnVerticalNavigation( 0, event );
break; break;
case WXK_PAGEUP: case WXK_PAGEUP:
{ OnVerticalNavigation( -(pageSize - 1), event );
int steps = pageSize - 1;
int index = m_currentRow - steps;
if (index < 0)
index = 0;
OnVerticalNavigation( index, event );
}
break; break;
case WXK_PAGEDOWN: case WXK_PAGEDOWN:
{ OnVerticalNavigation( +(pageSize - 1), event );
int steps = pageSize - 1;
unsigned int index = m_currentRow + steps;
unsigned int count = GetRowCount();
if ( index >= count )
index = count - 1;
OnVerticalNavigation( index, event );
}
break; break;
default: default:
@@ -3760,16 +3744,24 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
} }
} }
void wxDataViewMainWindow::OnVerticalNavigation(unsigned int newCurrent, const wxKeyEvent& event) void wxDataViewMainWindow::OnVerticalNavigation(int delta, const wxKeyEvent& event)
{ {
wxCHECK_RET( newCurrent < GetRowCount(),
wxT("invalid item index in OnVerticalNavigation()") );
// if there is no selection, we cannot move it anywhere // if there is no selection, we cannot move it anywhere
if (!HasCurrentRow()) if (!HasCurrentRow() || IsEmpty())
return; return;
int newRow = (int)m_currentRow + delta;
// let's keep the new row inside the allowed range
if ( newRow < 0 )
newRow = 0;
const int rowCount = (int)GetRowCount();
if ( newRow >= rowCount )
newRow = rowCount - 1;
unsigned int oldCurrent = m_currentRow; unsigned int oldCurrent = m_currentRow;
unsigned int newCurrent = (unsigned int)newRow;
// in single selection we just ignore Shift as we can't select several // in single selection we just ignore Shift as we can't select several
// items anyhow // items anyhow
@@ -3821,6 +3813,8 @@ void wxDataViewMainWindow::OnLeftKey()
else else
{ {
wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow); wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow);
if ( !node )
return;
if ( TryAdvanceCurrentColumn(node, /*forward=*/false) ) if ( TryAdvanceCurrentColumn(node, /*forward=*/false) )
return; return;
@@ -3863,6 +3857,8 @@ void wxDataViewMainWindow::OnRightKey()
else else
{ {
wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow); wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow);
if ( !node )
return;
if ( node->HasChildren() ) if ( node->HasChildren() )
{ {