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>
11 WINE_DEFAULT_DEBUG_CHANNEL(qcklnch
);
13 // {260CB95D-4544-44F6-A079-575BAA60B72F}
14 static const GUID CLSID_QuickLaunchBand
= { 0x260cb95d, 0x4544, 0x44f6, { 0xa0, 0x79, 0x57, 0x5b, 0xaa, 0x60, 0xb7, 0x2f } };
16 // Componenet Category Registration
17 HRESULT
RegisterComCat()
19 CComPtr
<ICatRegister
> pcr
;
20 HRESULT hr
= CoCreateInstance(CLSID_StdComponentCategoriesMgr
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(ICatRegister
, &pcr
));
23 CATID catid
= CATID_DeskBand
;
24 hr
= pcr
->RegisterClassImplCategories(CLSID_QuickLaunchBand
, 1, &catid
);
29 HRESULT
UnregisterComCat()
31 CComPtr
<ICatRegister
> pcr
;
32 HRESULT hr
= CoCreateInstance(CLSID_StdComponentCategoriesMgr
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(ICatRegister
, &pcr
));
35 CATID catid
= CATID_DeskBand
;
36 hr
= pcr
->UnRegisterClassImplCategories(CLSID_QuickLaunchBand
, 1, &catid
);
45 * Opens a folder browser dialog,
46 * allowing the user to select a folder for enumeration.
49 * A handle to browser dialog window.
51 * A CSIDL representing the root from which the browse folder dialog shows the files and folders.
53 * @return The PIDL to selected folder.
56 LPITEMIDLIST
PidlBrowse(HWND hwnd
, int nCSIDL
)
58 CComHeapPtr
<ITEMIDLIST
> pidlRoot
;
64 SHGetSpecialFolderLocation(hwnd
, nCSIDL
, &pidlRoot
);
67 CString
biTitle((LPCSTR
)IDS_BROWSEINFO_TITLE
);
68 BROWSEINFO bi
= { hwnd
, pidlRoot
, path
, biTitle
, 0, NULL
, 0, 0 };
69 LPITEMIDLIST pidlSelected
= SHBrowseForFolder(&bi
);
76 CQuickLaunchBand::CQuickLaunchBand() {}
78 CQuickLaunchBand::~CQuickLaunchBand() {}
80 /*****************************************************************************/
83 * @name FinalConstruct
85 * Creates an instance of CISFBand, and initializes its Shell Folder Band for enumeration.
87 * @return The error code.
90 HRESULT
CQuickLaunchBand::FinalConstruct()
92 HRESULT hr
= CISFBand_CreateInstance(IID_PPV_ARG(IUnknown
, &m_punkISFB
));
93 if (FAILED_UNEXPECTEDLY(hr
))
96 CComPtr
<IShellFolderBand
> pISFB
;
97 hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IShellFolderBand
, &pISFB
));
98 if (FAILED_UNEXPECTEDLY(hr
))
101 CComPtr
<IShellFolder
> pISF
;
102 hr
= SHGetDesktopFolder(&pISF
);
103 if (FAILED_UNEXPECTEDLY(hr
))
106 CComHeapPtr
<ITEMIDLIST
> pidl(PidlBrowse(m_hWndBro
, CSIDL_DESKTOP
));
109 pISFB
->InitializeSFB(pISF
, pidl
);
115 STDMETHODIMP
CQuickLaunchBand::SetSite(IUnknown
*pUnkSite
)
117 TRACE("CQuickLaunchBand::SetSite(0x%p)\n", pUnkSite
);
119 // Internal CISFBand Calls
120 CComPtr
<IObjectWithSite
> pIOWS
;
121 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &pIOWS
));
125 return pIOWS
->SetSite(pUnkSite
);
128 STDMETHODIMP
CQuickLaunchBand::GetSite(IN REFIID riid
, OUT VOID
**ppvSite
)
130 TRACE("CQuickLaunchBand::GetSite(0x%p,0x%p)\n", riid
, ppvSite
);
132 // Internal CISFBand Calls
133 CComPtr
<IObjectWithSite
> pIOWS
;
134 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &pIOWS
));
138 return pIOWS
->GetSite(riid
, ppvSite
);
141 /*****************************************************************************/
143 STDMETHODIMP
CQuickLaunchBand::GetWindow(OUT HWND
*phwnd
)
145 // Internal CISFBand Calls
146 CComPtr
<IDeskBand
> pIDB
;
147 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
151 return pIDB
->GetWindow(phwnd
);
154 STDMETHODIMP
CQuickLaunchBand::ContextSensitiveHelp(IN BOOL fEnterMode
)
156 // Internal CISFBand Calls
157 CComPtr
<IDeskBand
> pIDB
;
158 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
162 return pIDB
->ContextSensitiveHelp(fEnterMode
);
165 STDMETHODIMP
CQuickLaunchBand::ShowDW(IN BOOL bShow
)
167 // Internal CISFBand Calls
168 CComPtr
<IDeskBand
> pIDB
;
169 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
173 return pIDB
->ShowDW(bShow
);
176 STDMETHODIMP
CQuickLaunchBand::CloseDW(IN DWORD dwReserved
)
178 // Internal CISFBand Calls
179 CComPtr
<IDeskBand
> pIDB
;
180 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
184 return pIDB
->CloseDW(dwReserved
);
187 STDMETHODIMP
CQuickLaunchBand::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
189 // Internal CISFBand Calls
190 CComPtr
<IDeskBand
> pIDB
;
191 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
195 return pIDB
->ResizeBorderDW(prcBorder
, punkToolbarSite
, fReserved
);
198 STDMETHODIMP
CQuickLaunchBand::GetBandInfo(IN DWORD dwBandID
, IN DWORD dwViewMode
, IN OUT DESKBANDINFO
*pdbi
)
200 TRACE("CQuickLaunchBand::GetBandInfo(0x%x,0x%x,0x%p)\n", dwBandID
, dwViewMode
, pdbi
);
202 // Internal CISFBand Calls
203 CComPtr
<IDeskBand
> pIDB
;
204 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IDeskBand
, &pIDB
));
208 return pIDB
->GetBandInfo(dwBandID
, dwViewMode
, pdbi
);
211 /*****************************************************************************/
213 STDMETHODIMP
CQuickLaunchBand::GetClassID(OUT CLSID
*pClassID
)
215 TRACE("CQuickLaunchBand::GetClassID(0x%p)\n", pClassID
);
217 // Internal CISFBand Calls
218 CComPtr
<IPersistStream
> pIPS
;
219 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
223 return pIPS
->GetClassID(pClassID
);
226 STDMETHODIMP
CQuickLaunchBand::IsDirty()
228 // Internal CISFBand Calls
229 CComPtr
<IPersistStream
> pIPS
;
230 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
234 return pIPS
->IsDirty();
237 STDMETHODIMP
CQuickLaunchBand::Load(IN IStream
*pStm
)
239 TRACE("CQuickLaunchBand::Load called\n");
241 // Internal CISFBand Calls
242 CComPtr
<IPersistStream
> pIPS
;
243 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
247 return pIPS
->Load(pStm
);
250 STDMETHODIMP
CQuickLaunchBand::Save(IN IStream
*pStm
, IN BOOL fClearDirty
)
252 // Internal CISFBand Calls
253 CComPtr
<IPersistStream
> pIPS
;
254 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
258 return pIPS
->Save(pStm
, fClearDirty
);
261 STDMETHODIMP
CQuickLaunchBand::GetSizeMax(OUT ULARGE_INTEGER
*pcbSize
)
263 TRACE("CQuickLaunchBand::GetSizeMax called\n");
265 // Internal CISFBand Calls
266 CComPtr
<IPersistStream
> pIPS
;
267 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IPersistStream
, &pIPS
));
271 return pIPS
->GetSizeMax(pcbSize
);
275 /*****************************************************************************/
277 STDMETHODIMP
CQuickLaunchBand::ContainsWindow(IN HWND hWnd
)
282 STDMETHODIMP
CQuickLaunchBand::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
284 // Internal CISFBand Calls
285 CComPtr
<IWinEventHandler
> pWEH
;
286 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &pWEH
));
290 return pWEH
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
293 STDMETHODIMP
CQuickLaunchBand::IsWindowOwner(HWND hWnd
)
295 // Internal CISFBand Calls
296 CComPtr
<IWinEventHandler
> pWEH
;
297 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &pWEH
));
301 return pWEH
->IsWindowOwner(hWnd
);
304 /*****************************************************************************/
305 // *** IOleCommandTarget methods ***
306 STDMETHODIMP
CQuickLaunchBand::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
308 // Internal CISFBand Calls
309 CComPtr
<IOleCommandTarget
> pOCT
;
310 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &pOCT
));
314 return pOCT
->QueryStatus(pguidCmdGroup
, cCmds
, prgCmds
, pCmdText
);
317 STDMETHODIMP
CQuickLaunchBand::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
319 // Internal CISFBand Calls
320 CComPtr
<IOleCommandTarget
> pOCT
;
321 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &pOCT
));
325 return pOCT
->Exec(pguidCmdGroup
, nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
328 /*****************************************************************************/
329 // *** IContextMenu ***
330 STDMETHODIMP
CQuickLaunchBand::GetCommandString(UINT_PTR idCmd
, UINT uFlags
, UINT
*pwReserved
, LPSTR pszName
, UINT cchMax
)
332 // Internal CISFBand Calls
333 CComPtr
<IContextMenu
> pICM
;
334 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IContextMenu
, &pICM
));
338 return pICM
->GetCommandString(idCmd
, uFlags
, pwReserved
, pszName
, cchMax
);
341 STDMETHODIMP
CQuickLaunchBand::InvokeCommand(LPCMINVOKECOMMANDINFO pici
)
343 // Internal CISFBand Calls
344 CComPtr
<IContextMenu
> pICM
;
345 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IContextMenu
, &pICM
));
349 return pICM
->InvokeCommand(pici
);
352 STDMETHODIMP
CQuickLaunchBand::QueryContextMenu(HMENU hmenu
, UINT indexMenu
, UINT idCmdFirst
, UINT idCmdLast
, UINT uFlags
)
354 // Internal CISFBand Calls
355 CComPtr
<IContextMenu
> pICM
;
356 HRESULT hr
= m_punkISFB
->QueryInterface(IID_PPV_ARG(IContextMenu
, &pICM
));
360 return pICM
->QueryContextMenu(hmenu
, indexMenu
, idCmdFirst
, idCmdLast
, uFlags
);