diff --git a/PInvoke/Shell32/ShObjIdl.INamespaceTreeControl.cs b/PInvoke/Shell32/ShObjIdl.INamespaceTreeControl.cs new file mode 100644 index 00000000..1a31041f --- /dev/null +++ b/PInvoke/Shell32/ShObjIdl.INamespaceTreeControl.cs @@ -0,0 +1,2166 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Vanara.PInvoke +{ + public static partial class Shell32 + { + /// Indicates which button was clicked and the kind of click. + [PInvokeData("shobjidl.h", MSDNShortId = "a595ffd0-edc6-4726-b7b2-ad1aed9e9701")] + [Flags] + public enum NSTCECLICKTYPE + { + /// The left button was clicked. + NSTCECT_LBUTTON = 0x0001, + + /// The middle button was clicked. + NSTCECT_MBUTTON = 0x0002, + + /// The right button was clicked. + NSTCECT_RBUTTON = 0x0003, + + /// A button was clicked. + NSTCECT_BUTTON = 0x0003, + + /// The click was a double click. If this value is present, it is added to one of the other values. + NSTCECT_DBLCLICK = 0x0004, + } + + /// The location on the IShellItem that was clicked. + [PInvokeData("shobjidl.h", MSDNShortId = "a595ffd0-edc6-4726-b7b2-ad1aed9e9701")] + [Flags] + public enum NSTCEHITTEST + { + /// The click missed the IShellItem. + NSTCEHT_NOWHERE = 0x0001, + + /// The click was on the icon of the IShellItem. + NSTCEHT_ONITEMICON = 0x0002, + + /// The click was on the label text of the IShellItem. + NSTCEHT_ONITEMLABEL = 0x0004, + + /// The click was on the indented space on the leftmost side of the IShellItem. + NSTCEHT_ONITEMINDENT = 0x0008, + + /// The click was on the expando button of the IShellItem. + NSTCEHT_ONITEMBUTTON = 0x0010, + + /// The click was on the rightmost side of the text of the IShellItem. + NSTCEHT_ONITEMRIGHT = 0x0020, + + /// The click was on the state icon of the IShellItem. + NSTCEHT_ONITEMSTATEICON = 0x0040, + + /// The click was on the item icon or the item label or the state icon of the IShellItem. + NSTCEHT_ONITEM = 0x0046, + + /// The click was on the tab button of the IShellItem. + NSTCEHT_ONITEMTABBUTTON = 0x1000, + }; + + /// + /// Specifies the state of a tree item. These values are used by methods of the INameSpaceTreeControlFolderCapabilities interface. + /// + /// The NSTCFOLDERCAPABILITIES type is defined in Shobjidl.h beginning in Windows 7. + // https://docs.microsoft.com/ja-jp/windows/win32/api/shobjidl_core/ne-shobjidl_core-nstcfoldercapabilities + [PInvokeData("shobjidl_core.h", MSDNShortId = "a5282277-85f5-494e-b994-efbf1116b519")] + [Flags] + public enum NSTCFOLDERCAPABILITIES + { + /// The property does not exist. Filtering is not supported. + NSTCFC_NONE = 0, + + /// Property exists. Supports filtering based on the value specified in System.IsPinnedToNameSpaceTree. + NSTCFC_PINNEDITEMFILTERING = 1, + + /// Delays registration for change notifications until the tree is expanded in the navigation pane. + NSTCFC_DELAY_REGISTER_NOTIFY = 2, + } + + /// The type of the next item. + [PInvokeData("shobjidl_core.h", MSDNShortId = "71ede595-14b6-4e59-854a-af75c02093f8")] + public enum NSTCGNI + { + /// The next sibling of the given item. + NSTCGNI_NEXT = 0, + + /// + /// The next visible item in the tree that has any relationship to the given item. This includes a child (if there is one), the + /// next sibling, or even one of the ancestor's siblings. + /// + NSTCGNI_NEXTVISIBLE = 1, + + /// The previous sibling item of the given item. + NSTCGNI_PREV = 2, + + /// The previous visible item that is a sibling item, sibling descendent item or a parent item. + NSTCGNI_PREVVISIBLE = 3, + + /// The parent item of the given item. + NSTCGNI_PARENT = 4, + + /// The first child item of the given item. + NSTCGNI_CHILD = 5, + + /// The absolute first visible item in the tree (not relative to the given item). + NSTCGNI_FIRSTVISIBLE = 6, + + /// The absolute last visible item in the tree (not relative to the given item). + NSTCGNI_LASTVISIBLE = 7, + } + + /// Specifies the state of a tree item. These values are used by methods of the INameSpaceTreeControl interface. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/ne-shobjidl_core-_nstcitemstate typedef enum _NSTCITEMSTATE { + // NSTCIS_NONE, NSTCIS_SELECTED, NSTCIS_EXPANDED, NSTCIS_BOLD, NSTCIS_DISABLED, NSTCIS_SELECTEDNOEXPAND } ; + [PInvokeData("shobjidl_core.h", MSDNShortId = "1f3fd526-c044-41ff-9e05-c6d91d386b42")] + [Flags] + public enum NSTCITEMSTATE : uint + { + /// The item has default state; it is not selected, expanded, bolded or disabled. + NSTCIS_NONE = 0x0000, + + /// The item is selected. + NSTCIS_SELECTED = 0x0001, + + /// The item is expanded. + NSTCIS_EXPANDED = 0x0002, + + /// The item is bold. + NSTCIS_BOLD = 0x0004, + + /// The item is disabled. + NSTCIS_DISABLED = 0x0008, + + /// Windows 7 and later. The item is selected, but not expanded. + NSTCIS_SELECTEDNOEXPAND = 0x0010, + } + + /// Specifies the style of the root that is being appended. + [PInvokeData("shobjidl_core.h", MSDNShortId = "a280d183-9215-43c2-bba3-63c34ba33285")] + [Flags] + public enum NSTCROOTSTYLE : uint + { + /// The root is visible as well as the items. Mutually exclusive with NSTCRS_HIDDEN. + NSTCRS_VISIBLE = 0x0000, + + /// The root is hidden so that the children only are visible. Mutually exclusive with NSTCRS_VISIBLE. + NSTCRS_HIDDEN = 0x0001, + + /// The root is expanded upon initialization. + NSTCRS_EXPANDED = 0x0002, + } + + /// Describes the characteristics of a given namespace tree control. + /// + /// + /// Three values have effect only in conjunction with NSTCS_CHECKBOXES: NSTCS_PARTIALCHECKBOXES, NSTCS_EXCLUSIONCHECKBOXES, and + /// NSTCS_DIMMEDCHECKBOXES. The icons associated with these states are inserted into the state image list as follows: + /// + /// + /// + /// Image Slot + /// Image + /// Associated Flags + /// + /// + /// 0 + /// Blank + /// NSTCS_CHECKBOXES + /// + /// + /// 1 + /// Unchecked + /// NSTCS_CHECKBOXES + /// + /// + /// 2 + /// Checked + /// NSTCS_CHECKBOXES + /// + /// + /// 3 + /// Partial + /// NSTCS_CHECKBOXES | NSTCS_PARTIALCHECKBOXES + /// + /// + /// 4 + /// Exclusion (red X) + /// NSTCS_CHECKBOXES | NSTCS_EXCLUSIONCHECKBOXES + /// + /// + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/ne-shobjidl_core-_nstcstyle typedef enum _NSTCSTYLE { + // NSTCS_HASEXPANDOS, NSTCS_HASLINES, NSTCS_SINGLECLICKEXPAND, NSTCS_FULLROWSELECT, NSTCS_SPRINGEXPAND, NSTCS_HORIZONTALSCROLL, + // NSTCS_ROOTHASEXPANDO, NSTCS_SHOWSELECTIONALWAYS, NSTCS_NOINFOTIP, NSTCS_EVENHEIGHT, NSTCS_NOREPLACEOPEN, NSTCS_DISABLEDRAGDROP, + // NSTCS_NOORDERSTREAM, NSTCS_RICHTOOLTIP, NSTCS_BORDER, NSTCS_NOEDITLABELS, NSTCS_TABSTOP, NSTCS_FAVORITESMODE, NSTCS_AUTOHSCROLL, + // NSTCS_FADEINOUTEXPANDOS, NSTCS_EMPTYTEXT, NSTCS_CHECKBOXES, NSTCS_PARTIALCHECKBOXES, NSTCS_EXCLUSIONCHECKBOXES, + // NSTCS_DIMMEDCHECKBOXES, NSTCS_NOINDENTCHECKS, NSTCS_ALLOWJUNCTIONS, NSTCS_SHOWTABSBUTTON, NSTCS_SHOWDELETEBUTTON, + // NSTCS_SHOWREFRESHBUTTON } ; + [PInvokeData("shobjidl_core.h", MSDNShortId = "879af1be-2eea-4ebd-b9ea-64b1db40682d")] + [Flags] + public enum NSTCSTYLE : uint + { + /// + /// The control displays a triangle—known as an expando—on the leftmost edge of those items that have child items. Clicking on + /// the expando expands the item to reveal the children of the item. Has no effect when combined with NSTCS_SHOWTABSBUTTON, + /// NSTCS_SHOWDELETEBUTTON, or NSTCS_SHOWREFRESHBUTTON. Maps to the TVS_HASBUTTONS tree view control style. + /// + NSTCS_HASEXPANDOS = 0x00000001, + + /// + /// The control draws lines to the left of the tree items that lead to their individual parent items. Has no effect when + /// combined with NSTCS_SHOWTABSBUTTON, NSTCS_SHOWDELETEBUTTON, or NSTCS_SHOWREFRESHBUTTON. Maps to the TVS_HASLINES tree view + /// control style. + /// + NSTCS_HASLINES = 0x00000002, + + /// + /// An item expands to show its child items in response to a single mouse click. Maps to the TVS_SINGLEEXPAND tree view control style. + /// + NSTCS_SINGLECLICKEXPAND = 0x00000004, + + /// + /// The selection of an item fills the row with inverse text to the end of the window area, regardless of the length of the + /// text. When this option is not declared, only the area behind text is inverted. This value cannot be combined with + /// NSTCS_HASLINES. Maps to the TVS_FULLROWSELECT tree view control style. + /// + NSTCS_FULLROWSELECT = 0x00000008, + + /// + /// When one item is selected and expanded and you select a second item, the first selection automatically collapses. This is + /// the opposite of the TVS_EX_NOSINGLECOLLAPSE tree view control style. + /// + NSTCS_SPRINGEXPAND = 0x00000010, + + /// + /// The area of the window that contains the tree of namespace items has a horizontal scroll bar. Maps to the WS_HSCROLL Windows style. + /// + NSTCS_HORIZONTALSCROLL = 0x00000020, + + /// + /// The root item is preceded by an expando that allows expansion of the root item. Maps to the TVS_LINESATROOT tree view + /// control style. + /// + NSTCS_ROOTHASEXPANDO = 0x00000040, + + /// + /// The node of an item is outlined when the control does not have the focus. Maps to the TVS_SHOWSELALWAYS tree view control style. + /// + NSTCS_SHOWSELECTIONALWAYS = 0x00000080, + + /// + /// Do not display infotips when the mouse cursor is over an item. This is the opposite of the TVS_INFOTIP tree view control style. + /// + NSTCS_NOINFOTIP = 0x00000200, + + /// + /// Sets the height of the items to an even height. By default, the height of items can be even or odd. This is the opposite of + /// the TVS_NONEVENHEIGHT tree view control style. + /// + NSTCS_EVENHEIGHT = 0x00000400, + + /// Do not replace the Open command in the shortcut menu with a user-defined function. + NSTCS_NOREPLACEOPEN = 0x00000800, + + /// + /// Do not allow drag-and-drop operations within the control. Note that you can still drag an item from outside of the control + /// and drop it onto the control. Maps to the TVS_DISABLEDRAGDROP tree view control style. + /// + NSTCS_DISABLEDRAGDROP = 0x00001000, + + /// + /// Do not persist reordering changes. Used with NSTCS_FAVORITESMODE. If favorites mode is not specified, this flag has no effect. + /// + NSTCS_NOORDERSTREAM = 0x00002000, + + /// + /// Use a rich tooltip. Rich tooltips display the item's icon in addition to the item's text. A standard tooltip displays only + /// the item's text. The tree view displays tooltips only for items in the tree that are partially visible. Maps to the + /// TVS_EX_RICHTOOLTIP tree view control style.NSTCS_RICHTOOLTIP has no effect unless it is combined with NSTCS_NOINFOTIP and/or + /// NSTCS_FAVORITESMODE. If NSTCS_NOINFOTIP is not specified, the tree view displays an infotip instead of a tooltip. If + /// NSTCS_FAVORITESMODE is not specified, the namespace tree control always sets the TVS_EX_RICHTOOLTIP style. + /// + NSTCS_RICHTOOLTIP = 0x00004000, + + /// Draw a thin border around the control. Corresponds to WS_BORDER. + NSTCS_BORDER = 0x00008000, + + /// + /// Do not allow creation of an in-place edit box, which would allow the user to rename the given item. This is the opposite of + /// the TVS_EDITLABELS tree view control style. + /// + NSTCS_NOEDITLABELS = 0x00010000, + + /// If the control is hosted, you can tabstop into the control. Corresponds to WS_EX_CONTROLPARENT. + NSTCS_TABSTOP = 0x00020000, + + /// The control has the appearance of the favorites band in Windows XP. + NSTCS_FAVORITESMODE = 0x00080000, + + /// + /// When you hover the mouse pointer over an item that extends past the end of the control window, the control automatically + /// scrolls horizontally so that the item appears more fully in the window area. Maps to the TVS_EX_AUTOHSCROLL tree view + /// control style. + /// + NSTCS_AUTOHSCROLL = 0x00100000, + + /// + /// If the control does not have the focus and there are items that are preceded by expandos, then these expandos are visible + /// only when the mouse pointer is near to the control. Maps to the TVS_EX_FADEINOUTEXPANDOS tree view control style. + /// + NSTCS_FADEINOUTEXPANDOS = 0x00200000, + + /// + /// If an item has no children and is not expanded, then that item contains a line of text at the child level that says "empty". + /// + NSTCS_EMPTYTEXT = 0x00400000, + + /// + /// Items have check boxes on their leftmost side. These check boxes can be of types partial, exclusion or dimmed, which + /// correspond to the flags NSTCS_PARTIALCHECKBOXES, NSTCS_EXCLUSIONCHECKBOXES, and NSTCS_DIMMEDCHECKBOXES. Maps to the + /// TVS_CHECKBOXES tree view control style. + /// + NSTCS_CHECKBOXES = 0x00800000, + + /// + /// Adds a checkbox icon on the leftmost side of a given item with a square in the center, that indicates that the node is + /// partially selected. Must be combined with NSTCS_CHECKBOXES. Maps to the TVS_EX_PARTIALCHECKBOXES tree view control style. + /// + NSTCS_PARTIALCHECKBOXES = 0x01000000, + + /// + /// Adds a checkbox icon on the leftmost side of a given item that contains a red X, which indicates that the item is excluded + /// from the current selection. Without this exclusion icon, selection of a parent item includes selection of its child items. + /// Must be combined with NSTCS_CHECKBOXES. Maps to the TVS_EX_EXCLUSIONCHECKBOXES tree view control style. + /// + NSTCS_EXCLUSIONCHECKBOXES = 0x02000000, + + /// + /// Adds a checkbox on the leftmost side of a given item that contains an icon of a dimmed check mark, that indicates that a + /// node is selected because its parent is selected. Must be combined with NSTCS_CHECKBOXES. Maps to the TVS_EX_DIMMEDCHECKBOXES + /// tree view control style. + /// + NSTCS_DIMMEDCHECKBOXES = 0x04000000, + + /// + /// Check boxes are located at the far left edge of the window area instead of being indented. Maps to the TVS_EX_NOINDENTSTATE + /// tree view control style. + /// + NSTCS_NOINDENTCHECKS = 0x08000000, + + /// + /// Allow junctions. A junction point, or just junction, is a root of a namespace extension that is normally displayed by + /// Windows Explorer as a folder in both tree and folder views. For Windows Explorer to display your extension's files and + /// subfolders, you must specify where the root folder is located in the Shell namespace hierarchy. Junctions exist in the file + /// system as files, but are not treated as files. An example is a compressed file with a .zip file name extension, which to the + /// file system is just a file. However, if this file is treated as a junction, it can represent an entire namespace. This + /// allows the namespace tree control to treat compressed files and similar junctions as folders rather than as files. + /// + NSTCS_ALLOWJUNCTIONS = 0x10000000, + + /// + /// Displays an arrow on the right side of an item if the item is a folder. The action associated with the arrow is + /// implementation specific. Cannot be combined with NSTCS_SHOWDELETEBUTTON or NSTCS_SHOWREFRESHBUTTON. + /// + NSTCS_SHOWTABSBUTTON = 0x20000000, + + /// + /// Displays a red X on the right side of an item. The action associated with the X is implementation specific. Cannot be + /// combined with NSTCS_SHOWTABSBUTTON or NSTCS_SHOWREFRESHBUTTON. + /// + NSTCS_SHOWDELETEBUTTON = 0x40000000, + + /// + /// Displays a refresh button on the right side of an item. The action associated with the button is implementation specific. + /// Cannot be combined with NSTCS_SHOWTABSBUTTON or NSTCS_SHOWDELETEBUTTON. + /// + NSTCS_SHOWREFRESHBUTTON = 0x80000000, + } + + /// Used by methods of the INameSpaceTreeControl2 to specify extended display styles in a Shell namespace treeview. + /// + /// The value NSTCS2_ALLMASK can be used to mask for the NSTCS2_INTERRUPTNOTIFICATIONS, NSTCS2_SHOWNULLSPACEMENU, and + /// NSTCS2_DISPLAYPADDING values. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/ne-shobjidl-nstcstyle2 typedef enum NSTCSTYLE2 { NSTCS2_DEFAULT, + // NSTCS2_INTERRUPTNOTIFICATIONS, NSTCS2_SHOWNULLSPACEMENU, NSTCS2_DISPLAYPADDING, NSTCS2_DISPLAYPINNEDONLY, + // NTSCS2_NOSINGLETONAUTOEXPAND, NTSCS2_NEVERINSERTNONENUMERATED } ; + [PInvokeData("shobjidl.h", MSDNShortId = "0bfa6900-71c0-44b7-8157-662bee58e6c9")] + [Flags] + public enum NSTCSTYLE2 + { + /// Displays the tree nodes in default mode, which includes none of the following values. + NSTCS2_DEFAULT = 0x00000000, + + /// Displays interrupt notifications. + NSTCS2_INTERRUPTNOTIFICATIONS = 0x00000001, + + /// Displays the context menu in the padding space. + NSTCS2_SHOWNULLSPACEMENU = 0x00000002, + + /// Inserts spacing (padding) between top-level nodes. + NSTCS2_DISPLAYPADDING = 0x00000004, + + /// + /// Filters items based on the System.IsPinnedToNameSpaceTree value when INameSpaceTreeControlFolderCapabilities is implemented. + /// + NSTCS2_DISPLAYPINNEDONLY = 0x00000008, + + /// + NTSCS2_NOSINGLETONAUTOEXPAND = 0x00000010, + + /// Do not insert nonenumerated (SFGAO_NONENUMERATED) items in the tree. + NTSCS2_NEVERINSERTNONENUMERATED = 0x00000020, + } + + /// Exposes methods that perform accessibility actions on a Shell item from a namespace tree control. + /// This interface is used only by INameSpaceTreeControl (CLSID_NameSpaceTreeControl). + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nn-shobjidl-inamespacetreeaccessible + [PInvokeData("shobjidl.h", MSDNShortId = "b14dfe40-e21a-4208-835f-e0febef60783")] + [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("71f312de-43ed-4190-8477-e9536b82350b"), CoClass(typeof(NameSpaceTreeControl))] + public interface INameSpaceTreeAccessible + { + /// Gets the default accessibility action for a Shell item. + /// + /// Type: IShellItem* + /// Pointer to the IShellItem. + /// + /// + /// Type: BSTR* + /// When this method returns, contains a BSTR that specifies the default, accessibility action. + /// + /// + /// Type: HRESULT + /// Returns S_OK if successful, or E_OUTOFMEMORY otherwise. + /// + /// This method is called when the default accessibililty action for a Shell item is retrieved. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreeaccessible-ongetdefaultaccessibilityaction + // HRESULT OnGetDefaultAccessibilityAction( IShellItem *psi, BSTR *pbstrDefaultAction ); + [PreserveSig] + HRESULT OnGetDefaultAccessibilityAction([In] IShellItem psi, [MarshalAs(UnmanagedType.BStr)] out string pbstrDefaultAction); + + /// Invokes the default accessibility action on a Shell item. + /// + /// Type: IShellItem* + /// Pointer to the IShellItem. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreeaccessible-ondodefaultaccessibilityaction + // HRESULT OnDoDefaultAccessibilityAction( IShellItem *psi ); + [PreserveSig] + HRESULT OnDoDefaultAccessibilityAction([In] IShellItem psi); + + /// Gets the accessibility role for a Shell item. + /// + /// Type: IShellItem* + /// Pointer to the IShellItem. + /// + /// + /// Type: VARIANT* + /// When this method returns, contains a VARIANT that specifies the role. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// This method is called when the accessibility role for a Shell item is retrieved. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreeaccessible-ongetaccessibilityrole + // HRESULT OnGetAccessibilityRole( IShellItem *psi, VARIANT *pvarRole ); + [PreserveSig] + HRESULT OnGetAccessibilityRole([In] IShellItem psi, out object pvarRole); + } + + /// Exposes methods used to view and manipulate nodes in a tree of Shell items. + /// To implement this interface use class ID CLSID_NameSpaceTreeControl. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-inamespacetreecontrol + [PInvokeData("shobjidl_core.h", MSDNShortId = "2072cb3c-e540-4708-bfe8-33fff3a190bd")] + [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("028212A3-B627-47e9-8856-C14265554E4F"), CoClass(typeof(NameSpaceTreeControl))] + public interface INameSpaceTreeControl + { + /// Initializes an INameSpaceTreeControl object. + /// + /// Type: HWND + /// The handle of the parent window. + /// + /// + /// Type: RECT* + /// A pointer to a RECT structure that describes the size and position of the control in the client window. + /// + /// + /// Type: NSTCSTYLE + /// The characteristics of the given namespace tree control. One or more of the following values from the NSTCSTYLE enumeration. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-initialize HRESULT + // Initialize( HWND hwndParent, RECT *prc, NSTCSTYLE nsctsFlags ); + [PreserveSig] + HRESULT Initialize(HWND hwndParent, in RECT prc, NSTCSTYLE nsctsFlags); + + /// Enables a client to register with the control. + /// + /// Type: IUnknown* + /// A pointer to the client IUnknown that registers with the control. + /// + /// + /// Type: DWORD* + /// A pointer to the cookie that is passed back for registration. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// The pointer to the cookie that is passed back is used to unregister the control later with INameSpaceTreeControl::TreeUnadvise. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-treeadvise HRESULT + // TreeAdvise( IUnknown *punk, DWORD *pdwCookie ); + [PreserveSig] + HRESULT TreeAdvise([MarshalAs(UnmanagedType.IUnknown)] object punk, out uint pdwCookie); + + /// Enables a client to unregister with the control. + /// + /// Type: DWORD* + /// A pointer to the cookie that is to be unregistered. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// The pointer to the cookie that is passed in is the one that was passed back in INameSpaceTreeControl::TreeAdvise. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-treeunadvise HRESULT + // TreeUnadvise( DWORD dwCookie ); + [PreserveSig] + HRESULT TreeUnadvise(uint dwCookie); + + /// Appends a Shell item to the list of roots in a tree. + /// + /// Type: IShellItem* + /// Pointer to the Shell item that is being appended. + /// + /// + /// Type: SHCONTF + /// + /// Enumerates the qualities of the root and all of its children. One or more of the values of type SHCONTF. These flags can be + /// combined using a bitwise OR. + /// + /// + /// + /// Type: NSTCROOTSTYLE + /// Specifies the style of the root that is being appended. One or more of the following values: + /// NSTCRS_VISIBLE (0x0000) + /// The root is visible as well as the items. Mutually exclusive with NSTCRS_HIDDEN. + /// NSTCRS_HIDDEN (0x0001) + /// The root is hidden so that the children only are visible. Mutually exclusive with NSTCRS_VISIBLE. + /// NSTCRS_EXPANDED (0x0002) + /// The root is expanded upon initialization. + /// + /// + /// Type: IShellItemFilter* + /// + /// Pointer to the IShellItemFilter that enables you to filter which items in the tree are displayed. If supplied, every item is + /// customizable with a SHCONTF flag. This value can be NULL if no filter is required. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-appendroot HRESULT + // AppendRoot( IShellItem *psiRoot, SHCONTF grfEnumFlags, NSTCROOTSTYLE grfRootStyle, IShellItemFilter *pif ); + [PreserveSig] + HRESULT AppendRoot(IShellItem psiRoot, SHCONTF grfEnumFlags, NSTCROOTSTYLE grfRootStyle, [In] IShellItemFilter pif); + + /// Inserts a Shell item on a root item in a tree. + /// + /// Type: int + /// The index at which to insert the root. + /// + /// + /// Type: IShellItem* + /// A pointer to the Shell item that is being inserted. + /// + /// + /// Type: SHCONTF + /// Enumerates the qualities of the root and all of its children. One of the values of type SHCONTF. + /// + /// + /// Type: NSTCROOTSTYLE + /// + /// The style of the root that is being inserted. One or more of the following values (flags can be combined using a bitwise OR). + /// + /// NSTCRS_VISIBLE (0x0000) + /// The root is visible as well as the items. Mutually exclusive with NSTCRS_HIDDEN. + /// NSTCRS_HIDDEN (0x0001) + /// The root is hidden so that only the children are visible. Mutually exclusive with NSTCRS_VISIBLE. + /// NSTCRS_EXPANDED (0x0002) + /// The root is expanded upon initialization. + /// + /// + /// Type: IShellItemFilter* + /// + /// A pointer to the IShellItemFilter that enables you to filter which items in the tree are displayed. If supplied, every item + /// is customizable with a SHCONTF flag. This value can be NULL if no filter is required. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-insertroot HRESULT + // InsertRoot( int iIndex, IShellItem *psiRoot, SHCONTF grfEnumFlags, NSTCROOTSTYLE grfRootStyle, IShellItemFilter *pif ); + [PreserveSig] + HRESULT InsertRoot(int iIndex, IShellItem psiRoot, SHCONTF grfEnumFlags, NSTCROOTSTYLE grfRootStyle, [In] IShellItemFilter pif); + + /// Removes a root and its children from a tree. + /// + /// Type: IShellItem* + /// A pointer to the root that is to be removed. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-removeroot HRESULT + // RemoveRoot( IShellItem *psiRoot ); + [PreserveSig] + HRESULT RemoveRoot(IShellItem psiRoot); + + /// Removes all roots and their children from a tree. + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-removeallroots + // HRESULT RemoveAllRoots(); + [PreserveSig] + HRESULT RemoveAllRoots(); + + /// Gets an array of the root items. + /// + /// Type: IShellItemArray** + /// A pointer to an array of root items. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getrootitems HRESULT + // GetRootItems( IShellItemArray **ppsiaRootItems ); + [PreserveSig] + HRESULT GetRootItems(out IShellItemArray ppsiaRootItems); + + /// Sets state information for a Shell item. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which to set the state. + /// + /// + /// Type: NSTCITEMSTATE + /// Specifies which information is being set, in the form of a bitmap. One or more of the NSTCITEMSTATE constants. + /// + /// + /// Type: NSTCITEMSTATE + /// A bitmap that contains the values to set for the flags specified in nstcisMask. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// The nstcisMask value specifies which bits in the value pointed to by pnstcisFlags are to be set. Other bits are ignored. As + /// a simple example, if nstcisMask=NSTCIS_SELECTED, then the first bit in the nstcisFlags value determines whether that flag is + /// set (1) or removed (0). + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-setitemstate HRESULT + // SetItemState( IShellItem *psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE nstcisFlags ); + [PreserveSig] + HRESULT SetItemState(IShellItem psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE nstcisFlags); + + /// Gets state information about a Shell item. + /// + /// Type: IShellItem* + /// A pointer to the Shell item from which to retrieve the state. + /// + /// + /// Type: NSTCITEMSTATE + /// Specifies which information is being requested, in the form of a bitmap. One or more of the NSTCITEMSTATE constants. + /// + /// + /// Type: NSTCITEMSTATE* + /// When this method returns, points to a bitmap that contains the values requested in nstcisMask. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// The nstcisMask value specifies which bits in the value pointed to by pnstcisFlags are requested. As a simple example, if + /// nstcisMask=NSTCIS_SELECTED, then only the first bit in the value pointed to by pnstcisFlags is valid when this method + /// returns. If the first bit in the value pointed to by pnstcisFlags is 1, then the NSTCIS_SELECTED flag is set. If the first + /// bit in the value pointed to by pnstcisFlags is 0, then the NSTCIS_SELECTED flag is not set. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getitemstate HRESULT + // GetItemState( IShellItem *psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE *pnstcisFlags ); + [PreserveSig] + HRESULT GetItemState(IShellItem psi, NSTCITEMSTATE nstcisMask, out NSTCITEMSTATE pnstcisFlags); + + /// Gets an array of selected Shell items. + /// + /// Type: IShellItemArray** + /// A pointer to an array of selected Shell items. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getselecteditems + // HRESULT GetSelectedItems( IShellItemArray **psiaItems ); + [PreserveSig] + HRESULT GetSelectedItems(out IShellItemArray psiaItems); + + /// Gets the state of the checkbox associated with a given Shell item. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which checkbox state is being retrieved. + /// + /// + /// Type: int* + /// A pointer to the state of the checkbox for the Shell item. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getitemcustomstate + // HRESULT GetItemCustomState( IShellItem *psi, int *piStateNumber ); + [PreserveSig] + HRESULT GetItemCustomState(IShellItem psi, out int piStateNumber); + + /// Sets the state of the checkbox associated with the Shell item. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which checkbox state is being set. + /// + /// + /// Type: int + /// The desired state of the checkbox for the Shell item. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-setitemcustomstate + // HRESULT SetItemCustomState( IShellItem *psi, int iStateNumber ); + [PreserveSig] + HRESULT SetItemCustomState(IShellItem psi, int iStateNumber); + + /// Ensures that the given item is visible. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which the visibility is being ensured. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-ensureitemvisible + // HRESULT EnsureItemVisible( IShellItem *psi ); + [PreserveSig] + HRESULT EnsureItemVisible(IShellItem psi); + + /// Sets the desktop theme for the current window only. + /// + /// Type: LPCWSTR + /// The name of the desktop theme to which the current window is being set. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-settheme HRESULT + // SetTheme( LPCWSTR pszTheme ); + [PreserveSig] + HRESULT SetTheme([MarshalAs(UnmanagedType.LPWStr)] string pszTheme); + + /// Retrieves the next item in the tree according to which method is requested. + /// + /// Type: IShellItem* + /// The Shell item for which the next item is being retrieved. This value can be NULL. + /// + /// + /// Type: NSTCGNI + /// The type of the next item. This value can be one of the following flags: + /// NSTCGNI_NEXT (0) + /// The next sibling of the given item. + /// NSTCGNI_NEXTVISIBLE (1) + /// + /// The next visible item in the tree that has any relationship to the given item. This includes a child (if there is one), the + /// next sibling, or even one of the ancestor's siblings. + /// + /// NSTCGNI_PREV (2) + /// The previous sibling item of the given item. + /// NSTCGNI_PREVVISIBLE (3) + /// The previous visible item that is a sibling item, sibling descendent item or a parent item. + /// NSTCGNI_PARENT (4) + /// The parent item of the given item. + /// NSTCGNI_CHILD (5) + /// The first child item of the given item. + /// NSTCGNI_FIRSTVISIBLE (6) + /// The absolute first visible item in the tree (not relative to the given item). + /// NSTCGNI_LASTVISIBLE (7) + /// The absolute last visible item in the tree (not relative to the given item). + /// + /// + /// Type: IShellItem** + /// The address of a pointer to the IShellItem that fits the criteria for the next item that was requested. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// If there is no next item for the type selected, this function returns E_FAIL with NULL for the returned item, ppsiNext. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getnextitem HRESULT + // GetNextItem( IShellItem *psi, NSTCGNI nstcgi, IShellItem **ppsiNext ); + [PreserveSig] + HRESULT GetNextItem([In] IShellItem psi, NSTCGNI nstcgi, out IShellItem ppsiNext); + + /// Retrieves the item that a given point is in, if any. + /// + /// Type: POINT* + /// A pointer to the point to be tested. + /// + /// + /// Type: IShellItem** + /// The address of a pointer to the item in which the point exists, or NULL if the point does not exist in an item. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// This function returns S_FALSE with a NULL item if the point does not exist in an item. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-hittest HRESULT + // HitTest( POINT *ppt, IShellItem **ppsiOut ); + [PreserveSig] + HRESULT HitTest(in System.Drawing.Point ppt, out IShellItem ppsiOut); + + /// Gets the RECT structure that describes the size and position of a given item. + /// + /// Type: IShellItem* + /// A pointer to the item for which the RECT structure is being retrieved. + /// + /// + /// Type: RECT* + /// A pointer to the RECT structure that describes the size and position of the item. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getitemrect HRESULT + // GetItemRect( IShellItem *psi, RECT *prect ); + [PreserveSig] + HRESULT GetItemRect(IShellItem psi, out RECT prect); + + /// Collapses all of the items in the given tree. + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-collapseall HRESULT CollapseAll(); + [PreserveSig] + HRESULT CollapseAll(); + } + + /// + /// Extends the INameSpaceTreeControl interface by providing methods that get and set the display styles of treeview controls for + /// use with Shell namespace items. + /// + /// + /// This interface also provides the methods of the INameSpaceTreeControl interface, from which it inherits. + /// Use class identifier (CLSID) CLSID_NameSpaceTreeControl to instantiate an instance of this interface. + /// When to Implement + /// An implementation of this interface is provided with Windows. Third parties should not implement their own versions. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nn-shobjidl-inamespacetreecontrol2 + [PInvokeData("shobjidl.h", MSDNShortId = "5f9514db-35fe-44c7-9324-d69022628913")] + [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("7cc7aed8-290e-49bc-8945-c1401cc9306c"), CoClass(typeof(NameSpaceTreeControl))] + public interface INameSpaceTreeControl2 : INameSpaceTreeControl + { + /// Initializes an INameSpaceTreeControl object. + /// + /// Type: HWND + /// The handle of the parent window. + /// + /// + /// Type: RECT* + /// A pointer to a RECT structure that describes the size and position of the control in the client window. + /// + /// + /// Type: NSTCSTYLE + /// The characteristics of the given namespace tree control. One or more of the following values from the NSTCSTYLE enumeration. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-initialize HRESULT + // Initialize( HWND hwndParent, RECT *prc, NSTCSTYLE nsctsFlags ); + [PreserveSig] + new HRESULT Initialize(HWND hwndParent, in RECT prc, NSTCSTYLE nsctsFlags); + + /// Enables a client to register with the control. + /// + /// Type: IUnknown* + /// A pointer to the client IUnknown that registers with the control. + /// + /// + /// Type: DWORD* + /// A pointer to the cookie that is passed back for registration. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// The pointer to the cookie that is passed back is used to unregister the control later with INameSpaceTreeControl::TreeUnadvise. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-treeadvise HRESULT + // TreeAdvise( IUnknown *punk, DWORD *pdwCookie ); + [PreserveSig] + new HRESULT TreeAdvise([MarshalAs(UnmanagedType.IUnknown)] object punk, out uint pdwCookie); + + /// Enables a client to unregister with the control. + /// + /// Type: DWORD* + /// A pointer to the cookie that is to be unregistered. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// The pointer to the cookie that is passed in is the one that was passed back in INameSpaceTreeControl::TreeAdvise. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-treeunadvise HRESULT + // TreeUnadvise( DWORD dwCookie ); + [PreserveSig] + new HRESULT TreeUnadvise(uint dwCookie); + + /// Appends a Shell item to the list of roots in a tree. + /// + /// Type: IShellItem* + /// Pointer to the Shell item that is being appended. + /// + /// + /// Type: SHCONTF + /// + /// Enumerates the qualities of the root and all of its children. One or more of the values of type SHCONTF. These flags can be + /// combined using a bitwise OR. + /// + /// + /// + /// Type: NSTCROOTSTYLE + /// Specifies the style of the root that is being appended. One or more of the following values: + /// NSTCRS_VISIBLE (0x0000) + /// The root is visible as well as the items. Mutually exclusive with NSTCRS_HIDDEN. + /// NSTCRS_HIDDEN (0x0001) + /// The root is hidden so that the children only are visible. Mutually exclusive with NSTCRS_VISIBLE. + /// NSTCRS_EXPANDED (0x0002) + /// The root is expanded upon initialization. + /// + /// + /// Type: IShellItemFilter* + /// + /// Pointer to the IShellItemFilter that enables you to filter which items in the tree are displayed. If supplied, every item is + /// customizable with a SHCONTF flag. This value can be NULL if no filter is required. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-appendroot HRESULT + // AppendRoot( IShellItem *psiRoot, SHCONTF grfEnumFlags, NSTCROOTSTYLE grfRootStyle, IShellItemFilter *pif ); + [PreserveSig] + new HRESULT AppendRoot(IShellItem psiRoot, SHCONTF grfEnumFlags, NSTCROOTSTYLE grfRootStyle, [In] IShellItemFilter pif); + + /// Inserts a Shell item on a root item in a tree. + /// + /// Type: int + /// The index at which to insert the root. + /// + /// + /// Type: IShellItem* + /// A pointer to the Shell item that is being inserted. + /// + /// + /// Type: SHCONTF + /// Enumerates the qualities of the root and all of its children. One of the values of type SHCONTF. + /// + /// + /// Type: NSTCROOTSTYLE + /// + /// The style of the root that is being inserted. One or more of the following values (flags can be combined using a bitwise OR). + /// + /// NSTCRS_VISIBLE (0x0000) + /// The root is visible as well as the items. Mutually exclusive with NSTCRS_HIDDEN. + /// NSTCRS_HIDDEN (0x0001) + /// The root is hidden so that only the children are visible. Mutually exclusive with NSTCRS_VISIBLE. + /// NSTCRS_EXPANDED (0x0002) + /// The root is expanded upon initialization. + /// + /// + /// Type: IShellItemFilter* + /// + /// A pointer to the IShellItemFilter that enables you to filter which items in the tree are displayed. If supplied, every item + /// is customizable with a SHCONTF flag. This value can be NULL if no filter is required. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-insertroot HRESULT + // InsertRoot( int iIndex, IShellItem *psiRoot, SHCONTF grfEnumFlags, NSTCROOTSTYLE grfRootStyle, IShellItemFilter *pif ); + [PreserveSig] + new HRESULT InsertRoot(int iIndex, IShellItem psiRoot, SHCONTF grfEnumFlags, NSTCROOTSTYLE grfRootStyle, [In] IShellItemFilter pif); + + /// Removes a root and its children from a tree. + /// + /// Type: IShellItem* + /// A pointer to the root that is to be removed. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-removeroot HRESULT + // RemoveRoot( IShellItem *psiRoot ); + [PreserveSig] + new HRESULT RemoveRoot(IShellItem psiRoot); + + /// Removes all roots and their children from a tree. + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-removeallroots + // HRESULT RemoveAllRoots(); + [PreserveSig] + new HRESULT RemoveAllRoots(); + + /// Gets an array of the root items. + /// + /// Type: IShellItemArray** + /// A pointer to an array of root items. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getrootitems HRESULT + // GetRootItems( IShellItemArray **ppsiaRootItems ); + [PreserveSig] + new HRESULT GetRootItems(out IShellItemArray ppsiaRootItems); + + /// Sets state information for a Shell item. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which to set the state. + /// + /// + /// Type: NSTCITEMSTATE + /// Specifies which information is being set, in the form of a bitmap. One or more of the NSTCITEMSTATE constants. + /// + /// + /// Type: NSTCITEMSTATE + /// A bitmap that contains the values to set for the flags specified in nstcisMask. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// The nstcisMask value specifies which bits in the value pointed to by pnstcisFlags are to be set. Other bits are ignored. As + /// a simple example, if nstcisMask=NSTCIS_SELECTED, then the first bit in the nstcisFlags value determines whether that flag is + /// set (1) or removed (0). + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-setitemstate HRESULT + // SetItemState( IShellItem *psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE nstcisFlags ); + [PreserveSig] + new HRESULT SetItemState(IShellItem psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE nstcisFlags); + + /// Gets state information about a Shell item. + /// + /// Type: IShellItem* + /// A pointer to the Shell item from which to retrieve the state. + /// + /// + /// Type: NSTCITEMSTATE + /// Specifies which information is being requested, in the form of a bitmap. One or more of the NSTCITEMSTATE constants. + /// + /// + /// Type: NSTCITEMSTATE* + /// When this method returns, points to a bitmap that contains the values requested in nstcisMask. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// The nstcisMask value specifies which bits in the value pointed to by pnstcisFlags are requested. As a simple example, if + /// nstcisMask=NSTCIS_SELECTED, then only the first bit in the value pointed to by pnstcisFlags is valid when this method + /// returns. If the first bit in the value pointed to by pnstcisFlags is 1, then the NSTCIS_SELECTED flag is set. If the first + /// bit in the value pointed to by pnstcisFlags is 0, then the NSTCIS_SELECTED flag is not set. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getitemstate HRESULT + // GetItemState( IShellItem *psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE *pnstcisFlags ); + [PreserveSig] + new HRESULT GetItemState(IShellItem psi, NSTCITEMSTATE nstcisMask, out NSTCITEMSTATE pnstcisFlags); + + /// Gets an array of selected Shell items. + /// + /// Type: IShellItemArray** + /// A pointer to an array of selected Shell items. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getselecteditems + // HRESULT GetSelectedItems( IShellItemArray **psiaItems ); + [PreserveSig] + new HRESULT GetSelectedItems(out IShellItemArray psiaItems); + + /// Gets the state of the checkbox associated with a given Shell item. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which checkbox state is being retrieved. + /// + /// + /// Type: int* + /// A pointer to the state of the checkbox for the Shell item. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getitemcustomstate + // HRESULT GetItemCustomState( IShellItem *psi, int *piStateNumber ); + [PreserveSig] + new HRESULT GetItemCustomState(IShellItem psi, out int piStateNumber); + + /// Sets the state of the checkbox associated with the Shell item. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which checkbox state is being set. + /// + /// + /// Type: int + /// The desired state of the checkbox for the Shell item. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-setitemcustomstate + // HRESULT SetItemCustomState( IShellItem *psi, int iStateNumber ); + [PreserveSig] + new HRESULT SetItemCustomState(IShellItem psi, int iStateNumber); + + /// Ensures that the given item is visible. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which the visibility is being ensured. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-ensureitemvisible + // HRESULT EnsureItemVisible( IShellItem *psi ); + [PreserveSig] + new HRESULT EnsureItemVisible(IShellItem psi); + + /// Sets the desktop theme for the current window only. + /// + /// Type: LPCWSTR + /// The name of the desktop theme to which the current window is being set. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-settheme HRESULT + // SetTheme( LPCWSTR pszTheme ); + [PreserveSig] + new HRESULT SetTheme([MarshalAs(UnmanagedType.LPWStr)] string pszTheme); + + /// Retrieves the next item in the tree according to which method is requested. + /// + /// Type: IShellItem* + /// The Shell item for which the next item is being retrieved. This value can be NULL. + /// + /// + /// Type: NSTCGNI + /// The type of the next item. This value can be one of the following flags: + /// NSTCGNI_NEXT (0) + /// The next sibling of the given item. + /// NSTCGNI_NEXTVISIBLE (1) + /// + /// The next visible item in the tree that has any relationship to the given item. This includes a child (if there is one), the + /// next sibling, or even one of the ancestor's siblings. + /// + /// NSTCGNI_PREV (2) + /// The previous sibling item of the given item. + /// NSTCGNI_PREVVISIBLE (3) + /// The previous visible item that is a sibling item, sibling descendent item or a parent item. + /// NSTCGNI_PARENT (4) + /// The parent item of the given item. + /// NSTCGNI_CHILD (5) + /// The first child item of the given item. + /// NSTCGNI_FIRSTVISIBLE (6) + /// The absolute first visible item in the tree (not relative to the given item). + /// NSTCGNI_LASTVISIBLE (7) + /// The absolute last visible item in the tree (not relative to the given item). + /// + /// + /// Type: IShellItem** + /// The address of a pointer to the IShellItem that fits the criteria for the next item that was requested. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// If there is no next item for the type selected, this function returns E_FAIL with NULL for the returned item, ppsiNext. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getnextitem HRESULT + // GetNextItem( IShellItem *psi, NSTCGNI nstcgi, IShellItem **ppsiNext ); + [PreserveSig] + new HRESULT GetNextItem([In] IShellItem psi, NSTCGNI nstcgi, out IShellItem ppsiNext); + + /// Retrieves the item that a given point is in, if any. + /// + /// Type: POINT* + /// A pointer to the point to be tested. + /// + /// + /// Type: IShellItem** + /// The address of a pointer to the item in which the point exists, or NULL if the point does not exist in an item. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// This function returns S_FALSE with a NULL item if the point does not exist in an item. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-hittest HRESULT + // HitTest( POINT *ppt, IShellItem **ppsiOut ); + [PreserveSig] + new HRESULT HitTest(in System.Drawing.Point ppt, out IShellItem ppsiOut); + + /// Gets the RECT structure that describes the size and position of a given item. + /// + /// Type: IShellItem* + /// A pointer to the item for which the RECT structure is being retrieved. + /// + /// + /// Type: RECT* + /// A pointer to the RECT structure that describes the size and position of the item. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-getitemrect HRESULT + // GetItemRect( IShellItem *psi, RECT *prect ); + [PreserveSig] + new HRESULT GetItemRect(IShellItem psi, out RECT prect); + + /// Collapses all of the items in the given tree. + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrol-collapseall HRESULT CollapseAll(); + [PreserveSig] + new HRESULT CollapseAll(); + + /// Sets the display styles for the namespace object's treeview controls. + /// + /// Type: NSTCSTYLE + /// One or more of the NSTCSTYLE constants that specify the styles for which the method should set new values. + /// + /// + /// Type: NSTCSTYLE + /// + /// A bitmap that contains the new values for the styles specified in nstcsMask. If the bit that represents the individual + /// NSTCSTYLE value is 0, that style is not used. If the value is 1, the style is applied to the treeview. Styles in positions + /// not specified in nstcsMask are left at their current setting regardless of their bit's value in this bitmap. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrol2-setcontrolstyle HRESULT + // SetControlStyle( NSTCSTYLE nstcsMask, NSTCSTYLE nstcsStyle ); + [PreserveSig] + HRESULT SetControlStyle(NSTCSTYLE nstcsMask, NSTCSTYLE nstcsStyle); + + /// Gets the display styles set for the namespace object's treeview controls. + /// + /// Type: NSTCSTYLE + /// One or more of the NSTCSTYLE constants that specify the values for which the method should retrieve the current settings. + /// + /// + /// Type: NSTCSTYLE* + /// + /// Pointer to a value that, when this method returns successfully, receives the values requested in nstcsMask. If the bit that + /// represents the individual NSTCSTYLE value is 0, that value is not set. If the value is 1, it is the current setting. Bit + /// values in positions not specifically requested in nstcsMask do not necessarily reflect the current settings and should not + /// be used. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrol2-getcontrolstyle HRESULT + // GetControlStyle( NSTCSTYLE nstcsMask, NSTCSTYLE *pnstcsStyle ); + [PreserveSig] + HRESULT GetControlStyle(NSTCSTYLE nstcsMask, out NSTCSTYLE pnstcsStyle); + + /// Sets the extended display styles for the namespace object's treeview controls. + /// + /// Type: NSTCSTYLE2 + /// One or more of the NSTCSTYLE2 constants that specify the styles for which the method should set new values. + /// + /// + /// Type: NSTCSTYLE2 + /// + /// A bitmap that contains the new values for the styles specified in nstcsMask. If the bit that represents the individual + /// NSTCSTYLE2 value is 0, that style is not used. If the value is 1, the style is applied to the treeview. Styles in positions + /// not specified in nstcsMask are left at their current setting regardless of their bit's value in this bitmap. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrol2-setcontrolstyle2 HRESULT + // SetControlStyle2( NSTCSTYLE2 nstcsMask, NSTCSTYLE2 nstcsStyle ); + [PreserveSig] + HRESULT SetControlStyle2(NSTCSTYLE2 nstcsMask, NSTCSTYLE2 nstcsStyle); + + /// Gets the extended display styles set for the namespace object's treeview controls. + /// + /// Type: NSTCSTYLE2 + /// One or more of the NSTCSTYLE2 constants that specify the values for which the method should retrieve the current settings. + /// + /// + /// Type: NSTCSTYLE2* + /// + /// Pointer to a value that, when this method returns successfully, receives the values requested in nstcsMask. If the bit that + /// represents the individual NSTCSTYLE2 value is 0, that value is not set. If the value is 1, it is the current setting. Bit + /// values in positions not specifically requested in nstcsMask do not necessarily reflect the current settings and should not + /// be used. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrol2-getcontrolstyle2 HRESULT + // GetControlStyle2( NSTCSTYLE2 nstcsMask, NSTCSTYLE2 *pnstcsStyle ); + [PreserveSig] + HRESULT GetControlStyle2(NSTCSTYLE2 nstcsMask, out NSTCSTYLE2 pnstcsStyle); + } + + /// + /// Exposes handler methods for drag-and-drop. Used by the namespace tree control to notify the client of any drag-and-drop + /// operation happening within the control. Provides a way for a client to intercept a drop operation and perform its own action, or + /// to return the desired drop effect. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nn-shobjidl-inamespacetreecontroldrophandler + [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("F9C665D6-C2F2-4c19-BF33-8322D7352F51"), CoClass(typeof(NameSpaceTreeControl))] + public interface INameSpaceTreeControlDropHandler + { + /// Called on drag enter to set drag effect, as specified. + /// + /// Type: IShellItem* + /// A pointer to an IShellItem interface representing the item underneath the mouse cursor. Optional. + /// + /// + /// Type: IShellItemArray* + /// A pointer to an IShellItem array containing the items being dragged. + /// + /// + /// Type: BOOL + /// Specifies whether drag started outside target area. + /// + /// + /// Type: DWORD + /// The current state of keyboard modifier keys. + /// + /// + /// Type: DWORD* + /// On success, contains a pointer to the drag effect value. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// Failing this method blocks the drag operation in the namespace tree control (NSTC). + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontroldrophandler-ondragenter HRESULT + // OnDragEnter( IShellItem *psiOver, IShellItemArray *psiaData, BOOL fOutsideSource, DWORD grfKeyState, DWORD *pdwEffect ); + [PreserveSig] + HRESULT OnDragEnter([In, Optional] IShellItem psiOver, [In] IShellItemArray psiaData, [MarshalAs(UnmanagedType.Bool)] bool fOutsideSource, uint grfKeyState, ref uint pdwEffect); + + /// Called on drag over to set drag effect, as specified. + /// + /// Type: IShellItem* + /// A pointer to an IShellItem interface representing the item underneath the mouse cursor. Optional. + /// + /// + /// Type: IShellItemArray* + /// A pointer to an IShellItem array containing the items being dragged. + /// + /// + /// Type: DWORD + /// The current state of keyboard modifier keys. + /// + /// + /// Type: DWORD* + /// On success, contains a pointer to the drag effect value. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// Failing this method blocks the drag operation in the namespace tree control (NSTC). + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontroldrophandler-ondragover HRESULT + // OnDragOver( IShellItem *psiOver, IShellItemArray *psiaData, DWORD grfKeyState, DWORD *pdwEffect ); + [PreserveSig] + HRESULT OnDragOver([In, Optional] IShellItem psiOver, [In] IShellItemArray psiaData, uint grfKeyState, ref uint pdwEffect); + + /// Called when the item is being dragged within the same level (within the same parent folder) in the tree. + /// + /// Type: IShellItem* + /// A pointer to an IShellItem interface representing the item underneath the mouse cursor. Optional. + /// + /// + /// Type: IShellItemArray* + /// A pointer to an IShellItem array containing the items being dragged. + /// + /// + /// Type: int + /// The index if the item being dragged is between items; otherwise, NSTCDHPOS_ONTOP (-1). + /// + /// + /// Type: int + /// The old position. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// Failing this method prevents the item rearrangment. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontroldrophandler-ondragposition + // HRESULT OnDragPosition( IShellItem *psiOver, IShellItemArray *psiaData, int iNewPosition, int iOldPosition ); + [PreserveSig] + HRESULT OnDragPosition([In, Optional] IShellItem psiOver, [In] IShellItemArray psiaData, int iNewPosition, int iOldPosition); + + /// Called on drop to set drop effect, as specified. + /// + /// Type: IShellItem* + /// A pointer to an IShellItem interface representing the item underneath the mouse cursor. Optional. + /// + /// + /// Type: IShellItemArray* + /// A pointer to an IShellItem array representing a data object. + /// + /// + /// Type: int + /// Specifies drop position. + /// + /// + /// Type: DWORD + /// The current state of keyboard modifier keys. + /// + /// + /// Type: DWORD* + /// A pointer to the drop effect value. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// Note To overwrite the default drop behavior, a client should fail this method; success proceeds with the default drop operation. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontroldrophandler-ondrop HRESULT + // OnDrop( IShellItem *psiOver, IShellItemArray *psiaData, int iPosition, DWORD grfKeyState, DWORD *pdwEffect ); + [PreserveSig] + HRESULT OnDrop([In, Optional] IShellItem psiOver, [In] IShellItemArray psiaData, int iPosition, uint grfKeyState, ref uint pdwEffect); + + /// Called when the item is being dropped within the same level (within the same parent folder) in the tree. + /// + /// Type: IShellItem* + /// A pointer to an IShellItem interface representing the item underneath the mouse cursor. Optional. + /// + /// + /// Type: IShellItemArray* + /// A pointer to an IShellItem array representing a data object. + /// + /// + /// Type: int + /// The index if the item being dropped is between items; otherwise, NSTCDHPOS_ONTOP (-1). + /// + /// + /// Type: int + /// Specifies old position. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// Failing this method prevents the item rearrangment from happening. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontroldrophandler-ondropposition + // HRESULT OnDropPosition( IShellItem *psiOver, IShellItemArray *psiaData, int iNewPosition, int iOldPosition ); + [PreserveSig] + HRESULT OnDropPosition([In, Optional] IShellItem psiOver, [In] IShellItemArray psiaData, int iNewPosition, int iOldPosition); + + /// Called on drag leave for a specified item. + /// + /// Type: IShellItem* + /// A pointer to an IShellItem interface representing the item underneath the mouse cursor. Optional. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontroldrophandler-ondragleave HRESULT + // OnDragLeave( IShellItem *psiOver ); + [PreserveSig] + HRESULT OnDragLeave([In, Optional] IShellItem psiOver); + } + + /// Exposes methods for handling INameSpaceTreeControl events. + /// + /// This interface is implemented by a client of namespace control (CLSID_NameSpaceTreeControl) to be advised of namespace control + /// events so that the client may process these events and if not, allow the namespace control to process them. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nn-shobjidl-inamespacetreecontrolevents + [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("93D77985-B3D8-4484-8318-672CDDA002CE"), CoClass(typeof(NameSpaceTreeControl))] + public interface INameSpaceTreeControlEvents + { + /// Called when the user clicks a button on the mouse. + /// + /// Type: IShellItem* + /// The IShellItem that was clicked. + /// + /// + /// Type: NSTCEHITTEST + /// The location on the IShellItem that was clicked. One of the following values: + /// NSTCEHT_NOWHERE (0x0001) + /// The click missed the IShellItem. + /// NSTCEHT_ONITEMICON (0x0002) + /// The click was on the icon of the IShellItem. + /// NSTCEHT_ONITEMLABEL (0x0004) + /// The click was on the label text of the IShellItem. + /// NSTCEHT_ONITEMINDENT (0x0008) + /// The click was on the indented space on the leftmost side of the IShellItem. + /// NSTCEHT_ONITEMBUTTON (0x0010) + /// The click was on the expando button of the IShellItem. + /// NSTCEHT_ONITEMRIGHT (0x0020) + /// The click was on the rightmost side of the text of the IShellItem. + /// NSTCEHT_ONITEMSTATEICON (0x0040) + /// The click was on the state icon of the IShellItem. + /// NSTCEHT_ONITEM (0x0046) + /// The click was on the item icon or the item label or the state icon of the IShellItem. + /// NSTCEHT_ONITEMTABBUTTON (0x1000) + /// The click was on the tab button of the IShellItem. + /// + /// + /// Type: NSTCSTYLE + /// Indicates which button was clicked and the kind of click. One of the following values: + /// NSTCECT_LBUTTON (0x0001) + /// The left button was clicked. + /// NSTCECT_MBUTTON (0x0002) + /// The middle button was clicked. + /// NSTCECT_RBUTTON (0x0003) + /// The right button was clicked. + /// NSTCECT_BUTTON (0x0003) + /// A button was clicked. + /// NSTCECT_DBLCLICK (0x0004) + /// The click was a double click. If this value is present, it is added to one of the other values. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// If this method fails, the event is processed by both INameSpaceTreeControl and TreeView. If it returns S_OK, then only + /// INameSpaceTreeControl will process the event. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onitemclick HRESULT + // OnItemClick( IShellItem *psi, NSTCEHITTEST nstceHitTest, NSTCECLICKTYPE nstceClickType ); + [PreserveSig] + HRESULT OnItemClick([In] IShellItem psi, NSTCEHITTEST nstceHitTest, NSTCECLICKTYPE nstceClickType); + + /// Not implemented. + /// + /// Type: IShellItem* + /// Not used. + /// + /// + /// Type: HRESULT + /// Returns E_NOTIMPL. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onpropertyitemcommit + // HRESULT OnPropertyItemCommit( IShellItem *psi ); + [PreserveSig] + HRESULT OnPropertyItemCommit([In] IShellItem psi); + + /// Called before the state of an item changes. + /// + /// Type: IShellItem* + /// A pointer to the Shell item for which the state is going to change. + /// + /// + /// Type: NSTCITEMSTATE + /// + /// One or more values from the NSTCITEMSTATE enumeration that indicate which pieces of information the calling application + /// wants to set. + /// + /// + /// + /// Type: NSTCITEMSTATE + /// One or more values from the NSTCITEMSTATE enumeration that indicate the values that are to be set. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onitemstatechanging + // HRESULT OnItemStateChanging( IShellItem *psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE nstcisState ); + [PreserveSig] + HRESULT OnItemStateChanging([In] IShellItem psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE nstcisState); + + /// Not implemented. + /// + /// Type: IShellItem* + /// A pointer to the shell item for which the state has changed. + /// + /// + /// Type: NSTCITEMSTATE + /// + /// One or more values from the NSTCITEMSTATE enumeration that indicates what pieces of information the caller wants to set. + /// + /// + /// + /// Type: NSTCITEMSTATE + /// One or more values from the NSTCITEMSTATE enumeration that indicates the values that are to be set. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onitemstatechanged + // HRESULT OnItemStateChanged( IShellItem *psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE nstcisState ); + [PreserveSig] + HRESULT OnItemStateChanged([In] IShellItem psi, NSTCITEMSTATE nstcisMask, NSTCITEMSTATE nstcisState); + + /// Called when the selection changes. + /// + /// Type: IShellItemArray* + /// An array of IShellItem objects that contains the new selection. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onselectionchanged + // HRESULT OnSelectionChanged( IShellItemArray *psiaSelection ); + [PreserveSig] + HRESULT OnSelectionChanged([In] IShellItemArray psiaSelection); + + /// Called when the user presses a key on the keyboard. + /// + /// Type: UINT + /// The message value. + /// + /// + /// Type: WPARAM + /// Specifies the WParam parameters of the message. + /// + /// + /// Type: LPARAM + /// Specifies the LParam parameters of the message. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// This method receives its message directly from WndProc. When this returns S_OK, the message was not consumed and the + /// namespace tree control is allowed to process the message. Otherwise this message was handled, with no further action required. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onkeyboardinput HRESULT + // OnKeyboardInput( UINT uMsg, WPARAM wParam, LPARAM lParam ); + [PreserveSig] + HRESULT OnKeyboardInput(uint uMsg, IntPtr wParam, IntPtr lParam); + + /// Called before an IShellItem is expanded. + /// + /// Type: IShellItem* + /// A pointer to the IShellItem that is to be expanded. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onbeforeexpand HRESULT + // OnBeforeExpand( IShellItem *psi ); + [PreserveSig] + HRESULT OnBeforeExpand([In] IShellItem psi); + + /// Called after an IShellItem is expanded. + /// + /// Type: IShellItem* + /// A pointer to the IShellItem that was expanded. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onafterexpand HRESULT + // OnAfterExpand( IShellItem *psi ); + [PreserveSig] + HRESULT OnAfterExpand([In] IShellItem psi); + + /// Called before the IShellItem goes into edit mode. + /// + /// Type: IShellItem* + /// Pointer to the IShellItem for which the text is to be edited. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// If this method fails, the transition to edit mode is not canceled. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onbeginlabeledit HRESULT + // OnBeginLabelEdit( IShellItem *psi ); + [PreserveSig] + HRESULT OnBeginLabelEdit([In] IShellItem psi); + + /// Called after the IShellItem leaves edit mode. + /// + /// Type: IShellItem* + /// A pointer to the IShellItem for which the text was edited. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onendlabeledit HRESULT + // OnEndLabelEdit( IShellItem *psi ); + [PreserveSig] + HRESULT OnEndLabelEdit([In] IShellItem psi); + + /// Enables you to provide a tooltip. + /// + /// Type: IShellItem* + /// Pointer to the IShellItem that contains the tooltip. + /// + /// + /// Type: LPWSTR + /// When this method returns, contains the text of the tooltip. + /// + /// + /// Type: int + /// The size of the tooltip in characters. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// If this method returns S_OK, the client provides its own tooltip. Otherwise the INameSpaceTreeControl will extract one. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-ongettooltip HRESULT + // OnGetToolTip( IShellItem *psi, LPWSTR pszTip, int cchTip ); + [PreserveSig] + HRESULT OnGetToolTip([In] IShellItem psi, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszTip, int cchTip); + + /// Called before an IShellItem and all of its children are deleted. + /// + /// Type: IShellItem* + /// A pointer to the IShellItem that is to be deleted. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// If this method fails, the given IShellItem and its children are still deleted. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onbeforeitemdelete + // HRESULT OnBeforeItemDelete( IShellItem *psi ); + [PreserveSig] + HRESULT OnBeforeItemDelete([In] IShellItem psi); + + /// Called after an IShellItem has been added. + /// + /// Type: IShellItem* + /// A pointer to the IShellItem that was added. + /// + /// + /// Type: BOOL + /// Specifies whether the IShellItem that was added is a root. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onitemadded HRESULT + // OnItemAdded( IShellItem *psi, BOOL fIsRoot ); + [PreserveSig] + HRESULT OnItemAdded([In] IShellItem psi, [MarshalAs(UnmanagedType.Bool)] bool fIsRoot); + + /// Called after an IShellItem has been deleted. + /// + /// Type: IShellItem* + /// A pointer to the IShellItem that was deleted. + /// + /// + /// Type: BOOL + /// Specifies whether the IShellItem that was deleted is a root. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onitemdeleted HRESULT + // OnItemDeleted( IShellItem *psi, BOOL fIsRoot ); + [PreserveSig] + HRESULT OnItemDeleted([In] IShellItem psi, [MarshalAs(UnmanagedType.Bool)] bool fIsRoot); + + /// Called before a context menu is displayed; allows client to add additional menu entries. + /// + /// Type: IShellItem* + /// A pointer to the IShellItem from which the context menu is generated. This value can be NULL. + /// + /// + /// Type: REFIID + /// Reference to the IID of the context menu. + /// + /// + /// Type: void** + /// When this methods returns, contains the address of a pointer to the interface specified by riid. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onbeforecontextmenu + // HRESULT OnBeforeContextMenu( IShellItem *psi, REFIID riid, void **ppv ); + [PreserveSig] + HRESULT OnBeforeContextMenu([In, Optional] IShellItem psi, in Guid riid, out IntPtr ppv); + + /// Called after a context menu is displayed. + /// + /// Type: IShellItem* + /// + /// A pointer to the IShellItem from which the context menu is generated. This value can be NULL only if the + /// NSTCS2_SHOWNULLSPACEMENU flag is set. + /// + /// + /// + /// Type: IContextMenu* + /// A pointer to the context menu. + /// + /// + /// Type: REFIID + /// Reference to the IID of the context menu. + /// + /// + /// Type: void** + /// When this method returns, contains the address of a pointer to the interface specified in riid. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// This method allows client to completely replace the context menu. This method will allow the client to use the context menu + /// returned by ppv and not necessarily the one specified in pcmIn. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onaftercontextmenu + // HRESULT OnAfterContextMenu( IShellItem *psi, IContextMenu *pcmIn, REFIID riid, void **ppv ); + [PreserveSig] + HRESULT OnAfterContextMenu([In, Optional] IShellItem psi, [In] IContextMenu pcmIn, [In] in Guid riid, out IntPtr ppv); + + /// Called before the state icon of the given IShellItem is changed. + /// + /// Type: IShellItem* + /// Pointer to the IShellItem in which the state image is changing. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + /// + /// If this method returns S_OK, the client has processed the event and no further action is required of the namespace control. + /// Otherwise the event will need to be processed, in this case the default action is to go to the next image in the list. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolevents-onbeforestateimagechange + // HRESULT OnBeforeStateImageChange( IShellItem *psi ); + [PreserveSig] + HRESULT OnBeforeStateImageChange([In] IShellItem psi); + + /// Undocumented. + /// Undocumented. + /// Undocumented. + /// Undocumented. + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + [PreserveSig] + HRESULT OnGetDefaultIconIndex([In] IShellItem psi, out int piDefaultIcon, out int piOpenIcon); + } + + /// Exposes a single method that retrieves the status of a folder's System.IsPinnedToNameSpaceTree filtering support. + /// + /// + /// The namespace tree control checks all the nodes it enumerates to see if they support filtering. This is done by retrieving the + /// System.IsPinnedToNameSpaceTree property for the shell folders that support this interface. Nodes that do not support this + /// interface do not have filtering support and are shown by default. + /// + /// Use this interface to retrieve the filtering support status of a shell folder. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-inamespacetreecontrolfoldercapabilities + [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("e9701183-e6b3-4ff2-8568-813615fec7be"), CoClass(typeof(NameSpaceTreeControl))] + public interface INameSpaceTreeControlFolderCapabilities + { + /// + /// Gets a folder's capability to be filtered through the System.IsPinnedToNameSpaceTree property key value and change + /// notification registration status. + /// + /// + /// Type: NSTCFOLDERCAPABILITIES + /// The capabilities for which this method should retrieve values. Specify one or both of the following: + /// NSTCFC_PINNEDITEMFILTERING (0x00000001) + /// + /// 0x00000001. The System.IsPinnedToNameSpaceTree property exists on this folder and filtering based on that property value is supported. + /// + /// NSTCFC_DELAY_REGISTER_NOTIFY (0x00000002) + /// 0x00000002. Registration for change notifications is delayed until the folder is expanded in the navigation pane. + /// + /// + /// Type: NSTCFOLDERCAPABILITIES* + /// + /// Pointer to a value that, when this method returns successfully, receives the capabilities requested in nfcMask. Except in + /// the case of NSTCFC_NONE, bit values in positions not specifically requested in nfcMask do not necessarily reflect the + /// capabilities and should not be used. + /// + /// NSTCFC_NONE (0x00000000) + /// 0x00000000. The System.IsPinnedToNameSpaceTree property does not exist on this folder. Filtering is not supported. + /// NSTCFC_PINNEDITEMFILTERING (0x00000001) + /// + /// 0x00000001. The System.IsPinnedToNameSpaceTree property exists on this folder and filtering based on that property value is supported. + /// + /// NSTCFC_DELAY_REGISTER_NOTIFY (0x00000002) + /// 0x00000002. Registration for change notifications is delayed until the folder is expanded in the navigation pane. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-inamespacetreecontrolfoldercapabilities-getfoldercapabilities + // HRESULT GetFolderCapabilities( NSTCFOLDERCAPABILITIES nfcMask, NSTCFOLDERCAPABILITIES *pnfcValue ); + [PreserveSig] + HRESULT GetFolderCapabilities(NSTCFOLDERCAPABILITIES nfcMask, out NSTCFOLDERCAPABILITIES pnfcValue); + } + + /// Exposes methods that enable the user to draw a custom namespace tree control and its items. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nn-shobjidl-inamespacetreecontrolcustomdraw + [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("2D3BA758-33EE-42d5-BB7B-5F3431D86C78"), CoClass(typeof(NameSpaceTreeControl))] + internal interface INameSpaceTreeControlCustomDraw + { + /// Called before the namespace tree control is drawn. + /// + /// Type: HDC + /// A handle to the control's device context. Use this HDC to perform any GDI functions. + /// + /// + /// Type: RECT* + /// A pointer to the RECT structure that describes the bounding rectangle of the area being drawn. + /// + /// + /// Type: LRESULT* + /// + /// When this method returns, contains a pointer to an LRESULT, which contains one or more of the values from the CDRF + /// Constants enumeration. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolcustomdraw-prepaint HRESULT + // PrePaint( HDC hdc, RECT *prc, LRESULT *plres ); + [PreserveSig] + HRESULT PrePaint([In] HDC hdc, in RECT prc, out IntPtr plres); + + /// Called after the namespace tree control is drawn. + /// + /// Type: HDC + /// A handle to the control's device context. Use this HDC to perform any GDI functions. + /// + /// + /// Type: RECT* + /// A pointer to the RECT structure that describes the bounding rectangle of the area being drawn. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolcustomdraw-postpaint HRESULT + // PostPaint( HDC hdc, RECT *prc ); + [PreserveSig] + HRESULT PostPaint([In] HDC hdc, in RECT prc); + + /// Called before an item in the namespace tree control is drawn. + /// + /// Type: HDC + /// A handle to the control's device context. Use this HDC to perform any GDI functions. + /// + /// + /// Type: RECT* + /// A pointer to the RECT structure that describes the bounding rectangle of the area being drawn. + /// + /// + /// Type: NSTCCUSTOMDRAW* + /// A pointer to the NSTCCUSTOMDRAW structure that determines the details of the drawing. + /// + /// + /// Type: COLORREF* + /// + /// On entry, a pointer to a COLORREF structure that declares the default color of the text. When this method returns, contains + /// a pointer to a COLORREF structure that declares the color that should be used in its place, if any. This allows the + /// client to provide their own color if they do not want to use the default. + /// + /// + /// + /// Type: COLORREF* + /// + /// On entry, a pointer to a COLORREF structure that declares the default color of the background. When this method returns, + /// contains a pointer to a COLORREF structure that declares the color that should be used in its place, if any. This + /// allows the client to provide their own color if they do not want to use the default. + /// + /// + /// + /// Type: LRESULT* + /// + /// When this method returns, contains a pointer to an LRESULT, which points to one or more of the values from the CDRF + /// Constants enumeration. + /// + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolcustomdraw-itemprepaint HRESULT + // ItemPrePaint( HDC hdc, RECT *prc, NSTCCUSTOMDRAW *pnstccdItem, COLORREF *pclrText, COLORREF *pclrTextBk, LRESULT *plres ); + [PreserveSig] + HRESULT ItemPrePaint([In] HDC hdc, in RECT prc, in NSTCCUSTOMDRAW pnstccdItem, ref COLORREF pclrText, ref COLORREF pclrTextBk, out IntPtr plres); + + /// Called after an item in the namespace tree control is drawn. + /// + /// Type: HDC + /// A handle to the control's device context. Use this HDC to perform any GDI functions. + /// + /// + /// Type: RECT* + /// A pointer to the RECT structure that describes the bounding rectangle of the area being drawn. + /// + /// + /// Type: NSTCCUSTOMDRAW* + /// A pointer to the NSTCCUSTOMDRAW struct that determines the details of the drawing. + /// + /// + /// Type: HRESULT + /// If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code. + /// + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-inamespacetreecontrolcustomdraw-itempostpaint HRESULT + // ItemPostPaint( HDC hdc, RECT *prc, NSTCCUSTOMDRAW *pnstccdItem ); + [PreserveSig] + HRESULT ItemPostPaint([In] HDC hdc, in RECT prc, in NSTCCUSTOMDRAW pnstccdItem); + } + + /// Custom draw structure used by INameSpaceTreeControlCustomDraw methods. + // https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/ns-shobjidl-nstccustomdraw typedef struct NSTCCUSTOMDRAW { IShellItem + // *psi; UINT uItemState; NSTCITEMSTATE nstcis; LPCWSTR pszText; int iImage; HIMAGELIST himl; int iLevel; int iIndent; } NSTCCUSTOMDRAW; + [PInvokeData("shobjidl.h", MSDNShortId = "95747075-4882-4c29-8653-941ac04db54b")] + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct NSTCCUSTOMDRAW + { + /// + /// Type: IShellItem* + /// A pointer to a Shell item. + /// + public IShellItem psi; + + /// + /// Type: UINT + /// The current item state. See NMCUSTOMDRAW for more detail. + /// + public uint uItemState; + + /// + /// Type: NSTCITEMSTATE + /// The state of a tree item. See NSTCITEMSTATE. + /// + public NSTCITEMSTATE nstcis; + + /// + /// Type: LPCWSTR + /// A pointer to a null-terminated Unicode string that contains the item text, if the structure specifies item attributes. + /// + [MarshalAs(UnmanagedType.LPWStr)] public string pszText; + + /// + /// Type: int + /// The index in the tree-view control's image list. + /// + public int iImage; + + /// + /// Type: HIMAGELIST + /// A handle to an image list. + /// + public HIMAGELIST himl; + + /// + /// Type: int + /// The zero-based level of the item being drawn. + /// + public int iLevel; + + /// + /// Type: int + /// A tree-level indent. + /// + public int iIndent; + } + + /// CLSID_NameSpaceTreeControl + [ComImport, Guid("AE054212-3535-4430-83ED-D501AA6680E6"), ClassInterface(ClassInterfaceType.None)] + public class NameSpaceTreeControl { } + } +} \ No newline at end of file