//-----------------------------------------------------------------------------------------------------------------
//WTLExplorer : WTLized version of the explorer sample from MSDN.
// Use this code at your own risk. We wrote it just for fun :-)
// Tested *only* on Win2k. Requires Platform SDK headers.
//
//
//-----------------------------------------------------------------------------------------------------------------
#include "stdafx.H"
#include "MainFrm.H"
#include "atlctrlx.H"
//----------------------------------------------------------------------------------------------------
void CMainFrame::InitTreeView()
{
CComPtr<IShellFolder> spFolder;
HRESULT hr = SHGetDesktopFolder(&spFolder);
if(FAILED(hr)) return ;
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(SHFILEINFO));
HIMAGELIST hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)_T("C:\\"),
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
// Attach ImageList to TreeView
if (hImageList && m_wndFolderTree.m_wndContained.IsWindow())
m_wndFolderTree.m_wndContained.SetImageList(hImageList,0);
CWaitCursor wait;
FillTreeView(spFolder,NULL,TVI_ROOT);
m_wndFolderTree.m_wndContained.Expand(m_wndFolderTree.m_wndContained.GetRootItem());
m_wndFolderTree.m_wndContained.SelectItem(m_wndFolderTree.m_wndContained.GetRootItem());
return ;
}
//----------------------------------------------------------------------------------------------------
void CMainFrame::InitListView()
{
// Insert columns
m_wndListView.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 200, 0);
m_wndListView.InsertColumn(1, _T("Size"), LVCFMT_RIGHT, 100, 1);
m_wndListView.InsertColumn(2, _T("Type"), LVCFMT_LEFT, 100, 2);
m_wndListView.InsertColumn(3, _T("Modified"), LVCFMT_LEFT, 100, 3);
m_wndListView.InsertColumn(4, _T("Attributes"), LVCFMT_RIGHT, 100, 4);
// Get system image lists
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(SHFILEINFO));
HIMAGELIST hImageList = (HIMAGELIST)::SHGetFileInfo( _T("c:\\"), 0, &sfi,
sizeof(sfi),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
ATLASSERT(hImageList != NULL);
if(hImageList != NULL)
m_wndListView.SetImageList(hImageList, LVSIL_SMALL);
memset(&sfi, 0, sizeof(SHFILEINFO));
hImageList = (HIMAGELIST)::SHGetFileInfo(_T("c:\\"), 0, &sfi, sizeof(sfi),SHGFI_SYSICONINDEX | SHGFI_ICON);
ATLASSERT(hImageList != NULL);
if(hImageList != NULL)
m_wndListView.SetImageList(hImageList, LVSIL_NORMAL);
}
//--------------------------------------------------------------------------------------
BOOL CMainFrame::InitComboBox()
{
HIMAGELIST himlSmall = 0;
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(SHFILEINFO));
himlSmall = (HIMAGELIST)SHGetFileInfo((LPCSTR)_T("C:\\"),
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
if (himlSmall)
{
m_wndCombo.SetImageList(himlSmall);
return TRUE;
}
return FALSE;
}
//----------------------------------------------------------------------------------------------------------
BOOL CMainFrame::FillComboBox(LPNMTREEVIEW lpTV, IShellFolder* pShellFolder)
{
m_wndCombo.ResetContent();
CWaitCursor wait;
HTREEITEM hItem = lpTV->itemNew.hItem;
HRESULT hr = S_OK;
int nLevel = 0;
while(hItem)
{
nLevel++;
hItem = m_wndFolderTree.m_wndContained.GetParentItem(hItem);
}
int nIndent = nLevel;
int nIndex = nLevel;
hItem = lpTV->itemNew.hItem;
HTREEITEM hPrevItem1 = hItem;
HTREEITEM hPrevItem2 = NULL;
while(hItem)
{
FillComboItem(hItem, 0, nIndent--);
hPrevItem2 = hPrevItem1;
hPrevItem1 = hItem;
hItem = m_wndFolderTree.m_wndContained.GetParentItem(hItem);
}
bool bInsertAfter = false;
HTREEITEM hRootItem = m_wndFolderTree.m_wndContained.GetRootItem();
if(hRootItem != hPrevItem1)
FillComboItem(hRootItem, 0, 1);
hItem = m_wndFolderTree.m_wndContained.GetChildItem(hRootItem);
nIndex = 1;
while(hItem)
{
if(hItem != hPrevItem1 && hItem != hPrevItem2)
FillComboItem(hItem, (bInsertAfter? -1 : nIndex++), 2);
else
bInsertAfter = true;
hItem = m_wndFolderTree.m_wndContained.GetNextSiblingItem(hItem);
}
hItem = m_wndFolderTree.m_wndContained.GetNextSiblingItem(hRootItem);
while(hItem)
{
if(hItem != hPrevItem1 && hItem != hPrevItem2)
FillComboItem(hItem, (bInsertAfter? -1: nIndex++), 1);
else
bInsertAfter = true;
hItem = m_wndFolderTree.m_wndContained.GetNextSiblingItem(hItem);
}
for(int n = 0; n < m_wndCombo.GetCount(); n++)
{
if(m_wndCombo.GetItemData(n) == (DWORD_PTR)lpTV->itemNew.hItem)
{
m_wndCombo.SetCurSel(n);
/*LPTVITEMDATA lptvid=(LPTVITEMDATA)lpTV->itemNew.lParam;
TCHAR psz[MAX_PATH];
GetName(lptvid->spParentFolder, lptvid->lpi, SHGDN_FORPARSING, psz);
if( StrChr(psz,_T('{')) ) //special case
GetName(lptvid->spParentFolder, lptvid->lpi, SHGDN_NORMAL, psz);
int nImage = 0;
int nSelectedImage = 0;
m_wndFolderTree.m_wndContained.GetItemImage(lpTV->itemNew.hItem,nImage,nSelectedImage);
COMBOBOXEXITEM cbei;
cbei.mask = CBEIF_TEXT | CBEIF_INDENT |CBEIF_IMAGE| CBEIF_SELECTEDIMAGE;
cbei.iItem = -1; //Editbox of the comboboxex
cbei.pszText = psz;
cbei.cchTextMax = MAX_PATH;
if(m_wndFolderTree.m_wndContained.ItemHasChildren(lpTV->itemNew.hItem))
{
cbei.iImage = nImage;
cbei.iSelectedImage = nImage;
}
else
{
cbei.iImage = nSelectedImage;
cbei.iSelectedImage = nSelectedImage;
}
cbei.iIndent = 1;
m_wndCombo.SetItem(&cbei);*/
break;
}
}
return TRUE;
}
//---------------------------------------------------------------------------------------------------------
BOOL CMainFrame::FillComboItem(HTREEITEM hItem, int nIndex, int nIndent)
{
TVITEM tvi;
LPTVITEMDATA lptvid = NULL;
LPITEMIDLIST lpifq = NULL;
HTREEITEM hParent = m_wndFolderTree.m_wndContained.GetParentItem(hItem);
if(hParent)
{
tvi.hItem = hParent;
tvi.mask = TVIF_PARAM;
m_wndFolderTree.m_wndContained.GetItem(&tvi);
lptvid = (LPTVITEMDATA)tvi.lParam;
lpifq = lptvid->lpifq;
}
tvi.hItem = hItem;
tvi.mask = TVIF_PARAM;
m_wndFolderTree.m_wndContained.GetItem(&tvi);
lptvid = (LPTVITEMDATA)tvi.lParam;
CComPtr<IShellFolder> spFolder;
TCHAR szBuff[256];
HRESULT hr = GetName(lptvid->spParentFolder,lptvid->lpi,SHGDN_FORADDRESSBAR,szBuff);
if(FAILED(hr)) return hr;
COMBOBOXEXITEM cbei;
cbei.mask = CBEIF_TEXT | CBEIF_INDENT |CBEIF_IMAGE| CBEIF_SELECTEDIMAGE | CBEIF_LPARAM;
cbei.pszText = szBuff;
cbei.cchTextMax = MAX_PATH;
LPITEMIDLIST lpifqThisItem = ConcatPidls(lpifq, lptvid->lpi);
//Now, make a copy of the ITEMIDLIST
GetNormalAndSelectedIcons(lpifqThisItem, &tvi);
cbei.iItem = nIndex;
cbei.iImage = tvi.iImage;
cbei.iSelectedImage = tvi.iSelectedImage;
cbei.iIndent = nIndent;
cbei.lParam = (LPARAM)hItem;
m_wndCombo.SendMessage(CBEM_INSERTITEM, 0, (LPARAM)&cbei);
return TRUE;
}
//----------------------------------------------------------------------------------------------------------
BOOL CMainFrame::FillListView(LPTVITEMDATA lptvid, IShellFolder* pShellFolder, SHCONTF shFlag)
{
if(!pShellFolder) return E_POINTER;
CComPtr<IMalloc> spMalloc;
HRESULT hr = SHGetMalloc(&spMalloc);
if (FAILED(hr)) return FALSE;
CComPtr<IEnumIDList> spEnumIDList;
hr=pShellFolder->EnumObjects(m_wndListView.GetParent(),shFlag, &spEnumIDList);
if (FAILED(hr)) return FALSE;
LPITEMIDLIST lpifqThisItem = NULL;
LPITEMIDLIST lpi = NULL;
LPLVITEMDATA lplvid;
ULONG ulFetched =0;
LV_ITEM lvi;
int nCounter = 0;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
while (S_OK==spEnumIDList->Nex