// mymfc29DView.cpp : implementation of the CMymfc29DView class
//

#include "stdafx.h"
#include "mymfc29D.h"

#include "mymfc29DDoc.h"
#include "mymfc29DView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMymfc29DView

IMPLEMENT_DYNCREATE(CMymfc29DView, CView)

BEGIN_MESSAGE_MAP(CMymfc29DView, CView)
	//{{AFX_MSG_MAP(CMymfc29DView)
	ON_COMMAND(ID_BANKOLE_LOAD, OnBankoleLoad)
	ON_UPDATE_COMMAND_UI(ID_BANKOLE_LOAD, OnUpdateBankoleLoad)
	ON_COMMAND(ID_BANKOLE_TEST, OnBankoleTest)
	ON_UPDATE_COMMAND_UI(ID_BANKOLE_TEST, OnUpdateBankoleTest)
	ON_COMMAND(ID_BANKOLE_UNLOAD, OnBankoleUnload)
	ON_UPDATE_COMMAND_UI(ID_BANKOLE_UNLOAD, OnUpdateBankoleUnload)
	ON_COMMAND(ID_CLOCKOLE_CREATEALARM, OnClockoleCreatealarm)
	ON_UPDATE_COMMAND_UI(ID_CLOCKOLE_CREATEALARM, OnUpdateClockoleCreatealarm)
	ON_COMMAND(ID_CLOCKOLE_LOAD, OnClockoleLoad)
	ON_UPDATE_COMMAND_UI(ID_CLOCKOLE_LOAD, OnUpdateClockoleLoad)
	ON_COMMAND(ID_CLOCKOLE_REFRESHTIME, OnClockoleRefreshtime)
	ON_UPDATE_COMMAND_UI(ID_CLOCKOLE_REFRESHTIME, OnUpdateClockoleRefreshtime)
	ON_COMMAND(ID_CLOCKOLE_UNLOAD, OnClockoleUnload)
	ON_UPDATE_COMMAND_UI(ID_CLOCKOLE_UNLOAD, OnUpdateClockoleUnload)
	ON_COMMAND(ID_DLLOLE_GETDATA, OnDlloleGetdata)
	ON_UPDATE_COMMAND_UI(ID_DLLOLE_GETDATA, OnUpdateDlloleGetdata)
	ON_COMMAND(ID_DLLOLE_LOAD, OnDlloleLoad)
	ON_UPDATE_COMMAND_UI(ID_DLLOLE_LOAD, OnUpdateDlloleLoad)
	ON_COMMAND(ID_DLLOLE_UNLOAD, OnDlloleUnload)
	ON_UPDATE_COMMAND_UI(ID_DLLOLE_UNLOAD, OnUpdateDlloleUnload)
	ON_COMMAND(ID_EXCELOLE_LOAD, OnExceloleLoad)
	ON_UPDATE_COMMAND_UI(ID_EXCELOLE_LOAD, OnUpdateExceloleLoad)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMymfc29DView construction/destruction

CMymfc29DView::CMymfc29DView()
{
	// TODO: add construction code here

}

CMymfc29DView::~CMymfc29DView()
{
}

BOOL CMymfc29DView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMymfc29DView drawing

void CMymfc29DView::OnDraw(CDC* pDC)
{
	CMymfc29DDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
	pDC->TextOut(100, 0, "--COleDispatchDriver usage--");
	pDC->TextOut(10, 25, "Run this program from the debugger to see test output.");
	pDC->TextOut(10, 50, "The MYMFC29A, MYMFC29B and MYMFC29C components...");
	pDC->TextOut(10, 75, "...must be built and registered prior to loading this crap...");
	pDC->TextOut(10, 100, "Originally for VC++ 6 + Excel 97 but here VC++ 6 + Excel 2003...");
}

/////////////////////////////////////////////////////////////////////////////
// CMymfc29DView diagnostics

#ifdef _DEBUG
void CMymfc29DView::AssertValid() const
{
	CView::AssertValid();
}

void CMymfc29DView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMymfc29DDoc* CMymfc29DView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMymfc29DDoc)));
	return (CMymfc29DDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMymfc29DView message handlers

void CMymfc29DView::OnBankoleLoad() 
{
	// TODO: Add your command handler code here
	if(!m_bank.CreateDispatch("mymfc29A.Bank"))
	{
		AfxMessageBox("mymfc29A.Bank component not found");
		return;
    }
	else
		AfxMessageBox("mymfc29A.Bank component found lol!");
   /*  works for an EXE component only if the interface is registered
       and the IID IID_IBank must match with your mymfc29A project.
	   You can find this IID number by checking the MYMFC29A ODL file...
   // {923011E3-CBEB-11CE-B337-88EA36DE9E4E}
   static const IID IID_IBank =
   { 0x923011e3, 0xcbeb, 0x11ce, { 0xb3, 0x37, 0x88, 0xea,
     0x36, 0xde, 0x9e, 0x4e } };
   LPDISPATCH p;
   HRESULT hr = m_bank.m_lpDispatch->QueryInterface(IID_IBank, (void**) &p);
   TRACE("OnBankoleLoad -- QueryInterface result = %x\n", hr);
   */
}

void CMymfc29DView::OnUpdateBankoleLoad(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_bank.m_lpDispatch == NULL);
}

void CMymfc29DView::OnBankoleTest() 
{
   // TODO: Add your command handler code here
   m_bank.Deposit(20.0);
   m_bank.Withdrawal(15.0);
   TRACE("new balance = %f\n", m_bank.GetBalance());
}

void CMymfc29DView::OnUpdateBankoleTest(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_bank.m_lpDispatch != NULL);
}

void CMymfc29DView::OnBankoleUnload() 
{
	// TODO: Add your command handler code here
	m_bank.ReleaseDispatch();
}

void CMymfc29DView::OnUpdateBankoleUnload(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_bank.m_lpDispatch != NULL);
}

void CMymfc29DView::OnClockoleCreatealarm() 
{
	// TODO: Add your command handler code here
	CAlarmDialog dlg;
	if (dlg.DoModal() == IDOK)
	{
		COleDateTime dt(2005, 12, 23, dlg.m_nHours, dlg.m_nMinutes,
			dlg.m_nSeconds);
		LPDISPATCH pAlarm = m_clock.CreateAlarm(dt);
		m_alarm.AttachDispatch(pAlarm);  // releases prior object!
		m_clock.RefreshWin();
	}
}

void CMymfc29DView::OnUpdateClockoleCreatealarm(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_clock.m_lpDispatch != NULL);
}

void CMymfc29DView::OnClockoleLoad() 
{
	// TODO: Add your command handler code here
	if(!m_clock.CreateDispatch("mymfc29C.Document"))
	{
		AfxMessageBox("mymfc29C.Document component not found");
		return;
    }
   m_clock.SetFigure(0, COleVariant("XII"));
   m_clock.SetFigure(1, COleVariant("III"));
   m_clock.SetFigure(2, COleVariant("VI"));
   m_clock.SetFigure(3, COleVariant("IX"));
   OnClockoleRefreshtime();
   m_clock.ShowWin();
}

void CMymfc29DView::OnUpdateClockoleLoad(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_clock.m_lpDispatch == NULL);
}

void CMymfc29DView::OnClockoleRefreshtime() 
{
   // TODO: Add your command handler code here
   COleDateTime now = COleDateTime::GetCurrentTime();
   m_clock.SetTime(now);
   m_clock.RefreshWin();
}

void CMymfc29DView::OnUpdateClockoleRefreshtime(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_clock.m_lpDispatch != NULL);
}

void CMymfc29DView::OnClockoleUnload() 
{
	// TODO: Add your command handler code here
	m_clock.ReleaseDispatch();
}

void CMymfc29DView::OnUpdateClockoleUnload(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_clock.m_lpDispatch != NULL);
}

void CMymfc29DView::OnDlloleGetdata() 
{
   // TODO: Add your command handler code here
   m_auto.DisplayDialog();
   COleVariant vaData = m_auto.GetTextData();
   ASSERT(vaData.vt == VT_BSTR);
   CString strTextData = vaData.bstrVal;
   long lData = m_auto.GetLongData();
   TRACE("CMymfc29DView::OnDlloleGetdata -- long = %ld, text = %s\n",
         lData, strTextData);
}

void CMymfc29DView::OnUpdateDlloleGetdata(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_auto.m_lpDispatch != NULL);
}

void CMymfc29DView::OnDlloleLoad() 
{
	// TODO: Add your command handler code here
	if(!m_auto.CreateDispatch("mymfc29B.Auto"))
	{
		AfxMessageBox("mymfc29B.Auto component not found");
		return;
    }
	else
	{
	AfxMessageBox("mymfc29B.Auto found lor!!!");
    m_auto.SetTextData(COleVariant("test string"));  // testing
    m_auto.SetLongData(88);  // testing
	// verify the primary dispatch interface must match with the Mymfc29B.odl
    // You should check your IID_IMymfc29BAuto dispinterface in your
    // Mymfc29B.odl file in MYMFC29B project...
    // {7A97BA38-BF4A-4586-93C6-72B5EE7E0DC2}
	static const IID IID_IMymfc29BAuto = 
	{ 0x7a97ba38, 0xbf4a, 0x4586, { 0x93, 0xc6, 0x72, 0xb5, 0xee, 0x7e, 0xd, 0xc2 } };

	LPDISPATCH p;
	HRESULT hr = m_auto.m_lpDispatch->QueryInterface(IID_IMymfc29BAuto, (void**) &p);
	TRACE("OnDlloleLoad -- QueryInterface result = %x\n", hr);
	p->Release();
	}
}

void CMymfc29DView::OnUpdateDlloleLoad(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_auto.m_lpDispatch == NULL);
}

void CMymfc29DView::OnDlloleUnload() 
{
	// TODO: Add your command handler code here
	m_auto.ReleaseDispatch();
}

void CMymfc29DView::OnUpdateDlloleUnload(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_auto.m_lpDispatch != NULL);
}

// The following code seems not working for Excel 10/11 Office 2000/2003
// because of the obsolete classes. At least two functions will generate error,
// m_app.GetWorkbooks() and m_workbooks.Add()...
// It is for Excel8.olb/Office 97...and the menu item
// for the Excel Comp Execute also has been omitted for this example...

/*
LPDISPATCH pRange, pWorkbooks;
    
   CWnd* pWnd = CWnd::FindWindow("XLMAIN", NULL);
   if (pWnd != NULL) {
     TRACE("Excel window found\n");
     pWnd->ShowWindow(SW_SHOWNORMAL);
     pWnd->UpdateWindow();
     pWnd->BringWindowToTop();
   }

   m_app.SetSheetsInNewWorkbook(1);
   
   VERIFY(pWorkbooks = m_app.GetWorkbooks());
   m_workbooks.AttachDispatch(pWorkbooks);

   LPDISPATCH pWorkbook = NULL;
   if (m_workbooks.GetCount() == 0) {
      // Add returns a Workbook pointer, but we
      //  don't have a Workbook class
      pWorkbook = m_workbooks.Add(); // Save the pointer for
                                     //  later release
   }
   LPDISPATCH pWorksheets = m_app.GetWorksheets();
   ASSERT(pWorksheets != NULL);
   m_worksheets.AttachDispatch(pWorksheets);
   LPDISPATCH pWorksheet = m_worksheets.GetItem(COleVariant((short) 1));

   m_worksheet.AttachDispatch(pWorksheet);
   m_worksheet.Select();

   VERIFY(pRange = m_worksheet.GetRange(COleVariant("A1")));
   m_range[0].AttachDispatch(pRange);

   VERIFY(pRange = m_worksheet.GetRange(COleVariant("A2")));
   m_range[1].AttachDispatch(pRange);
   
   VERIFY(pRange = m_worksheet.GetRange(COleVariant("A3")));
   m_range[2].AttachDispatch(pRange);

   VERIFY(pRange = m_worksheet.GetRange(COleVariant("A3"), COleVariant("C5")));
   m_range[3].AttachDispatch(pRange);

   VERIFY(pRange = m_worksheet.GetRange(COleVariant("A6")));
   m_range[4].AttachDispatch(pRange);
   
   m_range[4].SetValue(COleVariant(COleDateTime(2005, 4, 24, 15, 47, 8)));
   // retrieve the stored date and print it as a string
   COleVariant vaTimeDate = m_range[4].GetValue();
   TRACE("returned date type = %d\n", vaTimeDate.vt);
   COleVariant vaTemp;
   vaTemp.ChangeType(VT_BSTR, &vaTimeDate);
   CString str = vaTemp.bstrVal;
   TRACE("date = %s\n", (const char*) str);

   m_range[0].SetValue(COleVariant("test string"));
   
   COleVariant vaResult0 = m_range[0].GetValue();
   if (vaResult0.vt == VT_BSTR) {
     CString str = vaResult0.bstrVal;
     TRACE("vaResult0 = %s\n", (const char*) str);
   }

   m_range[1].SetValue(COleVariant(3.14159));
   
   COleVariant vaResult1 = m_range[1].GetValue();
   if (vaResult1.vt == VT_R8) {
     TRACE("vaResult1 = %f\n", vaResult1.dblVal);
   }
   
   m_range[2].SetFormula(COleVariant("=$A2*2.0"));
   
   COleVariant vaResult2 = m_range[2].GetValue();
   if (vaResult2.vt == VT_R8) {
     TRACE("vaResult2 = %f\n", vaResult2.dblVal);
   }

   COleVariant vaResult2a = m_range[2].GetFormula();
   if (vaResult2a.vt == VT_BSTR) {
     CString str = vaResult2a.bstrVal;
     TRACE("vaResult2a = %s\n", (const char*) str);
   }
   
   m_range[3].FillRight();
   m_range[3].FillDown();
   
	// cleanup  
    if (pWorkbook != NULL) {
	    pWorkbook->Release();
   }
}

void CMymfc29DView::OnUpdateExceloleExecute(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_app.m_lpDispatch != NULL);
}*/

// The following code should be ok but do nothing, just load the Excel OLE
void CMymfc29DView::OnExceloleLoad() 
{
   // TODO: Add your command handler code here
   // if Excel is already running, attach to it, otherwise start it
   LPDISPATCH pDisp;
   LPUNKNOWN pUnk;
   CLSID clsid;
   TRACE("Entering CMymfc29DView::OnExcelLoad\n");
   BeginWaitCursor();
   // Excel for Office 2003. Adjust accordingly for your Excel version
   ::CLSIDFromProgID(L"Excel.Application.11", &clsid); // from registry
   if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK)
   {
      VERIFY(pUnk->QueryInterface(IID_IDispatch, (void**) &pDisp) == S_OK);
      m_app.AttachDispatch(pDisp);
      pUnk->Release();
      TRACE(" attach complete\n");
	  // you can use SPY++ to verify your Excel process is attached...
	} 
   else
   {
	   // Excel for Office 2003. Adjust accordingly for your Excel version
	   if(!m_app.CreateDispatch("Excel.Application.11"))
	   {
			AfxMessageBox("Excel program not found");
	   }
       TRACE(" create complete\n");
   }
   EndWaitCursor();
}

void CMymfc29DView::OnUpdateExceloleLoad(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_app.m_lpDispatch == NULL);
}


