📄 demo_usertreeview.cpp
字号:
// Demo_UserTreeView.cpp : implementation file
//
#include "stdafx.h"
#include "SdbmsDemo.h"
#include "Demo_UserTreeView.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_UserTreeView
IMPLEMENT_DYNCREATE(CDemo_UserTreeView, CTreeView)
CDemo_UserTreeView::CDemo_UserTreeView()
{
m_ImageList.Create(IDB_USER_TREEVIEW, 19, 1, RGB(255,255,255));
}
CDemo_UserTreeView::~CDemo_UserTreeView()
{
}
BEGIN_MESSAGE_MAP(CDemo_UserTreeView, CTreeView)
//{{AFX_MSG_MAP(CDemo_UserTreeView)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_NOTIFY_REFLECT(TVN_DELETEITEM, OnDeleteitem)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDemo_UserTreeView drawing
void CDemo_UserTreeView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CDemo_UserTreeView diagnostics
#ifdef _DEBUG
void CDemo_UserTreeView::AssertValid() const
{
CTreeView::AssertValid();
}
void CDemo_UserTreeView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDemo_UserTreeView message handlers
void CDemo_UserTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
GetTreeCtrl().SetImageList(&m_ImageList, TVSIL_NORMAL);
}
BOOL CDemo_UserTreeView::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_UserTreeView::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;
}
void CDemo_UserTreeView::UpdateView()
{
CTreeCtrl& ctrl = GetTreeCtrl();
TREE_ITEM_DATA *pItemData = NULL;
HTREEITEM hUserItem, hRoleItem;
//删除以前的所有项
ctrl.DeleteAllItems();
//添加所有的用户
POSITION pos = g_sdbms.m_UserList.GetHeadPosition();
while (pos) //遍历用户列表
{
CSdbms_User *pUser = g_sdbms.m_UserList.GetNext(pos);
pItemData = new TREE_ITEM_DATA(pUser);
hUserItem = ctrl.InsertItem(pUser->m_strUserName, 0, 0);
ctrl.SetItemData(hUserItem, (DWORD)pItemData);
//添加用户所属的所有角色
POSITION pos2 = g_sdbms.m_RoleUserList.GetHeadPosition();
while (pos2) //遍历系统预定义角色
{
CSdbms_RoleUser *pRoleUser = g_sdbms.m_RoleUserList.GetNext(pos2);
if (pRoleUser->m_pUser == pUser)
{
pItemData = new TREE_ITEM_DATA(pRoleUser->m_pRole);
hRoleItem = ctrl.InsertItem(pRoleUser->m_pRole->m_strRoleName, 1, 1, hUserItem);
ctrl.SetItemData(hRoleItem, (DWORD)pItemData);
}
}
pos2 = g_sdbms.m_DBList.GetHeadPosition();
while (pos2) //遍历数据库列表,添加数据库内的自定义角色
{
CSdbms_Database *pDB = g_sdbms.m_DBList.GetNext(pos2);
if (!pDB->m_bInit)
pDB->Init();
if (pDB->IsDBCreator(pUser->m_nUserID)) //数据库OWNER角色
{
pItemData = new TREE_ITEM_DATA((CSdbms_Role*)NULL, pDB);//m_pRole=NULL, m_pDatabase=pDB
hRoleItem = ctrl.InsertItem(pDB->m_strDBName + ".OWNER", 1, 1, hUserItem);
ctrl.SetItemData(hRoleItem, (DWORD)pItemData);
}
for (int i=0; i<pDB->m_TableArray.GetSize(); i++) //遍历数据库中的表
{
CSdbms_Table *pTable = pDB->m_TableArray[i];
if (pTable->IsTableCreator(pUser->m_nUserID)) //表OWNER角色
{
pItemData = new TREE_ITEM_DATA(pTable, pDB);//m_pTable=pTable, m_pDatabase=pDB
hRoleItem = ctrl.InsertItem(pDB->m_strDBName + "." + pTable->m_strTableName + ".OWNER", 1, 1, hUserItem);
ctrl.SetItemData(hRoleItem, (DWORD)pItemData);
}
}
POSITION pos3 = pDB->m_UserRoleList.GetHeadPosition();
while (pos3) //遍历数据库中的自定义角色
{
CSdbms_RoleUser *pUserRole = pDB->m_UserRoleList.GetNext(pos3);
if ((pUserRole->m_pUser == pUser) &&
(pUserRole->m_pRole->m_strRoleName.CompareNoCase(SYSTEM_ROLE_OWNER) != 0))//不是系统角色
{
pItemData = new TREE_ITEM_DATA(pUserRole->m_pRole, pDB);//
hRoleItem = ctrl.InsertItem(pDB->m_strDBName + "." + pUserRole->m_pRole->m_strRoleName, 1, 1, hUserItem);
ctrl.SetItemData(hRoleItem, (DWORD)pItemData);
}
}
}
}
}
void CDemo_UserTreeView::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 + -