Click here to Skip to main content
15,881,687 members
Articles / Desktop Programming / MFC

Enumdesk Clones

Rate me:
Please Sign up or sign in to vote.
4.90/5 (19 votes)
9 May 20036 min read 139.2K   3.9K   41  
Eunumdesk Clones
/************************************************
   THIS CODE AND INFORMATION IS PROVIDED 'AS IS' 
   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO
   THE IMPLIED WARRANTIES OF MERCHANTABILITY 
   AND/OR FITNESS FOR A PARTICULAR PURPOSE.
   Author: Barretto VN  7/2002
*************************************************/


#include "Windows.h"
#include <commctrl.h>
#include "Resource.h"
#include "CCSplitter.h"
#include "ListView.h"
#include "lptvid.h"

int  giRowCtr = 0;

HWND	CreateListView (HINSTANCE appInstance, 
						HWND	hParent, 
						HWND hSplitter)		// Parent window handle
{
    DWORD dwStyle;

	dwStyle =   WS_TABSTOP | 
		        WS_CHILD | 
				WS_BORDER | 
				LVS_AUTOARRANGE | 
				LVS_REPORT | 
				LVS_EDITLABELS | 
				LVS_SHAREIMAGELISTS | 
				WS_VISIBLE;

	hWndListView = CreateWindowEx (
	                               WS_EX_CLIENTEDGE,		// Extended window style
	                               WC_LISTVIEW,			// Window class name
	                               "",		// Window name
	                               dwStyle, // Window style
	                               0, 0, 0, 0,			// Position & size
	                               hParent,			// Parent window handle
	                               (HMENU)ID_LISTVIEW,			// Menu handle
	                               appInstance,		// Application instance
	                               0);				// Parameter

	if (hWndListView == NULL) 
	{
	    MessageBox (0, "failed to create ListView", NULL, MB_ICONSTOP|MB_OK);
	    return NULL;
	}

	CCsplitter_SetHandle (hSplitter, 1, hWndListView);
	InitListView(hWndListView);

	return hWndListView;
}

BOOL InitListView(HWND hwnd) 
{ 
#define TOTAL_COLS 4
LV_COLUMN   lvColumn; 
int         i; 
TCHAR       szString[TOTAL_COLS][20] = {"Name", "Type", "Size", "Modified"};  
int         szColWidth[TOTAL_COLS] = {120, 80 , 60, 110};
	//empty the list 
	ListView_DeleteAllItems(hwnd);  //initialize the columns 
	lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvColumn.fmt = LVCFMT_LEFT; 

	for(i = 0; i < TOTAL_COLS; i++)    
	{    
		lvColumn.pszText = szString[i];    
		lvColumn.cx = szColWidth[i];
		ListView_InsertColumn(hwnd, i, &lvColumn);    
	}  
  
	return TRUE; 
}  

BOOL InsertListViewItem(LPSHELLFOLDER lpsf, 
					    LPITEMIDLIST lpi,
					    LPITEMIDLIST lpifq)
{

char szBuff[MAX_PATH];
LPMALLOC lpMalloc;
LPTVITEMDATA* lptvid = NULL;
LPITEMIDLIST pidl = NULL;	
	
	UINT uFlags;
	LV_ITEM lvi;
	
	lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;

	GetName (lpsf, lpi, SHGDN_NORMAL, szBuff);

	lvi.iItem = giRowCtr++;
	lvi.iSubItem = 0 ; //COL_NAME;
	lvi.pszText =  LPSTR_TEXTCALLBACK; //szBuff; // LPSTR_TEXTCALLBACK;
//	lvi.cchTextMax = MAX_PATH;
	uFlags = SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON;

    SHGetMalloc(&lpMalloc);
	lptvid = (LPTVITEMDATA*) lpMalloc->lpVtbl->Alloc (lpMalloc, sizeof (LPTVITEMDATA));
	pidl =  Concatenate(lpMalloc, lpifq,lpi);

	lvi.iImage = GetNormalIcon(pidl);  //I_IMAGECALLBACK;
	lptvid->lpsfParent = lpsf;
	lptvid->lpi = CopyItemID(lpMalloc, lpi);
	lptvid->lpifq = pidl; //csc.CopyItemID(lpMalloc, pidl);
	lvi.lParam = (LPARAM)lptvid;
	ListView_InsertItem (hWndListView, &lvi);
	lpMalloc->lpVtbl->Release(lpMalloc);

	return TRUE;
}

void    PopulateList(TV_ITEM tvi)
{
LPTVITEMDATA* lptvid = NULL;
HTREEITEM hItem = NULL;
HRESULT hr;
LPENUMIDLIST lpe = NULL;	
ULONG celtFetched;
LPITEMIDLIST pidlItems = NULL;
LPENUMIDLIST ppenum = NULL;
IShellFolder *psfProgFiles = NULL;
LPMALLOC m_pMalloc;
WIN32_FIND_DATA fd;

    hr = SHGetMalloc(&m_pMalloc);

	if(FAILED(hr))
		return;

    lptvid = (LPTVITEMDATA*) m_pMalloc->lpVtbl->Alloc (m_pMalloc, sizeof (LPTVITEMDATA));
	if (! lptvid)
	{
		return; // Error - could not allocate memory
	}

	lptvid = (LPTVITEMDATA*)tvi.lParam;
	if(lptvid == NULL)
		return;

	if(lptvid->bRoot)
		psfProgFiles = lptvid->lpsfParent;
	else
	{
		hr = lptvid->lpsfParent->lpVtbl->BindToObject(lptvid->lpsfParent , lptvid->lpi, NULL, &IID_IShellFolder, (LPVOID *) &psfProgFiles);
		if(FAILED(hr))
				return;
	}

    hr = psfProgFiles->lpVtbl->EnumObjects(psfProgFiles, NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN , &ppenum);
	if(FAILED(hr))
		return;

	SetCursor(LoadCursor(NULL,IDC_WAIT));
	
	SendMessage(hWndListView, WM_SETREDRAW, FALSE, 0L);

	ListView_DeleteAllItems(hWndListView);
	giRowCtr = 0;

	while( hr = ppenum->lpVtbl->Next(ppenum, 1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
    {
		ULONG uAttr = SFGAO_FOLDER;
		psfProgFiles->lpVtbl->GetAttributesOf(psfProgFiles, 1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
		SHGetDataFromIDList(psfProgFiles, pidlItems, SHGDFIL_FINDDATA , &fd, sizeof(WIN32_FIND_DATA));
		if (
			!(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) &&
			!(uAttr & SFGAO_FOLDER)
		   )
				InsertListViewItem(psfProgFiles , pidlItems , lptvid->lpifq);
    }

	m_pMalloc->lpVtbl->Release(m_pMalloc);
	SetCursor(LoadCursor(NULL,IDC_ARROW));
	SendMessage(hWndListView, WM_SETREDRAW, TRUE, 0L);
	InvalidateRect(hWndListView, NULL, TRUE);

}

void onViewStyle(UINT uiStyle, HWND hWndMain)
{
	DWORD dwStyle = GetWindowLong(hWndListView, GWL_STYLE);
	dwStyle &= ~LVS_TYPEMASK;

	CheckMenuItem (GetMenu (hWndMain), IDM_VIEW_LARGEICONS , uiStyle == IDM_VIEW_LARGEICONS ? MF_CHECKED : MF_UNCHECKED);
	CheckMenuItem (GetMenu (hWndMain), IDM_VIEW_SMALLICONS , uiStyle == IDM_VIEW_SMALLICONS ? MF_CHECKED : MF_UNCHECKED);
	CheckMenuItem (GetMenu (hWndMain), IDM_VIEW_LIST       , uiStyle == IDM_VIEW_LIST       ? MF_CHECKED : MF_UNCHECKED);
	CheckMenuItem (GetMenu (hWndMain), IDM_VIEW_DETAIL     , uiStyle == IDM_VIEW_DETAIL    ? MF_CHECKED : MF_UNCHECKED);

	switch (uiStyle)
	{
	case IDM_VIEW_LARGEICONS:
		dwStyle |= LVS_ICON;
		break;
	case IDM_VIEW_SMALLICONS:
		dwStyle |= LVS_SMALLICON;
		break;
	case IDM_VIEW_LIST:
		dwStyle |= LVS_LIST;
		break;
	case IDM_VIEW_DETAIL:
		dwStyle |= LVS_REPORT;
		break;
	default:
		return;
	}
	SetWindowLong(hWndListView, GWL_STYLE, dwStyle);
}


BOOL ShowPopupStyleMenu(HINSTANCE appInstance)
{
static POINT point;
HMENU m_hMenu;
UINT id;
HMENU hMenuTrackPopup;

	GetCursorPos(&point);
	m_hMenu = LoadMenu( appInstance, MAKEINTRESOURCE(IDR_VIEW_POPUP));
	hMenuTrackPopup = GetSubMenu (m_hMenu, 0);
	id = TrackPopupMenu(hMenuTrackPopup, 
	          TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON, 
              point.x, point.y,0,
              hWndListView, NULL);

	onViewStyle(id, hWndListView);
	DestroyMenu(m_hMenu);

	return TRUE;
}

BOOL ShowStdMenu(LVITEM lvi , BOOL bShowMenu, HINSTANCE appInstance)
{
HRESULT hr;
HMENU hMenuPopup;
IContextMenu   *icm;
LPMALLOC m_pMalloc;
LPTVITEMDATA* lptvid = NULL;
UINT  id;
static POINT pt;
CMINVOKECOMMANDINFO  ici;

	if(!lvi.lParam)
	{
		// Click on an empty area of Listview
		ShowPopupStyleMenu(appInstance);		
		return TRUE;
	}

    hr = SHGetMalloc(&m_pMalloc);

	if(FAILED(hr))
		return FALSE;

    lptvid = (LPTVITEMDATA*) m_pMalloc->lpVtbl->Alloc (m_pMalloc, sizeof (LPTVITEMDATA));
	if (! lptvid)
		goto Done;


	lptvid = (LPTVITEMDATA*)lvi.lParam;
	if(lptvid == NULL)
		goto Done;

	hr = lptvid->lpsfParent->lpVtbl->GetUIObjectOf(
		                       lptvid->lpsfParent, 
		                       hWndListView, 
                               1, 
                               (LPCITEMIDLIST*)&lptvid->lpi,
                               &IID_IContextMenu, 
                               NULL, 
                               (LPVOID*)&icm);

    hMenuPopup = CreatePopupMenu();
    if(!hMenuPopup)
		goto Done;

    hr = icm->lpVtbl->QueryContextMenu(icm , hMenuPopup, 0, 1, 0x7fff, CMF_NORMAL | CMF_EXPLORE);
    if(FAILED(hr))
		goto Done;

    GetCursorPos(&pt);

	if(bShowMenu)
		id = TrackPopupMenu(hMenuPopup, 
                  TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON, 
                  pt.x, pt.y,0,
                  hWndListView,NULL);
	else
		// User Double-clicked on menu item, 
		// so we don't show the menu
		// and execute the command
		id = hr;


	if(!id)
		goto Done;


    ici.cbSize = sizeof(CMINVOKECOMMANDINFO);
    ici.fMask = 0;
    ici.hwnd = hWndListView;
    ici.lpVerb = (LPCSTR)(INT_PTR)(id - 1);
    ici.lpParameters = NULL;
    ici.lpDirectory = NULL;
    ici.nShow = SW_SHOWNORMAL;
    ici.dwHotKey = 0;
    ici.hIcon = NULL;
    hr = icm->lpVtbl->InvokeCommand(icm , &ici);

Done:
m_pMalloc->lpVtbl->Release(m_pMalloc);
return TRUE;

}

BOOL GetSelectedItem(LPNMHDR lpnmh , LV_ITEM* lvItem)
{
	LPNMLISTVIEW   lpnmlv = (LPNMLISTVIEW)lpnmh;
    lvItem->mask = LVIF_PARAM;
	lvItem->iItem = lpnmlv->iItem;
	if(ListView_GetItem(hWndListView, lvItem))
		return TRUE;
	else
		return FALSE;
}

void setDisplayInfo(LV_DISPINFO *lpdi)
{
LPMALLOC m_pMalloc;
HRESULT hr;
LPTVITEMDATA* pData = NULL;
char refTime[20];
WIN32_FIND_DATA fd;
SYSTEMTIME st;
STRRET srName;

//	LPITEMIDLIST pidl = (LPITEMIDLIST)lpdi->item.lParam;
	lpdi->item.mask |= LVIF_DI_SETITEM;	// dont ask us again
//	LPMYPIDLDATA pData = m_pPidlMgr->GetDataPointer(pidl);
//	if(!pData)
//		return;

    hr = SHGetMalloc(&m_pMalloc);

	if(FAILED(hr))
		return;

    pData = (LPTVITEMDATA*) m_pMalloc->lpVtbl->Alloc (m_pMalloc, sizeof (LPTVITEMDATA));
	if (! pData)
	{
		return; // Error - could not allocate memory
	}

	pData = (LPTVITEMDATA*)lpdi->item.lParam;
	if(pData == NULL)
		return;

	if(lpdi->item.iSubItem)	// Subitem information being requested
	{
		//is the text being requested?
		if(lpdi->item.mask & LVIF_TEXT)
		{
			switch (lpdi->item.iSubItem)
			{
			case SUBITEM_MODIFIED:
				{
					hr = SHGetDataFromIDList(pData->lpsfParent , pData->lpi, SHGDFIL_FINDDATA , (WIN32_FIND_DATA*)&fd , sizeof(fd));
					if(FAILED(hr))
						break;

					FileTimeToSystemTime( &fd.ftLastWriteTime, &st );
					wsprintf(refTime, "%02u-%02u-%04u" , st.wMonth, st.wDay, st.wYear ); 
					lstrcpy(lpdi->item.pszText, refTime);
				}
				break;
			case SUBITEM_SIZE:
				{
					hr = SHGetDataFromIDList(pData->lpsfParent , pData->lpi, SHGDFIL_FINDDATA , (WIN32_FIND_DATA*)&fd , sizeof(fd));
					if(FAILED(hr))
						break ;

					if(fd.nFileSizeLow)
					{
						char sNumBuff[30];
						if(fd.nFileSizeLow != 0)
							ltoa((long)fd.nFileSizeLow,sNumBuff,10);
						else
							strcpy(sNumBuff,"");
	
						lstrcpy(lpdi->item.pszText, sNumBuff);

					}
				}			
				break;
			case SUBITEM_TYPE:
        		GetTypeOf(pData->lpifq, &srName);
				lstrcpy(lpdi->item.pszText, srName.cStr);
        		break;

			}
		}
	}
	else	// The item information is being requested
	{
		if(lpdi->item.mask & LVIF_TEXT)
		{

			char szBuff[MAX_PATH];
			GetName(pData->lpsfParent, pData->lpi, SHGDN_NORMAL , szBuff);
			lpdi->item.pszText = (LPSTR)szBuff; 
			lpdi->item.cchTextMax = lstrlen(szBuff);
//			lpdi->item.iImage = GetIcon(pData->lpifq, FALSE);
		}
		
		if ((lpdi->item.mask & LVIF_IMAGE) == LVIF_IMAGE)
		{

//			if (m_fsFolderSettings.ViewMode != FVM_ICON)
//				lpdi->item.iImage = GetIcon(pData->lpi, FALSE);
//			else
//				lpdi->item.iImage = GetIcon(pData->lpi, TRUE);
		}
	}

m_pMalloc->lpVtbl->Release(m_pMalloc);

}

void GetTypeOf(LPITEMIDLIST pit, LPSTRRET lpName)
{
SHFILEINFO sfi;

    lpName->uType = STRRET_CSTR;
    lpName->cStr[0] = '\0';
    if (SHGetFileInfo((LPTSTR)pit, 
	                0, 
					&sfi, 
					sizeof(sfi),
    SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME | SHGFI_PIDL))
    {
        lstrcpy(lpName->cStr, sfi.szTypeName);
    }
}


/********************************************************************************/
/* End of file									*/
/********************************************************************************/

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
India India
Nothing to boast about

Comments and Discussions