194 lines
7.7 KiB
C
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
|