Fix keyboard navigation in wxGrid with hidden columns.

The hidden columns (i.e. those whose size was set to 0) should be skipped when
find the previous/next column to select when the user presses Left/Right
cursor arrow keys in wxGrid, otherwise the focus could completely disappear as
it was invisible when it was set to a hidden column.

Closes #13281.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68303 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2011-07-19 22:35:37 +00:00
parent 3e88d48700
commit b64bb3ca1b
2 changed files with 57 additions and 6 deletions

View File

@ -440,6 +440,7 @@ Major new features in this release
All (GUI): All (GUI):
- Support float, double and file name values in wxGenericValidator (troelsk). - Support float, double and file name values in wxGenericValidator (troelsk).
- Fix keyboard navigation in wxGrid with hidden columns (ivan_14_32).
OSX: OSX:

View File

@ -760,6 +760,12 @@ protected:
return m_oper.GetLineAt(m_grid, pos); return m_oper.GetLineAt(m_grid, pos);
} }
// Check if the given line is visible, i.e. has non 0 size.
bool IsLineVisible(int line) const
{
return m_oper.GetLineSize(m_grid, line) != 0;
}
wxGrid * const m_grid; wxGrid * const m_grid;
const wxGridOperations& m_oper; const wxGridOperations& m_oper;
@ -777,14 +783,38 @@ public:
{ {
wxASSERT_MSG( m_oper.Select(coords) >= 0, "invalid row/column" ); wxASSERT_MSG( m_oper.Select(coords) >= 0, "invalid row/column" );
return GetLinePos(coords) == 0; int pos = GetLinePos(coords);
while ( pos )
{
// Check the previous line.
int line = GetLineAt(--pos);
if ( IsLineVisible(line) )
{
// There is another visible line before this one, hence it's
// not at boundary.
return false;
}
}
// We reached the boundary without finding any visible lines.
return true;
} }
virtual void Advance(wxGridCellCoords& coords) const virtual void Advance(wxGridCellCoords& coords) const
{ {
wxASSERT( !IsAtBoundary(coords) ); int pos = GetLinePos(coords);
for ( ;; )
{
// This is not supposed to happen if IsAtBoundary() returned false.
wxCHECK_RET( pos, "can't advance when already at boundary" );
m_oper.Set(coords, GetLineAt(GetLinePos(coords) - 1)); int line = GetLineAt(--pos);
if ( IsLineVisible(line) )
{
m_oper.Set(coords, line);
break;
}
}
} }
virtual int MoveByPixelDistance(int line, int distance) const virtual int MoveByPixelDistance(int line, int distance) const
@ -794,6 +824,8 @@ public:
} }
}; };
// Please refer to the comments above when reading this class code, it's
// absolutely symmetrical to wxGridBackwardOperations.
class wxGridForwardOperations : public wxGridDirectionOperations class wxGridForwardOperations : public wxGridDirectionOperations
{ {
public: public:
@ -807,14 +839,32 @@ public:
{ {
wxASSERT_MSG( m_oper.Select(coords) < m_numLines, "invalid row/column" ); wxASSERT_MSG( m_oper.Select(coords) < m_numLines, "invalid row/column" );
return GetLinePos(coords) == m_numLines - 1; int pos = GetLinePos(coords);
while ( pos < m_numLines - 1 )
{
int line = GetLineAt(++pos);
if ( IsLineVisible(line) )
return false;
}
return true;
} }
virtual void Advance(wxGridCellCoords& coords) const virtual void Advance(wxGridCellCoords& coords) const
{ {
wxASSERT( !IsAtBoundary(coords) ); int pos = GetLinePos(coords);
for ( ;; )
{
wxCHECK_RET( pos < m_numLines - 1,
"can't advance when already at boundary" );
m_oper.Set(coords, GetLineAt(GetLinePos(coords) + 1)); int line = GetLineAt(++pos);
if ( IsLineVisible(line) )
{
m_oper.Set(coords, line);
break;
}
}
} }
virtual int MoveByPixelDistance(int line, int distance) const virtual int MoveByPixelDistance(int line, int distance) const