|
|
// Name Space Control definitions
#define NAME_SPACE_CLASS "NameSpaceControl" // window class name
// Window Styles
#define NSS_TREE 0x0000 // tree control
#define NSS_COMBOBOX 0x0001 // combo box
#define NSS_SHOWNONFOLDERS 0x0002 // include non folder things (files)
#define NSS_SHOWHIDDEN 0x0004
#define NSS_ONLYFSDIRS 0x0008 // For finding a folder to start document searching
#define NSS_DONTGOBELOWDOMAIN 0x0010 // For starting the Find Computer
#define NSS_RETURNFSANCESTORS 0x0020
#define NSS_DROPTARGET 0x0040 // register as a drop target
#define NSS_BROWSEFORCOMPUTER 0x4000 // Browsing for Computers.
#define NSS_BROWSEFORPRINTER 0x8000 // Browsing for Printers
// structures
typedef DWORD HNAMESPACEITEM; // handle to a name space item
typedef enum { NSIF_HITEM = 0x0001, NSIF_FOLDER = 0x0002, NSIF_PARENTFOLDER = 0x0004, NSIF_IDLIST = 0x0008, NSIF_FULLIDLIST = 0x0010, NSIF_ATTRIBUTES = 0x0020 } NSI_FLAGS;
typedef struct { NSI_FLAGS flags; HNAMESPACEITEM hitem; IShellFolder *psf; LPCITEMIDLIST pidl; DWORD dwAttributes; } NSC_ITEMINFO;
typedef enum { NSSR_ENUMBELOWROOT = 0x0001, NSSR_CREATEPIDL = 0x0002, } NSSR_FLAGS;
typedef struct { NSSR_FLAGS flags; IShellFolder *psf; // NULL -> desktop shell folder
LPCITEMIDLIST pidlRoot; // PIDL, NULL for desktop, or CSIDL for shell special folder
int iExpandDepth; // how many levels to expand the tree
LPCITEMIDLIST pidlExpandTo; // NULL, or PIDL to expand to
} NSC_SETROOT;
// Window Messages
#define NSM_SETROOT (WM_USER + 1)
#define NameSpace_SetRoot(hwnd, psr) \
(BOOL)SendMessage(hwnd, NSM_SETROOT, (WPARAM)0, (LPARAM)psr)
#define NSM_GETIDLIST (WM_USER + 2)
#define NameSpace_GetIDList(hwnd, hitem) \
(LPITEMIDLIST)SendMessage(hwnd, NSM_GETPIDL, 0, (WPARAM)hitem)
#define NameSpace_GetFullIDList(hwnd, hitem) \
(LPITEMIDLIST)SendMessage(hwnd, NSM_GETPIDL, 1, (WPARAM)hitem)
#define NSM_GETITEMINFO (WM_USER + 3)
#define NameSpace_GetItemInfo(hwnd, hitem, pinfo) \
(BOOL)SendMessage(hwnd, NSM_GETITEMINFO, (WPARAM)hitem, (LPARAM)pinfo)
#define NSM_FINDITEM (WM_USER + 4)
#define NameSpace_FindItem(hwnd, pidl, pinfo) \
(HNAMESPACEITEM)SendMessage(hwnd, NSM_FINDITEM, (WPARAM)pidl, (LPARAM)pinfo)
#define NSM_DOVERB (WM_USER + 5)
#define NameSpace_DoVerb(hwnd, hitem, pszVerb) \
(HNAMESPACEITEM)SendMessage(hwnd, NSM_DOVERB, (WPARAM)hitem, (LPARAM)pszVerb)
// WM_NOTIFY codes
#define NSN_FIRST (0U - 800)
#define NSN_SELCHANGE (NSN_FIRST - 1)
#define NSN_BEGINDRAG (NSN_FIRST - 2)
#define NSN_ENDDRAG (NSN_FIRST - 3)
#define NSN_FILTERITEM (NSN_FIRST - 4)
#define NSN_PREDOVERB (NSN_FIRST - 5)
#define NSN_AFTERDOVERB (NSN_FIRST - 6)
// structure in lParam for NSN_FILTERITEM
typedef struct { NMHDR hdr; NSC_ITEMINFO item; } NS_NOTIFY;
// private stuff --------------------------------------
// API
BOOL NameSpace_RegisterClass(HINSTANCE hinst);
typedef struct { HWND hwnd; // window handle of this control
HWND hwndParent; // parent window to notify
HWND hwndTree; // tree or combo box
DWORD style; UINT flags; // NSCF_ state bits
UINT id; // our control ID
BOOL fCacheIsDesktop : 1; // state flags
BOOL fAutoExpanding : 1; // tree is auto-expanding
// HWND hwndNextViewer; // BUGBUG: implement this
// HTREEITEM htiCut;
IContextMenu *pcm; // context menu currently being displayed
IShellFolder *psfRoot;
LPITEMIDLIST pidlRoot;
HTREEITEM htiCache; // tree item associated with Current shell folder
IShellFolder *psfCache; // cache of the last IShellFolder I needed...
HTREEITEM htiDragging; // item being dragged
ULONG nChangeNotifyID; // SHChangeNotify registration ID
} NSC;
LPITEMIDLIST _CacheParentShellFolder(NSC *pns, HTREEITEM hti, LPITEMIDLIST pidl);
// nscdrop.c
void CTreeDropTarget_Register(NSC *pns); void CTreeDropTarget_Revoke(NSC *pns);
|