www.pudn.com > NetPaw.rar > FileView.cpp


// FileView.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "NetPaw.h" 
#include "mainfrm.h" 
#include "netpawdoc.h" 
#include "downloadfile.h" 
#include "leftview.h" 
#include "netpawview.h" 
#include ".\fileview.h" 
 
 
// CFileView 
 
IMPLEMENT_DYNCREATE(CFileView, CListView) 
 
CFileView::CFileView() 
	: m_nShowClassID(0) 
{ 
} 
 
CFileView::~CFileView() 
{ 
} 
 
BEGIN_MESSAGE_MAP(CFileView, CListView) 
	ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnLvnItemChanged) 
	ON_WM_CONTEXTMENU() 
	ON_COMMAND(ID_BTNRESTART, OnBtnRestart) 
	ON_UPDATE_COMMAND_UI(ID_BTNRESTART, OnUpdateBtnRestart) 
	ON_COMMAND(ID_BTNSTOP, OnBtnStop) 
	ON_UPDATE_COMMAND_UI(ID_BTNSTOP, OnUpdateBtnStop) 
	ON_COMMAND(ID_DLITEM_DELETE, OnDlItemDelete) 
	ON_UPDATE_COMMAND_UI(ID_DLITEM_DELETE, OnUpdateDlItemDelete) 
	ON_WM_INITMENUPOPUP() 
END_MESSAGE_MAP() 
 
 
// CFileView 诊断 
 
#ifdef _DEBUG 
void CFileView::AssertValid() const 
{ 
	CListView::AssertValid(); 
} 
 
void CFileView::Dump(CDumpContext& dc) const 
{ 
	CListView::Dump(dc); 
} 
 
CNetPawDoc* CFileView::GetDocument() // 非调试版本是内联的 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CNetPawDoc))); 
	return (CNetPawDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
 
// CFileView 消息处理程序 
 
BOOL CFileView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: 在此添加专用代码和/或调用基类 
	cs.style &= ~LVS_TYPEMASK; 
	cs.style |= LVS_REPORT; 
 
	return CListView::PreCreateWindow(cs); 
} 
 
void CFileView::OnInitialUpdate() 
{ 
	CListView::OnInitialUpdate(); 
 
	CListCtrl &listCtrl = GetListCtrl(); 
	listCtrl.SetExtendedStyle( listCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT ); 
 
	// TODO: 在此添加专用代码和/或调用基类 
	ShowDownldFiles(); 
} 
 
// add a downloading item into the file list 
void CFileView::AddFileItem(LPCTSTR szFileName, LONGLONG nLength) 
{ 
	CListCtrl &listCtrl = GetListCtrl(); 
	int nItem = listCtrl.GetItemCount(); 
 
	// file name and file length 
	listCtrl.InsertItem(nItem, szFileName); 
 
	CString sTemp; 
	sTemp.Format( "%I64d", nLength/1024 ); // length in KB 
	listCtrl.SetItemText(nItem, 1, sTemp); 
 
	// select the last item 
	listCtrl.SetItemState( nItem, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED ); 
} 
 
// update file downloading ratio 
void CFileView::UpdateRatio(PERFITEM_S *pstPerfIT) 
{ 
	// find the file name in the list 
	CListCtrl &listCtrl = GetListCtrl(); 
	CString sFileName, sTemp; 
	for( int i = 0; i < listCtrl.GetItemCount(); i++ ) 
	{ 
		sFileName = listCtrl.GetItemText(i, 0); 
 
		if( sFileName.CompareNoCase(pstPerfIT->szFileName) == 0 ) 
		{ 
			// download speed 
			sTemp.Format("%.1f", pstPerfIT->fMeanSpeed); 
			listCtrl.SetItemText(i, 2, sTemp); 
 
			// download ratio 
			sTemp.Format("%.1f", pstPerfIT->fRatio); 
			listCtrl.SetItemText(i, 3, sTemp); 
 
			// time elapsed 
			sTemp.Format("%.1lf", pstPerfIT->dUsedTime); 
			listCtrl.SetItemText(i, 4, sTemp); 
 
			// current connections 
			sTemp.Format("%d", pstPerfIT->nConnects); 
			listCtrl.SetItemText(i, 5, sTemp); 
			break; 
		} 
	} 
} 
 
void CFileView::GetSelectedFileName(CString& sFileName) 
{ 
	sFileName = _T(""); 
	CListCtrl& listCtrl = GetListCtrl(); 
 
	POSITION pos = listCtrl.GetFirstSelectedItemPosition(); 
	if( pos ) 
	{ 
		int nItem = listCtrl.GetNextSelectedItem(pos); 
		sFileName  = listCtrl.GetItemText(nItem, 0); 
	} 
} 
 
void CFileView::OnTreeItemChanged(int nClassID) 
{ 
	m_nShowClassID = nClassID; 
 
	switch( nClassID ) 
	{ 
	case FOLDER_DOWNLDED: 
		ShowDownlded(); 
		break; 
 
	case FOLDER_FAVORITES: 
		ShowFavorites(); 
		break; 
 
	case FOLDER_DOWNLDING: 
	default: 
		ShowDownldFiles(); 
		break; 
	} 
} 
 
void CFileView::ShowDownldFiles(void) 
{ 
	CListCtrl& listCtrl = GetListCtrl(); 
	listCtrl.DeleteAllItems(); 
 
	for(int nCol = listCtrl.GetHeaderCtrl()->GetItemCount() - 1; nCol >= 0; nCol--) 
	{ 
		listCtrl.DeleteColumn(nCol); 
	} 
 
	// TODO: 在此添加专用代码和/或调用基类 
	listCtrl.InsertColumn(0, "文件名", LVCFMT_LEFT, 200); 
	listCtrl.InsertColumn(1, "长度(KB)", LVCFMT_LEFT, 100); 
	listCtrl.InsertColumn(2, "速度(KB/S)", LVCFMT_LEFT, 100); 
	listCtrl.InsertColumn(3, "完成(%)", LVCFMT_LEFT, 80); 
	listCtrl.InsertColumn(4, "用时(S)", LVCFMT_LEFT, 100); 
	listCtrl.InsertColumn(5, "连接数", LVCFMT_LEFT, 100); 
 
	// add downloading file item 
	CNetPawDoc *pDoc = GetDocument(); 
	map::iterator itor; 
 
	CDownloadFile *pDlFile; 
	PERFITEM_S stPerfData; 
	for( itor = pDoc->m_mapDownldFile.begin(); itor != pDoc->m_mapDownldFile.end(); itor++) 
	{ 
		pDlFile = itor->second; 
		if( pDlFile ) 
		{ 
			pDlFile->GetPerfData(&stPerfData); 
			AddFileItem(stPerfData.szFileName, stPerfData.nFileLength); 
		} 
	} 
 
	// redraw meter view 
	GetDocument()->UpdateAllViews(this); 
} 
 
void CFileView::ShowDownlded(void) 
{ 
	CListCtrl& listCtrl = GetListCtrl(); 
 
	// save selected item 
	POSITION pos = listCtrl.GetFirstSelectedItemPosition(); 
	int nItem = listCtrl.GetNextSelectedItem(pos); 
 
	// remove all items 
	listCtrl.DeleteAllItems(); 
	for(int nCol = listCtrl.GetHeaderCtrl()->GetItemCount() - 1; nCol >= 0; nCol--) 
	{ 
		listCtrl.DeleteColumn(nCol); 
	} 
 
	// TODO: 在此添加专用代码和/或调用基类 
	listCtrl.InsertColumn(0, "文件名", LVCFMT_LEFT, 200); 
	listCtrl.InsertColumn(1, "长度(KB)", LVCFMT_LEFT, 100); 
	listCtrl.InsertColumn(2, "速度(KB/S)", LVCFMT_LEFT, 100); 
	listCtrl.InsertColumn(3, "用时(S)", LVCFMT_LEFT, 100); 
 
	// insert a sample item 
	// add downloading file item 
	CNetPawDoc *pDoc = GetDocument(); 
	list::iterator itor; 
 
	DONEITEM_S *pstDoneIt; 
	for( itor = pDoc->m_lstDownloaded.begin(); itor != pDoc->m_lstDownloaded.end(); itor++) 
	{ 
		pstDoneIt = *itor; 
		if( pstDoneIt ) 
		{ 
			AddDownldedItem(pstDoneIt); 
		} 
	} 
 
	// select the item 
	if( nItem == -1 ) 
	{ 
		nItem = 0; 
	} 
	listCtrl.SetItemState( nItem, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED ); 
} 
 
void CFileView::ShowFavorites(void) 
{ 
	CListCtrl& listCtrl = GetListCtrl(); 
	listCtrl.DeleteAllItems(); 
 
	for(int nCol = listCtrl.GetHeaderCtrl()->GetItemCount() - 1; nCol >= 0; nCol--) 
	{ 
		listCtrl.DeleteColumn(nCol); 
	} 
 
	// TODO: 在此添加专用代码和/或调用基类 
	listCtrl.InsertColumn(0, "文件名", LVCFMT_LEFT, 200); 
	listCtrl.InsertColumn(1, "下载网站", LVCFMT_LEFT, 240); 
 
	// insert a sample item 
	listCtrl.InsertItem(0, _T("sample.rar")); 
 
	CString sWebSite = _T("http://www.6663.net"); 
	listCtrl.SetItemText(0, 1, sWebSite); 
 
	// select the first item 
	listCtrl.SetItemState( 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED ); 
} 
 
void CFileView::OnLvnItemChanged(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
	LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); 
 
	// 如果选定的文件改变,则更新CNetPawView 
	CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); 
	CNetPawView *pView2 = pFrame->GetRightPane2(); 
	if( pView2 ) 
	{ 
		pView2->Invalidate(); 
	} 
 
	*pResult = 0; 
} 
 
void CFileView::AddDownldedItem(DONEITEM_S *pstDoneIt) 
{ 
	CListCtrl &listCtrl = GetListCtrl(); 
	int nItem = listCtrl.GetItemCount(); 
 
	// file name and file length 
	listCtrl.InsertItem(nItem, pstDoneIt->szFileName); 
 
	CString sTemp; 
	sTemp.Format( "%I64d", pstDoneIt->nFileLen/1024 ); // length in KB 
	listCtrl.SetItemText(nItem, 1, sTemp); 
 
	// download speed 
	sTemp.Format("%.1f", pstDoneIt->fMeanSpeed); 
	listCtrl.SetItemText(nItem, 2, sTemp); 
 
	// time elapsed 
	sTemp.Format("%.1lf", pstDoneIt->dUsedTime); 
	listCtrl.SetItemText(nItem, 3, sTemp); 
} 
 
void CFileView::OnUpdate(CView* /*pSender*/, LPARAM lHint, CObject* /*pHint*/) 
{ 
	// TODO: 在此添加专用代码和/或调用基类 
	switch( m_nShowClassID ) 
	{ 
	case FOLDER_DOWNLDING: 
		if( lHint ) 
		{ 
			ShowDownldFiles(); 
		} 
		else 
		{ 
			UpdateDownldItems(); 
		} 
		break; 
 
	case FOLDER_DOWNLDED: 
		ShowDownlded(); 
		break; 
 
	default: 
		break; 
	} 
} 
 
void CFileView::UpdateDownldItems(void) 
{ 
	CDownloadFile *pDlFile; 
	PERFITEM_S stPerfData; 
	map::iterator itor; 
 
	CNetPawDoc *pDoc = (CNetPawDoc *)GetDocument(); 
	for( itor = pDoc->m_mapDownldFile.begin(); itor != pDoc->m_mapDownldFile.end(); itor++ ) 
	{ 
		pDlFile = itor->second; 
		if( !pDlFile ) 
		{ 
			continue; 
		} 
 
		pDlFile->GetPerfData(&stPerfData); 
 
		// indicate downloading ratio 
		UpdateRatio(&stPerfData); 
 
		// set status bar for download speed 
		if( stPerfData.fSpeed > pDoc->m_nMaxSpeed ) 
		{ 
			pDoc->m_nMaxSpeed = (int)stPerfData.fSpeed; 
		} 
 
		// only selected item are show in meter view 
		if( (pDlFile == pDoc->GetSelDownFile()) && (pDoc->m_nMaxSpeed > 0) ) 
		{ 
			int nSpeed = (int)stPerfData.fSpeed * 100 / pDoc->m_nMaxSpeed; 
 
			CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); 
			pFrame->SendMessage(WM_USER_NETSPEED, (WPARAM)nSpeed); 
		} 
	} 
} 
 
void CFileView::OnContextMenu(CWnd* pWnd, CPoint point) 
{ 
	// TODO: 在此处添加消息处理程序代码 
	CMenu menu; 
	menu.LoadMenu(IDR_MNUPOPUP); 
	CMenu *pPopup = menu.GetSubMenu(0); 
	if( pPopup ) 
	{ 
		pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, pWnd); 
	} 
} 
 
void CFileView::OnBtnRestart() 
{ 
	CNetPawDoc *pDoc = GetDocument(); 
	if( pDoc ) 
	{ 
		CDownloadFile *pDlFile = pDoc->GetSelDownFile(); 
		if( pDlFile ) 
		{ 
			pDlFile->Restart( AfxGetMainWnd()->GetSafeHwnd() ); 
		} 
	} 
} 
 
void CFileView::OnUpdateBtnRestart(CCmdUI *pCmdUI) 
{ 
	// TODO: 在此添加命令更新用户界面处理程序代码 
	CNetPawDoc *pDoc = GetDocument(); 
	CDownloadFile *pDlFile = pDoc->GetSelDownFile(); 
 
	pCmdUI->Enable( pDlFile && pDlFile->IsStopped() && !pDlFile->IsFinished() ); 
} 
 
void CFileView::OnBtnStop() 
{ 
	// TODO: 在此添加命令处理程序代码 
	CNetPawDoc *pDoc = GetDocument(); 
	if( pDoc ) 
	{ 
		CDownloadFile *pDlFile = pDoc->GetSelDownFile(); 
		if( pDlFile ) 
		{ 
			pDlFile->Stop(); 
		} 
	} 
} 
 
void CFileView::OnUpdateBtnStop(CCmdUI *pCmdUI) 
{ 
	CNetPawDoc *pDoc = GetDocument(); 
	CDownloadFile *pDlFile = pDoc->GetSelDownFile(); 
 
	pCmdUI->Enable( pDlFile && !pDlFile->IsStopDownld() ); 
} 
 
void CFileView::OnDlItemDelete() 
{ 
	CNetPawDoc *pDoc = GetDocument(); 
	switch(m_nShowClassID) 
	{ 
	case FOLDER_DOWNLDED: 
		{ 
			DONEITEM_S* pDoneIt = pDoc->GetSelDownloaded(); 
			pDoc->DeleteDownlded(pDoneIt); 
		} 
		break; 
 
	case FOLDER_FAVORITES: 
		break; 
 
	case FOLDER_DOWNLDING: 
	default: 
		{ 
			CDownloadFile *pDlFile = pDoc->GetSelDownFile(); 
			pDoc->DeleteDlFile(pDlFile); 
		} 
		break; 
	} 
} 
 
void CFileView::OnUpdateDlItemDelete(CCmdUI *pCmdUI) 
{ 
	BOOL bResult = FALSE; 
	CNetPawDoc *pDoc = GetDocument(); 
 
	switch(m_nShowClassID) 
	{ 
	case FOLDER_DOWNLDED: 
		{ 
			DONEITEM_S* pDoneIt = pDoc->GetSelDownloaded(); 
			bResult = (pDoneIt != NULL); 
		} 
		break; 
 
	case FOLDER_FAVORITES: 
		break; 
 
	case FOLDER_DOWNLDING: 
	default: 
		{ 
			CDownloadFile *pDlFile = pDoc->GetSelDownFile(); 
			bResult = ( pDlFile && pDlFile->IsStopped() ); 
		} 
		break; 
	} 
 
	pCmdUI->Enable( bResult ); 
} 
 
// We have to add this when using update ui mechanism in no-CFrameWnd derived class 
void CFileView::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{ 
	CListView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); 
 
	// TODO: 在此处添加消息处理程序代码 
	CMainFrame* pFrameWnd = (CMainFrame* )AfxGetMainWnd(); 
    if(NULL != pFrameWnd) 
	{ 
        pFrameWnd->SendMessage( WM_INITMENUPOPUP, 
			WPARAM(pPopupMenu->m_hMenu), MAKELPARAM(nIndex, bSysMenu) ); 
	} 
}