windows-nt/Source/XPSP1/NT/shell/browseui/deskbar.cpp
2020-09-26 16:20:57 +08:00

175 lines
3.7 KiB
C++

// coming soon: new deskbar (old deskbar moved to browbar base class)
#include "priv.h"
#include "sccls.h"
#include "resource.h"
#include "deskbar.h"
#define SUPERCLASS CDockingBar
//*** CDeskBar_CreateInstance --
//
STDAPI CDeskBar_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi)
{
// aggregation checking is handled in class factory
CDeskBar *pwbar = new CDeskBar();
if (pwbar) {
*ppunk = SAFECAST(pwbar, IDockingWindow*);
return S_OK;
}
return E_OUTOFMEMORY;
}
//***
// NOTES
// REARCHITECT: nuke this, fold it into CDeskBar_CreateInstance
HRESULT DeskBar_Create(IUnknown** ppunk, IUnknown** ppbs)
{
HRESULT hres;
*ppunk = NULL;
if (ppbs)
*ppbs = NULL;
CDeskBar *pdb = new CDeskBar();
if (!pdb)
return E_OUTOFMEMORY;
IDeskBarClient *pdbc;
hres = CoCreateInstance(CLSID_RebarBandSite, NULL, CLSCTX_INPROC_SERVER,
IID_IDeskBarClient, (LPVOID*)&pdbc);
if (SUCCEEDED(hres))
{
hres = pdb->SetClient(pdbc);
if (SUCCEEDED(hres))
{
if (ppbs) {
*ppbs = pdbc;
pdbc->AddRef();
}
*ppunk = SAFECAST(pdb, IDeskBar*);
}
pdbc->Release();
}
if (FAILED(hres))
{
pdb->Release();
}
return hres;
}
CDeskBar::CDeskBar() : SUPERCLASS()
{
// We assume this object was ZERO-INITed on the heap.
ASSERT(!_fRestrictionsInited);
}
//*** CDeskBar::IUnknown::* {
HRESULT CDeskBar::QueryInterface(REFIID riid, void **ppvObj)
{
static const QITAB qit[] = {
QITABENT(CDeskBar, IRestrict),
{ 0 },
};
HRESULT hres = QISearch(this, qit, riid, ppvObj);
if (FAILED(hres))
hres = SUPERCLASS::QueryInterface(riid, ppvObj);
return hres;
}
// }
//*** CDeskBar::IPersistStream*::* {
HRESULT CDeskBar::GetClassID(CLSID *pClassID)
{
*pClassID = CLSID_DeskBar;
return S_OK;
}
// }
//*** CDeskBar::IRestrict::* {
HRESULT CDeskBar::IsRestricted(const GUID * pguidID, DWORD dwRestrictAction, VARIANT * pvarArgs, DWORD * pdwRestrictionResult)
{
HRESULT hr = S_OK;
if (!EVAL(pguidID) || !EVAL(pdwRestrictionResult))
return E_INVALIDARG;
*pdwRestrictionResult = RR_NOCHANGE;
if (IsEqualGUID(RID_RDeskBars, *pguidID))
{
if (!_fRestrictionsInited)
{
_fRestrictionsInited = TRUE;
if (SHRestricted(REST_NOCLOSE_DRAGDROPBAND))
_fRestrictDDClose = TRUE;
else
_fRestrictDDClose = FALSE;
if (SHRestricted(REST_NOMOVINGBAND))
_fRestrictMove = TRUE;
else
_fRestrictMove = FALSE;
}
switch(dwRestrictAction)
{
case RA_DRAG:
case RA_DROP:
case RA_ADD:
case RA_CLOSE:
if (_fRestrictDDClose)
*pdwRestrictionResult = RR_DISALLOW;
break;
case RA_MOVE:
if (_fRestrictMove)
*pdwRestrictionResult = RR_DISALLOW;
break;
}
}
if (RR_NOCHANGE == *pdwRestrictionResult) // If we don't handle it, let our parents have a wack at it.
hr = IUnknown_HandleIRestrict(_ptbSite, pguidID, dwRestrictAction, pvarArgs, pdwRestrictionResult);
return hr;
}
// }
//*** CDeskBar::IServiceProvider::* {
HRESULT CDeskBar::QueryService(REFGUID guidService,
REFIID riid, void **ppvObj)
{
if (ppvObj)
*ppvObj = NULL;
if (IsEqualGUID(guidService, SID_SRestrictionHandler))
{
return QueryInterface(riid, ppvObj);
}
return SUPERCLASS::QueryService(guidService, riid, ppvObj);
}
// }