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;
//}