//(C) COPYRIGHT MICROSOFT CORP., 1998-1999

#ifndef _CLASSES_H_
#define _CLASSES_H_





/*****************************************************************************
class CShellExt

Implement our regular shell extensions.


******************************************************************************/

class ATL_NO_VTABLE CShellExt :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CShellExt, &CLSID_TestShellExt>,
    public IShellExtInit, public IContextMenu, public IShellPropSheetExt
{
    private:
        UINT_PTR m_idCmd;
        CComPtr<IWiaItem> m_pItem;

        static INT_PTR CALLBACK PropPageProc (HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
        HRESULT GetNewRootPath (HWND hwnd);

    public:
    BEGIN_COM_MAP(CShellExt)
        COM_INTERFACE_ENTRY(IShellExtInit)
        COM_INTERFACE_ENTRY(IContextMenu)
        COM_INTERFACE_ENTRY(IShellPropSheetExt)
    END_COM_MAP()
        DECLARE_NO_REGISTRY()

        // IShellExtInit
        STDMETHODIMP Initialize (LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj,HKEY hkeyProgID);

        // IShellPropSheetExt
        STDMETHODIMP AddPages (LPFNADDPROPSHEETPAGE lpfnAddPage,LPARAM lParam);
        STDMETHODIMP ReplacePage (UINT uPageID,LPFNADDPROPSHEETPAGE lpfnReplacePage,LPARAM lParam) {return E_NOTIMPL;};

        // IContextMenu
        STDMETHODIMP QueryContextMenu (HMENU hmenu,UINT indexMenu,UINT idCmdFirst,UINT idCmdLast,UINT uFlags);
        STDMETHODIMP InvokeCommand    (LPCMINVOKECOMMANDINFO lpici);
        STDMETHODIMP GetCommandString (UINT_PTR idCmd, UINT uType,UINT* pwReserved,LPSTR pszName,UINT cchMax);
        ~CShellExt ();
        CShellExt ();
};

class ATL_NO_VTABLE CLogoElement :
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IVisibleElement, &IID_IVisibleElement, &LIBID_WIAVIEWLib>,
    public CComCoClass<CLogoElement, &CLSID_UIElement>
{
    DECLARE_NO_REGISTRY()

    BEGIN_COM_MAP(CLogoElement)
        COM_INTERFACE_ENTRY(IVisibleElement)
        COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()
    DECLARE_PROTECT_FINAL_CONSTRUCT()

    public:
    //IVisibleElement
        STDMETHODIMP Clicked(BSTR string, BOOL bOn);
        STDMETHODIMP String(VARIANT index, /*out, retval*/BSTR *pStr);
        STDMETHODIMP get_StringCount(/*[out, retval]*/ long *pVal);
        STDMETHODIMP get_innerHTML(/*[out, retval]*/ BSTR *pVal);
        STDMETHODIMP get_Type(/*[out, retval]*/ BSTR *pVal);
        STDMETHODIMP get_Name(/*[out, retval]*/ BSTR *pVal);
};

class ATL_NO_VTABLE CExtCategories :
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IWIACategories, &IID_IWIACategories, &LIBID_WIAVIEWLib>,
    public CComCoClass<CExtCategories, &CLSID_Categories>
{

    BEGIN_COM_MAP(CExtCategories)
        COM_INTERFACE_ENTRY(IWIACategories)
        COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()

    public:
        DECLARE_PROTECT_FINAL_CONSTRUCT()
        DECLARE_NO_REGISTRY()

        //IWIACategories
        STDMETHODIMP Item(VARIANT index, IWIACategory **ppCat);
        STDMETHODIMP get_Count(/*[out, retval]*/ long *pVal);

};

class ATL_NO_VTABLE CExtCategory :
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IWIACategory, &IID_IWIACategory, &LIBID_WIAVIEWLib>,
    public CComCoClass<CExtCategory, &CLSID_Category>
{

    BEGIN_COM_MAP(CExtCategory)
        COM_INTERFACE_ENTRY(IWIACategory)
        COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()

    public:
        DECLARE_PROTECT_FINAL_CONSTRUCT()
        DECLARE_NO_REGISTRY()
        //IWIACategory
        STDMETHODIMP Element(VARIANT index, IVisibleElement **ppElement);
        STDMETHODIMP get_ElementCount(/*[out, retval]*/ long *pVal);
        STDMETHODIMP get_Name(/*[out, retval]*/ BSTR *pVal);
        STDMETHODIMP get_OnSelect (/*[out, retval]*/BSTR *pStr);
        STDMETHODIMP get_OnExit (/*[out, retval]*/BSTR *pStr);
        STDMETHODIMP get_Icon (/*[out, retval*/ BSTR *pStr);
};


//
// This sample implementation of the web view extension is not a complete ActiveX control suitable
// for scripting. Implementors may wish to implement a full dual interface control to allow for
// direct hosting in future WIA scripts.
//
class ATL_NO_VTABLE CWebViewExt :
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IWIADeviceUI, &IID_IWIADeviceUI, &LIBID_WIAVIEWLib>,
    public CComCoClass<CWebViewExt,&CLSID_WIACamUI>


{
    public:

        CWebViewExt ();
        ~CWebViewExt ();

        DECLARE_REGISTRY_RESOURCEID(IDR_VIEWREG)
        DECLARE_PROTECT_FINAL_CONSTRUCT()
        BEGIN_COM_MAP(CWebViewExt)
            COM_INTERFACE_ENTRY(IDispatch)
            COM_INTERFACE_ENTRY(IWIADeviceUI)

        END_COM_MAP()

        //IWIADeviceUI
        STDMETHODIMP GetUICategories (BSTR ItemName, IWIACategories **ppCats);
        STDMETHODIMP InitDeviceUI (BSTR strFolderPath);
        STDMETHODIMP SelectionChanged (IUnknown *pSelection);
        STDMETHODIMP InitPreview(LONG hwnd);
        STDMETHODIMP get_Device(/*[out, retval]*/ IUnknown* *pVal);



    private:

        CComPtr<IWiaItem> m_pDevice;    // root item pointer
        LPIDA             m_pSelection; // currently selected items in the view
        LPITEMIDLIST      m_pidlFolder; // idlist of the open folder


};



#endif

