// LeftView.cpp : implementation of the CLeftView class // #include "stdafx.h" #include "FileSpyApp.h" #include "FileSpyDoc.h" #include "LeftView.h" #include "global.h" #include "protos.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CLeftView IMPLEMENT_DYNCREATE(CLeftView, CTreeView) BEGIN_MESSAGE_MAP(CLeftView, CTreeView) //{{AFX_MSG_MAP(CLeftView) ON_WM_RBUTTONDOWN() ON_WM_RBUTTONUP() ON_COMMAND(IDR_MENUATTACH, OnMenuattach) ON_COMMAND(IDR_MENUDETACH, OnMenudetach) ON_COMMAND(IDR_MENUATTACHALL, OnMenuattachall) ON_COMMAND(IDR_MENUDETACHALL, OnMenudetachall) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CLeftView construction/destruction CLeftView::CLeftView() { // TODO: add construction code here m_pImageList = new CImageList; m_pImageList->Create(IDB_DRIVEIMAGELIST,16,0,RGB(255,255,255)); nRButtonSet = 0; pLeftView = (LPVOID) this; } CLeftView::~CLeftView() { if (m_pImageList) { delete m_pImageList; } } BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS; return CTreeView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CLeftView drawing void CLeftView::OnDraw(CDC* pDC) { UNREFERENCED_PARAMETER( pDC ); CFileSpyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here } void CLeftView::OnInitialUpdate() { CTreeView::OnInitialUpdate(); // TODO: You may populate your TreeView with items by directly accessing // its tree control through a call to GetTreeCtrl(). USHORT ti; WCHAR sDriveString[30]; // // Set the image list first // GetTreeCtrl().SetImageList(m_pImageList, TVSIL_NORMAL); // // Add a root node and name it "FileSpy" // hRootItem = GetTreeCtrl().InsertItem(L"FileSpy", IMAGE_SPY, IMAGE_SPY); // // Add drive names to LeftView // for (ti = 0; ti < nTotalDrives; ti++) { switch (VolInfo[ti].nType) { case DRIVE_FIXED: wcscpy( sDriveString, L"[ :] Local Disk" ); break; case DRIVE_REMOTE: wcscpy( sDriveString, L"[ :] Remote" ); break; case DRIVE_REMOVABLE: wcscpy( sDriveString, L"[ :] Removable" ); break; case DRIVE_CDROM: wcscpy( sDriveString, L"[ :] CD-ROM" ); break; default: wcscpy( sDriveString, L"[ :] Unknown" ); break; } sDriveString[1] = VolInfo[ti].nDriveName; GetTreeCtrl().InsertItem( sDriveString, VolInfo[ti].nImage, VolInfo[ti].nImage, hRootItem ); } GetTreeCtrl().Expand(hRootItem, TVE_EXPAND); } ///////////////////////////////////////////////////////////////////////////// // CLeftView diagnostics #ifdef _DEBUG void CLeftView::AssertValid() const { CTreeView::AssertValid(); } void CLeftView::Dump(CDumpContext& dc) const { CTreeView::Dump(dc); } CFileSpyDoc* CLeftView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFileSpyDoc))); return (CFileSpyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CLeftView message handlers void CLeftView::OnRButtonDown(UINT nFlags, CPoint point) { UNREFERENCED_PARAMETER( nFlags ); UNREFERENCED_PARAMETER( point ); // TODO: Add your message handler code here and/or call default nRButtonSet = 1; // CTreeView::OnRButtonDown(nFlags, point); } void CLeftView::OnRButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default HTREEITEM hItem; CMenu menu, *menupopup; RECT rect; UINT ret; hItem = GetTreeCtrl().HitTest(point); if (hItem != NULL && hItem != hRootItem && nRButtonSet) { GetTreeCtrl().SelectItem(hItem); menu.LoadMenu(IDR_LEFTVIEWMENU); menupopup = menu.GetSubMenu(0); GetWindowRect(&rect); if (VolInfo[GetAssociatedVolumeIndex(hItem)].bHook) { ret = menupopup->EnableMenuItem(IDR_MENUATTACH, MF_DISABLED|MF_GRAYED); ret = menupopup->EnableMenuItem(IDR_MENUDETACH, MF_ENABLED); } else { ret = menupopup->EnableMenuItem(IDR_MENUATTACH, MF_ENABLED); ret = menupopup->EnableMenuItem(IDR_MENUDETACH, MF_DISABLED|MF_GRAYED); } menupopup->TrackPopupMenu(TPM_LEFTALIGN, rect.left+point.x, rect.top+point.y, this); CTreeView::OnRButtonUp(nFlags, point); } else { if (hItem != NULL && hItem == hRootItem && nRButtonSet) { GetTreeCtrl().SelectItem(hItem); menu.LoadMenu(IDR_LEFTVIEWSPYMENU); menupopup = menu.GetSubMenu(0); GetWindowRect(&rect); ret = menupopup->EnableMenuItem(IDR_MENUATTACHALL, MF_ENABLED); ret = menupopup->EnableMenuItem(IDR_MENUDETACHALL, MF_ENABLED); menupopup->TrackPopupMenu(TPM_LEFTALIGN, rect.left+point.x, rect.top+point.y, this); CTreeView::OnRButtonUp(nFlags, point); } } nRButtonSet = 0; } void CLeftView::OnMenuattach() { // TODO: Add your command handler code here HTREEITEM hItem; hItem = GetTreeCtrl().GetSelectedItem(); if (AttachToDrive(VolInfo[GetAssociatedVolumeIndex(hItem)].nDriveName)) { VolInfo[GetAssociatedVolumeIndex(hItem)].bHook = TRUE; GetTreeCtrl().SetItemImage( hItem, VolInfo[GetAssociatedVolumeIndex(hItem)].nImage+IMAGE_ATTACHSTART, VolInfo[GetAssociatedVolumeIndex(hItem)].nImage+IMAGE_ATTACHSTART ); } } void CLeftView::OnMenudetach() { // TODO: Add your command handler code here HTREEITEM hItem; hItem = GetTreeCtrl().GetSelectedItem(); if (DetachFromDrive(VolInfo[GetAssociatedVolumeIndex(hItem)].nDriveName)) { VolInfo[GetAssociatedVolumeIndex(hItem)].bHook = 0; GetTreeCtrl().SetItemImage(hItem, VolInfo[GetAssociatedVolumeIndex(hItem)].nImage, \ VolInfo[GetAssociatedVolumeIndex(hItem)].nImage); } } void CLeftView::OnMenuattachall() { // TODO: Add your command handler code here USHORT ti; HTREEITEM hItem; for (ti = 0; ti < nTotalDrives; ti++) { if (AttachToDrive(VolInfo[ti].nDriveName)) { VolInfo[ti].bHook = TRUE; hItem = GetAssociatedhItem(VolInfo[ti].nDriveName); if (hItem) { GetTreeCtrl().SetItemImage(hItem, VolInfo[ti].nImage+IMAGE_ATTACHSTART, \ VolInfo[ti].nImage+IMAGE_ATTACHSTART); } } } } void CLeftView::OnMenudetachall() { // TODO: Add your command handler code here USHORT ti; HTREEITEM hItem; for (ti = 0; ti < nTotalDrives; ti++) { if (DetachFromDrive(VolInfo[ti].nDriveName)) { VolInfo[ti].bHook = FALSE; hItem = GetAssociatedhItem(VolInfo[ti].nDriveName); if (hItem) { GetTreeCtrl().SetItemImage(hItem, VolInfo[ti].nImage, VolInfo[ti].nImage); } } } } /* void CLeftView::OnMenuscannewvolume() { // TODO: Add your command handler code here VOLINFO NewVol[26]; DWORD nNewTotalDrives; USHORT ti, tj; HTREEITEM hItem; BuildDriveTable(NewVol, nNewTotalDrives); // We should remember the old hook status for (ti = 0; ti < nNewTotalDrives; ti++) { for (tj = 0; tj < nTotalDrives; tj++) { if (NewVol[ti].nDriveName == VolInfo[tj].nDriveName) { NewVol[ti].nHook = VolInfo[tj].nHook; break; } } } } */ USHORT CLeftView::GetAssociatedVolumeIndex(HTREEITEM hItem) { CString cs; USHORT ti; PWCHAR sDriveString; cs = GetTreeCtrl().GetItemText(hItem); sDriveString = cs.GetBuffer(20); for (ti = 0; ti < nTotalDrives; ti++) { if (VolInfo[ti].nDriveName == sDriveString[1]) { return ti; } } return 0; // still a valid value but this will not happen } HTREEITEM CLeftView::GetAssociatedhItem(WCHAR cDriveName) { HTREEITEM hItem; CString cs; PWCHAR sDriveString; hItem = GetTreeCtrl().GetChildItem(hRootItem); while (hItem) { cs = GetTreeCtrl().GetItemText(hItem); sDriveString = cs.GetBuffer(20); if (cDriveName == sDriveString[1]) { break; } hItem = GetTreeCtrl().GetNextSiblingItem(hItem); } return hItem; } void CLeftView::UpdateImage(void) { USHORT ti; HTREEITEM hItem; for (ti = 0; ti < nTotalDrives; ti++) { hItem = GetAssociatedhItem(VolInfo[ti].nDriveName); GetTreeCtrl().SetItemImage(hItem, VolInfo[ti].nImage, VolInfo[ti].nImage); } }