www.pudn.com > DiskInfo.tgz > detailview.cpp


// DetailView.cpp : implementation of the CDetailView class 
// 
 
#include "stdafx.h" 
#include "DiskInfo.h" 
#include "DetailView.h" 
#include "Common/dirdialog.h" 
#include "Common/DrawEx.h" 
#include "Common/Useful.h" 
#include "Common/makehtml.h" 
 
#include "PreviewEx.h" 
 
#include "MainFrm.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#include "Common\MemDC.h" 
 
const int nHeaderWidth = 22; 
const int nMargin = 5; 
 
#ifndef MAX_COLOR  
#define MAX_COLOR 15 
const static COLORREF backColors[MAX_COLOR] =  
{ 
	RGB(0,0,255), 
	RGB(255,0,255), 
	RGB(0,128,0), 
	RGB(255,0,0), 
	RGB(128,128,128), 
	RGB(0,255,255), 
	RGB(0,0,128), 
	RGB(255,255,255), 
	RGB(128,0,128), 
	RGB(0,255,0), 
	RGB(128,0,0), 
	RGB(255,255,0), 
	RGB(0,128,128), 
	RGB(128,128,0), 
	RGB(192,192,192), 
}; 
 
const static COLORREF textColors[MAX_COLOR] =  
{ 
	RGB(255,255,255), 
	RGB(255,255,255), 
	RGB(0,0,0), 
	RGB(255,255,255), 
	RGB(0,0,0), 
	RGB(0,0,0), 
	RGB(255,255,255), 
	RGB(255,255,255), 
	RGB(255,255,255), 
	RGB(255,255,255), 
	RGB(255,255,255), 
	RGB(255,255,255), 
	RGB(255,255,255), 
	RGB(0,0,0), 
	RGB(0,0,0), 
}; 
#endif 
 
 
BOOL CDetailView::m_bChartInfoSortAscending = FALSE; 
///////////////////////////////////////////////////////////////////////////// 
// CInfoCtrl 
 
CInfoCtrl::CInfoCtrl() 
{ 
} 
 
CInfoCtrl::~CInfoCtrl() 
{ 
	int nCount = m_arrayInfoItem.GetSize(); 
	 
	for (int i = 0; i < nCount; i++) 
		delete m_arrayInfoItem.GetAt(i); 
 
	m_arrayInfoItem.RemoveAll(); 
 
	nCount = m_arrayDiskInfo.GetSize(); 
	 
	for (i = 0; i < nCount; i++) 
		delete m_arrayDiskInfo.GetAt(i); 
 
	m_arrayDiskInfo.RemoveAll(); 
 
	nCount = m_arrayRootItem.GetSize(); 
	 
	for (i = 0; i < nCount; i++) 
		delete m_arrayRootItem.GetAt(i); 
 
	m_arrayRootItem.RemoveAll(); 
} 
 
 
BEGIN_MESSAGE_MAP(CInfoCtrl, CWnd) 
	//{{AFX_MSG_MAP(CInfoCtrl) 
	ON_WM_ERASEBKGND() 
	ON_WM_PAINT() 
	ON_WM_SETCURSOR() 
	ON_WM_CREATE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CInfoCtrl message handlers 
 
BOOL CInfoCtrl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	static CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW); 
 
	return  CWnd::CreateEx(NULL, ///*WS_EX_CLIENTEDGE  WS_EX_STATICEDGE,  
		className, NULL, dwStyle,  
		rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, 
		pParentWnd->GetSafeHwnd(), (HMENU) nID); 
} 
 
BOOL CInfoCtrl::OnEraseBkgnd(CDC* pDC)  
{ 
	return true; 
} 
 
#define _N_ITEMHEIGHT_ 17 
void CInfoCtrl::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	CRect rcClient; 
	GetClientRect(&rcClient); 
 
	COLORREF colorFace = GetSysColor(COLOR_BTNFACE); 
	COLORREF colorShadow = GetSysColor(COLOR_3DSHADOW); 
	COLORREF colorLight = GetSysColor(COLOR_3DHILIGHT); 
 
	CMemDC dcMem(&dc); 
	dcMem.FillSolidRect(rcClient, colorFace); 
	 
 
	//CFont* pFont = CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)); 
	CFont* pOldFont = dcMem.SelectObject(&m_font); 
	COLORREF oldTextColor = dcMem.SetTextColor(RGB(0,0,0)); 
	int oldBkMod = dcMem.SetBkMode(TRANSPARENT); 
 
	int nLength = DrawItemArray(&dcMem, rcClient, 0); 
	rcClient.top += nLength + ((nLength)?3:0); 
	nLength = DrawItemArray(&dcMem, rcClient, 2); 
	rcClient.top += nLength + ((nLength)?3:0); 
	DrawItemArray(&dcMem, rcClient, 1); 
	 
 
	dcMem.Draw3dRect(rcClient, colorShadow, colorLight); 
	dcMem.SelectObject(pOldFont);		 
	dcMem.SetTextColor(oldTextColor); 
	dcMem.SetBkMode(oldBkMod); 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CDetailView 
 
CDetailView::CDetailView() 
{ 
	m_nInfoWidth = 140; 
	m_nInfoHeight = 140; 
	m_bVerMode = TRUE; 
 
	m_nMouseInCode = 1000; // 0 = title button 
	m_bMouseDown = FALSE; 
 
	m_bFirstTime = TRUE; 
 
	m_bShowChart = TRUE; 
	m_bShowInfo = TRUE; 
 
	m_pSelectedFolder = NULL; 
	m_bSelectedIsFile = FALSE; 
	m_nSortedCol = -1; 
 
	m_bScanFinished = FALSE; 
} 
 
CDetailView::~CDetailView() 
{ 
	if (m_bSelectedIsFile && m_pSelectedFolder) 
		delete m_pSelectedFolder; 
	m_pSelectedFolder = NULL; 
} 
 
 
BEGIN_MESSAGE_MAP(CDetailView,CView ) 
	//{{AFX_MSG_MAP(CDetailView) 
	ON_WM_PAINT() 
	ON_WM_ERASEBKGND() 
	ON_WM_CREATE() 
	ON_WM_SIZE() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_TIMER() 
	ON_WM_LBUTTONUP() 
	ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop) 
	ON_NOTIFY(LVN_GETDISPINFO, ID_CHART_INFO, OnGetdispFolderChartList) 
	ON_NOTIFY(LVN_COLUMNCLICK, ID_CHART_INFO, OnColumnclickChartList) 
	ON_MESSAGE(WM_FOLDER_SELECTED, OnChangedTreeFolder) 
	ON_COMMAND(ID_SHOWCHART, OnShowChart) 
	ON_UPDATE_COMMAND_UI(ID_SHOWCHART, OnUpdateShowChart) 
	ON_COMMAND(ID_SHOWINFO, OnShowInfo) 
	ON_UPDATE_COMMAND_UI(ID_SHOWINFO, OnUpdateShowInfo) 
	ON_COMMAND(ID_FILE_SELECT, OnFileSelect) 
	ON_UPDATE_COMMAND_UI(ID_RESCAN, OnUpdateRescan) 
	ON_UPDATE_COMMAND_UI(ID_FILE_SELECT, OnUpdateFileSelect) 
	ON_WM_DESTROY() 
	ON_COMMAND(ID_SAVE_RESULT, OnSaveResult) 
	ON_COMMAND(ID_COLLAPSEALL, OnCollapseAll) 
	ON_COMMAND(ID_EXPANDALL, OnExpandAll) 
	ON_WM_KEYDOWN() 
	ON_UPDATE_COMMAND_UI(ID_SAVE_RESULT, OnUpdateSaveResult) 
	ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint) 
	ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, OnUpdateFilePrintPreview) 
	ON_COMMAND(ID_STOP, OnStop) 
	ON_COMMAND(ID_RESCAN, OnRescan) 
	ON_WM_HELPINFO() 
	//}}AFX_MSG_MAP 
	ON_BN_CLICKED(IDC_SPLITWND_HOR, OnSplitWnd) 
	ON_BN_CLICKED(IDC_SPLITWND_VER, OnSplitWnd) 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnPrintPreview) 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CDetailView message handlers 
 
BOOL CDetailView::PreCreateWindow(CREATESTRUCT& cs)  
{ 
	if (!CView::PreCreateWindow(cs)) 
		return FALSE; 
 
	cs.style &= ~WS_BORDER; 
	cs.dwExStyle &= ~WS_EX_CLIENTEDGE; 
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,  
		::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL); 
 
	return TRUE; 
} 
 
void CDetailView::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
 
	CMemDC memDC(&dc); 
	 
	CRect rcClient; 
	GetClientRect(&rcClient); 
 
	COLORREF colorFace = GetSysColor(COLOR_BTNFACE); 
	COLORREF colorShadow = GetSysColor(COLOR_3DSHADOW); 
	COLORREF colorLight = GetSysColor(COLOR_3DHILIGHT); 
	COLORREF colorText = GetSysColor(COLOR_WINDOWTEXT); 
 
	memDC.FillSolidRect(rcClient, colorFace); 
 
	// Header bar 
	CRect rcItem(rcClient); 
	rcItem.bottom = rcItem.top + nHeaderWidth; 
	memDC.FillSolidRect(rcItem, colorShadow); 
	//memDC.DrawEdge(rcItem, EDGE_ETCHED, BF_RECT); 
 
	CFont* pOldFont = (CFont*)memDC.SelectObject(&m_fontTitle); 
	COLORREF oldTextColor; 
	int oldBkMod = memDC.SetBkMode(TRANSPARENT); 
 
	oldTextColor = memDC.SetTextColor(RGB(255,255,255)); 
 
	rcItem = m_rcTitle; 
	if (rcItem.right>=rcClient.right) 
		rcItem.right = rcClient.right-1; 
 
	if (m_nMouseInCode == 0) 
	{ 
		if (m_bMouseDown) 
			memDC.Draw3dRect(rcItem, RGB(0,0,0), RGB(255,255,255)); 
		else 
			memDC.Draw3dRect(rcItem, RGB(255,255,255), RGB(0,0,0)); 
	} 
 
	rcItem.DeflateRect(5, 0); 
	rcItem.right -= 12; 
	::DrawTextEx (memDC.m_hDC, 
                m_strTitle.GetBuffer (0), 
                m_strTitle.GetLength(), 
                &rcItem, 
                DT_SINGLELINE | DT_VCENTER | DT_LEFT | DT_PATH_ELLIPSIS, 
                NULL); 
 
	// Draw a triangle 
	rcItem.right += 12; 
	rcItem.left = rcItem.right-8; 
	rcItem.top += rcItem.Height() / 2 - 1; 
	CPoint pt[3]; 
	pt[0] = rcItem.TopLeft(); 
	pt[1] = CPoint(rcItem.right, rcItem.top); 
	pt[2] = CPoint(rcItem.left + rcItem.Width()/2, rcItem.top + rcItem.Width()/2); 
	memDC.SelectStockObject(WHITE_BRUSH); 
	memDC.SelectStockObject(NULL_PEN); 
	memDC.Polygon( pt, 3 ); 
	 
 
	 
	/*rcItem = rcClient; 
	if (m_bVerMode) 
	{ 
		rcItem.left = rcClient.right - m_nInfoWidth; 
		rcItem.top += rcItem.Height() / 2; 
		rcItem.bottom = rcItem.top + nMargin; 
 
		memDC.DrawEdge(rcItem, EDGE_ETCHED, BF_BOTTOM); 
	} 
	else 
	{ 
		rcItem.top = rcItem.bottom - m_nInfoHeight; 
		rcItem.left += rcItem.Width() / 2; 
		rcItem.right = rcItem.left + nMargin; 
 
		memDC.DrawEdge(rcItem, EDGE_ETCHED, BF_RIGHT); 
	}*/ 
 
	m_wndDiskTree.GetWindowRect(&rcItem); 
	ScreenToClient(&rcItem); 
	rcItem.InflateRect(1,1); 
	memDC.Draw3dRect(rcItem, colorShadow, colorLight); 
 
	if (m_bShowChart) 
	{ 
		m_wndChartInfo.GetWindowRect(&rcItem); 
		ScreenToClient(&rcItem); 
		rcItem.InflateRect(1,1); 
		memDC.Draw3dRect(rcItem, colorShadow, colorLight); 
	} 
 
 
	memDC.SelectObject(pOldFont);		 
	memDC.SetTextColor(oldTextColor); 
	memDC.SetBkMode(oldBkMod); 
} 
 
 
BOOL CDetailView::OnEraseBkgnd(CDC* pDC)  
{ 
	return TRUE; 
} 
 
 
int CDetailView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CView ::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	//, m_wndSplitHor; 
	LPCSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW); 
	m_wndSplitVer.Create(lpszClassName,"",WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,IDC_SPLITWND_VER); 
	m_wndSplitHor.Create(lpszClassName,"",WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,IDC_SPLITWND_HOR); 
	m_wndSplitHor.m_bVerticle = FALSE; 
 
	m_fontTitle.CreateFont(16, 0,0,0,FW_BOLD, 0,0,0, 
		DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, 
		DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial"); 
 
	m_wndDiskTree.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, ID_DISK_TREE); 
	//m_wndDiskTree.ModifyStyleEx(NULL, WS_EX_STATICEDGE, SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER); 
	//m_wndDiskTree.ModifyStyleEx(NULL, WS_EX_CLIENTEDGE, SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER); 
	 
	m_wndChart.Create("PIE_CHART_CTRL", NULL, WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, ID_DISK_CHART); 
	m_wndChartInfo.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT, CRect(0,0,0,0), this, ID_CHART_INFO); 
	//m_wndChartInfo.ModifyStyleEx(NULL, WS_EX_STATICEDGE, SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER); 
	m_wndInfo.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, ID_INFO_CTRL); 
 
	m_bShowChart = AfxGetApp()->GetProfileInt("Settings", "ShowChart", TRUE); 
	m_bShowInfo = AfxGetApp()->GetProfileInt("Settings", "ShowInfoBar", TRUE); 
	m_nInfoWidth = AfxGetApp()->GetProfileInt("Settings", "InfoWidth", 140); 
	m_nInfoHeight = AfxGetApp()->GetProfileInt("Settings", "InfoHeight", 90); 
 
	UpdateShowInfo(); 
	UpdateShowChart(); 
	 
	//associate imagelist with listviewctrl 
	HINSTANCE hIns = AfxGetResourceHandle(); 
	AfxSetResourceHandle(AfxGetInstanceHandle()); 
	m_imgColorList.Create(IDB_COLORLIST,16,1,RGB(255, 255, 255)); 
	AfxSetResourceHandle(hIns); 
	//m_imgColorList.SetBkColor(CLR_NONE); 
	 
	m_wndChartInfo.SetImageList(&m_imgColorList,LVSIL_SMALL); 
 
	if (m_wndFlatHeader.SubclassWindow(m_wndChartInfo.GetDlgItem(0)->GetSafeHwnd()) == 0) 
	{ 
		TRACE0("Unable to subclass header control.\n"); 
		return -1; 
	} 
 
 
	LV_COLUMN   lvColumn; 
	lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvColumn.fmt = LVCFMT_CENTER; 
	lvColumn.cx = 150; 
	CString str; 
	for(int x = 0; x < 4; x++) 
    { 
		str.LoadString(IDS_COL_FOLDERTREE + x); 
 
		lvColumn.pszText = (LPTSTR)(LPCTSTR)str; 
		m_wndChartInfo.InsertColumn(x,&lvColumn); 
    } 
 
	if (IfNewComCtrl32()) 
	{ 
		DWORD dwStyle = ::SendMessage(m_wndChartInfo.m_hWnd,LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); 
		dwStyle |= LVS_EX_GRIDLINES; 
		::SendMessage(m_wndChartInfo.m_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle); 
	} 
 
	 
	return 0; 
} 
 
void CDetailView::RepositionCtrls() 
{ 
	CRect rcClient; 
	GetClientRect(&rcClient); 
 
	CRect rcItem(rcClient); 
	rcItem.top += nHeaderWidth + nMargin; 
 
	if (m_bVerMode) 
	{ 
		if (m_bShowChart) rcItem.bottom -= m_nInfoHeight+nMargin; 
		 
		if (m_bShowInfo) rcItem.right -= m_nInfoWidth + nMargin; 
		rcItem.DeflateRect(1,1); 
		m_wndDiskTree.SetWindowPos(NULL, rcItem.left, rcItem.top,  
			rcItem.Width(), rcItem.Height(), SWP_NOZORDER); 
 
		rcItem.InflateRect(1,1); 
		if (m_bShowInfo) 
		{ 
			rcItem.right = rcClient.right; 
			rcItem.left = rcItem.right - m_nInfoWidth; 
			m_wndInfo.SetWindowPos(NULL, rcItem.left, rcItem.top,  
				rcItem.Width(), rcItem.Height(), SWP_NOZORDER); 
 
			m_wndSplitVer.SetWindowPos(NULL, rcItem.left-nMargin, rcItem.top,  
				nMargin, (m_bShowChart)?rcItem.Height() + m_nInfoHeight: 
				rcItem.Height(), SWP_NOZORDER); 
		} 
 
		if (m_bShowChart) 
		{ 
			rcItem.top = rcItem.bottom+nMargin; 
			rcItem.bottom += m_nInfoHeight; 
			rcItem.left = rcClient.left; 
 
			m_wndSplitHor.SetWindowPos(NULL, rcItem.left, rcItem.top - nMargin,  
				rcItem.Width(), nMargin, SWP_NOZORDER); 
 
			rcItem.right -= m_nInfoWidth + nMargin; 
			rcItem.DeflateRect(1,1); 
			m_wndChartInfo.SetWindowPos(NULL, rcItem.left, rcItem.top,  
				rcItem.Width(), rcItem.Height(), SWP_NOZORDER); 
			rcItem.InflateRect(1,1); 
 
			rcItem.right = rcClient.right; 
			rcItem.left = rcItem.right - m_nInfoWidth; 
			m_wndChart.SetWindowPos(NULL, rcItem.left, rcItem.top,  
				rcItem.Width(), rcItem.Height(), SWP_NOZORDER); 
 
			if (!m_bShowInfo) 
				m_wndSplitVer.SetWindowPos(NULL, rcItem.left-nMargin, rcItem.top,  
					nMargin, rcItem.Height(), SWP_NOZORDER);; 
		} 
	} 
	else 
	{/* 
		rcItem.bottom -= m_nInfoHeight + nMargin; 
 
		m_wndDiskTree.SetWindowPos(NULL, rcItem.left, rcItem.top,  
			rcItem.Width(), rcItem.Height(), SWP_NOZORDER);	 
 
		rcItem.bottom = rcClient.bottom; 
		rcItem.top = rcItem.bottom - m_nInfoHeight; 
		rcItem.right = rcItem.left + (rcItem.Width() - nMargin) / 2;		 
		m_wndInfo.SetWindowPos(NULL, rcItem.left, rcItem.top,  
			rcItem.Width(), rcItem.Height(), SWP_NOZORDER); 
 
		rcItem.OffsetRect(rcItem.Width() + nMargin, 0); 
		m_wndChart.SetWindowPos(NULL, rcItem.left, rcItem.top,  
			rcItem.Width(), rcItem.Height(), SWP_NOZORDER);*/ 
	} 
} 
 
void CDetailView::OnSize(UINT nType, int cx, int cy)  
{ 
	CView ::OnSize(nType, cx, cy); 
 
	RepositionCtrls();	 
 
	if (m_wndDiskTree.m_hWnd && cx>0) 
	{ 
		if (m_bFirstTime) 
		{ 
			AutoResizeColumns(); 
 
			m_bFirstTime = FALSE; 
		}//else 
			//AutoResizeColumns(); 
 
		//AutoResizeColumns(); 
	} 
} 
 
void CDetailView::SetTitle(const CString &str) 
{ 
	CRect rcOld = m_rcTitle; 
 
	CClientDC dc(this); 
	CFont* pFont = (CFont*)dc.SelectObject(&m_fontTitle); 
 
	m_strTitle = str; 
	CSize szText = dc.GetTextExtent(m_strTitle); 
	szText.cx += 22; 
	szText.cy = nHeaderWidth-2; 
	m_rcTitle = CRect(CPoint(1, 1), szText); 
 
	dc.SelectObject(pFont); 
 
	rcOld.UnionRect(rcOld, m_rcTitle); 
 
	InvalidateRect(rcOld); 
} 
 
void CDetailView::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	if (nFlags & MK_LBUTTON) 
		m_bMouseDown = TRUE; 
	else 
		m_bMouseDown = FALSE; 
	//	return; 
 
	int nOldCode = m_nMouseInCode; 
 
	int nCode = HitTestEx(point); 
 
	if (m_nMouseInCode != nCode) 
	{ 
		int nOld = m_nMouseInCode; 
		m_nMouseInCode = nCode; 
		RedrawItem(nOld); 
		RedrawItem(m_nMouseInCode); 
 
		KillTimer(6); 
		SetTimer(6,10,NULL); 
	} 
 
	CView ::OnMouseMove(nFlags, point); 
} 
 
void CDetailView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	if (m_nMouseInCode<1000) 
	{ 
		int n = HitTestEx(point); 
		VERIFY(m_nMouseInCode == n); 
 
		if (!m_bMouseDown) 
			m_bMouseDown = TRUE; 
 
		RedrawItem(m_nMouseInCode); 
	} 
	CView ::OnLButtonDown(nFlags, point); 
} 
 
int CDetailView::HitTestEx(const CPoint &pt) 
{ 
	if (m_rcTitle.PtInRect(pt)) 
		return 0; 
 
	return 1000; 
} 
 
void CDetailView::RedrawItem(int nCode) 
{ 
	if (nCode == 0) 
		InvalidateRect(m_rcTitle, FALSE); 
} 
 
void CDetailView::OnTimer(UINT nIDEvent)  
{ 
	if (m_nMouseInCode < 1000) 
	{ 
		CPoint pt; 
		if (!GetCursorPos(&pt)) 
			return; 
		ScreenToClient(&pt); 
		 
		CRect rcClient; 
		GetClientRect(&rcClient); 
		rcClient.bottom = rcClient.top + nHeaderWidth; 
 
		if (!rcClient.PtInRect(pt)) 
		{ 
			KillTimer(6); 
 
			int nOld = m_nMouseInCode; 
			m_nMouseInCode = 1000; 
			m_bMouseDown = FALSE; 
 
			RedrawItem(nOld); 
		} 
	}	 
	 
	CView ::OnTimer(nIDEvent); 
} 
 
void CDetailView::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	if (m_nMouseInCode<1000) 
	{ 
		int n = HitTestEx(point); 
		 
		if (m_bMouseDown) 
		{ 
			m_bMouseDown = FALSE; 
 
			if (m_nMouseInCode == n) 
			{ 
				RedrawItem(m_nMouseInCode); 
				 
				// Doing stuff here 
				if (m_nMouseInCode == 0) 
				{ 
					// Only when display another dialog 
					int nOld = m_nMouseInCode; 
					m_nMouseInCode = 1000; 
					RedrawItem(nOld); 
 
					OnSelectFolder(); 
				} 
			}else 
			{ 
				int nOld = m_nMouseInCode; 
				 
				m_nMouseInCode = 1000; 
				RedrawItem(nOld); 
			} 
		} 
	} 
 
	CView ::OnLButtonUp(nFlags, point); 
} 
 
void CDetailView::Reset() 
{ 
	m_fontTitle.DeleteObject(); 
} 
 
void CDetailView::OnRescan() 
{ 
	if (m_wndDiskTree.m_pFolder==NULL) 
		OnSelectFolder(); 
	else 
	{ 
		m_bScanFinished = FALSE; 
		m_wndDiskTree.UpdateFolders(); 
	} 
} 
 
void CDetailView::OnStop()  
{ 
	m_wndDiskTree.Stop(); 
} 
 
void CDetailView::OnUpdateStop(CCmdUI* pCmdUI)  
{	 
	pCmdUI->Enable(m_wndDiskTree.m_pThread!=0); 
} 
 
void CDetailView::OnSelectFolder() 
{ 
	CDirDialog dlg; 
	CString str; 
	str.LoadString(IDS_SELECTFOLDER_TO_MONITOR); 
	dlg.m_strTitle = str; 
	str = m_wndDiskTree.GetCurrentFolder(); 
	 
	dlg.m_strSelDir = (str.GetLength()>3 && str.Right(1) == "\\")? 
		str.Left(str.GetLength()-1):str; 
	 
	if (dlg.DoBrowse() == IDOK) 
	{ 
		str = dlg.m_strPath; 
		if (str.Right(1) != "\\") 
			str += "\\"; 
		 
		// UpdateSet Title here later 
		SetTitle(str); 
 
		SetCurrentFolder(str); 
	} 
} 
 
void CDetailView::SetCurrentFolder(CString &str) 
{ 
	if (m_wndDiskTree.m_pThread) 
		m_wndDiskTree.Stop(); 
 
	// Update drive info 
	CString strDrive = str.Left(3); 
	 
	m_wndChartInfo.DeleteAllItems(); 
	m_wndInfo.ResetInfoValues(); 
	m_wndChart.Reset(); 
	m_wndInfo.ResetDriveValues(); 
	m_wndInfo.ResetRootValues(); 
	 
	CString strTemp; 
	char driveName[32]; 
	char driveType[32]; 
	DWORD dwDword1, dwDword2, dwDword3; 
	if (::GetVolumeInformation( 
		strDrive, 
		driveName, 32, &dwDword1, &dwDword2, &dwDword3, 
		driveType, 32)) 
	{ 
		strTemp = driveName; 
		strTemp.MakeLower(); 
		strTemp = strTemp.Right(strTemp.GetLength()-1); 
		strTemp = CString(driveName).Left(1) + strTemp; 
		strTemp += " (" + strDrive.Left(strDrive.GetLength()-1) + ")"; 
		m_wndInfo.m_strDriveTitle = strTemp; 
		m_wndInfo.m_strFolderTitle = str; 
		 
		//Type 
		strTemp = driveType; 
		if (strTemp.CompareNoCase(_T("FAT")) == 0) 
			strTemp = _T("FAT16"); 
		m_wndInfo.SetValue(IDS_INFO_DISK_PARTITION, strTemp, -1, 0); 
 
		// Spaces 
		DWORD dwFreeSpaceLow; 
		DWORD dwFreeSpaceHigh; 
		DWORD dwTotalSpaceLow; 
		DWORD dwTotalSpaceHigh; 
		if (GetHDSpace(strDrive, dwFreeSpaceLow, dwFreeSpaceHigh, 
			dwTotalSpaceLow, dwTotalSpaceHigh)) 
		{ 
			long double ldTotal = ((long double)dwTotalSpaceHigh)* 
				MAX_DWORD_VALUE + (long double)dwTotalSpaceLow; 
			long double ldFree = ((long double)dwFreeSpaceHigh) *  
				MAX_DWORD_VALUE + (long double)dwFreeSpaceLow; 
			 
			FormatByteSize(ldTotal, strTemp); 
			 
			// Total 
			m_wndInfo.SetValue(IDS_INFO_DISK_TOTALSPACE, strTemp, -1, 0); 
			 
			// Usage 
			m_wndInfo.SetValue(IDS_INFO_DISK_USAGE, "", (int)(((ldTotal-ldFree)/ldTotal)*100), 0); 
		} 
	} 
	m_wndInfo.UpdateCtrl(); 
	m_wndChart.InvalidateRect(NULL, FALSE); 
 
	m_folder.m_strFolderName = str; 
	m_wndDiskTree.m_pFolder = &m_folder; 
	m_bScanFinished = FALSE; 
	m_wndDiskTree.UpdateFolders(); 
 
	// Update shortcut bar 
	AfxGetMainWnd()->SendMessage(WM_FOLDER_RESELECTED, 0,0); 
 
	AfxGetApp()->WriteProfileString("Settings", "DetailLastOpened", str); 
} 
 
int CDetailView::CompareFolderSize(const void* f1, const void* f2) 
{ 
	CMyFolder* pFolder1 = *(CMyFolder**)f1; 
	CMyFolder* pFolder2 = *(CMyFolder**)f2; 
 
	return (int)(pFolder2->GetFolderSize(TRUE) - pFolder1->GetFolderSize(TRUE)); 
} 
 
void CDetailView::UpdateFolderChart(CMyFolder *pFolder) 
{ 
	m_wndChartInfo.DeleteAllItems(); 
	m_wndInfo.ResetInfoValues(); 
	//m_wndInfo.De 
	m_wndChart.Reset(); 
	 
	if (!pFolder) 
	{ 
		m_wndInfo.UpdateCtrl(); 
		m_wndChart.InvalidateRect(NULL, FALSE); 
		return; 
	} 
 
	if (m_bSelectedIsFile && m_pSelectedFolder) 
		delete m_pSelectedFolder; 
	m_pSelectedFolder = NULL; 
 
	if (pFolder->IsFile()) // When selecting files, create the file list to display 
	{ 
		m_bSelectedIsFile = true; 
		m_pSelectedFolder = new CMyFolder; 
 
		m_pSelectedFolder->m_bSorted = FALSE; 
 
		CString strCurPath = m_wndDiskTree.GetSelectedPath(); 
		if (strCurPath.Right(1) != "\\") 
			strCurPath += "\\"; 
 
		// Add files in folder 
		HANDLE hFind; 
		WIN32_FIND_DATA fd; 
		 
		char charCmp[MAX_PATH]; 
		strcpy(charCmp, strCurPath); 
		strcat(charCmp, "*.*");	 
		 
		if ((hFind = ::FindFirstFile ((LPCTSTR) charCmp, &fd)) == 
			INVALID_HANDLE_VALUE)  
			return; 
		 
		do { 
			if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))  
			{ 
				CMyFolder* pFile = new CMyFolder; 
				pFile->SetTitle(fd.cFileName); 
				pFile->m_dFileSize = fd.nFileSizeLow; 
				pFile->m_nFileCount = 1; 
				pFile->SetReady(1); 
 
				m_pSelectedFolder->m_dFileSize += fd.nFileSizeLow; 
				m_pSelectedFolder->Add(pFile); 
			} 
		} while (::FindNextFile (hFind, &fd)); 
		 
		::FindClose (hFind); 
 
		m_pSelectedFolder->SetReady(0); 
 
		pFolder = m_pSelectedFolder; 
	} 
 
	// Sort the folder list and insert into the chart control 
	if ((!pFolder->m_bSorted) && (pFolder->IsReady())) 
	{ 
		if (pFolder->m_arraySubFolder.GetSize() > 1) 
			qsort((void*)(pFolder->m_arraySubFolder.GetData()),  
				((size_t)pFolder->m_arraySubFolder.GetSize()),  
				sizeof(pFolder->m_arraySubFolder.GetAt(0)), 
				CompareFolderSize); 
		pFolder->m_bSorted = TRUE; 
	} 
 
	// Insert to the chart controll 
	long nCount = pFolder->GetFolderCount(FALSE, FALSE); 
	long double ldTotalSize = pFolder->GetFolderSize(TRUE); 
	CMyFolder* pSubFolder; 
	int nAngle; 
	int nTotalAngle = 0; 
	int iColor = 0; 
 
	if (nCount == 0) 
		nTotalAngle = 360; 
	else 
	{ 
		double dAngleTemp; 
		for (int i=0; i= MAX_COLOR) 
				iColor -= MAX_COLOR; 
			pSubFolder = pFolder->GetAt(i); 
			dAngleTemp = (((pSubFolder->GetFolderSize(TRUE))/ldTotalSize)*((double)360)); 
			nAngle = (int)dAngleTemp; 
			if (dAngleTemp>=((double)nAngle+0.5)) 
				nAngle+=1; 
 
			if (nAngle > 10) 
			{ 
				m_wndChart.AddPiece(backColors[iColor], textColors[iColor], nAngle); 
				nTotalAngle += nAngle; 
			} 
			else 
				break; 
		} 
	} 
 
	if (nTotalAngle < 360) 
	{ 
		//iColor ++; 
		if (iColor >= MAX_COLOR) 
			iColor = MAX_COLOR-1; 
 
		nAngle = 360 - nTotalAngle; 
		m_wndChart.AddPiece(backColors[iColor], textColors[iColor], nAngle); 
	} 
	 
	m_wndChart.InvalidateRect(NULL, FALSE); 
 
	int nChartItemCount = m_wndChart.GetItemCount(); 
 
	// Insert to chart info list 
	{ 
		int nCount = pFolder->GetCount(); 
		 
		for (int i=0; i nChartItemCount-1)? nChartItemCount-1:i % MAX_COLOR; //pFile->m_bSelected?1:0; 
			lvi.pszText = LPSTR_TEXTCALLBACK;  
			lvi.lParam = (LPARAM) pFolder->GetAt(i); 
			 
			m_wndChartInfo.InsertItem (&lvi); 
		} 
	} 
 
	CDetailView::m_bChartInfoSortAscending = FALSE; 
	m_nSortedCol = 1; 
	m_wndChartInfo.SortItems (CompareFunc, m_nSortedCol); 
 
	// UpdateInfoCtrl 
	CString str; 
	str.LoadString(IDS_FILES); 
	m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILECOUNT, pFolder->GetItemText(3) + " " + str, -1, 1); 
	str.LoadString(IDS_FOLDERS); 
	m_wndInfo.SetValue(IDS_INFO_CONTAINS_FOLDERCOUNT, pFolder->GetItemText(2) + " " + str, -1, 1); 
	m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILESIZE, pFolder->GetItemText(1), -1, 1); 
 
	m_wndInfo.UpdateCtrl(); 
} 
 
void CDetailView::OnGetdispFolderChartList(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 
	CMyFolder* pFileItem= (CMyFolder*) pDispInfo->item.lParam; 
	LV_ITEM *pItem = &((LV_DISPINFO*)pNMHDR)->item; 
 
	if (pItem->mask & LVIF_TEXT) 
	{ 
		::lstrcpy (pDispInfo->item.pszText, (LPCTSTR) pFileItem-> 
			GetItemText(pDispInfo->item.iSubItem)); 
	} 
 
	*pResult = 0; 
} 
 
void CDetailView::OnColumnclickChartList(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	CWaitCursor wait; 
 
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
 
	if( pNMListView->iSubItem == m_nSortedCol ) 
		CDetailView::m_bChartInfoSortAscending = !CDetailView::m_bChartInfoSortAscending; 
	else 
		CDetailView::m_bChartInfoSortAscending = TRUE; 
	m_nSortedCol = pNMListView->iSubItem; 
 
	m_wndFlatHeader.SetSortColumn(pNMListView->iSubItem, CDetailView::m_bChartInfoSortAscending); 
 
	m_wndChartInfo.SortItems (CompareFunc, pNMListView->iSubItem); 
	 
	*pResult = 0; 
} 
 
void CDetailView::OnChangedTreeFolder(WPARAM wParam, LPARAM lParam) 
{ 
	if (wParam) // Tell me that the scan is finished 
	{ 
		// Update the all info ctrl 
		m_bScanFinished = TRUE; 
 
		m_wndInfo.ResetDriveValues(); 
		m_wndInfo.ResetRootValues(); 
		CString str; 
		CMyFolder* pRootFolder = m_wndDiskTree.GetRootItem()->m_lpNodeInfo->m_pFolder; 
 
		CString strCurrent; 
		strCurrent = pRootFolder->GetItemText(0); 
		m_wndInfo.m_strFolderTitle = strCurrent; 
		double dAllocated = 100; 
		 
		 
		if (strCurrent.GetLength()<=3) // Drive 
		{ 
			CString strTemp; 
			// Spaces 
			DWORD dwFreeSpaceLow; 
			DWORD dwFreeSpaceHigh; 
			DWORD dwTotalSpaceLow; 
			DWORD dwTotalSpaceHigh; 
			if (GetHDSpace(strCurrent, dwFreeSpaceLow, dwFreeSpaceHigh, 
				dwTotalSpaceLow, dwTotalSpaceHigh)) 
			{ 
				double ldTotal = ((long double)dwTotalSpaceHigh)* 
					MAX_DWORD_VALUE + (long double)dwTotalSpaceLow; 
				double ldFree = ((long double)dwFreeSpaceHigh) *  
					MAX_DWORD_VALUE + (long double)dwFreeSpaceLow; 
				 
				FormatByteSize(ldTotal, strTemp); 
					 
				// Total 
				m_wndInfo.SetValue(IDS_INFO_DISK_TOTALSPACE, strTemp, -1, 2); 
					 
				// Usage 
				m_wndInfo.SetValue(IDS_INFO_DISK_USAGE, "", (int)(((ldTotal-ldFree)/ldTotal)*100), 2);			 
 
				dAllocated = ldTotal-ldFree; 
			} 
			// Allocated 
			FormatByteSize(dAllocated, strTemp); 
			m_wndInfo.SetValue(IDS_INFO_ALLOCATED, strTemp, -1, 2); 
 
			m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILESIZE, pRootFolder->GetItemText(1), -1, 2); 
			m_wndInfo.SetValue(IDS_INFO_EFFICIENCY, "", (int)(pRootFolder->GetFolderSize(TRUE)*100/dAllocated), 2); 
		}else 
		{ 
			m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILESIZE, pRootFolder->GetItemText(1), -1, 2); 
			str.LoadString(IDS_FILES); 
			m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILECOUNT, pRootFolder->GetItemText(3) + " " + str, -1, 2); 
			str.LoadString(IDS_FOLDERS); 
			m_wndInfo.SetValue(IDS_INFO_CONTAINS_FOLDERCOUNT, pRootFolder->GetItemText(2) + " " + str, -1, 2); 
		} 
	} 
 
	CMyFolder* pFolder = m_wndDiskTree.GetSelectedFolder(); 
 
	UpdateFolderChart(pFolder); 
} 
 
BOOL CInfoCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)  
{ 
	SetCursor(LoadCursor(NULL, IDC_ARROW)); 
 
	return TRUE; 
} 
 
void CInfoCtrl::InsertColumn(UINT nID, CInfoCtrlItemArray* pArray) 
{ 
	CInfoCtrlItem* pItem = new CInfoCtrlItem; 
	pItem->m_nITEMID = nID; 
	pItem -> m_strItemName.LoadString(nID); 
	pItem -> m_strItemName += ":"; 
	pItem -> m_nPercentData = -1; // = -1 if the item contains text data 
	pItem -> m_strTextData = _T(""); 
 
	try  
	{ 
		pArray->Add(pItem); 
		return; 
	} 
	catch (CMemoryException* e) 
	{ 
		CString strTemp, strMes; 
		strTemp.LoadString(IDS_ERR_OUTOFMEM); 
		strMes.Format(strTemp, 3431); 
		AfxMessageBox(strMes); 
 
		if (pItem !=NULL)  
			delete pItem; 
		e->Delete(); 
		return; 
	} 
	return; 
} 
 
 
void CInfoCtrl::ResetInfoValues() 
{ 
	int nCount = m_arrayInfoItem.GetSize(); 
	CInfoCtrlItem* pItem; 
	 
	for (int i = 0; i < nCount; i++) 
	{ 
		pItem = m_arrayInfoItem.GetAt(i); 
 
		pItem->m_nPercentData = -1; 
		pItem->m_strTextData = _T(""); 
	} 
} 
 
void CInfoCtrl::ResetRootValues() 
{ 
	CInfoCtrlItem* pItem; 
	 
	int nCount = m_arrayRootItem.GetSize(); 
	for (int i = 0; i < nCount; i++) 
	{ 
		pItem = m_arrayRootItem.GetAt(i); 
 
		pItem->m_nPercentData = -1; 
		pItem->m_strTextData = _T(""); 
	} 
 
 
} 
void CInfoCtrl::SetValue(UINT nID, const CString &str, int n, int nArray) 
{ 
	CInfoCtrlItemArray* pCurArray; 
	 
	if (nArray == 0) 
		pCurArray = &m_arrayDiskInfo; 
	else if (nArray == 1) 
		pCurArray = &m_arrayInfoItem; 
	else  
		pCurArray = &m_arrayRootItem; 
	int nCount = pCurArray->GetSize(); 
	CInfoCtrlItem* pItem; 
	 
	for (int i = 0; i < nCount; i++) 
	{ 
		pItem = pCurArray->GetAt(i); 
		if (pItem->m_nITEMID == nID) 
		{ 
			pItem->m_nPercentData = n; 
			pItem->m_strTextData = str; 
 
			return; 
		} 
	} 
} 
 
void CInfoCtrl::UpdateCtrl() 
{ 
	InvalidateRect(NULL, FALSE); 
} 
 
void CInfoCtrl::DrawTextItem(CDC *pDC, const CRect &rc, CInfoCtrlItem* pItem) 
{ 
	CRect rcItem(rc); 
	rcItem.right = rcItem.Width()*3 / 7; 
	pDC->DrawText(pItem->m_strItemName, rcItem, DT_LEFT|DT_VCENTER|DT_SINGLELINE); 
 
	rcItem.left = rcItem.right; 
	rcItem.right = rc.right; 
	pDC->FillSolidRect(rcItem, RGB(0,0,0)); 
 
	COLORREF oldTextColor = pDC->SetTextColor(RGB(255,255,128)); 
	pDC->DrawText(pItem->m_strTextData, rcItem, DT_CENTER|DT_VCENTER|DT_SINGLELINE);	 
	pDC->SetTextColor(oldTextColor); 
	 
	pDC->DrawEdge(rcItem, EDGE_SUNKEN, BF_RECT); 
} 
 
void CInfoCtrl::DrawPercentItem(CDC *pDC, const CRect &rc, CInfoCtrlItem* pItem) 
{ 
	CRect rcItem(rc); 
	rcItem.right = rcItem.Width()*3 / 7; 
	pDC->DrawText(pItem->m_strItemName, rcItem, DT_LEFT|DT_VCENTER|DT_SINGLELINE); 
 
	rcItem.left = rcItem.right; 
	rcItem.right = rc.right; 
	pDC->FillSolidRect(rcItem, RGB(0,0,0)); 
 
	COLORREF oldTextColor = pDC->SetTextColor(RGB(255,255,128)); 
	CString str; 
	str.Format("%d%%", pItem->m_nPercentData); 
	DrawPercentBar(pDC, rcItem, ((double)pItem->m_nPercentData)/100.0,  
					str, NULL); 
	pDC->DrawText(pItem->m_strTextData, rcItem, DT_CENTER|DT_VCENTER|DT_SINGLELINE);	 
	pDC->SetTextColor(oldTextColor); 
	 
	 
	pDC->DrawEdge(rcItem, EDGE_SUNKEN, BF_RECT); 
} 
 
void CDetailView::OnShowChart()  
{ 
	m_bShowChart = !m_bShowChart; 
	 
	UpdateShowChart(); 
	RepositionCtrls(); 
	InvalidateRect(NULL, FALSE); 
} 
 
void CDetailView::OnUpdateShowChart(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_bShowChart); 
} 
 
void CDetailView::UpdateShowInfo() 
{ 
	m_wndInfo.ShowWindow(m_bShowInfo?SW_SHOW:SW_HIDE); 
	m_wndInfo.EnableWindow(m_bShowInfo); 
 
	if (!m_bShowChart) 
	{ 
		m_wndSplitVer.ShowWindow(m_bShowInfo?SW_SHOW:SW_HIDE); 
		m_wndSplitVer.EnableWindow(m_bShowInfo);		 
	} 
} 
void CDetailView::UpdateShowChart() 
{ 
	m_wndChart.ShowWindow(m_bShowChart?SW_SHOW:SW_HIDE); 
	m_wndChartInfo.ShowWindow(m_bShowChart?SW_SHOW:SW_HIDE); 
	m_wndSplitHor.ShowWindow(m_bShowChart?SW_SHOW:SW_HIDE); 
	 
	m_wndChart.EnableWindow(m_bShowChart); 
	m_wndChartInfo.EnableWindow(m_bShowChart); 
	m_wndSplitHor.EnableWindow(m_bShowChart); 
 
	if (!m_bShowInfo) 
	{ 
		m_wndSplitVer.ShowWindow(m_bShowChart?SW_SHOW:SW_HIDE); 
		m_wndSplitVer.EnableWindow(m_bShowChart);		 
	} 
 
} 
 
void CDetailView::OnShowInfo()  
{ 
	m_bShowInfo = !m_bShowInfo;	 
 
	UpdateShowInfo(); 
	RepositionCtrls();	 
	InvalidateRect(NULL, FALSE); 
} 
 
void CDetailView::OnUpdateShowInfo(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_bShowInfo); 
} 
 
void CDetailView::OnSplitWnd() 
{ 
	CRect rc, rcClient; 
	GetClientRect(&rcClient); 
 
	if (m_wndSplitVer.IsWindowVisible()) 
	{ 
		m_wndSplitVer.GetWindowRect(&rc); 
		ScreenToClient(&rc); 
		m_nInfoWidth = rcClient.right - rc.right; 
	} 
 
	if (m_wndSplitHor.IsWindowVisible()) 
	{ 
		m_wndSplitHor.GetWindowRect(&rc); 
		ScreenToClient(&rc); 
		m_nInfoHeight = rcClient.bottom - rc.bottom; 
	} 
 
	RepositionCtrls(); 
	InvalidateRect(NULL, FALSE); 
	m_wndChart.RedrawWindow(); 
	m_wndChartInfo.RedrawWindow(); 
} 
 
int CALLBACK CDetailView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
{ 
	CMyFolder* pItem1 = (CMyFolder*) lParam1; 
    CMyFolder* pItem2 = (CMyFolder*) lParam2; 
 
	int nResult=0; 
 
	switch (lParamSort) 
	{ 
	case 0: // Title 
		nResult = (pItem1->GetItemText(0)).CompareNoCase(pItem2->GetItemText(0)); 
		break; 
	case 1: // Size 
		nResult = int(pItem1->GetFolderSize(TRUE) - pItem2->GetFolderSize(TRUE)); 
		break; 
	case 2: // Folders 
		nResult = int(pItem1->GetFolderCount(TRUE) - pItem2->GetFolderCount(TRUE)); 
		break; 
	case 3: // Files 
		nResult = int(pItem1->GetFileCount(TRUE) - pItem2->GetFileCount(TRUE)); 
		break; 
	} 
	 
	if (m_bChartInfoSortAscending == FALSE) 
		nResult = 0 - nResult; 
 
	return nResult;//StrComp(&(pItem1->GetItemText()), &(pItem2->GetItemText())); 
} 
 
int CInfoCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	InsertColumn(IDS_INFO_DISK_PARTITION, &m_arrayDiskInfo); 
	InsertColumn(IDS_INFO_DISK_TOTALSPACE, &m_arrayDiskInfo); 
	InsertColumn(IDS_INFO_DISK_USAGE, &m_arrayDiskInfo); 
 
	InsertColumn(IDS_INFO_CONTAINS_FILESIZE, &m_arrayInfoItem); 
	InsertColumn(IDS_INFO_CONTAINS_FILECOUNT, &m_arrayInfoItem); 
	InsertColumn(IDS_INFO_CONTAINS_FOLDERCOUNT, &m_arrayInfoItem);	 
 
	InsertColumn(IDS_INFO_DISK_TOTALSPACE, &m_arrayRootItem); 
	InsertColumn(IDS_INFO_ALLOCATED, &m_arrayRootItem); 
	InsertColumn(IDS_INFO_DISK_USAGE, &m_arrayRootItem); 
	InsertColumn(IDS_INFO_CONTAINS_FILESIZE, &m_arrayRootItem); 
	InsertColumn(IDS_INFO_EFFICIENCY, &m_arrayRootItem);	 
	InsertColumn(IDS_INFO_CONTAINS_FILECOUNT, &m_arrayRootItem);	 
	InsertColumn(IDS_INFO_CONTAINS_FOLDERCOUNT, &m_arrayRootItem); 
 
	m_font.CreateFont(10, 0,0,0,FW_NORMAL, 0,0,0, 
		DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, 
		DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif"); 
 
	return 0; 
} 
 
void CInfoCtrl::ResetDriveValues() 
{ 
	m_strDriveTitle = _T(""); 
	m_strFolderTitle = _T(""); 
	int nCount = m_arrayDiskInfo.GetSize(); 
	CInfoCtrlItem* pItem; 
	 
	for (int i = 0; i < nCount; i++) 
	{ 
		pItem = m_arrayDiskInfo.GetAt(i); 
 
		pItem->m_nPercentData = -1; 
		pItem->m_strTextData = _T(""); 
	} 
} 
 
int CInfoCtrl::DrawItemArray(CDC *pDC, CRect rc, int nItem) 
{ 
	CInfoCtrlItem* pItem; 
 
	CInfoCtrlItemArray* pCurArray; 
	if (nItem == 0) 
		pCurArray = &m_arrayDiskInfo; 
	else if (nItem == 1) 
		pCurArray = &m_arrayInfoItem; 
	else  
		pCurArray = &m_arrayRootItem; 
 
	int nRealCount = 0; 
	int nCount = pCurArray->GetSize(); 
	for (int i = 0; i < nCount; i++) 
	{ 
		pItem = pCurArray->GetAt(i); 
		if ((pItem->m_nPercentData != -1) || (!pItem->m_strTextData.IsEmpty())) 
			nRealCount ++; 
 
	} 
 
	if (!nRealCount) 
		return 0; 
 
	CRect rcItem = rc; 
	rcItem.bottom = rcItem.top + _N_ITEMHEIGHT_; 
	// Draw Title bar 
	CString str; 
	if (nItem == 0) 
		str = m_strDriveTitle; 
	else if (nItem == 1) 
		str.LoadString(IDS_SELECTED_FOLDER); 
	else  
		str = m_strFolderTitle; 
		 
	pDC->DrawText(str, rcItem, DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_PATH_ELLIPSIS); 
 
	rcItem.DeflateRect(4,0); 
	rcItem.OffsetRect(0, _N_ITEMHEIGHT_ + 3*2); 
		 
	for (i = 0; i < nCount; i++) 
	{ 
		pItem = pCurArray->GetAt(i); 
		if (pItem->m_nPercentData != -1) 
		{ 
			DrawPercentItem(pDC, rcItem, pItem); 
			rcItem.OffsetRect(0, _N_ITEMHEIGHT_ + 3);			 
		}else if (!pItem->m_strTextData.IsEmpty()) 
		{ 
			DrawTextItem(pDC, rcItem, pItem); 
			rcItem.OffsetRect(0, _N_ITEMHEIGHT_ + 3);		 
		} 
 
	} 
	 
	rcItem.OffsetRect(0, -_N_ITEMHEIGHT_); 
	rcItem.InflateRect(4,0); 
	rcItem.top = rc.top + _N_ITEMHEIGHT_ + 1; 
	rcItem.bottom += 2; 
	if (nRealCount) 
		pDC->DrawEdge(rcItem, EDGE_ETCHED, BF_RECT); 
 
	return rcItem.bottom - rc.top; 
} 
 
void CDetailView::ShowMe() 
{ 
	 
	int nDetailStartup = AfxGetApp()->GetProfileInt("Settings", "DetailStartUpMode",   0); 
	CString strLastOpened = AfxGetApp()->GetProfileString("Settings", "DetailLastOpened",   ""); 
 
	CString str; 
	str.LoadString(IDS_SELECT_HERE); 
 
	if (m_strTitle.IsEmpty()) 
	{ 
		m_strTitle.LoadString(IDS_SELECT_HERE); 
		SetTitle(m_strTitle); 
	} 
 
	if (str.CompareNoCase(m_strTitle) == 0) 
	{ 
		switch (nDetailStartup) 
		{ 
		case 0: // Last opened 
			if (strLastOpened.IsEmpty()) 
				OnSelectFolder(); 
			else 
			{ 
				if (strLastOpened.Right(1) != "\\") 
					strLastOpened += "\\"; 
				 
				SetTitle(strLastOpened);				 
				SetCurrentFolder(strLastOpened); 
			} 
			break; 
		case 1: // Always ask 
			OnSelectFolder(); 
			break; 
		} 
		 
	}else 
	{ 
		if (m_strTitle.CompareNoCase(m_wndDiskTree.GetCurrentFolder()) != 0) 
		//if (!m_bScanFinished) 
		{ 
			SetTitle(m_strTitle); 
			SetCurrentFolder(m_strTitle); 
		} 
	}	 
} 
 
void CDetailView::OnDraw(CDC* pDC)  
{ 
	 
	 
} 
 
BOOL CDetailView::OnPreparePrinting(CPrintInfo* pInfo)  
{ 
	// default preparation 
	return m_wndDiskTree.OnPreparePrinting(pInfo, this); //Guess the # of pages 
	//return DoPreparePrinting(pInfo); 
} 
 
void CDetailView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)  
{ 
	CString str; 
	AfxGetMainWnd()->GetWindowText(str); 
	COleDateTime now = COleDateTime::GetCurrentTime(); 
	CString strDate = now.Format(LOCALE_NOUSEROVERRIDE, LANG_USER_DEFAULT); 
	m_wndDiskTree.OnBeginPrinting(pDC, pInfo, str, strDate); 
} 
 
void CDetailView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)  
{ 
	m_wndDiskTree.OnEndPrinting(pDC, pInfo);//Clean up those printing fonts 
} 
 
void CDetailView::OnPrint(CDC* pDC, CPrintInfo* pInfo)  
{ 
	m_wndDiskTree.OnPrint(pDC, pInfo); 
} 
 
void CDetailView::OnPrintPreview() 
{ 
	((CMainFrame*)AfxGetMainWnd())->EnableSwitchButton(FALSE); 
	//CView::OnFilePrintPreview(); 
	// need to use CMyPreviewView class 
	CPrintPreviewState* pState = new CPrintPreviewState; 
 
	if (!DoPrintPreview(IDD_PRINT_PREVIEW, this, RUNTIME_CLASS(CPreviewViewEx), pState)) 
	{ 
		TRACE0("Error: OnFileImprovedprintpreview failed.\n"); 
		AfxMessageBox(AFX_IDP_COMMAND_FAILURE); 
		delete pState;      // preview failed to initialize, delete State now 
	} 
} 
 
void CDetailView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView)  
{ 
	CView ::OnEndPrintPreview(pDC, pInfo, point, pView); 
 
	((CMainFrame*)AfxGetMainWnd())->EnableSwitchButton(TRUE); 
} 
 
void CDetailView::OnFileSelect()  
{ 
	OnSelectFolder(); 
} 
 
void CDetailView::OnUpdateRescan(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	 
} 
 
void CDetailView::OnUpdateFileSelect(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	 
} 
 
void CDetailView::OnDestroy()  
{ 
	AfxGetApp()->WriteProfileInt("Settings", "ShowChart", m_bShowChart); 
	AfxGetApp()->WriteProfileInt("Settings", "ShowInfoBar", m_bShowInfo); 
 
	AfxGetApp()->WriteProfileInt("Settings", "InfoWidth", m_nInfoWidth); 
	AfxGetApp()->WriteProfileInt("Settings", "InfoHeight", m_nInfoHeight); 
	 
	CView ::OnDestroy(); 
} 
 
void CDetailView::AutoResizeColumns() 
{ 
	m_wndDiskTree.ResizeColumns(TRUE); 
	 
	// Resize columns 
	int nCount = ((CHeaderCtrl*)m_wndChartInfo.GetDlgItem(0))->GetItemCount(); 
	CRect rc; 
	m_wndChartInfo.GetClientRect(&rc); 
	int nWidth = (rc.Width() - GetSystemMetrics(SM_CXHSCROLL)) / 2; 
	 
	int nSubWidth = nWidth/(nCount-1); 
	int nTotalSub = 0; 
	for (int i=1; i") + str + CString(""); 
 
		InsertHTMLCell(_T("bgcolor=\"#008080\""), strCell); 
    } 
	FinishHTMLRow(); 
 
 
	// Build the item tree 
	m_wndDiskTree.BuildTreeToHTML(); 
 
	FinishHTMLTable(); 
 
	InsertHTMLHLine(); 
 
	CString strOutput; 
	strOutput.LoadString(IDS_OUTPUT); 
	AddHTMLLine(strOutput); 
 
	FinishHTML(); 
 
	// Copy gif files to the new folder 
	TCHAR sDrive[_MAX_DRIVE]; 
	TCHAR sDir[_MAX_DIR]; 
	TCHAR sFname[_MAX_FNAME]; 
	TCHAR sExt[_MAX_EXT]; 
	_tsplitpath(strFile, sDrive, sDir, sFname, sExt); 
	 
	CString strTarget(CString(sDrive) + CString(sDir)); 
	int nLen = strTarget.GetLength(); 
	if (strTarget.GetAt(nLen-1) != _T('\\')) 
		strTarget += _T("\\"); 
	CString strSrc = GetHomeDirectory(); 
 
	CopyFile(strSrc+_T("images\\empty.gif"), strTarget+_T("empty.gif"), TRUE); 
	CopyFile(strSrc+_T("images\\file.gif"), strTarget+_T("file.gif"), TRUE); 
	CopyFile(strSrc+_T("images\\folder_c.gif"), strTarget+_T("folder_c.gif"), TRUE); 
	CopyFile(strSrc+_T("images\\folder_o.gif"), strTarget+_T("folder_o.gif"), TRUE); 
	CopyFile(strSrc+_T("images\\line.gif"), strTarget+_T("line.gif"), TRUE); 
	CopyFile(strSrc+_T("images\\linelast.gif"), strTarget+_T("linelast.gif"), TRUE); 
	CopyFile(strSrc+_T("images\\linever.gif"), strTarget+_T("linever.gif"), TRUE); 
 
	EndWaitCursor(); 
 
	GotoURL(CString(_T("file:///")) + strFile); 
} 
 
void CDetailView::OnToolsSafeclean()  
{ 
} 
 
void CDetailView::OnCollapseAll()  
{	 
	m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_SUBTRACT,0); 
} 
 
void CDetailView::OnExpandAll()  
{ 
	m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_MULTIPLY,0); 
} 
 
void CDetailView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	switch(nChar) 
	{ 
		case VK_MULTIPLY: 
			m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_MULTIPLY,0); 
			break; 
		case VK_ADD: 
			m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_ADD,0); 
			break; 
		case VK_SUBTRACT: 
			m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_SUBTRACT,0); 
			break; 
		default : 
			CView ::OnKeyDown(nChar, nRepCnt, nFlags); 
	}		 
} 
 
void CDetailView::OnUpdateSaveResult(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	 
} 
 
void CDetailView::OnUpdateFilePrint(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	 
} 
 
void CDetailView::OnUpdateFilePrintPreview(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	 
} 
 
BOOL CDetailView::OnHelpInfo(HELPINFO* pHelpInfo)  
{ 
	return TRUE; 
}