void wxGxTreeViewBase::OnChar(wxKeyEvent& event) { if(event.GetModifiers() & wxMOD_ALT) return; if(event.GetModifiers() & wxMOD_CONTROL) return; if(event.GetModifiers() & wxMOD_SHIFT) return; switch(event.GetKeyCode()) { case WXK_DELETE: case WXK_NUMPAD_DELETE: if(m_pDeleteCmd) m_pDeleteCmd->OnClick(); break; case WXK_UP: SelectItem(GetPrevVisible(GetSelection())); break; case WXK_DOWN: SelectItem(GetNextVisible(GetSelection())); break; default: break; } }
void CMultiSelTreeCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { MainFrame()->SetGotUserInput( ); if (nChar == VK_RETURN || nChar == VK_APPS) return; if (nChar == VK_TAB && m_CtrlDown) // Ctrl+TAB switches to opposite pane { BOOL bShift = m_ShiftDown; m_CtrlDown= m_ShiftDown= FALSE; // clear these because we may miss the Up m_PendingKeyedDeselect = FALSE; // in the other pane MainFrame()->SwitchPanes(DYNAMIC_DOWNCAST(CView, GetParent()), bShift); return; } if( nChar == VK_CONTROL ) m_CtrlDown= TRUE; else if( nChar == VK_SHIFT ) { m_ShiftDown= TRUE; if( m_SelectionSet.GetSize() > 0 ) { m_AnchorItem= m_LastSelect; m_PendingKeyedDeselect= TRUE; } } if( m_ShiftDown && m_SelectionSet.GetSize() > 0 ) { // Try to range select, and scroll the tree only as necessary // to ensure that the last item selected is visible switch( nChar ) { case VK_DOWN: ExpandSelection( -1 ); break; case VK_UP: ExpandSelection( 1 ); break; case VK_END: ExpandSelection( - (int) GetCount() ); break; case VK_HOME: ExpandSelection( (int) GetCount() ); break; case VK_PGDN: ExpandSelection( - (int) GetVisibleCount() +1 ); break; case VK_PGUP: ExpandSelection( (int) GetVisibleCount() -1 ); break; default: break; } } else if( m_CtrlDown || m_SelectionSet.GetSize() == 0) { // Scroll the tree, but do not fool with the selection set // or move a focus rect around switch( nChar ) { case VK_DOWN: ScrollTree( -1 ); break; case VK_UP: ScrollTree( 1 ); break; case VK_END: ScrollTree( - (int) GetCount() ); break; case VK_HOME: ScrollTree( GetCount() ); break; case VK_PGDN: ScrollTree( - (int) GetVisibleCount() +1 ); break; case VK_PGUP: ScrollTree( GetVisibleCount() -1 ); break; default: break; } } else { // Deselect all, reposition at m_LastSelect + offset, reselect the new // item, and ensure visible HTREEITEM item= m_LastSelect; ASSERT( item != NULL ); HTREEITEM newItem; UnselectAll(); #if 0 HTREEITEM lastItem; int i, count; #endif switch( nChar ) { case VK_END: ScrollTree( - (int) GetCount() ); newItem= GetNextItem(TVI_ROOT, TVGN_LASTVISIBLE); break; case VK_HOME: ScrollTree( GetCount() ); newItem= GetNextItem(TVI_ROOT, TVGN_ROOT ); break; #if 0 // This code was removed to fix job004105 - removing it causes the DepotView to behave like a normal TreeView when page-up and page-down are pressed case VK_PGDN: count=GetVisibleCount() - 1; newItem= GetFirstVisible(); // First, find the last visible item on the screen for( i=0; i< count; i++) { lastItem= newItem; newItem= GetNextVisible(newItem ); if( newItem == NULL ) { newItem= lastItem; break; } } // If current item is the last one on the screen, move down // a page beyond the end of current page if( newItem == item ) { for( i=0; i< count; i++) { lastItem= newItem; newItem= GetNextVisible( newItem ); if( newItem==NULL) { newItem= lastItem; break; } } } break; case VK_PGUP: if( item == GetFirstVisible() ) { count=GetVisibleCount() - 1; newItem= GetFirstVisible(); for( i=0; i< count; i++) { lastItem= newItem; newItem= GetPrevVisible( newItem ); if( newItem==NULL) { newItem= lastItem; break; } } } else newItem= GetFirstVisible(); break; #endif default: newItem= NULL; break; } // If something went wrong, like hitting top or bottom, // use our saved copy of m_LastSelect if( newItem == NULL ) newItem= item; if(newItem != NULL ) { SetSelectState( newItem, TRUE ); EnsureVisible( newItem ); // Redraw w/out erase to avoid slow video update RedrawWindow( NULL, NULL, RDW_UPDATENOW ); } } if (!m_CtrlDown && !m_ShiftDown) CTreeCtrl::OnKeyDown(nChar, nRepCnt, nFlags); }
/* Under all platforms there is no reaction when pressing "ENTER". Expected would be e.g. to open the file in an editor. */ void cbTreeCtrl::OnKeyDown(wxKeyEvent& event) { // Don't care about special key combinations if ( !this || (event.GetModifiers()!=wxMOD_NONE) ) { event.Skip(); return; } wxArrayTreeItemIds selections; // Don't care if no selection has been made if ( GetSelections(selections)<1 ) { event.Skip(); return; } long keycode = event.GetKeyCode(); wxTreeItemId itemId = selections[0]; // Don't care if item is invalid if ( !itemId.IsOk() ) { event.Skip(); return; } switch (keycode) { case WXK_RETURN: case WXK_NUMPAD_ENTER: { wxTreeEvent te = wxTreeEvent(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, this, itemId); wxPostEvent(this, te); break; } #ifndef __WXMSW__ /* Under wxGTK, there is no navigation possible using cursor keys. */ case WXK_UP: { wxTreeItemId itemIdPrev = GetPrevVisible(itemId); if (itemIdPrev.IsOk()) { SelectItem(itemId, false); SelectItem(itemIdPrev, true); } else { wxTreeItemId itemIdParent = GetItemParent(itemId); if (itemIdParent.IsOk()) { SelectItem(itemId, false); SelectItem(itemIdParent, true); } } break; } case WXK_DOWN: { wxTreeItemId itemIdNext = GetNextVisible(itemId); if (itemIdNext.IsOk()) { SelectItem(itemId, false); SelectItem(itemIdNext, true); } break; } case WXK_LEFT: { if ( ItemHasChildren(itemId) && IsExpanded(itemId) ) Collapse(itemId); else { wxTreeItemId itemIdParent = GetItemParent(itemId); if (itemIdParent.IsOk()) { SelectItem(itemId, false); SelectItem(itemIdParent, true); } } break; } case WXK_RIGHT: { if ( ItemHasChildren(itemId) && !IsExpanded(itemId) ) Expand(itemId); else { wxTreeItemIdValue cookie; wxTreeItemId itemIdChild = GetFirstChild(itemId, cookie); if (itemIdChild.IsOk()) { SelectItem(itemId, false); SelectItem(itemIdChild, true); } } break; } #endif // !__WXMSW__ default: event.Skip(); } }