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