2 * PROJECT: ReactOS shell extensions
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/shellext/qcklnch/CQuickLaunchBand.cpp
5 * PURPOSE: Quick Launch Toolbar (Taskbar Shell Extension)
6 * PROGRAMMERS: Shriraj Sawant a.k.a SR13 <sr.official@hotmail.com>
10 #define WIN32_NO_STATUS
12 #define COM_NO_WINDOWS_H
24 #include <shlobj_undoc.h>
26 #include <shlguid_undoc.h>
31 #include <undocshell.h>
32 #include <shellutils.h>
34 #include "CQuickLaunchBand.h"
37 HRESULT WINAPI
RSHELL_CISFBand_CreateInstance(REFIID riid
, void** ppv
);
39 // {260CB95D-4544-44F6-A079-575BAA60B72F}
40 const GUID CLSID_QuickLaunchBand
= { 0x260cb95d, 0x4544, 0x44f6, { 0xa0, 0x79, 0x57, 0x5b, 0xaa, 0x60, 0xb7, 0x2f } };
42 // Componenet Category Registration
43 HRESULT
RegisterComCat()
45 CComPtr
<ICatRegister
> pcr
;
46 HRESULT hr
= CoCreateInstance(CLSID_StdComponentCategoriesMgr
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(ICatRegister
, &pcr
));
49 CATID catid
= CATID_DeskBand
;
50 hr
= pcr
->RegisterClassImplCategories(CLSID_QuickLaunchBand
, 1, &catid
);
55 HRESULT
UnregisterComCat()
57 CComPtr
<ICatRegister
> pcr
;
58 HRESULT hr
= CoCreateInstance(CLSID_StdComponentCategoriesMgr
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(ICatRegister
, &pcr
));
61 CATID catid
= CATID_DeskBand
;
62 hr
= pcr
->UnRegisterClassImplCategories(CLSID_QuickLaunchBand
, 1, &catid
);
71 * Opens a folder browser dialog,
72 * allowing the user to select a folder for enumeration.
75 * A handle to browser dialog window.
77 * A CSIDL representing the root from which the browse folder dialog shows the files and folders.
79 * @return The PIDL to selected folder.
82 LPITEMIDLIST
PidlBrowse(HWND hwnd
, int nCSIDL
)
84 CComHeapPtr
<ITEMIDLIST
> pidlRoot
;
90 SHGetSpecialFolderLocation(hwnd
, nCSIDL
, &pidlRoot
);
93 BROWSEINFO bi
= { hwnd
, pidlRoot
, path
, L
"Choose a folder", 0, NULL
, 0, 0 };
94 LPITEMIDLIST pidlSelected
= SHBrowseForFolder(&bi
);
101 CQuickLaunchBand::CQuickLaunchBand() {}
103 CQuickLaunchBand::~CQuickLaunchBand() {}
105 /*****************************************************************************/
108 * @name FinalConstruct
110 * Creates an instance of CISFBand, and initializes its Shell Folder Band for enumeration.
112 * @return The error code.
115 HRESULT
CQuickLaunchBand::FinalConstruct()
117 HRESULT hr
= RSHELL_CISFBand_CreateInstance(IID_PPV_ARG(IUnknown
, &m_punkISFB
));
118 if (FAILED_UNEXPECTEDLY(hr
))
121 CComPtr
<IShellFolderBand
> pISFB
;
122 hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IShellFolderBand
, &pISFB
));
123 if (FAILED_UNEXPECTEDLY(hr
))
126 CComPtr
<IShellFolder
> pISF
;
127 hr
= SHGetDesktopFolder(&pISF
);
128 if (FAILED_UNEXPECTEDLY(hr
))
131 CComHeapPtr
<ITEMIDLIST
> pidl(PidlBrowse(m_hWndBro
, CSIDL_DESKTOP
));
134 pISFB
->InitializeSFB(pISF
, pidl
);
140 STDMETHODIMP
CQuickLaunchBand::SetSite(IUnknown
*pUnkSite
)
142 // Internal CISFBand Calls
143 CComPtr
<IObjectWithSite
> pIOWS
;
144 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &pIOWS
));
148 return pIOWS
->SetSite(pUnkSite
);
151 STDMETHODIMP
CQuickLaunchBand::GetSite(IN REFIID riid
, OUT VOID
**ppvSite
)
153 CComPtr
<IObjectWithSite
> pIOWS
;
154 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &pIOWS
));
158 return pIOWS
->GetSite(riid
, ppvSite
);
161 /*****************************************************************************/
163 STDMETHODIMP
CQuickLaunchBand::GetWindow(OUT HWND
*phwnd
)
165 // Internal CISFBand Calls
166 CComPtr
<IDeskBand
> pIDB
;
167 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
171 return pIDB
->GetWindow(phwnd
);
174 STDMETHODIMP
CQuickLaunchBand::ContextSensitiveHelp(IN BOOL fEnterMode
)
176 // Internal CISFBand Calls
177 CComPtr
<IDeskBand
> pIDB
;
178 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
182 return pIDB
->ContextSensitiveHelp(fEnterMode
);
185 STDMETHODIMP
CQuickLaunchBand::ShowDW(IN BOOL bShow
)
187 // Internal CISFBand Calls
188 CComPtr
<IDeskBand
> pIDB
;
189 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
193 return pIDB
->ShowDW(bShow
);
196 STDMETHODIMP
CQuickLaunchBand::CloseDW(IN DWORD dwReserved
)
198 // Internal CISFBand Calls
199 CComPtr
<IDeskBand
> pIDB
;
200 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
204 return pIDB
->CloseDW(dwReserved
);
207 STDMETHODIMP
CQuickLaunchBand::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
209 // Internal CISFBand Calls
210 CComPtr
<IDeskBand
> pIDB
;
211 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
215 return pIDB
->ResizeBorderDW(prcBorder
, punkToolbarSite
, fReserved
);
218 STDMETHODIMP
CQuickLaunchBand::GetBandInfo(IN DWORD dwBandID
, IN DWORD dwViewMode
, IN OUT DESKBANDINFO
*pdbi
)
220 // Internal CISFBand Calls
221 CComPtr
<IDeskBand
> pIDB
;
222 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
226 return pIDB
->GetBandInfo(dwBandID
, dwViewMode
, pdbi
);
229 /*****************************************************************************/
231 STDMETHODIMP
CQuickLaunchBand::GetClassID(OUT CLSID
*pClassID
)
233 // Internal CISFBand Calls
234 CComPtr
<IPersistStream
> pIPS
;
235 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
239 return pIPS
->GetClassID(pClassID
);
242 STDMETHODIMP
CQuickLaunchBand::IsDirty()
244 // Internal CISFBand Calls
245 CComPtr
<IPersistStream
> pIPS
;
246 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
250 return pIPS
->IsDirty();
253 STDMETHODIMP
CQuickLaunchBand::Load(IN IStream
*pStm
)
255 CComPtr
<IPersistStream
> pIPS
;
256 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
260 return pIPS
->Load(pStm
);
263 STDMETHODIMP
CQuickLaunchBand::Save(IN IStream
*pStm
, IN BOOL fClearDirty
)
265 // Internal CISFBand Calls
266 CComPtr
<IPersistStream
> pIPS
;
267 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
271 return pIPS
->Save(pStm
, fClearDirty
);
274 STDMETHODIMP
CQuickLaunchBand::GetSizeMax(OUT ULARGE_INTEGER
*pcbSize
)
276 CComPtr
<IPersistStream
> pIPS
;
277 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
281 return pIPS
->GetSizeMax(pcbSize
);
285 /*****************************************************************************/
287 STDMETHODIMP
CQuickLaunchBand::ContainsWindow(IN HWND hWnd
)
292 STDMETHODIMP
CQuickLaunchBand::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
294 // Internal CISFBand Calls
295 CComPtr
<IWinEventHandler
> pWEH
;
296 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &pWEH
));
300 return pWEH
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
303 STDMETHODIMP
CQuickLaunchBand::IsWindowOwner(HWND hWnd
)
305 // Internal CISFBand Calls
306 CComPtr
<IWinEventHandler
> pWEH
;
307 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &pWEH
));
311 return pWEH
->IsWindowOwner(hWnd
);
314 /*****************************************************************************/
315 // *** IOleCommandTarget methods ***
316 STDMETHODIMP
CQuickLaunchBand::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
318 // Internal CISFBand Calls
319 CComPtr
<IOleCommandTarget
> pOCT
;
320 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &pOCT
));
324 return pOCT
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
327 STDMETHODIMP
CQuickLaunchBand::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
329 // Internal CISFBand Calls
330 CComPtr
<IOleCommandTarget
> pOCT
;
331 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &pOCT
));
335 return pOCT
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
338 /*****************************************************************************/
339 // *** IContextMenu ***
340 STDMETHODIMP
CQuickLaunchBand::GetCommandString(UINT_PTR idCmd
, UINT uFlags
, UINT
*pwReserved
, LPSTR pszName
, UINT cchMax
)
342 // Internal CISFBand Calls
343 CComPtr
<IContextMenu
> pICM
;
344 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IContextMenu
, &pICM
));
348 return pICM
->GetCommandString(idCmd
, uFlags
, pwReserved
, pszName
, cchMax
);
351 STDMETHODIMP
CQuickLaunchBand::InvokeCommand(LPCMINVOKECOMMANDINFO pici
)
353 // Internal CISFBand Calls
354 CComPtr
<IContextMenu
> pICM
;
355 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IContextMenu
, &pICM
));
359 return pICM
->InvokeCommand(pici
);
362 STDMETHODIMP
CQuickLaunchBand::QueryContextMenu(HMENU hmenu
, UINT indexMenu
, UINT idCmdFirst
, UINT idCmdLast
, UINT uFlags
)
364 // Internal CISFBand Calls
365 CComPtr
<IContextMenu
> pICM
;
366 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IContextMenu
, &pICM
));
370 return pICM
->QueryContextMenu(hmenu
, indexMenu
, idCmdFirst
, idCmdLast
, uFlags
);