⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leftview.cpp

📁 CodezBank is just a small application that stores source code snippets organized in a hierarhichal m
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

///////////////////////////////////////////////
/// 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 + -