//+---------------------------------------------------------------------------
//
//  File:       imx.h
//
//  Contents:   CIMX
//
//----------------------------------------------------------------------------

#ifndef DAP_H
#define DAP_H

#include "private.h"

class CDisplayAttributeInfo;

//+---------------------------------------------------------------------------
//
// CDisplayAttributeProvider
//
//----------------------------------------------------------------------------

class __declspec(novtable) CDisplayAttributeProvider : public ITfDisplayAttributeProvider
{
public:
    CDisplayAttributeProvider();
    virtual ~CDisplayAttributeProvider();

    virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) = 0;
    virtual STDMETHODIMP_(ULONG) AddRef(void)  = 0;
    virtual STDMETHODIMP_(ULONG) Release(void)  = 0;

    STDMETHODIMP EnumDisplayAttributeInfo(IEnumTfDisplayAttributeInfo **ppEnum);
    STDMETHODIMP GetDisplayAttributeInfo(REFGUID guid, ITfDisplayAttributeInfo **ppInfo);

    CDisplayAttributeInfo *_pList;

    static WCHAR szProviderName[80];

protected:
    void Add(GUID guid, WCHAR *pszDesc, TF_DISPLAYATTRIBUTE *pda);
};

//+---------------------------------------------------------------------------
//
// CDisplayAttributeInfo
//
//----------------------------------------------------------------------------

class CDisplayAttributeInfo : public ITfDisplayAttributeInfo
{
public:
    CDisplayAttributeInfo(GUID guid, WCHAR *pszDesc, TF_DISPLAYATTRIBUTE *pda);
    ~CDisplayAttributeInfo();

    //
    // IUnknown methods
    //
    virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
    virtual STDMETHODIMP_(ULONG) AddRef(void);
    virtual STDMETHODIMP_(ULONG) Release(void);

    STDMETHODIMP GetGUID(GUID *pguid);
    STDMETHODIMP GetDescription(BSTR *pbstr);

    STDMETHODIMP GetAttributeInfo(TF_DISPLAYATTRIBUTE *pda);
    STDMETHODIMP SetAttributeInfo(const TF_DISPLAYATTRIBUTE *pda);
    STDMETHODIMP Reset();

    CDisplayAttributeInfo *_pNext;

    HRESULT _SaveAttribute(const TCHAR *pszKey, WCHAR *pszDesc, const GUID *pguid, TF_DISPLAYATTRIBUTE *pda);
    HRESULT _OpenAttribute(const TCHAR *pszKey, WCHAR *pszDesc, const GUID *pguid, TF_DISPLAYATTRIBUTE *pda);
    HRESULT _DeleteAttribute(const TCHAR *pszKey, WCHAR *pszDesc, const GUID *pguid);

    GUID _guid;
    WCHAR _szDesc[80];
    TF_DISPLAYATTRIBUTE _da;
    TF_DISPLAYATTRIBUTE _daDefault;
    int _cRef;
};

//+---------------------------------------------------------------------------
//
// CEnumDisplayAttributeInfo
//
//----------------------------------------------------------------------------

class CEnumDisplayAttributeInfo : public IEnumTfDisplayAttributeInfo
{
public:
    CEnumDisplayAttributeInfo(CDisplayAttributeProvider *pProvider);
    ~CEnumDisplayAttributeInfo();

    // IUnknown methods
    //
    virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
    virtual STDMETHODIMP_(ULONG) AddRef(void);
    virtual STDMETHODIMP_(ULONG) Release(void);

    //
    // IEnumTfDisplayAttributeInfo
    //
    STDMETHODIMP Clone(IEnumTfDisplayAttributeInfo **ppEnum);
    STDMETHODIMP Next(ULONG ulCount, ITfDisplayAttributeInfo **ppInfo, ULONG *pcFetched);
    STDMETHODIMP Reset();
    STDMETHODIMP Skip(ULONG ulCount);

private:
    CDisplayAttributeInfo *_pCur;
    int _cRef;
    CDisplayAttributeProvider *_pProvider;
};


#endif // DAP_H