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