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

194 lines
7.7 KiB
C++

#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