|
|
#ifndef MENUSF
#define MENUSF
#include "mnbase.h"
#include "sftbar.h"
class CMenuData : public IBDATA { protected: IUnknown* _punkSubmenu;
public: CMenuData(PORDERITEM poi) : IBDATA(poi) {}; virtual ~CMenuData();
void SetSubMenu(IUnknown* pmb2); HRESULT GetSubMenu(const GUID* pguidService, REFIID riid, void**); };
class CMenuBand;
class CMenuSFToolbar : public CSFToolbar, public CMenuToolbarBase { public:
// *** IUnknown (override) ***
// This deliberately forwards AddRef and Release to CMenuToolbarBase, and
// forwards QI separately to CSFToolbar.
virtual STDMETHODIMP_(ULONG) AddRef(void) { return CMenuToolbarBase::AddRef(); }; virtual STDMETHODIMP_(ULONG) Release(void) { return CMenuToolbarBase::Release(); }; virtual STDMETHODIMP QueryInterface(REFIID riid, void** ppvObj);
// *** IObjectWithSite methods ***
virtual STDMETHODIMP SetSite(IUnknown* punkSite);
// *** IShellChangeNotify methods ***
virtual STDMETHODIMP OnChange(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
// *** IWinEventHandler methods (override) ***
virtual STDMETHODIMP IsWindowOwner(HWND hwnd); virtual STDMETHODIMP OnWinEvent(HWND hwnd, UINT dwMsg, WPARAM wParam, LPARAM lParam, LRESULT *plres);
// *** CDelegateDropTarget methods ***
virtual STDMETHODIMP DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); virtual STDMETHODIMP DragLeave(void); virtual HRESULT HitTestDDT (UINT nEvent, LPPOINT ppt, DWORD_PTR * pdwId, DWORD *pdwEffect); virtual HRESULT GetObjectDDT (DWORD_PTR dwId, REFIID riid, LPVOID * ppvObj); virtual HRESULT OnDropDDT (IDropTarget *pdt, IDataObject *pdtobj, DWORD * pgrfKeyState, POINTL pt, DWORD *pdwEffect);
// Other public methods
virtual HWND v_GetHWND() { return _hwndTB; };
virtual void v_ForwardMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); virtual void v_SendMenuNotification(UINT idCmd, BOOL fClear); virtual BOOL v_TrackingSubContextMenu() { return (BOOL) ( _pcm2 ? 1 : 0 );}; // Win64: should be ok since _pcm2 used as boolean in all contexts
virtual BOOL v_UpdateIconSize(UINT uIconSize, BOOL fUpdateButtons); virtual void v_Close(); virtual void v_Show(BOOL fShow, BOOL fForceUpdate); virtual void v_UpdateButtons(BOOL fNegotiateSize); virtual void NegotiateSize(); virtual void Expand(BOOL fExpand);
virtual void GetSize(SIZE* size); virtual void SetWindowPos(LPSIZE psize, LPRECT prc, DWORD dwFlags); virtual HRESULT CreateToolbar(HWND hwndParent);
virtual void SetParent(HWND hwndParent); virtual HRESULT GetShellFolder(LPITEMIDLIST* ppidl, REFIID riid, void** ppvObj); virtual void v_OnEmptyToolbar(); // override
virtual void v_OnDeleteButton(LPVOID pData); virtual HRESULT v_InvalidateItem(LPSMDATA psmd, DWORD dwFlags); virtual HRESULT SetShellFolder(IShellFolder* psf, LPCITEMIDLIST pidl); inline virtual BOOL ShowAmpersand() { return TRUE; }
// Change HKEY to IStream*
CMenuSFToolbar(CMenuBand* pmb, IShellFolder* psf, LPCITEMIDLIST pidl, HKEY hKey, DWORD dwFlags);
protected: ~CMenuSFToolbar();
// Window Proc Overrides
virtual LRESULT _DefWindowProc(HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam); virtual LRESULT _OnContextMenu(WPARAM wParam, LPARAM lParam); virtual void _OnDragBegin(int iItem, DWORD dwPreferredEffect); virtual void _OnFSNotifyAdd(LPCITEMIDLIST pidl, DWORD dwFlags, int nIndex); virtual void _OnFSNotifyRemove(LPCITEMIDLIST pidl); virtual void _OnFSNotifyRename(LPCITEMIDLIST pidlFrom, LPCITEMIDLIST pidlTo); virtual void _NotifyBulkOperation(BOOL fStart); virtual HRESULT OnTranslatedChange(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); virtual LRESULT v_OnCustomDraw(NMCUSTOMDRAW * pnmcd);
virtual void _FillToolbar(); virtual LRESULT _OnNotify(LPNMHDR pnm); virtual LRESULT _OnTimer(WPARAM wParam); virtual void _SetToolbarState() { CMenuToolbarBase::_SetToolbarState(); };
virtual void EmptyToolbar() { CMenuToolbarBase::EmptyToolbar(); };
virtual int v_GetDragOverButton() { return _tbim.iButton; };
virtual HRESULT v_GetSubMenu(int iCmd, const GUID* pguidService, REFIID riid, void** pObj); virtual HRESULT v_GetInfoTip(int iCmd, LPTSTR psz, UINT cch); virtual HRESULT v_CallCBItem(int idtCmd, UINT uMsg, WPARAM wParam, LPARAM lParam); virtual HRESULT v_GetState(int idtCmd, LPSMDATA psmd);
virtual HRESULT v_ExecItem(int iCmd); virtual DWORD v_GetFlags(int iCmd); virtual void v_Refresh() { _Refresh(); }; virtual void v_CalcWidth(int* pcxMin, int* pcxMax) { CMenuToolbarBase::v_CalcWidth(pcxMin, pcxMax); };
// Utility Functions
virtual BOOL _AddPidl(LPITEMIDLIST pidl, DWORD dwFlags, int index); virtual PIBDATA _AddOrderItemTB(PORDERITEM poi, int index, TBBUTTON* ptbb); virtual void _Dropped(int nIndex, BOOL fDroppedOnSource); virtual HRESULT _TBStyleForPidl(LPCITEMIDLIST pidl, DWORD * pdwStyle, DWORD* pdwState, DWORD * pdwFlags,int* piIcon);
virtual void _ToolbarChanged(); virtual void _FillDPA(HDPA hdpa, HDPA hdpaSort, DWORD dwEnumFlags); virtual BOOL _FilterPidl(LPCITEMIDLIST pidl); virtual void _ObtainPIDLName(LPCITEMIDLIST pidl, LPTSTR psz, int cchMax); virtual HMENU _GetContextMenu(IContextMenu* pcm, int* pid); virtual void _OnDefaultContextCommand(int idCmd); virtual void v_NewItem(LPCITEMIDLIST pidl); virtual void _SetDirty(BOOL fDirty); virtual void _SetFontMetrics(); virtual int _GetBitmap(int iCommandID, PIBDATA pibdata, BOOL fUseCache); virtual HWND GetHWNDForUIObject(); virtual HWND CreateWorkerWindow(); virtual int v_TBIndexToDPAIndex(int iTBIndex); virtual int v_DPAIndexToTBIndex(int iIndex);
static void s_IconCallback(LPVOID pvData, UINT uId, UINT iIconIndex);
void _AddChevron(); void _RemoveChevron(); void _AddNSSeparator(); void _RemoveNSSeparator(); void _RefreshInfo();
BOOL _IsSpecialCmd(int cmd) { return cmd == _idCmdChevron || cmd == _idCmdSep; } BOOL _IsAboveNSSeparator(LPCITEMIDLIST pidl); BOOL _IsBelowNSSeparator(int iIndex); int _GetNSSeparatorPlacement(); HRESULT _GetFolderForCreateViewObject(BOOL fAbove, IShellFolder **ppsf);
void BroadcastIntelliMenuState(LPCITEMIDLIST pidlItem, BOOL fPromoted);
BOOL _ReBindToFolder(LPCITEMIDLIST pidl); virtual HRESULT _LoadOrderStream(); virtual HRESULT _SaveOrderStream();
virtual HRESULT _AfterLoad(); HRESULT _GetInfo(LPCITEMIDLIST pidl, SMINFO* pmbiinfo); HRESULT CallCB(LPCITEMIDLIST pidl, DWORD dwMsg, WPARAM wParam, LPARAM lParam); HKEY _GetKey(LPCITEMIDLIST pidl); void _MarkItem(int idCmd); LRESULT _OnGetObject(NMOBJECTNOTIFY*); void _FindMinPromotedItems(BOOL fSetOrderStream);
virtual LRESULT _OnDropDown(LPNMTOOLBAR pnmtb);
virtual HRESULT v_CreateTrackPopup(int, REFIID, void**) { AssertMsg(0, TEXT("MenuSF trying to get a TrackPopup")); return E_FAIL; };
virtual PIBDATA _CreateItemData(PORDERITEM poi);
// Member Variables
HKEY _hKey; BITBOOL _fPreventToolbarChange: 1;
IAugmentedShellFolder2* _pasf2;
int _iDefaultIconIndex;
int _cMinPromotedItems; int _idCmdSep; // -1 if no artificial separator
GUID _guidAboveSep; // The namespace guid that goes ahead of the separator
};
#define MNFOLDER_NORODER -5 // Some random negative number to denote there is no order
#define MNFOLDER_IS_PARENT -1 // -1 is passed to the child as uIdParent so that
// it knows it's not rooted at a static menu
#endif // MENUSF
|