TreeForUsers.cpp
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:12k
源码类别:

网格计算

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "trfAgent.h"
  3. #include "TreeForUsers.h"
  4. #include "SearchUserDlg.h"
  5. #include "variantex.h"
  6. #include "Passwrd.h"
  7. CTreeForUsers::CTreeForUsers()
  8. {
  9. this->m_bIsUpdating = FALSE;
  10. this->m_hdrag_s = this->m_hdrag_d = NULL;
  11. }
  12. CTreeForUsers::~CTreeForUsers(){}
  13. BEGIN_MESSAGE_MAP(CTreeForUsers, CTreeCtrl)
  14. //{{AFX_MSG_MAP(CTreeForUsers)
  15. ON_WM_CREATE()
  16. ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
  17. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  18. ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)
  19. ON_WM_LBUTTONUP()
  20. ON_WM_MOUSEMOVE()
  21. //}}AFX_MSG_MAP
  22. END_MESSAGE_MAP()
  23. int CTreeForUsers::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  24. {
  25. lpCreateStruct->style |= TVS_SHOWSELALWAYS;
  26. lpCreateStruct->style |= !TVS_DISABLEDRAGDROP;
  27. if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
  28. return -1;
  29. if(!this->m_imgTree.Create(IDB_WORKSPACE, 16, 3, RGB(255, 255, 255)))
  30. {
  31. TRACE0("Failed to create the m_imgTree for historyn");
  32. return -1;
  33. }
  34. this->SetImageList(&m_imgTree, TVSIL_NORMAL);
  35. this->UpdateTreeForUserDatas();
  36. return 0;
  37. }
  38. //update user tree's data.
  39. void CTreeForUsers::UpdateTreeForUserDatas()
  40. {
  41. CGuiRecordSet rsd, rsu;
  42. DWORD olddata = 0;
  43. CVariantEx varex;
  44. char sql[MAX_SQL_SIZE];
  45. try
  46. {
  47. //find all first level departs' info
  48. _snprintf(sql, MAX_SQL_SIZE - 1, SQL::CLIENT_GETSUBDEPARTS, -1);
  49. if(!rsd.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql))
  50. {
  51. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED).GetBuffer(0));
  52. return ;
  53. }
  54. //enter departs looping
  55. HTREEITEM hselected = this->GetSelectedItem();
  56. if(hselected)
  57. {
  58. olddata = this->GetItemData(hselected);
  59. }
  60. this->DeleteAllItems();
  61. if(rsd.GetRecordCount() > 0)
  62. {
  63. for(rsd.MoveFirst(); !rsd.IsEof(); rsd.MoveNext())
  64. {
  65. //get depart.db table's field value.
  66. int departid = 0;
  67. string departname("");
  68. rsd.GetCollect("id", varex.get_variant_t());
  69. departid = varex.AsInteger();
  70. rsd.GetCollect("name", varex.get_variant_t());
  71. departname = varex.AsString();
  72. HTREEITEM departnode = this->InsertItem(departname.c_str(), 0, 0);
  73. this->SetItemData(departnode, MAKELONG(departid, NT_DEPART));
  74. if(olddata == this->GetItemData(departnode))
  75. {
  76. this->SelectItem(departnode);
  77. }
  78. //get all user list for specialed depart
  79. _snprintf(sql, MAX_SQL_SIZE - 1, SQL::CLIENT_GETUSRS_FORSPDEPART, departid);
  80. if(!rsu.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql))
  81. {
  82. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED).GetBuffer(0));
  83. return ;
  84. }
  85. //enter users looping
  86. if(rsu.GetRecordCount() > 0)
  87. {
  88. for(rsu.MoveFirst(); !rsu.IsEof(); rsu.MoveNext())
  89. {
  90. int userid = 0, state = 0, imgindex = 1;
  91. string username("");
  92. rsu.GetCollect("id", varex.get_variant_t());
  93. userid = varex.AsInteger();
  94. //exclude current agent.
  95. //if(userid == theApp.m_oCSHelper.GetClientID()) continue;
  96. rsu.GetCollect("name", varex.get_variant_t());
  97. username = varex.AsString();
  98. if(username.empty())
  99. {
  100. rsu.GetCollect("hostname", varex.get_variant_t());
  101. username = varex.AsString();
  102. if(username.empty())
  103. {
  104. rsu.GetCollect("ipaddr", varex.get_variant_t());
  105. username = "Unknown / ";
  106. username = username + varex.AsString();
  107. }
  108. }
  109. rsu.GetCollect("state", varex.get_variant_t());
  110. state = varex.AsInteger();
  111. imgindex = state ? 1 : 2;
  112. HTREEITEM usernode = this->InsertItem(username.c_str(), imgindex, imgindex, departnode);
  113. this->SetItemData(usernode, MAKELONG(userid, NT_AGENT));
  114. if(olddata == this->GetItemData(usernode))
  115. {
  116. this->SelectItem(usernode);
  117. }
  118. }
  119. }
  120. rsu.Close();
  121. }
  122. }
  123. rsd.Close();
  124. //add all agents that not in anyone depart
  125. _snprintf(sql, MAX_SQL_SIZE - 1, SQL::CLIENT_GETUSRS_FORSPDEPART, -1);
  126. if(!rsu.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql))
  127. {
  128. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED).GetBuffer(0));
  129. return ;
  130. }
  131. if(rsu.GetRecordCount() > 0)
  132. {
  133. HTREEITEM departnode = this->InsertItem(_LoadString(IDS_DEPARTNOGRP).GetBuffer(0), 0, 0);
  134. this->SetItemData(departnode, MAKELONG(0, NT_DEPART));
  135. for(rsu.MoveFirst(); !rsu.IsEof(); rsu.MoveNext())
  136. {
  137. int userid = 0, state = 0, imgindex = 1;
  138. string username("");
  139. rsu.GetCollect("id", varex.get_variant_t());
  140. userid = varex.AsInteger();
  141. rsu.GetCollect("name", varex.get_variant_t());
  142. username = varex.AsString();
  143. if(username.empty())
  144. {
  145. rsu.GetCollect("hostname", varex.get_variant_t());
  146. username = varex.AsString();
  147. if(username.empty())
  148. {
  149. rsu.GetCollect("ipaddr", varex.get_variant_t());
  150. username = "Unknown / ";
  151. username = username + varex.AsString();
  152. }
  153. }
  154. rsu.GetCollect("state", varex.get_variant_t());
  155. state = varex.AsInteger();
  156. imgindex = state ? 1 : 2;
  157. HTREEITEM usernode = this->InsertItem(username.c_str(), imgindex, imgindex, departnode);
  158. this->SetItemData(usernode, MAKELONG(userid, NT_AGENT));
  159. if(olddata == this->GetItemData(usernode))
  160. {
  161. this->SelectItem(usernode);
  162. }
  163. }
  164. }
  165. rsu.Close();
  166. }
  167. catch (_com_error e) 
  168. {
  169. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED));
  170. return ;
  171. }
  172. }
  173. //find specialed user node on this tree
  174. void CTreeForUsers::FindSpecialedUser()
  175. {
  176. CSearchUserDlg findusrdlg;
  177. if(IDCANCEL == findusrdlg.DoModal()) return ;
  178. int findagid = -1;
  179. //if searching user for host name or ip address then
  180. if(findusrdlg.m_chkhostname || findusrdlg.m_chkipaddr)
  181. {
  182. //query database data
  183. char sql[MAX_SQL_SIZE];
  184. CGuiRecordSet rs;
  185. try
  186. {
  187. findagid = 0;
  188. //if searching user for host name then
  189. if(findusrdlg.m_chkhostname)
  190. {
  191. _snprintf(sql, MAX_SQL_SIZE-1, SQL::CLIENT_GETSPECEAGENT_FROM_HOST, findusrdlg.m_shostname.GetBuffer(0));
  192. }
  193. else if(findusrdlg.m_chkipaddr)
  194. {
  195. _snprintf(sql, MAX_SQL_SIZE-1, SQL::CLIENT_GETSPECEAGENT_FROM_IP, findusrdlg.m_sipaddrtxt.GetBuffer(0));
  196. }
  197. //query database
  198. if(!rs.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql))
  199. {
  200. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED).GetBuffer(0));
  201. return ;
  202. }
  203. if(rs.GetRecordCount() == 0)
  204. {
  205. MSGBOX_INFO(_LoadString(IDS_DBRSISEMPRY).GetBuffer(0));
  206. return ;
  207. }
  208. //get every field values
  209. CVariantEx varex;
  210. rs.GetCollect("id", varex.get_variant_t());
  211. findagid = varex.AsInteger();
  212. rs.Close();
  213. }
  214. catch (_com_error e) 
  215. {
  216. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED).GetBuffer(0));
  217. return ;
  218. }
  219. }
  220. HTREEITEM hitem = this->GetRootItem();
  221. for(; hitem != NULL; hitem = this->GetNextSiblingItem(hitem))
  222. {
  223. HTREEITEM hsubitem = this->GetChildItem(hitem), hnextitem = hsubitem;
  224. for(; hsubitem != NULL; )
  225. {
  226. CString caption = this->GetItemText(hsubitem);
  227. if(findagid == -1 && !caption.Compare(findusrdlg.m_susername.GetBuffer(0)))
  228. {
  229. this->SelectItem(hsubitem);
  230. return ;
  231. }
  232. //if searching user for user name then
  233. WORD agentid = LOWORD(this->GetItemData(hsubitem));
  234. if(findagid == agentid)
  235. {
  236. this->SelectItem(hsubitem);
  237. return ;
  238. }
  239. //next subitem
  240. hnextitem = this->GetNextItem(hsubitem, TVGN_NEXT);
  241. hsubitem = hnextitem;
  242. }
  243. }
  244. }
  245. bool CTreeForUsers::GetAGInfo(AGINFO &aginfo)
  246. {
  247. HTREEITEM hselected = this->GetSelectedItem();
  248. if(NULL == hselected)
  249. {
  250. MSGBOX_INFO(_LoadString(IDS_NOSELECTNODE).GetBuffer(0));
  251. return false;
  252. }
  253. else
  254. {
  255. CGuiRecordSet rs;
  256. CVariantEx varex;
  257. CString stemp;
  258. char sql[MAX_SQL_SIZE];
  259. try
  260. {
  261. if(HIWORD(this->GetItemData(hselected)) == NT_AGENT)
  262. {
  263. WORD agentid = LOWORD(this->GetItemData(hselected));
  264. _snprintf(sql, MAX_SQL_SIZE-1, SQL::CLIENT_GETSPECEAGENT_FROM_ID, agentid);
  265. if(!rs.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql))
  266. {
  267. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED).GetBuffer(0));
  268. return false;
  269. }
  270. if(rs.GetRecordCount() == 0) return false;
  271. rs.GetCollect("ipaddr", varex.get_variant_t());
  272. aginfo.shostip = varex.AsString();
  273. rs.GetCollect("hostname", varex.get_variant_t());
  274. aginfo.shostname = varex.AsString();
  275. rs.Close();
  276. return true;
  277. }
  278. else return false;
  279. }
  280. catch (_com_error e) 
  281. {
  282. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED).GetBuffer(0));
  283. return false;
  284. }
  285. }
  286. }
  287. //!!!GuiToolKit Bug --- Right mouse click couldn't trigger WM_CONTEXTMENU message
  288. void CTreeForUsers::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
  289. {
  290. POINT ptcursor;
  291. ::GetCursorPos(&ptcursor);
  292. this->SendMessage(WM_CONTEXTMENU, (WPARAM)this->GetSafeHwnd(), MAKELONG(ptcursor.x, ptcursor.y));
  293. *pResult = 0;
  294. }
  295. void CTreeForUsers::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  296. {
  297. AGINFO aginfo;
  298. if(this->GetAGInfo(aginfo))
  299. {
  300. CString stemp;
  301. stemp.Format("%s / %s", aginfo.shostname.c_str(), aginfo.shostip.c_str());
  302. char *puretxt = new char[stemp.GetLength()+1];
  303. _snprintf(puretxt, stemp.GetLength()+1, "%s", stemp.GetBuffer(0));
  304. stemp.Empty();
  305. ::SendMessage(theApp.m_pMainWnd->GetSafeHwnd(), UWM_UPDATESTATUSBAR, MAKEWORD(0, 1), (LPARAM)puretxt);
  306. }
  307. else
  308. {
  309. ::SendMessage(theApp.m_pMainWnd->GetSafeHwnd(), UWM_UPDATESTATUSBAR, MAKEWORD(0, 1), (LPARAM)NULL);
  310. }
  311. *pResult = 0;
  312. }
  313. void CTreeForUsers::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
  314. {
  315. this->m_hdrag_s = this->m_hdrag_s = NULL;
  316. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  317. *pResult = 0;
  318. if(HIWORD(this->GetItemData(pNMTreeView->itemNew.hItem)) == NT_DEPART) return ;
  319. if(!theApp.m_oAppInstance.m_binadminmode) return ;
  320. this->m_hdrag_s = pNMTreeView->itemNew.hItem;
  321. }
  322. void CTreeForUsers::OnLButtonUp(UINT nFlags, CPoint point) 
  323. {
  324. UINT flags = 0;
  325. HTREEITEM hitem = this->HitTest(point, &flags);
  326. if(NULL != hitem && NULL != this->m_hdrag_s && theApp.m_oAppInstance.m_binadminmode)
  327. {
  328. if(HIWORD(this->GetItemData(hitem)) == NT_AGENT)
  329. {
  330. hitem = this->GetParentItem(hitem);
  331. }
  332. this->m_hdrag_d = hitem;
  333. //if dest node's parent is same as source node's parent then return...
  334. if(this->GetParentItem(this->m_hdrag_d) == this->GetParentItem(this->m_hdrag_s))
  335. {
  336. return ;
  337. }
  338. //@1---author to server
  339. if(!theApp.m_oCSHelper.VerifyCurrentUser())
  340. {
  341. this->m_hdrag_s = this->m_hdrag_d = NULL;
  342. CTreeCtrl::OnLButtonUp(nFlags, point);
  343. MSGBOX_ERROR(_LoadString(IDS_USRAUTHORFAIL).GetBuffer(0));
  344. return ;
  345. }
  346. //@2---update remote database contents.
  347. bool bsuccessful = true;
  348. int newdepid = LOWORD(this->GetItemData(this->m_hdrag_d)),
  349. agentid  = LOWORD(this->GetItemData(this->m_hdrag_s));
  350. char sql[MAX_SQL_SIZE];
  351. _snprintf(sql, MAX_SQL_SIZE-1, SQL::SERVER_UPDATE_AGFORDEPART, newdepid, agentid);
  352. CGuiRecordSet *prs = theApp.m_oCSHelper.SendAGUsrSql(sql, bsuccessful, false);
  353. _DELETE(prs);
  354. if(!bsuccessful)
  355. {
  356. this->m_hdrag_s = this->m_hdrag_d = NULL;
  357. CTreeCtrl::OnLButtonUp(nFlags, point);
  358. //MSGBOX_ERROR(_LoadString(IDS_DBOPERFAILED).GetBuffer(0));
  359. return ;
  360. }
  361. int nimage = 0, nselimage = 0;
  362. this->GetItemImage(this->m_hdrag_s, nimage, nselimage);
  363. DWORD dwdata = this->GetItemData(this->m_hdrag_s);
  364. hitem = this->InsertItem( this->GetItemText(this->m_hdrag_s).GetBuffer(0), nimage, nselimage, this->m_hdrag_d );
  365. this->SetItemData(hitem, dwdata);
  366. this->DeleteItem(this->m_hdrag_s);
  367. //@3---update local databse contents.
  368. CGuiRecordSet rs;
  369. try
  370. {
  371. _snprintf(sql, MAX_SQL_SIZE-1, SQL::CLIENT_UPDATE_AGFORDEPART, newdepid, agentid);
  372. rs.Open(theApp.m_oAppInstance.m_adoconn.GetConecction(), sql);
  373. }
  374. catch (_com_error e){}
  375. }
  376. this->m_hdrag_s = this->m_hdrag_d = NULL;
  377. CTreeCtrl::OnLButtonUp(nFlags, point);
  378. }
  379. void CTreeForUsers::OnMouseMove(UINT nFlags, CPoint point) 
  380. {
  381. UINT flags = 0;
  382. HTREEITEM hitem = this->HitTest(point, &flags);
  383. if(NULL != hitem && NULL != this->m_hdrag_s)
  384. {
  385. this->SelectItem(hitem);
  386. }
  387. CTreeCtrl::OnMouseMove(nFlags, point);
  388. }