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

336 lines
12 KiB
C++

#ifndef TASKBAND_H_
#define TASKBAND_H_
#ifdef __cplusplus
#include "atlstuff.h"
#include "cwndproc.h"
#include <dpa.h>
#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<PTASKITEM>* pdsa);
int _GetGroupItems(int iIndexGroup, CDSA<PTASKITEM>* pdsa);
void _OnGroupCommand(int iRet, CDSA<PTASKITEM>* 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<TASKITEM>* pDPA);
// *** Async-Animation
BOOL _fAnimate;
CDSA<ANIMATIONITEMINFO> _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_