📄 leftview.cpp
字号:
}
///////////////////////////////////////////////
/// recursive select function
///
///////////////////////////////////////////////
HTREEITEM CLeftView::DoSelect(HTREEITEM hStart, CCodeNode* pNode)
{
CTreeCtrl& tree = GetTreeCtrl();
if(hStart == NULL)
return NULL;
if(tree.GetItemData(hStart) == (DWORD_PTR)pNode)
{
tree.Select(hStart, TVGN_CARET);
tree.EnsureVisible(hStart);
return hStart;
}
hStart = tree.GetChildItem(hStart);
do
{
HTREEITEM hti;
if((hti = DoSelect(hStart, pNode)) != NULL)
return hti;
} while((hStart = tree.GetNextItem(hStart, TVGN_NEXT)) != NULL);
return NULL;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
HTREEITEM CLeftView::DoRemove(HTREEITEM hStart, CCodeNode* pNode)
{
CTreeCtrl& tree = GetTreeCtrl();
if(hStart == NULL)
return NULL;
if(tree.GetItemData(hStart) == (DWORD_PTR)pNode)
{
tree.DeleteItem(hStart);
return hStart;
}
hStart = tree.GetChildItem(hStart);
do
{
HTREEITEM hti;
if((hti = DoRemove(hStart, pNode)) != NULL)
return hti;
} while((hStart = tree.GetNextItem(hStart, TVGN_NEXT)) != NULL);
return NULL;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::MoveUp(void)
{
HTREEITEM hSel = GetTreeCtrl().GetSelectedItem();
HTREEITEM hParent = GetTreeCtrl().GetParentItem(hSel);
if(hParent)
{
GetTreeCtrl().Select(hParent, TVGN_CARET);
GetTreeCtrl().EnsureVisible(hParent);
}
else
{
GetTreeCtrl().SelectItem(NULL);
GetDocument()->UpdateAllViews(this, hintRefreshListView);
}
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::OnEditDelete()
{
HTREEITEM hSel = GetTreeCtrl().GetSelectedItem();
DWORD_PTR dwData = GetTreeCtrl().GetItemData(hSel);
CCodeNode* pNode = reinterpret_cast<CCodeNode*>(dwData);
if(Ask(MB_YESNO, "Are you sure you want to delete '%s' and all subitems?", pNode->m_strName) == IDNO)
return;
GetDocument()->DeleteNode(pNode);
GetTreeCtrl().DeleteItem(hSel);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::OnUpdateEditDelete(CCmdUI *pCmdUI)
{
pCmdUI->Enable(GetTreeCtrl().GetSelectedItem() != NULL);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::OnContextMenu(CWnd* pWnd, CPoint point)
{
if (point.x == -1 && point.y == -1)
{
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_TREE_CONTEXT));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnRButtonDown(UINT nFlags, CPoint point)
{
CTreeView::OnRButtonDown(nFlags, point);
ClientToScreen(&point);
OnContextMenu(this, point);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::FindString(LPCTSTR lpString, BOOL bDown, BOOL bCaseSensitve, BOOL bWholeWord)
{
HTREEITEM hSel = GetTreeCtrl().GetSelectedItem();
CCodeNode* pNode = NULL;
if(hSel)
pNode = reinterpret_cast<CCodeNode*>(GetTreeCtrl().GetItemData(hSel));
GetDocument()->FindString(pNode, lpString, bDown, bCaseSensitve, bWholeWord);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnTvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
*pResult = 0;
m_hDrag = pNMTreeView->itemNew.hItem;
m_hDrop = NULL;
m_pDragImage = GetTreeCtrl().CreateDragImage(m_hDrag); // get the image list for dragging
// CreateDragImage() returns NULL if no image list
// associated with the tree view control
if( !m_pDragImage )
return;
m_bLDragging = TRUE;
m_pDragImage->BeginDrag(0, CPoint(0,-15));
POINT pt = pNMTreeView->ptDrag;
ClientToScreen( &pt );
m_pDragImage->DragEnter(NULL, pt);
SetCapture();
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnMouseMove(UINT nFlags, CPoint point)
{
HTREEITEM hitem;
UINT flags;
if (m_bLDragging)
{
POINT pt = point;
ClientToScreen( &pt );
CImageList::DragMove(pt);
if ((hitem = GetTreeCtrl().HitTest(point, &flags)) != NULL)
{
CImageList::DragShowNolock(FALSE);
GetTreeCtrl().SelectDropTarget(hitem);
m_hDrop = hitem;
CImageList::DragShowNolock(TRUE);
}
}
CTreeView::OnMouseMove(nFlags, point);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnLButtonUp(UINT nFlags, CPoint point)
{
CTreeView::OnLButtonUp(nFlags, point);
if (m_bLDragging)
{
m_bLDragging = FALSE;
CImageList::DragLeave(this);
CImageList::EndDrag();
ReleaseCapture();
delete m_pDragImage;
// Remove drop target highlighting
GetTreeCtrl().SelectDropTarget(NULL);
if( m_hDrag == m_hDrop )
return;
// If Drag item is an ancestor of Drop item then return
HTREEITEM htiParent = m_hDrop;
while( (htiParent = GetTreeCtrl().GetParentItem( htiParent )) != NULL )
{
if( htiParent == m_hDrag )
return;
}
GetTreeCtrl().Expand( m_hDrop, TVE_EXPAND ) ;
HTREEITEM htiNew = CopyBranch( m_hDrag, m_hDrop, TVI_LAST );
GetTreeCtrl().DeleteItem(m_hDrag);
GetTreeCtrl().SelectItem( htiNew );
}
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
HTREEITEM CLeftView::CopyBranch( HTREEITEM htiBranch, HTREEITEM htiNewParent,
HTREEITEM htiAfter /*= TVI_LAST*/ )
{
HTREEITEM hChild;
HTREEITEM hNewItem = CopyItem( htiBranch, htiNewParent, htiAfter );
hChild = GetTreeCtrl().GetChildItem(htiBranch);
while( hChild != NULL)
{
// recursively transfer all the items
CopyBranch(hChild, hNewItem);
hChild = GetTreeCtrl().GetNextSiblingItem( hChild );
}
return hNewItem;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
HTREEITEM CLeftView::CopyItem( HTREEITEM hItem, HTREEITEM htiNewParent,
HTREEITEM htiAfter /*= TVI_LAST*/ )
{
TV_INSERTSTRUCT tvstruct;
HTREEITEM hNewItem;
//CString sText;
// get information of the source item
tvstruct.item.hItem = hItem;
tvstruct.item.mask = TVIF_CHILDREN | TVIF_HANDLE |
TVIF_IMAGE | TVIF_SELECTEDIMAGE;
GetTreeCtrl().GetItem(&tvstruct.item);
// sText = GetTreeCtrl().GetItemText( hItem );
//tvstruct.item.cchTextMax = sText.GetLength();
//tvstruct.item.pszText = sText.LockBuffer();
tvstruct.item.pszText = LPSTR_TEXTCALLBACK;
// Insert the item at proper location
tvstruct.hParent = htiNewParent;
tvstruct.hInsertAfter = htiAfter;
tvstruct.item.mask = m_nMask;
hNewItem = GetTreeCtrl().InsertItem(&tvstruct);
// sText.ReleaseBuffer();
// Now copy item data and item state.
GetTreeCtrl().SetItemData( hNewItem, GetTreeCtrl().GetItemData( hItem ));
GetTreeCtrl().SetItemState( hNewItem, GetTreeCtrl().GetItemState( hItem, TVIS_STATEIMAGEMASK ),
TVIS_STATEIMAGEMASK );
// Call virtual function to allow further processing in derived class
OnItemCopied(hItem, hNewItem);
return hNewItem;
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void CLeftView::OnItemCopied(HTREEITEM hItem, HTREEITEM hNewItem)
{
DWORD_PTR dwData = GetTreeCtrl().GetItemData(hItem);
CCodeNode* pNode = reinterpret_cast<CCodeNode*>(dwData);
// remove this node from list collection and keep the ptr
GetDocument()->DeleteNode(pNode, false);
HTREEITEM hParent = GetTreeCtrl().GetParentItem(hNewItem);
DWORD_PTR dwDataNew = GetTreeCtrl().GetItemData(hParent);
CCodeNode* pParentNode = reinterpret_cast<CCodeNode*>(dwDataNew);
pParentNode->m_lstChildren.AddTail(pNode);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnEditRename()
{
HTREEITEM hItem = GetTreeCtrl().GetSelectedItem();
if(hItem)
GetTreeCtrl().EditLabel(hItem);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnUpdateEditRename(CCmdUI *pCmdUI)
{
pCmdUI->Enable(GetTreeCtrl().GetSelectedItem() != NULL);
}
///////////////////////////////////////////////
///
///
///////////////////////////////////////////////
void Views::CLeftView::OnUpdateViewUponelevel(CCmdUI *pCmdUI)
{
pCmdUI->Enable(GetTreeCtrl().GetSelectedItem() != NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -