// RemoteListCtrl.cpp : implementation file // #include "stdafx.h" #include "ConsoleApp.h" #include "RemoteListCtrl.h" #include "MainFrm.h" #include "RemoteView.h" #include "LocalView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif int KrCompare(LPCTSTR pszText1, LPCTSTR pszText2); bool IsPathItself(CString sSrcPath, CString sDstPath); ///////////////////////////////////////////////////////////////////////////// // CRemoteListCtrl CRemoteListCtrl::CRemoteListCtrl() { m_nStyle = 4; m_nSortColumn = 0; m_nSortDirect = -1; } CRemoteListCtrl::~CRemoteListCtrl() { } BEGIN_MESSAGE_MAP(CRemoteListCtrl, CListCtrl) //{{AFX_MSG_MAP(CRemoteListCtrl) //}}AFX_MSG_MAP ON_WM_CREATE() ON_WM_ERASEBKGND() ON_WM_LBUTTONDBLCLK() ON_WM_CONTEXTMENU() ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBegindrag) ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick) ON_COMMAND(ID_LIST_NEWFOLDER, OnListNewfolder) ON_COMMAND(ID_LIST_REFRESH, OnListRefresh) ON_COMMAND(ID_LIST_TYPE1, OnListType1) ON_COMMAND(ID_LIST_TYPE2, OnListType2) ON_COMMAND(ID_LIST_TYPE3, OnListType3) ON_COMMAND(ID_LIST_TYPE4, OnListType4) ON_COMMAND(ID_LIST_SORT1, OnListSort1) ON_COMMAND(ID_LIST_SORT2, OnListSort2) ON_COMMAND(ID_LIST_SORT3, OnListSort3) ON_COMMAND(ID_LIST_SORT4, OnListSort4) ON_COMMAND(ID_LIST_PASTE, OnListPaste) ON_COMMAND(ID_LIST_ALL, OnListAll) ON_COMMAND(ID_LISTFILE_DOWNLOAD, OnListfileDownload) ON_COMMAND(ID_LISTFILE_SAVEURL, OnListfileSaveUrl) ON_COMMAND(ID_LISTFILE_CUT, OnListfileCut) ON_COMMAND(ID_LISTFILE_COPY, OnListfileCopy) ON_COMMAND(ID_LISTFILE_PASTE, OnListfilePaste) ON_COMMAND(ID_LISTFILE_DELETE, OnListfileDelete) ON_COMMAND(ID_LISTFILE_RENAME, OnListfileRename) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRemoteListCtrl message handlers BOOL CRemoteListCtrl::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) { for (int i = 0; i < GetItemCount(); i++) { if (LVIS_FOCUSED & GetItemState(i, LVIF_TEXT)) { EditLabel(i); break; } } return TRUE; } else if (pMsg->wParam == VK_DELETE) { ((CRemoteView*)GetParent())->DeleteListItem(); return TRUE; } else if (GetKeyState(VK_CONTROL) & 128) { if (pMsg->wParam == VK_A) { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_pRemoteView->m_bUpdating = TRUE; for (int i = 0; i < GetItemCount(); i++) SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); pmf->m_pRemoteView->m_bUpdating = FALSE; pmf->m_pRemoteView->ShowStatusObject(TRUE, FALSE, TRUE); return TRUE; } else if (pMsg->wParam == VK_C) { // 2014.07.25 dadamin copy ±â´É Á¦°Å #ifdef _USE_COPY_ SetClipboard(CBS_COPY); #else AfxMessageBox(IDS_COPY_NOT_ALLOWD, MB_ICONERROR); #endif // _USE_COPY_ return TRUE; } else if (pMsg->wParam == VK_X) { SetClipboard(CBS_CUT); return TRUE; } else if (pMsg->wParam == VK_V) { PasteClipboard(); return TRUE; } else if (pMsg->wParam == VK_D) { OnListfileDelete(); return TRUE; } } } return CListCtrl::PreTranslateMessage(pMsg); } int CRemoteListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { // if (CListCtrl::OnCreate(lpCreateStruct) == -1) // return -1; m_dropTarget.Register(this); int anWidths[7]={270, 110, 110, 150, 54, 90, 90}; CString sWidths = COptions::GetOption(OPTION_REMOTECOLUMNWIDTHS); if (sWidths != "") { int pos=-1; int i; for (i=0; i<6; i++) { int oldpos = pos + 1; pos = sWidths.Find(_T(" "), oldpos); if (pos == -1) break; sWidths.SetAt(pos, 0); int size = _ttoi(sWidths.Mid(oldpos)); if (size > 0) anWidths[i] = size; } if (i == 6) { int size = _ttoi(sWidths.Mid(pos+1)); if (size > 0) anWidths[i] = size; } } m_asHeader[0] = "À̸§"; m_asHeader[1] = "Å©±â"; m_asHeader[2] = "Á¾·ù"; m_asHeader[3] = "¼öÁ¤ÀÏÀÚ"; m_anHeaderAlign[0] = LVCFMT_LEFT; m_anHeaderAlign[1] = LVCFMT_RIGHT; m_anHeaderAlign[2] = LVCFMT_LEFT; m_anHeaderAlign[3] = LVCFMT_LEFT; for (int i = 0; i < 4; i++) InsertColumn(i, m_asHeader[i], m_anHeaderAlign[i], anWidths[i]); m_ilSort.Create(9, 9, ILC_MASK, 3, 3); HICON hicon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SORT_NONE)); m_ilSort.Add(hicon); hicon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SORT_ASC)); m_ilSort.Add(hicon); hicon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SORT_DESC)); m_ilSort.Add(hicon); m_ilSort.SetBkColor(CLR_NONE); SetListStyle(m_nStyle); SetExtendedStyle(LVS_EX_INFOTIP); SetCallbackMask(GetCallbackMask() | LVIS_OVERLAYMASK); return 0; } BOOL CRemoteListCtrl::OnEraseBkgnd(CDC* pDC) { // return TRUE; return CListCtrl::OnEraseBkgnd(pDC); } void CRemoteListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) { int iItem = HitTest(point); if (iItem < 0) return; if (((PRLISTITEM_STRUCT)GetItemData(iItem))->bFolder) { CRemoteView* pview = (CRemoteView*)GetParent(); CString sName = GetItemText(iItem, 0); HTREEITEM hti = pview->m_tree.GetSelectedItem(); hti = pview->m_tree.GetChildItem(hti); while (hti) { if (sName == pview->m_tree.GetItemText(hti)) { pview->m_tree.SelectItem(hti); return; } hti = pview->m_tree.GetNextSiblingItem(hti); } } // CListCtrl::OnLButtonDblClk(nFlags, point); } void CRemoteListCtrl::OnContextMenu(CWnd* pWnd, CPoint point) { CRemoteTreeCtrl* ptree = ((CRemoteView*)GetParent())->GetTreeCtrl(); if (!ptree->GetRootItem()) return; CPoint ptHit = point; ScreenToClient(&ptHit); CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); HTREEITEM htiRoot = pmf->m_pRemoteView->m_tree.GetRootItem(); HTREEITEM htiSelected = pmf->m_pRemoteView->m_tree.GetSelectedItem(); HTREEITEM htiParent = pmf->m_pRemoteView->m_tree.GetParentItem(htiSelected); CMenu menu, *pmenu; if ((m_iSelectedItem = HitTest(ptHit)) >= 0) { menu.LoadMenu(IDR_POP_RLISTFILE); pmenu = menu.GetSubMenu(0); ASSERT(pmenu != NULL); if (htiSelected == htiRoot) return; pmenu->SetMenuItemBitmaps(ID_LISTFILE_CUT, MF_BYCOMMAND, &pmf->m_bmCut, &pmf->m_bmCut); // 2014.07.25 dadamin copy ±â´É Á¦°Å #ifdef _USE_COPY_ pmenu->SetMenuItemBitmaps(ID_LISTFILE_COPY, MF_BYCOMMAND, &pmf->m_bmCopy, &pmf->m_bmCopy); #endif // _USE_COPY_ pmenu->SetMenuItemBitmaps(ID_LISTFILE_PASTE, MF_BYCOMMAND, &pmf->m_bmPaste, &pmf->m_bmPaste); // dadamin add if(pmf->m_pLocalView->GetSelectedPath().IsEmpty()) { pmenu->EnableMenuItem(ID_LISTFILE_DOWNLOAD, MF_GRAYED); } // dadamin add if (((PRLISTITEM_STRUCT)GetItemData(m_iSelectedItem))->bFolder) { COleDataObject odo; if (!(odo.AttachClipboard() && odo.IsDataAvailable(CF_HDROP)) && !(pmf->m_cbs != CBS_NONE && pmf->m_saDragSource.GetCount() > 0)) pmenu->EnableMenuItem(ID_LISTFILE_PASTE, MF_GRAYED); } else pmenu->DeleteMenu(ID_LISTFILE_PASTE, MF_BYCOMMAND); if (((PRTREEITEM_STRUCT)ptree->GetItemData(htiSelected))->nClass == TNS_FOLDER) { HTREEITEM hti = ptree->GetParentItem(htiSelected); while (((PRTREEITEM_STRUCT)ptree->GetItemData(hti))->nClass == TNS_FOLDER) { htiSelected = hti; hti = ptree->GetParentItem(hti); } if (((PRTREEITEM_STRUCT)ptree->GetItemData(htiSelected))->saAttr[1] != "1") pmenu->EnableMenuItem(ID_LISTFILE_SAVEURL, MF_GRAYED); } else pmenu->EnableMenuItem(ID_LISTFILE_SAVEURL, MF_GRAYED); } else { menu.LoadMenu(IDR_POP_RLIST); pmenu = menu.GetSubMenu(0); ASSERT(pmenu != NULL); pmenu->SetMenuItemBitmaps(ID_LIST_NEWFOLDER, MF_BYCOMMAND, &pmf->m_bmFolder, &pmf->m_bmFolder); pmenu->SetMenuItemBitmaps(ID_LIST_PASTE, MF_BYCOMMAND, &pmf->m_bmPaste, &pmf->m_bmPaste); switch (pmf->m_nRemoteListType) { case 1: pmenu->CheckMenuItem(ID_LIST_TYPE1, MF_CHECKED); break; case 2: pmenu->CheckMenuItem(ID_LIST_TYPE2, MF_CHECKED); break; case 3: pmenu->CheckMenuItem(ID_LIST_TYPE3, MF_CHECKED); break; case 4: pmenu->CheckMenuItem(ID_LIST_TYPE4, MF_CHECKED); break; } switch (m_nSortColumn) { case 0: pmenu->CheckMenuItem(ID_LIST_SORT1, MF_CHECKED); break; case 1: pmenu->CheckMenuItem(ID_LIST_SORT2, MF_CHECKED); break; case 2: pmenu->CheckMenuItem(ID_LIST_SORT3, MF_CHECKED); break; case 3: pmenu->CheckMenuItem(ID_LIST_SORT4, MF_CHECKED); break; } if (htiSelected == htiRoot) { pmenu->EnableMenuItem(ID_LIST_NEWFOLDER, MF_GRAYED); pmenu->EnableMenuItem(ID_LIST_ALL, MF_GRAYED); pmenu->EnableMenuItem(ID_LIST_PASTE, MF_GRAYED); } else { COleDataObject odo; if (!(odo.AttachClipboard() && odo.IsDataAvailable(CF_HDROP)) && !(pmf->m_cbs != CBS_NONE && pmf->m_saDragSource.GetCount() > 0)) pmenu->EnableMenuItem(ID_LIST_PASTE, MF_GRAYED); } } pmenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); } void CRemoteListCtrl::OnBegindrag(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); CRemoteTreeCtrl* ptree = ((CRemoteView*)GetParent())->GetTreeCtrl(); POSITION pos = GetFirstSelectedItemPosition(); if (ptree->GetSelectedItem() == ptree->GetRootItem() || !pos) return; CString sPath = ptree->GetPath(ptree->GetSelectedItem()) + "/"; CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); pmf->m_bDragFromRemote = TRUE; pmf->m_htiDragTarget = ptree->GetVolumeItem(ptree->GetSelectedItem()); pmf->m_saDragSource.RemoveAll(); while (pos) { int iItem = GetNextSelectedItem(pos); pmf->m_saDragSource.Add(sPath + GetItemText(iItem, 0)); } 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 CRemoteListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; Sort(pNMListView->iSubItem); *pResult = 0; } void CRemoteListCtrl::OnListNewfolder() { SetFocus(); CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_pRemoteView->MakeNewFolder(); } void CRemoteListCtrl::OnListRefresh() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_pRemoteView->RefreshItem(); } void CRemoteListCtrl::OnListType1() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->OnViewRlistType1(); } void CRemoteListCtrl::OnListType2() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->OnViewRlistType2(); } void CRemoteListCtrl::OnListType3() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->OnViewRlistType3(); } void CRemoteListCtrl::OnListType4() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->OnViewRlistType4(); } void CRemoteListCtrl::OnListSort1() { Sort(0); } void CRemoteListCtrl::OnListSort2() { Sort(1); } void CRemoteListCtrl::OnListSort3() { Sort(2); } void CRemoteListCtrl::OnListSort4() { Sort(3); } void CRemoteListCtrl::OnListPaste() { PasteClipboard(); } void CRemoteListCtrl::OnListAll() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_pRemoteView->m_bUpdating = TRUE; for (int i = 0; i < GetItemCount(); i++) SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); pmf->m_pRemoteView->m_bUpdating = FALSE; pmf->m_pRemoteView->ShowStatusObject(TRUE, FALSE, TRUE); } void CRemoteListCtrl::OnListfileDownload() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->Download(); } void CRemoteListCtrl::OnListfileSaveUrl() { /* if (((CRemoteView*)GetParent())->m_nSelectedFiles == 0) { AfxMessageBox("URL·Î ÀúÀåÇÒ ÆÄÀÏÀ» ¼±ÅÃÇϽʽÿÀ. URL ÀúÀåÀº ÆÄÀϸ¸ °¡´ÉÇÕ´Ï´Ù."); return; } */ ((CMainFrame*)AfxGetMainWnd())->SaveUrl(); } void CRemoteListCtrl::OnListfileCut() { SetClipboard(CBS_CUT); } void CRemoteListCtrl::OnListfileCopy() { //2014.07.25 dadamin copy ±â´É Á¦°Å #ifdef _USE_COPY_ SetClipboard(CBS_COPY); #endif // _USE_COPY_ } void CRemoteListCtrl::OnListfilePaste() { //TODO... PasteClipboard(GetItemText(m_iSelectedItem, 0)); } void CRemoteListCtrl::OnListfileDelete() { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_pRemoteView->DeleteListItem(); } void CRemoteListCtrl::OnListfileRename() { EditLabel(m_iSelectedItem); } BOOL CRemoteListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText) { if (nSubItem == 0) { PRLISTITEM_STRUCT prli = (PRLISTITEM_STRUCT)GetItemData(nItem); if (prli) { CString sText = lpszText; prli->sName = sText; prli->saAttr[0] = sText.MakeUpper(); } } return CListCtrl::SetItemText(nItem, nSubItem, lpszText); } void CRemoteListCtrl::SetListStyle(int nStyle) { UINT nSHOption = SHGFI_ICON | SHGFI_SYSICONINDEX; int nLVOption; if (nStyle == 1) { m_nStyle = LVS_ICON; nSHOption |= SHGFI_LARGEICON; nLVOption = LVSIL_NORMAL; } else if (nStyle == 2) { m_nStyle = LVS_SMALLICON; nSHOption |= SHGFI_SMALLICON; nLVOption = LVSIL_SMALL; } else if (nStyle == 3) { m_nStyle = LVS_LIST; nSHOption |= SHGFI_SMALLICON; nLVOption = LVSIL_SMALL; } else if (nStyle == 4) { m_nStyle = LVS_REPORT; nSHOption |= SHGFI_SMALLICON; nLVOption = LVSIL_SMALL; } int nRemove = ~m_nStyle & (LVS_REPORT | LVS_ICON | LVS_SMALLICON | LVS_LIST); ModifyStyle(nRemove, m_nStyle, SWP_NOZORDER); SHFILEINFO shfi; HIMAGELIST hil = (HIMAGELIST)SHGetFileInfo("", 0, &shfi, sizeof(shfi), nSHOption); SetImageList(CImageList::FromHandle(hil), nLVOption); Arrange(LVA_DEFAULT); Sort(); } void CRemoteListCtrl::SetClipboard(CLIPBOARD_STATE cbs) { if (OpenClipboard()) { EmptyClipboard(); CloseClipboard(); } POSITION pos = GetFirstSelectedItemPosition(); if (!pos) return; CRemoteTreeCtrl* ptree = ((CRemoteView*)GetParent())->GetTreeCtrl(); HTREEITEM hti = ptree->GetSelectedItem(); if (hti == ptree->GetRootItem()) return; CString sPath = ptree->GetPath(hti); CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); pmf->m_cbs = cbs; pmf->m_htiDragTarget = ptree->GetVolumeItem(hti); pmf->m_saDragSource.RemoveAll(); while (pos) { int iItem = GetNextSelectedItem(pos); pmf->m_saDragSource.Add(sPath + "/" + GetItemText(iItem, 0)); } } void CRemoteListCtrl::PasteClipboard(CString sFolder) { if (sFolder != "") sFolder = "/" + sFolder; CRemoteTreeCtrl* ptree = ((CRemoteView*)GetParent())->GetTreeCtrl(); HTREEITEM htiTarget = ptree->GetSelectedItem(); if (htiTarget == ptree->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 = ptree->GetPath(htiTarget) + sFolder; pmf->m_htiDragTarget = ptree->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 (ptree->GetVolumeItem(htiTarget) != pmf->m_htiDragTarget) { AfxMessageBox("¼­·Î ´Ù¸¥ ¼­ºñ½º»çÀÌ¿¡´Â ÆÄÀÏÀ» º¹»ç ¶Ç´Â À̵¿ ÇÒ ¼ö ¾ø½À´Ï´Ù."); return; } pmf->m_sDragTarget = ptree->GetPath(htiTarget) + sFolder; 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 = ptree->GetItem(pmf->m_htiDragTarget, saSucceed[i]); if (!hti) continue; CString sName = saSucceed[i].Mid(saSucceed[i].ReverseFind('/') + 1); if (!ptree->IsExistsChild(htiTarget, sName)) pview->AppendObject(htiTarget, true, sName, 0, ""); if (pmf->m_cbs == CBS_CUT) ptree->DeleteItem(hti); } pmf->EndWaitMessage(); if (saSucceed.GetCount() == 0) return; pmf->m_pRemoteView->RefreshItem(); } } void CRemoteListCtrl::Sort(int nColumn) { HDITEM *phdi = new HDITEM; if (nColumn >= 0) { if (m_nSortColumn != nColumn) { phdi->pszText = m_asHeader[m_nSortColumn].GetBuffer(0); phdi->cchTextMax = 0; phdi->mask = HDI_TEXT | HDI_IMAGE | HDI_FORMAT; phdi->fmt = m_anHeaderAlign[m_nSortColumn] | HDF_IMAGE | HDF_STRING | HDF_BITMAP_ON_RIGHT; phdi->iImage = 0; GetHeaderCtrl()->SetItem(m_nSortColumn, phdi); } else m_nSortDirect = -m_nSortDirect; m_nSortColumn = nColumn; } GetHeaderCtrl()->SetImageList(&m_ilSort); phdi->pszText = m_asHeader[m_nSortColumn].GetBuffer(0); phdi->cchTextMax = 0; phdi->mask = HDI_TEXT | HDI_IMAGE | HDI_FORMAT; phdi->fmt = m_anHeaderAlign[m_nSortColumn] | HDF_IMAGE | HDF_STRING | HDF_BITMAP_ON_RIGHT; phdi->iImage = (m_nSortDirect > 0 ? 1 : 2); GetHeaderCtrl()->SetItem(m_nSortColumn, phdi); delete phdi; SortItems(SortProc, (LPARAM)this); } int CRemoteListCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { PRLISTITEM_STRUCT prli1 = (PRLISTITEM_STRUCT)lParam1; PRLISTITEM_STRUCT prli2 = (PRLISTITEM_STRUCT)lParam2; CRemoteListCtrl *plist = (CRemoteListCtrl*)lParamSort; CString sText1 = (prli1->bFolder ? "0" : "1"); CString sText2 = (prli2->bFolder ? "0" : "1"); switch (plist->m_nSortColumn) { case 0:// ÆÄÀϸí sText1 += prli1->saAttr[0]; sText2 += prli2->saAttr[0]; break; case 1: // »çÀÌÁî Á¤·Ä if (!prli1->bFolder && prli2->bFolder) return -1 * (-plist->m_nSortDirect); if (prli1->bFolder) return 1 * (-plist->m_nSortDirect); if (prli1->bFolder && prli2->bFolder) return 0; if (prli1->nSize > prli2->nSize) return 1 * (-plist->m_nSortDirect); if (prli1->nSize < prli2->nSize) return -1 * (-plist->m_nSortDirect); if (prli1->nSize == prli2->nSize) return 0; break; case 2: // Á¾·ù sText1 += prli1->saAttr[2]; sText2 += prli2->saAttr[2]; break; case 3: // ³¯Â¥ sText1 += prli1->saAttr[plist->m_nSortColumn]; sText2 += prli2->saAttr[plist->m_nSortColumn]; break; default: sText1 += prli1->saAttr[plist->m_nSortColumn] + prli1->saAttr[0]; sText2 += prli2->saAttr[plist->m_nSortColumn] + prli2->saAttr[0]; break; } return (KrCompare(sText1, sText2) * (-plist->m_nSortDirect)); }