void CTreeFileCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) { TV_DISPINFO* pDispInfo = (TV_DISPINFO*)pNMHDR; if (pDispInfo->item.pszText) { SHFILEOPSTRUCT shfo; ZeroMemory(&shfo, sizeof(SHFILEOPSTRUCT)); shfo.hwnd = AfxGetMainWnd()->GetSafeHwnd(); shfo.wFunc = FO_RENAME; shfo.fFlags = FOF_ALLOWUNDO; CString sFrom = ItemToPath(pDispInfo->item.hItem); int nFromLength = sFrom.GetLength(); TCHAR* pszFrom = new TCHAR[nFromLength + 2]; _tcscpy(pszFrom, sFrom); pszFrom[nFromLength+1] = _T('\0'); shfo.pFrom = pszFrom; HTREEITEM hParent = GetParentItem(pDispInfo->item.hItem); CString sParent = ItemToPath(hParent); CString sTo; if (IsDrive(sParent)) sTo = sParent + pDispInfo->item.pszText; else sTo = sParent + _T("\\") + pDispInfo->item.pszText; int nToLength = _tcslen(sTo); TCHAR* pszTo = new TCHAR[nToLength + 2]; _tcscpy(pszTo, sTo); pszTo[nToLength+1] = _T('\0'); shfo.pTo = pszTo; //Let the shell perform the actual rename if (SHFileOperation(&shfo) == 0 && shfo.fAnyOperationsAborted == FALSE) { *pResult = TRUE; //Update its text SetItemText(pDispInfo->item.hItem, pDispInfo->item.pszText); //Also update the icons for it CString sPath = ItemToPath(pDispInfo->item.hItem); SetItemImage(pDispInfo->item.hItem, GetIconIndex(sPath), GetSelIconIndex(sPath)); } //Don't forget to free up the memory we allocated delete [] pszFrom; delete [] pszTo; } *pResult = 0; }
void CTreeFileCtrl::ExpandFill() { HTREEITEM hSelItem = GetSelectedItem(); CString sItem = ItemToPath(hSelItem); if (sItem.GetLength()) hSelItem = SetSelectedPath(sItem, TRUE); OnViewRefresh(); }
void CTreeFileCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; if (pNMTreeView->action == TVE_EXPAND) { //Add the new items to the tree if it does not have any child items //already if (!GetChildItem(pNMTreeView->itemNew.hItem)) { CString sPath = ItemToPath(pNMTreeView->itemNew.hItem); DisplayPath(sPath, pNMTreeView->itemNew.hItem); } } *pResult = 0; }
BOOL CTreeFileCtrl::Open(HTREEITEM hItem) { BOOL bSuccess = FALSE; if (hItem && m_bAllowOpen) { //Show the "properties" for the selected file CString sFile = ItemToPath(hItem); SHELLEXECUTEINFO sei; ZeroMemory(&sei,sizeof(sei)); sei.cbSize = sizeof(sei); sei.hwnd = AfxGetMainWnd()->GetSafeHwnd(); sei.nShow = SW_SHOW; sei.lpFile = sFile.GetBuffer(sFile.GetLength()); sei.fMask = SEE_MASK_INVOKEIDLIST; bSuccess = ShellExecuteEx(&sei); sFile.ReleaseBuffer(); } return bSuccess; }
void CTreeFileCtrl::OnViewRefresh() { SetRedraw(FALSE); //Get the item which is currently selected HTREEITEM hSelItem = GetSelectedItem(); CString sItem = ItemToPath(hSelItem); BOOL bExpanded = (GetChildItem(hSelItem) != NULL); //Display the folder items in the tree if (m_sRootFolder.IsEmpty()) DisplayDrives(TVI_ROOT, FALSE); else DisplayPath(m_sRootFolder, TVI_ROOT, FALSE); //Reselect the initially selected item if (sItem.GetLength()) hSelItem = SetSelectedPath(sItem, bExpanded); SetRedraw(TRUE); }
LRESULT FolderTree::OnItemExpanding(int /*idCtrl*/, LPNMHDR pnmh, BOOL &bHandled) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pnmh; if (pNMTreeView->action == TVE_EXPAND) { bool bHasPlus = HasPlusButton(pNMTreeView->itemNew.hItem); bool bHasChildren = (GetChildItem(pNMTreeView->itemNew.hItem) != NULL); if (bHasPlus && !bHasChildren) DoExpand(pNMTreeView->itemNew.hItem); } else if(pNMTreeView->action == TVE_COLLAPSE) { FolderTreeItemInfo* pItem = (FolderTreeItemInfo*) GetItemData(pNMTreeView->itemNew.hItem); //ASSERT(pItem); //Display an hour glass as this may take some time //CWaitCursor wait; tstring sPath = ItemToPath(pNMTreeView->itemNew.hItem); //Collapse the node and remove all the child items from it Expand(pNMTreeView->itemNew.hItem, TVE_COLLAPSE); //Never uppdate the child indicator for a network node which is not a share bool bUpdateChildIndicator = true; if (pItem->m_bNetworkNode) { if (pItem->m_pNetResource) bUpdateChildIndicator = (pItem->m_pNetResource->dwDisplayType == RESOURCEDISPLAYTYPE_SHARE); else bUpdateChildIndicator = false; } DeleteChildren(pNMTreeView->itemNew.hItem, bUpdateChildIndicator); } bHandled = FALSE; //Allow the message to be reflected again return 0; }
BOOL CTreeFileCtrl::Delete(HTREEITEM hItem) { BOOL bSuccess = FALSE; if (!IsDrive(hItem) && m_bAllowDelete) { //Create a Multi SZ string with the filename to delete CString sFileToDelete = ItemToPath(hItem); int nChars = sFileToDelete.GetLength() + 1; nChars++; SHFILEOPSTRUCT shfo; ZeroMemory(&shfo, sizeof(SHFILEOPSTRUCT)); shfo.hwnd = AfxGetMainWnd()->GetSafeHwnd(); shfo.wFunc = FO_DELETE; //Undo is not allowed if the SHIFT key is held down if (!(GetKeyState(VK_SHIFT) & 0x8000)) shfo.fFlags = FOF_ALLOWUNDO; TCHAR* pszFrom = new TCHAR[nChars]; TCHAR* pszCur = pszFrom; _tcscpy(pszCur, sFileToDelete); pszCur[nChars-1] = _T('\0'); shfo.pFrom = pszFrom; //Let the shell perform the actual deletion if (SHFileOperation(&shfo) == 0 && shfo.fAnyOperationsAborted == FALSE) { //Delete the item from the view bSuccess = DeleteItem(hItem); } //Free up the memory we had allocated delete [] pszFrom; } return bSuccess; }
bool FolderTree::IsDrive(HTREEITEM hItem) { return IsDrive(ItemToPath(hItem)); }
void FolderTree::Refresh() { //Just in case this will take some time //CWaitCursor wait; SetRedraw(FALSE); //Get the item which is currently selected HTREEITEM hSelItem = GetSelectedItem(); tstring sItem; bool bExpanded = false; if (hSelItem) { sItem = ItemToPath(hSelItem); bExpanded = IsExpanded(hSelItem); } theSharedEnumerator.Refresh(); //Remove all nodes that currently exist Clear(); //Display the folder items in the tree if (m_sRootFolder.empty()) { //Should we insert a "My Computer" node if (m_bShowMyComputer) { FolderTreeItemInfo* pItem = new FolderTreeItemInfo; pItem->m_bNetworkNode = false; int nIcon = 0; int nSelIcon = 0; //Get the localized name and correct icons for "My Computer" LPITEMIDLIST lpMCPidl; if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &lpMCPidl))) { SHFILEINFO sfi; if (SHGetFileInfo((LPCTSTR)lpMCPidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_DISPLAYNAME)) pItem->m_sRelativePath = sfi.szDisplayName; nIcon = GetIconIndex(lpMCPidl); nSelIcon = GetSelIconIndex(lpMCPidl); //Free up the pidl now that we are finished with it //ASSERT(m_pMalloc); m_pMalloc->Free(lpMCPidl); m_pMalloc->Release(); } //Add it to the tree control m_hMyComputerRoot = InsertFileItem(TVI_ROOT, pItem, false, nIcon, nSelIcon, false); SetHasSharedChildren(m_hMyComputerRoot); } //Display all the drives if (!m_bShowMyComputer) DisplayDrives(TVI_ROOT, false); //Display homegroup /*if (m_bDisplayNetwork) { FolderTreeItemInfo* pItem = new FolderTreeItemInfo; //pItem-> = true; int nIcon = 0; int nSelIcon = 0; //Get the localized name and correct icons for "Network Neighborhood" LPITEMIDLIST lpNNPidl; //SHGetKnownFolderIDList(FOLDERID_HomeGroup, 0, NULL, &lpNNPidl); if (SUCCEEDED(SHGetKnownFolderIDList(FOLDERID_HomeGroup, 0, NULL, &lpNNPidl))) { SHFILEINFO sfi; if (SHGetFileInfo((LPCTSTR)lpNNPidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_DISPLAYNAME)) pItem->m_sRelativePath = sfi.szDisplayName; nIcon = GetIconIndex(lpNNPidl); nSelIcon = GetSelIconIndex(lpNNPidl); //Free up the pidl now that we are finished with it //ASSERT(m_pMalloc); m_pMalloc->Free(lpNNPidl); m_pMalloc->Release(); } //Add it to the tree control m_hHomegroupRoot = InsertFileItem(TVI_ROOT, pItem, false, nIcon, nSelIcon, false, shared); SetHasSharedChildren(m_hHomegroupRoot, shared); //checkRemovedDirs(Util::emptyStringT, TVI_ROOT, shared); }*/ //Also add network neighborhood if requested to do so if (m_bDisplayNetwork) { FolderTreeItemInfo* pItem = new FolderTreeItemInfo; pItem->m_bNetworkNode = true; int nIcon = 0; int nSelIcon = 0; //Get the localized name and correct icons for "Network Neighborhood" LPITEMIDLIST lpNNPidl; if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_NETWORK, &lpNNPidl))) { SHFILEINFO sfi; if (SHGetFileInfo((LPCTSTR)lpNNPidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_DISPLAYNAME)) pItem->m_sRelativePath = sfi.szDisplayName; nIcon = GetIconIndex(lpNNPidl); nSelIcon = GetSelIconIndex(lpNNPidl); //Free up the pidl now that we are finished with it //ASSERT(m_pMalloc); m_pMalloc->Free(lpNNPidl); m_pMalloc->Release(); } //Add it to the tree control m_hNetworkRoot = InsertFileItem(TVI_ROOT, pItem, false, nIcon, nSelIcon, false); SetHasSharedChildren(m_hNetworkRoot); //checkRemovedDirs(Util::emptyStringT, TVI_ROOT, shared); } } else { DisplayPath(m_sRootFolder, TVI_ROOT, false); } //Reselect the initially selected item if (hSelItem) SetSelectedPath(sItem, bExpanded); //Turn back on the redraw flag SetRedraw(true); }
BOOL CFileAndFolder::IsDrive(HTREEITEM hItem) { return IsDrive(ItemToPath(hItem)); }
BOOL CTreeFileCtrl::IsDrive(HTREEITEM hItem) { return IsDrive(ItemToPath(hItem)); }
BOOL CTreeFileCtrl::IsFolder(HTREEITEM hItem) { return IsFolder(ItemToPath(hItem)); }
CString CTreeFileCtrl::GetSelectedPath() { return ItemToPath(GetSelectedItem()); }
void CTreeFileCtrl::EndDragging(BOOL bCancel) { if (IsDragging()) { KillTimer(m_nTimerID); CImageList::DragLeave(this); CImageList::EndDrag(); ReleaseCapture(); delete m_pilDrag; m_pilDrag = NULL; //Remove drop target highlighting SelectDropTarget(NULL); m_hItemDrop = GetDropTarget(m_hItemDrop); if (m_hItemDrop == NULL) return; if (!bCancel) { //Also need to make the change on disk CString sFromPath = ItemToPath(m_hItemDrag); CString sToPath = ItemToPath(m_hItemDrop); int nFromLength = sFromPath.GetLength(); int nToLength = sToPath.GetLength(); SHFILEOPSTRUCT shfo; ZeroMemory(&shfo, sizeof(SHFILEOPSTRUCT)); shfo.hwnd = GetSafeHwnd(); if ((GetKeyState(VK_CONTROL) & 0x8000)) shfo.wFunc = FO_COPY; else shfo.wFunc = FO_MOVE; shfo.fFlags = FOF_SILENT | FOF_NOCONFIRMMKDIR; //Undo is not allowed if the SHIFT key is held down if (!(GetKeyState(VK_SHIFT) & 0x8000)) shfo.fFlags |= FOF_ALLOWUNDO; TCHAR* pszFrom = new TCHAR[nFromLength + 2]; _tcscpy(pszFrom, sFromPath); pszFrom[nFromLength+1] = _T('\0'); shfo.pFrom = pszFrom; TCHAR* pszTo = new TCHAR[nToLength + 2]; _tcscpy(pszTo, sToPath); pszTo[nToLength+1] = _T('\0'); shfo.pTo = pszTo; //Let the shell perform the actual deletion BOOL bSuccess = ((SHFileOperation(&shfo) == 0) && (shfo.fAnyOperationsAborted == FALSE)); //Free up the memory we had allocated delete [] pszFrom; delete [] pszTo; if (bSuccess) { //Only copy the item in the tree if there is not an item with the same //text under m_hItemDrop CString sText = GetItemText(m_hItemDrag); if (!HasChildWithText(m_hItemDrop, sText)) { //Do the actual copy BOOL bHadChildren = (GetChildItem(m_hItemDrop) != NULL); CopyBranch(m_hItemDrag, m_hItemDrop); //Update the children indicator for the folder we just dropped into if (!bHadChildren) { TV_ITEM tvItem; tvItem.hItem = m_hItemDrop; tvItem.mask = TVIF_CHILDREN; tvItem.cChildren = 1; SetItem(&tvItem); } } BOOL bExpanded = (GetChildItem(m_hItemDrop) != NULL); if (shfo.wFunc == FO_MOVE) { //Get the parent of the item we moved prior to deleting it HTREEITEM hParent = GetParentItem(m_hItemDrag); //Delete the item we just moved DeleteItem(m_hItemDrag); //Update the children indicator for the item we just dragged from BOOL bHasChildren = (GetChildItem(hParent) != NULL); if (hParent && !bHasChildren) { TV_ITEM tvItem; tvItem.hItem = hParent; tvItem.mask = TVIF_CHILDREN; tvItem.cChildren = 0; SetItem(&tvItem); } } SetSelectedPath(sToPath, bExpanded); } } } }