ReactOS 0.4.16-dev-188-g678aa63
CQuickLaunchBand.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shell extensions
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Quick Launch Toolbar (Taskbar Shell Extension)
5 * COPYRIGHT: Copyright Shriraj Sawant a.k.a SR13 <sr.official@hotmail.com>
6 */
7
8#define WIN32_NO_STATUS
9#define _INC_WINDOWS
10#define COM_NO_WINDOWS_H
11
12#define COBJMACROS
13
14#include <windef.h>
15#include <winbase.h>
16#include <winreg.h>
17#include <wingdi.h>
18#include <winnls.h>
19#include <wincon.h>
20#include <shellapi.h>
21#include <shlobj.h>
22#include <shlobj_undoc.h>
23#include <shlwapi.h>
24#include <shlguid_undoc.h>
25#include <atlbase.h>
26#include <atlcom.h>
27#include <atlwin.h>
28
29#include <undocshell.h>
30#include <shellutils.h>
31
32#include "CQuickLaunchBand.h"
33
34extern "C"
36
37// {260CB95D-4544-44F6-A079-575BAA60B72F}
38const GUID CLSID_QuickLaunchBand = { 0x260cb95d, 0x4544, 0x44f6, { 0xa0, 0x79, 0x57, 0x5b, 0xaa, 0x60, 0xb7, 0x2f } };
39
40// Componenet Category Registration
42{
43 CComPtr<ICatRegister> pcr;
44 HRESULT hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(ICatRegister, &pcr));
45 if (SUCCEEDED(hr))
46 {
47 CATID catid = CATID_DeskBand;
48 hr = pcr->RegisterClassImplCategories(CLSID_QuickLaunchBand, 1, &catid);
49 }
50 return hr;
51}
52
54{
55 CComPtr<ICatRegister> pcr;
56 HRESULT hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(ICatRegister, &pcr));
57 if (SUCCEEDED(hr))
58 {
59 CATID catid = CATID_DeskBand;
60 hr = pcr->UnRegisterClassImplCategories(CLSID_QuickLaunchBand, 1, &catid);
61 }
62 return hr;
63}
64
65// Pidl Browser
66/*++
67* @name PidlBrowse
68*
69* Opens a folder browser dialog,
70* allowing the user to select a folder for enumeration.
71*
72* @param hwnd
73* A handle to browser dialog window.
74* @param nCSIDL
75* A CSIDL representing the root from which the browse folder dialog shows the files and folders.
76*
77* @return The PIDL to selected folder.
78*
79*--*/
81{
82 CComHeapPtr<ITEMIDLIST> pidlRoot;
83
85
86 if (nCSIDL)
87 {
88 SHGetSpecialFolderLocation(hwnd, nCSIDL, &pidlRoot);
89 }
90
91 BROWSEINFO bi = { hwnd, pidlRoot, path, L"Choose a folder", 0, NULL, 0, 0 };
92 LPITEMIDLIST pidlSelected = SHBrowseForFolder(&bi);
93
94 return pidlSelected;
95}
96
97// CQuickLaunchBand
98
100
102
103/*****************************************************************************/
104// ATL Construct
105/*++
106* @name FinalConstruct
107*
108* Creates an instance of CISFBand, and initializes its Shell Folder Band for enumeration.
109*
110* @return The error code.
111*
112*--*/
114{
117 return hr;
118
119 CComPtr<IShellFolderBand> pISFB;
120 hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IShellFolderBand, &pISFB));
122 return hr;
123
124 CComPtr<IShellFolder> pISF;
125 hr = SHGetDesktopFolder(&pISF);
127 return hr;
128
129 CComHeapPtr<ITEMIDLIST> pidl(PidlBrowse(m_hWndBro, CSIDL_DESKTOP));
130 if (pidl == NULL)
131 return E_FAIL;
132 pISFB->InitializeSFB(pISF, pidl);
133
134 return hr;
135}
136
137// IObjectWithSite
139{
140 // Internal CISFBand Calls
141 CComPtr<IObjectWithSite> pIOWS;
142 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IObjectWithSite, &pIOWS));
143 if (FAILED(hr))
144 return hr;
145
146 return pIOWS->SetSite(pUnkSite);
147}
148
150{
151 CComPtr<IObjectWithSite> pIOWS;
152 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IObjectWithSite, &pIOWS));
153 if (FAILED(hr))
154 return hr;
155
156 return pIOWS->GetSite(riid, ppvSite);
157}
158
159/*****************************************************************************/
160// IDeskBand
162{
163 // Internal CISFBand Calls
164 CComPtr<IDeskBand> pIDB;
165 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB));
166 if (FAILED(hr))
167 return hr;
168
169 return pIDB->GetWindow(phwnd);
170}
171
173{
174 // Internal CISFBand Calls
175 CComPtr<IDeskBand> pIDB;
176 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB));
177 if (FAILED(hr))
178 return hr;
179
180 return pIDB->ContextSensitiveHelp(fEnterMode);
181}
182
184{
185 // Internal CISFBand Calls
186 CComPtr<IDeskBand> pIDB;
187 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB));
188 if (FAILED(hr))
189 return hr;
190
191 return pIDB->ShowDW(bShow);
192}
193
195{
196 // Internal CISFBand Calls
197 CComPtr<IDeskBand> pIDB;
198 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB));
199 if (FAILED(hr))
200 return hr;
201
202 return pIDB->CloseDW(dwReserved);
203}
204
206{
207 // Internal CISFBand Calls
208 CComPtr<IDeskBand> pIDB;
209 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB));
210 if (FAILED(hr))
211 return hr;
212
213 return pIDB->ResizeBorderDW(prcBorder, punkToolbarSite, fReserved);
214}
215
217{
218 // Internal CISFBand Calls
219 CComPtr<IDeskBand> pIDB;
220 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IDeskBand, &pIDB));
221 if (FAILED(hr))
222 return hr;
223
224 return pIDB->GetBandInfo(dwBandID, dwViewMode, pdbi);
225}
226
227/*****************************************************************************/
228// IPersistStream
230{
231 // Internal CISFBand Calls
232 CComPtr<IPersistStream> pIPS;
233 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS));
234 if (FAILED(hr))
235 return hr;
236
237 return pIPS->GetClassID(pClassID);
238}
239
241{
242 // Internal CISFBand Calls
243 CComPtr<IPersistStream> pIPS;
244 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS));
245 if (FAILED(hr))
246 return hr;
247
248 return pIPS->IsDirty();
249}
250
252{
253 CComPtr<IPersistStream> pIPS;
254 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS));
255 if (FAILED(hr))
256 return hr;
257
258 return pIPS->Load(pStm);
259}
260
262{
263 // Internal CISFBand Calls
264 CComPtr<IPersistStream> pIPS;
265 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS));
266 if (FAILED(hr))
267 return hr;
268
269 return pIPS->Save(pStm, fClearDirty);
270}
271
273{
274 CComPtr<IPersistStream> pIPS;
275 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IPersistStream, &pIPS));
276 if (FAILED(hr))
277 return hr;
278
279 return pIPS->GetSizeMax(pcbSize);
280}
281
282/*****************************************************************************/
283// IWinEventHandler
285{
286 return E_NOTIMPL;
287}
288
290{
291 // Internal CISFBand Calls
292 CComPtr<IWinEventHandler> pWEH;
293 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IWinEventHandler, &pWEH));
294 if (FAILED(hr))
295 return hr;
296
297 return pWEH->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult);
298}
299
301{
302 // Internal CISFBand Calls
303 CComPtr<IWinEventHandler> pWEH;
304 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IWinEventHandler, &pWEH));
305 if (FAILED(hr))
306 return hr;
307
308 return pWEH->IsWindowOwner(hWnd);
309}
310
311/*****************************************************************************/
312// *** IOleCommandTarget methods ***
313STDMETHODIMP CQuickLaunchBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
314{
315 // Internal CISFBand Calls
316 CComPtr<IOleCommandTarget> pOCT;
317 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &pOCT));
318 if (FAILED(hr))
319 return hr;
320
321 return pOCT->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText);
322}
323
324STDMETHODIMP CQuickLaunchBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
325{
326 // Internal CISFBand Calls
327 CComPtr<IOleCommandTarget> pOCT;
328 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &pOCT));
329 if (FAILED(hr))
330 return hr;
331
332 return pOCT->Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
333}
334
335/*****************************************************************************/
336// *** IContextMenu ***
338{
339 // Internal CISFBand Calls
340 CComPtr<IContextMenu> pICM;
341 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IContextMenu, &pICM));
342 if (FAILED(hr))
343 return hr;
344
345 return pICM->GetCommandString(idCmd, uFlags, pwReserved, pszName, cchMax);
346}
347
349{
350 // Internal CISFBand Calls
351 CComPtr<IContextMenu> pICM;
352 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IContextMenu, &pICM));
353 if (FAILED(hr))
354 return hr;
355
356 return pICM->InvokeCommand(pici);
357}
358
360{
361 // Internal CISFBand Calls
362 CComPtr<IContextMenu> pICM;
363 HRESULT hr = m_punkISFB->QueryInterface(IID_PPV_ARG(IContextMenu, &pICM));
364 if (FAILED(hr))
365 return hr;
366
367 return pICM->QueryContextMenu(hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
368}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
const GUID CLSID_QuickLaunchBand
LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL)
HRESULT UnregisterComCat()
HRESULT WINAPI RSHELL_CISFBand_CreateInstance(REFIID riid, void **ppv)
Definition: CISFBand.cpp:669
HRESULT RegisterComCat()
UINT cchMax
HWND hWnd
Definition: settings.c:17
#define STDMETHODIMP
Definition: basetyps.h:43
STDMETHOD() GetBandInfo(IN DWORD dwBandID, IN DWORD dwViewMode, IN OUT DESKBANDINFO *pdbi) override
STDMETHOD() ContainsWindow(IN HWND hWnd)
STDMETHOD() Save(IN IStream *pStm, IN BOOL fClearDirty) override
STDMETHOD() GetWindow(OUT HWND *phwnd) override
STDMETHOD() GetSizeMax(OUT ULARGE_INTEGER *pcbSize) override
CComPtr< IUnknown > m_punkISFB
STDMETHOD() InvokeCommand(LPCMINVOKECOMMANDINFO pici) override
STDMETHOD() IsDirty() override
STDMETHOD() SetSite(IN IUnknown *pUnkSite) override
STDMETHOD() Exec(IN const GUID *pguidCmdGroup, IN DWORD nCmdID, IN DWORD nCmdexecopt, IN VARIANT *pvaIn, IN OUT VARIANT *pvaOut) override
STDMETHOD() CloseDW(IN DWORD dwReserved) override
STDMETHOD() IsWindowOwner(HWND hWnd) override
STDMETHOD() Load(IN IStream *pStm) override
STDMETHOD() ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override
STDMETHOD() GetClassID(OUT CLSID *pClassID) override
STDMETHOD() GetSite(IN REFIID riid, OUT void **ppvSite) override
STDMETHOD() OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override
STDMETHOD() ContextSensitiveHelp(IN BOOL fEnterMode) override
STDMETHOD() QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
STDMETHOD() ShowDW(IN BOOL bShow) override
STDMETHOD() GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax) override
STDMETHOD() QueryStatus(IN const GUID *pguidCmdGroup, IN ULONG cCmds, IN OUT OLECMD prgCmds[], IN OUT OLECMDTEXT *pCmdText) override
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
UINT uFlags
Definition: api.c:59
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3257
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
GUID catid
Definition: msctf.idl:647
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 L(x)
Definition: ntvdm.h:50
#define REFIID
Definition: guiddef.h:118
HRESULT hr
Definition: shlfolder.c:183
#define BROWSEINFO
Definition: shlobj.h:1210
#define SHBrowseForFolder
Definition: shlobj.h:1253
#define CSIDL_DESKTOP
Definition: shlobj.h:2173
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
static HMENU hmenu
Definition: win.c:66
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define IID_PPV_ARG(Itype, ppType)
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180