PageFilesExeList.cpp
上传用户:geanq888
上传日期:2007-01-03
资源大小:316k
文件大小:10k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // PageFilesExeList.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "netmanager.h"
  5. #include "PageFilesExeList.h"
  6. #include "GlobalsExtern.h"
  7. #include "PageFiles.h"
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <shlobj.h>
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CPageFilesExeList
  18. CPageFilesExeList::CPageFilesExeList()
  19. {
  20. }
  21. CPageFilesExeList::~CPageFilesExeList()
  22. {
  23. }
  24. BEGIN_MESSAGE_MAP(CPageFilesExeList, CListCtrl)
  25. //{{AFX_MSG_MAP(CPageFilesExeList)
  26. ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
  27. ON_NOTIFY_REFLECT(LVN_BEGINLABELEDIT, OnBeginlabeledit)
  28. ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
  29. ON_WM_KEYDOWN()
  30. ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
  31. ON_WM_KEYUP()
  32. ON_WM_DROPFILES()
  33. ON_WM_CONTEXTMENU()
  34. ON_COMMAND(IDM_EXEFILES_RENAME, OnExefilesRename)
  35. ON_COMMAND(IDM_EXEFILES_REMOVE, OnExefilesRemove)
  36. ON_COMMAND(IDM_EXEFILES_EXECUTE, OnExefilesExecute)
  37. ON_COMMAND(IDM_EXEFILES_ADD, OnExefilesAdd)
  38. ON_COMMAND(IDM_EXEFILES_AUTOSTART, OnExefilesAutostart)
  39. //}}AFX_MSG_MAP
  40. END_MESSAGE_MAP()
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CPageFilesExeList message handlers
  43. /////////////////////////////////////////////////////////////////////////////
  44. int CPageFilesExeList::GetCurrentSelection()
  45. {
  46.   int nWhichItem = 0;
  47.   if(GetSelectedCount() == 1)
  48.   {
  49.     while(GetItemState(nWhichItem, LVIS_SELECTED) != LVIS_SELECTED)
  50.       nWhichItem++;
  51.   }
  52.   return nWhichItem;
  53. }
  54. /////////////////////////////////////////////////////////////////////////////
  55. void CPageFilesExeList::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
  56. {
  57.   if(GetSelectedCount() != 0)
  58.   {
  59.     int nWhichItem = GetCurrentSelection();
  60.     ((CPageFiles*)GetParent())->FilesExecute(nWhichItem);
  61.   }
  62. *pResult = 0;
  63. }
  64. /////////////////////////////////////////////////////////////////////////////
  65. void CPageFilesExeList::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
  66. {
  67. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  68.   GetEditControl()->LimitText(32);
  69. *pResult = 0;
  70. }
  71. /////////////////////////////////////////////////////////////////////////////
  72. void CPageFilesExeList::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
  73. {
  74. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  75.   if(GetSelectedCount() != 0)
  76.   {
  77.     int nWhichItem = GetCurrentSelection();
  78.     CEdit* pCurrent = GetEditControl();
  79.     CString sCurrent;
  80.     pCurrent->GetWindowText(sCurrent);
  81.     SetItemText(nWhichItem, 0, sCurrent);
  82.   }
  83.   else
  84.     AfxMessageBox("Nothing selected");
  85. *pResult = 0;
  86. }
  87. /////////////////////////////////////////////////////////////////////////////
  88. void CPageFilesExeList::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  89. {
  90.   if(GetSelectedCount() != 0)
  91.   {
  92.     int nWhichItem = GetCurrentSelection();
  93.     switch(nChar)
  94.     {
  95.       case VK_F3:
  96.         ((CPageFiles*)GetParent())->OnExecuteExe();
  97.         break;
  98.       case VK_F2:
  99.         EditLabel(nWhichItem);
  100.         break;
  101.       case VK_INSERT:
  102.         ((CPageFiles*)GetParent())->OnAddExe();
  103.         break;
  104.       case VK_DELETE:
  105.         ((CPageFiles*)GetParent())->OnRemoveExe();
  106.         break;
  107.       case VK_SPACE:
  108.         SwitchExeAuto();
  109.         break;
  110.     }
  111.   }
  112. CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
  113. }
  114. /////////////////////////////////////////////////////////////////////////////
  115. void CPageFilesExeList::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
  116. {
  117.   if(GetSelectedCount() != 0)
  118.   {
  119.     int nWhichItem = GetCurrentSelection();
  120.     ((CPageFiles*)GetParent())->m_FilePath.SetWindowText(((CPageFiles*)GetParent())->m_aExeFiles[nWhichItem].sPath);
  121.     ((CPageFiles*)GetParent())->m_AutoStart.SetCheck(((CPageFiles*)GetParent())->m_aExeFiles[nWhichItem].nAutoStart);
  122.   }
  123. *pResult = 0;
  124. }
  125. /////////////////////////////////////////////////////////////////////////////
  126. void CPageFilesExeList::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
  127. {
  128.   if(GetSelectedCount() != 0)
  129.   {
  130.     int nWhichItem = GetCurrentSelection();
  131.     CString sFileToExe = ((CPageFiles*)GetParent())->m_aExeFiles[nWhichItem].sPath;
  132.     ((CPageFiles*)GetParent())->m_FilePath.SetWindowText(sFileToExe);
  133.     ((CPageFiles*)GetParent())->m_AutoStart.SetCheck(((CPageFiles*)GetParent())->m_aExeFiles[nWhichItem].nAutoStart);
  134.   }
  135.   CListCtrl::OnKeyUp(nChar, nRepCnt, nFlags);
  136. }
  137. /////////////////////////////////////////////////////////////////////////////
  138. void CPageFilesExeList::OnDropFiles(HDROP hDropInfo) 
  139. {
  140.   WORD wNumFilesDropped = DragQueryFile(hDropInfo, -1, NULL, 0);   // Get the number of pathnames that have been dropped
  141.   CStringArray asFiles;
  142.   for (WORD x = 0 ; x < wNumFilesDropped; x++)                      // get all file names. but we'll only need the first one.
  143.   {
  144.     WORD wPathnameSize = DragQueryFile(hDropInfo, x, NULL, 0);      // Get the number of bytes required by the file's full pathname
  145.     char* npszFile = (char*) LocalAlloc(LPTR, wPathnameSize += 1);  // Allocate memory to contain full pathname & zero byte
  146.     if(npszFile == NULL)
  147.       continue;                                                     // If not enough memory, skip this one
  148.     DragQueryFile(hDropInfo, x, npszFile, wPathnameSize);           // Copy the pathname into the buffer
  149.     asFiles.Add(npszFile);
  150.     LocalFree(npszFile);                                            // clean up
  151.   }
  152.   DragFinish(hDropInfo);                                            // Free the memory block containing the dropped-file information
  153.   CString sFile;
  154.   CString sExpandedFile;
  155.   struct _stat buf;
  156.   int j = asFiles.GetSize();
  157.   for(int i = 0; i < j; i++)
  158.   {
  159.     sFile = asFiles.GetAt(i);
  160.     sExpandedFile = ExpandShortcut(sFile);                          // if this was a shortcut, we need to expand it to the target path
  161.     if(sExpandedFile != "")                                         // if that worked, we should have a real file name
  162.       sFile = sExpandedFile;
  163.     if(_stat(sFile, &buf) == 0)
  164.       ((CPageFiles*)GetParent())->AddExe(sFile);
  165.   }
  166.   CListCtrl::OnDropFiles(hDropInfo);
  167. }
  168. /////////////////////////////////////////////////////////////////////////////
  169. // use IShellLink to expand the shortcut
  170. // returns the expanded file, or "" on error
  171. //
  172. // original code was part of CShortcut 
  173. // 1996 by Rob Warner
  174. // rhwarner@southeast.net
  175. // http://users.southeast.net/~rhwarner
  176. CString CPageFilesExeList::ExpandShortcut(CString &inFile)
  177. {
  178.   CString outFile = "";
  179.   // Make sure we have a path
  180.   ASSERT(inFile != _T(""));
  181.   IShellLink* psl;
  182.   HRESULT hres;
  183.   LPTSTR lpsz = inFile.GetBuffer(MAX_PATH);
  184.   // Create instance for shell link
  185.   hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl);
  186.   if(SUCCEEDED(hres))
  187.   {
  188.     // Get a pointer to the persist file interface
  189.     IPersistFile* ppf;
  190.     hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
  191.     if(SUCCEEDED(hres))
  192.     {
  193.       // Make sure it's ANSI
  194.       WORD wsz[MAX_PATH];
  195.       ::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, wsz, MAX_PATH);
  196.       // Load shortcut
  197.       hres = ppf->Load(wsz, STGM_READ);
  198.       if(SUCCEEDED(hres))
  199.       {
  200.         WIN32_FIND_DATA wfd;
  201.         // find the path from that
  202.         HRESULT hres = psl->GetPath(outFile.GetBuffer(MAX_PATH), 
  203.                 MAX_PATH,
  204.                 &wfd, 
  205.                 SLGP_UNCPRIORITY);
  206.         outFile.ReleaseBuffer();
  207.       }
  208.       ppf->Release();
  209.     }
  210.     psl->Release();
  211.   }
  212.   inFile.ReleaseBuffer();
  213.   // if this fails, outFile == ""
  214.   return outFile;
  215. }
  216. /////////////////////////////////////////////////////////////////////////////
  217. void CPageFilesExeList::OnContextMenu(CWnd* pWnd, CPoint point) 
  218. {
  219.   if(GetSelectedCount() != 0)
  220.   {
  221.     CPoint posMouse; 
  222.     GetCursorPos(&posMouse); 
  223.     int nWhichItem = GetCurrentSelection();
  224.     CMenu PopMenu;
  225.     PopMenu.LoadMenu(IDR_EXEFILESMENU); 
  226.     if(((CPageFiles*)GetParent())->m_aExeFiles[nWhichItem].nAutoStart == 0)
  227.       PopMenu.GetSubMenu(0)->CheckMenuItem(IDM_EXEFILES_AUTOSTART, MF_UNCHECKED | MF_BYCOMMAND);
  228.     else
  229.       PopMenu.GetSubMenu(0)->CheckMenuItem(IDM_EXEFILES_AUTOSTART, MF_CHECKED | MF_BYCOMMAND);
  230.     PopMenu.GetSubMenu(0)->TrackPopupMenu(0, posMouse.x, posMouse.y, this);
  231.   }
  232. }
  233. /////////////////////////////////////////////////////////////////////////////
  234. void CPageFilesExeList::OnExefilesExecute() 
  235. {
  236.   ((CPageFiles*)GetParent())->OnExecuteExe();
  237. }
  238. /////////////////////////////////////////////////////////////////////////////
  239. void CPageFilesExeList::OnExefilesRename() 
  240. {
  241.   EditLabel(GetCurrentSelection());
  242. }
  243. /////////////////////////////////////////////////////////////////////////////
  244. void CPageFilesExeList::OnExefilesRemove() 
  245. {
  246.   ((CPageFiles*)GetParent())->OnRemoveExe();
  247. }
  248. /////////////////////////////////////////////////////////////////////////////
  249. void CPageFilesExeList::OnExefilesAdd() 
  250. {
  251.   ((CPageFiles*)GetParent())->OnAddExe();
  252. }
  253. /////////////////////////////////////////////////////////////////////////////
  254. void CPageFilesExeList::OnExefilesAutostart() 
  255. {
  256.   SwitchExeAuto();
  257. }
  258. /////////////////////////////////////////////////////////////////////////////
  259. void CPageFilesExeList::SwitchExeAuto() 
  260. {
  261.   int nWhichItem = GetCurrentSelection();
  262.   if(((CPageFiles*)GetParent())->m_aExeFiles[nWhichItem].nAutoStart == 0)
  263.   {
  264.     SetItemState(nWhichItem, INDEXTOSTATEIMAGEMASK(2), LVIS_STATEIMAGEMASK);
  265.     ((CPageFiles*)GetParent())->m_aExeFiles[nWhichItem].nAutoStart = 1;
  266.     ((CPageFiles*)GetParent())->m_AutoStart.SetCheck(1);
  267.   }
  268.   else
  269.   {
  270.     SetItemState(nWhichItem, INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK);
  271.     ((CPageFiles*)GetParent())->m_aExeFiles[nWhichItem].nAutoStart = 0;
  272.     ((CPageFiles*)GetParent())->m_AutoStart.SetCheck(0);
  273.   }
  274. }
  275. /////////////////////////////////////////////////////////////////////////////