794 lines
20 KiB
C++
794 lines
20 KiB
C++
// 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<LPNMLISTVIEW>(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));
|
|
}
|
|
|