FtpDirList.cpp
上传用户:tjfeida
上传日期:2013-03-10
资源大小:1917k
文件大小:9k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // FtpDirList.cpp : implementation file
  2. //
  3. /*********************************************
  4. **该文件是属于WolfFTP工程中的。如果有什么问题
  5. **请联系
  6. **         tablejiang@21cn.com
  7. **或者访问
  8. **         http://wolfftp.51.net
  9. **以得到最新的支持。
  10. *********************************************/
  11. #include "stdafx.h"
  12. #include "QuickFTP.h"
  13. #include "FtpDirList.h"
  14. #include "SortStringArray.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CFtpDirList
  22. CFtpDirList::CFtpDirList()
  23. {
  24. m_nItem = 0 ;
  25. }
  26. CFtpDirList::~CFtpDirList()
  27. {
  28. m_ImageList.Detach( ) ;
  29. m_ImageList.m_hImageList = NULL ;
  30. }
  31. BEGIN_MESSAGE_MAP(CFtpDirList, CListCtrl)
  32. //{{AFX_MSG_MAP(CFtpDirList)
  33. ON_WM_CREATE()
  34. ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
  35. ON_WM_KEYDOWN()
  36. ON_WM_DESTROY()
  37. ON_WM_RBUTTONDOWN()
  38. //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CFtpDirList message handlers
  42. /***************************************************
  43. ** @Description:
  44. ** Get system default image list handle .
  45. **
  46. ** @Note:
  47. **
  48. ** @Return: success true , else false .
  49. ** @Author: JHM
  50. ** @e-mail: tablejiang@21cn.com
  51. ** @Date: 2001 3 26
  52. ****************************************************/
  53. BOOL CFtpDirList::GetSysImgList()
  54. {
  55. SHFILEINFO shFinfo;
  56. HIMAGELIST hImgList = NULL;
  57. hImgList = (HIMAGELIST)SHGetFileInfo( "C:\",
  58.   0,
  59.   &shFinfo,
  60.   sizeof( shFinfo ),
  61.   SHGFI_SYSICONINDEX | 
  62.   SHGFI_SMALLICON );
  63. if ( !hImgList )
  64. {
  65. return FALSE;
  66. }
  67. m_ImageList.m_hImageList = hImgList ;
  68. SetImageList( &m_ImageList , LVSIL_SMALL ) ;
  69. //get directory icon index ;
  70. char szPath[MAX_PATH] ;
  71. if( GetSystemDirectory( szPath , MAX_PATH )  == 0 )
  72. {
  73. m_DirIconIndex = 5 ;
  74. return true ;
  75. }
  76. SHFILEINFO shFileInfo ;
  77. CString strTemp = szPath ;
  78. //add ''
  79. if ( strTemp.Right(1) != '\' )
  80.  strTemp += "\";
  81. //get the system icon index .
  82. if ( !SHGetFileInfo( strTemp,
  83. 0,
  84. &shFileInfo,
  85. sizeof( shFileInfo ),
  86. SHGFI_ICON | SHGFI_SMALLICON | 
  87. SHGFI_TYPENAME |SHGFI_DISPLAYNAME ) )
  88. {
  89. return false ;
  90. }
  91. m_DirIconIndex = shFileInfo.iIcon;
  92. // we only need the index from the system image list
  93. DestroyIcon( shFileInfo.hIcon );
  94. return TRUE;   // OK
  95. }
  96. int CFtpDirList::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  97. {
  98. if (CListCtrl::OnCreate(lpCreateStruct) == -1)
  99. return -1;
  100. // TODO: Add your specialized creation code here
  101. InitList( ) ;
  102. GetSysImgList( ) ;
  103. return 0;
  104. }
  105. /***********************************************************
  106. ** @Description:
  107. ** Init the list column .
  108. **
  109. ** @Note:
  110. **
  111. ** @Return: 
  112. ** @Author: JHM
  113. ** @e-mail: tablejiang@21cn.com
  114. ** @Date: 2001 3 26
  115. *************************************************************/
  116. BOOL CFtpDirList::InitList()
  117. {
  118. RECT rect ;
  119. GetClientRect( &rect ) ;
  120. int iLength = ( rect.right - rect.left ) / 6 ;
  121. //insert Column
  122. InsertColumn( 0 , "名称" , LVCFMT_LEFT , iLength * 2 ) ;
  123. InsertColumn( 1 , "大小" , LVCFMT_RIGHT , iLength ) ;
  124. InsertColumn( 2 , "类型" , LVCFMT_LEFT, iLength ) ;
  125. InsertColumn( 3 , "时间" , LVCFMT_LEFT, iLength ) ;
  126. InsertColumn( 4 , "日期" , LVCFMT_LEFT, iLength ) ;
  127. InsertColumn( 5 , "属性" , LVCFMT_LEFT, iLength ) ;
  128. // AddItem( "abc" , "abc" , "abc" , "abc" , "abc"  ) ;
  129. return true ;
  130. }
  131. /***********************************************************
  132. ** @Description:
  133. **
  134. ** @Note:
  135. **
  136. ** @Return: 
  137. ** @Author: JHM
  138. ** @e-mail: tablejiang@21cn.com
  139. ** @Date: 2001 3 26
  140. *************************************************************/
  141. BOOL CFtpDirList::AddItem(LPCTSTR szName, LPCTSTR szSize, LPCTSTR szDate, 
  142.   LPCTSTR szTime, LPCTSTR szAttrib , LPCTSTR szType )
  143. {
  144. return true ;
  145. }
  146. /***********************************************************
  147. ** @Description:
  148. **
  149. ** @Note:
  150. **
  151. ** @Return: 
  152. ** @Author: JHM
  153. ** @e-mail: tablejiang@21cn.com
  154. ** @Date: 2001 3 26
  155. *************************************************************/
  156. void CFtpDirList::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
  157. {
  158. // TODO: Add your control notification handler code here
  159. ::PostMessage( m_hParentWnd , FTP_LIST_DBCLICK_MSG , 0 , 0 );
  160. *pResult = 0;
  161. }
  162. /***********************************************************
  163. ** @Description:
  164. ** delete all list item . and reset the item count.
  165. **
  166. ** @Note:
  167. **
  168. ** @Return: 
  169. ** @Author: JHM
  170. ** @e-mail: tablejiang@21cn.com
  171. ** @Date: 2001 3 26
  172. *************************************************************/
  173. BOOL CFtpDirList::DelAllItem()
  174. {
  175. m_nItem = 0 ;
  176. return DeleteAllItems( ) ;
  177. }
  178. /***********************************************************
  179. ** @Description:
  180. ** Add a item to list ctrl .
  181. **
  182. ** @Note:
  183. ** FTPITEM* pItem : item info.
  184. **
  185. ** @Return: true .
  186. ** @Author: JHM
  187. ** @e-mail: tablejiang@21cn.com
  188. ** @Date: 2001 3 26
  189. *************************************************************/
  190. BOOL CFtpDirList::AddItem(FTPITEM *pItem)
  191. {
  192. FTPITEM* pCur ;
  193. CSortStringArray strDirArray ;
  194. CSortStringArray strFileArray ;
  195. //empty the list.
  196. DeleteAllItems( ) ;
  197. //init the array .
  198. strDirArray.RemoveAll() ;
  199. strFileArray.RemoveAll( ) ;
  200. //beacuse want sort the item .
  201. pCur = pItem ;
  202. while( pCur->pNext != NULL )
  203. {
  204. if( pCur->dwType == 1 )
  205. {
  206. //if directory
  207. strDirArray.Add( pCur->szName ) ;
  208. }
  209. else
  210. {
  211. //if files .
  212. int index = 0 ;
  213. index = strFileArray.Add( pCur->szName ) ;
  214. }
  215. pCur = pCur->pNext ;
  216. }
  217. //sort the item .
  218. strDirArray.Sort( ) ;
  219. strFileArray.Sort( ) ;
  220. //insert directory .
  221. int i = 0 ;
  222. for( i = 0 ; i < strDirArray.GetSize( ) ; i ++ )
  223. {
  224. pCur = pItem  ;
  225. while( pCur->pNext != NULL )
  226. {
  227. if( strcmp( strDirArray.GetAt( i ) , pCur->szName ) == 0 )
  228. {
  229. InsertItem( LVIF_TEXT|LVIF_IMAGE , m_nItem , pCur->szName , 0 , 0 , m_DirIconIndex , 0 ) ;
  230. SetItemText( m_nItem , 1 , pCur->szSize ) ;
  231. SetItemText( m_nItem , 2 , "DIR" ) ;
  232. SetItemText( m_nItem , 3 , pCur->szTime ) ;
  233. SetItemText( m_nItem , 4 , pCur->szDate ) ;
  234. SetItemText( m_nItem , 5 , pCur->szAttrib ) ;
  235. m_nItem ++ ;
  236. break ;
  237. }
  238. pCur = pCur->pNext ;
  239. }
  240. }
  241. //insert file.
  242. for( i = 0 ; i < strFileArray.GetSize() ; i ++ )
  243. {
  244. pCur = pItem ;
  245. while( pCur->pNext != NULL )
  246. {
  247. if( strcmp( strFileArray.GetAt( i ) , pCur->szName ) == 0 )
  248. {
  249. int iIconIndex ;
  250. iIconIndex = GetIconIndex( pCur->szName ) ;
  251. InsertItem( LVIF_TEXT|LVIF_IMAGE , m_nItem , pCur->szName , 0 , 0 , iIconIndex , 0 ) ;
  252. SetItemText( m_nItem , 2 , "" ) ;
  253. SetItemText( m_nItem , 1 , pCur->szSize ) ;
  254. SetItemText( m_nItem , 3 , pCur->szTime ) ;
  255. SetItemText( m_nItem , 4 , pCur->szDate ) ;
  256. SetItemText( m_nItem , 5 , pCur->szAttrib ) ;
  257. m_nItem ++ ;
  258. break ;
  259. }
  260. pCur = pCur->pNext ;
  261. }
  262. }
  263. return true ;
  264. }
  265. /***********************************************************
  266. ** @Description:
  267. ** Get the file default icon index , which in system 
  268. ** default image list .
  269. **
  270. ** @Note:
  271. **
  272. ** @Return: 
  273. ** @Author: JHM
  274. ** @e-mail: tablejiang@21cn.com
  275. ** @Date: 2001 3 26
  276. *************************************************************/
  277. int CFtpDirList::GetIconIndex(LPSTR szName)
  278. {
  279. //only need the file extend name .
  280. char driver[MAX_PATH] , dir[MAX_PATH] , name[MAX_PATH] , ext[MAX_PATH] ;
  281. _splitpath( szName , driver , dir , name , ext ) ;
  282. SHFILEINFO sfi;
  283. ZeroMemory(&sfi,sizeof(sfi));
  284. SHGetFileInfo( ext ,
  285.    FILE_ATTRIBUTE_NORMAL,
  286.    &sfi,
  287.    sizeof(sfi),
  288.    SHGFI_USEFILEATTRIBUTES|SHGFI_ICON);
  289. DestroyIcon( sfi.hIcon ) ;
  290. return sfi.iIcon ;
  291. }
  292. void CFtpDirList::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  293. {
  294. // TODO: Add your message handler code here and/or call default
  295. switch( nChar )
  296. {
  297. case VK_F5 :
  298. case VK_DELETE :
  299. case VK_F2 :
  300. case VK_BACK:
  301. case VK_RETURN :
  302. {
  303. ::PostMessage( m_hParentWnd , FTP_LIST_KEY_EVENT_MSG , nChar , 0 ) ;
  304. }
  305. break ;
  306. default :
  307. break ;
  308. }
  309. CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
  310. }
  311. void CFtpDirList::OnDestroy() 
  312. {
  313. //must deatch the system image list handle .
  314. //if not ,the system image will be destroy.
  315. SetImageList( NULL , LVSIL_SMALL ) ;
  316. m_ImageList.Detach(  ) ;
  317. CListCtrl::OnDestroy();
  318. // TODO: Add your message handler code here
  319. }
  320. void CFtpDirList::OnRButtonDown(UINT nFlags, CPoint point) 
  321. {
  322. // TODO: Add your message handler code here and/or call default
  323. ::PostMessage( m_hParentWnd , FTP_LIST_RCLK_MSG , 0 , 0 ) ;
  324. CListCtrl::OnRButtonDown(nFlags, point);
  325. }
  326. BOOL CFtpDirList::SelectAllItem()
  327. {
  328. int iCount = GetItemCount( ) ;
  329. if( iCount == 0  )
  330. return true ;
  331. for( int i = 0 ; i < iCount ; i ++ )
  332. {
  333. SetItemState( i , LVIS_SELECTED  , LVIS_SELECTED  ) ;
  334. }
  335. return true ;
  336. }