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

P2P编程

开发平台:

Visual C++

  1. // SubFilesWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "SubFilesWnd.h"
  6. #include "FileTorrent.h"
  7. #include "CategoryBarWnd.h"
  8. #include "FileBase.h"
  9. #include "MonitorWnd.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. #define WM_LOAD_COMPLETED WM_USER+1020
  16. #define ID_MENUITEM_DOWNLOAD_FILE 33528
  17. #define ID_MENUITEM_DELETE_FILE ID_MENUITEM_DOWNLOAD_FILE +1
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CSubFilesWnd
  20. CSubFilesWnd::CSubFilesWnd()
  21. {
  22. m_pFileTorrent = 0;
  23. m_pCategoryBarWnd  = 0;
  24. m_hFileOpenDone = CreateEvent(0, true, true, 0);
  25. m_hCancel = CreateEvent(0, true, false, 0);
  26. m_pFileDBItem = 0;
  27. m_pMonitorWnd = 0 ;
  28. m_lCount = 0;
  29. m_bMonitor = false;
  30. }
  31. CSubFilesWnd::~CSubFilesWnd()
  32. {
  33. CloseHandle(m_hFileOpenDone);
  34. CloseHandle(m_hCancel);
  35. }
  36. BEGIN_MESSAGE_MAP(CSubFilesWnd, CTreeCtrlEx)
  37. //{{AFX_MSG_MAP(CSubFilesWnd)
  38. ON_WM_CREATE()
  39. ON_WM_LBUTTONDBLCLK()
  40. ON_WM_RBUTTONDOWN()
  41. //}}AFX_MSG_MAP
  42. // ON_WM_CONTEXTMENU()
  43. ON_NOTIFY_REFLECT(NM_RCLICK,OnRightClick)
  44. ON_COMMAND(ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY, OnOpenDirectory)
  45. ON_MESSAGE(WM_LOAD_COMPLETED, OnLoadSubfilesCompleted)
  46. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  47. ON_COMMAND_RANGE(ID_MENUITEM_DOWNLOAD_FILE, ID_MENUITEM_DELETE_FILE, OnMenuStartFile)
  48. ON_COMMAND_RANGE(ID_MENUITEM_MONITOR_INFORMATION, ID_MENUITEM_MONITOR_LOGS, OnMenuitemMonitorSub)
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CSubFilesWnd message handlers
  52. BOOL CSubFilesWnd::CreateEx(CWnd *pParent, CRect &rc, long lParam, bool bMonitor, CMonitorWnd* pMonitorWnd)
  53. {
  54. m_bMonitor = bMonitor;
  55. m_pMonitorWnd = pMonitorWnd;
  56. return Create(WS_VISIBLE|WS_CHILD|WS_BORDER|TVS_HASBUTTONS | TVS_LINESATROOT | 
  57. TVS_HASLINES|TVS_SHOWSELALWAYS, 
  58. rc, pParent, lParam);
  59. }
  60. int CSubFilesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  61. {
  62. if (CTreeCtrlEx::OnCreate(lpCreateStruct) == -1)
  63. return -1;
  64. Init();
  65. return 0;
  66. }
  67. void CSubFilesWnd::Init()
  68. {
  69. assert(GetSafeHwnd());
  70. m_ctlImage.Create(16, 17, ILC_COLOR8|ILC_MASK, 4, 4);
  71. m_ctlImage.Add(AfxGetApp()->LoadIcon(IDI_ICON_DELETE));
  72. SHFILEINFO ssfi;
  73. CImageList smallSystemImageList;
  74. smallSystemImageList.Attach((HIMAGELIST) SHGetFileInfo(_T("c:\"), 0, &ssfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON));
  75. SetImageList(&smallSystemImageList);
  76. smallSystemImageList.Detach();
  77. }
  78. void CSubFilesWnd::SetCateGoryBarWnd(CCategoryBarWnd* pCategoryBarWnd)
  79. {
  80. m_pCategoryBarWnd = pCategoryBarWnd;
  81. }
  82. /******************************************************************************
  83. parameter : 
  84. strTorrentFileName : torrentFileName if empty then the monitor close.
  85. strFileName : Empty mean the torrent have not been saved. the param used
  86.   for context menu.
  87. ******************************************************************************/
  88. void CSubFilesWnd::Monitor(string strTorrentFileName, string strFileName, CFileDBItem* pFileDBItem)
  89. {
  90. m_pFileTorrent = 0;
  91. m_strFileName = strFileName;
  92. m_strTorrentFileName =  strTorrentFileName;
  93. m_pFileDBItem = pFileDBItem;
  94. }
  95. void CSubFilesWnd::Monitor( CFileTorrent* pFileTorrent, string strFileName, CFileDBItem* pFileDBItem)
  96. {
  97. m_strFileName = strFileName;
  98. m_strTorrentFileName =  string();
  99. m_pFileTorrent = pFileTorrent;
  100. m_pFileDBItem = pFileDBItem;
  101. }
  102. void CSubFilesWnd::Stop()
  103. {
  104. if (!IsEventSet(m_hFileOpenDone))
  105. {
  106. SetEvent(m_hCancel);
  107. WaitForSingleObject(m_hFileOpenDone, INFINITE);
  108. }
  109. }
  110. void CSubFilesWnd::OnLoadSubfilesCompleted(long lParam, long wParam)
  111. {
  112. }
  113. void CSubFilesWnd::ShowSubFiles()
  114. {
  115. SetRedraw(false);
  116. LoadSubFiles();
  117. SetRedraw(true);
  118. /*
  119. ResetEvent(m_hFileOpenDone);
  120. ResetEvent(m_hCancel);
  121. DWORD dwThreadId = 0;
  122. ::CreateThread(0, 0, ShowSubFilesProc, this, 0, &dwThreadId);
  123. //*/
  124. }
  125. DWORD WINAPI CSubFilesWnd::ShowSubFilesProc(void *pParam)
  126. {
  127. CSubFilesWnd* pSubFilesWnd = (CSubFilesWnd*) pParam;
  128. HWND hWnd = pSubFilesWnd->GetSafeHwnd();
  129. pSubFilesWnd->LoadSubFiles();
  130. ::PostMessage(hWnd, WM_LOAD_COMPLETED, 0, 0);
  131. return 0;
  132. }
  133. void CSubFilesWnd::LoadSubFiles()
  134. {
  135. DeleteAllItems();
  136. if (!m_pFileTorrent && m_strTorrentFileName.empty())
  137. {
  138. // assert(false);
  139. return;
  140. }
  141. // get files.
  142. // subfiles
  143. bool bDir;
  144. BLONG lTotalLength = 0;
  145. vector<CFileInfo> vFiles;
  146. if (m_pFileTorrent)
  147. {
  148. try
  149. {
  150. m_pFileTorrent->QuerySubFiles(vFiles, bDir, lTotalLength);
  151. }
  152. catch (string& e)
  153. {
  154. GetRootItem().AddTail((string("*error") + e).data(),  GetIconIndex("error", true));
  155. return;
  156. }
  157. }
  158. else
  159. {
  160. CFileTorrent fileTorrent;
  161. try
  162. {
  163. assert(m_pCategoryBarWnd);
  164. if (!fileTorrent.OpenFile(m_pCategoryBarWnd->GetDBSavePath() + m_strTorrentFileName))
  165. {
  166. GetRootItem().AddTail((string("*error") + fileTorrent.GetBadMsg()).data(),  GetIconIndex("error", true));
  167. return;
  168. }
  169. fileTorrent.QuerySubFiles(vFiles, bDir, lTotalLength);
  170. }
  171. catch (string& e)
  172. {
  173. GetRootItem().AddTail((string("*error") + e).data(),  GetIconIndex("error", true));
  174. return;
  175. }
  176. }
  177. int iCount = 0;
  178. for (int i=0; i<vFiles.size(); i++)
  179. {
  180. CTreeCursor curRoot(0, this);
  181. CString strFilePath = vFiles[i].m_strFilePath.data();
  182. for (int j=0; ; j++)
  183. {
  184. int iFind = strFilePath.Find('\');
  185. if (iFind == -1)
  186. break;
  187. CString strDir = strFilePath.Left(iFind);
  188. strFilePath = strFilePath.Right(strFilePath.GetLength() - iFind - 1);
  189. if (strDir.IsEmpty())
  190. continue;
  191. curRoot = AddItem(strDir, curRoot, iCount, true, false);
  192. assert(curRoot);
  193. }
  194. // add size to file.
  195. CString strSize = FormatSize(vFiles[i].m_lFileLength, false).data();
  196. if (!strFilePath.IsEmpty())
  197. {
  198. strFilePath += "  (" + strSize + ')';
  199. AddItem(strFilePath, curRoot, iCount, false, vFiles[i].m_lFileLength <= 0);
  200. if (vFiles[i].m_lFileLength > 0)
  201. iCount ++;
  202. }
  203. }
  204. if (GetRootItem().HasChildren())
  205. {
  206. CString strSize = FormatSize(lTotalLength, false).data();
  207. GetRootItem().SetText(GetRootItem().GetText() + "  (共" + strSize + ')');
  208. }
  209. if (m_pFileDBItem && GetRootItem())
  210. TravelThrough(GetRootItem());
  211. GetRootItem().Expand();
  212. }
  213. CTreeCursor CSubFilesWnd::AddItem(CString strItem, CTreeCursor curLayer, int iInx, bool bDir, bool bSizeZero)
  214. {
  215. if (curLayer.HasChildren())
  216. {
  217. CTreeCursor curChild = curLayer.GetChild();
  218. while (curChild)
  219. {
  220. if (curChild.GetText() == strItem)
  221. return curChild;
  222. curChild = curChild.GetNext(TVGN_NEXT);
  223. }
  224. }
  225. CString strTrue = strItem.Left(strItem.ReverseFind('('));
  226. strTrue.TrimRight();
  227. CTreeCursor curItem = curLayer.AddTail(strItem, GetIconIndex(strTrue.GetBuffer(0), bDir));
  228. //
  229. // cal if the item deleted.
  230. //
  231. bool bDelete = false;
  232. if (m_pFileDBItem && !bDir)
  233. {
  234. for (int i=0; i<m_pFileDBItem->m_vUnneededFileInx.size(); i++)
  235. {
  236. if (m_pFileDBItem->m_vUnneededFileInx[i].cy <= iInx)
  237. continue;
  238. if (m_pFileDBItem->m_vUnneededFileInx[i].cx <= iInx)
  239. bDelete = true;
  240. break;
  241. }
  242. }
  243. curItem.SetState(INDEXTOSTATEIMAGEMASK(bDelete ? 2 : 1), TVIS_STATEIMAGEMASK);
  244. if (bSizeZero)
  245. curItem.SetData(eSizeZero);
  246. else
  247. curItem.SetData(eNormal);
  248. return curItem;
  249. }
  250. int CSubFilesWnd::GetIconIndex(char *filename, BOOL bDirectory)
  251. {               
  252. SHFILEINFO ssfi;
  253. DWORD attr;
  254. if (bDirectory)
  255. attr = FILE_ATTRIBUTE_DIRECTORY;
  256. else
  257. attr = FILE_ATTRIBUTE_NORMAL;
  258. SHGetFileInfo(filename, attr, &ssfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
  259. return ssfi.iIcon;
  260. }
  261. void CSubFilesWnd::OnLButtonDblClk(UINT nFlags, CPoint point) 
  262. {
  263. if (m_strFileName.empty() || (!m_pFileTorrent && m_strTorrentFileName.empty()))
  264. return;
  265. CTreeCtrlEx::OnLButtonDblClk(nFlags, point);
  266. m_ItemSel = GetSelectedItem();
  267. if (m_ItemSel && !m_ItemSel.HasChildren())
  268. OnOpenDirectory();
  269. }
  270. void CSubFilesWnd::OnRightClick(NMHDR *pNotifyStruct,LRESULT *result)
  271. {
  272. *result = 0;
  273. // if (m_strFileName.empty() || (!m_pFileTorrent && m_strTorrentFileName.empty()))
  274. // return;
  275. bool bStart = false, bDelete = false, bOpen = false;
  276. CMenu menu_bar;
  277. menu_bar.CreatePopupMenu();
  278. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY, "打开该文件/文件夹(&O)t");
  279. menu_bar.AppendMenu(MF_SEPARATOR);
  280. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_DOWNLOAD_FILE, "继续下载该文件/文件夹(&X)t");
  281. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_DELETE_FILE, "停止下载该文件/文件夹(&D)t");
  282. if (m_pFileTorrent || !m_strTorrentFileName.empty())
  283. {
  284. UINT nFlags;
  285. CPoint curPoint;
  286. GetCursorPos(&curPoint);
  287. ScreenToClient(&curPoint);
  288. m_ItemSel = HitTest(curPoint, &nFlags);
  289. if (m_ItemSel) 
  290. {
  291. m_ItemSel.Select();
  292. bOpen = !m_strFileName.empty();
  293. bDelete = !GetCheck(m_ItemSel);
  294. bStart = !bDelete ;
  295. if (m_ItemSel.GetImageID() == GetIconIndex("a", true))
  296. bStart = true;
  297. }
  298. }
  299. if (m_pFileDBItem)
  300. {
  301. if (m_pFileDBItem->m_pDownload && 
  302. m_pFileDBItem->m_pDownload->IsDownloading() && 
  303. !m_pFileDBItem->m_pDownload->IsBad() )
  304. {
  305. if (!m_pFileDBItem->m_pDownload->CanSetRunParameters())
  306. bStart = false, bDelete = false, bOpen = false;
  307. }
  308. }
  309. menu_bar.EnableMenuItem(ID_MENUITEM_OPEN_DOWNLOADED_DIRECTORY, MF_BYCOMMAND | 
  310. (bOpen ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  311. menu_bar.EnableMenuItem(ID_MENUITEM_DOWNLOAD_FILE, MF_BYCOMMAND | 
  312. (bStart ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  313. menu_bar.EnableMenuItem(ID_MENUITEM_DELETE_FILE, MF_BYCOMMAND | 
  314. (bDelete  ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  315. if (m_bMonitor)
  316. {
  317. // menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_DELETE_FILE, "删除(&D)t");
  318. menu_bar.AppendMenu(MF_SEPARATOR);
  319. if (!m_pMonitorWnd)
  320. {
  321. assert(false);
  322. return;
  323. }
  324. m_pMonitorWnd->OnContextQuery(menu_bar);
  325. }
  326. CPoint posMouse;
  327. GetCursorPos(&posMouse);
  328. menu_bar.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,posMouse.x,posMouse.y,this);
  329. }
  330. void CSubFilesWnd::OnMenuitemMonitorSub(UINT uID) 
  331. {
  332. if (!m_pMonitorWnd)
  333. {
  334. assert(false);
  335. return;
  336. }
  337. if (uID >= ID_MENUITEM_MONITOR_INFORMATION && 
  338. uID <= ID_MENUITEM_MONITOR_LOGS)
  339. {
  340. m_pMonitorWnd->OnShowNode(uID );
  341. }
  342. }
  343. void CSubFilesWnd::OnOpenDirectory()
  344. {
  345. if ((!m_pFileTorrent && m_strTorrentFileName.empty()) || m_strFileName.empty())
  346. {
  347. assert(false);
  348. return;
  349. }
  350. if (!m_ItemSel) return;
  351. CString strSavepath = m_strFileName.data();
  352. if (strSavepath.IsEmpty())
  353. {
  354. assert(false);
  355. return;
  356. }
  357. if (strSavepath[strSavepath.GetLength() - 1] == '\')
  358. strSavepath = strSavepath.Left(strSavepath.GetLength() - 1);
  359. strSavepath = strSavepath.Left(strSavepath.ReverseFind('\') + 1);
  360. CString strCommand;
  361. CTreeCursor cur = m_ItemSel;
  362. while (cur)
  363. {
  364. CString strText = cur.GetText();
  365. if (cur == GetRootItem())
  366. {
  367. strText = strText.Left(strText.ReverseFind('('));
  368. strText.TrimRight();
  369. }
  370. if (strCommand.IsEmpty())
  371. strCommand = strText;
  372. else
  373. strCommand = strText + '\' + strCommand;
  374. cur = cur.GetParent();
  375. }
  376. if (m_ItemSel != GetRootItem() && !m_ItemSel.HasChildren())
  377. {
  378. int iFind = strCommand.ReverseFind('(');
  379. if (iFind >= 0)
  380. {
  381. strCommand = strCommand.Left(iFind);
  382. strCommand.TrimRight();
  383. }
  384. }
  385. strCommand = formatDir(strSavepath.GetBuffer(0)).data() + strCommand;
  386. HINSTANCE iRet = ShellExecute(NULL, "open" , strCommand, 0, 0, SW_SHOW);
  387. if ((UINT)iRet <= HINSTANCE_ERROR)
  388. AfxMessageBox(WSAShowError().data());
  389. }
  390. /*****************************************************************
  391.   switch open and close mode.
  392. *****************************************************************/
  393. void CSubFilesWnd::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  394. {
  395. LPNMTVCUSTOMDRAW lplvcd = (LPNMTVCUSTOMDRAW)pNMHDR;
  396. switch(lplvcd->nmcd.dwDrawStage)
  397. {
  398. case CDDS_PREPAINT:
  399. *pResult = CDRF_NOTIFYITEMDRAW;          // ask for subitem notifications.
  400. break;
  401. case CDDS_ITEMPREPAINT:
  402. {
  403. *pResult = CDRF_NOTIFYPOSTPAINT;
  404. }
  405. break;
  406. case CDDS_ITEMPOSTPAINT:
  407. {
  408. CDC dc;
  409. dc.Attach( lplvcd->nmcd.hdc );
  410. if(GetCheck((HTREEITEM)lplvcd->nmcd.dwItemSpec))
  411. {
  412. RECT area ; //= pCustomDraw->nmcd.rc;
  413. BOOL bRet = GetItemRect((HTREEITEM)lplvcd->nmcd.dwItemSpec, &area, true);
  414. if (bRet)
  415. {
  416. CPoint pt(area.left , area.top);
  417. pt.Offset(-30, 0);
  418. m_ctlImage.Draw(&dc, 0, pt, ILD_TRANSPARENT);
  419. ASSERT(bRet);
  420. }
  421. }
  422. dc.Detach();
  423. *pResult = CDRF_DODEFAULT;
  424. }
  425. default:
  426. *pResult = CDRF_DODEFAULT;
  427. }
  428. }
  429. void CSubFilesWnd::OnMenuStartFile(UINT nID)
  430. {
  431. switch (nID)
  432. {
  433. case ID_MENUITEM_DOWNLOAD_FILE:
  434. {
  435. if (!m_ItemSel) return;
  436. SetItemCheck(m_ItemSel, false);
  437. }
  438. break;
  439. case ID_MENUITEM_DELETE_FILE:
  440. {
  441. if (!m_ItemSel) return;
  442. SetItemCheck(m_ItemSel, true);
  443. }
  444. break;
  445. }
  446. }
  447. void CSubFilesWnd::SetItemCheck(CTreeCursor curItem, BOOL bCheck)
  448. {
  449. SetCheck(curItem, bCheck);
  450. SetCheck(curItem, bCheck);
  451. TravelChild(curItem, bCheck);
  452. TravelSiblingAndParent(curItem);
  453. if (m_pFileDBItem)
  454. {
  455. GetChecks();
  456. m_pFileDBItem->m_vUnneededFileInx = m_vChecks;
  457. if (m_pFileDBItem->m_pDownload && 
  458. m_pFileDBItem->m_pDownload->IsDownloading() && 
  459. !m_pFileDBItem->m_pDownload->IsBad() && 
  460. m_pFileDBItem->m_pDownload->CanSetRunParameters())
  461. {
  462. m_pFileDBItem->m_pDownload->SetUnNeededFilesInxs(m_pFileDBItem->m_vUnneededFileInx);
  463. }
  464. }
  465. }
  466. void CSubFilesWnd::TravelChild(HTREEITEM hItem, BOOL bCheck)
  467. {
  468. HTREEITEM hChildItem = GetChildItem(hItem);
  469. while (hChildItem)
  470. {
  471. BOOL bChecked = GetCheck(hChildItem);
  472. if (bChecked != bCheck)
  473. {
  474. SetCheck(hChildItem, bCheck);
  475. }
  476. TravelChild(hChildItem, bCheck);
  477. hChildItem = GetNextItem(hChildItem, TVGN_NEXT);
  478. }
  479. }
  480. bool CSubFilesWnd::TravelThrough(HTREEITEM hItem)
  481. {
  482. ASSERT(hItem);
  483. HTREEITEM hChildItem = GetChildItem(hItem);
  484. if (!hChildItem)
  485. return GetCheck(hItem) != 0;
  486. bool bDelete = true;
  487. while (hChildItem)
  488. {
  489. if (!TravelThrough(hChildItem))
  490. bDelete = false;
  491. hChildItem = GetNextItem(hChildItem, TVGN_NEXT);
  492. }
  493. SetCheck(hItem, bDelete);
  494. return bDelete;
  495. }
  496. void CSubFilesWnd::TravelSiblingAndParent(HTREEITEM hItem)
  497. {
  498. HTREEITEM hParentItem = GetParentItem(hItem);
  499. if (!hParentItem)
  500. return;
  501. BOOL bOldChecked = GetCheck(hParentItem);
  502. ASSERT(bOldChecked != -1);
  503. BOOL bAllChecked = true;
  504. HTREEITEM hChildItem;
  505. hChildItem = GetChildItem(hParentItem);
  506. while (hChildItem)
  507. {
  508. BOOL bChecked = GetCheck(hChildItem);
  509. ASSERT(bChecked != -1);
  510. if (!bChecked)
  511. {
  512. bAllChecked = false;
  513. break;
  514. }
  515. hChildItem = GetNextItem(hChildItem, TVGN_NEXT);
  516. }
  517. if (bOldChecked != bAllChecked)
  518. {
  519. SetCheck(hParentItem, bAllChecked);
  520. TravelSiblingAndParent(hParentItem);
  521. }
  522. }
  523. void CSubFilesWnd::GetChecks()
  524. {
  525. m_lCount = 0;
  526. m_vChecks.clear();
  527. GetChecksChild(GetRootItem(), false);
  528. /*
  529. CString strText;
  530. for (int i=0; i<m_vChecks.size();i++)
  531. {
  532. CString strTemp;
  533. strTemp.Format("(%d, %d)rn", m_vChecks[i].cx, m_vChecks[i].cy);
  534. strText += strTemp;
  535. }
  536. AfxMessageBox(strText);
  537. //*/
  538. }
  539. void CSubFilesWnd::GetChecksChild(HTREEITEM hItem, BOOL bDelete)
  540. {
  541. //*
  542. long lCount = m_lCount;
  543. BOOL bDeleteParent = bDelete;
  544. while (hItem)
  545. {
  546. if (!bDeleteParent)
  547. {
  548. if (bDelete != GetCheck(hItem))
  549. {
  550. bDelete = GetCheck(hItem);
  551. if (bDelete)
  552. {
  553. lCount = m_lCount;
  554. }
  555. else
  556. {
  557. if (m_lCount > lCount)
  558. m_vChecks.push_back(CSize(lCount, m_lCount));
  559. }
  560. }
  561. }
  562. //
  563. // *** may be empty directory.!!!
  564. //
  565. HTREEITEM hChildItem = GetChildItem(hItem);
  566. if (!hChildItem)
  567. {
  568. if (GetItemData(hItem) == eNormal)
  569. m_lCount ++;
  570. }
  571. else
  572. {
  573. GetChecksChild(hChildItem, bDelete);
  574. }
  575. hItem = GetNextSiblingItem(hItem);
  576. }
  577. if (!bDeleteParent)
  578. {
  579. if (bDelete)
  580. {
  581. if (m_lCount > lCount)
  582. m_vChecks.push_back(CSize(lCount, m_lCount));
  583. }
  584. }
  585. //*/
  586. /*
  587. long lCount = m_lCount;
  588. BOOL bDeleteParent = bDelete;
  589. if (!bDeleteParent)
  590. bDelete = GetCheck(hItem);
  591. hItem = GetChildItem(hItem);
  592. if (!hItem)
  593. {
  594. m_lCount ++;
  595. }
  596. else if (hItem)
  597. {
  598. while (hItem)
  599. {
  600. GetChecksChild(hItem, bDelete);
  601. hItem = GetNextItem(hItem, TVGN_NEXT);
  602. }
  603. }
  604. if (!bDeleteParent && bDelete)
  605. m_vChecks.push_back(CSize(lCount, m_lCount));
  606. //*/
  607. }
  608. void CSubFilesWnd::OnRButtonDown(UINT nFlags, CPoint point) 
  609. {
  610. CTreeCtrlEx::OnRButtonDown(nFlags, point);
  611. }