📄 demo_roletreeview.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 + -