📄 leftview.cpp
字号:
//author : Jarry
//E-mail : lansingk@online.sh.cn
// LeftView.cpp : implementation of the CLeftView class
//
#include "stdafx.h"
#include "mysqlManager.h"
#include "mysqlManagerDoc.h"
#include "LeftView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLeftView
IMPLEMENT_DYNCREATE(CLeftView, CTreeView)
BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
//{{AFX_MSG_MAP(CLeftView)
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_CONTEXTMENU()
ON_WM_DESTROY()
ON_COMMAND(ID_MENUITEM32775, OnMenuitem32775)
ON_COMMAND(ID_MENUITEM32772, OnMenuitem32772)
ON_COMMAND(ID_MENUITEM32771, OnMenuitem32771)
ON_COMMAND(ID_MENUITEM32774, OnMenuitem32774)
ON_WM_LBUTTONDBLCLK()
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_COMMAND(ID_MENUITEM32786, OnMenuitem32786)
//}}AFX_MSG_MAP
// Standard printing commands
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLeftView construction/destruction
CLeftView::CLeftView()
{
}
CLeftView::~CLeftView()
{
}
BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES;
return CTreeView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLeftView drawing
void CLeftView::OnDraw(CDC* pDC)
{
CMysqlManagerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CLeftView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// TODO: You may populate your TreeView with items by directly accessing
// its tree control through a call to GetTreeCtrl().
}
/////////////////////////////////////////////////////////////////////////////
// CLeftView diagnostics
#ifdef _DEBUG
void CLeftView::AssertValid() const
{
CTreeView::AssertValid();
}
void CLeftView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
CMysqlManagerDoc* CLeftView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMysqlManagerDoc)));
return (CMysqlManagerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLeftView message handlers
void CLeftView::ShowPopupMenu(CPoint &point)
{
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU_MYVIEW));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y,
this);
}
int CLeftView::RegisterServer(LPCTSTR pszServer,LPCTSTR pszHost, unsigned int nPort, bool bTrusted ,LPCTSTR pszUser, LPCTSTR pszPasswd)
{
CString strServer(pszServer);
ServerInfo *pCheckServer;
POSITION pos;
strServer.TrimLeft();
strServer.TrimRight();
pos = m_lstConnect.GetHeadPosition();
while (pos != NULL)
{
pCheckServer = (ServerInfo*)m_lstConnect.GetNext(pos);
if (stricmp(strServer,pCheckServer->strServer) == 0) //This server has been registered
{
AfxMessageBox(IDS_MSG_EXIST_SERVER);
return 0;
}
}
//No same server found
//Create a new server register
pCheckServer = new ServerInfo;
pCheckServer->strServer = strServer;
pCheckServer->pMysql = mysql_init((MYSQL*)NULL);
pCheckServer->strHost = pszHost;
pCheckServer->nPort = nPort;
pCheckServer->bTrusted = bTrusted;
pCheckServer->strUser = pszUser;
pCheckServer->strPasswd = pszPasswd;
if (pCheckServer->pMysql == NULL)
{
AfxMessageBox(IDS_ERR_INIT_MYSQL);
delete pCheckServer;
return 0;
}
else if (m_pCurMysql == NULL)
m_pCurMysql = pCheckServer->pMysql; //Set default connection
if (pCheckServer->bTrusted)
{
if (!mysql_real_connect(pCheckServer->pMysql,pCheckServer->strHost,NULL,NULL,NULL,pCheckServer->nPort,NULL,0))
{
AfxMessageBox(mysql_error(pCheckServer->pMysql));
//AfxMessageBox(IDS_ERR_CONNECT_DB);
delete pCheckServer;
return 0;
}
}
else
{
if (!mysql_real_connect(pCheckServer->pMysql,pCheckServer->strHost,
pCheckServer->strUser,
pCheckServer->strPasswd,
NULL,pCheckServer->nPort,NULL,0))
{
AfxMessageBox(mysql_error(pCheckServer->pMysql));
//AfxMessageBox(IDS_ERR_CONNECT_DB);
delete pCheckServer;
return 0;
}
}
m_lstConnect.AddTail(pCheckServer);
AddServerList(pCheckServer);
return 1;
}
void CLeftView::AddServerList(ServerInfo *pServerInfo)
{
CTreeCtrl& tvCtrl = GetTreeCtrl();
HTREEITEM tviDB,tviTAB;
MYSQL_RES *pResDbs,*pResTabs;
tviDB = tvCtrl.InsertItem(pServerInfo->strServer,0,0,m_tviServerGrp);
pResDbs = mysql_list_dbs(pServerInfo->pMysql,"%"); //Get all database
if (pResDbs != NULL)
{
MYSQL_ROW rowDbs;
while (rowDbs = mysql_fetch_row(pResDbs))
{
if ((rowDbs[0] == NULL) || (strlen(rowDbs[0]) <= 0))
tvCtrl.InsertItem("UNKNOWN DATABASE",1,1,tviDB);
else
{
tviTAB = tvCtrl.InsertItem(rowDbs[0],1,1,tviDB);
mysql_select_db(pServerInfo->pMysql,rowDbs[0]);
pResTabs = mysql_list_tables(pServerInfo->pMysql,"%"); //Get all tables
if (pResTabs != NULL)
{
MYSQL_ROW rowTabs;
while (rowTabs = mysql_fetch_row(pResTabs))
{
if ((rowTabs[0] == NULL) || (strlen(rowTabs[0]) <= 0))
tvCtrl.InsertItem("UNKNOWN TABLE",2,2,tviTAB);
else
tvCtrl.InsertItem(rowTabs[0],2,2,tviTAB);
}
mysql_free_result(pResTabs);
}
}
}
mysql_free_result(pResDbs);
}
}
int CLeftView::ItemStyle(HTREEITEM tviThis,MYSQL **ppMysql)
{
CTreeCtrl& tvCtrl = GetTreeCtrl();
POSITION pos;
ServerInfo *pCheckServer;
CString strServer;
int i = 0;
*ppMysql = NULL;
while ((tviThis != NULL) && (tviThis != m_tviServerGrp))
{
i++;
strServer = tvCtrl.GetItemText(tviThis);
tviThis = tvCtrl.GetParentItem(tviThis);
}
pos = m_lstConnect.GetHeadPosition();
while (pos != NULL)
{
pCheckServer = (ServerInfo*)m_lstConnect.GetNext(pos);
if (stricmp(strServer,pCheckServer->strServer) == 0) //
*ppMysql = pCheckServer->pMysql;
}
return i;
}
void CLeftView::OnLButtonDown(UINT nFlags, CPoint point)
{
CTreeCtrl& tvCtrl = GetTreeCtrl();
UINT uFlags;
HTREEITEM tviItem = tvCtrl.HitTest(point,&uFlags);
if ((tviItem != NULL) && (uFlags & TVHT_ONITEM))
tvCtrl.Select(tviItem, TVGN_DROPHILITE);
CTreeView::OnLButtonDown(nFlags, point);
}
void CLeftView::OnRButtonDown(UINT nFlags, CPoint point)
{
CTreeCtrl& tvCtrl = GetTreeCtrl();
UINT uFlags;
HTREEITEM tviItem = tvCtrl.HitTest(point,&uFlags);
if ((tviItem != NULL) && (uFlags & TVHT_ONITEM))
{
m_tviOldSel = tvCtrl.GetSelectedItem();
tvCtrl.Select(tviItem, TVGN_DROPHILITE);
}
}
void CLeftView::OnContextMenu(CWnd* pWnd, CPoint point)
{
CTreeCtrl& tvCtrl = GetTreeCtrl();
UINT uFlags;
ScreenToClient(&point);
HTREEITEM tviItem = tvCtrl.HitTest(point,&uFlags);
if ((tviItem != NULL) && (uFlags & TVHT_ONITEM))
{
ClientToScreen(&point);
ShowPopupMenu(point);
m_tviCurSel = tviItem;
// No need , when tviItem equal to m_tviOldSel , it will
// cause unlight the selected item
// tvCtrl.SetItemState(tviItem, TVIS_DROPHILITED, TVIS_DROPHILITED);
}
else
CTreeView::OnContextMenu(pWnd, point);
if (m_tviOldSel != NULL)
{
tvCtrl.Select(m_tviOldSel, TVGN_DROPHILITE);
m_tviOldSel = NULL;
}
}
int CLeftView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
m_lstImage.Create(16,16,FALSE,16,0);
HICON hIcon = ::LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_SERVER));
m_lstImage.Add(hIcon);
hIcon = ::LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_DB));
m_lstImage.Add(hIcon);
hIcon = ::LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_TABLE));
m_lstImage.Add(hIcon);
hIcon = ::LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_SERVER_GROUP));
m_lstImage.Add(hIcon);
GetTreeCtrl().SetImageList(&m_lstImage,LVSIL_NORMAL);
InitServerGrp();
// while (dlgRegister.DoModal() == IDOK &&
// !RegisterServer(dlgRegister.m_strServer,
// dlgRegister.m_strHost,
// dlgRegister.m_nPort,
// dlgRegister.m_bTrust,
// dlgRegister.m_strUser,
// dlgRegister.m_strPasswd));
return 0;
}
void CLeftView::RemoveAllServer()
{
ServerInfo *pCheckServer;
POSITION pos;
pos = m_lstConnect.GetHeadPosition();
while (pos != NULL)
{
pCheckServer = (ServerInfo*)m_lstConnect.GetNext(pos);
if (pCheckServer != NULL)
{
m_lstConnect.RemoveAt(m_lstConnect.Find(pCheckServer));
if (pCheckServer->pMysql != NULL)
{
mysql_close(pCheckServer->pMysql);
pCheckServer->pMysql = NULL;
}
delete pCheckServer;
}
}
}
void CLeftView::RemoveServer(LPTSTR pszServer)
{
ServerInfo *pCheckServer;
POSITION pos;
pos = m_lstConnect.GetHeadPosition();
while (pos != NULL)
{
pCheckServer = (ServerInfo*)m_lstConnect.GetNext(pos);
if ((pCheckServer != NULL) && stricmp(pCheckServer->strServer,pszServer) == 0) //Server found
{
m_lstConnect.RemoveAt(m_lstConnect.Find(pCheckServer));
if (pCheckServer->pMysql != NULL)
{
mysql_close(pCheckServer->pMysql);
pCheckServer->pMysql = NULL;
}
delete pCheckServer;
}
}
}
void CLeftView::OnDestroy()
{
CTreeView::OnDestroy();
RemoveAllServer();
}
void CLeftView::OnMenuitem32775()
{
//property
CTreeCtrl& tvCtrl = GetTreeCtrl();
MYSQL *pMysql;
// CString strInfo;
CHAR szDb[512];
HTREEITEM tviDb;
switch (ItemStyle(m_tviCurSel,&pMysql))
{
case 0 :
break;
case 1 : //Server property
// strInfo.LoadString(IDS_MSG_SERVER_VERSION);
// strInfo += mysql_get_server_info(pMysql);
// AfxMessageBox(strInfo,MB_ICONINFORMATION);
dlgServer.m_strHost = pMysql->host;
dlgServer.m_strVersion = pMysql->server_version;
dlgServer.m_strConnection = pMysql->host_info;
dlgServer.m_strPort.Format("%d",pMysql->port);
dlgServer.m_strUser = pMysql->user;
dlgServer.DoModal();
break;
case 2 : //Database property
break;
case 3 : //Table property
dlgTable.m_strTableName = tvCtrl.GetItemText(m_tviCurSel);
dlgTable.m_pMysql = pMysql;
tviDb = tvCtrl.GetParentItem(m_tviCurSel);
strcpy(szDb,tvCtrl.GetItemText(tviDb)); //Get the database name
if (mysql_select_db(pMysql,szDb) != 0) //Error
{
AfxMessageBox(mysql_error(pMysql));
break;
}
dlgTable.DoModal();
if (m_pCurMysql != NULL)
mysql_select_db(m_pCurMysql,m_strCurDb); //back to original database
break;
default :
;
}
}
void CLeftView::OnMenuitem32772()
{
//Delete
CTreeCtrl& tvCtrl = GetTreeCtrl();
MYSQL *pMysql;
CString strInfo;
HTREEITEM tviDb;
CHAR szSQL[1024],szServer[512],szDb[512],szTable[512];
switch (ItemStyle(m_tviCurSel,&pMysql))
{
case 0 : //Server group
break;
case 1 : //Server
strInfo.LoadString(IDS_MSG_UNREGISTER_SERVER);
strcpy(szServer,tvCtrl.GetItemText(m_tviCurSel));
strInfo += szServer;
if (AfxMessageBox(strInfo,MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
{
RemoveServer(szServer);
tvCtrl.DeleteItem(m_tviCurSel);
m_tviCurSel = NULL;
#ifdef INFO_SUCCESS
AfxMessageBox(IDS_MSG_SUCCESS_UNREGISTER_SERVER,MB_ICONINFORMATION);
#endif //INFO_SUCCESS
}
break;
case 2 : //Database
if (tvCtrl.ItemHasChildren(m_tviCurSel))
AfxMessageBox(IDS_MSG_DB_HAVE_TABLES);
else
{
strInfo.LoadString(IDS_MSG_DELETE_DATABASE);
strcpy(szDb,tvCtrl.GetItemText(m_tviCurSel));
strInfo += szDb;
if (AfxMessageBox(strInfo,MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
{
// if (mysql_drop_db(pMysql,szDb) == 0) //Success in drop the database
if (1)
{
tvCtrl.DeleteItem(m_tviCurSel);
m_tviCurSel = NULL;
if (stricmp(m_strCurDb,szDb) == 0)
m_strCurDb = "";
#ifdef INFO_SUCCESS
AfxMessageBox(IDS_MSG_SUCCESS_DELETE_DATABASE,MB_ICONINFORMATION);
#endif //INFO_SUCCESS
}
else
{
AfxMessageBox(mysql_error(pMysql));
//AfxMessageBox(IDS_ERR_DELETE_DATABASE);
}
}
}
break;
case 3 : //Table
strInfo.LoadString(IDS_MSG_DELETE_TABLE);
strcpy(szTable,tvCtrl.GetItemText(m_tviCurSel));
strInfo += szTable;
if (AfxMessageBox(strInfo,MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
{
//Note : you need not care the old selected item ,
// all things will be fine .
tviDb = tvCtrl.GetParentItem(m_tviCurSel);
strcpy(szDb,tvCtrl.GetItemText(tviDb)); //Get the database name
if (mysql_select_db(pMysql,szDb) == 0) //Success
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -