[SHELL32] SHChangeNotify: Add drive, remove drive (#6782)
[reactos.git] / dll / win32 / browseui / explorerband.h
1 /*
2 * ReactOS Explorer
3 *
4 * Copyright 2016 Sylvain Deverre <deverre dot sylv at gmail dot com>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #pragma once
22
23 #define WM_USER_SHELLEVENT WM_USER+88
24 #define WM_USER_FOLDEREVENT WM_USER+88
25
26 class CExplorerBand :
27 public CComCoClass<CExplorerBand, &CLSID_ExplorerBand>,
28 public CComObjectRootEx<CComMultiThreadModelNoCS>,
29 public IDeskBand,
30 public IObjectWithSite,
31 public IInputObject,
32 public IPersistStream,
33 public IOleCommandTarget,
34 public IServiceProvider,
35 public IBandNavigate,
36 public IWinEventHandler,
37 public INamespaceProxy,
38 public IDispatch,
39 public IDropSource,
40 public IDropTarget,
41 public CWindowImpl<CExplorerBand, CWindow, CControlWinTraits>
42 {
43
44 private:
45 class NodeInfo
46 {
47 public:
48 LPITEMIDLIST absolutePidl;
49 LPITEMIDLIST relativePidl;
50 BOOL expanded;
51 };
52
53 // *** BaseBarSite information ***
54 CComPtr<IUnknown> pSite;
55 CComPtr<IShellFolder> pDesktop;
56
57 // *** tree explorer band stuff ***
58 BOOL fVisible;
59 BOOL bNavigating;
60 BOOL bFocused;
61 DWORD dwBandID;
62 HIMAGELIST hImageList;
63 HTREEITEM hRoot;
64 HTREEITEM oldSelected;
65 LPITEMIDLIST pidlCurrent;
66
67 // *** notification cookies ***
68 DWORD adviseCookie;
69 ULONG shellRegID;
70
71 // *** Drop target information ***
72 CComPtr<IDropTarget> pDropTarget;
73 HTREEITEM childTargetNode;
74 CComPtr<IDataObject> pCurObject;
75
76 void InitializeExplorerBand();
77 void DestroyExplorerBand();
78 HRESULT ExecuteCommand(CComPtr<IContextMenu>& menu, UINT nCmd);
79
80 // *** notifications handling ***
81 BOOL OnTreeItemExpanding(LPNMTREEVIEW pnmtv);
82 void OnSelectionChanged(LPNMTREEVIEW pnmtv);
83 BOOL OnTreeItemDeleted(LPNMTREEVIEW pnmtv);
84 void OnTreeItemDragging(LPNMTREEVIEW pnmtv, BOOL isRightClick);
85
86 // *** ATL event handlers ***
87 LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
88 LRESULT ContextMenuHack(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
89 LRESULT OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
90 LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
91 LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
92
93 // *** Helper functions ***
94 NodeInfo* GetNodeInfo(HTREEITEM hItem);
95 HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto);
96 HTREEITEM InsertItem(HTREEITEM hParent, IShellFolder *psfParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort);
97 HTREEITEM InsertItem(HTREEITEM hParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort);
98 BOOL InsertSubitems(HTREEITEM hItem, NodeInfo *pNodeInfo);
99 BOOL NavigateToPIDL(LPITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect);
100 BOOL DeleteItem(LPITEMIDLIST toDelete);
101 BOOL RenameItem(HTREEITEM toRename, LPITEMIDLIST newPidl);
102 BOOL RefreshTreePidl(HTREEITEM tree, LPITEMIDLIST pidlParent);
103 BOOL NavigateToCurrentFolder();
104
105 // *** Tree item sorting callback ***
106 static int CALLBACK CompareTreeItems(LPARAM p1, LPARAM p2, LPARAM p3);
107
108 public:
109 CExplorerBand();
110 virtual ~CExplorerBand();
111
112 // *** IOleWindow methods ***
113 virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
114 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
115
116 // *** IDockingWindow methods ***
117 virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved);
118 virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved);
119 virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow);
120
121 // *** IDeskBand methods ***
122 virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi);
123
124 // *** IObjectWithSite methods ***
125 virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
126 virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite);
127
128 // *** IOleCommandTarget methods ***
129 virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText);
130 virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
131
132 // *** IServiceProvider methods ***
133 virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
134
135 // *** IInputObject methods ***
136 virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg);
137 virtual HRESULT STDMETHODCALLTYPE HasFocusIO();
138 virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg);
139
140 // *** IPersist methods ***
141 virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
142
143 // *** IPersistStream methods ***
144 virtual HRESULT STDMETHODCALLTYPE IsDirty();
145 virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm);
146 virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty);
147 virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize);
148
149 // *** IWinEventHandler methods ***
150 virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
151 virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd);
152
153 // *** IBandNavigate methods ***
154 virtual HRESULT STDMETHODCALLTYPE Select(long paramC);
155
156 // *** INamespaceProxy ***
157 virtual HRESULT STDMETHODCALLTYPE GetNavigateTarget(long paramC, long param10, long param14);
158 virtual HRESULT STDMETHODCALLTYPE Invoke(long paramC);
159 virtual HRESULT STDMETHODCALLTYPE OnSelectionChanged(long paramC);
160 virtual HRESULT STDMETHODCALLTYPE RefreshFlags(long paramC, long param10, long param14);
161 virtual HRESULT STDMETHODCALLTYPE CacheItem(long paramC);
162
163 // *** IDispatch methods ***
164 virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
165 virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
166 virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
167 virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
168
169 // *** IDropTarget methods ***
170 virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect);
171 virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect);
172 virtual HRESULT STDMETHODCALLTYPE DragLeave();
173 virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect);
174
175 // *** IDropSource methods ***
176 virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState);
177 virtual HRESULT STDMETHODCALLTYPE GiveFeedback(DWORD dwEffect);
178
179 DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBAND)
180 DECLARE_NOT_AGGREGATABLE(CExplorerBand)
181
182 DECLARE_PROTECT_FINAL_CONSTRUCT()
183
184 BEGIN_COM_MAP(CExplorerBand)
185 COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
186 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler)
187 COM_INTERFACE_ENTRY_IID(IID_IBandNavigate, IBandNavigate)
188 COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy, INamespaceProxy)
189 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand)
190 COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand)
191 COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
192 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
193 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
194 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
195 COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)
196 COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream)
197 COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
198 END_COM_MAP()
199
200 BEGIN_MSG_MAP(CExplorerBand)
201 MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
202 MESSAGE_HANDLER(WM_USER_SHELLEVENT, OnShellEvent)
203 MESSAGE_HANDLER(WM_RBUTTONDOWN, ContextMenuHack)
204 MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
205 // MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
206 END_MSG_MAP()
207 };