+
+ switch (event.KeyCode())
+ {
+ case WXK_UP:
+ {
+ wxNode *node = m_lines.Member( m_current )->Previous();
+ if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+ break;
+ }
+ case WXK_DOWN:
+ {
+ wxNode *node = m_lines.Member( m_current )->Next();
+ if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+ break;
+ }
+ case WXK_END:
+ {
+ wxNode *node = m_lines.Last();
+ OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+ break;
+ }
+ case WXK_HOME:
+ {
+ wxNode *node = m_lines.First();
+ OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+ break;
+ }
+ case WXK_PRIOR:
+ {
+ int steps = 0;
+ if (m_mode & wxLC_REPORT)
+ {
+ steps = m_visibleLines-1;
+ }
+ else
+ {
+ int pos = 0;
+ wxNode *node = m_lines.First();
+ for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); }
+ steps = pos % m_visibleLines;
+ }
+ wxNode *node = m_lines.Member( m_current );
+ for (int i = 0; i < steps; i++) if (node->Previous()) node = node->Previous();
+ if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+ break;
+ }
+ case WXK_NEXT:
+ {
+ int steps = 0;
+ if (m_mode & wxLC_REPORT)
+ {
+ steps = m_visibleLines-1;
+ }
+ else
+ {
+ int pos = 0; wxNode *node = m_lines.First();
+ for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); }
+ steps = m_visibleLines-(pos % m_visibleLines)-1;
+ }
+ wxNode *node = m_lines.Member( m_current );
+ for (int i = 0; i < steps; i++) if (node->Next()) node = node->Next();
+ if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+ break;
+ }
+ case WXK_LEFT:
+ {
+ if (!(m_mode & wxLC_REPORT))
+ {
+ wxNode *node = m_lines.Member( m_current );
+ for (int i = 0; i <m_visibleLines; i++) if (node->Previous()) node = node->Previous();
+ if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+ }
+ break;
+ }
+ case WXK_RIGHT:
+ {
+ if (!(m_mode & wxLC_REPORT))
+ {
+ wxNode *node = m_lines.Member( m_current );
+ for (int i = 0; i <m_visibleLines; i++) if (node->Next()) node = node->Next();
+ if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+ }
+ break;
+ }
+ case WXK_SPACE:
+ {
+ m_current->ReverseHilight();
+ RefreshLine( m_current );
+ break;
+ }
+ case WXK_INSERT:
+ {
+ if (!(m_mode & wxLC_SINGLE_SEL))
+ {
+ wxListLineData *oldCurrent = m_current;
+ m_current->ReverseHilight();
+ wxNode *node = m_lines.Member( m_current )->Next();
+ if (node) m_current = (wxListLineData*)node->Data();
+ MoveToFocus();
+ RefreshLine( oldCurrent );
+ RefreshLine( m_current );
+ UnfocusLine( oldCurrent );
+ FocusLine( m_current );
+ }
+ break;
+ }
+ case WXK_RETURN:
+ case WXK_EXECUTE:
+ {
+ wxListEvent le( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, GetParent()->GetId() );
+ le.SetEventObject( GetParent() );
+ le.m_itemIndex = GetIndexOfLine( m_current );
+ m_current->GetItem( 0, le.m_item );
+ GetParent()->GetEventHandler()->ProcessEvent( le );
+ break;
+ }
+ default:
+ {
+ event.Skip();
+ return;
+ }
+ }
+ m_usedKeys = TRUE;