void OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); wxTreeCtrl::OnPaint(event); // Reset the device origin since it may have been set dc.SetDeviceOrigin(0, 0); wxPen pen(wxColour(_T("BLACK")), 1, wxSOLID); dc.SetPen(pen); dc.SetBrush(* wxTRANSPARENT_BRUSH); wxSize clientSize = GetClientSize(); wxRect itemRect; int cy=0; wxTreeItemId h, lastH; for(h=GetFirstVisibleItem();h;h=GetNextVisible(h)) { if (h.IsOk() && GetBoundingRect(h, itemRect)) { cy = itemRect.GetTop(); dc.DrawLine(0, cy, clientSize.x, cy); lastH = h; } } if (lastH.IsOk() && GetBoundingRect(lastH, itemRect)) { cy = itemRect.GetBottom(); dc.DrawLine(0, cy, clientSize.x, cy); } }
void CppSymbolTree::AdvanceSelection(bool forward) { wxTreeItemId item = GetSelection(); if (!item.IsOk()) { return; } wxTreeItemId nextItem; if (forward) { nextItem = GetNextVisible(item); if ( !nextItem.IsOk() ) { // we could not get the next visible, try the next sibling nextItem = GetNextSibling(item); if ( !nextItem.IsOk() ) { // we are the last child... try the sibling of our parent wxTreeItemId parent = GetItemParent(item); if ( !parent.IsOk() ) { return; } nextItem = GetNextSibling(parent); } } } else { nextItem = TryGetPrevItem(item); } if (nextItem.IsOk()) { SelectItem(nextItem); } }
/* * Paint the row lines. */ void CScrolledTreeCtrl::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); wxTreeCtrl::OnPaint(event); if (! m_drawRowLines) return; // Reset the device origin since it may have been set dc.SetDeviceOrigin(0, 0); wxPen pen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT), 1, wxSOLID); dc.SetPen(pen); dc.SetBrush(* wxTRANSPARENT_BRUSH); wxSize clientSize = GetClientSize(); wxRect itemRect; int cy=0; wxTreeItemId h, lastH; for(h = GetFirstVisibleItem(); h.IsOk(); h = GetNextVisible(h)) { if (GetBoundingRect(h, itemRect)) { cy = itemRect.GetTop(); dc.DrawLine(0, cy, clientSize.x, cy); lastH = h; } if (!IsVisible(h)) { break; } } if (lastH.IsOk() && GetBoundingRect(lastH, itemRect)) { cy = itemRect.GetBottom(); dc.DrawLine(0, cy, clientSize.x, cy); } }
wxTreeItemId PHPFileLayoutTree::TryGetPrevItem(wxTreeItemId item) { wxCHECK_MSG(item.IsOk(), wxTreeItemId(), wxT("invalid tree item")); // find out the starting point wxTreeItemId prevItem = GetPrevSibling(item); if(!prevItem.IsOk()) { prevItem = GetItemParent(item); if(prevItem == GetRootItem()) { return wxTreeItemId(); } } // from there we must be able to navigate until this item while(prevItem.IsOk()) { ScrollTo(prevItem); if(!IsVisible(prevItem)) { return wxTreeItemId(); } const wxTreeItemId nextItem = GetNextVisible(prevItem); if(!nextItem.IsOk() || nextItem == item) return prevItem; prevItem = nextItem; } return wxTreeItemId(); }
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; } }
CTreeNode *CTreeNode::GetNextVisibleItem() const { WTL::CTreeItem next(GetNextVisible()); if ( next.IsNull() ) return 0; else return (CTreeNode *)next.GetData(); }
wxTreeItemId wxTreeCtrlEx::GetBottomItem() const { wxTreeItemId cur = GetFirstVisibleItem(); if (cur) { wxTreeItemId next; while ((next = GetNextVisible(cur)).IsOk()) { cur = next; } } return cur; }
void PHPFileLayoutTree::AdvanceSelection(bool forward) { wxTreeItemId item = GetSelection(); if(!item.IsOk()) { return; } wxTreeItemId nextItem; if(forward) { // Item is visible, scroll to it to make sure GetNextVisible() wont // fail ScrollTo(item); nextItem = GetNextVisible(item); } else { nextItem = TryGetPrevItem(item); } if(nextItem.IsOk()) { SelectItem(nextItem); } }
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(); } }
index_t CStandardLayoutNodeList::GetFirstVisible (const CRect& viewRect) const { return GetNextVisible (static_cast<index_t>(-1), viewRect); }