// CProjectPageComponents.cpp: 实现文件
|
//
|
|
#include "stdafx.h"
|
#include "BondEq.h"
|
#include "CProjectPageComponents.h"
|
#include "afxdialogex.h"
|
#include "Alarm.h"
|
|
|
// CProjectPageComponents 对话框
|
|
IMPLEMENT_DYNAMIC(CProjectPageComponents, CDialogEx)
|
|
CProjectPageComponents::CProjectPageComponents(CWnd* pParent /*=nullptr*/)
|
: CDialogEx(IDD_PROJECT_PAGE_COMPENTS, pParent)
|
{
|
m_crBkgnd = PROPAGE_BACKGROUND_COLOR;
|
m_hbrBkgnd = nullptr;
|
m_pObserver = nullptr;
|
}
|
|
CProjectPageComponents::~CProjectPageComponents()
|
{
|
}
|
|
void CProjectPageComponents::DoDataExchange(CDataExchange* pDX)
|
{
|
CDialogEx::DoDataExchange(pDX);
|
DDX_Control(pDX, IDC_TREE1, m_treeComponents);
|
}
|
|
|
BEGIN_MESSAGE_MAP(CProjectPageComponents, CDialogEx)
|
ON_WM_CTLCOLOR()
|
ON_WM_DESTROY()
|
ON_WM_SIZE()
|
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CProjectPageComponents::OnTvnSelchangedTree1)
|
ON_MESSAGE(ID_MSG_TREE_CLICK_ITEM, OnTreeClickItem)
|
END_MESSAGE_MAP()
|
|
|
// CEQPageComponents 消息处理程序
|
|
|
void CProjectPageComponents::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_DATA1_MATERIAL_RECEIVED == code) {
|
CComponent* pComponent;
|
if (pAny->getPtrValue("ptr", (void*&)pComponent)) {
|
HTREEITEM hItem = getTreeItem(pComponent);
|
if (hItem != nullptr) {
|
m_treeComponents.ShowItemBadgeDotMode(hItem);
|
}
|
}
|
}
|
else if(RX_CODE_DATA1_MATERIAL_REMOVEED == code) {
|
CComponent* pComponent;
|
if (pAny->getPtrValue("ptr", (void*&)pComponent)) {
|
HTREEITEM hItem = getTreeItem(pComponent);
|
if (hItem != nullptr) {
|
m_treeComponents.HideItemBadge(hItem);
|
}
|
}
|
}
|
else if (RX_CODE_ALARM_EVENT == code) {
|
CComponent* pComponent = nullptr;
|
CAlarm* pAlarm = nullptr;
|
pAny->getObject("obj", (IRxObject*&)pAlarm);
|
pAny->getPtrValue("ptr", (void*&)pComponent);
|
ASSERT(pComponent);
|
ASSERT(pAlarm);
|
HTREEITEM hItem = getTreeItem(pComponent);
|
if (hItem != nullptr) {
|
if(pAlarm->getStatus() == 1)
|
m_treeComponents.ShowItemBadgeDotMode(hItem);
|
else if (pAlarm->getStatus() == 2)
|
m_treeComponents.HideItemBadge(hItem);
|
}
|
}
|
else if (RX_CODE_PLC1_CONNECTTD == code) {
|
CComponent* pComponent;
|
if (pAny->getPtrValue("ptr", (void*&)pComponent)) {
|
HTREEITEM hItem = getTreeItem(pComponent);
|
if (hItem != nullptr) {
|
m_treeComponents.ShowItemBadgeDotMode(hItem);
|
}
|
}
|
}
|
else if (RX_CODE_PLC1_DISCONNECTTD == code) {
|
CComponent* pComponent;
|
if (pAny->getPtrValue("ptr", (void*&)pComponent)) {
|
HTREEITEM hItem = getTreeItem(pComponent);
|
if (hItem != nullptr) {
|
m_treeComponents.HideItemBadge(hItem);
|
}
|
}
|
}
|
pAny->release();
|
}, [&]() -> void {
|
// onComplete
|
}, [&](IThrowable* pThrowable) -> void {
|
// onErrorm
|
pThrowable->printf();
|
});
|
|
theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread())
|
->subscribe(m_pObserver);
|
}
|
}
|
|
BOOL CProjectPageComponents::OnInitDialog()
|
{
|
CDialogEx::OnInitDialog();
|
|
|
// 组件列表
|
m_treeComponents.SetBkColor(PROPAGE_BACKGROUND_COLOR);
|
m_treeComponents.SetItemHeight(50);
|
|
const std::vector<CComponent*>& components = theApp.m_model.getBonder().getComponents();
|
for (auto item : components) {
|
HTREEITEM hItemComponent = m_treeComponents.InsertItem(item->getName().c_str());
|
m_treeComponents.SetItemData(hItemComponent, (DWORD_PTR)item);
|
if (item->getClassName().compare("CAlarmMonitor") == 0) {
|
m_treeComponents.SetItemBadge(hItemComponent, TREE_BADGE2_BACKGROUND, TREE_BADGE2_FOREGROUND);
|
}
|
else {
|
m_treeComponents.SetItemBadge(hItemComponent, TREE_BADGE_BACKGROUND, TREE_BADGE_FOREGROUND);
|
}
|
}
|
|
InitRxWindows();
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
// 异常: OCX 属性页应返回 FALSE
|
}
|
|
|
HBRUSH CProjectPageComponents::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
|
{
|
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
|
|
if (nCtlColor == CTLCOLOR_STATIC) {
|
pDC->SetBkColor(m_crBkgnd);
|
}
|
|
if (m_hbrBkgnd == nullptr) {
|
m_hbrBkgnd = CreateSolidBrush(m_crBkgnd);
|
}
|
|
return m_hbrBkgnd;
|
}
|
|
|
void CProjectPageComponents::OnDestroy()
|
{
|
CDialogEx::OnDestroy();
|
|
if (m_hbrBkgnd != nullptr) {
|
::DeleteObject(m_hbrBkgnd);
|
}
|
|
ASSERT(m_pObserver != NULL);
|
m_pObserver->unsubscribe();
|
m_pObserver = NULL;
|
}
|
|
|
void CProjectPageComponents::OnSize(UINT nType, int cx, int cy)
|
{
|
CDialogEx::OnSize(nType, cx, cy);
|
if (GetDlgItem(IDC_TREE1) == nullptr) return;
|
|
CRect rcClient;
|
CWnd* pItem;
|
GetClientRect(&rcClient);
|
|
pItem = GetDlgItem(IDC_TREE1);
|
pItem->MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24);
|
}
|
|
|
void CProjectPageComponents::OnTvnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
|
{
|
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
|
|
|
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
|
ASSERT(hItem);
|
CComponent* pComponent = (CComponent*)m_treeComponents.GetItemData(hItem);
|
ASSERT(pComponent);
|
// theApp.m_model.notifyPtr(RX_CODE_SELECT_COMPONENT, pComponent);
|
|
|
*pResult = 0;
|
}
|
|
LRESULT CProjectPageComponents::OnTreeClickItem(WPARAM wParam, LPARAM lParam)
|
{
|
HTREEITEM hItem = (HTREEITEM)wParam;
|
ASSERT(hItem);
|
CComponent* pComponent = (CComponent*)m_treeComponents.GetItemData(hItem);
|
ASSERT(pComponent);
|
theApp.m_model.notifyPtr(RX_CODE_SELECT_COMPONENT, pComponent);
|
|
|
return 0;
|
}
|
|
HTREEITEM CProjectPageComponents::getTreeItem(CComponent* pComponent)
|
{
|
HTREEITEM hItem = m_treeComponents.GetChildItem(nullptr);
|
while (hItem != nullptr) {
|
CComponent* p = (CComponent*)m_treeComponents.GetItemData(hItem);
|
if (p == pComponent) {
|
return hItem;
|
}
|
|
hItem = m_treeComponents.GetNextSiblingItem(hItem);
|
}
|
|
return nullptr;
|
}
|