You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

578 lines
24 KiB
C

2 years ago
// XTPShellPidl.h : header file
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPSHELLPIDL_H__)
#define __XTPSHELLPIDL_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ----------------------------------------------------------------------
// Summary:
// XTP_LVITEMDATA structure is used to maintain information for
// a particular list item in a CXTPShellListCtrl or CXTPShellListView
// window.
// See Also:
// CXTPShellListCtrl, CXTPShellListView
// ----------------------------------------------------------------------
struct XTP_LVITEMDATA
{
ULONG ulAttribs; // Shell item attributes.
LPITEMIDLIST lpi; // Pointer to an item ID list.
LPSHELLFOLDER lpsfParent; // Points to the parent shell folder item.
};
// ----------------------------------------------------------------------
// Summary:
// XTP_TVITEMDATA structure is used to maintain information for
// a particular tree item in a CXTPShellTreeCtrl or CXTPShellTreeView
// window.
// See Also:
// CXTPShellTreeCtrl, CXTPShellTreeView
// ----------------------------------------------------------------------
struct XTP_TVITEMDATA
{
LPITEMIDLIST lpi; // Pointer to an item ID list.
LPITEMIDLIST lpifq; // Pointer to an item ID list.
LPSHELLFOLDER lpsfParent; // Pointer to the parent shell folder item.
};
//===========================================================================
// Summary:
// CXTPShellPidl is a stand alone base class. This class is used by the
// shell tree and list controls to handle PIDL creation and management.
//===========================================================================
class _XTP_EXT_CLASS CXTPShellPidl
{
public:
//=======================================================================
// Summary:
// CXTPShellPidl::CShellMalloc is a helper class that is used by
// CXTPShellPidl to initialize a pointer to the Shell's IMalloc
// interface used for allocating memory blocks.
//=======================================================================
class _XTP_EXT_CLASS CShellMalloc
{
public:
//-------------------------------------------------------------------
// Summary:
// Constructs a CXTPShellPidl::CShellMalloc object and initializes
// a pointer to the Shell's IMalloc interface.
//-------------------------------------------------------------------
CShellMalloc()
{
m_lpMalloc = NULL;
if (FAILED(::SHGetMalloc(&m_lpMalloc)))
{
m_lpMalloc = NULL;
}
}
//-------------------------------------------------------------------
// Summary:
// Destroys a CXTPShellPidl::CShellMalloc object, handles cleanup
// and deallocation
//-------------------------------------------------------------------
virtual ~CShellMalloc()
{
if (m_lpMalloc)
{
m_lpMalloc->Release();
}
}
//-------------------------------------------------------------------
// Summary:
// Call this member function to allocate a block of memory.
// Parameters:
// nBytes - Size, in bytes, of the memory block to be allocated.
// Returns:
// If successful, Alloc returns a pointer to the allocated memory
// block. NULL If insufficient memory is available, Alloc returns
// NULL.
//-------------------------------------------------------------------
void* Alloc (DWORD nBytes)
{
ASSERT(m_lpMalloc != NULL);
return m_lpMalloc ? m_lpMalloc->Alloc(nBytes) : NULL;
}
//-------------------------------------------------------------------
// Summary:
// Call this member function to free a block of previously
// allocated.
// Parameters:
// lpMem - Pointer to the memory block to be freed.
//-------------------------------------------------------------------
void Free(void* lpMem)
{
ASSERT(m_lpMalloc != NULL);
if (m_lpMalloc)
{
m_lpMalloc->Free(lpMem);
}
}
//-------------------------------------------------------------------
// Summary:
// Returns a pointer to Shell's IMalloc interface for this object.
//-------------------------------------------------------------------
operator LPMALLOC()
{
return m_lpMalloc;
}
protected:
LPMALLOC m_lpMalloc; // Points to Shell's IMalloc interface for this object.
};
//=======================================================================
// Summary:
// CXTPShellPidl::CShellSpecialFolder is a helper class that is used by
// CXTPShellPidl to initialize a pointer to an IDTEMIDLIST structure of
// a special folder.
//=======================================================================
class _XTP_EXT_CLASS CShellSpecialFolder
{
public:
//-------------------------------------------------------------------
// Summary:
// Constructs a CXTPShellPidl::CShellSpecialFolder object and
// initializes a pointer to the ITEMIDLIST structure of the
// special folder specified by nFolder.
// Parameters:
// nFolder - value that identifies the folder of interest, see
// CSIDL in MSDN documentation for a list of constants
// that represent special folder locations.
//-------------------------------------------------------------------
CShellSpecialFolder(int nFolder = CSIDL_DESKTOP);
//-------------------------------------------------------------------
// Summary:
// Destroys a CXTPShellPidl::CShellSpecialFolder object, handles
// cleanup and deallocation
//-------------------------------------------------------------------
virtual ~CShellSpecialFolder()
{
if (m_lpFolder)
{
m_lpFolder->Release();
}
}
//-------------------------------------------------------------------
// Summary:
// Returns a pointer to interface for the desktop folder, which is
// the root of the Shell's namespace.
//-------------------------------------------------------------------
operator LPSHELLFOLDER()
{
return m_lpFolder;
}
protected:
LPSHELLFOLDER m_lpFolder; // Points to the interface for the desktop folder.
};
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPShellPidl object
//-----------------------------------------------------------------------
CXTPShellPidl();
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPShellPidl object, handles cleanup and deallocation
//-----------------------------------------------------------------------
virtual ~CXTPShellPidl();
//-----------------------------------------------------------------------
// Summary:
// This member function gets the fully qualified PIDL for the path string.
// Parameters:
// path - File system path string.
// Returns:
// A pointer to an item ID list. Returns NULL if it fails.
//-----------------------------------------------------------------------
LPITEMIDLIST IDLFromPath(LPCTSTR path);
//-----------------------------------------------------------------------
// Summary:
// This member function performs the OneUp or back function.
// Parameters:
// pidlPath - Fully qualified PIDL.
// Returns:
// A fully qualified parent PIDL.
//-----------------------------------------------------------------------
LPITEMIDLIST OneUpPIDL(LPITEMIDLIST pidlPath);
//-----------------------------------------------------------------------
// Summary:
// This member function gets the parent folder using PIDLs.
// Parameters:
// path - Path string.
// Returns:
// A path string to the parent.
//-----------------------------------------------------------------------
CString OneUpPATH(const CString& path);
//-----------------------------------------------------------------------
// Summary:
// This member function walks an ITEMIDLIST and points to the last one.
// Parameters:
// pidl - PIDL list.
// Returns:
// A pointer to the last IDL in the list.
//-----------------------------------------------------------------------
LPITEMIDLIST GetLastITEM(LPITEMIDLIST pidl);
//-----------------------------------------------------------------------
// Summary:
// This member function copies a whole ITEMIDLIST. Remember to Free()
// the old one if it is no longer needed.
// Parameters:
// pidl - Pointer to an ITEMIDLIST.
// Returns:
// A new pointer to a copy of the PIDL.
//-----------------------------------------------------------------------
LPITEMIDLIST CopyIDList(LPITEMIDLIST pidl);
//-----------------------------------------------------------------------
// Summary:
// This member function concatenates two PIDLs.
// Parameters:
// lpMalloc - Points to the shell's IMalloc interface.
// pidl1 - Pointer to an item ID list.
// pidl2 - Pointer to an item ID list.
// Returns:
// A pointer to an item ID list.
//-----------------------------------------------------------------------
LPITEMIDLIST ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
LPITEMIDLIST ConcatPidls(LPMALLOC lpMalloc, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); // <combine CXTPShellPidl::ConcatPidls@LPCITEMIDLIST@LPCITEMIDLIST>
//-----------------------------------------------------------------------
// Summary:
// This member function gets the fully qualified PIDLs for the specified
// folder.
// Parameters:
// lpsf - Pointer to the parent shell folder.
// lpi - Pointer to the item ID that is relative to 'lpsf'.
// Returns:
// A pointer to an item ID list.
//-----------------------------------------------------------------------
LPITEMIDLIST GetFullyQualPidl(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi);
//-----------------------------------------------------------------------
// Summary:
// This member function copies the ITEMID.
// Parameters:
// lpMalloc - Points to the shell's IMalloc interface.
// lpi - Pointer to item ID that is to be copied.
// Returns:
// A pointer to an item ID list.
//-----------------------------------------------------------------------
LPITEMIDLIST DuplicateItem(LPMALLOC lpMalloc, LPITEMIDLIST lpi);
//-----------------------------------------------------------------------
// Summary:
// This member function gets the friendly name for the folder or file.
// Parameters:
// lpsf - Pointer to the parent shell folder.
// lpi - Pointer to the item ID that is relative to 'lpsf'.
// dwFlags - Flags to determine which value to return. See SHGNO for more details.
// lpFriendlyName - Buffer to receive the friendly name of the folder.
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
BOOL GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, CString& lpFriendlyName);
//-----------------------------------------------------------------------
// Summary:
// This member function allocates a PIDL.
// Parameters:
// lpMalloc - Points to the shell's IMalloc interface.
// cbSize - Initial size of the PIDL.
// Returns:
// A pointer to an item ID list.
//-----------------------------------------------------------------------
LPITEMIDLIST CreatePidl(LPMALLOC lpMalloc, UINT cbSize);
//-----------------------------------------------------------------------
// Summary:
// This member function computes the number of item IDs in an item ID
// list.
// Parameters:
// pidl - Pointer to an item ID list.
// Returns:
// The number of item IDs in the list.
//-----------------------------------------------------------------------
UINT GetPidlItemCount(LPCITEMIDLIST pidl);
//-----------------------------------------------------------------------
// Summary:
// This member function retrieves the next PIDL in the list.
// Parameters:
// pidl - Pointer to an item ID list.
// Returns:
// A pointer to the next PIDL item in the list.
//-----------------------------------------------------------------------
LPITEMIDLIST GetNextPidlItem(LPCITEMIDLIST pidl);
//-----------------------------------------------------------------------
// Summary:
// This member function displays a popup context menu if given a parent
// shell folder, relative item ID, and screen location.
// Parameters:
// hwnd - Context menu owner.
// lpsfParent - Pointer to the parent shell folder.
// lpi - Pointer to the item ID that is relative to 'lpsfParent'.
// lppi - Pointer to the item ID that is relative to 'lpsfParent'.
// nCount - Number of PIDLs.
// lppt - Screen location of where to popup the menu.
// Returns:
// TRUE on success, or FALSE on failure.
//-----------------------------------------------------------------------
BOOL ShowContextMenu(HWND hwnd, LPSHELLFOLDER lpsfParent, LPITEMIDLIST lpi, LPPOINT lppt);
BOOL ShowContextMenu(HWND hwnd, LPSHELLFOLDER lpsfParent, LPCITEMIDLIST* lppi, int nCount, LPPOINT lppt); // <combine CXTPShellPidl::ShowContextMenu@HWND@LPSHELLFOLDER@LPITEMIDLIST@LPPOINT>
//-----------------------------------------------------------------------
// Summary:
// This member function gets the index for the current icon. Index is
// the index into the system image list.
// Parameters:
// lpi - Fully qualified item ID list for the current item.
// uFlags - Flags that specify the image list retrieve, can be a
// combination of the following values:<p/>
// * <b>SHGFI_SMALLICON</b> - Return the index of small icon
// from the system image list.
// * <b>SHGFI_LARGEICON</b> - Return the index of large icon
// from the system image list.
// * <b>SHGFI_OPENICON</b> - Return the index of selected icon
// from the system image list.
// Returns:
// An icon index for the current item.
//-----------------------------------------------------------------------
int GetItemIcon(LPITEMIDLIST lpi, UINT uFlags) const;
//-----------------------------------------------------------------------
// Summary:
// Call this member function to retrieve a string that describes the
// type of file specified by lpi from the Windows Shell.
// Parameters:
// uFlags - Flags that specify the image list retrieve, can be a
// combination of the following values:<p/>
// * <b>SHGFI_SMALLICON</b> - Return the handle to the system
// image list that contains small icon images.
// * <b>SHGFI_LARGEICON</b> - return the handle to the system
// image list that contains large icon images.
// Returns:
// A handle to the system image list that contains the specified icon
// images.
//-----------------------------------------------------------------------
HIMAGELIST GetSystemImageList(UINT uFlags) const;
// ------------------------------------------------------------------------
// Summary:
// Retrieves the attributes of one or more file objects or
// subfolders.
// Parameters:
// lpsf : Pointer to the parent shell folder.
// lpi : Fully qualified item ID list for the current item.
// uFlags : Single ULONG value contains the attributes that the caller
// is requesting.
// Returns:
// Requested attributes that are common to all of the specified
// \objects.
// ------------------------------------------------------------------------
ULONG GetAttributes(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, ULONG uFlags) const;
//-----------------------------------------------------------------------
// Summary:
// This member function retrieves the IContextMenu, IContextMenu2 or IContextMenu3
// interface.
// Parameters:
// psfFolder - A pointer to a valid IShellFolder data type.
// localPidl - A pointer to a valid _ITEMIDLIST structure.
// nCount - Number of items in the context menu.
// ppCM - Long pointer to a CONTEXTMENU struct.
// pcmType - A pointer to a valid int data type that represents the version number
// of the context menu.
// Returns:
// An HRESULT value.
//-----------------------------------------------------------------------
HRESULT GetSHContextMenu(LPSHELLFOLDER psfFolder, LPCITEMIDLIST* localPidl, int nCount, void** ppCM, int* pcmType);
// ---------------------------------------------------------------------------
// Summary:
// CXTPShellTreeCtrl callback sort function.
// Parameters:
// lparam1 - Corresponds to the lParam member of the TV_ITEM structure
// for the two items being compared.
// lparam2 - Corresponds to the lParam member of the TV_ITEM structure
// for the two items being compared.
// lparamSort - The 'lParamSort' member corresponds to the lParam member of
// TV_SORTCB.
// Remarks:
// This member function is a callback function used by
// CXTPShellTreeCtrl and CXTPShellTreeView, and is called during a sort
// operation each time the relative order of two list items needs to
// be compared.
// Returns:
// A negative value if the first item should precede the second, a
// positive value if the first item should follow the second, or zero
// if the two items are equivalent.
// ---------------------------------------------------------------------------
static int CALLBACK TreeViewCompareProc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort);
// ---------------------------------------------------------------------------
// Summary:
// CXTPShellListCtrl callback sort function.
// Parameters:
// lparam1 - Corresponds to the lParam member of the LV_ITEM structure
// for the two items being compared.
// lparam2 - Corresponds to the lParam member of the LV_ITEM structure
// for the two items being compared.
// lparamSort - The 'lParamSort' member corresponds to the lParam member of
// LV_SORTCB.
// Remarks:
// This member function is a callback function used by
// CXTPShellListCtrl and CXTPShellListView, and is called during a sort
// operation each time the relative order of two list items needs to
// be compared.
// Returns:
// A negative value if the first item should precede the second, a
// positive value if the first item should follow the second, or zero
// if the two items are equivalent.
// ---------------------------------------------------------------------------
static int CALLBACK ListViewCompareProc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort);
// ---------------------------------------------------------------------------
// Summary:
// Call this member function to override shortcut link display for each item.
// Parameters:
// bShowLinkIcons - Set to FALSE to disable shortcut link display, TRUE to
// enable.
// ---------------------------------------------------------------------------
void ShowShellLinkIcons(BOOL bShowLinkIcons = TRUE);
//-----------------------------------------------------------------------
// Summary:
// Calculates number of item IDs in the list.
// Parameters:
// pidl - Pointer to an item ID list.
// Returns:
// The number of item IDs in the list.
//-----------------------------------------------------------------------
UINT GetPidlCount(LPCITEMIDLIST pidl);
//-----------------------------------------------------------------------
// Summary:
// This member function frees memory for allocated for a PIDL.
// Parameters:
// pidl - Pointer to an item ID list.
//-----------------------------------------------------------------------
void FreePidl(LPITEMIDLIST pidl);
//-----------------------------------------------------------------------
// Summary:
// This member function copies a single PIDL out of a list. Remember to Free()
// the old one if it is no longer needed.
// Parameters:
// pidl - Pointer to an ITEMIDLIST.
// nItem - PIDL in the list to copy.
// Returns:
// A new pointer to a copy of the PIDL with the single item.
//-----------------------------------------------------------------------
LPITEMIDLIST CopyPidlItem(LPITEMIDLIST pidl, UINT nItem);
//-----------------------------------------------------------------------
// Summary:
// This member function compares two PIDLs to determine if they match.
// Parameters:
// pidl1 - Pointer to an item ID list.
// pidl2 - Pointer to an item ID list.
// pShellFolder - Pointer to the shell folder to use for the comparison (default Desktop)
// Returns:
// TRUE on success, or FALSE on failure.
//-----------------------------------------------------------------------
BOOL ComparePidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, LPSHELLFOLDER pShellFolder = NULL);
protected:
//-----------------------------------------------------------------------
// Summary:
// This method is called when item of context menu was executed
// Parameters:
// idCmd - Item identifier was executed.
// cmi - CMINVOKECOMMANDINFO structure reference contained additional information about item was executed.
//-----------------------------------------------------------------------
virtual void OnShowContextMenu(int idCmd, CMINVOKECOMMANDINFO& cmi);
//-----------------------------------------------------------------------
// Summary:
// This function translates shell attributes into a tree item state
// Parameters:
// pTreeCtrl - Tree Control that owns an item
// pListCtrl - List Control that owns an item
// hItem - Handle to identify the item, passed verbatim to SetItemState()
// iItem - Index to identify the item, passed verbatim to SetItemState()
// dwAttributes - Shell attributes to translate
//-----------------------------------------------------------------------
virtual void MapShellFlagsToItemAttributes(CListCtrl* pListCtrl, int iItem, DWORD dwAttributes);
virtual void MapShellFlagsToItemAttributes(CTreeCtrl* pTreeCtrl, HTREEITEM hItem, DWORD dwAttributes); // <combine CXTPShellPidl::MapShellFlagsToItemAttributes@CListCtrl*@int@DWORD>
protected:
ULONG m_ulSFGAOFlags; // SFGAO flags used to retrieve shell item attributes.
BOOL m_bShowShellLinkIcons; // Set to FALSE to override shortcut link display.
private:
static WNDPROC m_pOldWndProc; // regular window proc
static LPCONTEXTMENU2 m_pIContext2; // active shell context menu
static LRESULT CALLBACK HookWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
};
AFX_INLINE void CXTPShellPidl::ShowShellLinkIcons(BOOL bShowLinkIcons /*= TRUE*/) {
m_bShowShellLinkIcons = bShowLinkIcons;
}
//{{AFX_CODEJOCK_PRIVATE
#ifndef CSIDL_MYPICTURES
#define CSIDL_MYPICTURES 0x0027
#endif
#ifndef SFGAO_STREAM
#define SFGAO_STREAM 0x00400000L
#endif
#ifndef SFGAO_ENCRYPTED
#define SFGAO_ENCRYPTED 0x00002000L
#endif
#ifndef SHCIDS_ALLFIELDS
#define SHCIDS_ALLFIELDS 0x80000000L
#endif
//}}AFX_CODEJOCK_PRIVATE
#endif // __XTPSHELLPIDL_H__