// ViewResBase.cpp : 实现文件 // #include "stdafx.h" #include "ViewResBase.h" #include "DisplayWnd.h" #include "ViewGroup.h" // CViewResBase IMPLEMENT_DYNAMIC(CViewResBase, VIEW_CONTROL_TYPE) CViewResBase::CViewResBase(void) { } CViewResBase::~CViewResBase(void) { RemoveAll(); } /***************************************************************** **【函数名称】 _addRes **【函数功能】 添加资源处理函数 **【参数】 **【返回值】 ****************************************************************/ void CViewResBase::_addRes( DEV_RES_ID& ResId ) { CString Name; // 查找或创建Dev PVIEW_ITEM_TYPE pDev = _getDev(ResId.NodeNo); if(pDev == NULL) { Name.Format(_T("%s%u"), UI_ITEM_NAME_DEV, ResId.NodeNo); pDev = new CMFCPropertyGridProperty(Name, ResId.NodeNo); ASSERT(pDev != NULL); AddProperty(pDev, FALSE, FALSE); } // 查找或创建Board CViewGroup* pBoard = _getResGroup(ResId); if(pBoard == NULL) { Name.Format(_T("%s%u"), UI_ITEM_NAME_BOARD, ResId.BoardNo); pBoard = new CViewGroup(Name, ResId.BoardNo); ASSERT(pBoard != NULL); pBoard->setResId(ResId); _addResGroup(pBoard); pDev->AddSubItem(pBoard); } // 创建资源 Name.Format(_T("%u"), ResId.ChanNo); PVIEW_ITEM_TYPE pRes = new CMFCPropertyGridProperty(Name, ResId.ChanNo); ASSERT(pRes != NULL); pBoard->add(ResId.ChanNo, pRes); Name.Format(_T("%s"), UI_ITEM_NAME_STATE); PVIEW_ITEM_TYPE pState = new CMFCPropertyGridProperty(Name, _T("free")); ASSERT(pState != NULL); pState->AllowEdit(FALSE); pRes->AddSubItem(pState); } /***************************************************************** **【函数名称】 _delEmptyNode **【函数功能】 删除空节点 **【参数】 **【返回值】 ****************************************************************/ void CViewResBase::_delEmptyNode( PVIEW_ITEM_TYPE pItem ) { ASSERT(pItem != NULL); if(pItem->GetSubItemsCount() == 0) { PVIEW_ITEM_TYPE pParent = pItem->GetParent(); if(pParent != NULL) { pParent->RemoveSubItem(pItem); _delEmptyNode(pParent); } else DeleteProperty(pItem, FALSE, FALSE); } } /***************************************************************** **【函数名称】 _getDev **【函数功能】 查找dev节点 **【参数】 **【返回值】 ****************************************************************/ PVIEW_ITEM_TYPE CViewResBase::_getDev( UINT DevNo ) { int Count = GetPropertyCount(); PVIEW_ITEM_TYPE pDev = NULL; for(int i = 0; i < Count; ++i) { pDev = GetProperty(i); ASSERT(pDev != NULL); if(pDev->GetData() == DevNo) return pDev; } return NULL; } /***************************************************************** **【函数名称】 _getBoard **【函数功能】 查找board节点 **【参数】 **【返回值】 ****************************************************************/ PVIEW_ITEM_TYPE CViewResBase::_getBoard( PVIEW_ITEM_TYPE pDev, UINT BoardNo ) { int Count = pDev->GetSubItemsCount(); PVIEW_ITEM_TYPE pBoard = NULL; for(int i = 0; i < Count; ++i) { pBoard = pDev->GetSubItem(i); ASSERT(pBoard != NULL); if(pBoard->GetData() == BoardNo) return pBoard; } return NULL; } /***************************************************************** **【函数名称】 _getSpan **【函数功能】 查找span节点 **【参数】 **【返回值】 ****************************************************************/ PVIEW_ITEM_TYPE CViewResBase::_getSpan( PVIEW_ITEM_TYPE pBoard, UINT SpanNo ) { int Count = pBoard->GetSubItemsCount(); PVIEW_ITEM_TYPE pSpan = NULL; for(int i = 0; i < Count; ++i) { pBoard = pBoard->GetSubItem(i); ASSERT(pBoard != NULL); if(pSpan->GetData() == SpanNo) return pSpan; } return NULL; } /***************************************************************** **【函数名称】 _getResGroup **【函数功能】 查找资源组节点 **【参数】 **【返回值】 ****************************************************************/ CViewGroup* CViewResBase::_getResGroup( DEV_RES_ID& ResId ) { POSITION Pos = m_ResGroupList.GetHeadPosition(); while(Pos != NULL) { CViewGroup* pGroup = m_ResGroupList.GetNext(Pos); ASSERT(pGroup != NULL); if(pGroup->isThatU(ResId)) return pGroup; } return NULL; } /***************************************************************** **【函数名称】 _addResGroup **【函数功能】 添加资源组节点 **【参数】 **【返回值】 ****************************************************************/ void CViewResBase::_addResGroup( CViewGroup* pGroup ) { m_ResGroupList.AddTail(pGroup); } /***************************************************************** **【函数名称】 _delResGroup **【函数功能】 删除资源组节点 **【参数】 **【返回值】 ****************************************************************/ void CViewResBase::_delResGroup( CViewGroup* pGroup ) { POSITION Pos = m_ResGroupList.Find(pGroup); ASSERT(Pos != NULL); if(Pos != NULL) m_ResGroupList.RemoveAt(Pos); } /***************************************************************** **【函数名称】 create **【函数功能】 控件初始化 **【参数】 **【返回值】 ****************************************************************/ bool CViewResBase::create( CDisplayWnd* pWnd, UINT PanId ) { ASSERT(pWnd != NULL); CString Name; Name.LoadString(PanId); // 创建pane if (!m_Pane.Create(Name, pWnd, CRect(0, 0, 200, 200), TRUE, PanId, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI)) { TRACE0("创建设备资源窗口失败"); return false; } m_Pane.EnableDocking(CBRS_ALIGN_ANY); //创建控件 if(!_createControl()) return false; EnableHeaderCtrl(FALSE); pWnd->OnNewPane(&m_Pane); return true; } /***************************************************************** **【函数名称】 newSize **【函数功能】 调整控件大小 **【参数】 **【返回值】 ****************************************************************/ void CViewResBase::newSize( int cx, int cy ) { if(IsWindow(GetSafeHwnd())) SetWindowPos (this, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW); } /***************************************************************** **【函数名称】 showTogether **【函数功能】 Tab模式显示控件 **【参数】 **【返回值】 ****************************************************************/ void CViewResBase::showTogether( CViewResBase* pView ) { ASSERT(pView != NULL); m_Pane.AttachToTabWnd(&pView->m_Pane, DM_SHOW, TRUE); } /***************************************************************** **【函数名称】 onResNew **【函数功能】 添加资源处理函数 **【参数】 **【返回值】 ****************************************************************/ void CViewResBase::onResNew( DEV_RES_ID& ResId ) { CViewGroup* pGroup = _getResGroup(ResId); if(pGroup == NULL || !pGroup->isSubItemExisted(ResId.ChanNo)) { _addRes(ResId); AdjustLayout(); } } /***************************************************************** **【函数名称】 onResDel **【函数功能】 删除资源处理函数 **【参数】 **【返回值】 ****************************************************************/ void CViewResBase::onResDel( DEV_RES_ID& ResId ) { CViewGroup* pGroup = _getResGroup(ResId); if (pGroup != NULL && pGroup->isSubItemExisted(ResId.ChanNo)) { // 删除资源 pGroup->remove(ResId.ChanNo); if(pGroup->GetSubItemsCount() == 0) { // 从List中删除该组 _delResGroup(pGroup); _delEmptyNode(pGroup); } AdjustLayout(); } } BEGIN_MESSAGE_MAP(CViewResBase, VIEW_CONTROL_TYPE) END_MESSAGE_MAP() // CViewResBase 消息处理程序