www.gusucode.com > 极速FTP客户端程序(VC++版)-源码程序 > 极速FTP客户端程序(VC++版)-源码程序\code\FtpDirList.cpp

    //Download by http://www.NewXing.com
// FtpDirList.cpp : implementation file
//
/*********************************************
**该文件是属于WolfFTP工程中的。如果有什么问题
**请联系
**         tablejiang@21cn.com
**或者访问
**         http://wolfftp.51.net
**以得到最新的支持。
*********************************************/
#include "stdafx.h"
#include "QuickFTP.h"
#include "FtpDirList.h"
#include "SortStringArray.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFtpDirList

CFtpDirList::CFtpDirList()
{
	m_nItem = 0 ;
}

CFtpDirList::~CFtpDirList()
{
	m_ImageList.Detach( ) ;
	m_ImageList.m_hImageList = NULL ;
}


BEGIN_MESSAGE_MAP(CFtpDirList, CListCtrl)
	//{{AFX_MSG_MAP(CFtpDirList)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	ON_WM_KEYDOWN()
	ON_WM_DESTROY()
	ON_WM_RBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFtpDirList message handlers

/***************************************************
**	@Description:
**		Get system default image list handle .
**
**	@Note:
**
**	@Return: success true , else false .
**	@Author:	JHM
**	@e-mail:	tablejiang@21cn.com
**	@Date:		2001 3 26
****************************************************/
BOOL CFtpDirList::GetSysImgList()
{
	SHFILEINFO shFinfo;
	HIMAGELIST hImgList = NULL;

	hImgList = (HIMAGELIST)SHGetFileInfo( "C:\\",
							  0,
							  &shFinfo,
							  sizeof( shFinfo ),
							  SHGFI_SYSICONINDEX | 
							  SHGFI_SMALLICON );
	if ( !hImgList )
	{
		return FALSE;
	}

	m_ImageList.m_hImageList = hImgList ;
	
	SetImageList( &m_ImageList , LVSIL_SMALL ) ;
	
	//get directory icon index ;
	char szPath[MAX_PATH] ;
	if( GetSystemDirectory( szPath , MAX_PATH )  == 0 )
	{
		m_DirIconIndex = 5 ;
		return true ;
	}

	SHFILEINFO	shFileInfo ;

	CString strTemp = szPath ;
	
	//add '\'
	if ( strTemp.Right(1) != '\\' )
		 strTemp += "\\";
	//get the system icon index .
	if ( !SHGetFileInfo( strTemp,
						0,
						&shFileInfo,
						sizeof( shFileInfo ),
						SHGFI_ICON | SHGFI_SMALLICON | 
						SHGFI_TYPENAME |SHGFI_DISPLAYNAME ) )
	{
		return false ;
	}

	m_DirIconIndex = shFileInfo.iIcon;

	// we only need the index from the system image list
	DestroyIcon( shFileInfo.hIcon );

	return TRUE;   // OK
}

int CFtpDirList::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CListCtrl::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	
	InitList( ) ;

	GetSysImgList( ) ;

	return 0;
}
/***********************************************************
**	@Description:
**		Init the list column .
**
**	@Note:
**
**	@Return: 
**	@Author:	JHM
**	@e-mail:	tablejiang@21cn.com
**	@Date:		2001 3 26
*************************************************************/
BOOL CFtpDirList::InitList()
{
	RECT rect ;
	GetClientRect( &rect ) ;
	int iLength = ( rect.right - rect.left ) / 6 ;
	
	//insert Column
	InsertColumn( 0 , "名称" , LVCFMT_LEFT , iLength * 2 ) ;
	InsertColumn( 1 , "大小" , LVCFMT_RIGHT , iLength ) ;
	InsertColumn( 2 , "类型" , LVCFMT_LEFT, iLength ) ;
	InsertColumn( 3 , "时间" , LVCFMT_LEFT, iLength ) ;
	InsertColumn( 4 , "日期" , LVCFMT_LEFT, iLength ) ;
	InsertColumn( 5 , "属性" , LVCFMT_LEFT, iLength ) ;


//	AddItem( "abc" , "abc" , "abc" , "abc" , "abc"  ) ;
	
	return true ;
}
/***********************************************************
**	@Description:
**		
**	@Note:
**
**	@Return: 
**	@Author:	JHM
**	@e-mail:	tablejiang@21cn.com
**	@Date:		2001 3 26
*************************************************************/
BOOL CFtpDirList::AddItem(LPCTSTR szName, LPCTSTR szSize, LPCTSTR szDate, 
						  LPCTSTR szTime, LPCTSTR szAttrib , LPCTSTR szType )
{
	return true ;
}
/***********************************************************
**	@Description:
**		
**	@Note:
**
**	@Return: 
**	@Author:	JHM
**	@e-mail:	tablejiang@21cn.com
**	@Date:		2001 3 26
*************************************************************/
void CFtpDirList::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	::PostMessage( m_hParentWnd , FTP_LIST_DBCLICK_MSG , 0 , 0 );
	*pResult = 0;
}
/***********************************************************
**	@Description:
**		delete all list item . and reset the item count.
**
**	@Note:
**
**	@Return: 
**	@Author:	JHM
**	@e-mail:	tablejiang@21cn.com
**	@Date:		2001 3 26
*************************************************************/
BOOL CFtpDirList::DelAllItem()
{
	m_nItem = 0 ;
	return DeleteAllItems( ) ;
}
/***********************************************************
**	@Description:
**		Add a item to list ctrl .
**
**	@Note:
**		FTPITEM* pItem : item info.
**
**	@Return: true .
**	@Author:	JHM
**	@e-mail:	tablejiang@21cn.com
**	@Date:		2001 3 26
*************************************************************/
BOOL CFtpDirList::AddItem(FTPITEM *pItem)
{
	FTPITEM* pCur ;
	CSortStringArray	strDirArray ;
	CSortStringArray	strFileArray ;
	
	//empty the list.
	DeleteAllItems( ) ;
	//init the array .
	strDirArray.RemoveAll() ;
	strFileArray.RemoveAll( ) ;
	
	//beacuse want sort the item .
	pCur = pItem ;
	while( pCur->pNext != NULL )
	{
		if( pCur->dwType == 1 )
		{
			//if directory
			strDirArray.Add( pCur->szName ) ;
		}
		else
		{
			//if files .
			int index = 0 ;
			index = strFileArray.Add( pCur->szName ) ;
		}
		pCur = pCur->pNext ;
	}
	
	//sort the item .
	strDirArray.Sort( ) ;
	strFileArray.Sort( ) ;

	//insert directory .
	int i = 0 ;
	for( i = 0 ; i < strDirArray.GetSize( ) ; i ++ )
	{
		pCur = pItem  ;
		while( pCur->pNext != NULL )
		{
			if( strcmp( strDirArray.GetAt( i ) , pCur->szName ) == 0 )
			{
				InsertItem( LVIF_TEXT|LVIF_IMAGE , m_nItem , pCur->szName , 0 , 0 , m_DirIconIndex , 0 ) ;
				SetItemText( m_nItem , 1 , pCur->szSize ) ;
				SetItemText( m_nItem , 2 , "DIR" ) ;
				SetItemText( m_nItem , 3 , pCur->szTime ) ;
				SetItemText( m_nItem , 4 , pCur->szDate ) ;
				SetItemText( m_nItem , 5 , pCur->szAttrib ) ;
				m_nItem ++ ;
				break ;
			}
			pCur = pCur->pNext ;
		}
	}
	//insert file.
	for( i = 0 ; i < strFileArray.GetSize() ; i ++ )
	{
		pCur = pItem ;
		while( pCur->pNext != NULL )
		{
			if( strcmp( strFileArray.GetAt( i ) , pCur->szName ) == 0 )
			{
				int iIconIndex ;
				iIconIndex = GetIconIndex( pCur->szName ) ;
				InsertItem( LVIF_TEXT|LVIF_IMAGE , m_nItem , pCur->szName , 0 , 0 , iIconIndex , 0 ) ;
				SetItemText( m_nItem , 2 , "" ) ;
				SetItemText( m_nItem , 1 , pCur->szSize ) ;
				SetItemText( m_nItem , 3 , pCur->szTime ) ;
				SetItemText( m_nItem , 4 , pCur->szDate ) ;
				SetItemText( m_nItem , 5 , pCur->szAttrib ) ;
				m_nItem ++ ;
				break ;
			}
			pCur = pCur->pNext ;
		}
	}

	return true ;	

}
/***********************************************************
**	@Description:
**		Get the file default icon index , which in system 
**			default image list .
**
**	@Note:
**
**	@Return: 
**	@Author:	JHM
**	@e-mail:	tablejiang@21cn.com
**	@Date:		2001 3 26
*************************************************************/
int CFtpDirList::GetIconIndex(LPSTR szName)
{
	//only need the file extend name .
	char driver[MAX_PATH] , dir[MAX_PATH] , name[MAX_PATH] , ext[MAX_PATH] ;
	_splitpath( szName , driver , dir , name , ext ) ;

	SHFILEINFO sfi;

	ZeroMemory(&sfi,sizeof(sfi));

	SHGetFileInfo( ext ,
	   FILE_ATTRIBUTE_NORMAL,
	   &sfi,
	   sizeof(sfi),
	   SHGFI_USEFILEATTRIBUTES|SHGFI_ICON);

	DestroyIcon( sfi.hIcon ) ;

	return sfi.iIcon ;

}

void CFtpDirList::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	switch( nChar )
	{
	case VK_F5 :
	case VK_DELETE :
	case VK_F2 :
	case VK_BACK:
	case VK_RETURN :
		{
			::PostMessage( m_hParentWnd , FTP_LIST_KEY_EVENT_MSG , nChar , 0 ) ;
		}
		break ;
	default :
		break ;
	}
	CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CFtpDirList::OnDestroy() 
{
	//must deatch the system image list handle .
	//if not ,the system image will be destroy.
	SetImageList( NULL , LVSIL_SMALL ) ;
	m_ImageList.Detach(  ) ;

	CListCtrl::OnDestroy();
	
	// TODO: Add your message handler code here
}

void CFtpDirList::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	::PostMessage( m_hParentWnd , FTP_LIST_RCLK_MSG , 0 , 0 ) ;	
	CListCtrl::OnRButtonDown(nFlags, point);
}

BOOL CFtpDirList::SelectAllItem()
{
	int iCount = GetItemCount( ) ;
	if( iCount == 0  )
		return true ;

	for( int i = 0 ; i < iCount ; i ++ )
	{
		SetItemState( i , LVIS_SELECTED  , LVIS_SELECTED  ) ;
	}
	return true ;
}