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) );
}
}