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.

519 lines
22 KiB
C++

// XTPShellTreeBase.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(__XTPSHELLTREEBASE_H__)
#define __XTPSHELLTREEBASE_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// -------------------------------------------------------------------
// Summary:
// Enumeration used to determine folder or drive type.
// Remarks:
// XTPFindType type defines the constants used by the CXTPShellTreeBase
// class to determine the type of object enumerated either folder or drive.
// See Also:
// CXTPFontListBox, CXTPFontListBox::SetListStyle
//
// <KEYWORDS xtpFindTypeDrive, xtpFindTypeFolder>
// -------------------------------------------------------------------
enum XTPFindType
{
xtpFindTypeDrive, // The object type is a drive.
xtpFindTypeFolder, // The object type is a folder.
xtpFindTypeRoot, // The object type is a root folder
xtpFindTypeShare // The object is a UNC share
};
//===========================================================================
// Summary:
// CXTPShellTreeBase is a multiple inheritance class derived from CXTPTreeView
// and CXTPShellPidl. It is used to create a CXTPShellTreeBase class object.
//===========================================================================
class _XTP_EXT_CLASS CXTPShellTreeBase : public CXTPTreeBase, public CXTPShellPidl
{
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPShellTreeBase object
//-----------------------------------------------------------------------
CXTPShellTreeBase();
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPShellTreeBase object, handles cleanup and deallocation
//-----------------------------------------------------------------------
virtual ~CXTPShellTreeBase();
protected:
//-----------------------------------------------------------------------
// Summary:
// This member function fills a branch of the TreeView control. Given
// the shell folder, it enumerates the subitems of this folder and adds
// the appropriate items to the tree.
// Parameters:
// lpsf - Pointer to the parent shell folder.
// lpifq - Fully qualified item ID list to the item having items enumerated.
// This is the PIDL to the item identified by the 'lpsf' parameter.
// hParent - Parent tree node.
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL InitTreeViewItems(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent);
//-----------------------------------------------------------------------
// Summary:
// This member function gets the index for the normal and selected
// icons for the current item.
// Parameters:
// lpifq - Fully qualified item ID list for the current item.
// lptvitem - Pointer to the tree view item being added to the tree.
//-----------------------------------------------------------------------
virtual void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTV_ITEM lptvitem);
public:
//-----------------------------------------------------------------------
// Summary:
// Call this member function to enable or disable the display of the
// shell context menu on right item click.
// Parameters:
// bEnable - TRUE to display a context menu.
//-----------------------------------------------------------------------
void EnableContextMenu(BOOL bEnable);
//-----------------------------------------------------------------------
// Summary:
// Call this member to set root CSIDL folder.
// Parameters:
// nRootFolder - Root folder of tree view.
//-----------------------------------------------------------------------
void SetRootFolder(int nRootFolder = CSIDL_DESKTOP);
//-----------------------------------------------------------------------
// Summary:
// Call this member to show all files instead of only folders
// Parameters:
// bShowFiles - TRUE to show folder's files
//-----------------------------------------------------------------------
void ShowFiles(BOOL bShowFiles = TRUE);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to determine the type of items included
// in the shell enumeration. The default is SHCONTF_FOLDERS | SHCONTF_NONFOLDERS.
// Parameters:
// uFlags - Determines the type of items included in an enumeration. It
// can be one or more of the values listed in the Remarks section.
// Remarks:
// Styles to be added or removed can be combined by using the bitwise
// OR (|) operator. It can be one or more of the following:<p/>
// * <b>SHCONTF_FOLDERS</b> Include items that are folders in
// the enumeration.
// * <b>SHCONTF_NONFOLDERS</b> Include items that are not folders
// in the enumeration.
// * <b>SHCONTF_INCLUDEHIDDEN</b> Include hidden items in the
// enumeration.
// * <b>SHCONTF_INIT_ON_FIRST_NEXT</b> IShellFolder::EnumObjects
// can return without validating the enumeration object. Validation
// can be postponed until the first call to IEnumIDList::Next.
// This flag is intended to be used when a user interface may be
// displayed prior to the first IEnumIDList::Next call. For a
// user interface to be presented, 'hwndOwner' must be set to a valid
// window handle.
// * <b>SHCONTF_NETPRINTERSRCH</b> The caller is looking for
// printer objects.
//-----------------------------------------------------------------------
void SetEnumFlags(UINT uFlags);
//-----------------------------------------------------------------------
// Summary:
// This member function obtains a handle to the system image list and
// attaches it to the tree control.
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL InitSystemImageLists();
//-----------------------------------------------------------------------
// Summary:
// This member function adds items to the tree view.
//-----------------------------------------------------------------------
virtual void PopulateTreeView();
//-----------------------------------------------------------------------
// Summary:
// This member function responds to a TVN_ITEMEXPANDING message in
// order to fill up subdirectories.
// Parameters:
// pNMTreeView - Address of an NM_TREEVIEW struct.
//-----------------------------------------------------------------------
virtual void OnFolderExpanding(NM_TREEVIEW* pNMTreeView);
//-----------------------------------------------------------------------
// Summary:
// This member function displays the shell context menu for the selected
// item or folder.
// Returns:
// A handle to the currently selected HTREEITEM.
//-----------------------------------------------------------------------
virtual HTREEITEM GetContextMenu();
//-----------------------------------------------------------------------
// Summary:
// This member function responds to a TVN_SELCHANGED message to retrieve
// the specified folder path.
// Parameters:
// pNMTreeView - Address of an NM_TREEVIEW struct.
// strFolderPath - Address of a CString object to receive the file system path.
// Returns:
// TRUE if the folder path was found, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL OnFolderSelected(NM_TREEVIEW* pNMTreeView, CString& strFolderPath);
//-----------------------------------------------------------------------
// Summary:
// This member function retrieves the path of the currently selected
// tree item.
// Parameters:
// strFolderPath - Address of a CString object to receive the file system path.
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL GetSelectedFolderPath(CString& strFolderPath);
//-----------------------------------------------------------------------
// Summary:
// This member function recursively searches the tree control beginning
// at 'hItem' to find the item specified by 'lplvid'. This is typically used when
// the user double clicks an item in the list view.
// Parameters:
// hItem - Handle to the tree item to search from.
// lplvid - Pointer to the list view item data.
// bRecursively - TURE to recursively search.
// Returns:
// TRUE if successful, otherwise returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL FindTreeItem(HTREEITEM hItem, XTP_LVITEMDATA* lplvid, BOOL bRecursively = TRUE);
//-----------------------------------------------------------------------
// Summary:
// This member function is used to associate a CComboBox object with
// the control. Whenever the path changes, the combo is updated.
// Parameters:
// pWnd - Points to the combo box that is associated with the tree.
//-----------------------------------------------------------------------
virtual void AssociateCombo(CWnd* pWnd);
//-----------------------------------------------------------------------
// Summary:
// This member function is called to initialize a branch of the shell
// tree.
// Parameters:
// hItem - Handle to a tree node.
// lptvid - Pointer to the list view item data.
//-----------------------------------------------------------------------
virtual void InitTreeNode(HTREEITEM hItem, XTP_TVITEMDATA* lptvid);
//-----------------------------------------------------------------------
// Summary:
// This member function searches the tree for a specified folder.
// Parameters:
// hItem - Tree item to begin the search from.
// pABSPidl - pidl we're looking to match
// Returns:
// HTREEITEM of node in tree that resulted in a match.
//-----------------------------------------------------------------------
virtual HTREEITEM SearchTree(HTREEITEM hItem, LPCITEMIDLIST pABSPidl);
//-----------------------------------------------------------------------
// Summary:
// This member function will "tunnel" the tree to find the specified
// path. This will work only when the PopulateTreeView() method is used
// to populate the tree.
// Parameters:
// strFindPath - Path to find.
//-----------------------------------------------------------------------
virtual BOOL TunnelTree(CString strFindPath);
//-----------------------------------------------------------------------
// Summary:
// This member function retrieves the path of a folder item, which
// does not have to be selected. Pass a CString object that will hold
// the folder path.
// Parameters:
// hItem - Tree item to get the path for.
// strFolderPath - Reference to a CString object to contain the folder path.
// Returns:
// TRUE if the path is not in the file system (e.g.
// MyComputer); if none is selected, it returns FALSE.
//-----------------------------------------------------------------------
virtual BOOL GetFolderItemPath(HTREEITEM hItem, CString &strFolderPath);
//-----------------------------------------------------------------------
// Summary:
// This member function populates a tree based upon a path. You must
// call InitializeTree() before populating the tree for the first time.
// Parameters:
// lpszPath - Path to populate.
// See Also: InitializeTree()
//-----------------------------------------------------------------------
virtual void PopulateTree(LPCTSTR lpszPath);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to initialize the shell tree control prior
// to calling PopulateTree.
// Parameters:
// dwStyle - TVS_ style flags for tree control.
// Returns:
// TRUE if successful, otherwise returns FALSE.
// See Also: PopulateTree()
//-----------------------------------------------------------------------
virtual BOOL InitializeTree(DWORD dwStyle = TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);
//-----------------------------------------------------------------------
// Summary:
// Used by the shell list control to handle a drag event.
// Parameters:
// pNMTreeView - Points to a NM_TREEVIEW structure.
//-----------------------------------------------------------------------
virtual void BeginDrag(NM_TREEVIEW* pNMTreeView);
//-----------------------------------------------------------------------
// Summary:
// This member function is called to insert the Desktop as the root
// item in the shell tree control.
// Parameters:
// nFolder - Root folder CSIDL to insert.
// Returns:
// A handle to the desktop tree item if successful, otherwise NULL.
//-----------------------------------------------------------------------
virtual HTREEITEM InsertDesktopItem(int nFolder = CSIDL_DESKTOP);
//-----------------------------------------------------------------------
// Summary:
// Called after a user makes a new tree selection.
// Remarks:
// This member function is called whenever a user makes a selection
// within the tree control to synchronize any shell list or shell
// combo boxes associated with the tree. You can override this member
// to provide additional functionality.
// Parameters:
// hItem - Handle to the newly selected tree item.
// strFolderPath - NULL terminated string representing the fully
// qualified path to the selected tree item.
//-----------------------------------------------------------------------
virtual void SelectionChanged(HTREEITEM hItem, CString strFolderPath);
public:
//-----------------------------------------------------------------------
// Summary:
// Call this method to enable autohidden triangles for Windows Vista and Windows 7.
//-----------------------------------------------------------------------
void SetExplorerStyle();
protected:
//-----------------------------------------------------------------------
// Summary:
// This member function sets the shell attribute flags for the specified
// tree item.
// Parameters:
// hItem - Handle to HTREEITEM node.
// dwAttributes - Flags retrieved from SHELLFOLDER::GetAttributesOf.
//-----------------------------------------------------------------------
void SetAttributes(HTREEITEM hItem, DWORD dwAttributes);
// -------------------------------------------------------------------------------------------
// Summary:
// Parses a path for the next path component.
// Parameters:
// pszPath - Pointer to a NULL\-terminated string with the path. Paths are
// delimited by backslashes or by the NULL at the end of the
// path.
// Remarks:
// This member function parses a path for the next path component,
// not dependent on shell32.dll, and is a replacement for the windows
// API PathFindNextComponent.
// Returns:
// A pointer to a NULL-terminated string with the next path component
// if successful, or NULL otherwise.
// Example:
// The following example demonstrates using the XTFuncPathFindNextComponent function.
// <code>
// // Path to find the next part.
// char buffer_1[ ] = "c:\\\\path1\\\\path2\\\\test";
// char *lpStr1;
// lpStr1 = buffer_1;
//
// cout \<\< "Search a path for the next path component "
// \<\< "after the root " \<\< lpStr1 \<\< endl;
// cout \<\< "Return the next path component: \\""
// \<\< XTFuncPathFindNextComponent(lpStr1) \<\< "\\"" \<\< endl;
//
// cout \<\< "\\nSearch a path for the next path component "
// \<\< "after the root \\"c:\\\\path1\\\\path2\\"" \<\< endl;
// cout \<\< "Return the next path component: \\""
// \<\< XTFuncPathFindNextComponent("c:\\\\path1\\\\path2") \<\< "\\"" \<\< endl;
//
// cout \<\< "\\nSearch a path for the next path component "
// \<\< "after the root \\"c:\\\\path1\\"" \<\< endl;
// cout \<\< "Return the next path component: \\""
// \<\< XTFuncPathFindNextComponent("c:\\\\path1") \<\< "\\"" \<\< endl;
//
// \OUTPUT:
// ===========
// Search a path for the next path component after the root c:\\path1\\path2\\test
// Return the next path component: "path1\\path2\\test"
//
// Search a path for the next path component after the root "c:\\path1\\path2"
// Return the next path component: "path1\\path2"
//
// Search a path for the next path component after the root "c:\\path1"
// Return the next path component: "path1"
// </code>
// -------------------------------------------------------------------------------------------
CString PathFindNextComponent(const CString& pszPath);
// -------------------------------------------------------------------------------------------
// Summary:
// Sorts items in the control using the provided callback function.
// Parameters:
// hParent - Parent item to sort
// -------------------------------------------------------------------------------------------
virtual void SortChildren(HTREEITEM hParent);
protected:
//{{AFX_CODEJOCK_PRIVATE
//{{AFX_MSG(CXTPShellTreeBase)
afx_msg void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDeleteTreeItem(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnRclick(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE
protected:
UINT m_uFlags; // Flags indicating which items to include in the enumeration.
bool m_bTunneling; // true if tree is currently traversing.
BOOL m_bContextMenu; // TRUE to display the shell context menu on right item click.
CWnd* m_pComboBox; // CComboBox that is associated with this control. See AssociateCombo(...)
CXTPShellSettings m_shSettings; // Contains SHELLFLAGSTATE info.
int m_nRootFolder; // Root Folder CSIDL
BOOL m_bShowFiles; // FALSE to show only directories
BOOL m_bExplorerStyle; // Explorer Style
};
//////////////////////////////////////////////////////////////////////
AFX_INLINE void CXTPShellTreeBase::SetEnumFlags(UINT uFlags) {
m_uFlags = uFlags;
}
AFX_INLINE void CXTPShellTreeBase::EnableContextMenu(BOOL bEnable) {
m_bContextMenu = bEnable;
}
AFX_INLINE void CXTPShellTreeBase::SetRootFolder(int nRootFolder /*= CSIDL_DESKTOP*/) {
m_nRootFolder = nRootFolder;
}
AFX_INLINE void CXTPShellTreeBase::ShowFiles(BOOL bShowFiles /*= TRUE*/) {
m_bShowFiles = bShowFiles;
}
// --------------------------------------------------------------------------------------
// Summary:
// The DELCLATE_SHELLTREE_BASE class is a template class used by the
// CXTPShellTreeView and CXTPShellTreeCtrl class to declare a multiple
// inheritance base class so that both classes could share a common
// code base.
// Parameters:
// ClassName - Name of the object to be declared as the base class.
// Tree - Existing class that this object will derive from.
// Base - Existing shared class that this object will derive from.
// Remarks:
// <i>Tree</i> must be an existing class that is derived from either <i>CTreeCtrl</i>
// or <i>CTreeView</i>.
// Example:
// The following example demonstrates how to use DECLATE_SHELLTREE_BASE.
// <code>
// DECLATE_SHELLTREE_BASE(CXTPShellTreeViewBase, CTreeView, CXTPShellTreeBase)
//
// class _XTP_EXT_CLASS CXTPShellTreeView : public CXTPShellTreeViewBase
// {
// public:
// CXTPShellTreeView();
// };
// </code>
// --------------------------------------------------------------------------------------
#define DECLATE_SHELLTREE_BASE(ClassName, Tree, Base)
//{{AFX_CODEJOCK_PRIVATE
#undef DECLATE_SHELLTREE_BASE
#define DECLATE_SHELLTREE_BASE(ClassName, Tree, Base)\
DECLATE_TREE_BASE(Base##Tree, Tree, Base)\
class _XTP_EXT_CLASS ClassName : public Base##Tree\
{\
protected:\
void OnPaint() {\
Base::OnPaint();\
} \
void OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult) {\
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;\
BeginDrag(pNMTreeView);\
*pResult = 0;\
}\
void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) {\
Base::OnSelchanged(pNMHDR, pResult);\
} \
void OnDeleteTreeItem(NMHDR* pNMHDR, LRESULT* pResult) {\
Base::OnDeleteTreeItem(pNMHDR, pResult);\
} \
void OnRclick(NMHDR* pNMHDR, LRESULT* pResult) {\
Base::OnRclick(pNMHDR, pResult);\
} \
void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) {\
Base::OnItemexpanding(pNMHDR, pResult);\
}\
};
#define ON_SHELLTREE_REFLECT\
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)\
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)\
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)\
ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBeginDrag)\
ON_NOTIFY_REFLECT(TVN_BEGINRDRAG, OnBeginDrag)\
ON_NOTIFY_REFLECT(TVN_DELETEITEM, OnDeleteTreeItem)\
ON_TREECTRL_REFLECT
//}}AFX_CODEJOCK_PRIVATE
#endif // __XTPSHELLTREEBASE_H__