// RemoteTreeCtrl.cpp : implementation file // #include "stdafx.h" #include "ConsoleApp.h" #include "RemoteTreeCtrl.h" #include "MainFrm.h" #include "LocalView.h" #include "RemoteView.h" #include "BandwidthDlg.h" #include "VolumeInfoDlg.h" #include ".\remotetreectrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CString NumericFormat(__int64 nNumeric); CString BYTE2KMBYTE(__int64 nBytes, int nFlag, bool bShowDecimalPoint); bool IsPathItself(CString sSrcPath, CString sDstPath); ///////////////////////////////////////////////////////////////////////////// // CRemoteTreeCtrl CRemoteTreeCtrl::CRemoteTreeCtrl() { } CRemoteTreeCtrl::~CRemoteTreeCtrl() { } BEGIN_MESSAGE_MAP(CRemoteTreeCtrl, CTreeCtrl) //{{AFX_MSG_MAP(CRemoteTreeCtrl) //}}AFX_MSG_MAP ON_WM_CREATE() ON_NOTIFY_REFLECT(NM_RCLICK, OnNMRclick) ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag) // ON_WM_CONTEXTMENU() ON_COMMAND(ID_TREE_CUT, OnTreeCut) ON_COMMAND(ID_TREE_COPY, OnTreeCopy) ON_COMMAND(ID_TREE_PASTE, OnTreePaste) ON_COMMAND(ID_TREE_DELETE, OnTreeDelete) ON_COMMAND(ID_TREE_RENAME, OnTreeRename) ON_COMMAND(ID_TREE_SETANONY, OnTreeSetAnony) ON_COMMAND(ID_TREE_UNSETANONY, OnTreeUnsetAnony) ON_COMMAND(ID_TREE_SETBANDWIDTH, OnTreeSetBandwidth) ON_COMMAND(ID_TREE_INFO, OnTreeInfo) // ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnTvnEndlabeledit) // ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnTvnBeginlabeledit) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRemoteTreeCtrl message handlers BOOL CRemoteTreeCtrl::PreTranslateMessage(MSG* pMsg) { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); switch (pMsg->message) { case WM_SETFOCUS: case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: pmf->SetFocus(this); break; case WM_KEYDOWN: CEdit *edit = GetEditControl(); if (edit) { if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) { edit->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam); return TRUE; } } else if (pMsg->wParam == VK_F2) { HTREEITEM hti = GetSelectedItem(); if (!hti) return TRUE; if (!GetParentItem(hti)) return TRUE; EditLabel(hti); return TRUE; } else if (pMsg->wParam == VK_DELETE) { ((CRemoteView*)GetParent())->DeleteTreeItem(GetSelectedItem()); return TRUE; } else if (GetKeyState(VK_CONTROL) & 128) { if (pMsg->wParam == VK_C) { //2014.07.25 dadamin copy ±â´É Á¦°Å #ifdef _USE_COPY_ SetClipboard(GetSelectedItem(), CBS_COPY); #else AfxMessageBox(IDS_COPY_NOT_ALLOWD, MB_ICONERROR); #endif // _USE_COPY_ return TRUE; } else if (pMsg->wParam == VK_X) { SetClipboard(GetSelectedItem(), CBS_CUT); return TRUE; } else if (pMsg->wParam == VK_V) { PasteClipboard(GetSelectedItem()); return TRUE; } else if (pMsg->wParam == VK_D) { HTREEITEM hti = GetSelectedItem(); if (!hti || hti == GetRootItem() || GetParentItem(hti) == GetRootItem()) return TRUE; m_htiSelected = hti; OnTreeDelete(); return TRUE; } } } return CTreeCtrl::PreTranslateMessage(pMsg); } int CRemoteTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { // if (CTreeCtrl::OnCreate(lpCreateStruct) == -1) // return -1; m_dropTarget.Register(this); SHFILEINFO shfi; HIMAGELIST hil = (HIMAGELIST)SHGetFileInfo("", 0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); SetImageList(CImageList::FromHandle(hil), TVSIL_NORMAL); return 0; } void CRemoteTreeCtrl::OnNMRclick(NMHDR *pNMHDR, LRESULT *pResult) { DWORD dwPos = GetMessagePos(); CPoint pt(GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos)); CPoint ptHit = pt; ScreenToClient(&ptHit); if (m_htiSelected = HitTest(ptHit)) OnContextMenu(this, pt); *pResult = 0; } void CRemoteTreeCtrl::OnContextMenu(CWnd* pWnd, CPoint point) { if (m_htiSelected == GetRootItem()) return; CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); CMenu menu, *pmenu; menu.LoadMenu(IDR_POP_RTREE); pmenu = menu.GetSubMenu(0); ASSERT(pmenu != NULL); pmenu->SetMenuItemBitmaps(ID_TREE_CUT, MF_BYCOMMAND, &pmf->m_bmCut, &pmf->m_bmCut); //2014.07.25 dadamin copy ±â´É Á¦°Å #ifdef _USE_COPY_ pmenu->SetMenuItemBitmaps(ID_TREE_COPY, MF_BYCOMMAND, &pmf->m_bmCopy, &pmf->m_bmCopy); #endif // _USE_COPY_ pmenu->SetMenuItemBitmaps(ID_TREE_PASTE, MF_BYCOMMAND, &pmf->m_bmPaste, &pmf->m_bmPaste); PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)GetItemData(m_htiSelected); if (prti->nClass == TNS_VOLUME) { pmenu->EnableMenuItem(ID_TREE_CUT, MF_GRAYED); //2014.07.25 dadamin copy ±â´É Á¦°Å #ifdef _USE_COPY_ pmenu->EnableMenuItem(ID_TREE_COPY, MF_GRAYED); #endif // _USE_COPY_ pmenu->EnableMenuItem(ID_TREE_DELETE, MF_GRAYED); pmenu->EnableMenuItem(ID_TREE_RENAME, MF_GRAYED); pmenu->DeleteMenu(6, MF_BYPOSITION); pmenu->DeleteMenu(ID_TREE_SETANONY, MF_BYCOMMAND); pmenu->DeleteMenu(ID_TREE_UNSETANONY, MF_BYCOMMAND); pmenu->DeleteMenu(ID_TREE_SETBANDWIDTH, MF_BYCOMMAND); } else { pmenu->DeleteMenu(10, MF_BYPOSITION); // pmenu->DeleteMenu(ID_TREE_INFO, MF_BYCOMMAND); if (((PRTREEITEM_STRUCT)GetItemData(GetParentItem(m_htiSelected)))->nClass != TNS_FOLDER) { pmenu->DeleteMenu(!atoi(prti->saAttr[1]) ? ID_TREE_UNSETANONY : ID_TREE_SETANONY, MF_BYCOMMAND); } else { pmenu->DeleteMenu(6, MF_BYPOSITION); pmenu->DeleteMenu(ID_TREE_SETANONY, MF_BYCOMMAND); pmenu->DeleteMenu(ID_TREE_UNSETANONY, MF_BYCOMMAND); pmenu->DeleteMenu(ID_TREE_SETBANDWIDTH, MF_BYCOMMAND); } } COleDataObject odo; if (!(odo.AttachClipboard() && odo.IsDataAvailable(CF_HDROP)) && !(pmf->m_cbs != CBS_NONE && pmf->m_saDragSource.GetCount() > 0)) pmenu->EnableMenuItem(ID_TREE_PASTE, MF_GRAYED); pmenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this); } void CRemoteTreeCtrl::OnBegindrag(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); HTREEITEM hti = pNMTreeView->itemNew.hItem; if (hti == GetRootItem() || GetParentItem(hti) == GetRootItem()) return; CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_bDragFromRemote = TRUE; pmf->m_htiDragTarget = GetVolumeItem(hti); pmf->m_saDragSource.RemoveAll(); pmf->m_saDragSource.Add(GetPath(hti)); pmf->m_pLocalView->StartDrag(); COleDataSource ods; DROPEFFECT de = ods.DoDragDrop(DROPEFFECT_COPY | DROPEFFECT_MOVE, NULL); pmf->m_pLocalView->EndDrag(); pmf->m_bDragFromRemote = FALSE; *pResult = 0; } void CRemoteTreeCtrl::OnTreeCut() { SetClipboard(m_htiSelected, CBS_CUT); } void CRemoteTreeCtrl::OnTreeCopy() { // 2014.07.25 dadamin copy ±â´É Á¦°Å #ifdef _USE_COPY_ SetClipboard(m_htiSelected, CBS_COPY); #endif // _USE_COPY_ } void CRemoteTreeCtrl::OnTreePaste() { PasteClipboard(m_htiSelected); } void CRemoteTreeCtrl::OnTreeDelete() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_pRemoteView->DeleteTreeItem(m_htiSelected); } void CRemoteTreeCtrl::OnTreeRename() { EditLabel(m_htiSelected); } void CRemoteTreeCtrl::OnTreeSetAnony() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); HTREEITEM htiVolume = GetVolumeItem(m_htiSelected); HCOMMLIB hcl = (HCOMMLIB)pmf->m_mapHcl[htiVolume]; if (!cl_set_anonyauth(hcl, GetItemText(htiVolume), TRUE, GetItemText(m_htiSelected))) { AfxMessageBox(cl_get_error_message(hcl), MB_ICONERROR); return; } ((CRemoteView*)GetParent())->SetAnonyFolder(htiVolume, GetItemText(m_htiSelected), true, true); } void CRemoteTreeCtrl::OnTreeUnsetAnony() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); HTREEITEM htiVolume = GetVolumeItem(m_htiSelected); HCOMMLIB hcl = (HCOMMLIB)pmf->m_mapHcl[htiVolume]; if (!cl_set_anonyauth(hcl, GetItemText(htiVolume), FALSE, GetItemText(m_htiSelected))) { AfxMessageBox(cl_get_error_message(hcl), MB_ICONERROR); return; } ((CRemoteView*)GetParent())->SetAnonyFolder(htiVolume, GetItemText(m_htiSelected), false, true); } void CRemoteTreeCtrl::OnTreeSetBandwidth() { CBandwidthDlg dlg; dlg.m_sPath = GetPath(m_htiSelected); dlg.m_nLevel = 0; if (dlg.DoModal() != IDOK) return; CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); HTREEITEM htiVolume = GetVolumeItem(m_htiSelected); HCOMMLIB hcl = (HCOMMLIB)pmf->m_mapHcl[htiVolume]; // if (!cl_set_anonyauth(hcl, GetItemText(htiVolume), FALSE, GetItemText(m_htiSelected))) { // AfxMessageBox(cl_get_error_message(hcl), MB_ICONERROR); // return; // } } void CRemoteTreeCtrl::OnTreeInfo() { PRTREEITEM_STRUCT prtiTree; HTREEITEM htiVolume; PRTREEITEM_STRUCT prtiVolume; CString sVolumeId; RFOLDERINFO_STRUCT folderinfo; CVolumeInfoDlg dlg; __int64 nTotalBytes; __int64 nUsedBytes; BeginWaitCursor(); CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); prtiTree = (PRTREEITEM_STRUCT)GetItemData(m_htiSelected); if(prtiTree->nClass == TNS_VOLUME) { pmf->UpdateVolumeInfo(m_htiSelected); htiVolume = GetVolumeItem(m_htiSelected); prtiVolume = (PRTREEITEM_STRUCT)GetItemData(htiVolume); sVolumeId = GetItemText(htiVolume); nTotalBytes = _atoi64(prtiVolume->saAttr[2]); nUsedBytes = _atoi64(prtiVolume->saAttr[3]); dlg.m_sType = "¼­ºñ½º"; dlg.m_sTitle = sVolumeId; } else { folderinfo.nCountFile = 0; folderinfo.nCountFolder = 0; folderinfo.nSize = 0; pmf->GetFolderInfo(m_htiSelected,&folderinfo); nTotalBytes = folderinfo.nSize; nUsedBytes = folderinfo.nSize; dlg.m_sType = "Æú´õ"; dlg.m_sTitle = folderinfo.strName; } dlg.m_sTotalSpace = NumericFormat(nTotalBytes) + "Bytes"; dlg.m_sTotalSpaceT = BYTE2KMBYTE(nTotalBytes, 0, TRUE); int nFlag = 0; CString sUnit = dlg.m_sTotalSpaceT.Right(2); if (sUnit == "KB") nFlag = 1; else if (sUnit == "MB") nFlag = 2; else if (sUnit == "GB") nFlag = 3; else if (sUnit == "TB") nFlag = 4; __int64 nFreeBytes = nTotalBytes - nUsedBytes; dlg.m_sUseSpace = NumericFormat(nUsedBytes) + "Bytes"; dlg.m_sUseSpaceT = BYTE2KMBYTE(nUsedBytes, nFlag, TRUE); dlg.m_sFreeSpace = NumericFormat(nFreeBytes) + "Bytes"; dlg.m_sFreeSpaceT = BYTE2KMBYTE(nFreeBytes, nFlag, TRUE); dlg.DoModal(); ((CRemoteView*)GetParent())->ShowStatusSpace(); /* __int64 nTotalBytes, nUsedBytes; BOOL bRet = pdwft->GetVolumeInfo(GetPath(m_htiSelected), &nUsedBytes); pmf->RecycleConnection(pdwft); EndWaitCursor(); if (!bRet) { CString sMsg; sMsg.Format("¼­ºñ½º Á¤º¸¸¦ °¡Á®¿Ã ¼ö ¾ø½À´Ï´Ù.\n%s", pdwft->GetErrorMessage()); AfxMessageBox(sMsg, MB_ICONERROR); return; } CVolumeInfoDlg dlg; HTREEITEM htiVolume, hti = m_htiSelected; while (hti != GetRootItem()) { htiVolume = hti; hti = GetParentItem(hti); } PT_TREENODE ptn = (PT_TREENODE)GetItemData(htiVolume); dlg.m_sTitle = GetItemText(htiVolume); int iPos, iPos2; iPos = ptn->sAttribute.Find('|') + 1; iPos = ptn->sAttribute.Find('|', iPos) + 1; iPos2 = ptn->sAttribute.Find('|', iPos); nTotalBytes = _atoi64(ptn->sAttribute.Mid(iPos, iPos2 - iPos)); if (GetParentItem(m_htiSelected) == GetRootItem()) { UpdateVolumeInfo(htiVolume, nUsedBytes); dlg.m_sType = "¼­ºñ½º"; } else { dlg.m_sType = "Æú´õ"; dlg.m_sTitle += GetPath(m_htiSelected); } __int64 nFreeBytes = nTotalBytes - nUsedBytes; dlg.m_sTotalSpace = NumericFormat(nTotalBytes) + "Bytes"; dlg.m_sTotalSpaceT = BYTE2KMBYTE(nTotalBytes, 0, TRUE); int nFlag = 0; if (dlg.m_sType == "¼­ºñ½º") { CString sUnit = dlg.m_sTotalSpaceT.Right(2); if (sUnit == "KB") nFlag = 1; else if (sUnit == "MB") nFlag = 2; else if (sUnit == "GB") nFlag = 3; else if (sUnit == "TB") nFlag = 4; } dlg.m_sUseSpace = NumericFormat(nUsedBytes) + "Bytes"; dlg.m_sUseSpaceT = BYTE2KMBYTE(nUsedBytes, nFlag, TRUE); dlg.m_sFreeSpace = NumericFormat(nFreeBytes) + "Bytes"; dlg.m_sFreeSpaceT = BYTE2KMBYTE(nFreeBytes, nFlag, TRUE); dlg.DoModal(); ((CRemoteView*)GetParent())->ShowStatusSpace(); */ } HTREEITEM CRemoteTreeCtrl::InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter) { HTREEITEM hti = CTreeCtrl::InsertItem(lpszItem, hParent, hInsertAfter); if (TVI_ROOT != hParent) Sort(hParent); return hti; } HTREEITEM CRemoteTreeCtrl::InsertItem(LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter) { HTREEITEM hti = CTreeCtrl::InsertItem(lpszItem, nImage, nSelectedImage, hParent, hInsertAfter); if (TVI_ROOT != hParent) Sort(hParent); return hti; } BOOL CRemoteTreeCtrl::SetItemText(HTREEITEM hItem, LPCTSTR lpszItem) { PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)GetItemData(hItem); if (prti) prti->saAttr[1] = prti->saAttr[1].Left(prti->saAttr[1].ReverseFind('/') + 1) + lpszItem; return CTreeCtrl::SetItemText(hItem, lpszItem); } BOOL CRemoteTreeCtrl::DeleteItem(HTREEITEM hItem) { if(ItemHasChildren(hItem)) DeleteChildItem(hItem); PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)GetItemData(hItem); if (prti) { for (int i = 0; i < prti->paObject.GetCount(); i++) { // CString strTemp; // strTemp.Format(_T("DeleteItem : %s"),((PRLISTITEM_STRUCT)prti->paObject[i])->sName); // OutputDebugString(strTemp); delete (PRLISTITEM_STRUCT)prti->paObject[i]; } prti->paObject.RemoveAll(); prti->saAttr.RemoveAll(); delete prti; } return CTreeCtrl::DeleteItem(hItem); } BOOL CRemoteTreeCtrl::DeleteAllItems() { SetRedraw(FALSE); HTREEITEM hti = GetRootItem(); while (hti) { HTREEITEM htiRoot = hti; while (hti) { if (ItemHasChildren(hti)) { hti = GetChildItem(hti); continue; } else if (htiRoot == hti) break; HTREEITEM htiParent = GetParentItem(hti); DeleteItem(hti); hti = htiParent; } hti = GetNextSiblingItem(htiRoot); DeleteItem(htiRoot); } SetRedraw(TRUE); return TRUE;//CTreeCtrl::DeleteAllItems(); } void CRemoteTreeCtrl::DeleteChildItem(HTREEITEM hti) { OutputDebugString(_T("DeleteChildItem")); if (!hti) hti = GetSelectedItem(); if (!hti) return; HTREEITEM htiCurrent = hti; SetRedraw(FALSE); while (hti) { if (ItemHasChildren(hti)) { hti = GetChildItem(hti); continue; } else if (htiCurrent == hti) break; HTREEITEM htiParent = GetParentItem(hti); DeleteItem(hti); hti = htiParent; } SetRedraw(TRUE); PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)GetItemData(hti); if (prti) { for (int i = 0; i < prti->paObject.GetCount(); i++) delete (PRLISTITEM_STRUCT)prti->paObject[i]; prti->paObject.RemoveAll(); } } CString CRemoteTreeCtrl::GetPath(HTREEITEM hti) { if (!hti) hti = GetSelectedItem(); CString sPath = ""; while (((PRTREEITEM_STRUCT)GetItemData(hti))->nClass == TNS_FOLDER) { sPath = "/" + GetItemText(hti) + sPath; hti = GetParentItem(hti); } return sPath; } HTREEITEM CRemoteTreeCtrl::GetVolumeItem(HTREEITEM hti) { PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)GetItemData(hti); ASSERT(prti); if (prti->nClass == TNS_ROOT) return NULL; while (hti) { prti = (PRTREEITEM_STRUCT)GetItemData(hti); if (prti->nClass == TNS_VOLUME) break; hti = GetParentItem(hti); } return hti; } CString CRemoteTreeCtrl::GetVolumeText(HTREEITEM hti) { while (hti && GetParentItem(hti) != GetRootItem()) hti = GetParentItem(hti); return GetItemText(hti); } HTREEITEM CRemoteTreeCtrl::GetItem(HTREEITEM hti, CString sPath) { if (sPath.Left(1) == "/") sPath.Delete(0); if (sPath.Right(1) == "/") sPath.Delete(sPath.GetLength()); int iToken = 0; CString sToken = sPath.Tokenize("/", iToken); while (sToken != "") { HTREEITEM htiChild = GetChildItem(hti); while (htiChild) { if (GetItemText(htiChild) == sToken) break; htiChild = GetNextSiblingItem(htiChild); } if (!htiChild) return NULL; hti = htiChild; sToken = sPath.Tokenize("/", iToken); } return hti; } bool CRemoteTreeCtrl::IsExistsChild(HTREEITEM hti, CString sName) { PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)GetItemData(hti); if (!prti) return false; for (int i = 0; i < prti->paObject.GetCount(); i++) { if (((PRLISTITEM_STRUCT)prti->paObject[i])->sName == sName) return true; } return false; } void CRemoteTreeCtrl::SetClipboard(HTREEITEM hti, CLIPBOARD_STATE cbs) { if (OpenClipboard()) { EmptyClipboard(); CloseClipboard(); } if (!hti || hti == GetRootItem() || GetParentItem(hti) == GetRootItem()) return; CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_saDragSource.RemoveAll(); pmf->m_cbs = cbs; pmf->m_htiDragTarget = GetVolumeItem(hti); pmf->m_saDragSource.Add(GetPath(hti)); } void CRemoteTreeCtrl::PasteClipboard(HTREEITEM htiTarget) { if (!htiTarget || htiTarget == GetRootItem()) return; COleDataObject odo; if (odo.AttachClipboard() && odo.IsDataAvailable(CF_HDROP)) { STGMEDIUM sm; FORMATETC fe = {CF_HDROP, (DVTARGETDEVICE FAR*)NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; if (!odo.GetData(CF_HDROP, &sm, &fe)) return; HDROP hdrop = (HDROP)sm.hGlobal; int nDragCount = ::DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0); if (nDragCount == 0) return; CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); pmf->m_saDragSource.RemoveAll(); char szFile[MAX_PATH]; for (int i = 0; i < nDragCount; i++) { ::DragQueryFile(hdrop, i, szFile, sizeof(szFile)); CString sFile(szFile); if (sFile.Find('\\') < 0) { AfxMessageBox("½Ã½ºÅÛ ÆÄÀÏÀº ¾÷·Îµå ÇÒ ¼ö ¾ø½À´Ï´Ù."); pmf->m_saDragSource.RemoveAll(); break; } pmf->m_saDragSource.Add(sFile); } if (pmf->m_saDragSource.GetCount() == 0) return; pmf->m_sDragTarget = GetPath(htiTarget); pmf->m_htiDragTarget = GetVolumeItem(htiTarget); pmf->Upload(false); } else { CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); if (pmf->m_cbs == CBS_NONE) return; if (pmf->m_saDragSource.GetCount() == 0) return; if (GetVolumeItem(htiTarget) != pmf->m_htiDragTarget) { AfxMessageBox("¼­·Î ´Ù¸¥ ¼­ºñ½º»çÀÌ¿¡´Â ÆÄÀÏÀ» º¹»ç ¶Ç´Â À̵¿ ÇÒ ¼ö ¾ø½À´Ï´Ù."); return; } pmf->m_sDragTarget = GetPath(htiTarget); for (int i = 0; i < pmf->m_saDragSource.GetCount(); i++) { if (IsPathItself(pmf->m_saDragSource[i], pmf->m_sDragTarget)) { AfxMessageBox("ÀÚ±â ÀÚ½ÅÀÇ ÇÏÀ§ Æú´õ·Î º¹»ç ¶Ç´Â À̵¿ ÇÒ ¼ö ¾ø½À´Ï´Ù."); return; } } pmf->BeginWaitMessage(); CStringArray saSucceed; if (pmf->m_cbs == CBS_COPY) pmf->CopyRemoteObject(pmf->m_htiDragTarget, pmf->m_saDragSource, pmf->m_sDragTarget, saSucceed); else pmf->MoveRemoteObject(pmf->m_htiDragTarget, pmf->m_saDragSource, pmf->m_sDragTarget, saSucceed); CRemoteView* pview = (CRemoteView*)GetParent(); for (int i = 0; i < saSucceed.GetCount(); i++) { HTREEITEM hti = GetItem(pmf->m_htiDragTarget, saSucceed[i]); if (!hti) continue; CString sName = saSucceed[i].Mid(saSucceed[i].ReverseFind('/') + 1); if (!IsExistsChild(htiTarget, sName)) pview->AppendObject(htiTarget, true, sName, 0, ""); if (pmf->m_cbs == CBS_CUT) DeleteItem(hti); } pmf->EndWaitMessage(); if (saSucceed.GetCount() == 0) return; pmf->m_pRemoteView->RefreshItem(); } } void CRemoteTreeCtrl::Sort(HTREEITEM hti) { SortChildren(hti); }