// PanelDlg.cpp : 実装ファイル
//

#include "stdafx.h"
#include "Panel.h"
#include "PanelDlg.h"
#include "CAO_i.c"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CPanelDlg ダイアログ
CPanelDlg::CPanelDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPanelDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_eng  = NULL;
	m_wss  = NULL;
	m_ws   = NULL;
	m_ctrl = NULL;
	m_var1 = NULL;
	m_var2 = NULL;
	m_var3 = NULL;
	m_var4 = NULL;
	m_var5 = NULL;
	m_var6 = NULL;

	brDefault.CreateSolidBrush(RGB(240, 240, 240));
	brRed.CreateSolidBrush(RGB(255, 0, 0));
	brGreen.CreateSolidBrush(RGB(0, 255, 0));
	brYellow.CreateSolidBrush(RGB(255, 255, 0));

	pbrVar4 = &brDefault;
	pbrVar5 = &brDefault;
	pbrVar6 = &brDefault;
}

void CPanelDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_BUTTON_CONNECT, btnConnect);
	DDX_Control(pDX, IDC_BUTTON_DISCONNECT, btnDisconnect);
	DDX_Control(pDX, IDC_BUTTON_REFRESH, btnRefresh);
	DDX_Control(pDX, IDC_BUTTON_WRITE_VAR1, btnWriteVar1);
	DDX_Control(pDX, IDC_BUTTON_WRITE_VAR2, btnWriteVar2);
	DDX_Control(pDX, IDC_BUTTON_WRITE_VAR3, btnWriteVar3);
	DDX_Control(pDX, IDC_EDIT_VAR1, txtVar1);
	DDX_Control(pDX, IDC_EDIT_VAR2, txtVar2);
	DDX_Control(pDX, IDC_EDIT_VAR3, txtVar3);
	DDX_Control(pDX, IDC_LABEL_ATTR_VAR4, lblShowVar4);
	DDX_Control(pDX, IDC_LABEL_ATTR_VAR5, lblShowVar5);
	DDX_Control(pDX, IDC_LABEL_ATTR_VAR6, lblShowVar6);
}

BEGIN_MESSAGE_MAP(CPanelDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CPanelDlg::OnBnClickedButtonConnect)
	ON_BN_CLICKED(IDC_BUTTON_DISCONNECT, &CPanelDlg::OnBnClickedButtonDisconnect)
	ON_BN_CLICKED(IDC_BUTTON_REFRESH, &CPanelDlg::OnBnClickedButtonRefresh)
	ON_BN_CLICKED(IDC_BUTTON_WRITE_VAR1, &CPanelDlg::OnBnClickedButtonWriteVar1)
	ON_BN_CLICKED(IDC_BUTTON_WRITE_VAR2, &CPanelDlg::OnBnClickedButtonWriteVar2)
	ON_BN_CLICKED(IDC_BUTTON_WRITE_VAR3, &CPanelDlg::OnBnClickedButtonWriteVar3)
	ON_WM_DESTROY()
	ON_WM_CTLCOLOR()
END_MESSAGE_MAP()


// CPanelDlg メッセージ ハンドラ
BOOL CPanelDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
	//  Framework は、この設定を自動的に行います。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンの設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンの設定

	CoInitialize(NULL);
	CoCreateInstance(CLSID_CaoEngine, NULL, CLSCTX_LOCAL_SERVER, IID_ICaoEngine, (void**)&m_eng);
	m_eng->get_Workspaces(&m_wss);
	m_wss->Item(CComVariant(0L), &m_ws);

	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

void CPanelDlg::OnDestroy()
{
	CDialog::OnDestroy();

	OnBnClickedButtonDisconnect();

	if(m_ws)
	{
		m_ws->Release();
		m_ws = NULL;
	}

	if(m_wss)
	{
		m_wss->Release();
		m_wss = NULL;
	}

	if(m_eng)
	{
		m_eng->Release();
		m_eng = NULL;
	}

	CoUninitialize();
}

// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための
//  下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、
//  これは、Framework によって自動的に設定されます。

void CPanelDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 描画のデバイス コンテキスト

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// クライアントの四角形領域内の中央
		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;

		// アイコンの描画
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

HBRUSH CPanelDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	LOGBRUSH logbr;

	int ID = pWnd->GetDlgCtrlID();

	switch(ID) {
		case IDC_LABEL_ATTR_VAR4:
			pbrVar4->GetLogBrush(&logbr);
			pDC->SetBkColor(logbr.lbColor);
			return *pbrVar4;
		case IDC_LABEL_ATTR_VAR5:
			pbrVar5->GetLogBrush(&logbr);
			pDC->SetBkColor(logbr.lbColor);
			return *pbrVar5;
		case IDC_LABEL_ATTR_VAR6:
			pbrVar6->GetLogBrush(&logbr);
			pDC->SetBkColor(logbr.lbColor);
			return *pbrVar6;
	}

	return hbr;
}

void CPanelDlg::ChangeColor(CStatic& lblShow)
{
	CRect rcColor;
	lblShow.GetWindowRect(rcColor);
	ScreenToClient(rcColor);
	InvalidateRect(rcColor);
}

// ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、
//  システムがこの関数を呼び出します。
HCURSOR CPanelDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void CPanelDlg::OnBnClickedButtonConnect()
{
	HRESULT hr = E_FAIL;

	if(m_ws != NULL)
	{
		// Connect Dummy.Panel Provider
		hr = m_ws->AddController(CComBSTR("Panel"), CComBSTR("CaoProv.Dummy.Panel"), CComBSTR(""), CComBSTR(""), &m_ctrl);
		
		if(SUCCEEDED(hr))
		{
			// Get Variable object
			hr = m_ctrl->AddVariable(CComBSTR("Variable1"), CComBSTR(""), &m_var1);
			hr = m_ctrl->AddVariable(CComBSTR("Variable2"), CComBSTR(""), &m_var2);
			hr = m_ctrl->AddVariable(CComBSTR("Variable3"), CComBSTR(""), &m_var3);
			hr = m_ctrl->AddVariable(CComBSTR("Variable4"), CComBSTR(""), &m_var4);
			hr = m_ctrl->AddVariable(CComBSTR("Variable5"), CComBSTR(""), &m_var5);
			hr = m_ctrl->AddVariable(CComBSTR("Variable6"), CComBSTR(""), &m_var6);
		}
	}

	if(SUCCEEDED(hr))
	{
		btnConnect.EnableWindow(FALSE);
		btnDisconnect.EnableWindow(TRUE);
		btnRefresh.EnableWindow(TRUE);
		btnWriteVar1.EnableWindow(TRUE);
		btnWriteVar2.EnableWindow(TRUE);
		btnWriteVar3.EnableWindow(TRUE);
	}
	else
	{
		OnBnClickedButtonDisconnect();
		ShowErrorMessage(hr);
	}
}

void CPanelDlg::OnBnClickedButtonDisconnect()
{
	if(m_var1)
	{
		m_var1->Release();
		m_var1 = NULL;
	}

	if(m_var2)
	{
		m_var2->Release();
		m_var2 = NULL;
	}

	if(m_var3)
	{
		m_var3->Release();
		m_var3 = NULL;
	}

	if(m_var4)
	{
		m_var4->Release();
		m_var4 = NULL;
	}

	if(m_var5)
	{
		m_var5->Release();
		m_var5 = NULL;
	}

	if(m_var6)
	{
		m_var6->Release();
		m_var6 = NULL;
	}

	// Disconnect Provider
	if(m_ctrl)
	{
		if(m_ws)
		{
			CComVariant vntCtrlName;
			CComPtr<ICaoControllers> ctrls;

			m_ws->get_Controllers(&ctrls);

			vntCtrlName.vt = VT_BSTR;
			m_ctrl->get_Name(&vntCtrlName.bstrVal);

			ctrls->Remove(vntCtrlName);
		}

		m_ctrl->Release();
		m_ctrl = NULL;
	}

	btnConnect.EnableWindow(TRUE);
	btnDisconnect.EnableWindow(FALSE);
	btnRefresh.EnableWindow(FALSE);
	btnWriteVar1.EnableWindow(FALSE);
	btnWriteVar2.EnableWindow(FALSE);
	btnWriteVar3.EnableWindow(FALSE);
}

void CPanelDlg::OnBnClickedButtonRefresh()
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;

	// Read "Variable1"
	hr = m_var1->get_Value(&vntValue);
	VariantChangeType(&vntValue, &vntValue, 0, VT_BSTR);

	if(SUCCEEDED(hr))
	{
		strValue.Format(_T("%ls"), vntValue.bstrVal);
		txtVar1.SetWindowText(strValue);
	}
	else
	{
		ShowErrorMessage(hr);
	}
	vntValue.Clear();

	// Read "Variable2"
	hr = m_var2->get_Value(&vntValue);
	VariantChangeType(&vntValue, &vntValue, 0, VT_BSTR);

	if(SUCCEEDED(hr))
	{
		strValue.Format(_T("%ls"), vntValue.bstrVal);
		txtVar2.SetWindowText(strValue);
	}
	else
	{
		ShowErrorMessage(hr);
	}
	vntValue.Clear();

	// Read "Variable3"
	hr = m_var3->get_Value(&vntValue);
	VariantChangeType(&vntValue, &vntValue, 0, VT_BSTR);

	if(SUCCEEDED(hr))
	{
		strValue.Format(_T("%ls"), vntValue.bstrVal);
		txtVar3.SetWindowText(strValue);
	}
	else
	{
		ShowErrorMessage(hr);
	}
	vntValue.Clear();

	// Check attribute "ON"
	hr = m_var4->get_Attribute(&vntValue.lVal);
	
	if(SUCCEEDED(hr))
	{
		if(vntValue.lVal == 1)
		{
			pbrVar4 = &brGreen;
		}
		else
		{
			pbrVar4 = &brDefault;
		}
		ChangeColor(lblShowVar4);
	}
	else
	{
		ShowErrorMessage(hr);
	}

	// Check attribute "--MANUAL--"
	hr = m_var5->get_Attribute(&vntValue.lVal);
	
	if(SUCCEEDED(hr))
	{
		if(vntValue.lVal == 1)
		{
			pbrVar5 = &brYellow;
		}
		else
		{
			pbrVar5 = &brDefault;
		}
		ChangeColor(lblShowVar5);
	}
	else
	{
		ShowErrorMessage(hr);
	}

	// Check attribute "<<EMG>>"
	hr = m_var6->get_Attribute(&vntValue.lVal);
	
	if(SUCCEEDED(hr))
	{
		if(vntValue.lVal == 1)
		{
			pbrVar6 = &brRed;
		}
		else
		{
			pbrVar6 = &brDefault;
		}
		ChangeColor(lblShowVar6);
	}
	else
	{
		ShowErrorMessage(hr);
	}
}

void CPanelDlg::OnBnClickedButtonWriteVar1()
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;

	txtVar1.GetWindowText(strValue);

	vntValue.vt = VT_BSTR;
	vntValue.bstrVal = strValue.AllocSysString();

	// Write "Variable 1"
	hr = m_var1->put_Value(vntValue);

	if(FAILED(hr))
	{
		ShowErrorMessage(hr);
	}
}

void CPanelDlg::OnBnClickedButtonWriteVar2()
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;

	txtVar2.GetWindowText(strValue);

	vntValue.vt = VT_BSTR;
	vntValue.bstrVal = strValue.AllocSysString();

	// Write "Variable 2"
	hr = m_var2->put_Value(vntValue);

	if(FAILED(hr))
	{
		ShowErrorMessage(hr);
	}
}

void CPanelDlg::OnBnClickedButtonWriteVar3()
{
	HRESULT hr;
	CString strValue;
	CComVariant vntValue;

	txtVar3.GetWindowText(strValue);

	vntValue.vt = VT_BSTR;
	vntValue.bstrVal = strValue.AllocSysString();

	// Write "Variable 3"
	hr = m_var3->put_Value(vntValue);

	if(FAILED(hr))
	{
		ShowErrorMessage(hr);
	}
}

void CPanelDlg::ShowErrorMessage(HRESULT hr)
{
	CString strMsg;
	strMsg.Format(_T("%X"), hr);
	MessageBox(strMsg, _T("Error"));
}