/////////////////////////////////////////////////////////////////////////////
//
// BaseEvent.h
//      (Auto)
//
/////////////////////////////////////////////////////////////////////////////

#ifndef _BASEEVENT_H
#define _BASEEVENT_H

#ifndef __UTILCLS_H
#include <utilcls.h>
#endif

#ifndef __LIBHPPAR_H
#include <libhppar.h>
#endif


//---------------------------------------------------------------------------
//  
// ---
class EventListObject
{
protected:
  static TList * m_pEventList;

public:
  //   
  //     
  static void TerminateEvents();

  EventListObject();
  virtual ~EventListObject();
};


//---------------------------------------------------------------------------
// BaseEvent      ( TEventsDispatcher)
// ---
class BaseEvent : public EventListObject, public IDispatch
{
  int       m_Ref;         // 
  DWORD     m_EventCookie; //  
  REFIID    m_refIID;      // IID 
protected:
  LPUNKNOWN m_pContainer;  //  
  long      m_objType;     //  
  LPDISPATCH m_obj3D;      //   3D
  LPDISPATCH m_pDoc;       // 

public:
  BaseEvent( LPUNKNOWN  pContainer,
             REFIID     refIID,
             LPDISPATCH doc       =      NULL,
             long       objType   =         0,
             LPDISPATCH obj3D     =      NULL );
  virtual ~BaseEvent();

  static  void BaseEvent::TerminateEvents( IID iid, //   
                                           LPDISPATCH doc = NULL,
                                           long objType = -1,
                                           LPDISPATCH obj3D = NULL );
  static  BaseEvent* BaseEvent::FindEvent( IID iid,       //  
                                     LPDISPATCH doc = NULL,
                                     long objType = -1,
                                     LPDISPATCH obj3D = NULL );

protected:
  virtual HRESULT InvokeEvent(DISPID id, BOOL & resEvent, TVariant * params = 0 ) = 0;

public:
  bool Advise();                    //    
  void Unadvise();                  //    
  virtual   void      Clear();      // 
            void      Disconnect(); // 

  // IUnknown
  HRESULT STDMETHODCALLTYPE QueryInterface( REFIID iid, void **ppvObject );
  ULONG   STDMETHODCALLTYPE AddRef(){ return ++m_Ref; };
  ULONG   STDMETHODCALLTYPE Release()
  {
    if ( !--m_Ref )
      delete this;
    return m_Ref;
  };


  // IDispatch
  HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT* pctInfo);
  HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT, LCID, ITypeInfo** ppTypeInfo);
  HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID, LPOLESTR*, UINT, LCID, DISPID*);
  HRESULT STDMETHODCALLTYPE Invoke( DISPID dispid, REFIID iid, LCID lcid,
                                    WORD wFlags, DISPPARAMS *pDispParams,
                                    VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
                                    UINT *puArgError);
};

int LibMessage( char* str, int flags = MB_OK );
#endif



