ReactOS 0.4.16-dev-1163-gec5b142
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 CComHeapPtr<ITEMIDLIST> relativePidl;
42 BOOL expanded = FALSE;
43 };
44 CItemData* _GetItemData(_In_ HTREEITEM hItem);
45 CItemData* _GetItemData(_In_ UINT ItemSpec = TVGN_CARET);
46 SFGAOF _GetAttributesOfItem(_In_ CItemData *pData, _In_ SFGAOF Query);
47 HRESULT _GetNameOfItem(IShellFolder *pSF, PCUITEMID_CHILD pidl, UINT Flags, PWSTR Name);
48 HRESULT _GetNameOfItem(IShellFolder *pSF, PCUITEMID_CHILD pidl, PWSTR Name);
49
50 // *** IOleWindow methods ***
51 STDMETHODIMP GetWindow(HWND *lphwnd) override;
52 STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override;
53
54 // *** IDockingWindow methods ***
56 STDMETHODIMP ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override;
57 STDMETHODIMP ShowDW(BOOL fShow) override;
58
59 // *** IDeskBand methods ***
60 STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override;
61
62 // *** IObjectWithSite methods ***
63 STDMETHODIMP SetSite(IUnknown *pUnkSite) override;
64 STDMETHODIMP GetSite(REFIID riid, void **ppvSite) override;
65
66 // *** IOleCommandTarget methods ***
67 STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) override;
68 STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override;
69
70 // *** IServiceProvider methods ***
71 STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override;
72
73 // *** IContextMenu methods ***
76 UINT indexMenu,
77 UINT idCmdFirst,
78 UINT idCmdLast,
79 UINT uFlags) override;
80 STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici) override;
82 UINT_PTR idCmd,
83 UINT uType,
84 UINT *pwReserved,
85 LPSTR pszName,
86 UINT cchMax) override;
87
88 // *** IInputObject methods ***
89 STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg) override;
90 STDMETHODIMP HasFocusIO() override;
91 STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg) override;
92
93 // *** IPersist methods ***
94 STDMETHODIMP GetClassID(CLSID *pClassID) override;
95
96 // *** IPersistStream methods ***
97 STDMETHODIMP IsDirty() override;
98 STDMETHODIMP Load(IStream *pStm) override;
99 STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty) override;
100 STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize) override;
101
102 // *** IWinEventHandler methods ***
103 STDMETHODIMP OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override;
104 STDMETHODIMP IsWindowOwner(HWND hWnd) override;
105
106 // *** IBandNavigate methods ***
107 STDMETHODIMP Select(LPCITEMIDLIST pidl) override;
108
109 // *** INamespaceProxy methods ***
110 STDMETHODIMP GetNavigateTarget(
112 _Out_ PIDLIST_ABSOLUTE *ppidlTarget,
113 _Out_ ULONG *pulAttrib) override;
114 STDMETHODIMP Invoke(_In_ PCIDLIST_ABSOLUTE pidl) override;
115 STDMETHODIMP OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl) override;
116 STDMETHODIMP RefreshFlags(
117 _Out_ DWORD *pdwStyle,
118 _Out_ DWORD *pdwExStyle,
119 _Out_ DWORD *dwEnum) override;
120 STDMETHODIMP CacheItem(_In_ PCIDLIST_ABSOLUTE pidl) override;
121
122 // *** IDropTarget methods ***
123 STDMETHODIMP DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
124 STDMETHODIMP DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
125 STDMETHODIMP DragLeave() override;
126 STDMETHODIMP Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
127
128 // *** IDropSource methods ***
129 STDMETHODIMP QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) override;
130 STDMETHODIMP GiveFeedback(DWORD dwEffect) override;
131
132protected:
133 DWORD m_dwTVStyle = 0;
134 DWORD m_dwTVExStyle = 0;
135 DWORD m_dwEnumFlags = 0;
136 BOOL m_fVisible = FALSE;
137 BOOL m_bFocused = FALSE;
138 DWORD m_dwBandID = 0;
139 CComPtr<IUnknown> m_pSite;
140 CComPtr<IShellFolder> m_pDesktop;
141 CComHeapPtr<ITEMIDLIST> m_pidlRoot;
142 HIMAGELIST m_hToolbarImageList = NULL;
143 CToolbar<> m_hwndToolbar;
144 CTreeView m_hwndTreeView;
145 LONG m_mtxBlockNavigate = 0; // A "lock" that prevents internal selection changes to initiate a navigation to the newly selected item.
146 BOOL m_isEditing = FALSE;
147 HTREEITEM m_hRoot = NULL;
148 HTREEITEM m_oldSelected = NULL;
149 DWORD m_adviseCookie = 0;
150 ULONG m_shellRegID = 0;
151 PWSTR m_OriginalRename = NULL;
152
153 // *** Drop target information ***
154 CComPtr<IDropTarget> m_pDropTarget;
155 HTREEITEM m_childTargetNode = NULL;
156 CComPtr<IDataObject> m_pCurObject;
157
158 VOID OnFinalMessage(HWND) override;
159
160 // *** helper methods ***
161 virtual INT _GetRootCsidl() = 0;
162 virtual HRESULT _CreateTreeView(HWND hwndParent);
163 virtual HRESULT _CreateToolbar(HWND hwndParent) { return S_OK; }
164 virtual void _DestroyTreeView();
165 virtual void _DestroyToolbar();
166 virtual DWORD _GetTVStyle() = 0;
167 virtual DWORD _GetTVExStyle() = 0;
168 virtual DWORD _GetEnumFlags() = 0;
169 virtual BOOL _GetTitle(LPWSTR pszTitle, INT cchTitle) = 0;
170 virtual BOOL _WantsRootItem() = 0;
171 virtual void _SortItems(HTREEITEM hParent) = 0;
172 void _RegisterChangeNotify();
173 void _UnregisterChangeNotify();
174 BOOL OnTreeItemExpanding(_In_ LPNMTREEVIEW pnmtv);
175 BOOL OnTreeItemDeleted(_In_ LPNMTREEVIEW pnmtv);
176 void _OnSelectionChanged(_In_ LPNMTREEVIEW pnmtv);
177 void OnTreeItemDragging(_In_ LPNMTREEVIEW pnmtv, _In_ BOOL isRightClick);
180 void OnChangeNotify(
184 HRESULT _ExecuteCommand(_In_ CComPtr<IContextMenu>& menu, _In_ UINT nCmd);
185 HTREEITEM _InsertItem(
186 _In_opt_ HTREEITEM hParent,
187 _Inout_ IShellFolder *psfParent,
188 _In_ LPCITEMIDLIST pElt,
189 _In_ LPCITEMIDLIST pEltRelative,
190 _In_ BOOL bSort);
191 HTREEITEM _InsertItem(
192 _In_opt_ HTREEITEM hParent,
193 _In_ LPCITEMIDLIST pElt,
194 _In_ LPCITEMIDLIST pEltRelative,
195 _In_ BOOL bSort);
196 BOOL _InsertSubitems(HTREEITEM hItem, LPCITEMIDLIST entry);
197 HRESULT _UpdateBrowser(LPCITEMIDLIST pidlGoto, BOOL IgnoreSelfNavigation = FALSE);
198 HRESULT _GetCurrentLocation(_Out_ PIDLIST_ABSOLUTE *ppidl);
199 HRESULT _IsCurrentLocation(_In_ PCIDLIST_ABSOLUTE pidl);
200 void _Refresh();
201 void _RefreshRecurse(_In_ HTREEITEM hItem);
202 BOOL _IsTreeItemInEnum(_In_ HTREEITEM hItem, _In_ IEnumIDList *pEnum);
203 BOOL _TreeItemHasThisChild(_In_ HTREEITEM hItem, _In_ PCITEMID_CHILD pidlChild);
204 HRESULT _GetItemEnum(
205 _Out_ CComPtr<IEnumIDList>& pEnum,
207 _Out_opt_ IShellFolder **ppFolder = NULL);
208 BOOL _ItemHasAnyChild(_In_ HTREEITEM hItem);
209 HRESULT _AddFavorite();
210
211 // *** ATL message handlers ***
212 LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
213 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
214 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
215 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
216 LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
217 LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
218 LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
219 LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
220 LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
221 LRESULT OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
222
223 BEGIN_MSG_MAP(CNSCBand)
227 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
228 MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
232 MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
235};
236#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:300
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
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()
HRESULT GetClassID([out] CLSID *pClassID)
#define S_OK
Definition: intsafe.h:52
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
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
static HMENU hmenu
Definition: win.c:66
BOOL OnCreate(HWND hWnd)
Definition: msconfig.c:83
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
unsigned int UINT
Definition: ndis.h:50
#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
long LONG
Definition: pedump.c:60
#define LPNMTREEVIEW
Definition: commctrl.h:3648
#define TVGN_CARET
Definition: commctrl.h:3466
#define LPNMTVDISPINFO
Definition: commctrl.h:3681
#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:175
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
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
static int Save(const char **args)
Definition: vfdcmd.c:1851
static LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
Definition: welcome.c:1552
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WM_CREATE
Definition: winuser.h:1619
#define WM_SIZE
Definition: winuser.h:1622
#define WM_COMMAND
Definition: winuser.h:1751
#define WM_SETFOCUS
Definition: winuser.h:1624
#define WM_TIMER
Definition: winuser.h:1753
#define WM_DESTROY
Definition: winuser.h:1620
#define WM_KILLFOCUS
Definition: winuser.h:1625
#define COLOR_3DFACE
Definition: winuser.h:940
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
char * LPSTR
Definition: xmlstorage.h:182
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185