|
|
#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) { ASSERT( 0 != _cRef ); ULONG cRef = InterlockedDecrement(&_cRef); if ( 0 == cRef ) { delete this; } return cRef; }
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
|