#ifndef CSFTOOLBAR #define CSFTOOLBAR #include "bands.h" #include "cwndproc.h" #include "droptgt.h" #include "CommonControls.h" // Each CISFBand toolbar button lParam points to one of these. class IBDATA { protected: DWORD _dwFlags; // Class specific flags BITBOOL _fNoIcon:1; PORDERITEM _poi; public: IBDATA(PORDERITEM poi) { _poi = poi; } virtual ~IBDATA() { /* Don't Delete Me */ } LPITEMIDLIST GetPidl() { return _poi ? _poi->pidl : NULL; } void SetOrderItem(PORDERITEM poi) { _poi = poi; } DWORD GetFlags() { return _dwFlags; } void SetFlags(DWORD dwFlags) { _dwFlags = dwFlags; } BOOL GetNoIcon() { return _fNoIcon; } void SetNoIcon(BOOL b) { _fNoIcon = BOOLIFY(b); } PORDERITEM GetOrderItem() { return _poi ; } }; typedef IBDATA * PIBDATA; // Special HitTest results #define IBHT_SOURCE (-32768) #define IBHT_BACKGROUND (-32767) #define IBHT_PAGER (-32766) #define IBHT_OUTSIDEWINDOW (-32765) // Flags for _OnFSNotifyAdd and _AddPidl #define FSNA_BULKADD 0x0001 // This is a bulk add - don't recalc needlessly #define FSNA_ADDDEFAULT 0x0002 // Add the item at the default position (overrides nIndex) class CSFToolbar : public IWinEventHandler, public IShellChangeNotify, public CDelegateDropTarget, public IContextMenu, public IShellFolderBand, public CNotifySubclassWndProc { public: // *** IUnknown methods (override) *** virtual STDMETHODIMP_(ULONG) AddRef(void) PURE; virtual STDMETHODIMP_(ULONG) Release(void) PURE; virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj); // *** IWinEventHandler methods *** virtual STDMETHODIMP OnWinEvent (HWND hwnd, UINT dwMsg, WPARAM wParam, LPARAM lParam, LRESULT* plre); virtual STDMETHODIMP IsWindowOwner(HWND hwnd); // *** IShellChangeNotify methods *** virtual STDMETHODIMP OnChange(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); // *** CDelegateDropTarget *** virtual HRESULT GetWindowsDDT (HWND * phwndLock, HWND * phwndScroll); 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); // *** IContextMenu methods *** virtual STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu,UINT idCmdFirst,UINT idCmdLast,UINT uFlags); virtual STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici); virtual STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax); // *** IShellFolderBand *** virtual STDMETHODIMP InitializeSFB(LPSHELLFOLDER psf, LPCITEMIDLIST pidl) { return SetShellFolder(psf, pidl); }; virtual STDMETHODIMP SetBandInfoSFB(BANDINFOSFB * pbi) { return E_NOTIMPL; }; virtual STDMETHODIMP GetBandInfoSFB(BANDINFOSFB * pbi) { return E_NOTIMPL; }; // Toolbar Management virtual HRESULT SetShellFolder(IShellFolder* psf, LPCITEMIDLIST pidl); virtual void EmptyToolbar(); protected: CSFToolbar(); virtual ~CSFToolbar(); virtual HRESULT _CreateToolbar(HWND hwndParent); virtual HWND _CreatePager(HWND hwndParent); void _DestroyToolbar(); virtual void _FillToolbar(); void _UnregisterToolbar(); void _RegisterToolbar(); void _RegisterChangeNotify(); void _UnregisterChangeNotify(); // Unregisters void _Refresh(); void _ReleaseShellFolder(); virtual BOOL _AddPidl(LPITEMIDLIST pidl, DWORD dwFlags, int index); virtual PIBDATA _AddOrderItemTB(PORDERITEM poi, int index, TBBUTTON* ptbb); virtual void _FillDPA(HDPA hdpa, HDPA hdpaSort, DWORD dwEnumFlags); virtual PIBDATA _CreateItemData(PORDERITEM poi); virtual HWND GetHWNDForUIObject() { return _hwndTB; }; virtual HRESULT _LoadOrderStream() { return E_NOTIMPL; }; virtual HRESULT _SaveOrderStream(); virtual BOOL _AllowDropOnTitle() { return FALSE; }; virtual HRESULT _GetIEnumIDList(DWORD dwEnumFlags, IEnumIDList **ppenum); LPITEMIDLIST _pidl; IShellFolder* _psf; ITranslateShellChangeNotify* _ptscn; HWND _hwndPager; HWND _hwndTB; HWND _hwndToolTips; DWORD _dwStyle; // style bits to be ORd in when _hwndTB is created TBINSERTMARK _tbim; int _iDragSource; HDPA _hdpaOrder; // current order list (if non-default) HDPA _hdpa; // current set of items, mirrors _hwndTB content long _lEvents; int _iButtonCur; IContextMenu *_pcmSF; IContextMenu2 * _pcm2; IImageList* _piml; int _nNextCommandID; int _idCmdSF; int _cxMin; int _cxMax; HWND _hwndDD; HWND _hwndWorkerWindow; // Flags BITBOOL _fNoShowText :1; // TRUE iff no text with icon BITBOOL _fShow :1; // TRUE when ShowDW has happened BITBOOL _fDirty :1; // TRUE iff hidden contents modified BITBOOL _fCheckIds :1; // TRUE iff _GetCommandID has wrapped BITBOOL _fFSNotify :1; // TRUE to receive FS Notifications BITBOOL _fFSNRegistered :1; // are we already registered? BITBOOL _fAccelerators :1; // whether to show & as accel or as & BITBOOL _fAllowRename :1; // TRUE to query _psf for IContextMenu of _pidl BITBOOL _fDropping :1; // TRUE while doing drop. BITBOOL _fDropped :1; // TRUE if we have reordered, _hdpaOrder may not have been created yet BITBOOL _fNoNameSort :1; // TRUE if band should _not_ sort icons by name BITBOOL _fVariableWidth :1; BITBOOL _fNoIcons :1; // turns off icons BITBOOL _fVertical :1; // TRUE: band is displayed vertically BITBOOL _fMulticolumn : 1; BITBOOL _fHasOrder: 1; BITBOOL _fPSFBandDesktop :1;// TRUE iff _psfBand came from desktop // this implies psfDesktop->BindToObject(_pidl) // results in the correct ISF BITBOOL _fRegisterChangeNotify: 1; // TRUE: We will register for change notify. BITBOOL _fAllowReorder: 1; BITBOOL _fChangedOrder: 1; // Only send change notifies if we actually changed the order UINT _uIconSize : 2; // Large/Small/Logo // Virtual Function Overrides for Window Subclass virtual LRESULT _OnHotItemChange(NMTBHOTITEM * pnmhot); virtual HRESULT OnTranslatedChange(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); virtual LRESULT _OnTimer(WPARAM wParam); virtual LRESULT _DefWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); virtual LRESULT _OnCustomDraw(NMCUSTOMDRAW* pnmcd); virtual void _OnDragBegin(int iItem, DWORD dwPreferredEffect); virtual void _OnToolTipsCreated(NMTOOLTIPSCREATED* pnm); virtual LRESULT _OnNotify(LPNMHDR pnm); virtual LRESULT _OnCommand(WPARAM wParam, LPARAM lParam) { return 0; }; virtual void _OnFSNotifyAdd(LPCITEMIDLIST pidl, DWORD dwFlags, int nIndex); virtual void _OnFSNotifyRemove(LPCITEMIDLIST pidl); virtual void _OnFSNotifyRename(LPCITEMIDLIST pidlFrom, LPCITEMIDLIST pidlTo); virtual void _OnFSNotifyUpdate(LPCITEMIDLIST pidl); virtual void _NotifyBulkOperation(BOOL fStart) { } virtual HRESULT _OnRenameFolder(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); virtual HMENU _GetContextMenu(IContextMenu* pcm, int* pid); virtual void _OnDefaultContextCommand(int idCmd); virtual LRESULT _OnContextMenu(WPARAM wParam, LPARAM lParam); // Helper Functions int _GetCommandID(); virtual void _ObtainPIDLName(LPCITEMIDLIST pidl, LPTSTR psz, int cchMax); BOOL _IsParentID(LPCITEMIDLIST pidl); BOOL _IsChildID(LPCITEMIDLIST pidlChild, BOOL fImmediate); BOOL _IsEqualID(LPCITEMIDLIST pidl); LPVOID _GetUIObjectOfPidl(LPCITEMIDLIST pidl, REFIID riid); HMENU _GetBaseContextMenu(); HRESULT _GetTopBrowserWindow(HWND* phwnd); HRESULT _OnOpen(int id, BOOL fExplore); HRESULT _HandleSpecialCommand(IContextMenu* pcm, PPOINT ppt, int id, int idCmd); LRESULT _DoContextMenu(IContextMenu* pcm, LPPOINT ppt, int id, LPRECT prcExclude); void _SortDPA(HDPA hdpa); virtual HWND CreateWorkerWindow(); BOOL_PTR InlineDeleteButton(int iTBIndex); static INT_PTR CALLBACK _RenameDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); HRESULT _OnRename(LPPOINT ppt, int id); UINT _IndexToID(int iTBIndex); LPCITEMIDLIST _IDToPidl(UINT uiCmd, int *piPos = NULL); PIBDATA _IDToPibData(UINT uiCmd, int * piPos = NULL); PIBDATA _PosToPibData(UINT iPos); void _RememberOrder(); void _UpdateButtons(); void _OnGetDispInfo(LPNMHDR pnm, BOOL fUnicode); HRESULT _GetButtonFromPidl(LPCITEMIDLIST pidl, TBBUTTONINFO * ptbbi, int * pIndex, LPITEMIDLIST *ppidlOut); DWORD _GetAttributesOfPidl(LPCITEMIDLIST pidl, DWORD dwAttribs); BOOL _UpdateShowText(BOOL fNoShowText); // Virtual Helper Functions virtual int _GetBitmap(int iCommandID, PIBDATA pibdata, BOOL fUseCache); virtual void _SetDirty(BOOL fDirty); virtual HMENU _GetContextMenu(); virtual BOOL _UpdateIconSize(UINT uIconSize, BOOL fUpdateButton); virtual HRESULT _TBStyleForPidl(LPCITEMIDLIST pidl, DWORD * pdwTBStyle, DWORD* pdwTBState, DWORD * pdwMIFFlags, int* piIcon); virtual BOOL _FilterPidl(LPCITEMIDLIST pidl); virtual int _DefaultInsertIndex(); virtual void _ToolbarChanged() { }; virtual void _Dropped(int nIndex, BOOL fDroppedOnSource); virtual HRESULT _AfterLoad(); virtual void v_CalcWidth(int* pcxMin, int* pcxMax); virtual void _SetToolbarState(); virtual void v_NewItem(LPCITEMIDLIST pidl) {}; virtual int v_TBIndexToDPAIndex(int iTBIndex) { return iTBIndex; } virtual int v_DPAIndexToTBIndex(int iIndex) { return iIndex; } static void s_NewItem(LPVOID pvParam, LPCITEMIDLIST pidl); }; BOOL TBHasImage(HWND hwnd, int iImageIndex); LRESULT CALLBACK HiddenWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif