//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//--------------------------------------------------------------------------

import "objidl.idl";
import "shtypes.idl";
import "shobjidl.idl";
import "unknwn.idl";
import "wtypes.idl";
import "prsht.idl";
import "msxml.idl";

///////////////////////////////////////////////////////////////////////////////
//
[
    uuid(fe787bcb-0ee8-44fb-8c89-12f508913c40),
    helpstring("MRU using a binary data key"),
    local
]
interface IMruDataList : IUnknown
{

    typedef int (stdcall *MRUDATALISTCOMPARE)(const BYTE *, const BYTE *, int);

    enum 
    {
        MRULISTF_USE_MEMCMP     = 0x0000,   // default, find uses memcmp()
        MRULISTF_USE_STRCMPIW   = 0x0001,   // find uses StrCmpIW()
        MRULISTF_USE_STRCMPW    = 0x0002,   // find uses StrCmpW()
        MRULISTF_USE_ILISEQUAL  = 0x0003,   // find uses ILIsEqual()
    };
    typedef DWORD MRULISTF;

    HRESULT InitData(
        [in] UINT uMax,
        [in] MRULISTF flags,
        [in] HKEY hKey,
        [in, string] LPCWSTR pszSubKey,
        [in] MRUDATALISTCOMPARE pfnCompare);
        
    HRESULT AddData(
        [in, size_is(cbData)] const BYTE *pData, 
        [in] DWORD cbData, 
        [out] DWORD *pdwSlot);
        
    HRESULT FindData(
        [in, size_is(cbData)] const BYTE *pData, 
        [in] DWORD cbData, 
        [out] int *piIndex);
        
    HRESULT GetData(
        [in] int iIndex, 
        [out, size_is(cbData)] BYTE *pData, 
        [in] DWORD cbData);
        
    HRESULT QueryInfo(
        [in] int iIndex, 
        [in, out] DWORD *pdwSlot, 
        [in, out] DWORD *pcbData);
        
    HRESULT Delete([in] int iIndex);
};

[
    uuid(47851649-a2ef-4e67-baec-c6a153ac72ec),
    helpstring("MRU using a LPITEMIDLIST key"),
    local,
]
interface IMruPidlList : IUnknown
{
    HRESULT InitList(
        [in] UINT uMax, 
        [in] HKEY hKey, 
        [in, string] LPCWSTR pszSubKey);
        
    HRESULT UsePidl(
        [in] LPCITEMIDLIST pidl, 
        [out] DWORD *pdwSlot);

    //  QueryPidl returns S_OK if rgdwSlots[0] is the pidl queried for
    //  or S_FALSE if it is one of the parents
    //  or failure if nothing was inserted in rgdwSlots
    HRESULT QueryPidl(
        [in] LPCITEMIDLIST pidl, 
        [in] DWORD cSlots, 
        [out, size_is(cSlots), length_is(*pcSlotsFetched)] DWORD *rgdwSlots, 
        [out] DWORD *pcSlotsFetched);
        
    HRESULT PruneKids([in] LPCITEMIDLIST pidl);
};

// INSCTree Behavior flags: (INSCTree::Initialize(..., dwFlags))
cpp_quote("#define NSS_DROPTARGET          0x0001      // register as a drop target")
cpp_quote("#define NSS_BROWSERSELECT       0x0002      // Use the browser style selection (see above)")
cpp_quote("#define NSS_NOHISTSELECT        0x0004      // Do not select the history entry on navigations.")
cpp_quote("#define NSS_MULTISELECT         0x0008")
cpp_quote("#define NSS_BORDER              0x0010")
cpp_quote("#define NSS_NORMALTREEVIEW      0x0020")
cpp_quote("#define NSS_HEADER              0x0040")

// NSCTree Modes: (INSCTree::SetNscMode(nMode))
typedef enum
{
    MODE_NORMAL           = 0x0000,             // Act like a normal tree view
    MODE_CONTROL          = 0x0001,             // Have behaviors specific the being hosted in a control
    MODE_HISTORY          = 0x0002,             // Have behaviors specific to the History pane.
    MODE_FAVORITES        = 0x0004,             // Have behaviors specific to the Favorites pane.
    MODE_CUSTOM           = 0x0008,             // custom behavior defined by flags passed to initialize
} nscTreeMode;

[
    uuid(43A8F463-4222-11d2-B641-006097DF5BD4),
    helpstring("Private Namespace tree control interface"),
    local
]
interface INSCTree : IUnknown
{
    // CreateTree() dwStyles - these are normal window styles.
    HRESULT CreateTree([in] HWND hwndParent, [in] DWORD dwStyles, [out] HWND *phwnd);
    // Initialize() grfFlags - these are SHCONTF_* flags defined in <shlobj.h>.
    //              dwFlags - these are NSCTree Behavior flags defined below
    //                   NSS_DROPTARGET - Enable drag and drop
    //                   NSS_BROWSERSELECT - With this on, a selection is different than the standard
    //                      tree view selection in that a box is drawn around the sub heirarchy selected
    //                      and the buttons are turned off.
    HRESULT Initialize([in] LPCITEMIDLIST pidlRoot, [in] DWORD grfFlags, [in] DWORD dwFlags);
    HRESULT ShowWindow([in] BOOL fShow);
    HRESULT Refresh();
    HRESULT GetSelectedItem([out] LPITEMIDLIST * ppidl, [in] int nItem);
    HRESULT SetSelectedItem([in] LPCITEMIDLIST pidl, [in] BOOL fCreate, [in] BOOL fReinsert, [in] int nItem);
    // SetNscMode() nMode - these are modes that inherit general behavior.  Defined below
    HRESULT GetNscMode([out] UINT * pnMode);
    HRESULT SetNscMode([in] UINT nMode);
    HRESULT GetSelectedItemName([in, out] LPWSTR pszName, [in] DWORD cchName);
    HRESULT BindToSelectedItemParent([in] REFIID riid, [out] void **ppv, [out] LPITEMIDLIST *ppidl);
    BOOL    InLabelEdit();
};

[
    uuid(801C1AD5-C47C-428c-97AF-E991E4857D97),
    local
]
interface INSCTree2 : INSCTree
{
    HRESULT RightPaneNavigationStarted([in] LPITEMIDLIST pidl);
    HRESULT RightPaneNavigationFinished([in] LPITEMIDLIST pidl);
    HRESULT CreateTree2([in] HWND hwndParent, [in] DWORD dwStyle, [in] DWORD dwExStyle, [out] HWND *phwnd);
}


[
    uuid(3a77ce00-6f74-4594-9399-c4578aa4a1b6),
    helpstring("used to notify browser of application start notifications"),
]
interface INotifyAppStart : IUnknown
{
    HRESULT AppStarting(void);
    HRESULT AppStarted(void);
};

[
    uuid(e787f2c0-3d21-4d98-85c8-a038195ba649),
    local
]
interface  IInitViewLinkedWebOC : IUnknown
{
    HRESULT SetViewLinkedWebOC([in] BOOL bValue);
    HRESULT IsViewLinkedWebOC([out] BOOL* pbValue);
    HRESULT SetViewLinkedWebOCFrame([in] IDispatch * punk);
    HRESULT GetViewLinkedWebOCFrame([out] IDispatch ** punk);
    HRESULT SetFrameName([in] BSTR bstrFrameName);
};


[
    helpstring("Interface to handle nsc specifics for different bands"),
    uuid(CF1609EC-FA4B-4818-AB01-55643367E66D),
    object,
    local
]
interface INamespaceProxy : IUnknown
{
    HRESULT GetNavigateTarget(LPCITEMIDLIST pidl, LPITEMIDLIST * ppidlTarget, ULONG * pulAttrib);
    HRESULT Invoke(LPCITEMIDLIST pidl);
    HRESULT OnSelectionChanged(LPCITEMIDLIST pidl);
    HRESULT RefreshFlags(DWORD *pdwStyle, DWORD *pdwExStyle, DWORD *dwEnum);
    HRESULT CacheItem(LPCITEMIDLIST pidl);
}

cpp_quote("// INTERFACE: IBrowserFrameOptions")
cpp_quote("//")
cpp_quote("// This interface was implemented so a browser or host can ask a ShellView/ShelNameSpace what")
cpp_quote("// kind of 'Behavior' is appropriate for that view.  These are normally PM type decisions to")
cpp_quote("// refine the user experience.")
cpp_quote("// ")
cpp_quote("// For example, should the IE globe be added to the toolbar")
cpp_quote("// when the view is a HTTP web page? (Yes)  When the view is a FTP Folders?  When the view")
cpp_quote("// is the file system? (No) When the view is Web Folders? (Maybe, did you as a PM?)")
cpp_quote("// It's very important for the view to ask the NSE if it does or doesn't want the behavior instead of")
cpp_quote("// trying to sniff the pidl and guess.  An example of this kind of bad coding style is all the")
cpp_quote("// code that calls IsURLChild().  Currently we have a lot of hacky code that says turn such-and-such")
cpp_quote("// behavior on for HTTP and FTP URLs but not Web Folders and not ABOUT URLs, so it's very important to")
cpp_quote("// use this interface to do the work for you.  This will also allow Web Folders to fix a lot of bugs because")
cpp_quote("// the code hasn't yet been 'tweaked' to give the behavior Web Folders wants.")
cpp_quote("//")
cpp_quote("//    IBrowserFrameOptions::GetBrowserOptions()")
cpp_quote("//       dwMask is the logical OR of bits to look for.  pdwOptions is not optional and")
cpp_quote("//       it's return value will always equal or will be a subset of dwMask.")
cpp_quote("//       If the function succeeds, the return value must be S_OK and pdwOptions needs to be filled in.")
cpp_quote("//       If the function fails, pdwOptions needs to be filled in with BFO_NONE.")
cpp_quote("//")
cpp_quote("// NOTE: The definition of the bit needs to be OFF for the most common NSE.  This way shell name space")
cpp_quote("//       extensions that don't implement this interface or haven't been updated to handle this bit will")
cpp_quote("//       default to behavior that is the most common.  An example of this is the BFO_NO_FOLDER_OPTIONS")
cpp_quote("//       where this bit off will give the 'Folder Options', which is the most common case.  This is especially")
cpp_quote("//       true since this interface is internal only.")


[
    uuid(10DF43C8-1DBE-11d3-8B34-006097DF5BD4),
    object,
    local
]
interface IBrowserFrameOptions : IUnknown
{
    typedef [unique] IBrowserFrameOptions * LPBROWSERFRAMEOPTIONS;

    enum
    {
        BFO_NONE                            = 0x00000000,      // Do nothing.
        BFO_BROWSER_PERSIST_SETTINGS        = 0x00000001,      // Does this item want the browser stream? (Same window position as IE browser windows?)
        BFO_RENAME_FOLDER_OPTIONS_TOINTERNET = 0x00000002,     // Rename "Folder Options" to "Internet Options" in the Tools or View menu?
        BFO_BOTH_OPTIONS                    = 0x00000004,      // Keep both "Folder Options" and "Internet Options" in the Tools or View menu?
        BIF_PREFER_INTERNET_SHORTCUT        = 0x00000008,      // NSE would prefer a .url shortcut over a .lnk shortcut
        BFO_BROWSE_NO_IN_NEW_PROCESS        = 0x00000010,      // Specify this flag if you don't want the "Browse in New Process" via invoking a shortcut.
        BFO_ENABLE_HYPERLINK_TRACKING       = 0x00000020,      // Does this NSE want it's display name tracked to determine when hyperlinks should be tagged as previously used?
        BFO_USE_IE_OFFLINE_SUPPORT          = 0x00000040,      // Use "Internet Explorer"'s offline support?
        BFO_SUBSTITUE_INTERNET_START_PAGE   = 0x00000080,      // Does this NSE want to use the Start Page support?
        BFO_USE_IE_LOGOBANDING              = 0x00000100,      // Use the Brand block in the Toolbar.  (Spinning globe or whatever it is this year)
        BFO_ADD_IE_TOCAPTIONBAR             = 0x00000200,      // Should " - Internet Explorer" be appended to display name in the Captionbar
        BFO_USE_DIALUP_REF                  = 0x00000400,      // Should the DialUp ref count get a ref while the browse is navigated to this location?  This will also enable the ICW and Software update.
        BFO_USE_IE_TOOLBAR                  = 0x00000800,      // Should the IE toolbar be used?
        BFO_NO_PARENT_FOLDER_SUPPORT        = 0x00001000,      // Can you NOT navigate to a parent folder?  Used for Backspace button to parent folder or the View.GoTo.ParentFolder feature.
        BFO_NO_REOPEN_NEXT_RESTART          = 0x00002000,      // Browser windows are NOT reopened the next time the shell boots if the windows were left open on the previous logoff.  Does this NSE want the same feature?
        BFO_GO_HOME_PAGE                    = 0x00004000,      // Add "Home Page" to menu (Go).
        BFO_PREFER_IEPROCESS                = 0x00008000,      // prefers to use IEXPLORE.EXE over EXPLORER.EXE
        BFO_SHOW_NAVIGATION_CANCELLED       = 0x00010000,      // If navigation is aborted, show the "Action Cancelled" HTML page.
        
        BFO_QUERY_ALL                       = 0xFFFFFFFF,      // Return all values set.
    };
    typedef DWORD BROWSERFRAMEOPTIONS;

    HRESULT GetFrameOptions([in] BROWSERFRAMEOPTIONS dwMask, [out] BROWSERFRAMEOPTIONS * pdwOptions);
}


//-----------------------------------------
// Search Companion Info object
//-----------------------------------------

[
    uuid(DB5CEF35-BEC6-4762-A1BD-253F5BF67C72),
    helpstring("ISearchCompanionInfo Interface"),
    pointer_default(unique)
]
interface ISearchCompanionInfo : IUnknown
{
    HRESULT IsSearchCompanionInetAvailable([out] BOOL* pfAvailable);
};


cpp_quote("#include <pshpack8.h>")


typedef struct tagSMDATA
{
    DWORD   dwMask;             // SMDM_* values
    DWORD   dwFlags;            // Not used
    HMENU   hmenu;              // Static HMENU portion.
    HWND    hwnd;               // HWND owning the HMENU
    UINT    uId;                // Id of the item in the menu (-1 for menu itself)
    UINT    uIdParent;          // Id of the item spawning this menu
    UINT    uIdAncestor;        // Id of the very top item in the chain of ShellFolders
    IUnknown*    punk;          // IUnkown of the menuband
    LPITEMIDLIST   pidlFolder;  // pidl of the ShellFolder portion
    LPITEMIDLIST   pidlItem;    // pidl of the item in the ShellFolder portion
    IShellFolder*   psf;        // IShellFolder for the shell folder portion

    void*   pvUserData;         // User defined Data associated with a pane.

} SMDATA, *LPSMDATA;

cpp_quote("// Mask")
cpp_quote("#define SMDM_SHELLFOLDER               0x00000001  // This is for an item in the band")
cpp_quote("#define SMDM_HMENU                     0x00000002  // This is for the Band itself")
cpp_quote("#define SMDM_TOOLBAR                   0x00000004  // Plain toolbar, not associated with a shell folder or hmenu")

cpp_quote("// Flags (bitmask)")
typedef struct tagSMINFO
{
    DWORD   dwMask;     // SMIM_*
    DWORD   dwType;     // SMIT_*
    DWORD   dwFlags;    // SMIF_*
    int     iIcon;
} SMINFO, * PSMINFO;

typedef struct tagSHCSCHANGENOTIFYSTRUCT
{
    LONG            lEvent;     // Change notify Event
    LPCITEMIDLIST   pidl1;      // Pidl 1 Passed in from the Change notify
    LPCITEMIDLIST   pidl2;      // Pidl 2 Passed in from the Change notify
} SMCSHCHANGENOTIFYSTRUCT, *PSMCSHCHANGENOTIFYSTRUCT;


cpp_quote("#include <poppack.h>") /* Return to byte packing */


// Mask flags
enum
{
    SMIM_TYPE           = 0x00000001,
    SMIM_FLAGS          = 0x00000002,
    SMIM_ICON           = 0x00000004
};

// Types for mbiinfo.dwType
enum
{
    SMIT_SEPARATOR      = 0x00000001,
    SMIT_STRING         = 0x00000002
};

// Flags for mbiinfo.dwFlags
enum
{
    SMIF_ICON           = 0x00000001,       // Show an icon
    SMIF_ACCELERATOR    = 0x00000002,       // Underline the character marked w/ '&'
    SMIF_DROPTARGET     = 0x00000004,       // Item is a drop target
    SMIF_SUBMENU        = 0x00000008,       // Item has a submenu
    SMIF_VOLATILE       = 0x00000010,       // Obsolete.
    SMIF_CHECKED        = 0x00000020,       // Item has a Checkmark
    SMIF_DROPCASCADE    = 0x00000040,       // Item can cascade out during drag/drop
    SMIF_HIDDEN         = 0x00000080,       // Don't display item
    SMIF_DISABLED       = 0x00000100,       // Should be unselectable. Grey.
    SMIF_TRACKPOPUP     = 0x00000200,       // Should be unselectable. Grey.
    SMIF_DEMOTED        = 0x00000400,       // Display item in "Demoted" state.
    SMIF_ALTSTATE       = 0x00000800,       // Displayed in "Altered State"
    SMIF_DRAGNDROP      = 0x00001000,       // If item that is being dragged hovers over an item for long enough then it SMC_EXECs that item
    SMIF_NEW            = 0x00002000,       // Item is newly-installed or otherwise attractive (Whistler)
};

// Messages
//
//  SMC_INITMENU        Sent when a menu is shown.
//
//      
//  SMC_GETOBJECT       
//    wParam = riid   
//    lParam = ppv
//      Sent to get an object that supports riid.
//
cpp_quote("#define SMC_INITMENU            0x00000001  // The callback is called to init a menuband")
cpp_quote("#define SMC_CREATE              0x00000002")
cpp_quote("#define SMC_EXITMENU            0x00000003  // The callback is called when menu is collapsing")
cpp_quote("#define SMC_EXEC                0x00000004  // The callback is called to execute an item")
cpp_quote("#define SMC_GETINFO             0x00000005  // The callback is called to return DWORD values")
cpp_quote("#define SMC_GETSFINFO           0x00000006  // The callback is called to return DWORD values")
cpp_quote("#define SMC_GETOBJECT           0x00000007  // The callback is called to get some object")
cpp_quote("#define SMC_GETSFOBJECT         0x00000008  // The callback is called to get some object")
cpp_quote("#define SMC_SFEXEC              0x00000009  // The callback is called to execute an shell folder item")
cpp_quote("#define SMC_SFSELECTITEM        0x0000000A  // The callback is called when an item is selected")
cpp_quote("#define SMC_SELECTITEM          0x0000000B  // The callback is called when an item is selected")
cpp_quote("#define SMC_GETSFINFOTIP        0x0000000C  // The callback is called to get some object")
cpp_quote("#define SMC_GETINFOTIP          0x0000000D  // The callback is called to get some object")
cpp_quote("#define SMC_INSERTINDEX         0x0000000E  // New item insert index")
cpp_quote("#define SMC_POPUP               0x0000000F  // InitMenu/InitMenuPopup (sort of)")
cpp_quote("#define SMC_REFRESH             0x00000010  // Menus have completely refreshed. Reset your state.")
cpp_quote("#define SMC_DEMOTE              0x00000011  // Demote an item")
cpp_quote("#define SMC_PROMOTE             0x00000012  // Promote an item, wParam = SMINV_* flag")
cpp_quote("#define SMC_BEGINENUM           0x00000013  // tell callback that we are beginning to ENUM the indicated parent")
cpp_quote("#define SMC_ENDENUM             0x00000014  // tell callback that we are ending the ENUM of the indicated paren")
cpp_quote("#define SMC_MAPACCELERATOR      0x00000015  // Called when processing an accelerator.")
cpp_quote("#define SMC_DEFAULTICON         0x00000016  // Returns Default icon location in wParam, index in lParam")
cpp_quote("#define SMC_NEWITEM             0x00000017  // Notifies item is not in the order stream.")
cpp_quote("#define SMC_GETMINPROMOTED      0x00000018  // Returns the minimum number of promoted items")
cpp_quote("#define SMC_CHEVRONEXPAND       0x00000019  // Notifies of a expansion via the chevron")
cpp_quote("#define SMC_DISPLAYCHEVRONTIP   0x0000002A  // S_OK display, S_FALSE not.")
cpp_quote("#define SMC_DESTROY             0x0000002B  // Called when a pane is being destroyed.")
cpp_quote("#define SMC_SETOBJECT           0x0000002C  // Called to save the passed object")
cpp_quote("#define SMC_SETSFOBJECT         0x0000002D  // Called to save the passed object")
cpp_quote("#define SMC_SHCHANGENOTIFY      0x0000002E  // Called when a Change notify is received. lParam points to SMCSHCHANGENOTIFYSTRUCT")
cpp_quote("#define SMC_CHEVRONGETTIP       0x0000002F  // Called to get the chevron tip text. wParam = Tip title, Lparam = TipText Both MAX_PATH")
cpp_quote("#define SMC_SFDDRESTRICTED      0x00000030  // Called requesting if it's ok to drop. wParam = IDropTarget.")
cpp_quote("#define SMC_GETIMAGELISTS       0x00000031  // Called to get the small & large icon image lists, otherwise it will default to shell image list")
cpp_quote("#define SMC_CUSTOMDRAW          0x00000032  // Requires SMINIT_CUSTOMDRAW")
cpp_quote("#define SMC_BEGINDRAG           0x00000033  // Called to get preferred drop effect. wParam = &pdwEffect")
cpp_quote("#define SMC_MOUSEFILTER         0x00000034  // Called to allow host to filter mouse messages. wParam=bRemove, lParam=pmsg")
cpp_quote("#define SMC_DUMPONUPDATE        0x00000035  // S_OK if host wants old trash-everything-on-update behavior (recent docs)")
cpp_quote("")
cpp_quote("#define SMC_FILTERPIDL          0x10000000  // The callback is called to see if an item is visible")
cpp_quote("#define SMC_CALLBACKMASK        0xF0000000  // Mask of comutationally intense messages")

[
    uuid(4CA300A1-9B8D-11d1-8B22-00C04FD918D0),
    object,
    pointer_default(unique),
    local // cannot marshal because method has polymorphic parameters
]

interface IShellMenuCallback : IUnknown
{
    // psmd is [in,out] because SMC_MAPACCELERATOR returns a value in uId
    HRESULT CallbackSM([in,out] LPSMDATA psmd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};

//-------------------------------------------------------------------------
//
// IShellMenu interface
//
//-------------------------------------------------------------------------

cpp_quote("#define SMINIT_DEFAULT              0x00000000  // No Options")
cpp_quote("#define SMINIT_RESTRICT_CONTEXTMENU 0x00000001  // Don't allow Context Menus")
cpp_quote("#define SMINIT_RESTRICT_DRAGDROP    0x00000002  // Don't allow Drag and Drop")
cpp_quote("#define SMINIT_TOPLEVEL             0x00000004  // This is the top band.")
cpp_quote("#define SMINIT_DEFAULTTOTRACKPOPUP  0x00000008  // When no callback is specified, ")
                                                // default all HMENU items to Trackpopup
cpp_quote("#define SMINIT_CACHED               0x00000010")
cpp_quote("#define SMINIT_USEMESSAGEFILTER     0x00000020")
cpp_quote("#define SMINIT_LEGACYMENU           0x00000040  // Old Menu behaviour.")
cpp_quote("#define SMINIT_CUSTOMDRAW           0x00000080   // Send SMC_CUSTOMDRAW")

// Internal Menuband setting
cpp_quote("#define SMINIT_NOSETSITE            0x00010000  // Internal setting")

// These are mutually Exclusive
cpp_quote("#define SMINIT_VERTICAL             0x10000000  // This is a vertical menu")
cpp_quote("#define SMINIT_HORIZONTAL           0x20000000  // This is a horizontal menu    (does not inherit)")
cpp_quote("#define SMINIT_MULTICOLUMN          0x40000000  // this is a multi column menu")

cpp_quote("#define ANCESTORDEFAULT      (UINT)-1")

cpp_quote("#define SMSET_TOP                   0x10000000    // Bias this namespace to the top of the menu")
cpp_quote("#define SMSET_BOTTOM                0x20000000    // Bias this namespace to the bottom of the menu")
cpp_quote("#define SMSET_DONTOWN               0x00000001    // The Menuband doesn't own the non-ref counted object")
                                                  // and should not destroy it.
cpp_quote("#define SMSET_MERGE                 0x00000002")
cpp_quote("#define SMSET_NOEMPTY               0x00000004   // Dont show (Empty) on shell folder")
cpp_quote("#define SMSET_USEBKICONEXTRACTION   0x00000008   // Use the background icon extractor")
cpp_quote("#define SMSET_HASEXPANDABLEFOLDERS  0x00000010   // Need to call SHIsExpandableFolder")
cpp_quote("#define SMSET_DONTREGISTERCHANGENOTIFY 0x00000020 // ShellFolder is a discontiguous child of a parent shell folder")
cpp_quote("#define SMSET_COLLAPSEONEMPTY       0x00000040   // When Empty, causes a menus to collapse")
cpp_quote("#define SMSET_USEPAGER              0x00000080    //Enable pagers in static menus")
cpp_quote("#define SMSET_NOPREFIX              0x00000100    //Enable ampersand in static menus")
cpp_quote("#define SMSET_SEPARATEMERGEFOLDER   0x00000200    //Insert separator when MergedFolder host changes")

cpp_quote("#define SMINV_REFRESH        0x00000001")
cpp_quote("#define SMINV_ICON           0x00000002")
cpp_quote("#define SMINV_POSITION       0x00000004")
cpp_quote("#define SMINV_ID             0x00000008")
cpp_quote("#define SMINV_NEXTSHOW       0x00000010       // Does Invalidates on next show.")
cpp_quote("#define SMINV_PROMOTE        0x00000020       // Does Invalidates on next show.")
cpp_quote("#define SMINV_DEMOTE         0x00000040       // Does Invalidates on next show.")
cpp_quote("#define SMINV_FORCE          0x00000080")
cpp_quote("#define SMINV_NOCALLBACK     0x00000100       // Invalidates, but does not call the callback.")
cpp_quote("#define SMINV_INITMENU       0x00000200       // Call callback's SMC_INITMENU as part of invalidate (Whistler)")

[
    uuid(EE1F7637-E138-11d1-8379-00C04FD918D0),
    object,
    pointer_default(unique), /* some of our pointers can be NULL (as noted) */
    local
]
interface IShellMenu : IUnknown
{
    HRESULT Initialize([in] IShellMenuCallback* psmc, UINT uId, UINT uIdAncestor, DWORD dwFlags);
    HRESULT GetMenuInfo([out] IShellMenuCallback** ppsmc, [out] UINT* puId, [out] UINT* puIdAncestor, [out] DWORD* pdwFlags);
    HRESULT SetShellFolder(IShellFolder* psf, [in] LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags);
    HRESULT GetShellFolder([out] DWORD* pdwFlags, [out] LPITEMIDLIST* ppidl, [in] REFIID riid, [out, iid_is(riid)] void** ppv);
    HRESULT SetMenu([in] HMENU hmenu, [in] HWND hwnd, DWORD dwFlags);
    HRESULT GetMenu([out /* can be null */] HMENU* phmenu, [out /* can be null */] HWND* phwnd, [out /* can be null */] DWORD* pdwFlags);
    HRESULT InvalidateItem([in /* can be null */] LPSMDATA psmd, DWORD dwFlags);
    HRESULT GetState([out] LPSMDATA psmd);
    HRESULT SetMenuToolbar([in] IUnknown* punk, DWORD dwFlags);
};

// New for Whistler - used by Start Pane to get the Programs submenu
[
    uuid(6f51c646-0efe-4370-882a-c1f61cb27c3b),
    object,
    pointer_default(unique),
    local
]
interface IShellMenu2 : IShellMenu
{
    // Retrieves an interface on a submenu.
    HRESULT GetSubMenu(UINT idCmd, [in] REFIID riid, [out, iid_is(riid)] void **ppvObj);
    HRESULT SetToolbar([in] HWND hwnd, [in] DWORD dwFlags);
    HRESULT SetMinWidth([in] int cxMenu);
    HRESULT SetNoBorder([in] BOOL fNoBorder);
    HRESULT SetTheme([in, string] LPCWSTR pszTheme);
};

	[
    uuid(8278F932-2A3E-11d2-838F-00C04FD918D0),
    object,
    pointer_default(unique),
    local
]
interface ITrackShellMenu : IShellMenu
{
    HRESULT SetObscured([in] HWND hwndTB, [in] IUnknown* punkBand, DWORD dwSMSetFlags);
    HRESULT Popup([in] HWND hwnd, [in] POINTL *ppt, [in] RECTL *prcExclude, DWORD dwFlags);
};

[
    uuid(6d45a930-f71a-11d0-9ea7-00805f714772),
    helpstring("thumbnail extractor helper object"),
    local
]
interface IThumbnail : IUnknown
{
    // ::Init(HWND hwnd, UINT uMsg)
    //   Must initialize interface before use.  The hwnd given will receive the
    //   uMsg message when the bitmap is computed (cf. GetBitmap()).
    //
    // ::GetBitmap(LPCWSTR pwszFile, DWORD dwItem, LONG lWidth, LONG lHeight)
    //   Call this function to actually compute and return the bitmap.  pszFile is
    //   the parsing name (filename) whose bitmap is to be computed.  lWidth and lHeight are the
    //   width and height respectively of the rectangle containing the thumbnail,
    //   i.e. the size of the resultant bitmap.  When the bitmap is computed, the
    //   uMsg is sent to the hwnd (cf. Init()) where LPARAM is the HBITMAP, and
    //   WPARAM is dwItem (so it's an ID to identify the bitmap).
    //   NOTE: Call GetBitmap(NULL,...) to cancel any pending requests.
    HRESULT Init(HWND hwnd, UINT uMsg);
    HRESULT GetBitmap(LPCWSTR pszFile, DWORD dwItem, LONG lWidth, LONG lHeight);
};

[
    uuid(500202A0-731E-11d0-B829-00C04FD706EC),
    helpstring("thumbnail extractor helper object, supports pidl"),
    local
]
interface IThumbnail2 : IThumbnail
{
    HRESULT GetBitmapFromIDList(LPCITEMIDLIST pidl, DWORD dwItem, LONG lWidth, LONG lHeight);
}

[
    helpstring("interface to initialize MRU in auto complete"),
    uuid(F729FC5E-8769-4f3e-BDB2-D7B50FD2275B),
    object,
    local
]
interface IACLCustomMRU : IUnknown
{
    HRESULT Initialize([in, string] LPCWSTR pwszMRURegKey, [in] DWORD dwMax);
    HRESULT AddMRUString([in, string] LPCWSTR pwszEntry);
}

cpp_quote("#if _WIN32_IE >= 0x0600")
cpp_quote("// used in both shell32 and browseui")

[
    helpstring("IShellBrowserService"),
    uuid(1307ee17-ea83-49eb-96b2-3a28e2d7048a),     // IID_IShellBrowserService
    object,
    pointer_default(unique)
]
interface IShellBrowserService : IUnknown
{
    HRESULT GetPropertyBag([in] DWORD dwFlags, [in] REFIID riid, [out, iid_is(riid)] void** ppv);
};

cpp_quote("#endif // _WIN32_IE >= 0x0600")




[
    uuid(aba1bbae-8280-4b0c-80a3-39095d68881f)
]
library IEPrivateObjects
{
    // CLSID_HWEventSettings


    // CLSID_MruPidlList
    [ uuid(42aedc87-2188-41fd-b9a3-0c966feabec1) ] coclass MruPidlList { interface IMruPidlList; }

   // CLSID_MruLongList
    [ uuid(53bd6b4e-3780-4693-afc3-7161c2f3ee9c) ] coclass MruLongList { interface IMruDataList; }

    // CLSID_MruLongList
    [ uuid(53bd6b4f-3780-4693-afc3-7161c2f3ee9c) ] coclass MruShortList { interface IMruDataList; }

    // CLSID_FolderMarshalStub
    [ uuid(bf50b68e-29b8-4386-ae9c-9734d5117cd5) ] coclass FolderMarshalStub { interface IPersist; }

    // CLSID_MailRecipient
    [ uuid(9E56BE60-C50F-11CF-9A2C-00A0C90A90CE) ] coclass MailRecipient { interface IDropTarget; };

    [ uuid(AC1B0D5D-DD59-4ff0-93F8-A84373821606) ] coclass SearchCompanionInfo  { interface ISearchCompanionInfo; }

    // CLSID_TrackShellMenu
    [ uuid(8278F931-2A3E-11d2-838F-00C04FD918D0) ] coclass TrackShellMenu { interface ITrackShellMenu; }

     // CLSID_Thumbnail
    [ uuid(7487cd30-f71a-11d0-9ea7-00805f714772)] coclass Thumbnail { interface IThumbnail; }


}
