176 lines
3.7 KiB
C++
176 lines
3.7 KiB
C++
// HisTreeCtrl.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "HisTreeCtrl.h"
|
|
#include "HistoryTree.h"
|
|
#include "MainFrm.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// CHisTreeCtrl
|
|
|
|
CHisTreeCtrl::CHisTreeCtrl()
|
|
{
|
|
}
|
|
|
|
CHisTreeCtrl::~CHisTreeCtrl()
|
|
{
|
|
m_astrHist.RemoveAll();
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CHisTreeCtrl, CTreeCtrl)
|
|
//{{AFX_MSG_MAP(CHisTreeCtrl)
|
|
ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
|
|
ON_WM_MOUSEMOVE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CHisTreeCtrl message handlers
|
|
|
|
|
|
void CHisTreeCtrl::OnClick(NMHDR* /*pNMHDR*/, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
HTREEITEM hItem;
|
|
|
|
CPoint pt;
|
|
try{
|
|
|
|
GetCursorPos(&pt);
|
|
ScreenToClient(&pt);
|
|
hItem = HitTest(pt);
|
|
|
|
if ((hItem != NULL) && !ItemHasChildren(hItem))
|
|
{
|
|
int nImg, nOImg;
|
|
GetItemImage(hItem, nImg, nOImg);
|
|
if(nImg==2)
|
|
{
|
|
OpenWindow(m_astrHist[GetItemData(hItem)-1]);
|
|
}
|
|
else
|
|
{
|
|
//get folder
|
|
LPITEMIDLIST pidlHistory = NULL;
|
|
|
|
HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_HISTORY, &pidlHistory);
|
|
if (NOERROR != hr)
|
|
return;
|
|
|
|
IShellFolder* psfDesktop;
|
|
IShellFolder* psfHistory;
|
|
|
|
hr = SHGetDesktopFolder(&psfDesktop);
|
|
if (NOERROR != hr)
|
|
return;
|
|
|
|
hr = psfDesktop->BindToObject(pidlHistory, NULL, IID_IShellFolder,
|
|
(LPVOID*)&psfHistory);
|
|
psfDesktop->Release();
|
|
|
|
if (NOERROR != hr)
|
|
return;
|
|
|
|
HTREEITEM hDayItem;
|
|
hDayItem = GetParentItem(hItem);
|
|
if(hDayItem == NULL)
|
|
hDayItem = hItem;
|
|
|
|
CString folder = GetItemText(hDayItem);
|
|
LPITEMIDLIST pidlSubFolder = FindFolder(folder, psfHistory);
|
|
if(pidlSubFolder!=NULL)
|
|
{
|
|
IShellFolder* psfSubFolder = NULL;
|
|
IShellFolder* psfSubFolder2 = NULL;
|
|
hr = psfHistory->BindToObject(pidlSubFolder, NULL, IID_IShellFolder,
|
|
(LPVOID*)&psfSubFolder);
|
|
|
|
if( hDayItem != hItem)
|
|
{
|
|
if (pidlSubFolder)
|
|
((CHistoryTree*)m_pHisTree)->m_pMalloc->Free(pidlSubFolder);
|
|
|
|
folder = GetItemText(hItem);
|
|
pidlSubFolder = FindFolder(folder, psfSubFolder);
|
|
//psfSubFolder->Release();
|
|
hr = psfSubFolder->BindToObject(pidlSubFolder, NULL, IID_IShellFolder,
|
|
(LPVOID*)&psfSubFolder2);
|
|
}
|
|
if(nImg ==0)
|
|
((CHistoryTree*)m_pHisTree)->AddHistory(psfSubFolder, hItem, 1,3);
|
|
else
|
|
((CHistoryTree*)m_pHisTree)->AddHistory(psfSubFolder2, hItem, 2,2);
|
|
|
|
if(psfSubFolder)
|
|
psfSubFolder ->Release();
|
|
if(psfSubFolder2)
|
|
psfSubFolder2 ->Release();
|
|
}
|
|
|
|
((CHistoryTree*)m_pHisTree)->m_pMalloc->Free(pidlSubFolder);
|
|
((CHistoryTree*)m_pHisTree)->m_pMalloc->Free(pidlHistory);
|
|
|
|
psfHistory->Release();
|
|
|
|
Expand(hItem,TVE_TOGGLE);
|
|
}
|
|
}
|
|
else
|
|
Expand(hItem,TVE_TOGGLE);
|
|
|
|
}catch(...)
|
|
{
|
|
}
|
|
|
|
*pResult = 0;
|
|
|
|
}
|
|
|
|
LPITEMIDLIST CHisTreeCtrl::FindFolder(LPCTSTR foldername, IShellFolder *pFolder)
|
|
{
|
|
IEnumIDList* pItems = NULL;
|
|
LPITEMIDLIST pidlNext = NULL;
|
|
CString lpszName;
|
|
|
|
HRESULT hr = pFolder->EnumObjects(NULL, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS, &pItems);
|
|
while (NOERROR == hr)
|
|
{
|
|
hr = pItems->Next(1, &pidlNext, NULL);
|
|
if (NOERROR == hr)
|
|
{
|
|
m_pHisTree->GetName(pFolder, pidlNext, SHGDN_NORMAL, lpszName);
|
|
|
|
if(_tcscmp(foldername, lpszName)==0)
|
|
{
|
|
if (pItems)
|
|
pItems->Release();
|
|
return pidlNext;
|
|
}
|
|
else if (pidlNext)
|
|
{
|
|
((CHistoryTree*)m_pHisTree)->m_pMalloc->Free(pidlNext);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if (pItems)
|
|
pItems->Release();
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
void CHisTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
CTreeCtrl::OnMouseMove(nFlags, point);
|
|
}
|
|
|