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

268 lines
9.9 KiB
C++

#ifndef _bandsite_h
#define _bandsite_h
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif /* __cplusplus */
#define SZ_REGKEY_GLOBALADMINSETTINGS TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\IEAK")
#define SZ_REGVALUE_GLOBALADMINSETTINGS TEXT("Admin Band Settings")
// Admin Settings (dwAdminSettings)
#define BAND_ADMIN_NORMAL 0x00000000
#define BAND_ADMIN_NODDCLOSE 0x00000001 // Disable Drag & Drop, and Close
#define BAND_ADMIN_NOMOVE 0x00000002 // Disable Moving within a Bar.
#define BAND_ADMIN_ADMINMACHINE 0x80000000 // This is an admin machine and this bit displays the two Admin Context Menu items
BOOL BandSite_HandleMessage(IUnknown *punk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plres);
void BandSite_SetMode(IUnknown *punk, DWORD dwMode);
BOOL ConfirmRemoveBand(HWND hwnd, UINT uID, LPCTSTR szName);
#ifdef WANT_CBANDSITE_CLASS
// UIActivateIO callback instance data
typedef struct tagACTDATA {
LPMSG lpMsg; // IN
HRESULT hres;
IUnknown *punk;
} ACTDATA;
typedef struct tagBANDITEMDATA
{
HWND hwnd;
IDeskBand *pdb;
IWinEventHandler *pweh;
POINTL ptMinSize;
POINTL ptMaxSize;
POINTL ptIntegral;
POINTL ptActual;
WCHAR szTitle[256];
DWORD dwModeFlags;
DWORD dwBandID;
BITBOOL fShow:1; // current show state
BITBOOL fNoTitle:1; // 1:don't show title
DWORD dwAdminSettings;
COLORREF crBkgnd;
} BANDITEMDATA, *LPBANDITEMDATA;
typedef int (*PFNBANDITEMENUMCALLBACK)(LPBANDITEMDATA pbid, LPVOID pData);
int _UIActIOCallback(LPBANDITEMDATA pbid, void *pv);
typedef struct {
HRESULT hres;
const GUID * pguidService;
const IID * piid;
void ** ppvObj;
} QSDATA;
int _QueryServiceCallback(LPBANDITEMDATA pbid, void *pv);
#include "caggunk.h"
class CBandSite : public CAggregatedUnknown
, public IBandSite
, public IInputObjectSite
, public IInputObject
, public IDeskBarClient
, public IWinEventHandler
, public IPersistStream
, public IDropTarget
, public IServiceProvider
, public IBandSiteHelper
, public IOleCommandTarget
{
public:
// *** IUnknown ***
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj) { return CAggregatedUnknown::QueryInterface(riid, ppvObj);};
virtual STDMETHODIMP_(ULONG) AddRef(void) { return CAggregatedUnknown::AddRef();};
virtual STDMETHODIMP_(ULONG) Release(void) { return CAggregatedUnknown::Release();};
// *** IPersistStream methods ***
virtual STDMETHODIMP GetClassID(CLSID *pClassID);
virtual STDMETHODIMP IsDirty(void);
virtual STDMETHODIMP Load(IStream *pStm);
virtual STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty);
virtual STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize);
// *** IBandSite methods ***
virtual STDMETHODIMP AddBand(IUnknown* punk);
virtual STDMETHODIMP EnumBands(UINT uBand, DWORD* pdwBandID);
virtual STDMETHODIMP QueryBand(DWORD dwBandID, IDeskBand** ppstb, DWORD* pdwState, LPWSTR pszName, int cchName);
virtual STDMETHODIMP SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState);
virtual STDMETHODIMP RemoveBand(DWORD dwBandID);
virtual STDMETHODIMP GetBandObject(DWORD dwBandID, REFIID riid, LPVOID* ppvObj);
virtual STDMETHODIMP SetBandSiteInfo(const BANDSITEINFO * pbsinfo);
virtual STDMETHODIMP GetBandSiteInfo(BANDSITEINFO * pbsinfo);
// *** IOleWindow methods ***
virtual STDMETHODIMP GetWindow(HWND * lphwnd);
virtual STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) { return E_NOTIMPL; }
// *** IInputObjectSite methods ***
virtual STDMETHODIMP OnFocusChangeIS(IUnknown *punk, BOOL fSetFocus);
// *** IInputObject methods ***
virtual STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg);
virtual STDMETHODIMP HasFocusIO();
virtual STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg);
// *** IDeskBarClient methods ***
virtual STDMETHODIMP SetDeskBarSite(THIS_ IUnknown* punkSite) ;
virtual STDMETHODIMP SetModeDBC (THIS_ DWORD dwMode) ;
virtual STDMETHODIMP UIActivateDBC(THIS_ DWORD dwState) ;
virtual STDMETHODIMP GetSize (THIS_ DWORD dwWhich, LPRECT prc);
// *** IWinEventHandler methods ***
virtual STDMETHODIMP OnWinEvent (HWND hwnd, UINT dwMsg, WPARAM wParam, LPARAM lParam, LRESULT *plres);
virtual STDMETHODIMP IsWindowOwner(HWND hwnd);
// *** IDropTarget ***
virtual STDMETHODIMP DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
virtual STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
virtual STDMETHODIMP DragLeave(void);
virtual STDMETHODIMP Drop(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
// *** IServiceProvider methods ***
virtual STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, LPVOID* ppvObj);
// *** IBandSiteHelper methods ***
virtual STDMETHODIMP LoadFromStreamBS(IStream *pstm, REFIID riid, LPVOID *ppv);
virtual STDMETHODIMP SaveToStreamBS(IUnknown *punk, IStream *pstm);
// *** IOleCommandTarget ***
virtual STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
virtual STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
CBandSite(IUnknown *punkAgg);
protected:
virtual HRESULT v_InternalQueryInterface(REFIID riid, LPVOID * ppvObj);
IDeskBar* _pdb;
IUnknown* _punkSite;
IBandSite* _pbsOuter; // the aggregating bandsite
virtual HRESULT _Initialize(HWND hwndParent);
virtual void _OnCloseBand(DWORD dwBandID);
virtual LRESULT _OnBeginDrag(NMREBAR* pnm);
virtual LRESULT _OnNotify(LPNMHDR pnm);
virtual IDropTarget* _WrapDropTargetForBand(IDropTarget* pdtBand);
virtual DWORD _GetWindowStyle(DWORD* pdwExStyle);
virtual HMENU _LoadContextMenu();
HRESULT _OnBSCommand(int idCmd, DWORD idBandActive, LPBANDITEMDATA pbid);
HRESULT _AddBand(IUnknown* punk);
virtual HRESULT _OnContextMenu(WPARAM wParam, LPARAM lParam);
IDataObject* _DataObjForBand(DWORD dwBandID);
LPBANDITEMDATA _GetBandItemDataStructByID(DWORD uID);
virtual int _ContextMenuHittest(LPARAM lParam, POINT* ppt);
// container specific (rebar) members
virtual BOOL _AddBandItem(LPBANDITEMDATA pbid);
virtual void _DeleteBandItem(int i);
LPBANDITEMDATA _GetBandItem(int i);
int _GetBandItemCount();
void _BandItemEnumCallback(int dincr, PFNBANDITEMENUMCALLBACK pfnCB, void *pv);
void _DeleteAllBandItems();
virtual void _ShowBand(LPBANDITEMDATA pbid, BOOL fShow);
int _BandIDToIndex(DWORD dwBandID);
DWORD _IndexToBandID(int i);
DWORD _BandIDFromPunk(IUnknown* punk);
HRESULT _SetBandStateHelper(DWORD dwBandID, DWORD dwMask, DWORD dwState);
virtual void _UpdateAllBands(BOOL fBSOnly, BOOL fNoAutoSize);
void _UpdateBand(DWORD dwBandID);
BOOL _UpdateBandInfo(LPBANDITEMDATA pbid, BOOL fBSOnly);
void _GetBandInfo(LPBANDITEMDATA pbid, DESKBANDINFO *pdbi);
virtual void _BandInfoFromBandItem(REBARBANDINFO *prbbi, LPBANDITEMDATA pbid, BOOL fBSOnly);
virtual void v_SetTabstop(LPREBARBANDINFO prbbi);
BOOL _IsEnableTitle(LPBANDITEMDATA pbid);
BOOL _IsHeightReasonable(UINT cy);
HRESULT _LoadBandInfo(IStream *pstm, int i, DWORD dwVersion);
HRESULT _SaveBandInfo(IStream *pstm, int i);
HRESULT _AddBandByID(IUnknown *punk, DWORD dwID);
BOOL _SendToToolband(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plres);
BOOL _HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plres);
int _BandIndexFromPunk(IUnknown *punk);
BOOL _IsBandTabstop(LPBANDITEMDATA pbid);
IUnknown* _GetNextTabstopBand(IUnknown* ptb, BOOL fBackwards);
virtual HRESULT _CycleFocusBS(LPMSG lpMsg);
void _OnRBAutoSize(NMRBAUTOSIZE* pnm);
void _DoDragDrop();
BOOL _PreDragDrop();
virtual void _Close();
BOOL _IsBandDeleteable(DWORD dwBandID);
void _MinimizeBand(DWORD dwBandID);
void _MaximizeBand(DWORD dwBandID);
void _CheckNotifyOnAddRemove(DWORD dwBandID, int iCode);
DWORD _GetAdminSettings(DWORD dwBandID);
void _SetAdminSettings(DWORD dwBandID, DWORD dwNewAdminSettings);
void _ReleaseBandItemData(LPBANDITEMDATA pbid, int iIndex);
void _CacheActiveBand(IUnknown* ptb);
HRESULT _IsRestricted(DWORD dwBandID, DWORD dwRestrictAction, DWORD dwBandFlags);
virtual ~CBandSite();
HWND _hwnd;
HDSA _hdsaBandItemData;
DWORD _dwMode;
DWORD _dwShowState;
DWORD _dwBandIDNext;
DWORD _dwStyle;
IDataObject* _pdtobj; // the stored drag drop data object;
UINT _uDragBand;
DWORD _dwDropEffect;
IOleCommandTarget *_pct;
IUnknown *_ptbActive;
// cache for message reflector stuff
HWND _hwndCache;
IWinEventHandler *_pwehCache;
// Stuff we need to remember while our context menu is up
IContextMenu3* _pcm3Parent;
IShellLinkA *_plink;
IBandProxy * _pbp;
BITBOOL _fCreatedBandProxy:1;
BITBOOL _fDragSource :1;
BITBOOL _fNoDropTarget :1;
BITBOOL _fIEAKInstalled :1; // If TRUE, then display 2 extra contex menu items for Admins to use.
UINT _fDragging:2; // we're dragging (0:FALSE 1:move [2:size])
HWND _hwndDD; // window for cool D&D cursor drawing.
friend HRESULT CBandSite_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi);
};
typedef enum {
CNOAR_ADDBAND = 1,
CNOAR_REMOVEBAND = 2,
CNOAR_CLOSEBAR = 3,
} CNOAR_CODES;
#endif // WANT_CBANDSITE_CLASS
#ifdef __cplusplus
}; /* End of extern "C" { */
#endif // __cplusplus
#endif