/////////////////////////////////////////////////////////////////////////////
//
// EventsList -  
// ABaseEvent -       
// 
////////////////////////////////////////////////////////////////////////////
#ifndef _ABASEEVENT_H
#define _ABASEEVENT_H

extern KompasObjectPtr kompas;

/////////////////////////////////////////////////////////////////////////////
//
//      
//
/////////////////////////////////////////////////////////////////////////////
class ABaseEvent : public CCmdTarget
{
protected:
  static CObList&   m_EventList;  //   
  DWORD             m_dwCookie;   //  
  IID		            m_iidEvents;  // IID  
	LPCONNECTIONPOINT	m_pConnPt;    //  
  LPUNKNOWN         m_pContainer; //  
  LPDISPATCH        m_doc;        // 
  long              m_objType;    //  
  LPDISPATCH        m_obj3D;
					
public:
           // 
	         ABaseEvent( LPUNKNOWN    pObject,
                       IID          iidEvents,
                       LPDISPATCH   doc       = NULL,
                       long         objType   = -1,
                       LPDISPATCH   obj3D     = NULL );

           // 
  virtual ~ABaseEvent();
  
  int          Advise    ();      //    
  void         Unadvise  ();      //    
  void         RemoveThis();      //       
  bool         IsMyContainer( LPUNKNOWN container );  

  void         Disconnect();      // 
  virtual void Clear     ();  
  LPUNKNOWN    GetContainer( bool addRef = TRUE ); //  

  static  void DestroyList    ();                             //        
  static  void TerminateEvents( void );                       //   
  static  void TerminateEvents( LPUNKNOWN  container );
  static  void TerminateEvents( IID        iid,               //   
                                LPDISPATCH doc     = NULL, 
                                long       objType = -1,
                                LPDISPATCH obj3D   = NULL );  
  static  bool FindEvent      ( IID        iid,               //  
                                LPDISPATCH doc     = NULL, 
                                long       objType = -1,
                                LPDISPATCH obj3D   = NULL );
  
  static  bool FindEventByContainer( IID iid, LPUNKNOWN pObject ); 
protected:
	BEGIN_INTERFACE_PART(EventHandler, IDispatch)
		INIT_INTERFACE_PART(BaseEvent, EventHandler)
		STDMETHOD(GetTypeInfoCount)(unsigned int*);
		STDMETHOD(GetTypeInfo)(unsigned int, LCID, ITypeInfo**);
		STDMETHOD(GetIDsOfNames)( REFIID, LPOLESTR*, unsigned int, LCID, DISPID*);
		STDMETHOD(Invoke)(DISPID, REFIID, LCID, unsigned short, DISPPARAMS*,
 						  VARIANT*, EXCEPINFO*, unsigned int*);
	END_INTERFACE_PART(EventHandler)

  DECLARE_INTERFACE_MAP()
  DECLARE_EVENTSINK_MAP()
};

//    
void AdviseDoc( LPDISPATCH doc = NULL );
//      
void AdviseDocuments();

////////////////////////////////////////////////////////////////////////////////
#endif 
