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

Ftp客户端

开发平台:

Visual C++

  1. // FtpDirView.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 "FtpDirView.h"
  14. #include "DirListCtrl.h"
  15. #include "shlwapi.h"
  16. #include "InputFileNameDlg.h"
  17. #ifdef _DEBUG
  18. #define new DEBUG_NEW
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CFtpDirView
  24. IMPLEMENT_DYNCREATE(CFtpDirView, CView)
  25. CFtpDirView::CFtpDirView()
  26. {
  27. m_pFtp = NULL ;
  28. m_bDragging = false ;
  29. m_pDragImage = NULL ;
  30. m_nDragIndex = -1;
  31. }
  32. CFtpDirView::~CFtpDirView()
  33. {
  34. if(m_pDragImage)
  35. delete m_pDragImage;
  36. m_pFtp->Logout ( ) ;
  37. }
  38. BEGIN_MESSAGE_MAP(CFtpDirView, CView)
  39. //{{AFX_MSG_MAP(CFtpDirView)
  40. ON_WM_SIZE()
  41. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  42. ON_COMMAND(IDR_NEED_CONNECT, OnNeedConnect)
  43. ON_WM_MOUSEMOVE()
  44. ON_WM_LBUTTONUP()
  45. ON_WM_KEYDOWN()
  46. ON_WM_CREATE()
  47. ON_COMMAND(IDR_REMOTE_ABORD, OnRemoteAbord)
  48. ON_COMMAND(IDR_REMOTE_DELETE, OnRemoteDelete)
  49. ON_COMMAND(IDR_REMOTE_DOWNLOAD, OnRemoteDownload)
  50. ON_COMMAND(IDR_REMOTE_EDIT, OnRemoteEdit)
  51. ON_COMMAND(IDR_REMOTE_MKDIR, OnRemoteMkdir)
  52. ON_COMMAND(IDR_REMOTE_REFRESH, OnRemoteRefresh)
  53. ON_COMMAND(ID_SELECT_ALL, OnSelectAll)
  54. //}}AFX_MSG_MAP
  55. ON_NOTIFY (LVN_BEGINDRAG, IDC_FTPDIRLIST, OnBeginDrag)
  56. END_MESSAGE_MAP()
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CFtpDirView drawing
  59. void CFtpDirView::OnDraw(CDC* pDC)
  60. {
  61. CQuickFTPDoc* pDoc = GetDocument();
  62. ASSERT_VALID(pDoc);
  63. // TODO: add draw code here
  64. /*
  65. CBrush brush  ;
  66. CBrush *pBakBrush ;
  67. RECT rect ;
  68. GetClientRect( &rect ) ;
  69. brush.CreateSolidBrush( RGB(125 , 125 , 125 ) ) ;
  70. pBakBrush = pDC->SelectObject( &brush ) ;
  71. rect.bottom = rect.top + 25 ;
  72. pDC->FillRect( &rect , &brush ) ;
  73. pDC->SelectObject( pBakBrush ) ;
  74. brush.DeleteObject () ;
  75. */
  76. }
  77. /////////////////////////////////////////////////////////////////////////////
  78. // CFtpDirView diagnostics
  79. #ifdef _DEBUG
  80. void CFtpDirView::AssertValid() const
  81. {
  82. CView::AssertValid();
  83. }
  84. void CFtpDirView::Dump(CDumpContext& dc) const
  85. {
  86. CView::Dump(dc);
  87. }
  88. #endif //_DEBUG
  89. CQuickFTPDoc* CFtpDirView::GetDocument() // non-debug version is inline
  90. {
  91. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CQuickFTPDoc)));
  92. return (CQuickFTPDoc*)m_pDocument;
  93. }
  94. /////////////////////////////////////////////////////////////////////////////
  95. // CFtpDirView message handlers
  96. void CFtpDirView::OnInitialUpdate() 
  97. {
  98. CView::OnInitialUpdate();
  99. // TODO: Add your specialized code here and/or call the base class
  100. }
  101. void CFtpDirView::OnSize(UINT nType, int cx, int cy) 
  102. {
  103. CView::OnSize(nType, cx, cy);
  104. // TODO: Add your message handler code here
  105. RECT rect ;
  106. //set combo box pos .
  107. if( m_Combo.m_hWnd != NULL )
  108. {
  109. GetClientRect( &rect ) ;
  110. rect.right -= 26 ;
  111. rect.bottom  = 150  ;
  112. m_Combo.MoveWindow( &rect , TRUE ) ;
  113. }
  114. //set bitmap button pos .
  115. {
  116. GetClientRect( &rect ) ;
  117. rect.left = rect.right - 26;
  118. rect.bottom = rect.top + 20 ;
  119. m_UpButton.MoveWindow( &rect , TRUE ) ;
  120. m_UpButton.SizeToContent( ) ;
  121. }
  122. //set list pos .
  123. if( m_ListCtrl.m_hWnd != NULL )
  124. {
  125. GetClientRect( &rect ) ;
  126. rect.top += 22 ;
  127. m_ListCtrl.MoveWindow( &rect , TRUE ) ;
  128. }
  129. }
  130. LRESULT CFtpDirView::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  131. {
  132. // TODO: Add your specialized code here and/or call the base class
  133. switch( message )
  134. {
  135. case FTP_SERVER_DIR_LIST_MSG :
  136. //receive the ftp dir list
  137. FTPITEM* pFtpItemHead ;
  138. pFtpItemHead = ( FTPITEM *)wParam ;
  139. ReceiveDirList( pFtpItemHead ) ;
  140. break ;
  141. case FTP_LIST_DBCLICK_MSG :
  142. //enter the dir item .
  143. EnterListCurDir( ) ;
  144. break ;
  145. case WM_COMMAND :
  146. HandleCommand( (int)(LOWORD( wParam )) , (HWND)lParam , (UINT)(HIWORD(wParam)) ) ;
  147. break ;
  148. case ENABLE_FTP_LIST_MSG:
  149. switch( wParam )
  150. {
  151. case 0 :
  152. //disable current window
  153. SetStateDisable( ) ;
  154. break ;
  155. case 1:
  156. //enable current window
  157. SetStateEnable( ) ;
  158. break ;
  159. default:
  160. break ;
  161. }
  162. break ;
  163. case REFRESH_WND_MSG:
  164. {
  165. //refresh current .
  166. RefreshCurrentDirectory( ) ;
  167. }
  168. break ;
  169. case FTP_LIST_KEY_EVENT_MSG:
  170. {
  171. switch( wParam )
  172. {
  173. case VK_F5 :
  174. {
  175. RefreshCurrentDirectory( ) ;
  176. }
  177. break ;
  178. case VK_F2 :
  179. {
  180. RenameSelectItem( ) ;
  181. }
  182. break ;
  183. case VK_DELETE :
  184. {
  185. DeleteSelectItem( ) ;
  186. }
  187. break ;
  188. case VK_BACK :
  189. {
  190. //enter up directory
  191. EnterParentDir() ;
  192. }
  193. break ;
  194. case VK_RETURN :
  195. {
  196. EnterListCurDir( ) ;
  197. }
  198. break ;
  199. default :
  200. break ;
  201. }
  202. }
  203. break ;
  204. case FTP_LIST_RCLK_MSG :
  205. {
  206. POINT point ;
  207. GetCursorPos( &point ) ;
  208. CMenu PopMenu ;
  209. PopMenu.LoadMenu( IDR_MAINFRAME ) ;
  210. CMenu *pPopMenu = PopMenu.GetSubMenu( 2 ) ;
  211. pPopMenu->EnableMenuItem( IDR_REMOTE_UPLOAD , MF_DISABLED | MF_GRAYED) ;
  212. pPopMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON , point.x , point.y , this ) ;
  213. PopMenu.DestroyMenu() ;
  214. }
  215. break ;
  216. default:
  217. break ;
  218. }
  219. return CView::DefWindowProc(message, wParam, lParam);
  220. }
  221. void CFtpDirView::OnAppAbout()
  222. {
  223. // TODO: Add your command handler code here
  224. }
  225. void CFtpDirView::OnNeedConnect() 
  226. {
  227. // TODO: Add your command handler code here
  228. }
  229. void CFtpDirView::HandleCommand(int id, HWND hCtrlWnd, UINT uEvent)
  230. {
  231. switch( id )
  232. {
  233. case IDC_HISTROYCOMBO:
  234. switch( uEvent )
  235. {
  236. case CBN_SELCHANGE :
  237. //enter history path .
  238. char szPath[MAX_PATH] ;
  239. if( m_Combo.GetSelectText( szPath ) )
  240. {
  241. m_pFtp->EnterDirectory( szPath ) ;
  242. ShowCurrentListDirectory( szPath ) ; 
  243. }
  244. break ;
  245. default :
  246. break ;
  247. }
  248. break ;
  249. case IDC_FTPDIRLIST:
  250. switch( uEvent )
  251. {
  252. case NM_DBLCLK :
  253. break ;
  254. default :
  255. break ;
  256. }
  257. break ;
  258. case IDC_FTPDIRUPBTN:
  259. switch( uEvent )
  260. {
  261. case BN_CLICKED:
  262. EnterParentDir() ;
  263. break ;
  264. default :
  265. break ;
  266. }
  267. break ;
  268. default :
  269. break ;
  270. }
  271. }
  272. void CFtpDirView::RefurbishDirList()
  273. {
  274. }
  275. void CFtpDirView::EnterListCurDir()
  276. {
  277. int iCount = m_ListCtrl.GetSelectedCount();
  278. if( iCount > 1 || iCount <= 0)
  279. return  ;
  280. int iCurSel = m_ListCtrl.GetNextItem( -1 , LVNI_SELECTED ) ;
  281. LVITEM lci ;
  282. LVITEM lci2 ;
  283. char szText[MAX_PATH] ;
  284. char szText2[MAX_PATH] ;
  285. szText[0] = 0 ;
  286. //get the file type .
  287. lci2.mask = LVIF_INDENT | LVIF_TEXT;
  288. lci2.pszText = szText2 ;
  289. lci2.cchTextMax = MAX_PATH ;
  290. lci2.iItem = iCurSel ;
  291. lci2.iSubItem = 2 ;
  292. m_ListCtrl.GetItem( &lci2 ) ;
  293. //get file name .
  294. lci.mask = LVIF_INDENT | LVIF_TEXT;
  295. lci.pszText = szText ;
  296. lci.cchTextMax = MAX_PATH ;
  297. lci.iItem = iCurSel ;
  298. lci.iSubItem = 0 ;
  299. m_ListCtrl.GetItem( &lci ) ;
  300. if( strcmp( lci2.pszText , "" )== 0 )
  301. {
  302. //if file download it.
  303. DownLoadFile( lci.pszText , 0 , NULL , iCurSel ) ;
  304. return ;
  305. }
  306. //make the ftp path .
  307. char strDisplayPath[MAX_PATH] ;
  308. int  iLength = 0 ;
  309. strcpy( strDisplayPath , m_pFtp->m_CurrentFtpDirectory ) ;
  310. iLength = strlen( strDisplayPath ) ;
  311. if( strDisplayPath[iLength - 1 ] != '/' )
  312. strcat( strDisplayPath , "/" ) ;
  313. strcat( strDisplayPath , lci.pszText ) ;
  314. //enter path .
  315. m_pFtp->EnterDirectory( strDisplayPath ) ;
  316. //refresh 
  317. ShowCurrentListDirectory( strDisplayPath ) ;
  318. return  ;
  319. }
  320. void CFtpDirView::ReceiveDirList(FTPITEM *pFtpItemHead)
  321. {
  322. //add file queue to history list.
  323. //if the path already exist in history list ,
  324. //we not add it , only select it .
  325. if( m_HistoryQueue.AddItem( pFtpItemHead , m_pFtp->m_CurrentFtpDirectory ) )
  326. {
  327. m_Combo.AddString( m_pFtp->m_CurrentFtpDirectory) ;
  328. m_Combo.SetCurSel( 0 ) ;
  329. }
  330. else
  331. m_Combo.SetItemSelect( m_pFtp->m_CurrentFtpDirectory ) ;
  332. RefreshFtpList( pFtpItemHead ) ;
  333. }
  334. BOOL CFtpDirView::RefreshFtpList(FTPITEM *pFtpItem)
  335. {
  336. //clear list ctrl.
  337. if( !m_ListCtrl.DelAllItem( ) )
  338. return false ;
  339. if( pFtpItem == NULL )
  340. return false ;
  341. //add item .
  342. m_ListCtrl.AddItem( pFtpItem ) ;
  343. return true ;
  344. }
  345. void CFtpDirView::ShowCurrentListDirectory(LPSTR szPath)
  346. {
  347. //find the path in history .
  348. HISTORYINFO * pCurPos = m_HistoryQueue.FindInHistory( szPath ) ;
  349. if( pCurPos == NULL )
  350. {
  351. //if not found , get ftp list.
  352. RefreshCurrentDirectory() ;
  353. }
  354. else
  355. {
  356. //if found , use history list.
  357. RefreshFtpList( pCurPos->pFtpItem ) ;
  358. }
  359. //select this path .
  360. m_Combo.SetItemSelect( szPath ) ;
  361. }
  362. void CFtpDirView::EnterParentDir()
  363. {
  364. m_pFtp->EnterParentDir( ) ;
  365. CString strFind ;
  366. //make path .
  367. strFind = m_pFtp->m_CurrentFtpDirectory ;
  368. int pos = strFind.ReverseFind( '/' ) ;
  369. if( strFind.GetLength( ) > 1 )
  370. strFind = strFind.Left( pos + 1 ) ;
  371. char szPath [MAX_PATH ] ;
  372. strcpy( szPath , (LPCTSTR)strFind );
  373. //refresh .
  374. ShowCurrentListDirectory( szPath ) ; 
  375. }
  376. BOOL CFtpDirView::DisconnectFtp()
  377. {
  378. //disconnect with server.
  379. m_pFtp->Logout ( ) ;
  380. m_HistoryQueue.DeleteAllItem( ) ;
  381. m_ListCtrl.DeleteAllItems( ) ;
  382. m_Combo.DeleteAllItem( ) ;
  383. return true ;
  384. }
  385. BOOL CFtpDirView::ConnectFtp( SITEINFO* pSite )
  386. {
  387. //set hwnd info .
  388. m_HistoryQueue.DeleteAllItem( ) ;
  389. HWNDINFO hWndInfo ;
  390. ZeroMemory( &hWndInfo , sizeof( HWNDINFO ) ) ;
  391. //set window handle .
  392. hWndInfo.hInfoWnd = m_hDisplayWnd ;
  393. hWndInfo.hFtpDirListWnd = m_hWnd ;
  394. m_pFtp->SetSiteInfo( pSite  , &hWndInfo) ;
  395. //get history download file .
  396. char SaveFileName[MAX_PATH] ;
  397. sprintf( SaveFileName , "%s%s.QFQ" , m_pFtp->m_SiteInfo.host , m_pFtp->m_SiteInfo.user ) ;
  398. m_pFtp->m_FileQueue.SetSaveFileName( SaveFileName ) ;
  399. CQuickFTPDoc* pDoc = GetDocument();
  400. ASSERT_VALID(pDoc);
  401. //set doc var.
  402. pDoc->m_pFileQueue = &m_pFtp->m_FileQueue ;
  403. pDoc->UpdateAllViews( this );
  404. //start connect.
  405. m_pFtp->StartFtpCommunication() ;
  406. RefreshCurrentDirectory( ) ;
  407. return true ;
  408. }
  409. BOOL CFtpDirView::SetStateDisable()
  410. {
  411. //disable window
  412. m_Combo.EnableWindow( FALSE ) ;
  413. m_ListCtrl.EnableWindow( FALSE ) ;
  414. m_UpButton.EnableWindow( FALSE ) ;
  415. return true ;
  416. }
  417. BOOL CFtpDirView::SetStateEnable()
  418. {
  419. //enable window
  420. m_Combo.EnableWindow( ) ;
  421. m_ListCtrl.EnableWindow( ) ;
  422. m_UpButton.EnableWindow( ) ;
  423. return true ;
  424. }
  425. void CFtpDirView::DownLoadFile(LPSTR szName , BOOL bDir , LPCTSTR LocalPath , int iSelItem )
  426. {
  427. FTPFILEINFO FtpFile ;
  428. ::ZeroMemory( &FtpFile , sizeof( FTPFILEINFO ) ) ;
  429. //get document .
  430. CQuickFTPDoc* pDoc = GetDocument();
  431. ASSERT_VALID(pDoc);
  432. memcpy( &FtpFile.site , &m_pFtp->m_SiteInfo , sizeof( SITEINFO ) ) ;
  433. strcpy( FtpFile.remotefilename , szName ) ;
  434. strcpy( FtpFile.remotepath , m_pFtp->m_CurrentFtpDirectory ) ;
  435. strcpy( FtpFile.localfilename , szName ) ;
  436. if( LocalPath == NULL )
  437. strcpy( FtpFile.localpath , pDoc->m_szLocalPath ) ;
  438. else
  439. strcpy( FtpFile.localpath , LocalPath ) ;
  440. FtpFile.bfileput = false ;
  441. FtpFile.endpos = 0 ;
  442. FtpFile.startpos = 0 ;
  443. FtpFile.bIsDirectory = bDir ;
  444. char szText[MAX_PATH] ;
  445. m_ListCtrl.GetItemText( iSelItem , 1 , szText , MAX_PATH ) ;
  446. __int64 iFileSize = _atoi64( szText ) ;
  447. FtpFile.filesize = iFileSize ;
  448. m_ListCtrl.GetItemText( iSelItem , 3 , szText , MAX_PATH ) ;
  449. strcpy( FtpFile.filetime , szText ) ;
  450. m_pFtp->PutGetFileToServer( &FtpFile ) ;
  451. //cancel by table 2001 4 2
  452. pDoc->m_pFileQueue = &m_pFtp->m_FileQueue ;
  453. pDoc->UpdateAllViews( this ) ;
  454. }
  455. void CFtpDirView::AbordAction()
  456. {
  457. m_pFtp->StopNowCommand( ) ;
  458. }
  459. void CFtpDirView::RefreshCurrentDirectory()
  460. {
  461. m_pFtp->ListCurrentDirectory( ) ;
  462. }
  463. // this function is called in response to an LVN_BEGINDRAG
  464. void CFtpDirView::OnBeginDrag (NMHDR* pnmhdr, LRESULT* pResult)
  465. {
  466. // save the index of the item being dragged in m_nDragIndex
  467. m_nDragIndex = ((NM_LISTVIEW *)pnmhdr)->iItem;
  468. POINT pt;
  469. pt.x = 8;
  470. pt.y = 8;
  471. // Added 2001 3 38
  472. if(m_pDragImage)
  473. delete m_pDragImage;
  474. // create a drag image
  475. m_pDragImage = m_ListCtrl.CreateDragImage (m_nDragIndex, &pt);
  476. ASSERT (m_pDragImage);
  477. // changes the cursor to the drag image (DragMove() is still required in 
  478. // OnMouseMove())
  479. VERIFY (m_pDragImage->BeginDrag (0, CPoint (8, 8)));
  480. VERIFY (m_pDragImage->DragEnter (GetDesktopWindow (), ((NM_LISTVIEW *)pnmhdr)->ptAction));
  481. // set dragging flag
  482. m_bDragging = TRUE;
  483. m_hDropItem = NULL;
  484. m_nDropIndex = -1;
  485. m_pDropWnd = &m_ListCtrl ;
  486. // capture all mouse messages
  487. SetCapture ();
  488. }
  489. void CFtpDirView::OnMouseMove(UINT nFlags, CPoint point) 
  490. {
  491. // TODO: Add your message handler code here and/or call default
  492. if (m_bDragging)
  493. {
  494. CPoint pt (point);
  495. ClientToScreen (&pt);
  496. // move the drag image
  497. VERIFY (m_pDragImage->DragMove (pt));
  498. // unlock window updates
  499. VERIFY (m_pDragImage->DragShowNolock (FALSE));
  500. // get the CWnd pointer of the window that is under the mouse cursor
  501. CWnd* pDropWnd = WindowFromPoint (pt);
  502. ASSERT (pDropWnd);
  503. // if we drag outside current window
  504. if (pDropWnd != m_pDropWnd)
  505. {
  506. // turn off hilight for drop target in list control
  507. if (m_nDropIndex != -1)
  508. {
  509. CListCtrl* pList = (CListCtrl*)m_pDropWnd;
  510. VERIFY (pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED));
  511. // redraw item
  512. VERIFY (pList->RedrawItems (m_nDropIndex, m_nDropIndex));
  513. pList->UpdateWindow ();
  514. m_nDropIndex = -1;
  515. }
  516. }
  517. // save current window pointer
  518. m_pDropWnd = pDropWnd;
  519. // convert from screen coordinates to drop target client coordinates
  520. pDropWnd->ScreenToClient (&pt);
  521. if( pDropWnd == &m_ListCtrl )
  522. {
  523. DestroyCursor( ::SetCursor( LoadCursor( NULL , IDC_NO ) ) ) ;
  524. CView::OnMouseMove(nFlags, point);
  525. return ;
  526. }
  527. if (pDropWnd->IsKindOf (RUNTIME_CLASS (CListCtrl)))
  528. {
  529. UINT uFlags;
  530. CListCtrl* pList = (CListCtrl*)pDropWnd;
  531. // turn off hilight for previous drop target
  532. pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
  533. // redraw previous item
  534. pList->RedrawItems (m_nDropIndex, m_nDropIndex);
  535. // get the item that is below cursor
  536. m_nDropIndex = ((CListCtrl*)pDropWnd)->HitTest (pt, &uFlags);
  537. if( m_nDropIndex != -1 )
  538. {
  539. // highlight it
  540. pList->SetItemState (m_nDropIndex, LVIS_DROPHILITED, LVIS_DROPHILITED);
  541. // redraw item
  542. pList->RedrawItems (m_nDropIndex, m_nDropIndex);
  543. pList->UpdateWindow ();
  544. }
  545. DestroyCursor( ::SetCursor( LoadCursor( NULL , IDC_ARROW ) ) ) ;
  546. }
  547. else
  548. {
  549. if( pDropWnd->IsKindOf( RUNTIME_CLASS( CDialog ) ) )
  550. {
  551. if( ( (CDialog* )pDropWnd )->m_hWnd == m_ListInfo.hGenius )
  552. {
  553. DestroyCursor( ::SetCursor( LoadCursor( NULL , IDC_ARROW ) ) ) ;
  554. }
  555. else
  556. {
  557. DestroyCursor( ::SetCursor( LoadCursor( NULL , IDC_NO ) ) ) ;
  558. }
  559. }
  560. else
  561. {
  562. DestroyCursor( ::SetCursor( LoadCursor( NULL , IDC_NO ) ) ) ;
  563. }
  564. }
  565. // lock window updates
  566. VERIFY (m_pDragImage->DragShowNolock (TRUE));
  567. }
  568. CView::OnMouseMove(nFlags, point);
  569. }
  570. void CFtpDirView::OnLButtonUp(UINT nFlags, CPoint point) 
  571. {
  572. // TODO: Add your message handler code here and/or call default
  573. if (m_bDragging)
  574. {
  575. // release mouse capture
  576. VERIFY (::ReleaseCapture ());
  577. m_bDragging = FALSE;
  578. // end dragging
  579. VERIFY (m_pDragImage->DragLeave (GetDesktopWindow ()));
  580. m_pDragImage->EndDrag ();
  581. CPoint pt (point);
  582. ClientToScreen (&pt);
  583. // get the CWnd pointer of the window that is under the mouse cursor
  584. CWnd* pDropWnd = WindowFromPoint (pt);
  585. ASSERT (pDropWnd);
  586. if (pDropWnd->IsKindOf (RUNTIME_CLASS ( CListCtrl )))
  587. {
  588. CListCtrl* pListWnd = ( CListCtrl*)pDropWnd ;
  589. pListWnd->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
  590. pListWnd->RedrawItems (m_nDropIndex, m_nDropIndex);
  591. if( pDropWnd->m_hWnd  == m_ListInfo.hCurJobList || 
  592. pDropWnd->m_hWnd == m_ListInfo.hLocalList )
  593. {
  594. DropItemOnList( (CListCtrl*)pDropWnd );
  595. }
  596. if( pDropWnd->m_hWnd == m_ListInfo.hBkJobList )
  597. {
  598. AddSelectToBkTransmitQueue( ) ;
  599. }
  600. }
  601. if( pDropWnd->IsKindOf( RUNTIME_CLASS( CDialog ) ) )
  602. {
  603. if( pDropWnd->m_hWnd == m_ListInfo.hGenius )
  604. {
  605. ::PostMessage( m_ListInfo.hGenius , GENIUS_WND_SPLIT_MSG , 0 , 0 ) ;
  606. AddSelectToBkTransmitQueue( ) ;
  607. }
  608. }
  609. }
  610. CView::OnLButtonUp(nFlags, point);
  611. }
  612. BOOL CFtpDirView::DropItemOnList(CListCtrl* pDropWnd)
  613. {
  614. // unhilite the drop target
  615. pDropWnd->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
  616. char szLabel[MAX_PATH];
  617. LV_ITEM lvi;
  618. ZeroMemory (&lvi, sizeof (LV_ITEM));
  619. lvi.iItem = m_nDropIndex;
  620. lvi.mask = LVIF_TEXT;
  621. lvi.pszText = szLabel;
  622. lvi.cchTextMax = MAX_PATH ;
  623. // get item that was dragged
  624. if( !pDropWnd->GetItem( &lvi ) )
  625. {
  626. return DownLoadSelectItem ( NULL ) ;
  627. }
  628. char szPath[MAX_PATH] ;
  629. CQuickFTPDoc* pDoc = GetDocument( ) ;
  630. strcpy( szPath , pDoc->m_szLocalPath ) ;
  631. int iLength = strlen( szPath ) ;
  632. if( szPath[iLength-1] != '\' )
  633. {
  634. szPath[iLength] = '\' ;
  635. szPath[iLength+1] = '' ;
  636. }
  637. strcat( szPath , lvi.pszText ) ;
  638. if( PathIsDirectory( szPath ) )
  639. {
  640. DownLoadSelectItem( szPath ) ;
  641. }
  642. else
  643. {
  644. DownLoadSelectItem( NULL ) ;
  645. }
  646. return true ;
  647. }
  648. BOOL CFtpDirView::DownLoadSelectItem( LPCTSTR LocalPath )
  649. {
  650. UINT i, uSelectedCount = m_ListCtrl.GetSelectedCount();
  651. int  nItem = -1;
  652. if( !m_pFtp->IsConnect() )
  653. return false ;
  654. // download all of the selected items.
  655. if (uSelectedCount > 0)
  656. {
  657. for (i=0;i < uSelectedCount;i++)
  658. {
  659. nItem = m_ListCtrl.GetNextItem(nItem, LVNI_SELECTED);
  660. ASSERT(nItem != -1);
  661. LVITEM lci ;
  662. LVITEM lci2 ;
  663. char szText[MAX_PATH] ;
  664. char szText2[MAX_PATH] ;
  665. szText[0] = 0 ;
  666. lci2.mask = LVIF_INDENT | LVIF_TEXT;
  667. lci2.pszText = szText2 ;
  668. lci2.cchTextMax = MAX_PATH ;
  669. lci2.iItem = nItem ;
  670. lci2.iSubItem = 2 ;
  671. m_ListCtrl.GetItem( &lci2 ) ;
  672. lci.mask = LVIF_INDENT | LVIF_TEXT;
  673. lci.pszText = szText ;
  674. lci.cchTextMax = MAX_PATH ;
  675. lci.iItem = nItem ;
  676. lci.iSubItem = 0 ;
  677. m_ListCtrl.GetItem( &lci ) ;
  678. if( strcmp( lci2.pszText , "" ) == 0 )
  679. {
  680. DownLoadFile( lci.pszText , 0 , LocalPath , nItem ) ;
  681. }
  682. else
  683. {
  684. DownLoadFile( lci.pszText , 1 , LocalPath , nItem ) ;
  685. }
  686. }
  687. }
  688. return true ;
  689. }
  690. void CFtpDirView::DeleteSelectItem()
  691. {
  692. UINT i, uSelectedCount = m_ListCtrl.GetSelectedCount();
  693. int  nItem = -1;
  694. if( !m_pFtp->IsConnect() )
  695. return ;
  696. // download all of the selected items.
  697. if (uSelectedCount > 0)
  698. {
  699. for (i=0;i < uSelectedCount;i++)
  700. {
  701. nItem = m_ListCtrl.GetNextItem(nItem, LVNI_SELECTED);
  702. ASSERT(nItem != -1);
  703. LVITEM lci ;
  704. LVITEM lci2 ;
  705. char szText[MAX_PATH] ;
  706. char szText2[MAX_PATH] ;
  707. szText[0] = 0 ;
  708. lci2.mask = LVIF_INDENT | LVIF_TEXT;
  709. lci2.pszText = szText2 ;
  710. lci2.cchTextMax = MAX_PATH ;
  711. lci2.iItem = nItem ;
  712. lci2.iSubItem = 2 ;
  713. m_ListCtrl.GetItem( &lci2 ) ;
  714. lci.mask = LVIF_INDENT | LVIF_TEXT;
  715. lci.pszText = szText ;
  716. lci.cchTextMax = MAX_PATH ;
  717. lci.iItem = nItem ;
  718. lci.iSubItem = 0 ;
  719. m_ListCtrl.GetItem( &lci ) ;
  720. if( strcmp( lci2.pszText , "" ) == 0 )
  721. {
  722. DelectItem( lci.pszText , 0 ) ;
  723. }
  724. else
  725. {
  726. DelectItem( lci.pszText , 1 ) ;
  727. }
  728. }
  729. }
  730. return ;
  731. }
  732. void CFtpDirView::DelectItem(LPSTR szName, BOOL bDir)
  733. {
  734. FTPFILEINFO FtpFile ;
  735. ::ZeroMemory( &FtpFile , sizeof( FTPFILEINFO ) ) ;
  736. //get document .
  737. CQuickFTPDoc* pDoc = GetDocument();
  738. ASSERT_VALID(pDoc);
  739. memcpy( &FtpFile.site , &m_pFtp->m_SiteInfo , sizeof( SITEINFO ) ) ;
  740. strcpy( FtpFile.remotefilename , szName ) ;
  741. strcpy( FtpFile.remotepath , m_pFtp->m_CurrentFtpDirectory ) ;
  742. strcpy( FtpFile.localfilename , szName ) ;
  743. strcpy( FtpFile.localpath , pDoc->m_szLocalPath ) ;
  744. FtpFile.bfileput = false ;
  745. FtpFile.endpos = 0 ;
  746. FtpFile.startpos = 0 ;
  747. FtpFile.bIsDirectory = bDir ;
  748. m_pFtp->DeleteFile( &FtpFile ) ;
  749. //cancel by table 2001 4 2
  750. //pDoc->m_pFileQueue = m_pFtp->m_pFileTransmitQueue ;
  751. }
  752. BOOL CFtpDirView::PreTranslateMessage(MSG* pMsg) 
  753. {
  754. // TODO: Add your specialized code here and/or call the base class
  755. /*
  756. switch( pMsg->message )
  757. {
  758. case WM_KEYDOWN :
  759. {
  760. switch( pMsg->wParam )
  761. {
  762. case VK_DELETE :
  763. TRACE( "press delete!" ) ;
  764. break ;
  765. case VK_RETURN :
  766. TRACE( "Press return !" ) ;
  767. break ;
  768. default :
  769. break ;
  770. }
  771. }
  772. break ;
  773. default :
  774. break ;
  775. }
  776. */
  777. return CView::PreTranslateMessage(pMsg);
  778. }
  779. void CFtpDirView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  780. {
  781. // TODO: Add your message handler code here and/or call default
  782. switch( nChar )
  783. {
  784. case VK_F2 :
  785. break ;
  786. default :
  787. break ;
  788. }
  789. CView::OnKeyDown(nChar, nRepCnt, nFlags);
  790. }
  791. void CFtpDirView::RenameSelectItem()
  792. {
  793. UINT uSelectedCount ;
  794. int  nItem = -1;
  795. char szPath[MAX_PATH] ;
  796. CFileManageLib fileman ;
  797. uSelectedCount = m_ListCtrl.GetSelectedCount( ) ;
  798. if( uSelectedCount != 1 )
  799. return ;
  800. strcpy( szPath , m_pFtp->m_CurrentFtpDirectory ) ;
  801. int iLength = strlen( szPath );
  802. if( szPath[iLength-1] != '/' )
  803. {
  804. szPath[iLength] = '/';
  805. szPath[iLength+1] = '' ;
  806. }
  807. char szText[MAX_PATH] ;
  808. szText[0] = '';
  809. int iCurSel = m_ListCtrl.GetNextItem( nItem , LVNI_SELECTED ) ;
  810. m_ListCtrl.GetItemText( iCurSel , 0 , szText , MAX_PATH ) ;
  811. CInputFileNameDlg dlg ;
  812. dlg.m_strName = szText ;
  813. if( dlg.DoModal() == IDOK )
  814. {
  815. char szDes[MAX_PATH] ;
  816. char szSrc[MAX_PATH] ;
  817. sprintf( szDes , "%s%s" , szPath , dlg.m_strName ) ;
  818. sprintf( szSrc , "%s%s" , szPath , szText ) ;
  819. m_pFtp->RenameFile( szSrc , szDes ) ;
  820. }
  821. RefreshCurrentDirectory( ) ;
  822. }
  823. BOOL CFtpDirView::EditSelectItem()
  824. {
  825. UINT uSelectedCount = m_ListCtrl.GetSelectedCount( ) ;
  826. if( uSelectedCount != 1 )
  827. return false ;
  828. return true ;
  829. }
  830. BOOL CFtpDirView::AddSelectToBkTransmitQueue( )
  831. {
  832. UINT i, uSelectedCount = m_ListCtrl.GetSelectedCount();
  833. int  nItem = -1;
  834. if( !m_pFtp->IsConnect() )
  835. return false ;
  836. // download all of the selected items.
  837. if (uSelectedCount > 0)
  838. {
  839. for (i=0;i < uSelectedCount;i++)
  840. {
  841. nItem = m_ListCtrl.GetNextItem(nItem, LVNI_SELECTED);
  842. ASSERT(nItem != -1);
  843. LVITEM lci ;
  844. LVITEM lci2 ;
  845. char szText[MAX_PATH] ;
  846. char szText2[MAX_PATH] ;
  847. szText[0] = 0 ;
  848. lci2.mask = LVIF_INDENT | LVIF_TEXT;
  849. lci2.pszText = szText2 ;
  850. lci2.cchTextMax = MAX_PATH ;
  851. lci2.iItem = nItem ;
  852. lci2.iSubItem = 2 ;
  853. m_ListCtrl.GetItem( &lci2 ) ;
  854. lci.mask = LVIF_INDENT | LVIF_TEXT;
  855. lci.pszText = szText ;
  856. lci.cchTextMax = MAX_PATH ;
  857. lci.iItem = nItem ;
  858. lci.iSubItem = 0 ;
  859. m_ListCtrl.GetItem( &lci ) ;
  860. if( strcmp( lci2.pszText , "" ) == 0 )
  861. {
  862. AddItemToBkQueue( lci.pszText , 0 , nItem ) ;
  863. }
  864. else
  865. {
  866. AddItemToBkQueue( lci.pszText , 1 , nItem ) ;
  867. }
  868. }
  869. }
  870. return true ;
  871. }
  872. BOOL CFtpDirView::AddItemToBkQueue(LPSTR szName , BOOL bDir , int iSelItem )
  873. {
  874. FTPFILEINFO FtpFile ;
  875. ::ZeroMemory( &FtpFile , sizeof( FTPFILEINFO ) ) ;
  876. //get document .
  877. CQuickFTPDoc* pDoc = GetDocument();
  878. ASSERT_VALID(pDoc);
  879. memcpy( &FtpFile.site , &m_pFtp->m_SiteInfo , sizeof( SITEINFO ) ) ;
  880. strcpy( FtpFile.remotefilename , szName ) ;
  881. strcpy( FtpFile.remotepath , m_pFtp->m_CurrentFtpDirectory ) ;
  882. strcpy( FtpFile.localfilename , szName ) ;
  883. strcpy( FtpFile.localpath , pDoc->m_szLocalPath ) ;
  884. FtpFile.bfileput = false ;
  885. FtpFile.endpos = 0 ;
  886. FtpFile.startpos = 0 ;
  887. FtpFile.bIsDirectory = bDir ;
  888. char szText[MAX_PATH] ;
  889. m_ListCtrl.GetItemText( iSelItem , 1 , szText , MAX_PATH ) ;
  890. __int64 iFileSize = _atoi64( szText ) ;
  891. FtpFile.filesize = iFileSize ;
  892. m_ListCtrl.GetItemText( iSelItem , 3 , szText , MAX_PATH ) ;
  893. strcpy( FtpFile.filetime , szText ) ;
  894. return m_pBkTransmitDlg->AddToBkQueue( &FtpFile ) ;
  895. }
  896. int CFtpDirView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  897. {
  898. if (CView::OnCreate(lpCreateStruct) == -1)
  899. return -1;
  900. // TODO: Add your specialized creation code here
  901. RECT rect ;
  902. GetClientRect( &rect ) ;
  903. rect.right -= 26 ;
  904. rect.bottom  = 150  ;
  905. m_Combo.Create( WS_CHILD | WS_VISIBLE |WS_VSCROLL | WS_TABSTOP | CBS_DROPDOWNLIST
  906. , rect , this , IDC_HISTROYCOMBO ) ;
  907. GetClientRect( &rect ) ;
  908. rect.left = rect.right -26  ;
  909. rect.bottom = rect.top + 20 ;
  910. m_UpButton.Create( NULL , WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW , 
  911. rect , this ,  IDC_FTPDIRUPBTN  ) ;
  912. m_UpButton.LoadBitmaps( IDB_BITMAP_UP , IDB_BITMAP_DOWN , IDB_BITMAP_FOCUS , IDB_BITMAP_DISABLE ) ;
  913. // m_UpButton.AutoLoad( IDC_FTPDIRUPBTN , this ) ;
  914. m_UpButton.SizeToContent( ) ;
  915. GetClientRect( &rect ) ;
  916. rect.top += 25 ;
  917. //rect.bottom -= 30 ;
  918. m_ListCtrl.Create( WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS , 
  919. rect , this , IDC_FTPDIRLIST ) ;
  920. m_ListCtrl.m_hParentWnd = m_hWnd ;
  921. return 0;
  922. }
  923. void CFtpDirView::OnRemoteAbord() 
  924. {
  925. // TODO: Add your command handler code here
  926. }
  927. void CFtpDirView::OnRemoteDelete() 
  928. {
  929. // TODO: Add your command handler code here
  930. DeleteSelectItem( ) ;
  931. }
  932. void CFtpDirView::OnRemoteDownload() 
  933. {
  934. // TODO: Add your command handler code here
  935. DownLoadSelectItem( NULL ) ;
  936. }
  937. void CFtpDirView::OnRemoteEdit() 
  938. {
  939. // TODO: Add your command handler code here
  940. EditSelectItem( ) ;
  941. }
  942. void CFtpDirView::OnRemoteMkdir() 
  943. {
  944. // TODO: Add your command handler code here
  945. if( !m_pFtp->IsConnect( ) )
  946. return ;
  947. CInputFileNameDlg dlg ;
  948. dlg.m_strName = "新建目录" ;
  949. if( dlg.DoModal( ) == IDOK )
  950. {
  951. m_pFtp->CreateDirectory( dlg.m_strName ) ;
  952. }
  953. }
  954. void CFtpDirView::OnRemoteRefresh() 
  955. {
  956. // TODO: Add your command handler code here
  957. RefreshCurrentDirectory( ) ;
  958. }
  959. void CFtpDirView::OnSelectAll() 
  960. {
  961. // TODO: Add your command handler code here
  962. m_ListCtrl.SelectAllItem( ) ;
  963. }