FileView.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:18k
源码类别:

图片显示

开发平台:

Visual C++

  1. // FileView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "QuickImage.h"
  5. #include "FileView.h"
  6. //#include <Lmshare.h>
  7. #include "DirFrm.h"
  8. #include "QuickView.h"
  9. #include "DirView.h"
  10. #include "Global.h"
  11. #include "resource.h"
  12. #include "DlgRename.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. extern bool g_bShowHide;
  19. extern CString g_strCurrentDir;
  20. extern int g_iSortColumn;
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CFileView
  23. IMPLEMENT_DYNCREATE(CFileView, CListView)
  24. CFileView::CFileView()
  25. {
  26. g_iSortColumn = 0;
  27. }
  28. CFileView::~CFileView()
  29. {
  30. }
  31. BEGIN_MESSAGE_MAP(CFileView, CListView)
  32. ON_WM_CONTEXTMENU()
  33. //{{AFX_MSG_MAP(CFileView)
  34. ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
  35. ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
  36. ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
  37. ON_COMMAND(ID_FILE_RENAME, OnFileRename)
  38. ON_UPDATE_COMMAND_UI(ID_FILE_RENAME, OnUpdateFileRename)
  39. ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
  40. ON_WM_KEYDOWN()
  41. //}}AFX_MSG_MAP
  42. ON_COMMAND_RANGE(ID_DIR_UP, ID_DIR_END, OnDirButtons)
  43. ON_UPDATE_COMMAND_UI_RANGE(ID_DIR_UP, ID_DIR_END, OnUpdateDirButtons)
  44. END_MESSAGE_MAP()
  45. //////////////////////
  46. ///////////////////////////////////////////////////////
  47. // CFileView drawing
  48. void CFileView::OnDraw(CDC* pDC)
  49. {
  50. CDocument* pDoc = GetDocument();
  51. // TODO: add draw code here
  52. }
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CFileView diagnostics
  55. #ifdef _DEBUG
  56. void CFileView::AssertValid() const
  57. {
  58. CListView::AssertValid();
  59. }
  60. void CFileView::Dump(CDumpContext& dc) const
  61. {
  62. CListView::Dump(dc);
  63. }
  64. #endif //_DEBUG
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CFileView message handlers
  67. BOOL CFileView::PreCreateWindow(CREATESTRUCT& cs) 
  68. {
  69. cs.lpszName = WC_LISTVIEW;
  70. cs.style &= ~LVS_TYPEMASK;
  71. cs.style |= LVS_REPORT;
  72. cs.style |= LVS_EDITLABELS;
  73. // cs.style |= LVS_OWNERDATA;
  74. return CListView::PreCreateWindow(cs);
  75. }
  76. void CFileView::OnInitialUpdate() 
  77. {
  78. CListView::OnInitialUpdate();
  79. CListCtrl &rListCtrl = GetListCtrl();
  80. HIMAGELIST  hImageList;
  81.     SHFILEINFO    sfi;
  82.     hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\", 
  83.                                            0,
  84.                                            &sfi, 
  85.                                            sizeof(SHFILEINFO), 
  86.                                            SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
  87.     // Attach ImageList to TreeView
  88.     if (hImageList)
  89.         ::SendMessage(rListCtrl.m_hWnd, LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL,
  90.             (LPARAM)hImageList);
  91. /* SHFILEINFO ssfi;
  92. HIMAGELIST hSystemSmallImageList, him;
  93. // CImageList imList;
  94. hSystemSmallImageList = (HIMAGELIST)SHGetFileInfo("C:\", 0, &ssfi,
  95. sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON); 
  96. him = ImageList_Duplicate(hSystemSmallImageList);
  97. m_ImageList.Create(CImageList::FromHandle(him));
  98. m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FILE));
  99. m_ImageList.SetBkColor(CLR_NONE);
  100. // ImageList_SetBkColor(him, CLR_NONE);
  101. rListCtrl.SetImageList(&m_ImageList, LVSIL_SMALL);
  102. */
  103. // DWORD dwExStyle = LVS_EX_FULLROWSELECT| LVS_SHOWSELALWAYS | ES_NOHIDESEL| LVS_EX_SUBITEMIMAGES |//LVS_EX_GRIDLINES |
  104. // LVS_EDITLABELS;//LVS_EX_HEADERDRAGDROP |  | LVS_EX_TRACKSELECT | LVS_OWNERDRAWFIXED;
  105. DWORD dwExStyle = LVS_EX_SUBITEMIMAGES | LVS_EDITLABELS | LVS_EX_HEADERDRAGDROP;
  106. rListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(dwExStyle));
  107. CRect rcClient;
  108. GetClientRect(&rcClient);
  109. rListCtrl.InsertColumn( 0, "Name", LVCFMT_LEFT, rcClient.Width() / 4, 0 );
  110. rListCtrl.InsertColumn( 1, "Size", LVCFMT_LEFT, rcClient.Width() / 4, 0 );
  111. rListCtrl.InsertColumn( 2, "Type", LVCFMT_LEFT, rcClient.Width() / 4, 0 );
  112. rListCtrl.InsertColumn( 3, "Date", LVCFMT_LEFT, rcClient.Width() / 4, 0 );
  113. }
  114. void CFileView::ListFiles()
  115. {
  116. ASSERT(g_strCurrentDir.GetLength() > 0);
  117. char szStartDir[MAX_PATH];
  118. sprintf(szStartDir, "%s*.*", g_strCurrentDir);
  119. int iItem = 0;
  120. HANDLE          hFile; // Handle to found file
  121. WIN32_FIND_DATA stFindData; // Info about the found file
  122. double dFileSize;
  123. SYSTEMTIME systime;
  124. char szTime[20];
  125. char szTemp[MAX_PATH];
  126. SHFILEINFO sfi;
  127. LVITEM lvi;
  128. CListCtrl &rListCtrl = GetListCtrl();
  129. rListCtrl.DeleteAllItems();
  130. hFile = FindFirstFile((LPCTSTR)szStartDir, &stFindData);
  131. if (INVALID_HANDLE_VALUE == hFile)
  132. {
  133. // MessageBox("FindFirstFile() returned INVALID_HANDLE_VALUE", "DEBUG", MB_OK);
  134. MessageBox("Access denied by system!", "DEBUG", MB_OK);
  135. return;
  136. }
  137. // iImages = rListCtrl.GetImageList(LVSIL_SMALL)->GetImageCount() -1;
  138. do//while (INVALID_HANDLE_VALUE != hFile)
  139. {
  140. if ((0 == strcmp(stFindData.cFileName, "."))
  141. || (0 == strcmp(stFindData.cFileName, ".."))
  142. || (stFindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
  143. || ((stFindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) && !g_bShowHide)
  144. )
  145. {// 跳过"." 和 ".." 和 “系统" 和 "隐藏"
  146. }
  147. else
  148. {//file
  149. sprintf(szTemp, "%s%s", g_strCurrentDir, stFindData.cFileName);
  150. SHGetFileInfo(szTemp, 0, &sfi,sizeof(SHFILEINFO), 
  151. SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
  152. SHGFI_ATTRIBUTES | SHGFI_TYPENAME);
  153. lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
  154. lvi.iItem = iItem;
  155. lvi.iSubItem = 0;
  156. lvi.iImage = sfi.iIcon;// > iImages ? iImages : sfi.iIcon;
  157. lvi.pszText = stFindData.cFileName;
  158. lvi.cchTextMax = MAX_PATH;
  159. // lvi.lParam = (LPARAM)pfi;
  160. rListCtrl.InsertItem(&lvi);
  161. if(!(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
  162. {
  163. dFileSize = (double)stFindData.nFileSizeHigh * (double)(MAXDWORD+1.0)
  164. + (double)stFindData.nFileSizeLow;
  165. if(int(dFileSize / 1024) > 0) 
  166. {
  167. sprintf(szTemp, "%d K", int(dFileSize / 1024) + 1);
  168. }
  169. else
  170. {
  171. sprintf(szTemp, "%d bytes", (int)dFileSize);
  172. }
  173. rListCtrl.SetItemText(iItem, 1, szTemp);
  174. }
  175. rListCtrl.SetItemText(iItem, 2, sfi.szTypeName);
  176. FileTimeToSystemTime(&stFindData.ftLastWriteTime, &systime);
  177. GetDateFormat(LOCALE_SYSTEM_DEFAULT,
  178. LOCALE_NOUSEROVERRIDE | DATE_USE_ALT_CALENDAR,
  179. &systime,
  180. NULL,
  181. szTime,
  182. 64);
  183. strcat(szTime, _T(" "));
  184. GetTimeFormat(LOCALE_SYSTEM_DEFAULT,
  185. LOCALE_NOUSEROVERRIDE|TIME_NOSECONDS,
  186. &systime,
  187. NULL,
  188. szTemp,
  189. 32);
  190. strcat(szTime, szTemp);
  191. rListCtrl.SetItemText(iItem, 3, szTime);
  192. iItem++;
  193. }
  194. }while(FindNextFile(hFile, &stFindData));
  195. FindClose(hFile);
  196. GetQuickView()->SetFileName();
  197. rListCtrl.SortItems((PFNLVCOMPARE)SortFunc, (LPARAM)&rListCtrl);
  198. /* LVCOLUMN lvColumn;
  199. int 0, 1, 2, 3;
  200. lvColumn.mask = LVCF_TEXT;
  201. lvColumn.cchTextMax = 5;
  202. lvColumn.pszText = szStartDir;
  203. for(iItem = 0; iItem < 4; iItem++)
  204. {
  205. if(!rListCtrl.GetColumn(iItem, &lvColumn))
  206. break;
  207. if(stricmp(lvColumn.pszText, "name") == 0)
  208. {
  209. 0 = iItem;
  210. }
  211. else if(stricmp(lvColumn.pszText, "size") == 0)
  212. {
  213. 1 = iItem;
  214. }
  215. else if(stricmp(lvColumn.pszText, "type") == 0)
  216. {
  217. 2 = iItem;
  218. }
  219. else if(stricmp(lvColumn.pszText, "date") == 0)
  220. {
  221. 3 = iItem;
  222. }
  223. else
  224. {
  225. ASSERT(FALSE);
  226. }
  227. }
  228. */
  229. }
  230. CQuickView* CFileView::GetQuickView(void)
  231. {
  232. CWnd *pParent = GetParent();
  233. while(NULL != pParent)
  234. {
  235. if(pParent->IsKindOf(RUNTIME_CLASS(CDirFrame)))
  236. return (CQuickView*)(((CDirFrame*)pParent)->m_wndSplitH.GetPane(1, 0));
  237. pParent = pParent->GetParent();
  238. }
  239. return NULL;
  240. }
  241. CDirView* CFileView::GetDirView(void)
  242. {
  243. CWnd *pParent = GetParent();
  244. while(NULL != pParent)
  245. {
  246. if(pParent->IsKindOf(RUNTIME_CLASS(CDirFrame)))
  247. return (CDirView*)(((CDirFrame*)pParent)->m_wndSplitH.GetPane(0, 0));
  248. pParent = pParent->GetParent();
  249. }
  250. return NULL;
  251. }
  252. void CFileView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  253. {
  254. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  255. // TODO: Add your control notification handler code here
  256. if (pNMListView->uChanged == LVIF_STATE)
  257. {
  258. CString strFileName;
  259. if(MakeFileNameFromListItem(strFileName))
  260. {
  261. WIN32_FIND_DATA stFindData;
  262. HANDLE hFind = FindFirstFile((LPCTSTR)strFileName, &stFindData);
  263. if (INVALID_HANDLE_VALUE != hFind)
  264. {
  265. if(!(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
  266. {
  267. GetQuickView()->SetFileName(strFileName);
  268. }
  269. }
  270. FindClose(hFind);
  271. }
  272. }
  273. *pResult = 0;
  274. }
  275. BOOL CFileView::MakeFileNameFromListItem(CString &strFileName, int iItem)
  276. {
  277. CListCtrl &rList = GetListCtrl();
  278. if(-1 == iItem)
  279. {
  280. if(rList.GetSelectedCount() < 1)
  281. {
  282. return FALSE;
  283. }
  284. POSITION pos = rList.GetFirstSelectedItemPosition();
  285. iItem = rList.GetNextSelectedItem(pos);
  286. }
  287. ASSERT(iItem < rList.GetItemCount());
  288. LVCOLUMN lvColumn;
  289. int iName = 0;
  290. lvColumn.mask = LVCF_TEXT;
  291. lvColumn.cchTextMax = 5;
  292. char szLVC[5];
  293. lvColumn.pszText = szLVC;
  294. for(int k = 0; k < 4; k++)
  295. {
  296. if(!rList.GetColumn(k, &lvColumn))
  297. break;
  298. if(stricmp(lvColumn.pszText, "name") == 0)
  299. {
  300. iName = k;
  301. break;
  302. }
  303. }
  304. char szTemp[_MAX_PATH];
  305. rList.GetItemText(iItem, iName, szTemp, MAX_PATH);
  306. strFileName = g_strCurrentDir + szTemp;
  307. return TRUE;
  308. }
  309. void CFileView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
  310. {
  311. CString strFileName;
  312. if(MakeFileNameFromListItem(strFileName))
  313. {
  314. if(CGlobal::IsImgFile(strFileName))
  315. {
  316. ((CQuickImageApp*)AfxGetApp())->m_pImageTemplate->
  317. OpenDocumentFile(strFileName);
  318. }
  319. else
  320. {
  321. WIN32_FIND_DATA stFindData;
  322. HANDLE hFind = FindFirstFile((LPCTSTR)strFileName, &stFindData);
  323. if (INVALID_HANDLE_VALUE != hFind)
  324. {
  325. if(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  326. {
  327. GetDirView()->ExpendItem(strFileName + _T("\"));
  328. }
  329. }
  330. FindClose(hFind);
  331. }
  332. }
  333. *pResult = 0;
  334. }
  335. void CFileView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
  336. {
  337. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  338. if(pNMListView->iItem > -1)
  339. {
  340. CPoint point = pNMListView->ptAction;
  341. ClientToScreen(&point);
  342. point.Offset(5, 5);
  343. CMenu menu;
  344. VERIFY(menu.LoadMenu(CG_IDR_POPUP_FILE_VIEW));
  345. CMenu* pPopup = menu.GetSubMenu(0);
  346. ASSERT(pPopup != NULL);
  347. CWnd* pWndPopupOwner = this;
  348. while (pWndPopupOwner->GetStyle() & WS_CHILD)
  349. pWndPopupOwner = pWndPopupOwner->GetParent();
  350. pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  351. pWndPopupOwner);
  352. }
  353. *pResult = 0;
  354. }
  355. void CFileView::OnFileRename() 
  356. {
  357. CDlgRename dlg;
  358. if(dlg.DoModal() == IDOK)
  359. {
  360. CString strTemplate = dlg.m_strTemplate;
  361. int iStart = dlg.m_iStart;
  362. char *szFront = new char[strTemplate.GetLength() +1];
  363. if(NULL == szFront)
  364. {
  365. return;
  366. }
  367. CString strBack;
  368. strcpy(szFront, strTemplate);
  369. char *pDevide = strchr(szFront, '*');
  370. if(NULL == pDevide)
  371. {
  372. strBack = _T("");
  373. }
  374. else
  375. {
  376. *pDevide = '';
  377. pDevide = strrchr(strTemplate, '*');
  378. strBack = ++pDevide;
  379. }
  380. CString strNewFileName, strOldFileName;
  381. CListCtrl &rList = GetListCtrl();
  382. POSITION pos = rList.GetFirstSelectedItemPosition();
  383. int iItem;
  384. WIN32_FIND_DATA stFindData;
  385. HANDLE hFind = NULL;
  386. char *pNewTitle = NULL;
  387. CDirView *pDirView = GetDirView();
  388. ASSERT(NULL != pDirView);
  389. while(pos)
  390. {
  391. iItem = rList.GetNextSelectedItem(pos);
  392. if(!MakeFileNameFromListItem(strOldFileName, iItem))
  393. {
  394. break;
  395. }
  396. strNewFileName.Format("%s%s%0d%s",
  397. g_strCurrentDir, szFront, iStart++, strBack);
  398. hFind = FindFirstFile((LPCTSTR)strOldFileName, &stFindData);
  399. if (INVALID_HANDLE_VALUE != hFind)
  400. {
  401. if(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  402. {
  403. pNewTitle = strrchr(strNewFileName, '\');
  404. pDirView->SetItemText(strOldFileName, ++pNewTitle);
  405. }
  406. }
  407. FindClose(hFind);
  408. CFile::Rename(strOldFileName, strNewFileName);
  409. }
  410. delete szFront;
  411. ListFiles();
  412. }
  413. }
  414. void CFileView::OnUpdateFileRename(CCmdUI* pCmdUI) 
  415. {
  416. /* CString strFileName;
  417. if(!MakeFileNameFromListSel(strFileName))
  418. {
  419. pCmdUI->Enable(FALSE);
  420. }
  421. else
  422. {
  423. WIN32_FIND_DATA stFindData;
  424. HANDLE hFind = FindFirstFile((LPCTSTR)strFileName, &stFindData);
  425. if (INVALID_HANDLE_VALUE != hFind)
  426. {
  427. if(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  428. {
  429. pCmdUI->Enable(FALSE);
  430. }
  431. }
  432. FindClose(hFind);
  433. pCmdUI->Enable(TRUE);
  434. }
  435. */ pCmdUI->Enable(GetListCtrl().GetSelectedCount() > 0);
  436. }
  437. void CFileView::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
  438. {
  439. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  440. // TODO: Add your control notification handler code here
  441. CString strNew, strOldFileName, strNewFileName;
  442. if(!MakeFileNameFromListItem(strOldFileName, pDispInfo->item.iItem))
  443. {
  444. return;
  445. }
  446. GetListCtrl().GetEditControl()->GetWindowText(strNew);
  447. strNewFileName.Format("%s%s", g_strCurrentDir, strNew);
  448. WIN32_FIND_DATA stFindData;
  449. HANDLE hFind = FindFirstFile((LPCTSTR)strOldFileName, &stFindData);
  450. if (INVALID_HANDLE_VALUE != hFind)
  451. {
  452. if(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  453. {
  454. char *pNewTitle = strrchr(strNewFileName, '\');
  455. GetDirView()->SetItemText(strOldFileName, ++pNewTitle);
  456. }
  457. }
  458. FindClose(hFind);
  459. CFile::Rename(strOldFileName, strNewFileName);
  460. GetListCtrl().SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, strNew);
  461. *pResult = 0;
  462. }
  463. void CFileView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  464. {
  465. if(nChar == 13)//VK_ENTER
  466. {
  467. CString strFileName;
  468. if(MakeFileNameFromListItem(strFileName))
  469. {
  470. if(CGlobal::IsImgFile(strFileName))
  471. {
  472. ((CQuickImageApp*)AfxGetApp())->m_pImageTemplate->
  473. OpenDocumentFile(strFileName);
  474. }
  475. else
  476. {
  477. WIN32_FIND_DATA stFindData;
  478. HANDLE hFind = FindFirstFile((LPCTSTR)strFileName, &stFindData);
  479. if (INVALID_HANDLE_VALUE != hFind)
  480. {
  481. if(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  482. {
  483. GetDirView()->ExpendItem(strFileName + _T("\"));
  484. }
  485. }
  486. FindClose(hFind);;
  487. }
  488. }
  489. }
  490. else if(nChar == 46)//Delete
  491. {
  492. CString strFileName;
  493. if(MakeFileNameFromListItem(strFileName))
  494. {
  495. WIN32_FIND_DATA stFindData;
  496. HANDLE hFind = FindFirstFile((LPCTSTR)strFileName, &stFindData);
  497. if (INVALID_HANDLE_VALUE != hFind)
  498. {
  499. if(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  500. {
  501. GetDirView()->DeleteItem(strFileName + _T("\"));
  502. }
  503. }
  504. DeleteFile(strFileName);
  505. FindClose(hFind);
  506. POSITION pos = GetListCtrl().GetFirstSelectedItemPosition();
  507. GetListCtrl().DeleteItem(GetListCtrl().GetNextSelectedItem(pos));
  508. }
  509. }
  510. CListView::OnKeyDown(nChar, nRepCnt, nFlags);
  511. }
  512. void CFileView::OnDirButtons(UINT nID)
  513. {
  514. CListCtrl &rList = GetListCtrl();
  515. int iHot = rList.GetNextItem(-1, LVNI_SELECTED);
  516. switch(nID)
  517. {
  518. case ID_DIR_UP:
  519. GetDirView()->MoveToUpFolder();
  520. ListFiles();
  521. break;
  522. case ID_DIR_HOME:
  523. if(iHot != -1)
  524. {
  525. rList.SetItemState(iHot,
  526. ~LVIS_SELECTED & ~LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  527. }
  528. rList.SetItemState(0,
  529. LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  530. break;
  531. case ID_DIR_PREV:
  532. if(iHot != -1)
  533. {
  534. rList.SetItemState(iHot,
  535. ~LVIS_SELECTED & ~LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  536. iHot --;
  537. if(iHot == -1)
  538. {
  539. iHot = rList.GetItemCount() -1;
  540. }
  541. rList.SetItemState(iHot,
  542. LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  543. }
  544. else
  545. {
  546. rList.SetItemState(rList.GetItemCount() -1,
  547. LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  548. }
  549. break;
  550. case ID_DIR_NEXT:
  551. if(iHot != -1)
  552. {
  553. rList.SetItemState(iHot,
  554. ~LVIS_SELECTED & ~LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  555. iHot ++;
  556. if(iHot == rList.GetItemCount())
  557. {
  558. iHot = 0;
  559. }
  560. rList.SetItemState(iHot,
  561. LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  562. }
  563. else
  564. {
  565. rList.SetItemState(0,
  566. LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  567. }
  568. break;
  569. case ID_DIR_END:
  570. if(iHot != -1)
  571. {
  572. rList.SetItemState(iHot,
  573. ~LVIS_SELECTED & ~LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  574. }
  575. rList.SetItemState(rList.GetItemCount() -1,
  576. LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED);
  577. break;
  578. default:
  579. break;
  580. }
  581. }
  582. void CFileView::OnUpdateDirButtons(CCmdUI *pCmdUI)
  583. {
  584. /* switch(pCmdUI->m_nID)
  585. {
  586. case ID_DIR_UP:
  587. pCmdUI->Enable(TRUE);
  588. break;
  589. case ID_DIR_HOME:
  590. break;
  591. case ID_DIR_PREV:
  592. break;
  593. case ID_DIR_NEXT:
  594. break;
  595. case ID_DIR_END:
  596. break;
  597. default:
  598. break;
  599. }*/
  600. pCmdUI->Enable(TRUE);
  601. }
  602. int CALLBACK CFileView::SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  603. {
  604. // lParamSort contains a pointer to the list view control.
  605. // The lParam of an item is just its index.
  606. CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
  607. CString    strItem1 = pListCtrl->GetItemText(lParam1, g_iSortColumn);
  608. CString    strItem2 = pListCtrl->GetItemText(lParam2, g_iSortColumn);
  609. CString strFile1 = g_strCurrentDir + strItem1;
  610. CString strFile2 = g_strCurrentDir + strItem2;
  611. WIN32_FIND_DATA stFindData;
  612. BOOL bIsFolder1, bIsFolder2;
  613. HANDLE hFind = FindFirstFile((LPCTSTR)strFile1, &stFindData);
  614. if (INVALID_HANDLE_VALUE != hFind)
  615. {
  616. bIsFolder1 = stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
  617. }
  618. hFind = FindFirstFile((LPCTSTR)strFile2, &stFindData);
  619. if (INVALID_HANDLE_VALUE != hFind)
  620. {
  621. bIsFolder2 = stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
  622. }
  623. FindClose(hFind);
  624. if(bIsFolder1 && !bIsFolder2)
  625. return -1;
  626. if(!bIsFolder1 && bIsFolder2)
  627. return 1;
  628. return strcmp(strItem1, strItem2);
  629. }