Click here to Skip to main content
15,896,111 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.7K   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
*************************************************/


// FilesViewView.h : interface of the CFilesViewView class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_FILESVIEWVIEW_H__629DEDBF_4689_11D7_B1DC_83923F364322__INCLUDED_)
#define AFX_FILESVIEWVIEW_H__629DEDBF_4689_11D7_B1DC_83923F364322__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "ShellClass.h"

enum SubItems 
{
	SUBITEM_NAME, SUBITEM_TYPE, SUBITEM_SIZE, SUBITEM_MODIFIED
};

class CFilesViewView : public CWindowImpl<CFilesViewView, CListViewCtrl>
{
public:
	DECLARE_WND_SUPERCLASS(NULL, CListViewCtrl::GetWndClassName())

	int giRowCtr;

	BOOL PreTranslateMessage(MSG* pMsg)
	{
		pMsg;
		return FALSE;
	}

	BEGIN_MSG_MAP(CFilesViewView)
	END_MSG_MAP()


	void SetListViewColumns(HWND m_hWndList)
	{
	#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(m_hWndList);  //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(m_hWndList, i, &lvColumn);    
		}  
  
	}  

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

	char szBuff[MAX_PATH];
	LPMALLOC lpMalloc;
	LPTVITEMDATA* lptvid = NULL;
	LPITEMIDLIST pidl = NULL;	
	
		UINT uFlags;
		LV_ITEM lvi;
	
		CShellClass sc;

		lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;

		sc.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->Alloc ( sizeof (LPTVITEMDATA));
		pidl =  sc.Concatenate(lpMalloc, lpifq,lpi);

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

		return TRUE;
	}

	void    PopulateList(TV_ITEM tvi, HWND m_hWndList)
	{
	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;

		hr = SHGetMalloc(&m_pMalloc);

		if(FAILED(hr))
			return;

		lptvid = (LPTVITEMDATA*) m_pMalloc->Alloc ( 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->BindToObject(lptvid->lpi, NULL, IID_IShellFolder, (LPVOID *) &psfProgFiles);
			if(FAILED(hr))
					return;
		}

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

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

		ListView_DeleteAllItems(m_hWndList);
		giRowCtr = 0;

		while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
	    {

			ULONG uAttr = SFGAO_FOLDER;
			psfProgFiles->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);
			if(!(uAttr & SFGAO_FOLDER))
				InsertListViewItem(psfProgFiles , pidlItems , lptvid->lpifq, m_hWndList);
	    }

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

	}

	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;

		CShellClass sc; 

		pData = (LPTVITEMDATA*) m_pMalloc->Alloc ( 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];
				sc.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->Release();

	}

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


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

//		CheckMenuItem (::GetMenu (hWndMain), ID_VIEW_LARGEICONS , uiStyle == ID_VIEW_LARGEICONS ? MF_CHECKED : MF_UNCHECKED);
//		CheckMenuItem (::GetMenu (hWndMain), ID_VIEW_SMALLICONS , uiStyle == ID_VIEW_SMALLICONS ? MF_CHECKED : MF_UNCHECKED);
//		CheckMenuItem (::GetMenu (hWndMain), ID_VIEW_LIST       , uiStyle == ID_VIEW_LIST       ? MF_CHECKED : MF_UNCHECKED);
//		CheckMenuItem (::GetMenu (hWndMain), ID_VIEW_DETAILS     , uiStyle == ID_VIEW_DETAILS    ? MF_CHECKED : MF_UNCHECKED);

		switch (uiStyle)
		{
		case ID_VIEW_LARGEICONS:
			dwStyle |= LVS_ICON;
			break;
		case ID_VIEW_SMALLICONS:
			dwStyle |= LVS_SMALLICON;
			break;
		case ID_VIEW_LIST:
			dwStyle |= LVS_LIST;
			break;
		case ID_VIEW_DETAILS:
			dwStyle |= LVS_REPORT;
			break;
		}
		::SetWindowLong(hWndListView, GWL_STYLE, dwStyle);
	}


	BOOL ShowStdMenu(LVITEM lvi , BOOL bShowMenu, HINSTANCE appInstance, HWND hWndListView)
	{
	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, hWndListView);		
			return TRUE;
		}

		hr = SHGetMalloc(&m_pMalloc);

		if(FAILED(hr))
			return FALSE;

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


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

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

	    hMenuPopup = CreatePopupMenu();
		if(!hMenuPopup)
			goto Done;
	
		hr = icm->QueryContextMenu(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->InvokeCommand(&ici);

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

	}

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

	BOOL ShowPopupStyleMenu(HINSTANCE appInstance, HWND hWndListView)
	{
	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);

		UpdateViewStyle(id, hWndListView, NULL);
		DestroyMenu(m_hMenu);

		return TRUE;
	}



};


/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_FILESVIEWVIEW_H__629DEDBF_4689_11D7_B1DC_83923F364322__INCLUDED_)

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