FilesListCtrl.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:43k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // FilesListCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "FilesListCtrl.h"
  6. #include "FileDB.h"
  7. #include "FileTorrent.h"
  8. #include "Download.h"
  9. #include "MonitorWnd.h"
  10. #include "FileBase.h"
  11. #include "DlgNewDownload.h"
  12. #include "CategoryNewDlg.h"
  13. #include "CategoryBarWnd.h"
  14. #include "SetupRegister.h"
  15. #include "DlgRunParameters.h"
  16. #include "DlgDeleteFileDBItem.h"
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. #define DISPLAY_TIMEOUT_ID 1 
  23. #define DISPLAY_TIMEOUT 3000
  24. #define ID_MENUITEM_SHOW_COLUMN 52826
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CFilesListCtrl
  27. CFilesListCtrl::CFilesListCtrl() : 
  28. CListCtrlBaseEx("filelistctrl", true), m_menuspawnPopup(true)
  29. {
  30. m_bDeleteing = false;
  31. m_iSortedCol = eModifiedTime + 1;
  32. m_pMonitorWnd = 0;
  33. m_pCategoryBarWnd = 0;
  34. m_pSetupRegister = 0;
  35. //
  36. // column infos.
  37. //
  38. CString m_strArrToolTip[eAllSize];
  39. CString m_strArrFieldNames[eAllSize];
  40. bool m_bColumnNumeric[eAllSize];
  41. m_strArrToolTip[eIcon] = "箭头向下:下载没有完成.rn箭头向上:下载已经完成,正在做种.rn灰色:尚未连接到服务器rn红色:没有连接到到其他下载者rn蓝色:在你连接的其他客户端中没有种子rn黄色:你没有收到任何外部连接,可能是内网rn绿色:运行良好";
  42. m_strArrToolTip[eFileName] = "文件名";
  43. m_strArrToolTip[eCompleted] = "已下载完成数据的比例";
  44. m_strArrToolTip[eFilesize] = "文件大小";
  45. m_strArrToolTip[eTimeleft] = "完全完成下载的剩余时间";
  46. m_strArrToolTip[eTimerunned] = "已经运行的时间";
  47. m_strArrToolTip[eDownloadrate] = "下载速度";
  48. m_strArrToolTip[eUploadrate] = "上传速度";
  49. m_strArrToolTip[eSeeds] = "种子数量/所有连接数量";
  50. m_strArrToolTip[eCreateTime] = "创建时间";
  51. m_strArrToolTip[eModifiedTime] = "最后一次运行的时间";
  52. m_strArrFieldNames[eIcon] = "状态";
  53. m_strArrFieldNames[eFileName] = "文件名";
  54. m_strArrFieldNames[eCompleted] = "已完成";
  55. m_strArrFieldNames[eFilesize] = "文件大小";
  56. m_strArrFieldNames[eTimeleft] = "剩余时间";
  57. m_strArrFieldNames[eTimerunned] = "已运行时间";
  58. m_strArrFieldNames[eDownloadrate] = "下载速度";
  59. m_strArrFieldNames[eUploadrate] = "上传速度";
  60. m_strArrFieldNames[eSeeds] = "种子/连接";
  61. m_strArrFieldNames[eCreateTime] = "创建时间";
  62. m_strArrFieldNames[eModifiedTime] = "修改时间";
  63. m_bColumnNumeric[eIcon] = false;
  64. m_bColumnNumeric[eFileName] = false;
  65. m_bColumnNumeric[eCompleted] = true;
  66. m_bColumnNumeric[eFilesize] = true;
  67. m_bColumnNumeric[eTimeleft] = true;
  68. m_bColumnNumeric[eTimerunned] = true;
  69. m_bColumnNumeric[eDownloadrate] = true;
  70. m_bColumnNumeric[eUploadrate] = true;
  71. m_bColumnNumeric[eSeeds] = true;
  72. m_bColumnNumeric[eCreateTime] = false;
  73. m_bColumnNumeric[eModifiedTime] = false;
  74. for (int i=0; i<eAllSize; i++)
  75. AddColumn(m_strArrFieldNames[i], m_bColumnNumeric[i], 100, m_strArrToolTip[i]);
  76. }
  77. CFilesListCtrl::~CFilesListCtrl()
  78. {
  79. }
  80. BEGIN_MESSAGE_MAP(CFilesListCtrl, CListCtrlBaseEx)
  81. //{{AFX_MSG_MAP(CFilesListCtrl)
  82. ON_WM_CREATE()
  83. ON_WM_CONTEXTMENU()
  84. ON_COMMAND(ID_MENUITEM_DEL, OnMenuitemDel)
  85. ON_COMMAND(ID_MENUITEM_DOWNLOAD, OnMenuitemDownload)
  86. ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
  87. ON_COMMAND(ID_MENUITEM_STOP, OnMenuitemStop)
  88. ON_WM_TIMER()
  89. ON_WM_DESTROY()
  90. ON_COMMAND(ID_MENUITEM_MOVETO, OnMenuitemMoveto)
  91. ON_COMMAND(ID_MENUITEM_FILE_PROPERTY, OnMenuitemFileProperty)
  92. ON_COMMAND(ID_MENUITEM_COPY_TORRENT_FILE_PATH, OnMenuitemCopyTorrentFilePath)
  93. ON_WM_MEASUREITEM()
  94. ON_WM_DRAWITEM()
  95. //}}AFX_MSG_MAP
  96. // ON_NOTIFY_REFLECT(HDN_ITEMCLICK, OnItemclickSort)
  97. // ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemclickSort) 
  98. ON_NOTIFY_REFLECT(NM_DBLCLK, OnItemDblclk)
  99. // ON_NOTIFY_REFLECT_EX(LVN_COLUMNCLICK, OnItemclickSort)
  100. ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBegindrag)
  101. ON_COMMAND(ID_MENUITEM_PAUSE, OnMenuitemPause)
  102. ON_COMMAND(ID_MENUITEM_OPEN_DOWNLOADED_FILE, OnMenuitemOpenDownloadedFile)
  103. ON_COMMAND(ID_MENUITEM_RUN_PARAMETERS, OnMenuitemRunParamter)
  104. ON_COMMAND(ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY, OnMenuitemOpenDownloadedDirectory)
  105. ON_COMMAND(ID_MENUITEM_RESTORE, OnMenuitemRestore)
  106. ON_COMMAND_RANGE(ID_MENUITEM_MONITOR_INFORMATION, ID_MENUITEM_MONITOR_LOGS, OnMenuitemMonitorSub)
  107. ON_COMMAND_RANGE(ID_MENUITEM_SHOW_COLUMN, ID_MENUITEM_SHOW_COLUMN + eAllSize, OnMenuitemShowColumn)
  108. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  109. // ON_MESSAGE(DOWNLOAD_TERMINATED, OnDownloadTerminated)
  110. // ON_COMMAND(ID_MENUITEM_LOCATE_CATEGORY, OnMenuitemLocateCategory)
  111. // ON_COMMAND(ID_MENUITEM_DEL_LINK, OnMenuitemDelLink)
  112. END_MESSAGE_MAP()
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CFilesListCtrl message handlers
  115. void CFilesListCtrl::OnShowColumn(int iItem)
  116. {
  117. ShowFileDBItemText(iItem);
  118. ShowFileDBItemActive(iItem);
  119. }
  120. void CFilesListCtrl::SetSetupParameter()
  121. {
  122. assert(m_pSetupRegister);
  123. BOOL bRet = KillTimer(DISPLAY_TIMEOUT_ID);
  124. assert(bRet);
  125. bRet = SetTimer(DISPLAY_TIMEOUT_ID, m_pSetupRegister->m_lDisplayItval, 0);
  126. assert(bRet);
  127. }
  128. BOOL CFilesListCtrl::CreateEx(CWnd *pParent, CRect &rc, long lParam, CMonitorWnd* pMonitorWnd, CCategoryBarWnd* pCategoryBarWnd, CSetupRegister* pSetupRegister)
  129. {
  130. assert(pMonitorWnd && pMonitorWnd->GetSafeHwnd() && pCategoryBarWnd && pSetupRegister);
  131. m_pCategoryBarWnd = pCategoryBarWnd;
  132. m_pCategoryBarWnd->SetFilesListCtrl(this);
  133. m_pMonitorWnd = pMonitorWnd;
  134. m_pMonitorWnd->SetCateGoryBarWnd(m_pCategoryBarWnd);
  135. m_pSetupRegister = pSetupRegister;
  136. return Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT|LVS_SHOWSELALWAYS, rc, pParent, 10025);
  137. // return Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT, rc, pParent, 10025);
  138. // return Create(WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_REPORT|LVS_OWNERDRAWFIXED, rc, pParent, 10025);
  139. }
  140. int CFilesListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  141. {
  142. if (CListCtrlBaseEx::OnCreate(lpCreateStruct) == -1)
  143. return -1;
  144. //
  145. // for bitmap menu
  146. //
  147. ULONG ulCmdID[] = {CMenuSpawn::eUnusedImgCmdID, 
  148. CMenuSpawn::eUnusedImgCmdID, 
  149. CMenuSpawn::eUnusedImgCmdID, 
  150. CMenuSpawn::eUnusedImgCmdID,
  151. ID_MENUITEM_DOWNLOAD,
  152. ID_MENUITEM_PAUSE,
  153. ID_MENUITEM_STOP,
  154. ID_MENUITEM_DEL,
  155. CMenuSpawn::eUnusedImgCmdID,
  156. CMenuSpawn::eUnusedImgCmdID,
  157. CMenuSpawn::eNormalImgCmdID
  158. };
  159. m_menuspawnPopup.Create(IDB_IMAGELIST_MENU, IDB_IMAGELIST_MENU_DISABLED, sizeof(ulCmdID)/sizeof(ULONG), ulCmdID);
  160. //
  161. // Modify style.
  162. //
  163. SetExtendedStyle(LVS_EX_FULLROWSELECT ); // | LVS_EX_HEADERDRAGDROP);
  164. //
  165. // ImageList.
  166. //
  167. m_ctlImageDelete.Create(16, 17, ILC_COLOR8|ILC_MASK, 4, 4);
  168. m_ctlImageDelete.Add(AfxGetApp()->LoadIcon(IDI_ICON_DELETE));
  169. HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
  170. MAKEINTRESOURCE(IDB_IMAGELIST_DOWNLOAD),
  171. IMAGE_BITMAP,
  172. 0,0, 
  173. LR_CREATEDIBSECTION);
  174. CBitmap bm;
  175. bm.Attach(hbm);
  176. m_ctlImage.Create(16, 17, ILC_COLOR8|ILC_MASK, 11, 4);
  177. m_ctlImage.SetBkColor(::GetSysColor(COLOR_WINDOW)); 
  178. m_ctlImage.Add(&bm, (COLORREF)RGB(255,0,255));
  179. SetImageList(&m_ctlImage, LVSIL_SMALL);
  180. SetSortColumn(eIcon + 1);
  181. //
  182. // Set Timer.
  183. //
  184. SetTimer(DISPLAY_TIMEOUT_ID, m_pSetupRegister->m_lDisplayItval, 0);
  185. return 0;
  186. }
  187. void CFilesListCtrl::OnDestroy() 
  188. {
  189. assert(!m_bDeleteing);
  190. m_bDeleteing = true;
  191. CListCtrlBaseEx::OnDestroy();
  192. }
  193. void CFilesListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  194. {
  195. *pResult = 0;
  196. if (m_bDeleteing)
  197. return;
  198. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  199. if (pNMListView->uChanged == LVIF_STATE && 
  200. pNMListView->uNewState & LVIS_FOCUSED && 
  201. !(pNMListView->uOldState & LVIS_FOCUSED))
  202. {
  203. int nItem = pNMListView->iItem;
  204. CFileDBItem* pItem  = (CFileDBItem*)GetItemData(nItem);
  205. m_pMonitorWnd->Monitor(pItem);
  206. }
  207. }
  208. void CFilesListCtrl::OnItemDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
  209. {
  210. *pResult = 0;
  211. if (!m_pSetupRegister)
  212. {
  213. assert(false);
  214. return;
  215. }
  216. if (GetSelectedCount() == 1)
  217. {
  218. switch (m_pSetupRegister->m_eOperDbclickItem)
  219. {
  220. case CSetupRegister::eProperty:
  221. {
  222. OnMenuitemFileProperty();
  223. }
  224. break;
  225. case CSetupRegister::eRunning:
  226. {
  227. POSITION pos = GetFirstSelectedItemPosition();
  228. if (!pos)
  229. {
  230. assert(false);
  231. return;
  232. }
  233. int index = GetNextSelectedItem(pos);
  234. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  235. if (!pItem)
  236. {
  237. assert(false);
  238. return;
  239. }
  240. if (pItem->m_pDownload && !pItem->m_pDownload->IsPause())
  241. {
  242. OnMenuitemPause();
  243. }
  244. else
  245. {
  246. OnMenuitemDownload();
  247. }
  248. }
  249. break;
  250. default:
  251. assert(false);
  252. break;
  253. }
  254. }
  255. }
  256. /**********************************************************************
  257. refresh if some download corrupt and the download in current view.
  258. parameter:
  259. lParam : pointer to download object.
  260. **********************************************************************/
  261. void CFilesListCtrl::OnDownloadTerminated(long lParam, bool bCompletedMove)
  262. {
  263. bool bfind = false;
  264. for (int i=0; i<GetItemCount(); i++)
  265. {
  266. CFileDBItem* pItem = (CFileDBItem*)GetItemData(i);
  267. if (pItem && pItem == (CFileDBItem*)lParam)
  268. {
  269. if (bCompletedMove)
  270. {
  271. DeleteItem(i);
  272. }
  273. else
  274. {
  275. bfind = true;
  276. ShowFileDBItemText(i);
  277. m_pMonitorWnd->Monitor(pItem);
  278. }
  279. break;
  280. }
  281. }
  282. if (!bfind)
  283. {
  284. m_pMonitorWnd->Monitor(0);
  285. }
  286. // assert(bfind);
  287. }
  288. void CFilesListCtrl::LoadCatetory(CTreeCursor curItem, CFileDBItem* pFileDBItemSel) //const vector<CFileDBItem*>& vFileDBItems)
  289. {
  290. if (!GetSafeHwnd())
  291. return;
  292. m_curCursor = curItem;
  293. if (!m_curCursor)
  294. {
  295. assert(false);
  296. return;
  297. }
  298. // begin load.
  299. assert(!m_bDeleteing);
  300. m_bDeleteing = true;
  301. SetRedraw(false);
  302. DeleteAllItems();
  303. int iMonitorItem = -1;
  304. // m_pMonitorWnd->Monitor(0);
  305. CCategoryBarWnd::CCategoryDBItem* pItem = (CCategoryBarWnd::CCategoryDBItem*)m_curCursor.GetData();
  306. assert(pItem);
  307. vector<CFileDBItem*>& vFileDBItems = pItem->m_vFileDBItems;
  308. for (int i=0; i<vFileDBItems.size(); i++)
  309. {
  310. CFileDBItem* pItem = vFileDBItems[i];
  311. InsertItem(i, ""); // ctime(&pItem->m_tTime)); //, iImageID);
  312. SetItemData(i, (long)pItem);
  313. ShowFileDBItemText(i);
  314. if (pFileDBItemSel && pFileDBItemSel == pItem)
  315. iMonitorItem = i;
  316. }
  317. if (iMonitorItem != -1)
  318. {
  319. ClearSelectItems();
  320. CFileDBItem* pItem = (CFileDBItem*)GetItemData(iMonitorItem);
  321. if (pItem)
  322. {
  323. SetItemState(iMonitorItem, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  324. EnsureVisible(iMonitorItem, true);
  325. m_pMonitorWnd->Monitor(pItem);
  326. }
  327. }
  328. SortItems(Compare1, m_iSortedCol);
  329. if (iMonitorItem == -1)
  330. {
  331. if (!vFileDBItems.empty())
  332. {
  333. iMonitorItem = 0;
  334. CFileDBItem* pItem = (CFileDBItem*)GetItemData(iMonitorItem);
  335. if (pItem)
  336. {
  337. SetItemState(iMonitorItem, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  338. EnsureVisible(iMonitorItem, true);
  339. m_pMonitorWnd->Monitor(pItem);
  340. }
  341. }
  342. else
  343. {
  344. m_pMonitorWnd->Monitor(0);
  345. }
  346. }
  347. // refresh the status.
  348. OnTimer(DISPLAY_TIMEOUT_ID);
  349. SetRedraw(true);
  350. if (pFileDBItemSel)
  351. SetFocus();
  352. m_bDeleteing = false;
  353. }
  354. /************************************************************
  355. popup context menu, and menu command handler.
  356. *************************************************************/
  357. void CFilesListCtrl::OnUpdateMenuitem(CCmdUI* pCmdUI) 
  358. {
  359. bool bstart = false, 
  360. bstop = false, 
  361. bPause = false,
  362. bdelete = false, 
  363. bMoveto = false, 
  364. bProperty = false;
  365. int iSelectedCount = 0;
  366. int iFocusItem = -1;
  367. POSITION pos = GetFirstSelectedItemPosition();
  368. while (pos)
  369. {
  370. int index = GetNextSelectedItem(pos);
  371. if (GetItemState(index, LVIS_FOCUSED) & LVIS_FOCUSED)
  372. iFocusItem = index;
  373. iSelectedCount++;
  374. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  375. if (pItem->m_pDownload)
  376. {
  377. bstop = true;
  378. if (!pItem->m_pDownload->IsPause())
  379. bPause = true;
  380. else
  381. bstart = true;
  382. }
  383. else
  384. {
  385. bstart = true;
  386. }
  387. bdelete = true;
  388. bMoveto = true;
  389. }
  390. if (iSelectedCount == 1)
  391. bProperty = true;
  392. if (m_curCursor == m_pCategoryBarWnd->m_curRecycle)
  393. bstart = bstop = bPause = false;
  394. switch (pCmdUI->m_nID)
  395. {
  396. case ID_MENUITEM_DOWNLOAD:
  397. pCmdUI->Enable(bstart);
  398. break;
  399. case ID_MENUITEM_PAUSE:
  400. pCmdUI->Enable(bPause);
  401. break;
  402. case ID_MENUITEM_STOP:
  403. pCmdUI->Enable(bstop);
  404. break;
  405. case ID_MENUITEM_DEL:
  406. pCmdUI->Enable(bdelete);
  407. break;
  408. case ID_MENUITEM_FILE_PROPERTY:
  409. pCmdUI->Enable(bProperty);
  410. case ID_MENUITEM_OPEN_DOWNLOADED_FILE:
  411. case ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY:
  412. pCmdUI->Enable(bProperty);
  413. break;
  414. case ID_MENUITEM_MOVETO:
  415. pCmdUI->Enable(bMoveto);
  416. break;
  417. case ID_MENUITEM_RUN_PARAMETERS:
  418. pCmdUI->Enable(bProperty);
  419. break;
  420. case ID_MENUITEM_COPY_TORRENT_FILE_PATH:
  421. pCmdUI->Enable(bProperty);
  422. break;
  423. break;
  424. }
  425. }
  426. bool CFilesListCtrl::OnContextMenuRecycle(CWnd* pWnd, CPoint point) 
  427. {
  428. if (m_curCursor != m_pCategoryBarWnd->m_curRecycle)
  429. return false;
  430. bool bEnable = GetSelectedCount() > 0;
  431. CMenu menu;
  432. if (menu.CreatePopupMenu())
  433. {
  434. menu.AppendMenu(MF_STRING, ID_MENUITEM_RESTORE, "还原(&O)");
  435. menu.AppendMenu(MF_STRING, ID_MENUITEM_DEL, "删除(&D)tDel");
  436. menu.AppendMenu(MF_STRING, ID_MENUITEM_MOVETO, "移动到(&M)...");
  437. menu.AppendMenu(MF_STRING, ID_MENUITEM_FILE_PROPERTY, "属性(&R)");
  438. menu.EnableMenuItem(ID_MENUITEM_RESTORE, MF_BYCOMMAND | 
  439. (bEnable  ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  440. menu.EnableMenuItem(ID_MENUITEM_DEL, MF_BYCOMMAND | 
  441. (bEnable  ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  442. menu.EnableMenuItem(ID_MENUITEM_MOVETO, MF_BYCOMMAND | 
  443. (bEnable  ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  444. menu.EnableMenuItem(ID_MENUITEM_FILE_PROPERTY, MF_BYCOMMAND | 
  445. (bEnable  ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  446. menu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, 
  447. point.y, this);
  448. }
  449. return true;
  450. }
  451. void CFilesListCtrl::OnContextMenu(CWnd* pWnd, CPoint point) 
  452. {
  453. if (CListCtrlBaseEx::OnContextMenu(pWnd, point))
  454. return;
  455. if (OnContextMenuRecycle(pWnd, point))
  456. return;
  457. bool bstart = false,
  458. bPause = false,
  459. bstop = false, 
  460. bdelete = false, 
  461. bMoveto = false, 
  462. bProperty = false;
  463. int iSelectedCount = 0;
  464. int iFocusItem = -1;
  465. POSITION pos = GetFirstSelectedItemPosition();
  466. while (pos)
  467. {
  468. int index = GetNextSelectedItem(pos);
  469. if (GetItemState(index, LVIS_FOCUSED) & LVIS_FOCUSED)
  470. iFocusItem = index;
  471. iSelectedCount++;
  472. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  473. if (pItem->m_pDownload)
  474. {
  475. bstop = true;
  476. if (!pItem->m_pDownload->IsPause())
  477. bPause = true;
  478. else
  479. bstart = true;
  480. }
  481. else
  482. {
  483. bstart = true;
  484. }
  485. bdelete = true;
  486. bMoveto = true;
  487. }
  488. if (iSelectedCount == 1)
  489. bProperty = true;
  490. if (m_curCursor == m_pCategoryBarWnd->m_curRecycle)
  491. bstart = bstop = bPause = false;
  492. // trackpopupmenu.
  493. CMenu menu_bar;
  494. menu_bar.LoadMenu(IDR_MENU_CATEGORY);
  495. CMenu* file_menu = menu_bar.GetSubMenu(1);
  496. CMenu* pMonitorMenu = file_menu->GetSubMenu(6);
  497. pMonitorMenu->EnableMenuItem(ID_MENUITEM_MONITOR_INFORMATION, MF_BYCOMMAND | 
  498. (bProperty ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  499. pMonitorMenu->EnableMenuItem(ID_MENUITEM_MONITOR_SUBFILES, MF_BYCOMMAND | 
  500. (bProperty ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  501. pMonitorMenu->EnableMenuItem(ID_MENUITEM_MONITOR_RUNSTATICS, MF_BYCOMMAND | 
  502. (bProperty ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  503. pMonitorMenu->EnableMenuItem(ID_MENUITEM_MONITOR_PEERS, MF_BYCOMMAND | 
  504. (bProperty ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  505. pMonitorMenu->EnableMenuItem(ID_MENUITEM_MONITOR_LOGS, MF_BYCOMMAND | 
  506. (bProperty ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  507. //
  508. // command ui. 
  509. //
  510. file_menu->EnableMenuItem(ID_MENUITEM_DOWNLOAD, MF_BYCOMMAND | 
  511. (bstart ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  512. file_menu->EnableMenuItem(ID_MENUITEM_PAUSE, MF_BYCOMMAND | 
  513. (bPause ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  514. file_menu->EnableMenuItem(ID_MENUITEM_STOP, MF_BYCOMMAND | 
  515. (bstop ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  516. file_menu->EnableMenuItem(ID_MENUITEM_DEL, MF_BYCOMMAND | 
  517. (bdelete ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  518. file_menu->EnableMenuItem(ID_MENUITEM_MOVETO, MF_BYCOMMAND | 
  519. (bMoveto? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  520. file_menu->EnableMenuItem(ID_MENUITEM_MONITOR, MF_BYCOMMAND | 
  521. (bProperty? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  522. file_menu->EnableMenuItem(ID_MENUITEM_COPY_TORRENT_FILE_PATH, MF_BYCOMMAND | 
  523. (bProperty? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  524. file_menu->EnableMenuItem(ID_MENUITEM_FILE_PROPERTY, MF_BYCOMMAND | 
  525. (bProperty? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  526. file_menu->EnableMenuItem(ID_MENUITEM_RUN_PARAMETERS, MF_BYCOMMAND | 
  527. (bProperty? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  528. // shell excute
  529. file_menu->EnableMenuItem(ID_MENUITEM_OPEN_DOWNLOADED_FILE, MF_BYCOMMAND | 
  530. (bProperty? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  531. file_menu->EnableMenuItem(ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY, MF_BYCOMMAND | 
  532. (bProperty? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  533. if (iFocusItem != -1)
  534. {
  535. CFileDBItem* pItem  = (CFileDBItem*)GetItemData(iFocusItem);
  536. long lCount = GetSelectedCount();
  537. if (lCount == 1 && pItem->m_pDownload)
  538. file_menu->EnableMenuItem(ID_MENUITEM_MONITOR, MF_BYCOMMAND | MF_ENABLED);
  539. else
  540. file_menu->EnableMenuItem(ID_MENUITEM_MONITOR, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
  541. }
  542. m_menuspawnPopup.RemapMenuEx(file_menu);
  543. file_menu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, 
  544. point.y, this);
  545. }
  546. //
  547. // for bitmap menu trackpopupmenu.
  548. //
  549. void CFilesListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
  550. {
  551. if (!m_menuspawnPopup.MeasureItem(lpMeasureItemStruct))
  552. CListCtrlBaseEx::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
  553. }
  554. void CFilesListCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
  555. {
  556. if (!m_menuspawnPopup.DrawItem(lpDrawItemStruct))
  557. CListCtrlBaseEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
  558. }
  559. void CFilesListCtrl::OnCommandMenuitem(UINT iID) 
  560. {
  561. switch (iID)
  562. {
  563. case ID_MENUITEM_DOWNLOAD:
  564. OnMenuitemDownload();
  565. break;
  566. case ID_MENUITEM_PAUSE:
  567. OnMenuitemPause();
  568. break;
  569. case ID_MENUITEM_STOP:
  570. OnMenuitemStop();
  571. break;
  572. case ID_MENUITEM_DEL:
  573. OnMenuitemDel();
  574. break;
  575. case ID_MENUITEM_FILE_PROPERTY:
  576. OnMenuitemFileProperty();
  577. break;
  578. case ID_MENUITEM_OPEN_DOWNLOADED_FILE:
  579. OnMenuitemOpenDownloadedFile();
  580. break;
  581. case ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY:
  582. OnMenuitemOpenDownloadedDirectory();
  583. break;
  584. case ID_MENUITEM_MOVETO:
  585. OnMenuitemMoveto();
  586. break;
  587. case ID_MENUITEM_RUN_PARAMETERS:
  588. OnMenuitemRunParamter();
  589. break;
  590. case ID_MENUITEM_COPY_TORRENT_FILE_PATH:
  591. OnMenuitemCopyTorrentFilePath();
  592. break;
  593. }
  594. }
  595. void CFilesListCtrl::OnMenuitemRestore() 
  596. {
  597. assert(m_curCursor == m_pCategoryBarWnd->m_curRecycle);
  598. //
  599. // Get move items.
  600. //
  601. long lCount = GetSelectedCount();
  602. if (lCount <= 0) return;
  603. int* index = new int[lCount];
  604. int i = 0;
  605. bool bMonitorChange = false;
  606. POSITION pos = GetFirstSelectedItemPosition();
  607. while (pos)
  608. {
  609. int nItem = GetNextSelectedItem(pos);
  610. index[i++] = nItem;
  611. }
  612. //
  613. // Move items.
  614. //
  615. for (i=lCount-1; i>=0; i--)
  616. {
  617. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index[i]);
  618. assert(pItem && m_curCursor && m_pCategoryBarWnd);
  619. CTreeCursor curMove = m_pCategoryBarWnd->findCursorByDirid(pItem->m_lDirectoryID);
  620. assert(curMove);
  621. m_pCategoryBarWnd->FileDBItemRestore(pItem);
  622. }
  623. m_bDeleteing = true;
  624. for (i=lCount-1; i>=0; i--)
  625. {
  626. BOOL bRet = DeleteItem(index[i]);
  627. assert(bRet);
  628. }
  629. m_bDeleteing = false;
  630. delete index;
  631. }
  632. void CFilesListCtrl::OnMenuitemMonitorSub(UINT uID) 
  633. {
  634. if (uID >= ID_MENUITEM_MONITOR_INFORMATION && 
  635. uID <= ID_MENUITEM_MONITOR_LOGS)
  636. {
  637. POSITION pos = GetFirstSelectedItemPosition();
  638. if (pos)
  639. {
  640. int index = GetNextSelectedItem(pos);
  641. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  642. m_pMonitorWnd->Monitor(pItem, uID - ID_MENUITEM_MONITOR_INFORMATION);
  643. }
  644. }
  645. }
  646. void CFilesListCtrl::OnMenuitemPause()
  647. {
  648. POSITION pos = GetFirstSelectedItemPosition();
  649. while (pos)
  650. {
  651. int nItem = GetNextSelectedItem(pos);
  652. CFileDBItem* pItem = (CFileDBItem*)GetItemData(nItem);
  653. if (pItem->m_pDownload && !pItem->m_pDownload->IsPause())
  654. {
  655. m_pCategoryBarWnd->PauseDBFiles(pItem);
  656. // pItem->m_pDownload->Pause();
  657. ShowFileDBItemText(nItem);
  658. }
  659. }
  660. }
  661. void CFilesListCtrl::OnMenuitemDel() 
  662. {
  663. DeleteSelectedItem(false) ;
  664. }
  665. void CFilesListCtrl::DeleteSelectedItem(bool bForceDelete) 
  666. {
  667. bool bDownloading = false;
  668. POSITION pos = GetFirstSelectedItemPosition();
  669. while (pos)
  670. {
  671. int nItem = GetNextSelectedItem(pos);
  672. CFileDBItem* pItem = (CFileDBItem*)GetItemData(nItem);
  673. if (pItem && pItem->m_pDownload)
  674. {
  675. bDownloading = true;
  676. break;
  677. }
  678. }
  679. bool bDelUncompleted = false, bDelCompleted = false;
  680. if (m_curCursor == m_pCategoryBarWnd->m_curRecycle || bForceDelete)
  681. {
  682. CDlgDeleteFileDBItem dlg;
  683. if (dlg.DoModal() != IDOK)
  684. {
  685. SetFocus();
  686. return;
  687. }
  688. bForceDelete = true;
  689. bDelUncompleted = dlg.m_bDelUncompleted != 0;
  690. bDelCompleted = dlg.m_bDelCompleted != 0;
  691. }
  692. else if (bDownloading)
  693. {
  694. if (AfxMessageBox("有下载正在进行中, 您是否确定删除?", MB_YESNO) != IDYES) //Are you sure you wish to permanently delete these item(s)?", MB_YESNO) != IDYES)
  695. {
  696. SetFocus();
  697. return;
  698. }
  699. }
  700. // get index to be deleted arrray. and to stop vector.
  701. long lCount = GetSelectedCount();
  702. if (lCount <= 0) return;
  703. int* index = new int[lCount];
  704. int i = 0;
  705. bool bMonitorChange = false;
  706. vector<CFileDBItem*> vToStopFileDBItems;
  707. pos = GetFirstSelectedItemPosition();
  708. while (pos)
  709. {
  710. int nItem = GetNextSelectedItem(pos);
  711. index[i++] = nItem;
  712. if (GetItemState(nItem, LVIS_FOCUSED) & LVIS_FOCUSED)
  713. {
  714. bMonitorChange = true;
  715. m_pMonitorWnd->Monitor(0);
  716. }
  717. CFileDBItem* pItem = (CFileDBItem*)GetItemData(nItem);
  718. if (pItem->m_pDownload)
  719. vToStopFileDBItems.push_back(pItem);
  720. }
  721. // if is downloading, popup it from starting engine deque.
  722. m_pCategoryBarWnd->StopDBFiles(vToStopFileDBItems);
  723. // delete items.
  724. assert(!m_bDeleteing);
  725. m_bDeleteing = true;
  726. for (i=lCount-1; i>=0; i--)
  727. {
  728. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index[i]);
  729. assert(pItem && m_curCursor && m_pCategoryBarWnd);
  730. m_pCategoryBarWnd->DeleteDBFile(m_curCursor, pItem, bForceDelete, bDelUncompleted, bDelCompleted);
  731. BOOL bRet = DeleteItem(index[i]);
  732. assert(bRet);
  733. }
  734. m_bDeleteing = false;
  735. delete index;
  736. if (bMonitorChange && GetItemCount())
  737. {
  738. CFileDBItem* pItem = (CFileDBItem*)GetItemData(0);
  739. if (pItem)
  740. m_pMonitorWnd->Monitor(pItem);
  741. }
  742. SetFocus();
  743. }
  744. void CFilesListCtrl::OnMenuitemDownload() 
  745. {
  746. vector<long> vToDelIndexs;
  747. POSITION pos = GetFirstSelectedItemPosition();
  748. while (pos)
  749. {
  750. int nItem = GetNextSelectedItem(pos);
  751. CFileDBItem* pItem  = (CFileDBItem*)GetItemData(nItem);
  752. if (!pItem->m_pDownload)
  753. {
  754. SetItem(nItem, 0, LVIF_IMAGE, 0, IID_PREPARE, 0, 0, 0);
  755. SetItemTextEx(nItem, eCompleted, "Waiting...");
  756. if (!m_pCategoryBarWnd->Download(m_curCursor, pItem))
  757. continue;
  758. vToDelIndexs.push_back(nItem);
  759. }
  760. else
  761. {
  762. if (pItem->m_pDownload->IsPause())
  763. {
  764. pItem->m_pDownload->Pause(false);
  765. ShowFileDBItemActive(nItem);
  766. }
  767. }
  768. }
  769. //
  770. // if download , move to downloading category.
  771. //
  772. for (int i=vToDelIndexs.size()-1; i>=0; i--)
  773. {
  774. BOOL bRet = DeleteItem(vToDelIndexs[i]);
  775. assert(bRet);
  776. }
  777. }
  778. void CFilesListCtrl::OnMenuitemStop() 
  779. {
  780. if (AfxMessageBox("你确定要停止吗?", MB_YESNO) == IDNO)
  781. return;
  782. vector<CFileDBItem*> vToStopFileDBItems;
  783. vector<long> vToStopIndexs;
  784. CFileDBItem* pMonitorItem = 0;
  785. POSITION pos = GetFirstSelectedItemPosition();
  786. while (pos)
  787. {
  788. int nItem = GetNextSelectedItem(pos);
  789. CFileDBItem* pItem  = (CFileDBItem*)GetItemData(nItem);
  790. if (!pItem) {ASSERT(pItem); return;}
  791. if (pItem->m_pDownload)
  792. {
  793. vToStopIndexs.push_back(nItem);
  794. vToStopFileDBItems.push_back(pItem);
  795. }
  796. if (GetItemState(nItem, LVIS_FOCUSED) & LVIS_FOCUSED)
  797. pMonitorItem = pItem;
  798. }
  799. //
  800. // stop download object.
  801. //
  802. m_pCategoryBarWnd->StopDBFiles(vToStopFileDBItems);
  803. //
  804. // if completed, move it to category assigned.
  805. //
  806. m_bDeleteing = true;
  807. for (int i=vToStopIndexs.size()-1; i>=0; i--)
  808. {
  809. CFileDBItem* pItem = (CFileDBItem*)GetItemData(vToStopIndexs[i]);
  810. assert(pItem && m_pCategoryBarWnd);
  811. if (!m_pCategoryBarWnd->StopDBFilesMoveComplete(pItem))
  812. {
  813. ShowFileDBItemText(vToStopIndexs[i]);
  814. }
  815. else
  816. {
  817. BOOL bRet = DeleteItem(vToStopIndexs[i]);
  818. assert(bRet);
  819. if (pMonitorItem == pItem) pMonitorItem = 0;
  820. }
  821. }
  822. m_bDeleteing = false;
  823. // refresh the item monitored and not moved.
  824. if (pMonitorItem)
  825. m_pMonitorWnd->Monitor(pMonitorItem);
  826. else
  827. {
  828. for (int i=0; i<GetItemCount(); i++)
  829. {
  830. CFileDBItem* pItem  = (CFileDBItem*)GetItemData(i);
  831. if (!pItem) {ASSERT(pItem); return;}
  832. if (GetItemState(i, LVIS_FOCUSED) & LVIS_FOCUSED)
  833. {
  834. pMonitorItem = pItem;
  835. break;
  836. }
  837. }
  838. if (pMonitorItem)
  839. m_pMonitorWnd->Monitor(pMonitorItem);
  840. else
  841. m_pMonitorWnd->Monitor(0);
  842. }
  843. }
  844. void CFilesListCtrl::OnMenuitemMoveto() 
  845. {
  846. CTreeCursor curSelected = m_curCursor;
  847. POSITION pos = GetFirstSelectedItemPosition();
  848. if (pos)
  849. {
  850. int nItem = GetNextSelectedItem(pos);
  851. CFileDBItem* pItem = (CFileDBItem*)GetItemData(nItem);
  852. assert(pItem);
  853. CTreeCursor curRet = m_pCategoryBarWnd->findCursorByDirid(pItem->m_lDirectoryID);
  854. if (curRet) curSelected = curRet;
  855. }
  856. CCategoryNewDlg dlg(&m_pCategoryBarWnd->m_ctlImage, m_pCategoryBarWnd, false, curSelected);
  857. if (dlg.DoModal() != IDOK)
  858. return;
  859. //
  860. // if move to self, cancel operation.
  861. //
  862. CTreeCursor curMovetoItem(dlg.m_ItemSel, m_pCategoryBarWnd);
  863. if (curMovetoItem == m_curCursor)
  864. return;
  865. if (curMovetoItem == m_pCategoryBarWnd->m_curRecycle)
  866. {
  867. DeleteSelectedItem(false);
  868. return;
  869. }
  870. //
  871. // Get move items.
  872. //
  873. long lCount = GetSelectedCount();
  874. if (lCount <= 0) return;
  875. int* index = new int[lCount];
  876. int i = 0;
  877. bool bMonitorChange = false;
  878. pos = GetFirstSelectedItemPosition();
  879. while (pos)
  880. {
  881. int nItem = GetNextSelectedItem(pos);
  882. index[i++] = nItem;
  883. // if monitoring, cancel it.
  884. if (GetItemState(nItem, LVIS_FOCUSED) & LVIS_FOCUSED)
  885. {
  886. bMonitorChange = true;
  887. m_pMonitorWnd->Monitor(0);
  888. }
  889. }
  890. //
  891. // Move items.
  892. //
  893. vector<CFileDBItem*> vFileDBItems;
  894. for (i=lCount-1; i>=0; i--)
  895. {
  896. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index[i]);
  897. assert(pItem && m_curCursor && m_pCategoryBarWnd);
  898. vFileDBItems.push_back(pItem);
  899. }
  900. bool bRet = m_pCategoryBarWnd->FileDBItemMovetoArray(m_curCursor, curMovetoItem, vFileDBItems);
  901. if (bRet)
  902. {
  903. m_bDeleteing = true;
  904. for (i=lCount-1; i>=0; i--)
  905. {
  906. BOOL bRet = DeleteItem(index[i]);
  907. assert(bRet);
  908. }
  909. m_bDeleteing = false;
  910. }
  911. delete index;
  912. //
  913. // Monitor next item.
  914. //
  915. if (bMonitorChange && GetItemCount())
  916. {
  917. CFileDBItem* pItem = (CFileDBItem*)GetItemData(0);
  918. if (pItem)
  919. m_pMonitorWnd->Monitor(pItem);
  920. }
  921. }
  922. void CFilesListCtrl::OnMenuitemCopyTorrentFilePath() 
  923. {
  924. assert(GetSelectedCount() == 1);
  925. POSITION pos = GetFirstSelectedItemPosition();
  926. if (pos)
  927. {
  928. int index = GetNextSelectedItem(pos);
  929. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  930. assert(pItem);
  931. CString strSource = (m_pCategoryBarWnd->GetDBSavePath() + pItem->m_strTorrentFileName).data(); 
  932. if (!CopyTextToClipboard(strSource))
  933. AfxMessageBox("复制Torrent路径失败");
  934. }
  935. }
  936. void CFilesListCtrl::OnMenuitemFileProperty() 
  937. {
  938. assert(GetSelectedCount() == 1);
  939. POSITION pos = GetFirstSelectedItemPosition();
  940. if (pos)
  941. {
  942. int index = GetNextSelectedItem(pos);
  943. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  944. assert(pItem);
  945. try
  946. {
  947. CFileTorrent filetorrent;
  948. if (!filetorrent.OpenFile(m_pCategoryBarWnd->GetDBSavePath() + pItem->m_strTorrentFileName))
  949. {
  950. AfxMessageBox(filetorrent.GetBadMsg().data());
  951. return;
  952. }
  953. filetorrent.QueryDir();
  954. CDlgNewDownload dlg(&m_pCategoryBarWnd->m_ctlImage,
  955. &filetorrent,
  956. m_pCategoryBarWnd,
  957. false, pItem, 
  958. pItem->m_lDirectoryID,
  959. pItem->m_strFileName);
  960. if (dlg.DoModal() == IDOK)
  961. {
  962. //
  963. // if download immediately, start it.
  964. //
  965. pItem->m_strComment = dlg.m_strComment.GetBuffer(0);
  966. if (dlg.m_iStartMode == 0) // start immediately.
  967. {
  968. if (!pItem->m_pDownload)
  969. {
  970. SetItem(index, 0, LVIF_IMAGE, 0, IID_PREPARE, 0, 0, 0);
  971. SetItemTextEx(index, eCompleted, "Waiting...");
  972. if (m_pCategoryBarWnd->Download(m_curCursor, pItem))
  973. {
  974. BOOL bRet = DeleteItem(index);
  975. ASSERT(bRet);
  976. }
  977. }
  978. }
  979. }
  980. }
  981. catch (string e)
  982. {
  983. AfxMessageBox(e.data());
  984. return;
  985. }
  986. }
  987. }
  988. void CFilesListCtrl::OnMenuitemRunParamter()
  989. {
  990. POSITION pos = GetFirstSelectedItemPosition();
  991. if (pos)
  992. {
  993. int index = GetNextSelectedItem(pos);
  994. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  995. if (!pItem)
  996. {
  997. assert(false);
  998. return;
  999. }
  1000. CDlgRunParameters dlgParamters(pItem, m_pSetupRegister);
  1001. dlgParamters.DoModal();
  1002. m_pMonitorWnd->Monitor(pItem);
  1003. }
  1004. }
  1005. void CFilesListCtrl::OnMenuitemOpenDownloadedFile()
  1006. {
  1007. POSITION pos = GetFirstSelectedItemPosition();
  1008. while (pos)
  1009. {
  1010. int index = GetNextSelectedItem(pos);
  1011. if (GetItemState(index, LVIS_FOCUSED) & LVIS_FOCUSED)
  1012. {
  1013. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  1014. HINSTANCE iRet = ShellExecute(NULL, "open" , pItem->m_strFileName.data(), 0, 0, SW_SHOW);
  1015. if ((UINT)iRet <= HINSTANCE_ERROR)
  1016. AfxMessageBox(WSAShowError().data());
  1017. break;
  1018. }
  1019. }
  1020. }
  1021. void CFilesListCtrl::OnMenuitemOpenDownloadedDirectory()
  1022. {
  1023. POSITION pos = GetFirstSelectedItemPosition();
  1024. while (pos)
  1025. {
  1026. int index = GetNextSelectedItem(pos);
  1027. if (GetItemState(index, LVIS_FOCUSED) & LVIS_FOCUSED)
  1028. {
  1029. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  1030. // Get Parent folder as the directory, no matter that the fileitem is dir or file.
  1031. char drive[_MAX_DRIVE];
  1032. char dir[_MAX_DIR];
  1033. char fname[_MAX_FNAME];
  1034. char ext[_MAX_EXT];
  1035. _splitpath(pItem->m_strFileName.data(), drive, dir, fname, ext);
  1036. string strPath = string(drive) + dir;
  1037. HINSTANCE iRet = ShellExecute(NULL, "open" , strPath.data(), 0, 0, SW_SHOW);
  1038. if ((UINT)iRet <= HINSTANCE_ERROR)
  1039. AfxMessageBox(WSAShowError().data());
  1040. break;
  1041. }
  1042. }
  1043. }
  1044. /************************************************************
  1045. show file filedbitem
  1046. *************************************************************/
  1047. void CFilesListCtrl::OnTimer(UINT nIDEvent) 
  1048. {
  1049. if (DISPLAY_TIMEOUT_ID != nIDEvent)
  1050. return;
  1051. int iCount = GetItemCount();
  1052. for (int i=0; i<GetItemCount(); i++)
  1053. {
  1054. ShowFileDBItemActive(i);
  1055. }
  1056. m_pMonitorWnd->Refresh();
  1057. // CListCtrl::OnTimer(nIDEvent);
  1058. }
  1059. void CFilesListCtrl::ShowFileDBItemText(int iItem)
  1060. {
  1061. CFileDBItem* pItem  = (CFileDBItem*)GetItemData(iItem);
  1062. string strName;
  1063. string strSavePath;
  1064. SplitPathName(pItem->m_strFileName, strSavePath, strName);
  1065. SetItemTextEx(iItem, eFileName, strName.data());
  1066. char szText[1024] = {0};
  1067. sprintf(szText, "%d%%", (long)((pItem->m_fComplete)*100));
  1068. SetItemTextEx(iItem, eCompleted, szText);
  1069. sprintf(szText, "%s", FormatSize(pItem->m_lFileSize).data());
  1070. SetItemTextEx(iItem, eFilesize, szText);
  1071. SetItemTextEx(iItem, eTimeleft, "");
  1072. SetItemTextEx(iItem, eTimerunned, "");
  1073. SetItemTextEx(iItem, eDownloadrate, "");
  1074. SetItemTextEx(iItem, eUploadrate, "");
  1075. SetItemTextEx(iItem, eSeeds, "");
  1076. CTime tCreatedTime(pItem->m_tTime);
  1077. CString strCreatedTime = tCreatedTime.Format("%Y-%m-%d %H:%M");
  1078. SetItemTextEx(iItem, eCreateTime, strCreatedTime); // ctime(&pItem->m_tTime));
  1079. tCreatedTime = pItem->m_tModifiedTime;
  1080. strCreatedTime = tCreatedTime.Format("%Y-%m-%d %H:%M");
  1081. SetItemTextEx(iItem, eModifiedTime, strCreatedTime); // ctime(&pItem->m_tTime));
  1082. int iImageID = (pItem->m_fComplete>= 1) ? IID_COMPLETE : IID_UNCOMPLETE;
  1083. if (!pItem->m_vUnneededFileInx.empty())
  1084. {
  1085. iImageID = (pItem->m_fCompletePart >= 1) ? IID_COMPLETE : IID_UNCOMPLETE;
  1086. }
  1087. if (pItem->m_pDownload && pItem->m_pDownload->IsPause())
  1088. iImageID = IID_PAUSE;
  1089. if (pItem->m_bBad == true)
  1090. iImageID = IID_BAD;
  1091. SetItem(iItem, 0, LVIF_IMAGE, 0, iImageID, 0, 0, 0);
  1092. }
  1093. void CFilesListCtrl::ShowFileDBItemActive(int iItem)
  1094. {
  1095. if (iItem > GetItemCount() || iItem < 0)
  1096. {
  1097. assert(false);
  1098. return;
  1099. }
  1100. int i = iItem;
  1101. CFileDBItem* pItem  = (CFileDBItem*)GetItemData(i);
  1102. if (!pItem)
  1103. {
  1104. assert(false);
  1105. return;
  1106. }
  1107. if (pItem->m_pDownload)
  1108. {
  1109. // the download is terminated.
  1110. if (pItem->m_pDownload->IsBad())
  1111. {
  1112. SetItem(i, 0, LVIF_IMAGE, 0, IID_BAD, 0, 0, 0);
  1113. return;
  1114. }
  1115. if (pItem->m_pDownload->IsPause())
  1116. {
  1117. SetItem(i, 0, LVIF_IMAGE, 0, IID_PAUSE, 0, 0, 0);
  1118. return;
  1119. }
  1120. // download maybe not begin yet.
  1121. if (!pItem->m_pDownload->IsDownloading())
  1122. {
  1123. SetItem(i, 0, LVIF_IMAGE, 0, IID_PREPARE, 0, 0, 0);
  1124. SetItemTextEx(i, eCompleted, "Waiting...");
  1125. return;
  1126. }
  1127. CStatics statics = pItem->m_pDownload->GetStatics();
  1128. char szText[1024] = {0};
  1129. if (statics.m_bAllocating)
  1130. {
  1131. SetItem(i, 0, LVIF_IMAGE, 0, IID_PREPARE, 0, 0, 0);
  1132. sprintf(szText, "Allocate(%.2f)", statics.m_fAllocatingPercent);
  1133. SetItemTextEx(i, eCompleted, szText);
  1134. }
  1135. else 
  1136. {
  1137. if (statics.m_bStorageChecking)
  1138. {
  1139. SetItem(i, 0, LVIF_IMAGE, 0, IID_PREPARE, 0, 0, 0);
  1140. sprintf(szText, "Checking(%.2f)", statics.m_fCheckingPercent);
  1141. SetItemTextEx(i, eCompleted, szText);
  1142. }
  1143. else
  1144. {
  1145. float fCompleted = statics.m_fCompleted;
  1146. if (!pItem->m_vUnneededFileInx.empty())
  1147. fCompleted = statics.m_fCompletedPart;
  1148. sprintf(szText, "%d%%", (long)((fCompleted)*100));
  1149. SetItemTextEx(i, eCompleted, szText);
  1150. if (statics.m_tTimeLeft < 0)
  1151. {
  1152. SetItemTextEx(i, eTimeleft, "-");
  1153. }
  1154. else
  1155. {
  1156. CTimeSpan TimeLeft(statics.m_tTimeLeft);
  1157. SetItemTextEx(i, eTimeleft, TimeLeft.Format("%D:%H:%M:%S"));
  1158. }
  1159. CTimeSpan TimeRunned(statics.m_tTimeRunned);
  1160. SetItemTextEx(i, eTimerunned, TimeRunned.Format("%D:%H:%M:%S"));
  1161. sprintf(szText, "%s", FormatSize(statics.m_lDownRate).data());
  1162. SetItemTextEx(i, eDownloadrate, szText);
  1163. sprintf(szText, "%s", FormatSize(statics.m_lUpRate).data());
  1164. SetItemTextEx(i, eUploadrate, szText);
  1165. sprintf(szText, "%d/%d", statics.m_lSeedsCount, statics.m_lPeersCount);
  1166. SetItemTextEx(i, eSeeds, szText);
  1167. // set data
  1168. // pItem->m_fComplete = statics.m_fCompleted;
  1169. //  set image
  1170. bool bCompleted = fCompleted >= 1;
  1171. int iImageID = 0;
  1172. if (!statics.m_bTrackerConnected)
  1173. {
  1174. iImageID = bCompleted ? IID_UPLOAD_TRACKER : IID_DOWNLOAD_TRACKER;
  1175. }
  1176. else if(statics.m_lPeersCount == 0)
  1177. {
  1178. iImageID = bCompleted ? IID_UPLOAD_OTHERS: IID_DOWNLOAD_OTHERS;
  1179. }
  1180. else if (statics.m_bFired)
  1181. {
  1182. iImageID = bCompleted ? IID_UPLOAD_FIRE: IID_DOWNLOAD_FIRE;
  1183. }
  1184. else if (statics.m_lSeedsCount == 0)
  1185. {
  1186. iImageID = bCompleted ? IID_UPLOAD_SEED : IID_DOWNLOAD_SEED;
  1187. }
  1188. else
  1189. {
  1190. iImageID = bCompleted ? IID_UPLOAD : IID_DOWNLOAD;
  1191. }
  1192. SetItem(i, 0, LVIF_IMAGE, 0, iImageID, 0, 0, 0);
  1193. }
  1194. }
  1195. } // end if (pItem->m_pDownload)
  1196. else
  1197. {
  1198. LV_ITEM lvItem;
  1199. lvItem.iItem = i;
  1200. lvItem.iSubItem = 0;
  1201. lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
  1202. lvItem.cchTextMax = 0;
  1203. lvItem.pszText = "";
  1204. GetItem(&lvItem);
  1205. if (lvItem.iImage != IID_COMPLETE &&
  1206. lvItem.iImage != IID_UNCOMPLETE &&
  1207. lvItem.iImage != IID_BAD)
  1208. {
  1209. ShowFileDBItemText(i);
  1210. }
  1211. }
  1212. }
  1213. /************************************************************
  1214. sort item.
  1215. *************************************************************/
  1216. void CFilesListCtrl::OnColumnSort(int iColumn)
  1217. {
  1218. assert(abs(iColumn) <= eAllSize && abs(iColumn) > 0);
  1219. m_iSortedCol = iColumn;
  1220. SortItems(Compare1, m_iSortedCol);
  1221. }
  1222. void CFilesListCtrl::OnItemclickSort(NMHDR* pNMHDR, LRESULT* pResult)
  1223. {
  1224. *pResult = 0;
  1225. NMLISTVIEW* pNMListView = reinterpret_cast<NMLISTVIEW*>(pNMHDR);
  1226. int iSubItem = GetLogicalIndex(pNMListView->iSubItem);
  1227. if (iSubItem == -1)
  1228. {
  1229. assert(false);
  1230. return;
  1231. }
  1232. int nAbsSortColumn = abs(m_iSortedCol);
  1233. if (nAbsSortColumn > 0)
  1234. {
  1235. if (iSubItem == nAbsSortColumn-1)
  1236. m_iSortedCol = -m_iSortedCol;
  1237. else
  1238. m_iSortedCol = iSubItem + 1;
  1239. }
  1240. else
  1241. m_iSortedCol= iSubItem + 1;
  1242. SortItems(Compare1, m_iSortedCol);
  1243. }
  1244. int CALLBACK CFilesListCtrl::Compare1(LPARAM lParam1, LPARAM lParam2, LPARAM 
  1245.  lParamSort)
  1246. {
  1247. CFileDBItem* pItem1 = (CFileDBItem*) lParam1;
  1248. CFileDBItem* pItem2 = (CFileDBItem*) lParam2;
  1249. if (!pItem1 || !pItem2)
  1250. {
  1251. ASSERT(pItem1 && pItem2);
  1252. return 0;
  1253. }
  1254. long sOrder = lParamSort < 0 ? -1 : 1; 
  1255. eColumns eCol = (eColumns)((lParamSort * sOrder) - 1);
  1256. ////////////////////////////////////////////////////////////
  1257. // for dynamic data.
  1258. CStatics statics1, statics2;
  1259. int iStat1 = 0, iStat2 = 0;
  1260. if ((eCol >= eTimeleft && eCol <= eSeeds) || (eCol == eIcon))
  1261. {
  1262. if (!pItem1->m_pDownload - !pItem2->m_pDownload)
  1263. {
  1264. return (!pItem1->m_pDownload - !pItem2->m_pDownload) * sOrder * -1;
  1265. }
  1266. if (pItem1->m_pDownload && !pItem1->m_pDownload->IsBad() && // !pItem1->m_pDownload->IsPause() &&
  1267. pItem1->m_pDownload->IsDownloading())
  1268. {
  1269. statics1 = pItem1->m_pDownload->GetStatics();
  1270. iStat1 = 1;
  1271. }
  1272. if (pItem2->m_pDownload && !pItem2->m_pDownload->IsBad() && // !pItem2->m_pDownload->IsPause() && 
  1273. pItem2->m_pDownload->IsDownloading())
  1274. {
  1275. statics2 = pItem2->m_pDownload->GetStatics();
  1276. iStat2 = 1; 
  1277. }
  1278. // if start and silent then return; 
  1279. int idif = (iStat1 -iStat2) * sOrder;
  1280. if (idif) return idif;
  1281. // both silent .
  1282. if (!iStat1 && eCol != eIcon)
  1283. return 0;
  1284. // both running
  1285. if (iStat1 && iStat2)
  1286. {
  1287. idif = pItem1->m_pDownload->IsPause() - pItem2->m_pDownload->IsPause();
  1288. if (idif) return -idif * sOrder;
  1289. }
  1290. }
  1291. ////////////////////////////////////////////////////////////////
  1292. // compare sort column.
  1293. switch (eCol)
  1294. {
  1295. case eIcon:
  1296. {
  1297. if (!iStat1 && !iStat2)
  1298. sOrder *= -1;
  1299. return (pItem1->m_fComplete - pItem2->m_fComplete) * 100 * sOrder;
  1300. }
  1301. break;
  1302. case eFileName:
  1303. return strcmp(pItem1->m_strFileName.data(), pItem2->m_strFileName.data()) * sOrder;
  1304. break;
  1305. case eCompleted:
  1306. return (pItem1->m_fComplete - pItem2->m_fComplete) * 100 * sOrder;
  1307. break;
  1308. case eFilesize:
  1309. return (pItem1->m_lFileSize - pItem2->m_lFileSize) * sOrder;
  1310. break;
  1311. case eTimeleft:
  1312. // return (pItem1->t< pItem1->m_lFileSize) * sOrder;
  1313. return (statics1.m_tTimeLeft - statics2.m_tTimeLeft) * sOrder;
  1314. break;
  1315. case eTimerunned:
  1316. return (statics1.m_tTimeRunned - statics2.m_tTimeRunned) * sOrder;
  1317. break;
  1318. case eDownloadrate:
  1319. return (statics1.m_lDownRate - statics2.m_lDownRate) * sOrder;
  1320. break;
  1321. case eUploadrate:
  1322. return (statics1.m_lUpRate - statics2.m_lUpRate) * sOrder;
  1323. break;
  1324. case eSeeds:
  1325. return (statics1.m_lSeedsCount - statics2.m_lSeedsCount) * sOrder;
  1326. break;
  1327. case eCreateTime:
  1328. return (pItem1->m_tTime - pItem2->m_tTime) * sOrder;
  1329. break;
  1330. case eModifiedTime:
  1331. return (pItem1->m_tModifiedTime - pItem2->m_tModifiedTime) * sOrder;
  1332. break;
  1333. default:
  1334. assert(false);
  1335. break;
  1336. }
  1337. return 0;
  1338. }
  1339. /************************************************************
  1340. drag and drop
  1341. *************************************************************/
  1342. void CFilesListCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
  1343. {
  1344. *pResult = 0;
  1345. //
  1346. // if is downloading or no selected item return.
  1347. //
  1348. // if (m_curCursor == m_pCategoryBarWnd->m_curDownloading)
  1349. // return;
  1350. long lCount = GetSelectedCount();
  1351. if (lCount <= 0) return;
  1352. //
  1353. // Get selected items.
  1354. //
  1355. int* indexarr = new int[lCount];
  1356. auto_ptr<int> auarr(indexarr);
  1357. int i=0;
  1358. bool bStopMonitor = false;
  1359. m_vDragFileDBItems.clear();
  1360. POSITION pos = GetFirstSelectedItemPosition();
  1361. while (pos)
  1362. {
  1363. int index = GetNextSelectedItem(pos);
  1364. indexarr[i++] = index;
  1365. if (GetItemState(index, LVIS_FOCUSED) & LVIS_FOCUSED)
  1366. bStopMonitor = true;
  1367. CFileDBItem* pItem = (CFileDBItem*)GetItemData(index);
  1368. m_vDragFileDBItems.push_back(pItem);
  1369. }
  1370. //
  1371. // Register clipboard data.
  1372. //
  1373. CSharedFile globFile;
  1374. globFile.Write("1", 1);
  1375. COleDataSource srcItem;
  1376. srcItem.CacheGlobalData(m_pCategoryBarWnd->m_nIDClipFormat, globFile.Detach()); 
  1377. DWORD dwRet = srcItem.DoDragDrop();
  1378. if (dwRet & DROPEFFECT_MOVE)
  1379. {
  1380. if (bStopMonitor)
  1381. m_pMonitorWnd->Monitor(0);
  1382. assert(!m_bDeleteing);
  1383. m_bDeleteing = true;
  1384. for (i=lCount-1; i>=0; i--)
  1385. DeleteItem(indexarr[i]);
  1386. m_bDeleteing = false;
  1387. }
  1388. m_vDragFileDBItems.clear();
  1389. }
  1390. /************************************************************
  1391. handler hot key.
  1392. *************************************************************/
  1393. BOOL CFilesListCtrl::PreTranslateMessage(MSG* pMsg) 
  1394. {
  1395. if (pMsg->message == WM_KEYDOWN)
  1396. {
  1397. switch (pMsg->wParam)
  1398. {
  1399. case VK_DELETE:
  1400. {
  1401. DeleteSelectedItem(GetKeyState(VK_SHIFT) < 0);
  1402. return true;
  1403. }
  1404. break;
  1405. }
  1406. }
  1407. return CListCtrlBaseEx::PreTranslateMessage(pMsg);
  1408. }
  1409. void CFilesListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  1410. {
  1411. LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
  1412. switch(lplvcd->nmcd.dwDrawStage)
  1413. {
  1414. case CDDS_PREPAINT:
  1415. *pResult = CDRF_NOTIFYITEMDRAW;          // ask for subitem notifications.
  1416. break;
  1417. case CDDS_ITEMPREPAINT:
  1418. {
  1419. *pResult = CDRF_NOTIFYSUBITEMDRAW | CDRF_NOTIFYPOSTPAINT;
  1420. }
  1421. break;
  1422. case CDDS_ITEMPREPAINT|CDDS_SUBITEM: // recd when CDRF_NOTIFYSUBITEMDRAW is returned in
  1423. {                                    // response to CDDS_ITEMPREPAINT.
  1424. *pResult = CDRF_SKIPDEFAULT;
  1425. *pResult = CDRF_NOTIFYPOSTPAINT;
  1426. }
  1427. break;
  1428. case CDDS_ITEMPOSTPAINT|CDDS_SUBITEM:
  1429. {
  1430. *pResult = CDRF_DODEFAULT;
  1431. int iCol = lplvcd->iSubItem;
  1432. int iRow = lplvcd->nmcd.dwItemSpec;
  1433. CRect rc;
  1434. if (iCol == 0)
  1435. {
  1436. CFileDBItem* pItem  = (CFileDBItem*)lplvcd->nmcd.lItemlParam;
  1437. if (!pItem)
  1438. {
  1439. assert(false);
  1440. return;
  1441. }
  1442. if (pItem->m_vUnneededFileInx.size())
  1443. {
  1444. *pResult = CDRF_SKIPDEFAULT;
  1445. CDC dc;
  1446. dc.Attach(lplvcd->nmcd.hdc);
  1447. GetSubItemRect(iRow, iCol, LVIR_ICON, rc);
  1448. CPoint pt(rc.left , rc.top);
  1449. pt.Offset(5, 5);
  1450. m_ctlImageDelete.Draw(&dc, 0, pt, ILD_TRANSPARENT);
  1451. dc.Detach();
  1452. }
  1453. }
  1454. }
  1455. default:// it wasn't a notification that was interesting to us.
  1456. *pResult = CDRF_DODEFAULT;
  1457. }
  1458. }