////////////////////////////////////////////////////////////////////////////////
//
// 
//
////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "eventCom.h"

#include "baseEvent.h"
#include "DlgConfig.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CStep1App

BEGIN_MESSAGE_MAP(CEventComApp, CWinApp)
	//{{AFX_MSG_MAP(CStep1App)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// The one and only CStep1App object
CEventComApp theApp;

extern BaseEvent* NewApplicationEvent();
extern BaseEvent* NewDocumentEvent( reference doc );
extern BaseEvent* NewDocument2DEvent( reference doc );
extern BaseEvent* NewDocument3DEvent( reference doc );
extern BaseEvent* NewObj2DEvent( reference doc, int objType );
extern BaseEvent* NewObj3DEvent( reference doc, int objType, LPUNKNOWN iObj = NULL );
extern BaseEvent* NewSelectMngEvent( reference doc );
extern BaseEvent* NewSpcDocEvent( reference doc );
extern BaseEvent* NewSpcObjectEvent( reference doc, int objType );
extern BaseEvent* NewSpecificationEvent( reference doc );
extern BaseEvent* NewStampEvent( reference doc );

//-------------------------------------------------------------------------------
// 
// ---
CEventComApp::CEventComApp() : 
  m_iniFile( _T("c:\\EventsCom.ini")),
	m_auto(false),
	m_mes_2DDOC(true),
	m_mes_3DDOC(true),
	m_mes_APP(true),
	m_mes_DOC(true),
	m_mes_OBJ_2DDOC(true),
	m_mes_OBJ_3DDOC(true),
	m_mes_OBJ_SPC(true),
	m_mes_SELECT(true),
	m_mes_SPC(true),
	m_mes_SPCDOC(true),
	m_mes_STAMP(true)
{          
}


//-------------------------------------------------------------------------------
// 
// ---
BOOL CEventComApp::InitInstance() 
{
  TCHAR fileName[256];
  ::_tcscpy( fileName, _T("c:\\EventsCom.ini") );
  if( ::GetModuleFileName(theApp.m_hInstance, fileName, 256) ) 
  {
    TCHAR * buf = ::_tcsrchr( fileName, _T('\\'));
    if ( buf )
    {
      *(buf + 1) = _T('\0');
      ::_tcscat( fileName, _T("EventsCom.ini") );
    }
  }
//	MessageT( fileName );
  m_iniFile.SetPath( fileName ); 
  m_iniFile.ReadFile();
	m_auto          = m_iniFile.GetValueB( _T(" EventCOM"), _T("                              "), false );
	m_mes_2DDOC     = m_iniFile.GetValueB( _T(" EventCOM"), _T("    2D           "), true  );
	m_mes_3DDOC     = m_iniFile.GetValueB( _T(" EventCOM"), _T("    3D           "), true  );
	m_mes_APP       = m_iniFile.GetValueB( _T(" EventCOM"), _T("                   "), true  );
	m_mes_DOC       = m_iniFile.GetValueB( _T(" EventCOM"), _T("                "), true  );
	m_mes_OBJ_2DDOC = m_iniFile.GetValueB( _T(" EventCOM"), _T("     2D   "), true  );
	m_mes_OBJ_3DDOC = m_iniFile.GetValueB( _T(" EventCOM"), _T("     3D   "), true  );
	m_mes_OBJ_SPC   = m_iniFile.GetValueB( _T(" EventCOM"), _T("       "), true  );
	m_mes_SELECT    = m_iniFile.GetValueB( _T(" EventCOM"), _T("            "), true  );
	m_mes_SPC       = m_iniFile.GetValueB( _T(" EventCOM"), _T("              "), true  );
	m_mes_SPCDOC    = m_iniFile.GetValueB( _T(" EventCOM"), _T("     "), true  );
	m_mes_STAMP     = m_iniFile.GetValueB( _T(" EventCOM"), _T("                    "), true  );
//	if ( m_auto )
//		MessageT( "True");
//	else
//    MessageT( "False");
	return CWinApp::InitInstance();
}


//-------------------------------------------------------------------------------
// 
// ---
int CEventComApp::ExitInstance() 
{

  m_iniFile.Reset();
	m_iniFile.SetValueI( _T(" EventCOM"), _T("                              "), m_auto          );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("    2D           "), m_mes_2DDOC     );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("    3D           "), m_mes_3DDOC     );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("                   "), m_mes_APP       );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("                "), m_mes_DOC       );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("     2D   "), m_mes_OBJ_2DDOC );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("     3D   "), m_mes_OBJ_3DDOC );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("       "), m_mes_OBJ_SPC   );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("            "), m_mes_SELECT    );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("              "), m_mes_SPC       );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("     "), m_mes_SPCDOC    );
	m_iniFile.SetValueI( _T(" EventCOM"), _T("                    "), m_mes_STAMP     );

  m_iniFile.WriteFile();
//  MessageT( " Cfg" );
  BaseEvent::TerminateEvents();

  delete & BaseEvent::m_EventList;
	return CWinApp::ExitInstance();
}


//-------------------------------------------------------------------------------
// 
// ---
void CEventComApp::ConfigDlg()
{
  DlgConfig dlg;
  
  dlg.m_auto          = m_auto;                      
  dlg.m_mes_2DDOC     = m_mes_2DDOC;    
  dlg.m_mes_3DDOC     = m_mes_3DDOC;    
  dlg.m_mes_APP       = m_mes_APP;      
  dlg.m_mes_DOC       = m_mes_DOC;      
  dlg.m_mes_OBJ_2DDOC = m_mes_OBJ_2DDOC;
  dlg.m_mes_OBJ_3DDOC = m_mes_OBJ_3DDOC;
  dlg.m_mes_OBJ_SPC   = m_mes_OBJ_SPC;  
  dlg.m_mes_SELECT    = m_mes_SELECT;   
  dlg.m_mes_SPC       = m_mes_SPC;      
  dlg.m_mes_SPCDOC    = m_mes_SPCDOC;   
  dlg.m_mes_STAMP     = m_mes_STAMP;    


  dlg.DoModal();

  m_auto          = !!dlg.m_auto;         
  m_mes_2DDOC     = !!dlg.m_mes_2DDOC;    
  m_mes_3DDOC     = !!dlg.m_mes_3DDOC;    
  m_mes_APP       = !!dlg.m_mes_APP;      
  m_mes_DOC       = !!dlg.m_mes_DOC;      
  m_mes_OBJ_2DDOC = !!dlg.m_mes_OBJ_2DDOC;
  m_mes_OBJ_3DDOC = !!dlg.m_mes_OBJ_3DDOC;
  m_mes_OBJ_SPC   = !!dlg.m_mes_OBJ_SPC;  
  m_mes_SELECT    = !!dlg.m_mes_SELECT;   
  m_mes_SPC       = !!dlg.m_mes_SPC;      
  m_mes_SPCDOC    = !!dlg.m_mes_SPCDOC;   
  m_mes_STAMP     = !!dlg.m_mes_STAMP;    
	
}

//-------------------------------------------------------------------------------
//
// ---
unsigned int WINAPI LIBRARYID(){
	return ID_LIB;
}


//-------------------------------------------------------------------------------
//  2D   /
// ---
int SelectObj2DType() {
	double x = 0, y = 0;
  RequestInfoT info;
	memset( &info, 0, sizeof(info) ); 
	info.prompt = _T(" ");
	int typeObj = 0;
	info.commands = (TCHAR*)IDM_REQUEST_OBJECT;
	int command = CursorExT( &info, &x, &y, 0, NULL );
//	if ( command ) {
 		if ( command < 0 ) {
			reference obj = FindObj( x, y, ::ksGetCursorLimit() );
			if ( obj ) {
	//				if ( YesNoT( _T("  ?") ) ) 
	//					typeObj = GetObjParam( obj, 0, 0, ALLPARAM );
	//				else
					typeObj = obj;
			}
		}
		else {
			if ( command == 1000 )
				ReadIntT( _T("   "), 0, 0/**/, 123/**/, &command );
			else
				command--;

			typeObj = command; 
		}
//	}
  return typeObj;
}

//-------------------------------------------------------------------------------
//  2D  
// ---
void AdviseObj2D() {
  reference doc = ::ksGetCurrentDocument( 1 );
	if ( doc ) {
		int typeObj = SelectObj2DType();
		if ( typeObj != -1 ) {
			if ( !BaseEvent::FindEvents( ntObject2DNotify, doc, typeObj ) ) {
				if ( NewObj2DEvent( doc, typeObj ) ) {
					TCHAR buf[255];
					_stprintf( buf, _T("     2D\n typeObj = %i"), typeObj ); 
					MessageT( buf );
				}
				else
					MessageT( _T("  ") );
			}
			else
 				MessageT( _T(" ") );
    }
	}
	else
		MessageT( _T("  2D ") );
	
}

//-------------------------------------------------------------------------------
//  2D  
// ---
void UnAdviseObj2D() {
  reference doc = ::ksGetCurrentDocument( 1 );
	if ( doc ) {
		int typeObj = SelectObj2DType();
		if ( typeObj != -1 ) {
			BaseEvent::TerminateEvents( ntObject2DNotify, doc, typeObj );
			if ( !BaseEvent::FindEvents( ntObject2DNotify, doc, typeObj ) )
				MessageT( _T("") );
			else
				MessageT( _T("  ") );
		}
	}
	else
		MessageT( _T("  2D ") );
}


//-------------------------------------------------------------------------------
//  3D   /
// ---
bool SelectObj3DType( LPUNKNOWN& obj, int& objType ) {
	obj     = NULL;
  objType = o3d_unknown; // 0
	bool res = false;
	reference doc = ::ksGetCurrentDocument( 3 );
	if ( doc ) {
		IDocument3DPtr doc3D( ksGet3dDocumentFromReference(doc), false/*AddRef*/ );
		if ( doc3D ) { 
			IEntityPtr selEnt( doc3D->UserSelectEntity( 0, 0, _bstr_t(_T(" ")) ), false/*AddRef*/ );
			if ( !ReturnResult() ) {
				if ( selEnt ) {
			  	objType = selEnt->GetType();
					if ( objType == o3d_face || objType == o3d_edge || objType == o3d_vertex ) {
						int resYesNo = YesNoT( _T("   \n  -   Part\n -   Feature\n -  "));
						switch ( resYesNo ) {
							case 1: 
						    obj = selEnt->GetParent();
					      objType = o3d_part;
							  res = true;
								break;
							case 0: 
								obj = selEnt->GetFeature();
								objType = o3d_feature;
								res = true;
								break;
						}
					}	
					else {
					  obj = selEnt;
			      if( obj )
              obj->AddRef();
            res = true;
					}
				}
			}
      
		}
	}
	return res;
}

//-------------------------------------------------------------------------------
//     /
// ---
bool SelectSpcObjType( int& objType, bool byType ) {
  bool res = false;
	reference doc = ::ksGetCurrentDocument( 0 );
  if ( doc ) {
		int type = ksGetDocumentType( doc );
		bool current = false;
		reference spcObj = objType;
		switch ( type ) {
			case lt_DocSpc:
			case lt_DocSpcUser:
			case lt_DocSheetStandart:
			case lt_DocSheetUser: 
			case lt_DocAssemble3D:
			case lt_DocPart3D:
				{
				if ( !byType )
				  spcObj = ksGetCurrentSpcObject();
	    	res = byType || !! (objType = spcObj);
				break;
			}
			default:
				MessageT( _T("   ") );
		}
  }
  return res;
}

//-------------------------------------------------------------------------------
//
// ---
void WINAPI LIBRARYENTRY( unsigned int comm ) {
	//      .exe ,     
	//   dll   define
AFX_MANAGE_STATE(AfxGetStaticModuleState());
  bool byType = false;
  switch ( comm ) { 

		//     
	  case 10 : {      
			if ( !BaseEvent::FindEvents(ntKompasObjectNotify) ) {
      	//    
        if ( NewApplicationEvent() )            //     
					MessageT( _T("    "));
				else 
          MessageT( _T("  ") );
			}		
			else 
        MessageT( _T(" ") );
				  
			break;
		}
    
		//     
    case 11 : {  
      if ( BaseEvent::FindEvents(ntKompasObjectNotify) ) {
			  BaseEvent::TerminateEvents( ntKompasObjectNotify );
				MessageT( _T("") );
      }
			else
				MessageT( _T("  ") );
  		break;
    }
    
		//    
		case 20: { 
      reference doc = ::ksGetCurrentDocument( 0 );
      if ( doc ) {
        if ( !BaseEvent::FindEvents( ntDocumentFileNotify, doc ) ) { 
				  if ( NewDocumentEvent( doc ) )
						MessageT( _T("   ") );
					else
						MessageT( _T("  ") );
				}
				else
  				MessageT( _T(" ") );
      }
			else
				MessageT( _T("  ") );
 			break;
		} 
    
		//       
		case 21: { 
      reference doc = ::ksGetCurrentDocument( 0 );
			if ( doc ) {
				BaseEvent::TerminateEvents( 0, doc );
				if ( !BaseEvent::FindEvents( 0, doc ) ) 
				  MessageT( _T("      ") );
				else
          MessageT( _T("        ") );
      }
			else
				MessageT( _T("  ") );

			break;
		}
			
		//    2D 
		case 22: { 
      reference doc = ::ksGetCurrentDocument( 1 );
      if ( doc ) {
        if ( !BaseEvent::FindEvents( ntDocument2DNotify, doc ) ) { 
				  if ( NewDocument2DEvent( doc ) )
						MessageT( _T("   2D ") );
					else
						MessageT( _T("  ") );
				}
				else
  				MessageT( _T(" ") );
      }
			else
				MessageT( _T("  ") );
 			break;
		} 
    
		//     2D  
		case 23: { 
      reference doc = ::ksGetCurrentDocument( 1 );
			if ( doc ) {
				BaseEvent::TerminateEvents( ntDocument2DNotify, doc );
				if ( !BaseEvent::FindEvents( ntDocument2DNotify, doc ) ) 
				  MessageT( _T("     2D ") );
				else
          MessageT( _T("     2D   ") );
      }
			else
				MessageT( _T("  ") );

			break;
		}

    //     2D  (   ) 
		case 30:	{ 
      AdviseObj2D();
			break;
		}

    //     2D   
		case 31: { 
			UnAdviseObj2D();
			break;
		}

		//       	
		case 32: {
			reference doc = ::ksGetCurrentDocument( 1 );
			if ( doc ) {
				int type = ksGetDocumentType(doc);
				if ( type != lt_DocFragment ) {
					int view = 0;
					if ( ReadIntT( _T("  "), 0, 0, 255, &view ) ) {
						reference viewRef = GetViewReference(view);
						if ( viewRef ) {
							if ( !BaseEvent::FindEvents( ntObject2DNotify, doc, viewRef ) ) {
  							if ( NewObj2DEvent( doc, viewRef ) ) 
	  							MessageT( _T("") );
		  					else
			  					MessageT( _T("  ") );
							}
							else
      					MessageT( _T(" ") );
						}
						else 
							MessageT( _T("     ") );
					}
				}
      	else
		   		MessageT( _T("  ") );
			}
  		else
				MessageT( _T("  ") );

			break; 
		}

		//       	
		case 33: {
			reference doc = ::ksGetCurrentDocument( 1 );
			if ( doc ) {
				int type = ksGetDocumentType(doc);
				if ( type != lt_DocFragment ) {
					int view = 0;
					if ( ReadIntT( _T("  "), 0, 0, 255, &view ) ) {
						reference viewRef = GetViewReference(view);
						if ( viewRef ) {
							BaseEvent::TerminateEvents(ntObject2DNotify, doc, viewRef);
							if ( !BaseEvent::FindEvents( ntObject2DNotify, doc, viewRef ) ) 
								MessageT( _T("") );
							else
								MessageT( _T("  ") );
						}
						else 
							MessageT( _T("     ") );
					}
				}
      	else
		   		MessageT( _T("  ") );
			}
  		else
				MessageT( _T("  ") );
			break; 
		}

		//       	
		case 34: {
			reference doc = ::ksGetCurrentDocument( 1 );
			if ( doc ) {
				int layer = 0;
				if ( ReadIntT( _T("  "), 0, 0, 254, &layer ) ) {
					reference layerRef = GetLayerReference(layer);
					if ( layerRef ) {
  					if ( !BaseEvent::FindEvents( ntObject2DNotify, doc, layerRef ) ) {
						  if ( NewObj2DEvent( doc, layerRef ) ) 
							  MessageT( _T("") );
              else
                MessageT( _T("  ") );
						}
						else
     					MessageT( _T(" ") );
					}
					else 
						MessageT( _T("     ") );
				}
			}

			break; 
		}

		//     	
		case 35: {
			reference doc = ::ksGetCurrentDocument( 1 );
			if ( doc ) {
				int layer = 0;
				if ( ReadIntT( _T("  "), 0, 0, 254, &layer ) ) {
					reference layerRef = GetLayerReference(layer);
					if ( layerRef ) {
						BaseEvent::TerminateEvents( ntObject2DNotify, doc, layerRef );
						if ( !BaseEvent::FindEvents( ntObject2DNotify, doc, layerRef ) ) 
							MessageT( _T("") );
						else
							MessageT( _T("  ") );
					}
					else 
						MessageT( _T("     ") );
				}
			}
  		else
				MessageT( _T("  ") );

			break; 
		}

    //     2D   
		case 36: {
		 	reference doc = ksGetCurrentDocument( 1 );
			if ( doc ) {
			  BaseEvent::TerminateEvents( ntObject2DNotify, doc );
			  MessageT( _T("") );
			}
  		else
				MessageT( _T("  2D ") );
			break;
		}

		//    
		case 40: { 
      reference doc = ::ksGetCurrentDocument( 0 );
  		if ( doc ) {
				if ( !BaseEvent::FindEvents( ntSelectionMngNotify, doc ) ) { 
          if ( NewSelectMngEvent( doc  ) )
						MessageT( _T("") );
					else
						MessageT( _T("  ") );
				}
  			else
  				MessageT( _T(" ") );
			}
			else
				MessageT( _T("  ") );
			break;
		} 

		//    
		case 41: { 
      reference doc = ::ksGetCurrentDocument( 0 );
			if ( doc ) {
				BaseEvent::TerminateEvents( ntSelectionMngNotify, doc );
				if ( !BaseEvent::FindEvents( ntSelectionMngNotify, doc ) )
					MessageT( _T("") );
        else
				  MessageT( _T("  ") );
			}
			break;
		}

    //       
		case 50:	{ 
      reference doc = ::ksGetCurrentDocument( 0 );
  		if ( doc ) {
        int docType = ::ksGetDocumentType( doc ); 
				switch ( docType ) {
		      case lt_DocSheetStandart :
			    case lt_DocSheetUser     :
          case lt_DocSpc           :
					case lt_DocSpcUser       :
					case lt_DocTxtStandart   :
					case lt_DocTxtUser       : {
						if ( !BaseEvent::FindEvents( ntStampNotify, doc ) ) { 
							if ( NewStampEvent( doc ) )
								MessageT( _T("") );
							else
								MessageT( _T("  ") );
						}		
						else
 							MessageT( _T(" ") );
					  break;
					}
					default:
						MessageT( _T("  ") );
				}
      }
			else
				MessageT( _T("  ") );
			break;
		}
			
    //     
		case 51: { 
      reference doc = ::ksGetCurrentDocument( 0 );
			if ( doc ) { 
			  BaseEvent::TerminateEvents( ntStampNotify, doc );
			  if ( !BaseEvent::FindEvents( ntStampNotify, doc ) )
				  MessageT( _T("") );
			  else
				  MessageT( _T("  ") );
			}
			else
				MessageT( _T("  ") );

			break;
		}

    //    3D 
		case 60: {
			reference doc = ::ksGetCurrentDocument( 3 );
			if ( doc ) {
				if ( !BaseEvent::FindEvents( ntDocument3DNotify, doc ) ) { 
					if ( NewDocument3DEvent( doc ) )
						MessageT( _T("") );
					else
						MessageT( _T("  ") );
				}
        else
					MessageT( _T(" ") );
      }
  		else
				MessageT( _T("  3D ") );
			break;
		}

    //    3D 
		case 61: {
			reference doc = ::ksGetCurrentDocument( 3 );
			if ( doc ) {
        BaseEvent::TerminateEvents( ntDocument3DNotify, doc );
				if ( !BaseEvent::FindEvents( ntDocument3DNotify, doc ) )  
					MessageT( _T("") );
				else
					MessageT( _T("  ") );
      }
  		else
				MessageT( _T("  3D ") );
			break;
		}

		//     3D 
    case 70: {
			reference doc = ::ksGetCurrentDocument( 3 );
			if ( doc ) {
  			LPUNKNOWN obj = NULL;
        int objType   = o3d_unknown; // 0
				if ( SelectObj3DType( obj, objType ) ) { 
				  if ( NewObj3DEvent( doc, objType, obj ) )
					  MessageT( _T("") );
					else
					  MessageT( _T("  ") );
				}
        if ( obj )
          obj->Release();
			}
			else
				MessageT( _T("   3D") );
			break;
    }
    
		//     3D 	
    case 80: {
			reference doc = ::ksGetCurrentDocument( 3 );
			if ( doc ) {
  			LPUNKNOWN obj = NULL;
        int objType   = o3d_unknown; // 0
				if ( SelectObj3DType( obj, objType ) ) {
					int typeObj = obj ? 0 : objType;
					BaseEvent::TerminateEvents( ntObject3DNotify, doc, typeObj, obj );
					if ( !BaseEvent::FindEvents( ntObject3DNotify, doc, typeObj, obj ) ) 
            MessageT( _T("") );
					else
					  MessageT( _T("  ") );
				}
			}
			else
				MessageT( _T("   3D") );
			break;
    }


    //     3D   
		case 90: {
		 	reference doc = ksGetCurrentDocument( 3 );
			if ( doc ) {
			  BaseEvent::TerminateEvents( ntObject3DNotify, doc );
			  MessageT( _T("") );
			}
  		else
				MessageT( _T("  3D ") );
			break;
		}

		//      	
    case 300:
		case 300 + SPC_BASE_OBJECT:
		case 300 + SPC_COMMENT:
      byType = true;
		case 100: {
      int objType = byType ? comm - 300: 0; 
			reference doc = ::ksGetCurrentDocument( 0 );
			if ( doc ) {
	  		if ( SelectSpcObjType( objType, byType ) ) {
		  		if ( !BaseEvent::FindEvents( ntSpcObjectNotify, doc, objType ) ) {
			  	  if ( NewSpcObjectEvent( doc, objType ) ) 
				  		MessageT( _T("") );
            else
						  MessageT( _T("  ") );
					}
					else
						MessageT( _T(" ") );
				}
				else
					MessageT( _T("  ") );
			}
			else
				MessageT( _T("  ") );

			break;
		}
			
		//      	
    case 400:
		case 400 + SPC_BASE_OBJECT:
		case 400 + SPC_COMMENT:
      byType = true;
		case 101: { 
      int objType = byType ? comm - 400 : 0; 
			reference doc = ::ksGetCurrentDocument( 0 );
			if ( doc ) {
  			if ( SelectSpcObjType( objType, byType ) ) {
    			BaseEvent::TerminateEvents( ntSpcObjectNotify, doc, objType );
		  		if ( !BaseEvent::FindEvents( ntSpcObjectNotify, doc, objType ) )
					  MessageT( _T("") );
				  else
			  		MessageT( _T("  ") );
				}
				else
					MessageT( _T("  ") ); 
      }
  		else
				MessageT( _T("  ") );

      break;
		}


    //     
		case 130: {
			reference doc = ::ksGetCurrentDocument( 2 );
			if ( doc ) {
				if ( !BaseEvent::FindEvents( ntSpcDocumentNotify, doc ) ) { 
					if ( NewSpcDocEvent( doc ) )
						MessageT( _T("") );
					else
						MessageT( _T("  ") );
				}
        else
					MessageT( _T(" ") );
      }
  		else
				MessageT( _T("   ") );
			break;
		}
			

    //     
		case 131: {
			reference doc = ::ksGetCurrentDocument( 2 );
			if ( doc ) {
        BaseEvent::TerminateEvents( ntSpcDocumentNotify, doc );
				if ( !BaseEvent::FindEvents( ntSpcDocumentNotify, doc ) )  
					MessageT( _T("") );
				else
					MessageT( _T("  ") );
      }
  		else
				MessageT( _T("   ") );
			break;
		}

    //    
		case 140: {
			reference doc = ::ksGetCurrentDocument( 0 );
			if ( doc ) {
				if ( !BaseEvent::FindEvents( ntSpecificationNotify, doc ) ) { 
					if ( NewSpecificationEvent( doc ) )
						MessageT( _T("") );
					else
						MessageT( _T("  ") );
				}
        else
					MessageT( _T(" ") );
      }
  		else
				MessageT( _T("  ") );
			break;
		}

    //    
		case 141: {
			reference doc = ::ksGetCurrentDocument( 0 );
			if ( doc ) {
        BaseEvent::TerminateEvents( ntSpecificationNotify, doc );
				if ( !BaseEvent::FindEvents( ntSpecificationNotify, doc ) )  
					MessageT( _T("") );
				else
					MessageT( _T("  ") );
      }
  		else
				MessageT( _T("  ") );
			break;
		}

 
    case 997: //  
    {
      BaseEvent::ListEvents();
      break; 
    }

    //     
	  case 998: 
	    BaseEvent::TerminateEvents();
			MessageT( _T("") );
			break;
		
		case 999: // 
    { 
      ::theApp.ConfigDlg();
			if ( theApp.m_auto && !BaseEvent::FindEvents( ntKompasObjectNotify ) )
      	NewApplicationEvent();  //    
		}
		
		// /   3D       
		default: {
			if ( comm >= ( o3d_unknown + 500 ) && comm <= ( o3d_feature + 500 ) ) {
        // 
  		 	reference doc = ksGetCurrentDocument( 3 );
	  		if ( doc ) {
		  		int objType = comm - 500;
          if ( !BaseEvent::FindEvents( ntObject3DNotify, doc, objType ) ) {
						if ( NewObj3DEvent( doc, objType ) ) 
							MessageT( _T("") );
            else
							MessageT( _T("  ") );
          }
					else
						MessageT( _T(" ") );
				}
			  else
				  MessageT( _T("  3D ") );
			break;

			}
			else {
  			if ( comm >= ( o3d_unknown + 700 ) && comm <= ( o3d_feature + 700 ) ) {
          // 
		 			reference doc = ksGetCurrentDocument( 3 );
					if ( doc ) {
						int objType = comm - 700;
						BaseEvent::TerminateEvents( ntObject3DNotify, doc, objType );
						if ( !BaseEvent::FindEvents( ntObject3DNotify, doc, objType ) ) 
							MessageT( _T("") );
						else
							MessageT( _T("  ") );
					}
  				else
						MessageT( _T("  3D ") );
					break;
				}
			}
		}
  }
}


//-----------------------------------------------------------------------------
//      
// ---
bool WINAPI LibInterfaceNotifyEntry ( LPDISPATCH ){
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  if ( theApp.m_auto ) {
		if ( !BaseEvent::FindEvents( ntKompasObjectNotify ) )
			NewApplicationEvent();
		reference iter = ::CreateIterator( ALL_DOCUMENTS, 0 );
		if ( iter ) { //     
			reference pDoc = ::MoveIterator( iter, 'F' );
			if ( pDoc ){
				do {
					AdviseDoc( pDoc );
					pDoc = ::MoveIterator(iter, 'N' );
				} while ( pDoc );
			}
  		DeleteIterator( iter );
		}
	}
	return false;
}





//-------------------------------------------------------------------------------
//    
// ---
void AdviseDoc( long pDoc ) {

	if ( !pDoc )
		pDoc = ::ksGetCurrentDocument( 0 );
	else
    ::SetObjParam(pDoc, NULL, 0, DOCUMENT_STATE);

	if ( pDoc ) {
		int docType = ::ksGetDocumentType( pDoc );
		if ( NewDocumentEvent( pDoc ) ) {
			switch( docType ) {
		  	case lt_DocSheetStandart :
			  case lt_DocSheetUser     :
					NewStampEvent( pDoc ); 
			  case lt_DocFragment      :
					NewDocument2DEvent( pDoc );
				  NewSelectMngEvent( pDoc );
				  NewObj2DEvent( pDoc, ALL_OBJ );
				  break;
			  case lt_DocPart3D :
			  case lt_DocAssemble3D : {
  		    NewDocument3DEvent(pDoc);
				  NewSelectMngEvent( pDoc );
				  NewObj3DEvent( pDoc, o3d_unknown, NULL ); //  
					break;
				}
				case lt_DocSpc:
				case lt_DocSpcUser: {
					NewSpcDocEvent( pDoc );
					NewStampEvent( pDoc ); 
					break;
				}	
				case lt_DocTxtStandart   :
				case lt_DocTxtUser       : 
					NewStampEvent( pDoc );
					break;
      }    

			switch ( docType ) {
		    case lt_DocSheetStandart:
				case lt_DocSheetUser:
				case lt_DocSpc:
        case lt_DocSpcUser:
				case lt_DocAssemble3D: {
          NewSpecificationEvent( pDoc );
					NewSpcObjectEvent( pDoc, SPC_BASE_OBJECT /*  */ );
				}
			}
		}
	}
}
