localfilelistctrl.cpp
来自「一个FTP下载的源代码。代码质量非常高」· C++ 代码 · 共 2,497 行 · 第 1/5 页
CPP
2,497 行
CString path=subdir;
path.TrimLeft( _T("\\") );
path.TrimRight(_T("\\") );
while (path!=_T("") )
{
CString tmp;
int pos=path.Find( _T("\\") );
if (pos==-1)
{
tmp.Format(_T(" %d %s"), path.GetLength(), path);
path="";
}
else
{
tmp.Format(_T(" %d %s"), path.Left(pos).GetLength(), path.Left(pos));
path=path.Mid(pos+1);
}
sdir+=tmp;
}
sdir.TrimLeft( _T(" ") );
serverpath.AddSubdirs(sdir);
pMainFrame->m_pCommandQueue->MakeDir(serverpath);
}
}
}
}
// this Function Returns the first Selected Item in the List
UINT CLocalFileListCtrl::GetSelectedItem()
{
// this Function Valid Only when a Single Item is Selected
ASSERT( GetSelectedCount( ) == 1 );
UINT nNoOfItems = GetItemCount( );
UINT nListItem;
for (nListItem = 0; nListItem < nNoOfItems; nListItem++)
if (GetItemState( nListItem, LVIS_SELECTED ) )
break;
ASSERT(nListItem < nNoOfItems);
return nListItem;
}
#define VK_A 65
BOOL CLocalFileListCtrl::PreTranslateMessage(MSG* pMsg)
{
// If edit control is visible in tree view control, sending a
// WM_KEYDOWN message to the edit control will dismiss the edit
// control. When ENTER key was sent to the edit control, the parent
// window of the tree view control is responsible for updating the
// item's label in TVN_ENDLABELEDIT notification code.
if ( pMsg->message == WM_KEYDOWN )
{
CEdit* edit = GetEditControl();
if (edit)
{
if( GetKeyState( VK_CONTROL )&128 && pMsg->wParam == VK_A )
{
edit->SetSel(0, -1);
return TRUE;
}
else if( pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_CONTROL || pMsg->wParam == VK_INSERT || pMsg->wParam == VK_SHIFT )
{
edit->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
return TRUE;
}
}
else
{
if( GetKeyState( VK_CONTROL )&128 && pMsg->wParam == VK_A )
{
m_bUpdating = TRUE;
if (GetItemCount())
SetItemState(0, GetItemCount()==1 || m_Fullpath==""?LVIS_SELECTED:0,LVIS_SELECTED);
for (int i=1;i<GetItemCount();i++)
SetItemState(i, LVIS_SELECTED,LVIS_SELECTED);
m_bUpdating = FALSE;
UpdateStatusBar();
return TRUE;
}
//Handle the enter key
else if (pMsg->wParam==VK_RETURN)
{
CMainFrame *pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, GetParentFrame());
POSITION selpos=GetFirstSelectedItemPosition();
BOOL bOpen=TRUE;
int openindex=-1;
int openitem=-1;
if (selpos)
{
int nItem = openitem = GetNextSelectedItem(selpos);
int index=openindex=m_IndexMapping[nItem];
if (m_FileData[index].bIsDir)
{
}
else
{
bOpen=FALSE;
pMainFrame->AddQueueItem(FALSE,GetItemText(nItem,0),"",m_Fullpath,CServerPath(),TRUE);
openindex=-1;
openitem=-1;
}
}
else
return TRUE;
while (selpos)
{
if (!openindex)
return TRUE;
bOpen=FALSE;
int nItem = GetNextSelectedItem(selpos);
if(!nItem || m_Fullpath=="")
return TRUE;
int index=m_IndexMapping[nItem];
if (m_FileData[index].bIsDir)
UploadDir(m_Fullpath+m_FileData[index].Name+"\\*.*", m_FileData[index].Name+"\\", TRUE);
else
pMainFrame->AddQueueItem(FALSE, m_FileData[index].Name, "", m_Fullpath, CServerPath(), TRUE, m_transferuser, m_transferpass);
}
if (bOpen)
{
CString newpath;
if (!openitem && m_Fullpath!="")
{
m_Fullpath.TrimRight('\\');
int pos=m_Fullpath.ReverseFind('\\');
if (pos!=-1)
m_Fullpath=m_Fullpath.Left(pos+1);
else
m_Fullpath="";
newpath=m_Fullpath;
}
else
newpath=m_Fullpath+m_FileData[openindex].Name+"\\";
m_pOwner->SetLocalFolder(newpath);
m_pOwner->SetLocalFolderOut(newpath);
}
else
{
ASSERT(m_Fullpath!="");
if (openindex>=0)
UploadDir(m_Fullpath+m_FileData[openindex].Name+"\\*.*", m_FileData[openindex].Name+"\\", TRUE);
pMainFrame->TransferQueue(2);
}
return TRUE;
}
}
}
else if ( pMsg->message == WM_CHAR )
{
CEdit* edit = GetEditControl();
if (edit)
{
if (pMsg->wParam=='/' ||
pMsg->wParam=='\\' ||
pMsg->wParam==':' ||
pMsg->wParam=='*' ||
pMsg->wParam=='?' ||
pMsg->wParam=='"' ||
pMsg->wParam=='<' ||
pMsg->wParam=='>' ||
pMsg->wParam=='|')
{
MessageBeep(0xFFFFFFFF);
return TRUE;
}
}
}
return CListCtrl::PreTranslateMessage(pMsg);
}
void CLocalFileListCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// This is the Limit the size of the Tag Name to 255
if (!pDispInfo->item.iItem || m_Fullpath=="")
{
*pResult=TRUE;
return;
}
*pResult = 0;
CEdit *pEdit=GetEditControl();
if (pEdit)
pEdit->LimitText( 255 );
}
void CLocalFileListCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
if (pDispInfo->item.pszText)
{
CString newname=pDispInfo->item.pszText;
newname=newname.Left(255);
if ((newname.Find('/')!=-1)||(newname.Find('\\')!=-1)||
(newname.Find(':')!=-1)||(newname.Find('*')!=-1)||
(newname.Find('?')!=-1)||(newname.Find('"')!=-1)||
(newname.Find('<')!=-1)||(newname.Find('>')!=-1)||
(newname.Find('|')!=-1))
{
AfxMessageBox(IDS_ERRORMSG_FILENAMEINVALID,MB_ICONEXCLAMATION);
*pResult=FALSE;
return;
}
SHFILEOPSTRUCT op;
memset(&op,0,sizeof(op));
CString from=m_Fullpath+m_FileData[m_IndexMapping[pDispInfo->item.iItem]].Name+" ";
from.SetAt(from.GetLength()-1,'\0');
op.pFrom=from;
CString to=m_Fullpath+pDispInfo->item.pszText+" ";
to.SetAt(to.GetLength()-1,'\0');
op.pTo=to;
op.hwnd=AfxGetMainWnd()->m_hWnd;
op.wFunc=FO_RENAME;
op.fFlags=FOF_ALLOWUNDO;
if (!SHFileOperation(&op))
{
*pResult = TRUE;
m_FileData[m_IndexMapping[pDispInfo->item.iItem]].Name=pDispInfo->item.pszText;
m_FileData[m_IndexMapping[pDispInfo->item.iItem]].lName=pDispInfo->item.pszText;
m_FileData[m_IndexMapping[pDispInfo->item.iItem]].lName.MakeLower();
return;
}
}
*pResult = FALSE;
}
void CLocalFileListCtrl::OnLocalcontextRename()
{
ASSERT(GetSelectedCount()==1);
POSITION selpos=GetFirstSelectedItemPosition();
int index=GetNextSelectedItem(selpos);
EditLabel(index);
}
void CLocalFileListCtrl::OnLocalcontextCreatedirectory()
{
if (m_Fullpath=="")
return;
CEnterSomething dlg(IDS_INPUTDIALOGTITLE_CREATEDIR,IDS_INPUTDIALOGTEXT_CREATEDIR);
if (dlg.DoModal()==IDOK)
{
CreateDirectory(m_Fullpath+dlg.m_String, 0);
CMainFrame *pMainFrame=DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());
pMainFrame->RefreshViews(1);
}
}
void CLocalFileListCtrl::ReloadHeader()
{
ReloadHeaderItem(0,IDS_HEADER_FILENAME);
int i=1;
if (!(m_nHideColumns&1))
{
ReloadHeaderItem(i,IDS_HEADER_FILESIZE);
i++;
}
if (!(m_nHideColumns&2))
{
ReloadHeaderItem(i,IDS_HEADER_FILETYPE);
i++;
}
if (!(m_nHideColumns&4))
ReloadHeaderItem(i,IDS_HEADER_LASTMODIFIED);
}
void CLocalFileListCtrl::ReloadHeaderItem(int nIndex, UINT nID)
{
CHeaderCtrl *header=GetHeaderCtrl();
TCHAR text[100];
HDITEM item;
memset(&item,0,sizeof(HDITEM));
item.cchTextMax=100;
item.mask=HDI_TEXT;
item.pszText=text;
header->GetItem(nIndex,&item);
CString str;
str.LoadString(nID);
_tcscpy(text,str);
header->SetItem(nIndex,&item);
}
void CLocalFileListCtrl::SetFolder(CString folder)
{
if (m_bUpdating)
{
m_NewDir = folder;
return;
}
else
m_NewDir="";
BOOL bDidHaveFocus = GetFocus() == this;
folder.TrimRight( _T("\\") );
folder+=_T("\\");
m_FileData.clear();
m_IndexMapping.clear();
m_Fullpath=folder;
DeleteAllItems();
if (m_Fullpath==_T("\\"))
{
m_Fullpath="";
DisplayDrives();
return;
}
m_bUpdating=TRUE;
SetRedraw(FALSE);
EnableWindow(FALSE);
CString strPathFiles = m_Fullpath;
if ( strPathFiles.Right(1) != "\\" )
strPathFiles += "\\";
strPathFiles += "*.*";
WIN32_FIND_DATA find;
HANDLE hFind = FindFirstFile( strPathFiles, &find);
CString folder2=m_Fullpath;
folder2.TrimRight('\\');
int pos=folder2.ReverseFind('\\');
folder2=folder2.Left(pos+1);
t_FileData FileData;
FileData.Name="..";
FileData.lName="..";
FileData.bIsDir=TRUE;
m_IndexMapping.push_back(0);
FileData.nSize=-1;
m_FileData.push_back(FileData);
int nItemCount=1;
while ( hFind!=INVALID_HANDLE_VALUE)
{
if (!(find.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY && (!_tcscmp(find.cFileName, _T("..")) || !_tcscmp(find.cFileName, _T(".")))))
{
t_FileData FileData;
FileData.Name=find.cFileName;
FileData.lName=find.cFileName;
FileData.lName.MakeLower();
FileData.Time=find.ftLastWriteTime;
if ( find.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
FileData.bIsDir=TRUE;
FileData.nSize=-1;
}
else
{
FileData.bIsDir=FALSE;
FileData.nSize=(_int64)find.nFileSizeLow + ((_int64)find.nFileSizeHigh<<32);
}
m_FileData.push_back(FileData);
m_IndexMapping.push_back(nItemCount);
nItemCount++;
}
//#define SPEEDTEST 20000
#ifndef SPEEDTEST
if (nItemCount==100)
{
VERIFY(PostMessage(WM_APP + 1, bDidHaveFocus, (LPARAM)hFind));
return;
}
#endif //SPEEDTEST
if (!FindNextFile(hFind, &find))
{
FindClose(hFind);
hFind=0;
#ifdef SPEEDTEST
//Speed test code with SPEEDTEST files
if (nItemCount>1 && nItemCount<SPEEDTEST)
hFind = FindFirstFile( strPathFiles, &find);
else
break;
#else
break;
#endif //SPEEDTEST
}
}
m_bUpdating=FALSE;
SetItemCount(nItemCount);
SortList(m_sortcolumn,m_sortdir);
EnableWindow(TRUE);
SetRedraw( TRUE );
if (bDidHaveFocus)
SetFocus();
UpdateStatusBar();
}
void CLocalFileListCtrl::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
if (static_cast<int>(m_IndexMapping.size())<=pItem->iItem)
return;
if (static_cast<int>(m_FileData.size())<=m_IndexMapping[pItem->iItem])
return;
if (pItem->mask & LVIF_IMAGE && !pItem->iSubItem)
{
if (m_FileData[m_IndexMapping[pItem->iItem]].iIcon!=-1)
pItem->iImage=m_FileData[m_IndexMapping[pItem->iItem]].iIcon;
else
{
CString path;
if (m_FileData[m_IndexMapping[pItem->iItem]].lName=="..")
path="alkjhgfdfghjjhgfdghuztxvbhzt";
else
{
path=m_Fullpath+m_FileData[m_IndexMapping[pItem->iItem]].Name;
if (m_Fullpath=="")
path+="\\";
}
int iIcon=-1;
SHFILEINFO shFinfo;
memset(&shFinfo,0,sizeof(SHFILEINFO));
if (SHGetFileInfo( path,
m_FileData[m_IndexMapping[pItem->iItem]].bIsDir?FILE_ATTRIBUTE_DIRECTORY:FILE_ATTRIBUTE_NORMAL,
&shFinfo,
sizeof( SHFILEINFO ),
SHGFI_ICON | ((m_FileData[m_IndexMapping[pItem->iItem]].lName=="..")?SHGFI_USEFILEATTRIBUTES:0) ) )
{
iIcon = shFinfo.iIcon;
// we only need the index from the system image ctrl
DestroyIcon( shFinfo.hIcon );
m_FileData[m_IndexMapping[pItem->iItem]].iIcon=iIcon;
}
pItem->iImage=iIcon;
}
}
if (pItem->mask & LVIF_TEXT)
{
if (!pItem->pszText)
return;
if (!m_Columns[pItem->iSubItem])
{
lstrcpy(pItem->pszText, m_FileData[m_IndexMapping[pItem->iItem]].Name);
}
else if (m_Columns[pItem->iSubItem]==2 && (pItem->iItem||(m_Fullpath=="")))
{
CString type=GetType(m_FileData[m_IndexMapping[pItem->iItem]].lName, m_FileData[m_IndexMapping[pItem->iItem]].bIsDir);
lstrcpy(pItem->pszText,type);
}
else if (m_Columns[pItem->iSubItem]==1)
{
__int64 size=m_FileData[m_IndexMapping[pItem->iItem]].nSize;
if (size!=-1)
{
int nFormat=COptions::GetOptionVal(OPTION_LOCALFILESIZEFORMAT);
if (!nFormat)
if (size<1024)
nFormat=1;
else if (size<(1024*1024))
nFormat=2;
else
nFormat=3;
CString tmp, sizestr;
switch (nFormat)
{
case 1:
sizestr.Format(_T("%I64d"), size);
break;
case 2:
tmp.LoadString(IDS_SIZE_KBS);
sizestr.Format(_T("%I64d %s"), size/1024, tmp);
break;
case 3:
tmp.LoadString(IDS_SIZE_MBS);
sizestr.Format(_T("%I64d %s"), size/1024/1024, tmp);
break;
default:
ASSERT(FALSE);
}
lstrcpy(pItem->pszText,sizestr);
}
}
else if (m_Columns[pItem->iSubItem]==3 && m_Fullpath!=_T("") && pItem->iItem)
{
CTime time=m_FileData[m_IndexMapping[pItem->iItem]].Time;
SYSTEMTIME timeDest;
time.GetAsSystemTime( timeDest ) ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?