⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftplistctrl.cpp

📁 一个支持FTP,SFTP的客户端程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					if (openindex==m_pDirectory->num)
						ChangeDir(m_pDirectory->path,"..",FALSE,FZ_LIST_USECACHE|FZ_LIST_EXACT);
					else if (m_pDirectory->direntry[openindex].dir)
						ChangeDir(m_pDirectory->path,m_pDirectory->direntry[openindex].name,FALSE,FZ_LIST_USECACHE|FZ_LIST_EXACT);
				}
				else
				{
					if (openindex!=-1 && m_pDirectory->direntry[openindex].dir)
					{
						t_folder folder;
						folder.path = m_pDirectory->path;
						folder.subdir = m_pDirectory->direntry[openindex].name;
						m_PathsToVisit.push_back(folder);
						pMainFrame->m_pCommandQueue->SetLock(TRUE);
					}
					if (!m_PathsToVisit.empty())
					{
						m_nFolderDownloadStart = TRUE;
						m_PathsVisited.push_front(m_pDirectory->path);
						m_nBatchAction = 1;
						DoNextStep();
					}
					else
						pMainFrame->TransferQueue(2);
				}
			}
			else if (pMsg->wParam == VK_BACK)
			{
				if (m_pDirectory)
					ChangeDir(m_pDirectory->path, "..", FALSE, FZ_LIST_USECACHE|FZ_LIST_EXACT);
				else
					MessageBeep(MB_ICONEXCLAMATION);
			}
		}
	}	
	return CListCtrl::PreTranslateMessage(pMsg);
}

void CFtpListCtrl::OnFtpcontextRename() 
{
	if (!GetItemCount() || !m_pDirectory)
		return;
	
	CMainFrame *pMainFrame = DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());
	if (pMainFrame->m_pCommandQueue->IsLocked())
		return;
	if (m_nBatchAction || !m_PathsToVisit.empty() || !m_PathsVisited.empty())
		return;

	ASSERT(GetSelectedCount()==1);
	if (pMainFrame->m_pCommandQueue->IsBusy())
	{
		MessageBeep(MB_ICONEXCLAMATION);
		return;
	}
	POSITION selpos = GetFirstSelectedItemPosition();
	int index = GetNextSelectedItem(selpos);
	EditLabel(index);
}


// this Function Returns the first Selected Item In the List
UINT CFtpListCtrl::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;
}

void CFtpListCtrl::OnFtpcontextCreatedir() 
{
	if (!GetItemCount() || !m_pDirectory)
		return;

	CMainFrame *pMainFrame=DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());
	if (pMainFrame->m_pCommandQueue->IsLocked())
		return;
	if (m_nBatchAction || !m_PathsToVisit.empty() || !m_PathsVisited.empty())
		return;

	CEnterSomething dlg(IDS_INPUTDIALOGTITLE_CREATEDIR, IDS_INPUTDIALOGTEXT_CREATEDIR);
	if (pMainFrame->m_pCommandQueue->IsBusy())
	{
		MessageBeep(MB_ICONEXCLAMATION);
		return;
	}
	CServerPath path = m_pDirectory->path;
	CServerPath tmpPath = path;
	tmpPath.AddSubdir( _T("\001\002\003\004\005") );
	CString tmp = tmpPath.GetPath();
	int pos = tmp.Find( _T("\001\002\003\004\005") );
	if (pos == -1)
	{
		MessageBeep(MB_ICONEXCLAMATION);
		return;
	}
	CString tmp2;
	tmp2.LoadString(IDS_SITEMANAGER_NEWFOLDER);
	tmp.Replace(_T("\001\002\003\004\005"), tmp2);
	dlg.m_String = tmp;
	dlg.m_nPreselectMin = pos;
	dlg.m_nPreselectMax = pos + tmp2.GetLength();
	if (dlg.DoModal() == IDOK)
	{
		if (!path.ChangePath(dlg.m_String))
		{
			MessageBeep(MB_ICONEXCLAMATION);
			return;
		}
		else if (!path.HasParent())
		{
			MessageBeep(MB_ICONEXCLAMATION);
			return;
		}
		CMainFrame *pMainFrame = DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());
		if (!pMainFrame->m_pCommandQueue->MakeDir(path))
		{
			MessageBeep(MB_ICONEXCLAMATION);
			return;
		}
	}
}

void CFtpListCtrl::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_DATE);
		i++;
	}
	if (!(m_nHideColumns&8))
	{
		ReloadHeaderItem(i, IDS_HEADER_TIME);
		i++;
	}
	if (!(m_nHideColumns & 0x10))
	{
		ReloadHeaderItem(i, IDS_HEADER_PERMISSIONS);
		i++;
	}
	if (!(m_nHideColumns & 0x20))
	{
		ReloadHeaderItem(i, IDS_HEADER_OWNERGROUP);
	}
}

void CFtpListCtrl::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 CFtpListCtrl::OnFtpcontextAttributes() 
{
	CMainFrame *pMainFrame=DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());
	if (pMainFrame->m_pCommandQueue->IsLocked())
		return;
	if (pMainFrame->m_pCommandQueue->IsBusy())
	{
		MessageBeep(MB_ICONEXCLAMATION);
		return;
	}
	POSITION selpos=GetFirstSelectedItemPosition();
	if (!selpos)
		return;
	int count=0;
	int permbuffer[9];
	memset(permbuffer,0,sizeof(int)*9);
	int index;
	while (selpos)
	{
		int nItem = GetNextSelectedItem(selpos);
		if (!nItem)
			continue;
		index=m_IndexMapping[nItem];
	
		CString permissions = m_pDirectory->direntry[index].permissionstr;
		permissions.MakeLower();

		if (permissions.GetLength() >= 10)
		{
			//Owner permissions
			if (permissions[1]=='r')
				permbuffer[0]++;
			if (permissions[2]=='w')
				permbuffer[1]++;
			if (permissions[3]=='x')
				permbuffer[2]++;
	
			//Group permissions
			if (permissions[4]=='r')
				permbuffer[3]++;
			if (permissions[5]=='w')
				permbuffer[4]++;
			if (permissions[6]=='x')
				permbuffer[5]++;

			//Public permissions
			if (permissions[7]=='r')
				permbuffer[6]++;
			if (permissions[8]=='w')
				permbuffer[7]++;
			if (permissions[9]=='x')
				permbuffer[8]++;
		}

		count++;
	}
	if (!count)
		return;

	CFileAttributes dlg;
	for (int i=0;i<9;i++)
	{
		if (permbuffer[i])
			if (permbuffer[i]!=count)
				permbuffer[i]=2;
			else
				permbuffer[i]=1;
	}
	memcpy(dlg.m_permbuffer, permbuffer, sizeof(int)*9);

	dlg.SetFileCount(count);
	
	if (count>1)
		dlg.m_text.LoadString(IDS_CHANGEDIALOG_MULTIPLEFILES);
	else
		dlg.m_text.Format(m_pDirectory->direntry[index].dir?IDS_CHANGEDIALOG_DIRECTORY:IDS_CHANGEDIALOG_FILE, m_pDirectory->direntry[index].name);
	if (dlg.DoModal()==IDOK)
	{
		selpos=GetFirstSelectedItemPosition();
		BOOL bChanged=FALSE;
		while(selpos)
		{
			int nItem=GetNextSelectedItem(selpos);
			if (!nItem)
				continue;
			int index=m_IndexMapping[nItem];
			CString permissions=m_pDirectory->direntry[index].permissionstr;
			permissions.MakeLower();
			int value=0;
			
			//Owner permissions
			if (dlg.m_permbuffer[0]==2)
			{
				if (permissions[1]=='r')
					value+=400;
			}
			else if (dlg.m_permbuffer[0]==1)
				value+=400;
			
			if (dlg.m_permbuffer[1]==2)
			{
				if (permissions[2]=='w')
					value+=200;
			}
			else if (dlg.m_permbuffer[1]==1)
				value+=200;

			if (dlg.m_permbuffer[2]==2)
			{
				if (permissions[3]=='x')
					value+=100;
			}
			else if (dlg.m_permbuffer[2]==1)
				value+=100;
			
			//Group permissions
			if (dlg.m_permbuffer[3]==2)
			{
				if (permissions[4]=='r')
					value+=40;
			}
			else if (dlg.m_permbuffer[3]==1)
				value+=40;
			
			if (dlg.m_permbuffer[4]==2)
			{
				if (permissions[5]=='w')
					value+=20;
			}
			else if (dlg.m_permbuffer[4]==1)
				value+=20;

			if (dlg.m_permbuffer[5]==2)
			{
				if (permissions[6]=='x')
					value+=10;
			}
			else if (dlg.m_permbuffer[5]==1)
				value+=10;
			
			//Public permissions
			if (dlg.m_permbuffer[6]==2)
			{
				if (permissions[7]=='r')
					value+=4;
			}
			else if (dlg.m_permbuffer[6]==1)
				value+=4;
			
			if (dlg.m_permbuffer[7]==2)
			{
				if (permissions[8]=='w')
					value+=2;
			}
			else if (dlg.m_permbuffer[7]==1)
				value+=2;

			if (dlg.m_permbuffer[8]==2)
			{
				if (permissions[9]=='x')
					value+=1;
			}
			else if (dlg.m_permbuffer[8]==1)
				value+=1;
			
			if (dlg.m_permbuffer[9])
				value += dlg.m_permbuffer[9] * 1000;

			if (!pMainFrame->m_pCommandQueue->Chmod(value, m_pDirectory->direntry[index].name, m_pDirectory->path, TRUE))
				MessageBeep(MB_ICONEXCLAMATION);
			else
				bChanged=TRUE;
		}
		if (bChanged)
		{
			if (m_pDirectory)
				pMainFrame->m_pCommandQueue->List(m_pDirectory->path, 0, TRUE);
			else
				pMainFrame->m_pCommandQueue->List(0, TRUE);
		}
	}
}	

void CFtpListCtrl::OnFtpcontextDownloadas() 
{
	if (!GetItemCount() || !m_pDirectory)
		return;

	CMainFrame *pMainFrame=DYNAMIC_DOWNCAST(CMainFrame,GetParentFrame());
	if (pMainFrame->m_pCommandQueue->IsLocked())
		return;
	if (m_nBatchAction || !m_PathsToVisit.empty() || !m_PathsVisited.empty())
		return;

	CTransferAsDlg dlg;
	if (dlg.DoModal() == IDOK)
	{
		m_transferuser = dlg.m_User;
		m_transferpass = dlg.m_Pass;
		if (dlg.m_bTransferNow)
			OnFtpcontextDownload();
		else
			OnFtpcontextAddtoqueue();
	}	
}

void CFtpListCtrl::SetListStyle(int nStyle)
{
	if (!nStyle)
		m_nStyle=LVS_REPORT;
	else if (nStyle==1)
		m_nStyle=LVS_LIST;
	else if (nStyle==2)
		m_nStyle=LVS_ICON;
	else if (nStyle==3)
		m_nStyle=LVS_SMALLICON;
	int remove=~m_nStyle & (LVS_REPORT|LVS_ICON|LVS_SMALLICON|LVS_LIST);
	ModifyStyle(remove, m_nStyle, SWP_NOZORDER);
	
	GetSysImgList();
	CHeaderCtrl *header = GetHeaderCtrl( );
	if (header)
		header->SetImageList(&m_SortImg);
	Arrange(LVA_DEFAULT);
	if (m_nStyle != LVS_REPORT)
		SortList(0,1);
}

void CFtpListCtrl::UpdateColumns(int nHideColumns)
{
	CString str;
	if (nHideColumns&1 && !(m_nHideColumns&1))
	{
		m_Columns[1] = m_Columns[2];
		m_Columns[2] = m_Columns[3];
		m_Columns[3] = m_Columns[4];
		m_Columns[4] = m_Columns[5];
		m_Columns[5] = m_Columns[6];
		m_Columns[6] = 0;
		
		DeleteColumn(1);
		if (m_sortcolumn == 1)
			SortList(0, 1);
		if (m_sortcolumn > 1)
			m_sortcolumn--;
	}
	else if (m_nHideColumns&1 && !(nHideColumns&1))
	{
		m_Columns[5] = m_Columns[4];
		m_Columns[4] = m_Columns[3];
		m_Columns[3] = m_Columns[2];
		m_Columns[2] = m_Columns[1];
		m_Columns[1] = 1;
		str.LoadString(IDS_HEADER_FILESIZE);
		InsertColumn(1, str, LVCFMT_RIGHT, 70);
		if (m_sortcolumn >= 1)
			m_sortcolumn++;
		RedrawItems(1, GetItemCount()-1);
	}
	if (nHideColumns&2 && !(m_nHideColumns&2))
	{
		for (int i=1; i<3; i++)
		{
			if (m_Columns[i] == 2)
			{
				int j = i;
				while (j < 6)
				{
					m_Columns[j] = m_Columns[j+1];
					j++;
				}
				m_Columns[j] = 5;
				DeleteColumn(i);		
				if (m_sortcolumn==i)
					SortList(0, 1);
				if (m_sortcolumn > i)
					m_sortcolumn--;
				break;
			}
		}
	}
	else if (m_nHideColumns&2 && !(nHideColumns&2))
	{
		for (int i=1; i<3; i++)
		{
			if (m_Columns[i] >= 3)
			{
				int j = 6;
				while (j != i)
				{
					m_Columns[j] = m_Columns[j-1];
					j--;
				}
				m_Columns[i] = 2;

				str.LoadString(IDS_HEADER_FILETYPE);
				InsertColumn(i, str, LVCFMT_LEFT, 80);
				if (m_sortcolumn >= i)
					m_sortcolumn++;
				RedrawItems(1, GetItemCount()-1);
				break;
			}
		}
	}
	if (nHideColumns&4 && !(m_nHideColumns&4))
	{
		for (int i=1; i<4; i++)
		{
			if (m_Columns[i] == 3)
			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -