⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 browserview.cpp

📁 此为Insight opc client InfoServerExplorer源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////
//
//  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 + -