#ifndef TASKBAND_H_ #define TASKBAND_H_ #ifdef __cplusplus #include "atlstuff.h" #include "cwndproc.h" #include #include "commoncontrols.h" class CTray; class CGroupItemContextMenu; class TASKITEM { public: TASKITEM() {}; TASKITEM(TASKITEM* pti); ~TASKITEM(); HWND hwnd; // NULL if this item is a group of application entries DWORD dwFlags; class TaskShortcut *ptsh; DWORD dwTimeLastClicked; DWORD dwTimeFirstOpened; WCHAR* pszExeName; int iIconPref; BOOL fMarkedFullscreen; BOOL fHungApp; }; typedef TASKITEM *PTASKITEM; typedef struct { PTASKITEM pti; UINT fState; int iIndex; // used to cache toolbar index } ANIMATIONITEMINFO, *PANIMATIONITEMINFO; class CTaskBandSMC; class CTaskBand : public IDeskBand , public IObjectWithSite , public IDropTarget , public IInputObject , public IPersistStream , public IWinEventHandler , public IOleCommandTarget , public CImpWndProc { public: // *** IUnknown methods *** STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // *** IOleWindow methods *** STDMETHODIMP GetWindow(HWND * lphwnd); STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) { return E_NOTIMPL; } // *** IDockingWindow methods *** STDMETHODIMP ShowDW(BOOL fShow) { return S_OK; } STDMETHODIMP CloseDW(DWORD dwReserved) { return S_OK; } STDMETHODIMP ResizeBorderDW(LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved) { return E_NOTIMPL; } // *** IObjectWithSite methods *** STDMETHODIMP SetSite(IUnknown* punkSite); STDMETHODIMP GetSite(REFIID riid, void** ppvSite) { return E_NOTIMPL; }; // *** IDeskBand methods *** STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD fViewMode, DESKBANDINFO* pdbi); // *** IDropTarget methods *** STDMETHODIMP DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); STDMETHODIMP DragLeave(void); STDMETHODIMP Drop(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); // *** IInputObject methods *** STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg) { return E_NOTIMPL; } STDMETHODIMP HasFocusIO(); STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg); // *** IWinEventHandler methods *** STDMETHODIMP OnWinEvent(HWND hwnd, UINT dwMsg, WPARAM wParam, LPARAM lParam, LRESULT* plres); STDMETHODIMP IsWindowOwner(HWND hwnd); // *** IPersistStream methods *** STDMETHODIMP GetClassID(LPCLSID pClassID); STDMETHODIMP IsDirty(void) { return S_FALSE; } STDMETHODIMP Load(IStream *ps); STDMETHODIMP Save(LPSTREAM, BOOL) { return S_OK; } STDMETHODIMP GetSizeMax(ULARGE_INTEGER*) { return E_NOTIMPL; } // *** IOleCommandTarget methods *** STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext); STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut); protected: static void IconAsyncProc(HWND hwnd, UINT uMsg, ULONG_PTR dwData, LRESULT lResult); typedef struct { HWND hwnd; LPTSTR pszExeName; int iImage; } ICONCBPARAM, *PICONCBPARAM; typedef int (*PICONCALLBACK)(CTaskBand* ptb, PICONCBPARAM pip, LPARAM lParam, int iPref); static int GetIconCB(CTaskBand* ptb, PICONCBPARAM pip, LPARAM lParam, int iPref); static int GetSHILIconCB(CTaskBand* ptb, PICONCBPARAM pip, LPARAM lParam, int); static int GetDefaultIconCB(CTaskBand* ptb, PICONCBPARAM pip, LPARAM, int); static int GetClassIconCB(CTaskBand* ptb, PICONCBPARAM pip, LPARAM lParam, int); void _MoveGroup(HWND hwnd, WCHAR* szNewExeName); void _SetWindowIcon(HWND hwnd, HICON hicon, int iPref); static BOOL _ShouldMinimize(HWND hwnd); BOOL _CanMinimizeAll(); BOOL _MinimizeAll(HWND hwndTray, BOOL fPostRaiseDesktop); int _HitTest(POINTL ptl); void _FreePopupMenu(); void _RealityCheck(); int _FindIndexByHwnd(HWND hwnd); void _CheckNeedScrollbars(int cyRow, int cItems, int iCols, int iRows, int iItemWidth, LPRECT lprcView); void _NukeScrollbar(int fnBar); void _SetItemWidth(int iItem, int iWidth); int _GetItemWidth(int iItem); int _GetLastVisibleItem(); int _GetVisibleItemCount(); int _GetGroupWidth(int iIndexGroup); int _GetIdealWidth(int *iRemainder); void _GetNumberOfRowsCols(int* piRows, int* piCols, BOOL fCurrentSize); int _GetTextSpace(); void _GetToolbarMetrics(LPTBMETRICS ptbm); void _CheckSize(void); void _SizeItems(int iButtonWidth, int iRemainder = 0); BOOL _AddWindow(HWND hwnd); BOOL _CheckButton(int iIndex, BOOL fCheck); BOOL _IsButtonChecked(int iIndex); int _GetCurSel(); void _SetCurSel(int iIndex, BOOL fIgnoreCtrlKey); int _SelectWindow(HWND hwnd); void _SwitchToWindow(HWND hwnd); int _GetSelectedItems(CDSA* pdsa); int _GetGroupItems(int iIndexGroup, CDSA* pdsa); void _OnGroupCommand(int iRet, CDSA* pdsa); void _SysMenuForItem(int i, int x, int y); static void CALLBACK FakeSystemMenuCB(HWND hwnd, UINT uMsg, ULONG_PTR dwData, LRESULT lres); HWND _CreateFakeWindow(HWND hwndOwner); void _HandleSysMenuTimeout(); void _HandleSysMenu(HWND hwnd); void _FakeSystemMenu(HWND hwndTask, DWORD dwPos); BOOL _ContextMenu(DWORD dwPos); void _HandleCommand(WORD wCmd, WORD wID, HWND hwnd); void _DrawNumber(HDC hdc, int iValue, BOOL fCalcRect, LPRECT prc); LRESULT _HandleCustomDraw(LPNMTBCUSTOMDRAW ptbcd, PTASKITEM pti = NULL); void _RemoveImage(int iImage); void _OnButtonPressed(int iIndex, PTASKITEM pti, BOOL fForceRestore); LRESULT _HandleNotify(LPNMHDR lpnm); void _SwitchToItem(int iItem, HWND hwnd, BOOL fIgnoreCtrlKey); LRESULT _HandleCreate(); LRESULT _HandleDestroy(); LRESULT _HandleScroll(BOOL fHoriz, UINT code, int nPos); void _ScrollIntoView(int iItem); LRESULT _HandleSize(WPARAM fwSizeType); LRESULT _HandleActivate(HWND hwndActive); void _UpdateItemUsage(PTASKITEM pti); void _HandleOtherWindowDestroyed(HWND hwndDestroyed); void _HandleGetMinRect(HWND hwndShell, LPPOINTS lprc); void _HandleChangeNotify(WPARAM wParam, LPARAM lParam); LRESULT _HandleHardError(HARDERRORDATA *phed, DWORD cbData); BOOL _IsItemActive(HWND hwndActive); void _CreateTBImageLists(); int _AddIconToNormalImageList(HICON hicon, int iImage); void _UpdateItemText(int iItem); void _UpdateItemIcon(int iItem); void _GetDispInfo(LPNMTBDISPINFO lptbdi); void _DoRedrawWhereNeeded(); void _RedrawItem(HWND hwndShell, WPARAM code, int i = -1); void _SetActiveAlt(HWND hwndAlt); HWND _EnumForRudeWindow(HWND hwndSelected); HWND _FindRudeApp(HWND hwndPossible); LRESULT _OnAppCommand(int cmd); PTASKITEM _FindItemByHwnd(HWND hwnd); void _OnWindowActivated(HWND hwnd, BOOL fSuspectFullscreen); LRESULT _HandleShellHook(int iCode, LPARAM lParam); void _VerifyButtonHeight(); void _InitFonts(); void _SetItemImage(int iItem, int iImage, int iPref); void _UpdateAllIcons(); LRESULT _HandleWinIniChange(WPARAM wParam, LPARAM lParam, BOOL fOnCreate); void _OnSetFocus(); BOOL _RegisterWindowClass(); void _UpdateFlashingFlag(); void _ExecuteMenuOption(HWND hwnd, int iCmd); TASKITEM* _GetItem(int i, TBBUTTONINFO* ptbb = NULL, BOOL fByIndex = TRUE); static BOOL WINAPI BuildEnumProc(HWND hwnd, LPARAM lParam); static BOOL WINAPI IsRudeEnumProc(HWND hwnd, LPARAM lParam); static DWORD WINAPI MinimizeAllThreadProc(LPVOID lpv); void _OpenTheme(); virtual LRESULT v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int _GetGroupSize(int iIndexGroup); int _GetGroupIndex(int iIndexApp); DWORD _GetGroupAge(int iIndexGroup); int _GetGroupIndexFromExeName(WCHAR* szExeName); BOOL _IsHidden(int i); void _GetItemTitle(int iIndex, WCHAR* pszTitle, int cbTitle, BOOL fCustom); void _RefreshSettings(); void _LoadSettings(); void _Glom(int iIndexGroup, BOOL fGlom); void _HideGroup(int iIndexGroup, BOOL fHide); BOOL _AutoGlomGroup(BOOL fGlom, int iOpenSlots); void _DeleteTaskItem(int index, BOOL fDeletePTI); void _RealityCheckGroup(PTASKITEM pti); HRESULT _CreatePopupMenu(POINTL* ppt, RECTL* prcl); void _AddItemToDropDown(int iIndex); void _RemoveItemFromDropDown(int iIndex); void _RefreshItemFromDropDown(int iIndex, int iNewIndex, BOOL fRefresh); void _ClosePopupMenus(); void _HandleDropDown(int index); void _UpdateProgramCount(); BOOL _AddToTaskbar(PTASKITEM pti, int indexTaskbar, BOOL fVisible, BOOL fForceGetIcon); BOOL _InsertItem(HWND hwndTask, PTASKITEM ptiOveride = NULL, BOOL fForceGetIcon = FALSE); void _DeleteItem(HWND hWnd, int index = -1); void _AttachTaskShortcut(PTASKITEM pti, LPCTSTR pszExeName); void _ReattachTaskShortcut(); void _BuildTaskList(CDPA* pDPA); // *** Async-Animation BOOL _fAnimate; CDSA _dsaAII; // animation methods BOOL _AnimateItems(int iIndex, BOOL fExpand, BOOL fGlomAnimation); void _AsyncAnimateItems(); void _ResizeAnimationItems(); int _CheckAnimationSize(); void _SizeNonAnimatingItems(); // animation helpers void _UpdateAnimationIndices(); void _UpdateAnimationIndicesSlow(); int _FindItem(PTASKITEM pti); void _RemoveItemFromAnimationList(PTASKITEM ptiRemove); void _SetAnimationState(PANIMATIONITEMINFO paii, BOOL fExpand, BOOL fGlomAnimation); int _GetAnimationInsertPos(int iIndex); void _SetAnimationItemWidth(PANIMATIONITEMINFO paii, int cxStep); int _GetAnimationDistLeft(PANIMATIONITEMINFO paii, int iNormalWidth); void _FinishAnimation(PANIMATIONITEMINFO paii); int _GetAnimationWidth(); int _GetAnimationStep(); DWORD _GetStepTime(int iStep); int _GetCurButtonHeight(); void _SetThreadPriority(int iPriority, DWORD dwWakeupTime); void _RestoreThreadPriority(); BOOL _IsHorizontal() { return !(_dwViewMode & DBIF_VIEWMODE_VERTICAL); } BOOL _fGlom; int _iGroupSize; CToolBarCtrl _tb; UINT WM_ShellHook; int _iSysMenuCount; int _iIndexActiveAtLDown; HWND _hwndSysMenu; HWND _hwndLastRude; HWND _hwndPrevFocus; HWND _hwndReplacing; BOOL _fIgnoreTaskbarActivate; BOOL _fFlashing; BOOL _fDenyHotItemChange; CTray* _ptray; HFONT _hfontSave; int _iTextSpace; DWORD _dwPos; DWORD _dwViewMode; HFONT _hfontCapNormal; HFONT _hfontCapBold; HTHEME _hTheme; int _iOldPriority; int _iNewPriority; ULONG _cRef; // Drag & drop stuff int _iDropItem; DWORD _dwTriggerStart; DWORD _dwTriggerDelay; // Variables for the ASYNC popup menu IShellMenu2* _psmPopup; IMenuPopup* _pmpPopup; IMenuBand* _pmbPopup; int _iIndexPopup; int _iIndexLastPopup; CMenu _menuPopup; IImageList* _pimlSHIL; // Rarely-used stuff ULONG _uShortcutInvokeNotify; UINT _uCDHardError; CTaskBand(); ~CTaskBand(); HRESULT Init(CTray* ptray); HRESULT _BandInfoChanged(); DWORD _dwBandID; IUnknown * _punkSite; friend HRESULT CTaskBand_CreateInstance(IUnknown* punkOuter, IUnknown** ppunk); friend class CTaskBandSMC; }; #endif // __cplusplus #endif //TASKBAND_H_