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