// vcprjDlg.cpp : implementation file
//

#include "stdafx.h"
#include "vcprj.h"
#include "vcprjDlg.h"
#include <ldefin2d.h>

#ifdef __LIGHT_VERSION__
#include <klAPI5.h>
#else
#include <kAPI5.h>
#endif

#include <ksConstants.h>

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

CString g_szError;
CDialog * dlg;
KompasObject kompas(NULL);

int  libraryId;   // HANDLE  

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CVcprjDlg dialog

CVcprjDlg::CVcprjDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CVcprjDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CVcprjDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CVcprjDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CVcprjDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CVcprjDlg, CDialog)
	//{{AFX_MSG_MAP(CVcprjDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_GRAPHIC_LOAD, OnGraphicLoad)
	ON_BN_CLICKED(IDC_BUTTON1, OnQuitUnload)
	ON_BN_CLICKED(IDC_BUTTON2, OnQuitWOUnload)
	ON_BN_CLICKED(IDC_BUTTON3, OnLoadFile)
	ON_BN_CLICKED(IDC_BUTTON4, OnNewFile)
	ON_BN_CLICKED(IDC_BUTTON5, OnExecuteCommand)
	ON_BN_CLICKED(IDC_BUTTON6, OnUnloadGraphic)
	ON_BN_CLICKED(IDC_BUTTON7, OnLoadLibrary)
	ON_BN_CLICKED(IDC_BUTTON8, OnRunLibraryCommand)
	ON_BN_CLICKED(IDC_BUTTON9, OnUnloadLibrary)
	ON_BN_CLICKED(IDC_BUTTON10, OnSaveFile)
	ON_BN_CLICKED(IDC_BUTTON11, OnCloseFile)
	ON_BN_CLICKED(IDC_GRAPHIC_LOAD2, OnGraphicLoad2)
	ON_BN_CLICKED(IDC_BUTTON12, OnVisible)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CVcprjDlg message handlers

BOOL CVcprjDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// COM
	CoInitialize( NULL );
	g_szError.LoadString(IDS_ERROR);
	dlg = this;
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CVcprjDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.
void CVcprjDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CVcprjDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//---------------------------------------------------------------------------
//    
//---------------------------------------------------------------------------
void CVcprjDlg::OnGraphicLoad() 
{
  if ( !kompas.m_lpDispatch ) {
    
    #ifdef __LIGHT_VERSION__
      kompas.CreateDispatch( _T("KOMPASLT.Application.5") );
    #else
      kompas.CreateDispatch( _T("KOMPAS.Application.5") );
    #endif
      
  	if ( kompas.m_lpDispatch ) {
//      kompas.LoadDSK();
	    kompas.SetVisible( true ); 
    }
  }
}

//---------------------------------------------------------------------------
//  
//---------------------------------------------------------------------------
BOOL CVcprjDlg::DestroyWindow() 
{
	// COM
  OnQuitWOUnload(); 
	CoUninitialize();	
	return CDialog::DestroyWindow();
}

//---------------------------------------------------------------------------
//    
//---------------------------------------------------------------------------
void CVcprjDlg::OnQuitUnload() 
{
  if ( kompas.m_lpDispatch ) {  
    kompas.Quit();  
    kompas.ReleaseDispatch();
  }
  EndDialog(IDOK); // 
}

//---------------------------------------------------------------------------
//     
//---------------------------------------------------------------------------
void CVcprjDlg::OnQuitWOUnload() 
{
  if ( kompas.m_lpDispatch ) {
    //    
	kompas.ReleaseDispatch(); 
  }
  EndDialog(IDOK); // 
}

//---------------------------------------------------------------------------
//   
//---------------------------------------------------------------------------
void CVcprjDlg::OnLoadFile() 
{
  try {
    if ( kompas.m_lpDispatch ) {	
	    CFileDialog openFileDialog( TRUE/* bOpenFileDialog*/,
	      NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
	    CString("(*.cdw)|*.cdw|(*.frw)|*.frw|(*.m3d)|*.m3d|(*.a3d)|*.a3d|(*.spw)|*.spw|") );
	    if( openFileDialog.DoModal() == IDOK ) {
	      //       
	      //      -   
	      //           " . ?"   
	      //      -   IDispatch,         
	      //    -  HANDLE  
       long type =  kompas.ksGetDocumentTypeByName(openFileDialog.GetPathName());
       ksDocument3D doc3D;
       ksDocument2D doc2D;
       ksSpcDocument docSpc;
       ksDocumentTxt docTxt;
       switch (type) {
         case lt_DocPart3D:    //3d 
         case lt_DocAssemble3D:
           doc3D = kompas.Document3D();
   	       if ( doc3D )
            doc3D.Open( openFileDialog.GetPathName(), 0 );
         break;
         case lt_DocSheetStandart : //2d 
         case lt_DocFragment:
           doc2D = kompas.Document2D();
   	       if ( doc2D )
            doc2D.ksOpenDocument( openFileDialog.GetPathName(), 0 );
         break;
         case lt_DocSpc:          //
           docSpc = kompas.SpcDocument();
   	       if ( docSpc )
            docSpc.ksOpenDocument( openFileDialog.GetPathName(), 0 );

         break;
         case lt_DocTxtStandart:  // 
           docTxt = kompas.DocumentTxt();
   	       if ( docTxt )
            docTxt.ksOpenDocument( openFileDialog.GetPathName(), 0 );

         break;

       }
       long err = kompas.ksReturnResult();
       if (err)
         kompas.ksResultNULL();
       // doc.close();
       //  kompas.ksMessageBoxResult();
	    }
    }
    else
      AfxMessageBox("  ");
  }
  catch (... ) 
  {
    AfxMessageBox(",     "); 
    kompas.ReleaseDispatch(); 
  }
}

//---------------------------------------------------------------------------
//  
//---------------------------------------------------------------------------
void CVcprjDlg::OnNewFile() 
{
  if ( kompas.m_lpDispatch ) {
//        
//        -   
//        0 -  
//        1 - 
//        2 -  
//        3 - 
//        4 - 3D-
//             " . ?"   
//        -   IDispatch,         
//      -  HANDLE  
    ksDocument2D doc = kompas.Document2D();    
    if ( doc.m_lpDispatch ) {
      ksDocumentParam docPar( kompas.GetParamStruct(ko_DocumentParam) );
      if ( docPar.m_lpDispatch ) {
        docPar.Init();
        docPar.SetType( lt_DocSheetStandart );
        doc.ksCreateDocument( (LPDISPATCH) docPar ); 
      }
    }
  }
}

//---------------------------------------------------------------------------
//    API 
//---------------------------------------------------------------------------
void CVcprjDlg::OnExecuteCommand() 
{
  if ( kompas.m_lpDispatch ) {
    ksDocument2D doc = kompas.Document2D();
    if ( doc.m_lpDispatch ) {
      doc.ksCircle( 50, 50, 20, 1);
      doc.ksCircle( 50, 50, 50, 2 );
      kompas.ksMessage( "" );
    }
	}	
}

//---------------------------------------------------------------------------
// 
//---------------------------------------------------------------------------
void CVcprjDlg::OnUnloadGraphic() 
{
  if ( kompas.m_lpDispatch ) {
    kompas.Quit(); 
    kompas.ReleaseDispatch();
  }
}

//---------------------------------------------------------------------------
//  
//---------------------------------------------------------------------------
void CVcprjDlg::OnLoadLibrary() 
{
  if ( kompas.m_lpDispatch ) {
	CFileDialog openFileDialog( TRUE,
      NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
	  CString("(*.rtw)|*.rtw|") );
	if( openFileDialog.DoModal() == IDOK ) {
		//     
		//    -  HANDLE  
    libraryId = kompas.ksAttachKompasLibrary( openFileDialog.GetPathName() );
  }
  }
}

//---------------------------------------------------------------------------
//   
//---------------------------------------------------------------------------
void CVcprjDlg::OnRunLibraryCommand() 
{
  if ( kompas.m_lpDispatch ) {
    if ( !libraryId )
      OnLoadLibrary();
//          
//        - HANDLE 
//        -   
    kompas.ksExecuteKompasLibraryCommand( libraryId, 1 );
  }
}

//---------------------------------------------------------------------------
// 
//---------------------------------------------------------------------------
void CVcprjDlg::OnUnloadLibrary() 
{
  if ( kompas.m_lpDispatch && libraryId ) {
    kompas.ksDetachKompasLibrary( libraryId );
	libraryId = 0;
  }
}

//---------------------------------------------------------------------------
// 
//---------------------------------------------------------------------------
void CVcprjDlg::OnSaveFile() 
{
  if ( kompas.m_lpDispatch ) {
    ksDocument2D doc = kompas.ActiveDocument2D();
    if ( doc ) 
      doc.ksSaveDocument(0);  
  }
}

//---------------------------------------------------------------------------
// 
//---------------------------------------------------------------------------
void CVcprjDlg::OnCloseFile() 
{
  if ( kompas.m_lpDispatch ) {
    ksDocument2D doc = kompas.ActiveDocument2D();
    if ( doc ) 
      doc.ksCloseDocument(); 
  }
}

void CVcprjDlg::OnGraphicLoad2() 
{
	// TODO: Add your control notification handler code here
  if ( !kompas.m_lpDispatch ) {
    CLSID clsid;
    
    #ifdef __LIGHT_VERSION__
      HRESULT hr = CLSIDFromProgID(L"KOMPASLT.Application.5", &clsid );
    #else
      HRESULT hr = CLSIDFromProgID(L"KOMPAS.Application.5", &clsid );
    #endif
    
    if ( hr == NOERROR) {
   	  //       
      LPUNKNOWN lpUnk;
      LPDISPATCH lpDispatch;
      if (GetActiveObject(clsid, NULL, &lpUnk) == NOERROR)
      {
        HRESULT hr = lpUnk->QueryInterface(IID_IDispatch, (LPVOID*)&lpDispatch);
        lpUnk->Release();
        if (hr == NOERROR)
          kompas.AttachDispatch(lpDispatch, FALSE);
      }
      
    }
    
    if ( kompas.m_lpDispatch ) {
      kompas.SetVisible( true ); 
    }
    else
      AfxMessageBox("   ");
  }
  else
    AfxMessageBox("  ");	
	
}

void CVcprjDlg::OnVisible() 
{
	// TODO: Add your control notification handler code here
	try {
    if ( kompas.m_lpDispatch ) {
      kompas.SetVisible( !kompas.GetVisible() ); 
    }
    else
      AfxMessageBox("  ");
  }
  catch (... ) 
  {
    AfxMessageBox(",     "); 
    kompas.ReleaseDispatch(); 
  }

}
