www.pudn.com > DriveBrowser.zip > BrowsingListView.cpp


/************************************************************************** 
   THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF 
   ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
   PARTICULAR PURPOSE. 
   Author: Barretto VN  7/2001 
**************************************************************************/ 
 
 
// BrowsingListView.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "DriveBrowser.h" 
#include "BrowsingListView.h" 
 
#include "MainFrm.h" 
 
#include "SortClass.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
	#define ICI_ACCESSFILE    0 
	#define ICI_C_SOURCE      1 
	#define ICI_CDDRV         2 
	#define ICI_CLSDFLD       3 
	#define ICI_CURSORFILE    4 
	#define ICI_DRIVE         5 
	#define ICI_DRIVERSFILE   6 
	#define ICI_ERROR         7 
	#define ICI_EXCELFILE     8 
	#define ICI_EXCLAMATION   9 
	#define ICI_EXEFILE       10 
	#define ICI_FLOPPYDRV     11 
	#define ICI_FONTFILE      12 
	#define ICI_FOXPROFILE    13 
	#define ICI_GENERALFILE   14 
	#define ICI_HEADERFILE    15 
	#define ICI_HELPFILE      16 
	#define ICI_HTMLDOC       17 
	#define ICI_HTMLHELP      18 
	#define ICI_IMAGEFILE     19 
	#define ICI_INFO          20 
	#define ICI_JAVABEAN      21 
	#define ICI_JAVACLASSES   22 
	#define ICI_JAVASOURCE    23 
	#define ICI_MYCOMPUTER    24 
	#define ICI_OPENFLD       25 
	#define ICI_PDFFILE       26 
	#define ICI_QUESTION      27 
	#define ICI_REGISTRYFILE  28 
	#define ICI_SETUPFILE     29 
	#define ICI_SOUNDFILE     30 
	#define ICI_TEXTFILE      31 
	#define ICI_TRASHFILE     32 
	#define ICI_UNINSTALLFILE 33 
	#define ICI_VIDEOFILE     34 
	#define ICI_WINDOWSFILE   35 
	#define ICI_WORDDOC       36 
	#define ICI_ZIPFILE       37 
 
	#define ICI_CDUP          38 
	#define ICI_CDUP_GREY     39 
    #define ICI_SORT_ASC      40 
    #define ICI_SORT_DES      41 
 
 
CString gStrRegistrySection       = "LastPath"; 
 
    
///////////////////////////////////////////////////////////////////////////// 
// CBrowsingListView 
 
IMPLEMENT_DYNCREATE(CBrowsingListView, CListView) 
 
CBrowsingListView::CBrowsingListView() 
{ 
	m_cPath = ""; 
	m_cPreviousPath = m_cPath; 
} 
 
CBrowsingListView::~CBrowsingListView() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CBrowsingListView, CListView) 
	//{{AFX_MSG_MAP(CBrowsingListView) 
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk) 
	ON_WM_DESTROY() 
	ON_WM_SIZE() 
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick) 
	ON_WM_CREATE() 
	ON_COMMAND_RANGE(ID_VIEW_AS_LIST, ID_VIEW_AS_DETAILS, OnViewStyle) 
	ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_AS_LIST, ID_VIEW_AS_DETAILS, OnUpdateStyles) 
 
	ON_NOTIFY(HDN_ITEMCLICK, 0 , OnItemclick) 
 
//	ON_NOTIFY(HDN_ITEMCLICKA, 0, OnHeaderClicked)  
//	ON_NOTIFY(HDN_ITEMCLICKW, 0, OnHeaderClicked) 
  
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CBrowsingListView drawing 
 
void CBrowsingListView::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: add draw code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CBrowsingListView diagnostics 
 
#ifdef _DEBUG 
void CBrowsingListView::AssertValid() const 
{ 
	CListView::AssertValid(); 
} 
 
void CBrowsingListView::Dump(CDumpContext& dc) const 
{ 
	CListView::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CBrowsingListView message handlers 
 
BOOL CBrowsingListView::PreCreateWindow(CREATESTRUCT& cs)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	 
	cs.style |=  LVS_REPORT; // | LVS_SORTDESCENDING; 
	return CListView::PreCreateWindow(cs); 
} 
 
void CBrowsingListView::OnInitialUpdate()  
{ 
	CListView::OnInitialUpdate(); 
	 
	// TODO: Add your specialized code here and/or call the base class 
	SetupImages(); 
	AddColumns(); 
 
	char strValue[MAX_PATH]; 
    GetProfileString(AfxGetAppName(), gStrRegistrySection , "" , strValue, MAX_PATH); 
 
	if(strcmp(strValue,"") == 0) 
	{ 
		SetCurrentDirectory("C:\\"); 
		InitListView(); 
	} 
	else 
	{ 
		CString temp; 
		temp = strValue; 
		m_cPath = strValue; 
		int nFoundAt = temp.ReverseFind('\\'); 
		if(nFoundAt != -1) 
			m_cPreviousPath = temp.Left(nFoundAt); 
		SetCurrentDirectory(strValue); 
		UpdateListView(strValue); 
	} 
 
	giSortCol = 0; 
	gcSortDesc = TRUE; 
	CSortClass csc(&GetListCtrl() , 0 , "C");  
	csc.Sort(gcSortDesc); 
		 
 
} 
 
void CBrowsingListView::InitListView() 
{ 
 
	GetListCtrl().DeleteAllItems(); 
	UpdateFileDirectoryCount(0 , 0); 
     
	int nPos = 0; 
    UINT nCount = 0; 
    CString strDrive = "?:\\"; 
 
    DWORD dwDriveList = ::GetLogicalDrives (); 
 
	CString cTmp; 
	 
    while (dwDriveList) { 
        if (dwDriveList & 1) { 
			cTmp = strDrive; 
            strDrive.SetAt (0, 0x41 + nPos); 
            if (AddDrives(strDrive)) 
                nCount++; 
        } 
        dwDriveList >>= 1; 
        nPos++; 
    } 
//	SortColumn(0,"C"); 
    return; 
} 
 
BOOL CBrowsingListView::AddDrives(CString strDrive) 
{ 
 
    UINT nType = ::GetDriveType ((LPCTSTR) strDrive); 
    UINT nDrive = (UINT) strDrive[0] - 0x41; 
	int nItem; 
 
    switch (nType) { 
 
    case DRIVE_REMOVABLE: 
        nItem = GetListCtrl().InsertItem(0, strDrive,ICI_FLOPPYDRV); 
		GetListCtrl().SetItemText(0, 1 , "Floppy Drive"); 
        break; 
 
    case DRIVE_FIXED: 
		GetListCtrl().InsertItem(0, strDrive, ICI_DRIVE ); 
		GetListCtrl().SetItemText(0, 1 , "Hard Disk"); 
        break; 
 
    case DRIVE_REMOTE: 
        GetListCtrl().InsertItem(0, strDrive, ICI_DRIVE); 
		GetListCtrl().SetItemText(0, 1 , "Remote Drive"); 
        break; 
 
    case DRIVE_CDROM: 
        GetListCtrl().InsertItem(0, strDrive, ICI_CDDRV); 
		GetListCtrl().SetItemText(0, 1 , "CD-ROM Drive"); 
        break; 
 
    case DRIVE_RAMDISK: 
        GetListCtrl().InsertItem(0, strDrive, ICI_CDDRV); 
		GetListCtrl().SetItemText(0, 1 , "RAM Disk"); 
        break; 
 
    default: 
        return FALSE; 
    } 
 
	return true; 
 
} 
 
void CBrowsingListView::SetupImages() 
{ 
 
	SetupImages(&m_pImageList, 16); 
	SetupImages(&m_pImageListL, 32); 
	GetListCtrl().SetImageList(&m_pImageList, LVSIL_SMALL); 
	GetListCtrl().SetImageList(&m_pImageListL, LVSIL_NORMAL); 
 
} 
 
 
void CBrowsingListView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	CString bs; 
	bs.LoadString(ID_BACKSLASH); 
	 
	LV_ITEM lvi; 
	char buffer[MAX_PATH]; 
	lvi.pszText = buffer; 
	lvi.cchTextMax = sizeof(buffer); 
	if(!GetSelectedItem(&lvi, 0)) 
		return; 
 
 
	if(lvi.iImage == ICI_CLSDFLD ||  
	   lvi.iImage == ICI_FLOPPYDRV ||  
	   lvi.iImage == ICI_CDDRV ||  
	   lvi.iImage == ICI_DRIVE) 
	{ 
		if ((m_cPath.Right (1) != "\\") && (m_cPath != "")) 
	        m_cPath += "\\"; 
 
		m_cPath += lvi.pszText; 
		UpdatePath(m_cPath); 
		m_cPreviousPath = m_cPath.Left(m_cPath.ReverseFind('\\')+1); 
		UpdateListView(m_cPath); 
		m_cPath += "\\"; 
		m_cPath = m_cPath.Left(m_cPath.GetLength()-1); 
	} 
	else 
		ShellExecute(this->m_hWnd, "open", lvi.pszText, NULL, NULL, SW_SHOWNORMAL); 
 
	pResult = 0; 
} 
 
BOOL CBrowsingListView::GetSelectedItem(LV_ITEM *lvi, int iWhichItem) 
{ 
// Was something actually selected? 
    POSITION pos = GetListCtrl().GetFirstSelectedItemPosition(); 
	if(pos == NULL) 
		return FALSE; 
 
	int iItem = GetListCtrl().GetNextSelectedItem(pos); 
 
	memset(lvi,0,sizeof(lvi)); 
	lvi->mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; 
	lvi->iItem = iItem; 
	lvi->iSubItem = iWhichItem; 
	return(GetListCtrl().GetItem(lvi)); 
} 
 
void CBrowsingListView::AddToListView(WIN32_FIND_DATA* fd , int iImage, CString cAttrib) 
{ 
 
	LV_ITEM	lvitem; 
	char sNumBuff[100]; 
	int iActualItem; 
	CString sText; 
  
	char filename[MAX_PATH]; 
	lstrcpy(filename , fd->cFileName); 
	char attrib[MAX_PATH]; 
	lstrcpy(attrib , cAttrib); 
 
	lvitem.mask = LVIF_TEXT | LVIF_IMAGE; 
	lvitem.iItem = 0; 
	lvitem.iSubItem = 0; 
	lvitem.pszText =  filename; //  fd.cFileName; 
	lvitem.iImage = iImage; // GetListViewIcon(fd->cFileName); //SetFileIcon(fd->GetFileName()); 
	iActualItem = GetListCtrl().InsertItem(&lvitem); 
 
	// Add Attribute column 
	lvitem.mask = LVIF_TEXT; 
	lvitem.iItem = iActualItem; 
	lvitem.iSubItem = 1; 
	lvitem.pszText = attrib;   
	GetListCtrl().SetItem(&lvitem); 
 
	// Add Size column 
	if(fd->nFileSizeLow != 0) 
		ltoa((long)fd->nFileSizeLow,sNumBuff,10); 
	else 
		strcpy(sNumBuff,""); 
 
	lvitem.mask = LVIF_TEXT; 
	lvitem.iItem = iActualItem; 
	lvitem.iSubItem = 2; 
	lvitem.pszText = sNumBuff; 
	GetListCtrl().SetItem(&lvitem); 
					 
	// Add Time column 
	CTime refTime; 
	refTime = fd->ftCreationTime; 
	sText = refTime.Format( "%b-%d-%Y" ); 
	lvitem.mask = LVIF_TEXT; 
	lvitem.iItem = iActualItem; 
	lvitem.iSubItem = 3; 
	lvitem.pszText = sText.GetBuffer(sText.GetLength()); 
	GetListCtrl().SetItem(&lvitem); 
			 
} 
 
void CBrowsingListView::UpdateListView(CString strPathName) 
{ 
 
	GetListCtrl().DeleteAllItems(); 
 
    HANDLE hFind; 
    WIN32_FIND_DATA fd; 
    BOOL bResult = FALSE; 
 
    CString strFileSpec = strPathName; 
    if (strFileSpec.Right (1) != "\\") 
        strFileSpec += "\\"; 
    strFileSpec += "*.*"; 
 
	SetCurrentDirectory(strFileSpec); 
 
	m_iFileCount = 0; 
	m_iDirectoryCount = 0; 
    if ((hFind = ::FindFirstFile ((LPCTSTR) strFileSpec, &fd)) != INVALID_HANDLE_VALUE) 
    { 
 
        do  
		{ 
            CString strFileName = (LPCTSTR) &fd.cFileName; 
            if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  
			{ 
                if ((strFileName != ".") && (strFileName != "..")) 
				{ 
					AddToListView(&fd , ICI_CLSDFLD, ""); 
					m_iDirectoryCount++; 
				} 
			} 
			else 
			{ 
				AddToListView(&fd , GetListViewIcon(strFileName), GetFileType(fd.cFileName)); 
				m_iFileCount++; 
			} 
		} while (::FindNextFile (hFind, &fd) && !bResult); 
 
       ::FindClose (hFind); 
	} 
 
//    GetListCtrl().InsertItem(0, "", ICI_CDUP); 
 
	UpdateFileDirectoryCount(m_iFileCount , m_iDirectoryCount); 
//	SortColumn(0,"C"); 
} 
 
CString CBrowsingListView::GetFileType(CString s) 
{ 
	CString cResult; 
	int nFoundAt = s.Find("." , 0); 
	s.MakeUpper(); 
	if(nFoundAt == 0) 
		return s + " File"; 
 
	CString ext = s.Mid(nFoundAt); 
	 
    if(ext == ".PDF")  return "PDF File"; 
	if(ext == ".CPP") return "VC Source"; 
	if(ext == ".H") return "Header File"; 
	if(ext == ".C") return "C Source"; 
	else if(s == "SETUP.EXE") return "SETUP File"; 
	else if(s == "ISUNINST.EXE") return "UNINSTALL File"; 
	else if(ext == ".TXT" || ext == ".LOG") return "TEXT File"; 
	else if(ext == ".ZIP" || ext == ".ARJ" || ext == ".TGZ" ||  
			ext == ".RAR" || ext == ".TAR" || ext == ".LZH" || 
			ext == ".LZA" || ext == ".CAB") 
			return "ZIP File"; 
	else if(ext == ".EXE" || ext == ".COM" || ext == ".BAT") 
			return "Application"; 
	else if(ext == ".AU"   || ext == ".WAV"  || ext == ".MP3") 
			return "SOUND File"; 
	else if(ext == ".HTM" || ext == ".HTML") return "HTML Document"; 
	else if(ext == ".DOC") 	return "WORD Document"; 
	else if(ext == ".MPG" || ext == ".MPEG" || ext == ".AVI") 
		return ICI_VIDEOFILE; 
	else if(ext == ".HLP") return "HELP File"; 
	else if(ext == ".BMP") return "Bitmap File"; 
	else if(ext == ".ICO") return "Icon File"; 
	else if(ext == ".DBF" || ext == ".DBT" || ext == ".MEM") 
		return "FOXPRO File"; 
	else if(ext == ".DLL" || ext == ".SYS" || ext == ".OCX"  || 
			ext == ".VXD" || ext == ".INI" || 
			ext == ".DRV") 
		return "DRIVERS File"; 
	else if(ext == ".JPG"  || ext == ".GIF"	|| ext == ".JPEG" ||  
		    ext == ".AIS"  || ext == ".EMF" || ext == ".IFF"  || 
			ext == ".KDC"  || ext == ".PCD" || ext == ".PCX"  || 
			ext == ".PIC"  || ext == ".PIX" || ext == ".PNG"  || 
			ext == ".PSD"  || ext == ".SGI" || ext == ".TIF"  || 
			ext == ".TIFF" || ext == ".WMF") 
		return "Picture File"; 
	else if(ext == ".TSK" || ext == ".CPX" || ext == ".ROM" || 
		    ext == ".CFG" || ext == ".STF" || ext == ".LST" || 
			ext == ".INF") 
		return "WINDOWS File"; 
	else if(ext == ".CUR" || ext == ".ANI") return "CURSOR File"; 
	else if(ext == ".FON")	return "FONT File"; 
	else if(ext == ".BAK") return "Backup File"; 
	else if(ext == ".JAVA")	return "JAVA Source"; 
	else if(ext == ".CLASS") return "JAVA Class"; 
	else if(ext == ".BEAN")	return "JAVA Bean"; 
	else if(ext == ".REG") return "REGISTRY File"; 
	else if(ext == ".MDB") return "ACCESS Database"; 
	else if(ext == ".XLS") return "EXCEL File"; 
	else if(ext == ".CHM") return "HTML Help"; 
	else 
	{ 
		ext = ext.Mid( (ext.Find('.',0) != -1 ? 1 : 0)); 
		return ext + " File"; 
 
	} 
 
	return cResult; 
} 
 
 
UINT CBrowsingListView::GetListViewIcon(CString s) 
{ 
	int nFoundAt = s.Find("." , 1); 
	s.MakeUpper(); 
	if(nFoundAt == 0) 
		return ICI_GENERALFILE; 
 
	CString ext = s.Mid(nFoundAt); 
 
	// Set some standard icon types 
    if(ext == ".PDF")  return ICI_PDFFILE; 
	else if(s == "SETUP.EXE") return ICI_SETUPFILE; 
	else if(s == "ISUNINST.EXE") return ICI_UNINSTALLFILE; 
	else if(ext == ".TXT" || ext == ".LOG") return ICI_TEXTFILE; 
	else if(ext == ".ZIP" || ext == ".ARJ" || ext == ".TGZ" ||  
			ext == ".RAR" || ext == ".TAR" || ext == ".LZH" || 
			ext == ".LZA" || ext == ".CAB") 
			return ICI_ZIPFILE; 
	else if(ext == ".EXE" || ext == ".COM" || ext == ".BAT") 
			return ICI_EXEFILE; 
	else if(ext == ".AU"   || ext == ".WAV"  || ext == ".MP3") 
			return ICI_SOUNDFILE; 
	else if(ext == ".HTM" || ext == ".HTML") return ICI_HTMLDOC; 
	else if(ext == ".DOC") 	return ICI_WORDDOC; 
	else if(ext == ".MPG" || ext == ".MPEG" || ext == ".AVI") 
		return ICI_VIDEOFILE; 
	else if(ext == ".HLP") return ICI_HELPFILE; 
	else if(ext == ".BMP") return ICI_IMAGEFILE; 
	else if(ext == ".ICO") return ICI_IMAGEFILE; 
	else if(ext == ".DBF" || ext == ".DBT" || ext == ".MEM") 
		return ICI_FOXPROFILE; 
	else if(ext == ".DLL" || ext == ".SYS" || ext == ".OCX"  || 
			ext == ".VXD" || ext == ".INI" || 
			ext == ".DRV") 
		return ICI_DRIVERSFILE; 
	else if(ext == ".JPG"  || ext == ".GIF"	|| ext == ".JPEG" ||  
		    ext == ".AIS"  || ext == ".EMF" || ext == ".IFF"  || 
			ext == ".KDC"  || ext == ".PCD" || ext == ".PCX"  || 
			ext == ".PIC"  || ext == ".PIX" || ext == ".PNG"  || 
			ext == ".PSD"  || ext == ".SGI" || ext == ".TIF"  || 
			ext == ".TIFF" || ext == ".WMF") 
		return ICI_IMAGEFILE; 
	else if(ext == ".TSK" || ext == ".CPX" || ext == ".ROM" || 
		    ext == ".CFG" || ext == ".STF" || ext == ".LST" || 
			ext == ".INF") 
		return ICI_WINDOWSFILE; 
	else if(ext == ".CUR" || ext == ".ANI") return ICI_CURSORFILE; 
	else if(ext == ".FON")	return ICI_FONTFILE; 
	else if(ext == ".BAK") return ICI_TRASHFILE; 
	else if(ext == ".JAVA")	return ICI_JAVASOURCE; 
	else if(ext == ".CLASS") return ICI_JAVACLASSES; 
	else if(ext == ".BEAN")	return ICI_JAVABEAN; 
	else if(ext == ".REG") return ICI_REGISTRYFILE; 
	else if(ext == ".MDB") return ICI_ACCESSFILE; 
	else if(ext == ".XLS") return ICI_EXCELFILE; 
	else if(ext == ".CHM") return ICI_HTMLHELP; 
	else 
		return ICI_GENERALFILE; 
 
} 
 
void CBrowsingListView::UpdatePath(CString cPath) 
{ 
 
	CMainFrame* cwnd = (CMainFrame*)AfxGetMainWnd(); 
	ASSERT(cwnd); 
	cwnd->m_cPath = cPath; 
} 
 
void CBrowsingListView::UpdateFileDirectoryCount(UINT iFiles, UINT iDirectories) 
{ 
	CMainFrame* cwnd = (CMainFrame*)AfxGetMainWnd(); 
	ASSERT(cwnd); 
	cwnd->m_iFileCount = iFiles; 
	cwnd->m_iDirectoryCount = iDirectories; 
} 
 
void CBrowsingListView::OnViewStyle(UINT nCommandID) 
{ 
 
	DWORD dwStyle = -1; 
 
	switch (nCommandID) 
	{ 
	case ID_VIEW_AS_DETAILS: 
		dwStyle = LVS_REPORT; 
		break; 
 
	case ID_VIEW_AS_SMALLICONS: 
		dwStyle = LVS_SMALLICON; 
		break; 
 
	case ID_VIEW_AS_LARGEICONS: 
		dwStyle = LVS_ICON; 
		break; 
 
	case ID_VIEW_AS_LIST: 
		dwStyle = LVS_LIST; 
		break; 
	} 
 
		// change the style; window will repaint automatically 
	if (dwStyle != -1) 
			GetListCtrl().ModifyStyle(LVS_TYPEMASK, dwStyle); 
 
} 
 
void CBrowsingListView::OnUpdateStyles(CCmdUI* pCmdUI) 
{ 
	pCmdUI->Enable(); 
	BOOL bChecked = FALSE; 
 
	DWORD dwStyle = GetListCtrl().GetStyle() & LVS_TYPEMASK; 
 
	switch (pCmdUI->m_nID) 
	{ 
	case ID_VIEW_AS_DETAILS: 
		bChecked = (dwStyle == LVS_REPORT); 
		break; 
 
	case ID_VIEW_AS_SMALLICONS: 
		bChecked = (dwStyle == LVS_SMALLICON); 
		break; 
 
	case ID_VIEW_AS_LARGEICONS: 
		bChecked = (dwStyle == LVS_ICON); 
		break; 
 
	case ID_VIEW_AS_LIST: 
		bChecked = (dwStyle == LVS_LIST); 
		break; 
 
	default: 
		bChecked = FALSE; 
		break; 
	} 
 
	pCmdUI->SetRadio(bChecked ? 1 : 0);	 
} 
 
void CBrowsingListView::OnDestroy()  
{ 
	CListView::OnDestroy(); 
	 
	// TODO: Add your message handler code here 
 
	char strToWrite[MAX_PATH] = ""; 
	lstrcpy(strToWrite  , m_cPath); 
	BOOL rw; 
	rw = WriteProfileString(AfxGetAppName(),gStrRegistrySection, strToWrite); 
 
	if(m_pImageList != NULL) 
		m_pImageList.DeleteImageList(); 
 
	if(m_pImageListL != NULL) 
		m_pImageListL.DeleteImageList(); 
 
 
} 
 
void CBrowsingListView::SetupImages(CImageList* mImageList, int iSize) 
{ 
 
	CWinApp* pApp = AfxGetApp(); 
 
	//	ASSERT(m_pImageList != NULL);    // serious allocation failure checking 
	mImageList->Create(iSize, iSize, ILC_COLOR8 | ILC_MASK,  9, 9); 
 
	mImageList->Add(pApp->LoadIcon(ICO_ACCESSFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_C_SOURCE)); 
	mImageList->Add(pApp->LoadIcon(ICO_CDDRV)); 
	mImageList->Add(pApp->LoadIcon(ICO_CLSDFLD)); 
	mImageList->Add(pApp->LoadIcon(ICO_CURSORFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_DRIVE)); 
	mImageList->Add(pApp->LoadIcon(ICO_DRIVERSFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_ERROR)); 
	mImageList->Add(pApp->LoadIcon(ICO_EXCELFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_EXCLAMATION)); 
	mImageList->Add(pApp->LoadIcon(ICO_EXEFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_FLOPPYDRV)); 
	mImageList->Add(pApp->LoadIcon(ICO_FONTFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_FOXPROFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_GENERALFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_HEADERFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_HELPFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_HTMLDOC)); 
	mImageList->Add(pApp->LoadIcon(ICO_HTMLHELP)); 
	mImageList->Add(pApp->LoadIcon(ICO_IMAGEFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_INFO)); 
	mImageList->Add(pApp->LoadIcon(ICO_JAVABEAN)); 
	mImageList->Add(pApp->LoadIcon(ICO_JAVACLASSES)); 
	mImageList->Add(pApp->LoadIcon(ICO_JAVASOURCE)); 
	mImageList->Add(pApp->LoadIcon(ICO_MYCOMPUTER)); 
	mImageList->Add(pApp->LoadIcon(ICO_OPENFLD)); 
	mImageList->Add(pApp->LoadIcon(ICO_PDFFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_QUESTION)); 
	mImageList->Add(pApp->LoadIcon(ICO_REGISTRYFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_SETUPFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_SOUNDFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_TEXTFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_TRASHFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_UNINSTALLFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_VIDEOFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_WINDOWSFILE)); 
	mImageList->Add(pApp->LoadIcon(ICO_WORDDOC)); 
	mImageList->Add(pApp->LoadIcon(ICO_ZIPFILE)); 
 
	mImageList->Add(pApp->LoadIcon(ICO_CDUP)); 
	mImageList->Add(pApp->LoadIcon(ICO_CDUP_GREY)); 
 
	mImageList->Add(pApp->LoadIcon(ICO_SORT_ASC)); 
	mImageList->Add(pApp->LoadIcon(ICO_SORT_DES)); 
 
	return ; 
} 
 
void CBrowsingListView::OnSize(UINT nType, int cx, int cy)  
{ 
	CListView::OnSize(nType, cx, cy); 
	 
	// TODO: Add your message handler code here 
 
	if(GetListCtrl().GetSafeHwnd()) 
	{ 
		GetListCtrl().SetColumnWidth(0, cx / 2); 
		GetListCtrl().SetColumnWidth(1, cx / 7); 
		GetListCtrl().SetColumnWidth(2, cx / 7); 
		GetListCtrl().SetColumnWidth(3, cx / 7); 
		int iWidth = GetListCtrl().GetColumnWidth(0) +  
					 GetListCtrl().GetColumnWidth(1) +  
					 GetListCtrl().GetColumnWidth(2) +  
					 GetListCtrl().GetColumnWidth(3); 
		GetListCtrl().SetColumnWidth(4, cx-iWidth); 
	} 
 
} 
 
void CBrowsingListView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_LISTVIEW* pNM = (NM_LISTVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
 
	CString dType; 
	if((pNM->iSubItem == 0) || (pNM->iSubItem == 1)) 
		dType = "C"; 
	if(pNM->iSubItem == 2) 
		dType = "N"; 
	if(pNM->iSubItem == 3) 
		dType = "D"; 
 
	if(pNM->iSubItem < 4) 
	{ 
		SortColumn(pNM , dType); 
		return; 
	} 
 
	if(pNM->iSubItem = 4) 
	{ 
 
		if(m_cPreviousPath.ReverseFind('\\') != -1) 
			m_cPreviousPath = m_cPreviousPath.Left(m_cPreviousPath.ReverseFind('\\')); 
			 
		if(m_cPreviousPath == "") 
			InitListView(); 
		else 
			UpdateListView(m_cPreviousPath); 
 
		m_cPath = m_cPreviousPath; 
		UpdatePath(m_cPath); 
		m_cPreviousPath = m_cPreviousPath.Left(m_cPreviousPath.ReverseFind('\\')); 
		if(m_cPreviousPath.ReverseFind('\\') == -1) 
			m_cPreviousPath += "\\"; 
 
		return; 
	} 
 
 
	*pResult = 0; 
} 
 
void CBrowsingListView::AddColumns() 
{ 
	CRect rect; 
	GetClientRect(&rect); 
 
	LVCOLUMN col; 
	col.mask = LVCF_IMAGE | LVCF_ORDER | LVCF_TEXT; 
	char text[15]; 
	lstrcpy(text , "Name"); 
	col.pszText = text; 
	col.iOrder = 0; 
	GetListCtrl().InsertColumn(0, &col); 
	GetListCtrl().InsertColumn(1, "Type", 0, LVCFMT_LEFT  , -1); 
	GetListCtrl().InsertColumn(2, "Size", 0, LVCFMT_RIGHT , -1); 
	GetListCtrl().InsertColumn(3, "Date", 0, LVCFMT_LEFT  , -1); 
	col.mask = LVCF_IMAGE | LVCF_ORDER; 
	col.iImage = ICI_CDUP_GREY; 
	col.iOrder = 4; 
	GetListCtrl().InsertColumn(4, &col); 
 
return; 
	 
	CHeaderCtrl* mHeader = GetListCtrl().GetHeaderCtrl(); 
 
	int index = 0;  
	HDITEM Item0;	 
	char pszText[80]; 
	lstrcpy(pszText , "Name"); 
	Item0.mask = HDI_ORDER | HDI_TEXT | HDI_FORMAT | HDI_WIDTH | HDI_IMAGE ; //LVCF_TEXT; //LVCF_IMAGE; 
	Item0.iImage = ICI_SORT_DES; 
	Item0.pszText = pszText; 
	Item0.cchTextMax = strlen(pszText); 
	Item0.fmt = HDF_LEFT | HDF_STRING;  
	Item0.cxy = 0; 
	Item0.iOrder = 0; 
    index = ::SendMessage(mHeader->m_hWnd, HDM_INSERTITEM,  
        (WPARAM) 0, (LPARAM) &Item0);  
 
	lstrcpy(pszText , "Type"); 
	Item0.mask = HDI_ORDER | HDI_TEXT | HDI_FORMAT | HDI_WIDTH | HDI_IMAGE ; //LVCF_TEXT; //LVCF_IMAGE; 
	Item0.pszText = pszText; 
	Item0.cchTextMax = strlen(pszText); 
	Item0.fmt = HDF_LEFT | HDF_STRING;  
	Item0.cchTextMax = strlen(pszText); 
	Item0.cxy = 100; 
	Item0.iOrder = 1; 
    index = ::SendMessage(mHeader->m_hWnd, HDM_INSERTITEM,  
        (WPARAM) index, (LPARAM) &Item0);  
  
	lstrcpy(pszText , "Size"); 
	Item0.mask = HDI_ORDER | HDI_TEXT | HDI_FORMAT | HDI_WIDTH | HDI_IMAGE ; //LVCF_TEXT; //LVCF_IMAGE; 
	Item0.pszText = pszText; 
	Item0.iOrder = 2; 
    index = ::SendMessage(mHeader->m_hWnd, HDM_INSERTITEM,  
        (WPARAM) index, (LPARAM) &Item0);  
 
	lstrcpy(pszText , "Date"); 
	Item0.mask = HDI_ORDER | HDI_TEXT | HDI_FORMAT | HDI_WIDTH | HDI_IMAGE ; //LVCF_TEXT; //LVCF_IMAGE; 
	Item0.pszText = pszText; 
	Item0.iOrder = 3; 
    index = ::SendMessage(mHeader->m_hWnd, HDM_INSERTITEM,  
        (WPARAM) index, (LPARAM) &Item0);  
 
//	Item4.mask = LVCF_FMT | LVCF_IMAGE ;  
	Item0.mask = HDI_ORDER | HDI_FORMAT | HDI_WIDTH | HDI_IMAGE ; //LVCF_TEXT; //LVCF_IMAGE; 
	lstrcpy(pszText , ""); 
	Item0.pszText = pszText; 
	Item0.fmt = LVCFMT_IMAGE; 
	Item0.iImage = ICI_CDUP_GREY; 
	Item0.iOrder = 4; 
    index = ::SendMessage(mHeader->m_hWnd, HDM_INSERTITEM,  
        (WPARAM) index, (LPARAM) &Item0);  
 
} 
 
void CBrowsingListView::SortColumn(NM_LISTVIEW* pNM,  CString cType) 
{ 
 
	if(pNM->iSubItem == giSortCol) 
	{ 
		if(gcSortDesc) 
			gcSortDesc = FALSE; 
		else 
			gcSortDesc = TRUE; 
	} 
	else 
		gcSortDesc = TRUE; 
 
	CSortClass csc(&GetListCtrl() , pNM->iSubItem , cType);  
	csc.Sort(gcSortDesc); 
 
	SetColumnImage(pNM , gcSortDesc); 
 
	giSortCol = pNM->iSubItem; 
} 
 
void CBrowsingListView::SetColumnImage(NM_LISTVIEW* pNM, BOOL gcSortDesc) 
{ 
 
//	LVCOLUMN item; 
//	GetListCtrl().GetColumn(nColumn , &item); 
//	RemoveAllColumnImages(); 
 
//	int i = pNM->hdr.code; 
 
//	pHDN->pitem->mask = pHDN->pitem->mask | LVIF_IMAGE; 
//	pHDN->pitem->iImage = ICI_SORT_ASC; //(gcSortDesc ? ICI_SORT_DES : ICI_SORT_ASC ); 
//	GetListCtrl().SetColumn(pHDN->iItem , &pHDN); 
 
} 
 
void CBrowsingListView::RemoveAllColumnImages() 
{ 
	for(int i = 0 ; i <= 3;i++) 
	{ 
		RemoveColumnImage(i); 
	} 
} 
 
void CBrowsingListView::RemoveColumnImage(int nColumn) 
{ 
	LVCOLUMN item;	 
	GetListCtrl().GetColumn(nColumn , &item); 
	item.mask = ~LVCF_IMAGE; 
	item.mask  = ~LVCF_FMT; 
	GetListCtrl().SetColumn(nColumn, &item); 
 
} 
 
int CBrowsingListView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CListView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	// TODO: Add your specialized creation code here 
	return 0; 
} 
 
void CBrowsingListView::OnItemclick(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	HD_NOTIFY* phdn = (HD_NOTIFY*) pNMHDR; 
	// TODO: Add your control notification handler code here 
	 
	*pResult = 0; 
} 
 
 
//void CBrowsingListView::OnHeaderClicked(NMHDR* pNMHDR, LRESULT* pResult)  
//{ 
//        HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; 
 
//		*pResult = 0; 
 
//}