📄 browserview.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
//
// OPC DataAccess VC++ Client: BrowserView.CPP
// (Source File)
//
/////////////////////////////////////////////////////////////////////////////
//
// Author: Raphael Imhof
// Initial Date: 11/04/98
// $Workfile: BrowserView.cpp $
// $Revision: 1 $
// $Date: 7/27/99 5:22p $
// Target System: Microsoft Windows NT 4.0
// Environment: Visual C++ 5.0 / OPC DataAccess 1.0/2.0
// Remarks:
//
/////////////////////////////////////////////////////////////////////////////
//
// Description: implementation of the CBrowserView class.
// left pane view: server/group explorer.
//
//
/////////////////////////////////////////////////////////////////////////////
//
// History of Changes (Please remove very old comments and blank lines!)
// $Log: /IDK/OPCServer/clients/VC++/InfoServerExplorer/BrowserView.cpp $
//
// 1 7/27/99 5:22p Imhof
//
// 1 7/27/99 5:18p Imhof
//
// 13 2/24/99 2:02p Imhof
// Added ValidateItem option and support
//
// 12 2/24/99 11:33a Imhof
// Added a ValidateItem menu handler.
//
// 11 1/15/99 6:43p Imhof
// Updated legal notice.
//
// 10 12/14/98 4:46p Imhof
// Modifications for OPC 2.0
//
// 9 12/11/98 5:58p Imhof
// Made modifications for OPC 2.0.
//
// 8 11/25/98 3:00p Betrisey
// Added menu item <OPC> <Print Statistic to log file>
// All the InfoServer statistic counters are printed out to the log file.
// Note that we do "misuse" the IPersist::Save() API to do that. This API
// returns "not implemented".
//
// 7 11/12/98 5:56p Imhof
// Added 3 OnUpdateXItem to avoid crashes if the server is not connected.
//
// 6 11/10/98 2:20p Imhof
// Added file header's.
//
//
// $Nokeywords:$ (To avoid useless search while checking in.)
/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1998, Siemens Building Technologies, Inc. Landis Division
//
// SIEMENS BUILDING TECHNOLOGIES, INC. IS PROVIDING THE FOLLOWING
// EXAMPLES OF CODE AS SAMPLE ONLY.
//
// SIEMENS BUILDING TECHNOLOGIES, INC. MAKES NO REPRESENTATIONS
// OR WARRANTIES OF ANY KIND WITH RESPECT TO THE VALIDTY OF THE
// CODES OR DESIRED RESULTS AND DISCLAIMS ALL SUCH
// REPRESENTATIONS AND WARRANTIES, INCLUDING FOR EXAMPLE,
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE. SIEMENS BUILIDNG TECHNOLOGIES, INC. DOES NOT
// REPRESENT OR WARRANT THAT THE FOLLOWING CODE SAMPLES ARE
// ACCURATE, VALID, COMPLETE OR CURRENT.
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "InfoServerExplorer.h"
#include "InfoServerExplorerDoc.h"
#include "BrowserView.h"
#include "CommandItemDlg.h"
#include "ReadItemDlg.h"
#include "RefreshGroupDlg.h"
#include "OptionsDlg.h"
#include "ValidateItemDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#include "OPC_i.c" //for linker
/////////////////////////////////////////////////////////////////////////////
// CBrowserView
IMPLEMENT_DYNCREATE(CBrowserView, CTreeView)
CBrowserView::CBrowserView()
{
m_pOldSel = NULL;
m_pTreeImageList = NULL;
m_pTreeImageList = new CImageList();
ASSERT(m_pTreeImageList);
m_pTreeImageList->Create(16, 16, NULL, 3, 1);
HICON hServerIcon = AfxGetApp()->LoadIcon(IDI_INFOSERVER);
HICON hGroupIcon = AfxGetApp()->LoadIcon(IDI_GROUP);
HICON hItemIcon = AfxGetApp()->LoadIcon(IDI_ITEM);
// Note ! The order below is important ! Should map to the #defines at the top
m_pTreeImageList->Add(hServerIcon);
m_pTreeImageList->Add(hGroupIcon);
m_pTreeImageList->Add(hItemIcon);
}
CBrowserView::~CBrowserView()
{
if(NULL != m_pTreeImageList)
{
m_pTreeImageList->DeleteImageList();
delete m_pTreeImageList;
m_pTreeImageList = NULL;
}
}
BEGIN_MESSAGE_MAP(CBrowserView, CTreeView)
//{{AFX_MSG_MAP(CBrowserView)
ON_COMMAND(ID_OPC_ADDGROUP, OnOpcAddgroup)
ON_UPDATE_COMMAND_UI(ID_OPC_ADDGROUP, OnUpdateOpcAddgroup)
ON_COMMAND(ID_OPC_ADDITEM, OnOpcAdditem)
ON_UPDATE_COMMAND_UI(ID_OPC_ADDITEM, OnUpdateOpcAdditem)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_COMMAND(ID_OPC_EDITGROUP, OnOpcEditgroup)
ON_UPDATE_COMMAND_UI(ID_OPC_EDITGROUP, OnUpdateOpcEditgroup)
ON_COMMAND(ID_OPC_INFOSERVERSTATUS, OnOpcInfoserverstatus)
ON_COMMAND(ID_OPC_COMMANDITEM, OnOpcCommanditem)
ON_UPDATE_COMMAND_UI(ID_OPC_COMMANDITEM, OnUpdateOpcCommanditem)
ON_COMMAND(ID_OPC_READITEM, OnOpcReaditem)
ON_UPDATE_COMMAND_UI(ID_OPC_READITEM, OnUpdateOpcReaditem)
ON_COMMAND(ID_OPC_REFRESHGROUP, OnOpcRefreshgroup)
ON_UPDATE_COMMAND_UI(ID_OPC_REFRESHGROUP, OnUpdateOpcRefreshgroup)
ON_COMMAND(ID_OPC_REMOVEITEM, OnOpcRemoveitem)
ON_UPDATE_COMMAND_UI(ID_OPC_REMOVEITEM, OnUpdateOpcRemoveitem)
ON_COMMAND(ID_OPC_REMOVEGROUP, OnOpcRemovegroup)
ON_UPDATE_COMMAND_UI(ID_OPC_REMOVEGROUP, OnUpdateOpcRemovegroup)
ON_WM_DESTROY()
ON_WM_CONTEXTMENU()
ON_COMMAND(ID_OPC_RELOADFROMSERVER, OnOpcReloadfromserver)
ON_UPDATE_COMMAND_UI(ID_OPC_RELOADFROMSERVER, OnUpdateOpcReloadfromserver)
ON_COMMAND(ID_OPC_CLONEGROUP, OnOpcClonegroup)
ON_UPDATE_COMMAND_UI(ID_OPC_CLONEGROUP, OnUpdateOpcClonegroup)
ON_COMMAND(ID_OPC_RELOADSERVER, OnOpcReloadserver)
ON_UPDATE_COMMAND_UI(ID_OPC_RELOADSERVER, OnUpdateOpcReloadserver)
ON_COMMAND(ID_OPC_EDITITEM, OnOpcEdititem)
ON_UPDATE_COMMAND_UI(ID_OPC_EDITITEM, OnUpdateOpcEdititem)
ON_COMMAND(ID_OPC_OPTIONS, OnOpcOptions)
ON_COMMAND(ID_OPC_CONNECT, OnOpcConnect)
ON_UPDATE_COMMAND_UI(ID_OPC_CONNECT, OnUpdateOpcConnect)
ON_COMMAND(ID_OPC_DISCONNECT, OnOpcDisconnect)
ON_UPDATE_COMMAND_UI(ID_OPC_DISCONNECT, OnUpdateOpcDisconnect)
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
ON_UPDATE_COMMAND_UI(ID_OPC_INFOSERVERSTATUS, OnUpdateOpcInfoserverstatus)
ON_COMMAND(ID_OPC_PRINTSTATISTICTOLOGFILE, OnOpcPrintstatistictologfile)
ON_UPDATE_COMMAND_UI(ID_OPC_PRINTSTATISTICTOLOGFILE, OnUpdateOpcPrintstatistictologfile)
ON_COMMAND(ID_OPC_CANCEL, OnOpcCancel)
ON_UPDATE_COMMAND_UI(ID_OPC_CANCEL, OnUpdateOpcCancel)
ON_COMMAND(ID_OPC_VALIDATEITEM, OnOpcValidateitem)
ON_UPDATE_COMMAND_UI(ID_OPC_VALIDATEITEM, OnUpdateOpcValidateitem)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBrowserView drawing
void CBrowserView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CBrowserView diagnostics
#ifdef _DEBUG
void CBrowserView::AssertValid() const
{
CTreeView::AssertValid();
}
void CBrowserView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBrowserView message handlers
void CBrowserView::OnInitialUpdate()
{
CTreeCtrl& tree = GetTreeCtrl();
tree.DeleteAllItems();
tree.ModifyStyle(NULL, TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES |
TVS_SHOWSELALWAYS,0);
if(NULL == tree.GetImageList(TVSIL_NORMAL))
VERIFY(tree.SetImageList(m_pTreeImageList, TVSIL_NORMAL) == NULL);
//else alredy created (we are here do a new or open file
/*
TV_INSERTSTRUCT TreeItem;
TreeItem.hParent = TVI_ROOT;
TreeItem.hInsertAfter = TVI_SORT;
TreeItem.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;;
TreeItem.item.pszText = TEXT("InfoSvr.OPCServer");
TreeItem.item.iImage = 0;
TreeItem.item.iSelectedImage = 0;
TreeItem.item.lParam = NULL;
tree.InsertItem(&TreeItem);
*/
CTreeView::OnInitialUpdate();
}
void CBrowserView::OnDestroy()
{
CTreeView::OnDestroy();
// TODO: Add your message handler code here
CTreeCtrl& tree = GetTreeCtrl();
tree.DeleteAllItems();
}
void CBrowserView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
CTreeCtrl& tree = GetTreeCtrl();
CArray<CGroup*, CGroup*>* pGroups;
//CArray<CItem*, CItem*>* pItems;
//unsigned int nItems = 0;
unsigned int nGroups = 0;
TV_INSERTSTRUCT TreeItem;
HTREEITEM hItemParent = NULL;
CInfoServer* pInfoServer = ((CInfoServerExplorerDoc*)GetDocument())->GetInfoServer();
TreeItem.hInsertAfter = TVI_SORT;
TreeItem.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tree.DeleteAllItems();
if(pInfoServer != NULL)
{
//insert the root if defined
if(pInfoServer->IsConnected())
{
TreeItem.hParent = TVI_ROOT;
CString sName = pInfoServer->GetOPCServerName();
TreeItem.item.pszText = (LPSTR) sName.GetBuffer(sName.GetLength());
TreeItem.item.iImage = 0;
TreeItem.item.iSelectedImage = 0;
TreeItem.item.lParam = (LONG)pInfoServer;
tree.InsertItem(&TreeItem);
nGroups = pInfoServer->GetGroups(&pGroups);
for(unsigned int g = 0; g < nGroups; g++)
{
//add item
TreeItem.hParent = tree.GetRootItem();
CString sName = (*pGroups)[g]->GetName();
TreeItem.item.pszText = (LPSTR) sName.GetBuffer(sName.GetLength());
TreeItem.item.iImage = 1;
TreeItem.item.iSelectedImage = 1;
TreeItem.item.lParam = (LONG) (*pGroups)[g];
hItemParent = tree.InsertItem(&TreeItem);
tree.EnsureVisible(hItemParent);
//recreate its points
/*
nItems = (*pGroups)[g]->GetItems(&pItems);
for(unsigned int i = 0; i < nItems; i++)
{
//add item
TreeItem.hParent = hItemParent;
CString sName = (*pItems)[i]->GetName();
TreeItem.item.pszText = (LPSTR) sName.GetBuffer(sName.GetLength());
TreeItem.item.iImage = 2;
TreeItem.item.iSelectedImage = 2;
TreeItem.item.lParam = (LONG) (*pItems)[i];
tree.EnsureVisible(tree.InsertItem(&TreeItem));
}
*/
}
tree.SelectItem(tree.GetRootItem());
}
}
}
void CBrowserView::OnOpcAddgroup()
{
// TODO: Add your command handler code here
CGroup* pGroup = NULL;
if(((CInfoServerExplorerDoc*)GetDocument())->GetInfoServer()->AddGroup(&pGroup))
{
//add item
TV_INSERTSTRUCT TreeItem;
CTreeCtrl& tree = GetTreeCtrl();
HTREEITEM item = tree.GetSelectedItem();
TreeItem.hParent = item;
TreeItem.hInsertAfter = TVI_SORT;
TreeItem.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;;
CString sName = pGroup->GetName();
TreeItem.item.pszText = (LPSTR) sName.GetBuffer(sName.GetLength());
TreeItem.item.iImage = 1;
TreeItem.item.iSelectedImage = 1;
TreeItem.item.lParam = (LONG) pGroup;
tree.EnsureVisible(tree.InsertItem(&TreeItem));
GetDocument()->SetModifiedFlag();
GetDocument()->UpdateAllViews(this, 0, NULL);
}
}
void CBrowserView::OnUpdateOpcAddgroup(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(IsServerSelected());
}
void CBrowserView::OnOpcAdditem()
{
// TODO: Add your command handler code here
HTREEITEM item;
CTreeCtrl& tree = GetTreeCtrl();
item = tree.GetSelectedItem();
CGroup* pGroup = (CGroup*) tree.GetItemData(item);
pGroup->AddItem();
}
void CBrowserView::OnUpdateOpcAdditem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(IsGroupSelected());
}
void CBrowserView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
GetDocument()->UpdateAllViews(this, 0, NULL);
*pResult = 0;
}
void CBrowserView::OnOpcEditgroup()
{
// TODO: Add your command handler code here
HTREEITEM item;
CTreeCtrl& tree = GetTreeCtrl();
item = tree.GetSelectedItem();
CGroup* pGroup = (CGroup*) tree.GetItemData(item);
if(((CInfoServerExplorerDoc*)GetDocument())->GetInfoServer()->EditGroup(&pGroup))
{
//update group item (only name could have changed)
tree.SetItemText(item, pGroup->GetName());
GetDocument()->SetModifiedFlag();
GetDocument()->UpdateAllViews(this, 0, NULL);
}
}
void CBrowserView::OnUpdateOpcEditgroup(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(IsGroupSelected());
}
void CBrowserView::OnOpcInfoserverstatus()
{
// TODO: Add your command handler code here
((CInfoServerExplorerDoc*)GetDocument())->GetInfoServer()->GetStatus();
}
void CBrowserView::OnUpdateOpcInfoserverstatus(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CInfoServer* pInfoServer = ((CInfoServerExplorerDoc*)GetDocument())->GetInfoServer();
if(pInfoServer != NULL)
{
pCmdUI->Enable(pInfoServer->IsConnected());
}
else pCmdUI->Enable(FALSE);
}
void CBrowserView::OnOpcCommanditem()
{
// TODO: Add your command handler code here
HTREEITEM item;
CCommandItemDlg dlg;
CTreeCtrl& tree = GetTreeCtrl();
item = tree.GetSelectedItem();
CItem* pItem = (CItem*) tree.GetItemData(item);
if(IDOK == dlg.DoModal())
{
CWaitCursor wait;
if(0 == dlg.m_iCommand)
{
//sync
pItem->CommandSync(dlg.m_sCommandValue);
}
else if(1 == dlg.m_iCommand)
{
//async
pItem->CommandAsync(dlg.m_sCommandValue);
}
}
}
void CBrowserView::OnUpdateOpcCommanditem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(IsItemSelected());
}
void CBrowserView::OnOpcReaditem()
{
// TODO: Add your command handler code here
HTREEITEM item;
CReadItemDlg dlg;
CTreeCtrl& tree = GetTreeCtrl();
item = tree.GetSelectedItem();
CItem* pItem = (CItem*) tree.GetItemData(item);
if(IDOK == dlg.DoModal())
{
CWaitCursor wait;
if(0 == dlg.m_iRead)
{
//sync
if(1 == dlg.m_iFrom)
pItem->ReadSync(OPC_DS_DEVICE);
else
pItem->ReadSync(OPC_DS_CACHE);
}
else if(1 == dlg.m_iRead)
{
//async
if(1 == dlg.m_iFrom)
pItem->ReadAsync(OPC_DS_DEVICE);
else
pItem->ReadAsync(OPC_DS_CACHE);
}
GetDocument()->UpdateAllViews(this);
}
}
void CBrowserView::OnUpdateOpcReaditem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(IsItemSelected());
}
void CBrowserView::OnOpcRefreshgroup()
{
// TODO: Add your command handler code here
HTREEITEM item;
CRefreshGroupDlg dlg;
CTreeCtrl& tree = GetTreeCtrl();
item = tree.GetSelectedItem();
CGroup* pGroup = (CGroup*) tree.GetItemData(item);
dlg.m_sGroup = pGroup->GetName();
if(IDOK == dlg.DoModal())
{
CWaitCursor wait;
if(1 == dlg.m_iFrom)
pGroup->Refresh(OPC_DS_DEVICE);
else
pGroup->Refresh(OPC_DS_CACHE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -