windows-nt/Source/XPSP1/NT/windows/oleacc/msaatext/msaastore.h
2020-09-26 16:20:57 +08:00

192 lines
3.8 KiB
C++

// MSAAStore.h : Declaration of the CAccStore
#ifndef __MSAASTORE_H_
#define __MSAASTORE_H_
#include "resource.h" // main symbols
#include <list>
#if ! defined( _BASETSD_H_ ) || defined( NEED_BASETSD_DEFINES )
// These allow us to compile with the pre-Win64 SDK (eg. using visual studio)
typedef unsigned long UINT_PTR;
typedef DWORD DWORD_PTR;
typedef BOOL BOOL_PTR;
#define PtrToInt (int)
#else
typedef INT_PTR BOOL_PTR;
#endif
struct DocInfo
{
DocInfo(IUnknown * pCanonicalUnk, ITextStoreAnchor * pDoc, IClonableWrapper * pClonableWrapper) :
m_pCanonicalUnk(pCanonicalUnk), m_pDoc(pDoc), m_pClonableWrapper(pClonableWrapper)
{
if ( FAILED( m_pDoc->GetWnd( NULL, &m_hWnd ) ) )
m_hWnd = NULL;
}
~DocInfo()
{
if (m_pCanonicalUnk)
m_pCanonicalUnk->Release();
if (m_pDoc)
m_pDoc->Release();
if (m_pClonableWrapper)
m_pClonableWrapper->Release();
}
struct predCanonicalUnk
{
predCanonicalUnk (const IUnknown *& punk) : m_punk(punk) { }
bool operator ()(const DocInfo* d)
{
return d->m_pCanonicalUnk == m_punk;
};
const IUnknown *& m_punk;
};
struct predHWND
{
predHWND (const HWND &hwnd ) : m_hWnd(hwnd) { }
bool operator ()(const DocInfo* d)
{
if( m_hWnd == d->m_hWnd )
return true;
else
return false;
}
const HWND &m_hWnd;
};
IUnknown * m_pCanonicalUnk;
ITextStoreAnchor * m_pDoc;
IClonableWrapper * m_pClonableWrapper;
HWND m_hWnd;
};
typedef std::list< DocInfo * > DocList;
// this is my own copy class so I don't have to duplicate the list
template <class T>
class CopyDocs
{
public:
static HRESULT copy(T** p1, DocInfo** p2)
{
*p1 = static_cast<T *>((*p2)->m_pDoc);
if (*p1)
(*p1)->AddRef();
TraceDebug(TEXT("copy"));
return S_OK;
}
static void init(T** )
{
TraceDebug(TEXT("init"));
}
static void destroy(T** p)
{
if (*p) (*p)->Release();
TraceDebug(TEXT("destroy"));
}
};
typedef CComObject< CComEnumOnSTL< IEnumUnknown, &IID_IEnumUnknown, IUnknown *, CopyDocs<IUnknown>, DocList > > EnumDocs;
template <class T>
class CComDllClassFactorySingleton : public CComClassFactorySingleton<T>
{
public :
void FinalRelease()
{
}
};
/////////////////////////////////////////////////////////////////////////////
// CAccStore
class ATL_NO_VTABLE CAccStore :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAccStore, &CLSID_AccStore>,
public IAccStore
{
public:
CAccStore();
~CAccStore();
DECLARE_CLASSFACTORY_EX(CComDllClassFactorySingleton<CAccStore>)
DECLARE_REGISTRY_RESOURCEID(IDR_MSAASTORE)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CAccStore)
COM_INTERFACE_ENTRY(IAccStore)
END_COM_MAP()
// IAccStore
public:
HRESULT STDMETHODCALLTYPE Register (
REFIID riid,
IUnknown * punk
);
HRESULT STDMETHODCALLTYPE Unregister (
IUnknown * punk
);
HRESULT STDMETHODCALLTYPE GetDocuments (
IEnumUnknown ** enumUnknown
);
HRESULT STDMETHODCALLTYPE LookupByHWND (
HWND hWnd,
REFIID riid,
IUnknown ** ppunk
);
HRESULT STDMETHODCALLTYPE LookupByPoint (
POINT pt,
REFIID riid,
IUnknown ** ppunk
);
HRESULT STDMETHODCALLTYPE OnDocumentFocus (
IUnknown * punk
);
HRESULT STDMETHODCALLTYPE GetFocused (
REFIID riid,
IUnknown ** ppunk
);
BOOL_PTR DialogProc ( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
private:
HWND m_hwndDlg;
HWND m_hList;
DocList m_DocList;
bool m_ShowDialog;
HANDLE m_hInit;
IUnknown * m_punkFocused;
ITfMSAAControl * m_pCtl;
void DumpInfo( DocInfo * pInfo );
void DumpInfo();
DocInfo * _LookupDoc( IUnknown * pCanonicalUnk );
DocInfo * _LookupDoc( HWND hWnd );
DocInfo * _LookupDoc( POINT pt );
void EraseDeadDocuments();
void Log( LPCTSTR text );
};
#endif //__MSAASTORE_H_