ReactOS 0.4.17-dev-684-ga6524ef
CNSCBand.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shdocvw
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: NameSpace Control Band
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#pragma once
9
10#define NSCBANDCLASSNAME L"ReactOS NameSpace Control Band"
11
12#define WM_USER_SHELLEVENT (WM_USER + 88)
13
14#ifdef __cplusplus
15class CNSCBand
16 : public CWindowImpl<CNSCBand>
17 , public IDeskBand
18 , public IObjectWithSite
19 , public IInputObject
20 , public IPersistStream
21 , public IOleCommandTarget
22 , public IServiceProvider
23 , public IContextMenu
24 , public IBandNavigate
25 , public IWinEventHandler
26 , public INamespaceProxy
27 , public IDropTarget
28 , public IDropSource
29{
30public:
32 static LPCWSTR GetWndClassName() { return NSCBANDCLASSNAME; }
33
34 CNSCBand();
35 virtual ~CNSCBand();
36
37 // The node of TreeView
38 struct CItemData
39 {
40 CComHeapPtr<ITEMIDLIST> absolutePidl;
41 PUITEMID_CHILD leafPidl;
42 BOOL expanded = FALSE;
43
44 HRESULT Attach(LPITEMIDLIST pidl)
45 {
46 absolutePidl.Attach(pidl);
47 leafPidl = ILFindLastID(absolutePidl);
48 return S_OK;
49 }
51 {
52 LPITEMIDLIST pidlAlloc;
53 HRESULT hr = SHILClone(pidl, &pidlAlloc);
54 return SUCCEEDED(hr) ? Attach(pidlAlloc) : hr;
55 }
56 PUITEMID_CHILD GetLeaf() const { return leafPidl; }
57 };
58 CItemData* _GetItemData(_In_ HTREEITEM hItem);
59 CItemData* _GetItemData(_In_ UINT ItemSpec = TVGN_CARET);
60 SFGAOF _GetAttributesOfItem(_In_ CItemData *pData, _In_ SFGAOF Query);
61 HRESULT _GetNameOfItem(IShellFolder *pSF, PCUITEMID_CHILD pidl, UINT Flags, PWSTR Name);
62 HRESULT _GetNameOfItem(IShellFolder *pSF, PCUITEMID_CHILD pidl, PWSTR Name);
63
64 // *** IOleWindow methods ***
65 STDMETHODIMP GetWindow(HWND *lphwnd) override;
66 STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override;
67
68 // *** IDockingWindow methods ***
70 STDMETHODIMP ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override;
71 STDMETHODIMP ShowDW(BOOL fShow) override;
72
73 // *** IDeskBand methods ***
74 STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override;
75
76 // *** IObjectWithSite methods ***
77 STDMETHODIMP SetSite(IUnknown *pUnkSite) override;
78 STDMETHODIMP GetSite(REFIID riid, void **ppvSite) override;
79
80 // *** IOleCommandTarget methods ***
81 STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) override;
82 STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override;
83
84 // *** IServiceProvider methods ***
85 STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override;
86
87 // *** IContextMenu methods ***
90 UINT indexMenu,
91 UINT idCmdFirst,
92 UINT idCmdLast,
93 UINT uFlags) override;
94 STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici) override;
96 UINT_PTR idCmd,
97 UINT uType,
98 UINT *pwReserved,
99 LPSTR pszName,
100 UINT cchMax) override;
101
102 // *** IInputObject methods ***
103 STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg) override;
104 STDMETHODIMP HasFocusIO() override;
105 STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg) override;
106
107 // *** IPersist methods ***
108 STDMETHODIMP GetClassID(CLSID *pClassID) override;
109
110 // *** IPersistStream methods ***
111 STDMETHODIMP IsDirty() override;
112 STDMETHODIMP Load(IStream *pStm) override;
113 STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty) override;
114 STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize) override;
115
116 // *** IWinEventHandler methods ***
117 STDMETHODIMP OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override;
118 STDMETHODIMP IsWindowOwner(HWND hWnd) override;
119
120 // *** IBandNavigate methods ***
121 STDMETHODIMP Select(LPCITEMIDLIST pidl) override;
122
123 // *** INamespaceProxy methods ***
124 STDMETHODIMP GetNavigateTarget(
126 _Out_ PIDLIST_ABSOLUTE *ppidlTarget,
127 _Out_ ULONG *pulAttrib) override;
128 STDMETHODIMP Invoke(_In_ PCIDLIST_ABSOLUTE pidl) override;
129 STDMETHODIMP OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl) override;
130 STDMETHODIMP RefreshFlags(
131 _Out_ DWORD *pdwStyle,
132 _Out_ DWORD *pdwExStyle,
133 _Out_ DWORD *dwEnum) override;
134 STDMETHODIMP CacheItem(_In_ PCIDLIST_ABSOLUTE pidl) override;
135
136 // *** IDropTarget methods ***
137 STDMETHODIMP DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
138 STDMETHODIMP DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
139 STDMETHODIMP DragLeave() override;
140 STDMETHODIMP Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
141
142 // *** IDropSource methods ***
143 STDMETHODIMP QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) override;
144 STDMETHODIMP GiveFeedback(DWORD dwEffect) override;
145
146protected:
147 DWORD m_dwTVStyle = 0;
148 DWORD m_dwTVExStyle = 0;
149 DWORD m_dwEnumFlags = 0;
150 BOOL m_fVisible = FALSE;
151 BOOL m_bFocused = FALSE;
152 DWORD m_dwBandID = 0;
153 CComPtr<IUnknown> m_pSite;
154 CComPtr<IShellFolder> m_pDesktop;
155 CComHeapPtr<ITEMIDLIST> m_pidlRoot;
156 HIMAGELIST m_hToolbarImageList = NULL;
157 CToolbar<> m_hwndToolbar;
158 CTreeView m_hwndTreeView;
159 LONG m_mtxBlockNavigate = 0; // A "lock" that prevents internal selection changes to initiate a navigation to the newly selected item.
160 BOOL m_isEditing = FALSE;
161 HTREEITEM m_hRoot = NULL;
162 HTREEITEM m_oldSelected = NULL;
163 DWORD m_adviseCookie = 0;
164 ULONG m_shellRegID = 0;
165 PWSTR m_OriginalRename = NULL;
166
167 enum UPDATEITEMFLAGS {
168 UIF_TEXT = TVIF_TEXT,
169 UIF_IMAGE = TVIF_IMAGE,
170 UIF_GETREAL = TVIF_DI_SETITEM, // SHGetRealIDL is required for SHCNE notifications
171 UIF_ALL = ~UINT(0) & ~UIF_GETREAL
172 };
173
174 // *** Drop target information ***
175 CComPtr<IDropTarget> m_pDropTarget;
176 HTREEITEM m_childTargetNode = NULL;
177 CComPtr<IDataObject> m_pCurObject;
178
179 VOID OnFinalMessage(HWND) override;
180
181 // *** helper methods ***
182 virtual INT _GetRootCsidl() = 0;
183 virtual HRESULT _CreateTreeView(HWND hwndParent);
184 virtual HRESULT _CreateToolbar(HWND hwndParent) { return S_OK; }
185 virtual void _DestroyTreeView();
186 virtual void _DestroyToolbar();
187 virtual DWORD _GetTVStyle() = 0;
188 virtual DWORD _GetTVExStyle() = 0;
189 virtual DWORD _GetEnumFlags() = 0;
190 virtual BOOL _GetTitle(LPWSTR pszTitle, INT cchTitle) = 0;
191 virtual BOOL _WantsRootItem() = 0;
192 virtual void _SortItems(HTREEITEM hParent) = 0;
193 void _RegisterChangeNotify();
194 void _UnregisterChangeNotify();
195 BOOL OnTreeItemExpanding(_In_ LPNMTREEVIEW pnmtv);
196 BOOL OnTreeItemDeleted(_In_ LPNMTREEVIEW pnmtv);
197 void _OnSelectionChanged(_In_ LPNMTREEVIEW pnmtv);
198 void OnTreeItemDragging(_In_ LPNMTREEVIEW pnmtv, _In_ BOOL isRightClick);
201 void OnChangeNotify(
205 HRESULT _ExecuteCommand(_In_ CComPtr<IContextMenu>& menu, _In_ UINT nCmd);
206 HTREEITEM _InsertItem(
207 _In_opt_ HTREEITEM hParent,
208 _Inout_ IShellFolder *psfParent,
209 _In_ LPCITEMIDLIST pElt,
210 _In_ LPCITEMIDLIST pEltRelative,
211 _In_ BOOL bSort);
212 HTREEITEM _InsertItem(
213 _In_opt_ HTREEITEM hParent,
214 _In_ LPCITEMIDLIST pElt,
215 _In_ LPCITEMIDLIST pEltRelative,
216 _In_ BOOL bSort);
217 BOOL _InsertSubitems(HTREEITEM hItem, LPCITEMIDLIST entry);
218 HRESULT _UpdateBrowser(LPCITEMIDLIST pidlGoto, BOOL IgnoreSelfNavigation = FALSE, UINT SBSP = 0);
219 HRESULT _GetCurrentLocation(_Out_ PIDLIST_ABSOLUTE *ppidl);
220 HRESULT _IsCurrentLocation(_In_ PCIDLIST_ABSOLUTE pidl);
221 void _Refresh();
222 void _RefreshRecurse(_In_ HTREEITEM hItem);
223 BOOL _IsTreeItemInEnum(_In_ HTREEITEM hItem, _In_ IEnumIDList *pEnum);
224 BOOL _TreeItemHasThisChild(_In_ HTREEITEM hItem, _In_ PCITEMID_CHILD pidlChild);
225 HTREEITEM _FindItem(_In_ PCIDLIST_ABSOLUTE pidl, _Out_opt_ CItemData **ppData = NULL, _In_ HTREEITEM hBase = NULL);
226 HRESULT _UpdateItem(_In_ HTREEITEM hItem, _In_ CItemData *pData, _In_ PCIDLIST_ABSOLUTE pidl, _In_ UINT UIF = UIF_ALL);
227 HRESULT _GetItemEnum(
228 _Out_ CComPtr<IEnumIDList>& pEnum,
230 _Out_opt_ IShellFolder **ppFolder = NULL);
231 BOOL _ItemHasAnyChild(_In_ HTREEITEM hItem);
232 HRESULT _AddFavorite();
233
234 // *** ATL message handlers ***
236 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
237 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
238 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
239 LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
240 LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
241 LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
242 LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
243 LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
244 LRESULT OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
245
246 BEGIN_MSG_MAP(CNSCBand)
250 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
251 MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
258};
259#endif // def __cplusplus
#define NSCBANDCLASSNAME
Definition: CNSCBand.h:10
#define WM_USER_SHELLEVENT
Definition: CNSCBand.h:12
UINT cchMax
HWND hWnd
Definition: settings.c:17
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
Definition: query.c:292
LPSERVICE_STATUS_PROCESS QueryService(LPCTSTR ServiceName)
Definition: query.c:13
static LRESULT OnNotify(HWND hWnd, LPARAM lParam)
Definition: wordpad.c:2015
static VOID OnTimer(IN HWND hwndDlg, IN PSYS_SHUTDOWN_PARAMS pShutdownParams)
Definition: shutdown.c:72
#define STDMETHODIMP
Definition: basetyps.h:43
static int OnCommand(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: clipbrd.c:202
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static HWND hwndParent
Definition: cryptui.c:299
HRESULT hr
Definition: delayimp.cpp:582
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
static BOOL OnEndLabelEdit(NMLVDISPINFO *pnmv)
Definition: environment.c:666
static BOOL OnBeginLabelEdit(NMLVDISPINFO *pnmv)
Definition: environment.c:650
UINT uFlags
Definition: api.c:59
#define pt(x, y)
Definition: drawing.c:79
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
static VOID OnSize(HWND hDlg, PDETAILDATA pData, INT cx, INT cy)
Definition: evtdetctl.c:701
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
HRESULT InvokeCommand([in] LPCMINVOKECOMMANDINFO lpici)
HRESULT QueryContextMenu([in] HMENU hmenu, [in] UINT indexMenu, [in] UINT idCmdFirst, [in] UINT idCmdLast, [in] UINT uFlags)
HRESULT GetBandInfo([in] DWORD dwBandID, [in] DWORD dwViewMode, [in, out] DESKBANDINFO *pdbi)
HRESULT ResizeBorderDW([in] LPCRECT prcBorder, [in] IUnknown *punkToolbarSite, [in] BOOL fReserved)
HRESULT CloseDW([in] DWORD dwReserved)
HRESULT ShowDW([in] BOOL fShow)
HRESULT QueryContinueDrag([in] BOOL fEscapePressed, [in] DWORD grfKeyState)
HRESULT GiveFeedback([in] DWORD dwEffect)
HRESULT Drop([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
HRESULT DragLeave()
HRESULT DragEnter([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
HRESULT DragOver([in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
HRESULT GetSite([in] REFIID riid, [out, iid_is(riid)] PVOID *ppvSite)
HRESULT SetSite([in] IUnknown *pUnkSite)
HRESULT QueryStatus([in, unique] const GUID *pguidCmdGroup, [in] ULONG cCmds, [in, out, size_is(cCmds)] OLECMD prgCmds[], [in, out, unique] OLECMDTEXT *pCmdText)
HRESULT Exec([in, unique] const GUID *pguidCmdGroup, [in] DWORD nCmdID, [in] DWORD nCmdexecopt, [in, unique] VARIANT *pvaIn, [in, out, unique] VARIANT *pvaOut)
HRESULT GetWindow([out] HWND *phwnd)
HRESULT ContextSensitiveHelp([in] BOOL fEnterMode)
HRESULT GetSizeMax([out] ULARGE_INTEGER *pcbSize)
HRESULT IsDirty()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
uint32_t entry
Definition: isohybrid.c:63
#define MESSAGE_HANDLER(msg, func)
Definition: atlwin.h:1926
#define BEGIN_MSG_MAP(theClass)
Definition: atlwin.h:1898
#define END_MSG_MAP()
Definition: atlwin.h:1917
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
Definition: atlwin.h:2004
static HRESULT Load(IUnknown *pUnk, IStream *pStream)
Definition: lnktool.cpp:294
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
PSDBQUERYRESULT_VISTA PVOID * ppData
Definition: env.c:56
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define menu
Definition: input.c:3282
static HMENU hmenu
Definition: win.c:78
BOOL OnCreate(HWND hWnd)
Definition: msconfig.c:97
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
static BOOL Set
Definition: pageheap.c:10
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:199
#define TVIF_TEXT
Definition: commctrl.h:3271
#define TVIF_IMAGE
Definition: commctrl.h:3272
#define LPNMTREEVIEW
Definition: commctrl.h:3648
#define TVGN_CARET
Definition: commctrl.h:3466
#define LPNMTVDISPINFO
Definition: commctrl.h:3681
#define TVIF_DI_SETITEM
Definition: commctrl.h:3664
#define REFIID
Definition: guiddef.h:118
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define WM_NOTIFY
Definition: richedit.h:61
static HRESULT GetCommandString(IContextMenu &CM, UINT Id, UINT Type, LPWSTR buf, UINT cchMax)
Definition: shlextdbg.cpp:236
STDMETHOD() GetClassID(THIS_ CLSID *pClassID) PURE
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
Definition: shtypes.idl:68
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
Definition: scsiwmi.h:51
HANDLE lEvent
Definition: tftpd.cpp:56
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
static VOID OnContextMenu(HWND hwnd, HMENU hMenu, UINT uFlags)
static int Save(const char **args)
Definition: vfdcmd.c:1851
static LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
Definition: welcome.c:1553
#define WM_CREATE
Definition: winuser.h:1636
#define WM_SIZE
Definition: winuser.h:1639
#define WM_COMMAND
Definition: winuser.h:1768
#define WM_SETFOCUS
Definition: winuser.h:1641
#define WM_TIMER
Definition: winuser.h:1770
#define WM_DESTROY
Definition: winuser.h:1637
#define WM_KILLFOCUS
Definition: winuser.h:1642
#define COLOR_3DFACE
Definition: winuser.h:940
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170