// PagePlcList.cpp : ʵÏÖÎļþ
|
//
|
|
#include "stdafx.h"
|
#include "BoounionPLC.h"
|
#include "PagePlcList.h"
|
#include "afxdialogex.h"
|
#include "Common.h"
|
|
|
// CPagePlcList ¶Ô»°¿ò
|
|
IMPLEMENT_DYNAMIC(CPagePlcList, CDialogEx)
|
|
CPagePlcList::CPagePlcList(CWnd* pParent /*=NULL*/)
|
: CDialogEx(IDD_PAGE_PLC_LIST, pParent)
|
{
|
m_crBkgnd = PAGE_PLC_LIST_BACKGROUND;
|
m_hbrBkgnd = nullptr;
|
m_pObserver = nullptr;
|
}
|
|
CPagePlcList::~CPagePlcList()
|
{
|
}
|
|
void CPagePlcList::DoDataExchange(CDataExchange* pDX)
|
{
|
CDialogEx::DoDataExchange(pDX);
|
DDX_Control(pDX, IDC_TREE1, m_treeCtrl);
|
}
|
|
|
BEGIN_MESSAGE_MAP(CPagePlcList, CDialogEx)
|
ON_WM_CTLCOLOR()
|
ON_WM_DESTROY()
|
ON_WM_SIZE()
|
ON_MESSAGE(ID_MSG_TREE_CLICK_ITEM, OnTreeClickItem)
|
END_MESSAGE_MAP()
|
|
|
// CPagePlcList ÏûÏ¢´¦Àí³ÌÐò
|
|
|
void CPagePlcList::InitRxWindows()
|
{
|
/* code */
|
// ¶©ÔÄÊý¾Ý
|
IRxWindows* pRxWindows = RX_GetRxWindows();
|
pRxWindows->enableLog(5);
|
if (m_pObserver == NULL) {
|
m_pObserver = pRxWindows->allocObserver([&](IAny* pAny) -> void {
|
// onNext
|
pAny->addRef();
|
int code = pAny->getCode();
|
if (RX_CODE_ADD_PLC == code) {
|
CPLC* pPlc;
|
if (pAny->getPtrValue("ptr", (void*&)pPlc)) {
|
HTREEITEM hItem = m_treeCtrl.InsertItem(pPlc->getName().c_str(), nullptr, nullptr);
|
m_treeCtrl.SetItemData(hItem, (DWORD_PTR)pPlc);
|
m_treeCtrl.ShowWindow(SW_SHOW);
|
GetDlgItem(IDC_LABEL_NO_PLC)->ShowWindow(SW_HIDE);
|
}
|
}
|
else if (RX_CODE_REMOVE_PLC == code) {
|
CPLC* pPlc;
|
if (pAny->getPtrValue("ptr", (void*&)pPlc)) {
|
HTREEITEM hItem = FindItem(pPlc);
|
if (hItem != nullptr) {
|
m_treeCtrl.DeleteItem(hItem);
|
}
|
BOOL bNoPLC = m_treeCtrl.GetChildItem(nullptr) == nullptr;
|
m_treeCtrl.ShowWindow(bNoPLC ? SW_HIDE : SW_SHOW);
|
GetDlgItem(IDC_LABEL_NO_PLC)->ShowWindow(bNoPLC ? SW_SHOW : SW_HIDE);
|
}
|
}
|
|
pAny->release();
|
}, [&]() -> void {
|
// onComplete
|
}, [&](IThrowable* pThrowable) -> void {
|
// onErrorm
|
pThrowable->printf();
|
});
|
|
theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread())
|
->subscribe(m_pObserver);
|
}
|
}
|
|
BOOL CPagePlcList::OnInitDialog()
|
{
|
CDialogEx::OnInitDialog();
|
InitRxWindows();
|
|
|
HFONT hFontDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
|
LOGFONT lf;
|
::GetObject(hFontDefault, sizeof(LOGFONT), &lf);
|
lf.lfHeight -= 8;
|
lf.lfWeight = 400;
|
m_fontNoPlc.CreateFontIndirect(&lf);
|
GetDlgItem(IDC_LABEL_NO_PLC)->SetFont(&m_fontNoPlc);
|
|
|
m_treeCtrl.SetBkColor(PAGE_PLC_LIST_BACKGROUND);
|
m_treeCtrl.SetItemHeight(50);
|
ReadPLCList();
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
// Òì³£: OCX ÊôÐÔÒ³Ó¦·µ»Ø FALSE
|
}
|
|
|
HBRUSH CPagePlcList::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
|
{
|
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
|
|
if (nCtlColor == CTLCOLOR_STATIC) {
|
pDC->SetBkColor(m_crBkgnd);
|
}
|
|
if (pWnd->GetDlgCtrlID() == IDC_LABEL_NO_PLC) {
|
pDC->SetTextColor(RGB(128, 128, 128));
|
}
|
|
if (m_hbrBkgnd == nullptr) {
|
m_hbrBkgnd = CreateSolidBrush(m_crBkgnd);
|
}
|
|
return m_hbrBkgnd;
|
}
|
|
|
void CPagePlcList::OnDestroy()
|
{
|
CDialogEx::OnDestroy();
|
|
if (m_pObserver != nullptr) {
|
m_pObserver->unsubscribe();
|
m_pObserver = NULL;
|
}
|
}
|
|
void CPagePlcList::OnSize(UINT nType, int cx, int cy)
|
{
|
CDialogEx::OnSize(nType, cx, cy);
|
if (GetDlgItem(IDC_TREE1) == nullptr) return;
|
|
CWnd* pItem;
|
CRect rcClient, rcItem;
|
GetClientRect(&rcClient);
|
GetDlgItem(IDC_TREE1)->MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24);
|
GetDlgItem(IDC_TOOLBAR_LINE1)->MoveWindow(rcClient.right - 3, 0,
|
2, rcClient.Height());
|
GetDlgItem(IDC_TOOLBAR_LINE1)->Invalidate();
|
|
pItem = GetDlgItem(IDC_LABEL_NO_PLC);
|
pItem->GetClientRect(&rcItem);
|
pItem->MoveWindow((rcClient.Width() - rcItem.Width()) / 2, (rcClient.Height() - rcItem.Height()) / 2,
|
rcItem.Width(), rcItem.Height());
|
}
|
|
LRESULT CPagePlcList::OnTreeClickItem(WPARAM wParam, LPARAM lParam)
|
{
|
HTREEITEM hItem = (HTREEITEM)wParam;
|
ASSERT(hItem);
|
CPLC* pPlc = (CPLC*)m_treeCtrl.GetItemData(hItem);
|
ASSERT(pPlc);
|
theApp.m_model.notifyPtr(RX_CODE_SELECT_PLC, pPlc);
|
|
return 0;
|
}
|
|
void CPagePlcList::ReadPLCList()
|
{
|
std::map<std::string, CPLC*>& plcs = theApp.m_model.getPlcMap();
|
for (auto item : plcs) {
|
HTREEITEM hItem = m_treeCtrl.InsertItem(item.second->getName().c_str(), nullptr, nullptr);
|
m_treeCtrl.SetItemData(hItem, (DWORD_PTR)item.second);
|
}
|
if (!plcs.empty()) {
|
m_treeCtrl.ShowWindow(SW_SHOW);
|
GetDlgItem(IDC_LABEL_NO_PLC)->ShowWindow(SW_HIDE);
|
}
|
}
|
|
BOOL CPagePlcList::PreTranslateMessage(MSG* pMsg)
|
{
|
if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) {
|
return TRUE;
|
}
|
|
return CDialogEx::PreTranslateMessage(pMsg);
|
}
|
|
HTREEITEM CPagePlcList::FindItem(CPLC* pPlc)
|
{
|
|
HTREEITEM item = m_treeCtrl.GetChildItem(nullptr);
|
while (item != nullptr) {
|
if (m_treeCtrl.GetItemData(item) == (DWORD_PTR)pPlc) {
|
return item;
|
}
|
item = m_treeCtrl.GetNextSiblingItem(item);
|
}
|
|
return nullptr;
|
}
|