// IDESampleActiveX.h : Declaration of the IDESampleActiveX

#ifndef __IDESAMPLEACTIVEX_H_
#define __IDESAMPLEACTIVEX_H_

#include "resource.h"       // main symbols
#include <atlctl.h>

// get the XMLSpy/Authenic call-back interface 
#import "IXMLSpyPlugIn.tlb" no_namespace

// get the COMinterface into XMLSpy or Authentic
#ifdef BUILDAUTHENTIC
#import "Authentic.tlb"
#else
#import "XMLSpy.tlb"
#endif

#include <map>
#include <vector>

typedef std::map<CString, int>	TNamesMap;


/////////////////////////////////////////////////////////////////////////////
// IDESampleActiveX
class ATL_NO_VTABLE IDESampleActiveX : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public IDispatchImpl<IIDESampleActiveX, &IID_IIDESampleActiveX, &LIBID_IDEPLUGINASACTIVEXLib>,
	public CComControl<IDESampleActiveX>,
	public IPersistStreamInitImpl<IDESampleActiveX>,
	public IOleControlImpl<IDESampleActiveX>,
	public IOleObjectImpl<IDESampleActiveX>,
	public IOleInPlaceActiveObjectImpl<IDESampleActiveX>,
	public IViewObjectExImpl<IDESampleActiveX>,
	public IOleInPlaceObjectWindowlessImpl<IDESampleActiveX>,
	public ISupportErrorInfo,
	public IPersistStorageImpl<IDESampleActiveX>,
	public ISpecifyPropertyPagesImpl<IDESampleActiveX>,
	public IQuickActivateImpl<IDESampleActiveX>,
	public IDataObjectImpl<IDESampleActiveX>,
	public IProvideClassInfo2Impl<&CLSID_IDESampleActiveX, NULL, &LIBID_IDEPLUGINASACTIVEXLib>,
	public CComCoClass<IDESampleActiveX, &CLSID_IDESampleActiveX>,
	public IXMLSpyPlugIn
{
	public:
		IDESampleActiveX()
		{
			m_bWindowOnly = TRUE;
			m_nXMLDataCount = 0;
		}
			
	// ------------- Windows stuff --------------
	public:
		HRESULT OnDraw( ATL_DRAWINFO& di );
		LRESULT OnCreate( UINT uMsg, WPARAM	wParam, LPARAM lParam, BOOL& bHandled );

		BEGIN_PROP_MAP( IDESampleActiveX )
			PROP_DATA_ENTRY( "_cx", m_sizeExtent.cx, VT_UI4 )
			PROP_DATA_ENTRY( "_cy", m_sizeExtent.cy, VT_UI4 )
			// Example entries
			// PROP_ENTRY("Property Description", dispid, clsid)
			// PROP_PAGE(CLSID_StockColorPage)
		END_PROP_MAP()

		BEGIN_MSG_MAP( IDESampleActiveX )
			MESSAGE_HANDLER( WM_CREATE, OnCreate )
			CHAIN_MSG_MAP( CComControl<IDESampleActiveX> )
			DEFAULT_REFLECTION_HANDLER()
		END_MSG_MAP()

	// --------------- COM stuff -----------------
	public:
		DECLARE_REGISTRY_RESOURCEID(IDR_IDESAMPLEACTIVEX)
		DECLARE_NOT_AGGREGATABLE(IDESampleActiveX)

		DECLARE_PROTECT_FINAL_CONSTRUCT()

		DECLARE_VIEW_STATUS( VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE )

		// all the interfaces we implement
		// most are covered by templates this clss derives of
		// ISupportsErrorInfo and IXMLSpyPlugIn is still open and will be impemented below.
		BEGIN_COM_MAP(IDESampleActiveX)
			COM_INTERFACE_ENTRY(IIDESampleActiveX)
			COM_INTERFACE_ENTRY(IDispatch)
			COM_INTERFACE_ENTRY(IViewObjectEx)
			COM_INTERFACE_ENTRY(IViewObject2)
			COM_INTERFACE_ENTRY(IViewObject)
			COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
			COM_INTERFACE_ENTRY(IOleInPlaceObject)
			COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
			COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
			COM_INTERFACE_ENTRY(IOleControl)
			COM_INTERFACE_ENTRY(IOleObject)
			COM_INTERFACE_ENTRY(IPersistStreamInit)
			COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
			COM_INTERFACE_ENTRY(ISupportErrorInfo)
			COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
			COM_INTERFACE_ENTRY(IQuickActivate)
			COM_INTERFACE_ENTRY(IPersistStorage)
			COM_INTERFACE_ENTRY(IDataObject)
			COM_INTERFACE_ENTRY(IProvideClassInfo)
			COM_INTERFACE_ENTRY(IProvideClassInfo2)
			COM_INTERFACE_ENTRY(IXMLSpyPlugIn)
		END_COM_MAP()

		// implementation of ISupportsErrorInfo
		STDMETHOD( InterfaceSupportsErrorInfo )(REFIID riid);

	// IIDESampleActiveX
	public:
		// implementation of IXMLSpyPlugIn - will get called from within XMLSpy
		STDMETHOD( raw_OnCommand )( long nID, IDispatch*	pXMLSpy );
		STDMETHOD( raw_OnUpdateCommand )( long nID, IDispatch* pXMLSpy, SPYUpdateAction*	pAction );
		STDMETHOD( raw_OnEvent )( long nEventID, SAFEARRAY**	arrayParameters, IDispatch*	pXMLSpy, VARIANT* pReturnValue );
		STDMETHOD( raw_GetUIModifications )( BSTR* pModificationsXML );
		STDMETHOD( raw_GetDescription )( BSTR* pDescription );

	private:
		// some helper functions:
		void FillLists( XMLSpyLib::IDocument* ipDoc );
		void FillNamesMap( std::vector<TNamesMap>& vecNamesMap, XMLSpyLib::IXMLData* ipXMLData, std::vector<XMLSpyLib::SPYXMLDataKind>& vecKind );
		void FillListCtrlFromMap( CListCtrl* pList, TNamesMap&	namesMap );
		UINT CountXMLData( XMLSpyLib::IXMLData* ipXMLData );

	private:
		UINT m_nXMLDataCount;						// bit sloppy way to detect changes in the XMLData
		CListCtrl m_List;							// ListBox for XML elements
		CListCtrl m_AttrList;						// ListBox for XML attributes
};

#endif //__IDESAMPLEACTIVEX_H_
