|
|
#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;
// this is a converted struct. the reason why its a class is to get refcounting.
// let everybody get to the member vars.
class CBandItemData { public: CBandItemData() : _cRef(1) {} ULONG AddRef() { return InterlockedIncrement(&_cRef); } ULONG Release() { ULONG cRef = InterlockedDecrement(&_cRef); if (0 == cRef) delete this; return cRef; }
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;
private: LONG _cRef; };
typedef int (*PFNBANDITEMENUMCALLBACK)(CBandItemData *pbid, LPVOID pData);
int _UIActIOCallback(CBandItemData *pbid, void *pv);
typedef struct { HRESULT hres; const GUID * pguidService; const IID * piid; void ** ppvObj; } QSDATA;
int _QueryServiceCallback(CBandItemData *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, CBandItemData *pbid);
HRESULT _AddBand(IUnknown* punk);
virtual HRESULT _OnContextMenu(WPARAM wParam, LPARAM lParam); IDataObject* _DataObjForBand(DWORD dwBandID); CBandItemData* _GetBandItemDataStructByID(DWORD uID); virtual int _ContextMenuHittest(LPARAM lParam, POINT* ppt);
// container specific (rebar) members
virtual BOOL _AddBandItem(CBandItemData *pbid); virtual void _DeleteBandItem(int i); CBandItemData * _GetBandItem(int i); int _GetBandItemCount(); void _BandItemEnumCallback(int dincr, PFNBANDITEMENUMCALLBACK pfnCB, void *pv); void _DeleteAllBandItems(); virtual void _ShowBand(CBandItemData *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(CBandItemData *pbid, BOOL fBSOnly);
void _GetBandInfo(CBandItemData *pbid, DESKBANDINFO *pdbi); virtual void _BandInfoFromBandItem(REBARBANDINFO *prbbi, CBandItemData *pbid, BOOL fBSOnly); virtual void v_SetTabstop(LPREBARBANDINFO prbbi); BOOL _IsEnableTitle(CBandItemData *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(CBandItemData *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(CBandItemData *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
|