Files
interactive/application/sp-console(down)/ConsoleApp(DN)/RemoteTreeCtrl.cpp
2026-08-07 17:38:18 +09:00

776 lines
19 KiB
C++

// 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) {
SetClipboard(GetSelectedItem(), CBS_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);
pmenu->SetMenuItemBitmaps(ID_TREE_COPY, MF_BYCOMMAND, &pmf->m_bmCopy, &pmf->m_bmCopy);
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);
pmenu->EnableMenuItem(ID_TREE_COPY, MF_GRAYED);
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<LPNMTREEVIEW>(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()
{
SetClipboard(m_htiSelected, CBS_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);
}