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