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

161 lines
6.1 KiB
C++

#ifndef _DVTASKS_H
#define _DVTASKS_H
#include <runtask.h>
class CDefView;
class CGetIconTask;
class CStatusBarAndInfoTipTask;
class CDUIInfotipTask;
class CTestCacheTask;
class CBackgroundInfoTip; // Used for the background processing of InfoTips
STDAPI CCategoryTask_Create(CDefView *pView, LPCITEMIDLIST pidl, UINT uId, IRunnableTask **ppTask);
STDAPI CBkgrndEnumTask_CreateInstance(CDefView *pdsv, IEnumIDList * peunk, HDPA hdpaNew, BOOL fRefresh, IRunnableTask **ppTask);
STDAPI CIconOverlayTask_CreateInstance(CDefView *pdsv, LPCITEMIDLIST pdl, int iList, IRunnableTask **ppTask);
STDAPI CExtendedColumnTask_CreateInstance(CDefView *pdsv, LPCITEMIDLIST pidl, UINT uId, int fmt, UINT uiColumn, IRunnableTask **ppTask);
STDAPI CFileTypePropertiesTask_CreateInstance(CDefView *pdsv, LPCITEMIDLIST pidl, UINT uMaxPropertiesToShow, UINT uId, IRunnableTask **ppTask);
STDAPI CStatusBarAndInfoTipTask_CreateInstance(LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidl, UINT uMsg, int nMsgParam, CBackgroundInfoTip *pbit, HWND hwnd, IShellTaskScheduler2* pScheduler, CStatusBarAndInfoTipTask ** ppTask);
STDAPI CDUIInfotipTask_CreateInstance(CDefView *pDefView, HWND hwndContaining, UINT uToolID, LPCITEMIDLIST pidl, CDUIInfotipTask **ppTask);
STDAPI CTestCacheTask_Create(DWORD dwTaskID, CDefView *pView,
IExtractImage * pExtract, LPCWSTR pszPath, FILETIME ftDateStamp,
LPCITEMIDLIST pidl, int iItem, DWORD dwFlags, DWORD dwPriority,
BOOL fAsync, BOOL fBackground, BOOL fForce, CTestCacheTask **ppTask);
HRESULT CDiskCacheTask_Create(DWORD dwTaskID, CDefView *pView,
DWORD dwPriority, int iItem, LPCITEMIDLIST pidl, LPCWSTR pszPath,
FILETIME ftDateStamp, IExtractImage *pExtract, DWORD dwFlags, IRunnableTask **ppTask);
HRESULT CExtractImageTask_Create(DWORD dwTaskID, CDefView* pView,
IExtractImage *pExtract, LPCWSTR pszPath, LPCITEMIDLIST pidl,
FILETIME fNewTimeStamp, int iItem,
DWORD dwFlags, DWORD dwPriority, IRunnableTask **ppTask);
HRESULT CWriteCacheTask_Create(DWORD dwTaskID, CDefView *pView,
LPCWSTR pszFullPath, FILETIME ftTimeStamp, HBITMAP hImage, IRunnableTask **ppTask);
HRESULT CReadAheadTask_Create(CDefView *pView, IRunnableTask **ppTask);
HRESULT CGetCommandStateTask_Create(CDefView *pView, IUICommand *puiCommand,IShellItemArray *psiItemArray, IRunnableTask **ppTask);
class CTestCacheTask : public CRunnableTask
{
public:
CTestCacheTask(DWORD dwTaskID, CDefView *pView, IExtractImage *pExtract, LPCWSTR pszPath,
FILETIME ftDateStamp, int iItem, DWORD dwFlags, DWORD dwPriority,
BOOL fAsync, BOOL fBackground, BOOL fForce);
STDMETHOD (RunInitRT)();
HRESULT Init(LPCITEMIDLIST pidl);
protected:
~CTestCacheTask();
CDefView *_pView;
IExtractImage * _pExtract;
WCHAR _szPath[MAX_PATH];
FILETIME _ftDateStamp;
LPITEMIDLIST _pidl;
int _iItem;
DWORD _dwFlags;
DWORD _dwPriority;
BOOL _fAsync;
BOOL _fBackground;
BOOL _fForce;
DWORD _dwTaskID;
};
// task used to perform the background status bar update
class CStatusBarAndInfoTipTask : public CRunnableTask
{
public:
CStatusBarAndInfoTipTask(HRESULT *phr, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidl, UINT uMsg, int nMsgParam, CBackgroundInfoTip *pbit, HWND hwnd, IShellTaskScheduler2* pScheduler);
STDMETHODIMP RunInitRT(void);
protected:
~CStatusBarAndInfoTipTask();
LPITEMIDLIST _pidl;
LPITEMIDLIST _pidlFolder;
UINT _uMsg;
int _nMsgParam;
CBackgroundInfoTip *_pbit;
HWND _hwnd;
IShellTaskScheduler2* _pScheduler;
};
class CBackgroundInfoTip : IUnknown
{
public:
CBackgroundInfoTip(HRESULT *phr, NMLVGETINFOTIP *plvGetInfoTip)
{
_lvSetInfoTip.cbSize = sizeof(_lvSetInfoTip);
_lvSetInfoTip.iItem = plvGetInfoTip->iItem;
_lvSetInfoTip.iSubItem = plvGetInfoTip->iSubItem;
*phr = SHStrDup(plvGetInfoTip->pszText, &_lvSetInfoTip.pszText);
if (SUCCEEDED(*phr))
{
// Do not repeat the text if the item is not folded
if (plvGetInfoTip->dwFlags & LVGIT_UNFOLDED)
_lvSetInfoTip.pszText[0] = 0;
}
_cRef = 1;
}
// IUnknown
virtual STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj) { return E_NOINTERFACE; }
virtual STDMETHODIMP_(ULONG) AddRef(void)
{
return InterlockedIncrement(&_cRef);
}
virtual STDMETHODIMP_(ULONG) Release(void)
{
if (InterlockedDecrement(&_cRef))
return _cRef;
delete this;
return 0;
}
LVSETINFOTIP _lvSetInfoTip;
BOOL _fReady; // This ensures that we will not try to use the object before it's ready
// CONSIDER: the memory can be released and then re-used by the same object
// CONSIDER: which would have us believe that the InfoTip should be shown.
// CONSIDER: But if another InfoTip had been requested and the memory re-used for the new CBackgroundInfoTip
// CONSIDER: we would handle the message WM_AEB_ASYNCNAVIGATION with an
// CONSIDER: unprocessed CBackgroundInfoTip object. (See the handler for WM_AEB_ASYNCNAVIGATION).
private:
LONG _cRef;
~CBackgroundInfoTip()
{
CoTaskMemFree(_lvSetInfoTip.pszText); // NULL ok
}
};
class CDUIInfotipTask : public CRunnableTask
{
public:
CDUIInfotipTask() : CRunnableTask(RTF_DEFAULT) {}
// Local
HRESULT Initialize(CDefView *pDefView, HWND hwndContaining, UINT uToolID, LPCITEMIDLIST pidl);
// IRunnableTask
STDMETHOD(RunInitRT)(void);
protected:
virtual ~CDUIInfotipTask();
CDefView * _pDefView;
HWND _hwndContaining; // hwnd containing tool
UINT _uToolID; // tool id (unique among tools in containing hwnd)
LPITEMIDLIST _pidl;
};
#endif