/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1998 **/ /**********************************************************************/ /* handlers.h Prototypes for the various handlers FILE HISTORY: */ #ifndef _HANDLERS_H #define _HANDLERS_H #ifndef _BASEHAND_H #include "basehand.h" #endif #ifndef _QUERYOBJ_H #include "queryobj.h" #endif #ifndef _PROPPAGE_H #include "proppage.h" #endif typedef CArray CVirtualIndexArray; /*--------------------------------------------------------------------------- Class: ThreadHandler This is an abstract base class that anyone who wants to run a background thread needs to implement (if they use the hidden window mechanism that is). This is the class that does all of the background thread management. Author: kennt ---------------------------------------------------------------------------*/ class ThreadHandler : public ITFSThreadHandler { public: ThreadHandler(); ~ThreadHandler(); DeclareIUnknownMembers(IMPL) // Derived classes should implement this DeclareITFSThreadHandlerMembers(PURE) // Thread management functions BOOL StartBackgroundThread(ITFSNode * pNode, HWND hWndHidden, ITFSQueryObject *pQuery); void WaitForThreadToExit(); void ReleaseThreadHandler(); protected: // override for custom thread creation virtual CBackgroundThread* CreateThreadObject(); SPITFSQueryObject m_spQuery; SPITFSNode m_spNode; HWND m_hwndHidden; // handle to window to post to UINT m_uMsgBase; HANDLE m_hThread; long m_cRef; }; typedef CList CPropSheetListBase; /*--------------------------------------------------------------------------- Class: CHandler ---------------------------------------------------------------------------*/ class CHandler : public CBaseHandler, public CBaseResultHandler { public: CHandler(ITFSComponentData *pTFSCompData); virtual ~CHandler(); DeclareIUnknownMembers(IMPL) virtual HRESULT OnExpand(ITFSNode *, LPDATAOBJECT, DWORD, LPARAM, LPARAM) { m_bExpanded = TRUE; return hrOK; } void Lock(); void Unlock(); BOOL IsLocked() { return m_nLockCount > 0;} OVERRIDE_NodeHandler_UserNotify(); OVERRIDE_NodeHandler_DestroyHandler() { return DestroyPropSheets(); } OVERRIDE_ResultHandler_UserResultNotify(); OVERRIDE_ResultHandler_DestroyResultHandler() { return DestroyPropSheets(); } // public helpers int HasPropSheetsOpen(); HRESULT GetOpenPropSheet(int nIndex, CPropertyPageHolderBase ** ppPropSheet); virtual HRESULT OnRefresh(ITFSNode *, LPDATAOBJECT, DWORD, LPARAM, LPARAM); protected: HRESULT BuildSelectedItemList(ITFSComponent * pComponent, CTFSNodeList * plistSelectedItems); HRESULT BuildVirtualSelectedItemList(ITFSComponent * pComponent, CVirtualIndexArray * parraySelectedItems); HRESULT RemovePropSheet(CPropertyPageHolderBase * pPageHolder); HRESULT AddPropSheet(CPropertyPageHolderBase * pPageHolder); HRESULT DestroyPropSheets(); public: int m_nState; // for general purpose finite state machine implementation DWORD m_dwErr; // for general purpose error handling LONG m_nLockCount; // keeps track if a node has been locked (e.g. to spin a thread, etc.) BOOL m_bExpanded; // whether or not this node has been expanded yet protected: LONG m_cRef; CPropSheetListBase m_listPropSheets; }; /*--------------------------------------------------------------------------- Class: CMTHander ---------------------------------------------------------------------------*/ class CMTHandler : public CHandler, public ThreadHandler { public: CMTHandler(ITFSComponentData *pTFSCompData); virtual ~CMTHandler(); DeclareIUnknownMembers(IMPL) STDMETHOD (DestroyHandler) (ITFSNode *pNode); virtual HRESULT OnExpand(ITFSNode *, LPDATAOBJECT, DWORD, LPARAM, LPARAM); // query creation - override to create a user-specific query object virtual ITFSQueryObject* OnCreateQuery(ITFSNode *pNode) = 0; virtual HRESULT OnRefresh(ITFSNode *, LPDATAOBJECT, DWORD, LPARAM, LPARAM); protected: virtual int GetImageIndex(BOOL bOpenIndex) { return -1; } // the next 3 functions are background thread notification callbacks // these override the ThreadHandler::OnNotifyXXX functions DeclareITFSThreadHandlerMembers(IMPL) virtual void OnChangeState(ITFSNode * pNode) {} virtual void OnHaveData(ITFSNode * pParentNode, ITFSNode * pNode) = 0; virtual void OnHaveData(ITFSNode * pParentNode, LPARAM Data, LPARAM Type) { }; virtual void OnError(DWORD dwErr) { m_dwErr = dwErr; } protected: LONG m_cRef; private: // friend class CHiddenWnd; // to get OnThreadNotification() }; #endif _HANDLERS_H