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

📄 demo_roletreeview.cpp

📁 使用yacc的一个例子
💻 CPP
字号:
// Demo_RoleTreeView.cpp : implementation file
//

#include "stdafx.h"
#include "SdbmsDemo.h"
#include "Demo_RoleTreeView.h"
#include "Demo_WorkspaceBar.h"
#include "MainFrm.h"
#include "Sdbms.h"

extern CSdbms g_sdbms;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDemo_RoleTreeView

IMPLEMENT_DYNCREATE(CDemo_RoleTreeView, CTreeView)

CDemo_RoleTreeView::CDemo_RoleTreeView()
{
	m_ImageList.Create(IDB_ROLE_TREEVIEW, 19, 1, RGB(255,255,255));
}

CDemo_RoleTreeView::~CDemo_RoleTreeView()
{
}


BEGIN_MESSAGE_MAP(CDemo_RoleTreeView, CTreeView)
	//{{AFX_MSG_MAP(CDemo_RoleTreeView)
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	ON_NOTIFY_REFLECT(TVN_DELETEITEM, OnDeleteitem)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemo_RoleTreeView drawing

void CDemo_RoleTreeView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CDemo_RoleTreeView diagnostics

#ifdef _DEBUG
void CDemo_RoleTreeView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CDemo_RoleTreeView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDemo_RoleTreeView message handlers

void CDemo_RoleTreeView::OnInitialUpdate() 
{
	CTreeView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	GetTreeCtrl().SetImageList(&m_ImageList, TVSIL_NORMAL);
}

void CDemo_RoleTreeView::UpdateView()
{
	CTreeCtrl& ctrl = GetTreeCtrl();
	TREE_ITEM_DATA *pItemData = NULL;
	HTREEITEM hRoleItem, hUserItem, hDBItem, hDBRootItem;
	CSdbms_Role *pRole = NULL;
	CSdbms_User *pUser = NULL;
	POSITION pos;

	//删除以前的所有项
	ctrl.DeleteAllItems();

	//系统预定义角色
	for	(int i=0; i<3; i++)
	{
		switch(i)
		{
		case	0:		//添加DBA角色
			pRole = g_sdbms.GetDbaRole();
			hRoleItem = ctrl.InsertItem(SYSTEM_ROLE_DBA, 0, 0);
			break;
		case	1:		//添加DBSA角色
			pRole = g_sdbms.GetDbsaRole();
			hRoleItem = ctrl.InsertItem(SYSTEM_ROLE_DBSA, 0, 0);
			break;
		case	2:		//添加SYSTEM角色
			pRole = g_sdbms.GetSystemRole();
			hRoleItem = ctrl.InsertItem(SYSTEM_ROLE_SYSTEM, 0, 0);
			break;
		default:
			ASSERT(FALSE);
		}

		pItemData = new TREE_ITEM_DATA(pRole);
		ctrl.SetItemData(hRoleItem, (DWORD)pItemData);

		pos = g_sdbms.m_RoleUserList.GetHeadPosition();
		while (pos)	//添加属于角色的所有用户
		{
			CSdbms_RoleUser *pRoleUser = g_sdbms.m_RoleUserList.GetNext(pos);
			if	(pRoleUser->m_pRole == pRole)
			{
				hUserItem = ctrl.InsertItem(pRoleUser->m_pUser->m_strUserName, 1, 1, hRoleItem);
				pItemData = new TREE_ITEM_DATA(pRoleUser->m_pUser);
				ctrl.SetItemData(hUserItem, (DWORD)pItemData);
			}
		}
	}

	hDBRootItem = ctrl.InsertItem("数据库", 2, 2);

	//各数据库中的角色	
	pos = g_sdbms.m_DBList.GetHeadPosition();
	while (pos)
	{
		CSdbms_Database *pDB = g_sdbms.m_DBList.GetNext(pos);
		if	(!pDB->m_bInit)
			pDB->Init();

		//添加数据库根结点
		hDBItem = ctrl.InsertItem(pDB->m_strDBName, 3, 3, hDBRootItem);

		//添加数据库创建者角色
		pRole = pDB->m_pCreatorRole;
		hRoleItem = ctrl.InsertItem("OWNER", 0, 0, hDBItem);
		pItemData = new TREE_ITEM_DATA((CSdbms_Role*)NULL, pDB);
		ctrl.SetItemData(hRoleItem, (DWORD)pItemData);

		VERIFY(g_sdbms.GetUser(pDB->GetCreatorID(), &pUser));	//添加角色下的用户
		hUserItem = ctrl.InsertItem(pUser->m_strUserName, 1, 1, hRoleItem);
		pItemData = new TREE_ITEM_DATA(pUser);
		ctrl.SetItemData(hUserItem, (DWORD)pItemData);

		//添加数据库中各表的创建者角色
		for (int i=0; i<pDB->m_TableArray.GetSize(); i++)
		{
			CSdbms_Table *pTable = pDB->m_TableArray[i];
			pRole = pTable->m_pCreatorRole;
			hRoleItem = ctrl.InsertItem(pTable->m_strTableName + ".OWNER", 0, 0, hDBItem);
			pItemData = new TREE_ITEM_DATA(pTable, pDB);
			ctrl.SetItemData(hRoleItem, (DWORD)pItemData);

			VERIFY(g_sdbms.GetUser(pTable->m_nCreatorID, &pUser));	//添加角色下的用户
			hUserItem = ctrl.InsertItem(pUser->m_strUserName, 1, 1, hRoleItem);
			pItemData = new TREE_ITEM_DATA(pUser);
			ctrl.SetItemData(hUserItem, (DWORD)pItemData);
		}

		//添加数据库中的各自定义角色
		ASSERT(pDB->m_pRole == pDB->m_pCreatorRole);
		if	(pDB->m_pRole->m_pNextBrotherRole)
			AddDBRole(pDB->m_pRole->m_pNextBrotherRole, pDB, hDBItem);
	}
}

void CDemo_RoleTreeView::AddDBRole(CSdbms_Role *pRole, CSdbms_Database *pDB, HTREEITEM hParentItem)
{
	ASSERT(pRole && pDB);

	CTreeCtrl& ctrl = GetTreeCtrl();
	TREE_ITEM_DATA *pItemData = NULL;
	HTREEITEM hRoleItem, hUserItem;
	
	//遍历所有的兄弟角色
	while (pRole)
	{
		hRoleItem = ctrl.InsertItem(pRole->m_strRoleName, 0, 0, hParentItem);
		pItemData = new TREE_ITEM_DATA(pRole, pDB);
		ctrl.SetItemData(hRoleItem, (DWORD)pItemData);

		//添加子角色
		if	(pRole->m_pFirstChildRole)
			AddDBRole(pRole->m_pFirstChildRole, pDB, hRoleItem);

		//添加角色下所有用户
		POSITION pos = pRole->m_pos;
		while (pos)
		{
			CSdbms_RoleUser *pRoleUser = pDB->m_RoleUserList.GetNext(pos);
			if	(pRoleUser->m_pRole->m_nRoleID != pRole->m_nRoleID)
			{
				ASSERT(pRoleUser->m_pRole->m_nRoleID > pRole->m_nRoleID);
				break;
			}
			else
			{
				hUserItem = ctrl.InsertItem(pRoleUser->m_pUser->m_strUserName, 1, 1, hRoleItem);
				pItemData = new TREE_ITEM_DATA(pRoleUser->m_pUser);
				ctrl.SetItemData(hUserItem, (DWORD)pItemData);
			}
		}

		pRole = pRole->m_pNextBrotherRole;
	}
}

void CDemo_RoleTreeView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	CTreeCtrl& ctrl = GetTreeCtrl();
	CMainFrame *pMainWnd = (CMainFrame*)AfxGetMainWnd();

	HTREEITEM hItem = ctrl.GetSelectedItem();
	TREE_ITEM_DATA *pItemData = (TREE_ITEM_DATA*)ctrl.GetItemData(hItem);
	if	(pItemData)
	{
		switch(pItemData->m_nType)
		{
		case	IT_USER:
			pMainWnd->m_wndOutputBar.OutputUserInformation(pItemData->m_pUser);
			break;
		case	IT_ROLE:
			pMainWnd->m_wndOutputBar.OutputRoleInformation(pItemData->m_pRole, pItemData->m_pDatabase);
			break;
		case	IT_TABLE:
			pMainWnd->m_wndOutputBar.OutputRoleInformation(pItemData->m_pTable, pItemData->m_pDatabase);
			break;
		default:
			ASSERT(FALSE);
		}
	}
	
	*pResult = 0;
}

BOOL CDemo_RoleTreeView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	cs.style |= (TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_TRACKSELECT);	
	return CTreeView::PreCreateWindow(cs);
}

void CDemo_RoleTreeView::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	CTreeCtrl& ctrl = GetTreeCtrl();
	HTREEITEM hItem = pNMTreeView->itemOld.hItem;
	TREE_ITEM_DATA *pItemData = (TREE_ITEM_DATA*)ctrl.GetItemData(hItem);
	if	(pItemData)
		delete pItemData;

	*pResult = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -