f73fe9af314daed8f5c356e4b27ede0c5dd7d425
[reactos.git] / reactos / 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
66 // *** notification cookies ***
67 DWORD adviseCookie;
68 ULONG shellRegID;
69
70 void InitializeExplorerBand();
71 void DestroyExplorerBand();
72 HRESULT ExecuteCommand(CComPtr<IContextMenu>& menu, UINT nCmd);
73
74 BOOL OnTreeItemExpanding(LPNMTREEVIEW pnmtv);
75 void OnSelectionChanged(LPNMTREEVIEW pnmtv);
76
77 // *** ATL event handlers ***
78 LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
79 LRESULT ContextMenuHack(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
80
81 // *** Helper functions ***
82 NodeInfo* GetNodeInfo(HTREEITEM hItem);
83 HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto);
84 HTREEITEM InsertItem(HTREEITEM hParent, IShellFolder *psfParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort);
85 HTREEITEM InsertItem(HTREEITEM hParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort);
86 BOOL InsertSubitems(HTREEITEM hItem, NodeInfo *pNodeInfo);
87 BOOL NavigateToPIDL(LPITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect);
88 BOOL NavigateToCurrentFolder();
89
90 public:
91 CExplorerBand();
92 virtual ~CExplorerBand();
93
94 // *** IOleWindow methods ***
95 virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
96 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
97
98 // *** IDockingWindow methods ***
99 virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved);
100 virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved);
101 virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow);
102
103 // *** IDeskBand methods ***
104 virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi);
105
106 // *** IObjectWithSite methods ***
107 virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
108 virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite);
109
110 // *** IOleCommandTarget methods ***
111 virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText);
112 virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
113
114 // *** IServiceProvider methods ***
115 virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
116
117 // *** IInputObject methods ***
118 virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg);
119 virtual HRESULT STDMETHODCALLTYPE HasFocusIO();
120 virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg);
121
122 // *** IPersist methods ***
123 virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
124
125 // *** IPersistStream methods ***
126 virtual HRESULT STDMETHODCALLTYPE IsDirty();
127 virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm);
128 virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty);
129 virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize);
130
131 // *** IWinEventHandler methods ***
132 virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
133 virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd);
134
135 // *** IBandNavigate methods ***
136 virtual HRESULT STDMETHODCALLTYPE Select(long paramC);
137
138 // *** INamespaceProxy ***
139 virtual HRESULT STDMETHODCALLTYPE GetNavigateTarget(long paramC, long param10, long param14);
140 virtual HRESULT STDMETHODCALLTYPE Invoke(long paramC);
141 virtual HRESULT STDMETHODCALLTYPE OnSelectionChanged(long paramC);
142 virtual HRESULT STDMETHODCALLTYPE RefreshFlags(long paramC, long param10, long param14);
143 virtual HRESULT STDMETHODCALLTYPE CacheItem(long paramC);
144
145 // *** IDispatch methods ***
146 virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
147 virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
148 virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
149 virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
150
151 // *** IDropTarget methods ***
152 virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect);
153 virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect);
154 virtual HRESULT STDMETHODCALLTYPE DragLeave();
155 virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect);
156
157 // *** IDropSource methods ***
158 virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState);
159 virtual HRESULT STDMETHODCALLTYPE GiveFeedback(DWORD dwEffect);
160
161 DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBAND)
162 DECLARE_NOT_AGGREGATABLE(CExplorerBand)
163
164 DECLARE_PROTECT_FINAL_CONSTRUCT()
165
166 BEGIN_COM_MAP(CExplorerBand)
167 COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
168 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler)
169 COM_INTERFACE_ENTRY_IID(IID_IBandNavigate, IBandNavigate)
170 COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy, INamespaceProxy)
171 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand)
172 COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand)
173 COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
174 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
175 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
176 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
177 COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)
178 COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream)
179 COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
180 END_COM_MAP()
181
182 BEGIN_MSG_MAP(CExplorerBand)
183 MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
184 MESSAGE_HANDLER(WM_RBUTTONDOWN, ContextMenuHack)
185 END_MSG_MAP()
186 };