LogList.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:8k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // LogList.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "LogList.h"
  6. #include "FileDB.h"
  7. #include "FileBase.h"
  8. #include "MonitorWnd.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #define ID_MENUITEM_CLEAR_ALL 52797
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CLogList
  17. CLogList::CLogList():
  18. CListCtrlBaseEx("LogList", false)
  19. {
  20. //
  21. // column infos.
  22. //
  23. CString strFieldNames[eColumnCount];
  24. bool bColumnNumeric[eColumnCount];
  25. strFieldNames[eTime] = "时间";
  26. strFieldNames[eInfo] = "信息";
  27. bColumnNumeric[eTime] = false;
  28. bColumnNumeric[eInfo] = false;
  29. AddColumn(strFieldNames[0], bColumnNumeric[0]);
  30. AddColumn(strFieldNames[1], bColumnNumeric[1], 1000);
  31. m_pFileDBItem = 0;
  32. m_pMonitorWnd = 0;
  33. }
  34. CLogList::~CLogList()
  35. {
  36. }
  37. BEGIN_MESSAGE_MAP(CLogList, CListCtrlBaseEx)
  38. //{{AFX_MSG_MAP(CLogList)
  39. ON_WM_CREATE()
  40. ON_WM_CONTEXTMENU()
  41. //}}AFX_MSG_MAP
  42. ON_NOTIFY_REFLECT(LVN_DELETEITEM, OnDeleteitem)
  43. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  44. ON_COMMAND(ID_EDIT_COPY, OnMenuitemCopy)
  45. ON_COMMAND(ID_MENUITEM_SELECT_ALL, OnMenuitemSelectAll)
  46. ON_COMMAND(ID_MENUITEM_CLEAR_ALL, OnMenuitemClearAll)
  47. ON_COMMAND_RANGE(ID_MENUITEM_MONITOR_INFORMATION, ID_MENUITEM_MONITOR_LOGS, OnMenuitemMonitorSub)
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CLogList message handlers
  51. BOOL CLogList::CreateEx(CWnd *pParent, CRect rc, long lID, long lParam, CMonitorWnd* pMonitorWnd)
  52. {
  53. m_pMonitorWnd = pMonitorWnd;
  54. return Create(WS_CHILD|WS_BORDER|WS_VISIBLE|WS_VSCROLL|LVS_REPORT, rc, pParent, lID);
  55. }
  56. int CLogList::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  57. {
  58. if (CListCtrlBaseEx::OnCreate(lpCreateStruct) == -1)
  59. return -1;
  60. //
  61. // ImageList.
  62. //
  63. HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
  64. MAKEINTRESOURCE(IDB_BITMAP_SYSTEM_MSG), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
  65. CBitmap bm;
  66. bm.Attach(hbm);
  67. m_ctlImage.Create(14, 17, ILC_COLOR8|ILC_MASK, 11, 4);
  68. m_ctlImage.SetBkColor(::GetSysColor(COLOR_WINDOW)); 
  69. m_ctlImage.Add(&bm, (COLORREF)RGB(255,0,255));
  70. SetImageList(&m_ctlImage, LVSIL_SMALL);
  71. SetExtendedStyle(LVS_EX_FULLROWSELECT); //|LVS_EX_GRIDLINES);
  72. return 0;
  73. }
  74. void CLogList::OnContextMenu(CWnd* pWnd, CPoint point) 
  75. {
  76. // if (CListCtrlBaseEx::OnContextMenu(pWnd, point))
  77. // return;
  78. CRect rc;
  79. GetClientRect(&rc);
  80. ClientToScreen(rc);
  81. if (!rc.PtInRect(point))
  82. {
  83. CWnd::OnContextMenu(pWnd, point);
  84. return;
  85. }
  86. bool bcopy = false;
  87. if (GetSelectedCount())
  88. bcopy = true;
  89. CMenu menu_bar;
  90. menu_bar.CreatePopupMenu();
  91. menu_bar.AppendMenu(MF_STRING, ID_EDIT_COPY, "复制(&C)t");
  92. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_CLEAR_ALL, "清除(&R)t");
  93. menu_bar.AppendMenu(MF_STRING, ID_MENUITEM_SELECT_ALL, "全选(&A)t");
  94. menu_bar.EnableMenuItem(ID_EDIT_COPY, MF_BYCOMMAND | 
  95. (bcopy ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
  96. menu_bar.AppendMenu(MF_SEPARATOR);
  97. if (!m_pMonitorWnd)
  98. {
  99. assert(false);
  100. return;
  101. }
  102. m_pMonitorWnd->OnContextQuery(menu_bar);
  103. CPoint posMouse;
  104. GetCursorPos(&posMouse);
  105. menu_bar.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,posMouse.x,posMouse.y,this);
  106. }
  107. void CLogList::OnMenuitemMonitorSub(UINT uID) 
  108. {
  109. if (!m_pMonitorWnd)
  110. {
  111. assert(false);
  112. return;
  113. }
  114. if (uID >= ID_MENUITEM_MONITOR_INFORMATION && 
  115. uID <= ID_MENUITEM_MONITOR_LOGS)
  116. {
  117. m_pMonitorWnd->OnShowNode(uID );
  118. }
  119. }
  120. void CLogList::OnMenuitemCopy()
  121. {
  122. CString strSource; 
  123. int nColumnCount = GetHeaderCtrl()->GetItemCount();
  124. POSITION pos = GetFirstSelectedItemPosition();
  125. while (pos)
  126. {
  127. int index = GetNextSelectedItem(pos);
  128. for (int i=0; i<nColumnCount; i++)
  129. strSource += GetItemText(index, i) + "  ";
  130. strSource += "rn";
  131. }
  132. if (!CopyTextToClipboard(strSource))
  133. AfxMessageBox("复制失败");
  134. }
  135. void CLogList::OnMenuitemClearAll()
  136. {
  137. if (m_pFileDBItem)
  138. {
  139. if (m_pFileDBItem->m_pDownload)
  140. {
  141. m_pFileDBItem->m_pDownload->GetFeedback().ClearSystemMessage();
  142. }
  143. else
  144. {
  145. m_pFileDBItem->m_vMsg.clear();
  146. }
  147. }
  148. DeleteAllItems();
  149. }
  150. void CLogList::OnMenuitemSelectAll()
  151. {
  152. for (int i=0; i<GetItemCount(); i++)
  153. SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
  154. SetFocus();
  155. }
  156. void CLogList::OnShowColumn(int iItem)
  157. {
  158. ShowMsgText(iItem);
  159. }
  160. void CLogList::Monitor(CFileDBItem* pFileDBItem)
  161. {
  162. m_pFileDBItem = pFileDBItem;
  163. DeleteAllItems();
  164. }
  165. void CLogList::ShowLogs(bool bRefreshInfo)
  166. {
  167. if (bRefreshInfo)
  168. {
  169. DeleteAllItems();
  170. }
  171. if (m_pFileDBItem)
  172. {
  173. vector<CSystemMsg> vSystemMsg;
  174. if (m_pFileDBItem->m_pDownload)
  175. {
  176. m_pFileDBItem->m_pDownload->GetSystemMessage(vSystemMsg);
  177. }
  178. else
  179. {
  180. vSystemMsg = m_pFileDBItem->m_vMsg;
  181. }
  182. if (!vSystemMsg.empty())
  183. {
  184. time_t tBeg = vSystemMsg[0].m_time;
  185. while (GetItemCount())
  186. {
  187. CSystemMsg* pData = (CSystemMsg*)GetItemData(0);
  188. if (!pData)
  189. {
  190. assert(false);
  191. break;
  192. }
  193. if (pData->m_time < tBeg)
  194. DeleteItem(0);
  195. else
  196. break;
  197. }
  198. }
  199. int iStart = 0;
  200. if (!bRefreshInfo)
  201. {
  202. iStart = GetItemCount();
  203. if (vSystemMsg.size() < iStart)
  204. {
  205. iStart  = 0;
  206. DeleteAllItems();
  207. }
  208. }
  209. for (int i=iStart; i<vSystemMsg.size(); i++)
  210. {
  211. InsertItem(i, "");//vSystemMsg[i].m_strMsg.data());
  212. CSystemMsg* pData = new CSystemMsg(vSystemMsg[i]);
  213. SetItemData(i, (long)pData);
  214. ShowMsgText(i);
  215. }
  216. }
  217. }
  218. void CLogList::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) 
  219. {
  220. *pResult = 0;
  221. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  222. CSystemMsg* pData = (CSystemMsg*)pNMListView->lParam;;
  223. if (!pData)
  224. {
  225. assert(false);
  226. return;
  227. }
  228. delete pData;
  229. }
  230. void CLogList::ShowMsgText(int iItem)
  231. {
  232. CSystemMsg* pData = (CSystemMsg*)GetItemData(iItem);
  233. if (!pData)
  234. {
  235. assert(false);
  236. return;
  237. }
  238. CSystemMsg& msg = *pData;
  239. UINT iImageID = 0;
  240. switch (msg.m_eMsgType)
  241. {
  242. case CSystemMsg::eMsgOut:
  243. iImageID = eMsgOutID;
  244. break;
  245. case CSystemMsg::eMsgIn:
  246. iImageID = eMsgInID;
  247. break;
  248. case CSystemMsg::eCmd:
  249. iImageID = eCmdID;
  250. break;
  251. case CSystemMsg::eBad:
  252. iImageID = eBadID;
  253. break;
  254. default:
  255. assert(false);
  256. return;
  257. }
  258. SetItem(iItem, 0, LVIF_IMAGE, 0, iImageID, 0, 0, 0);
  259. SetItemTextEx(iItem, eTime, CTime(msg.m_time).Format("%Y-%m-%d %H:%M:%S"));
  260. SetItemTextEx(iItem, eInfo, msg.m_strMsg.data());
  261. }
  262. void CLogList::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  263. {
  264. LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
  265. switch(lplvcd->nmcd.dwDrawStage)
  266. {
  267. case CDDS_PREPAINT:
  268. *pResult = CDRF_NOTIFYSUBITEMDRAW;          // ask for subitem notifications.
  269. break;
  270. case CDDS_ITEMPREPAINT:
  271. {
  272. *pResult = CDRF_DODEFAULT;
  273. if (!(lplvcd->nmcd.uItemState & CDIS_SELECTED ))
  274. {
  275. CSystemMsg* pData = (CSystemMsg*)lplvcd->nmcd.lItemlParam;
  276. CSystemMsg& msg = *pData;
  277. switch (msg.m_eMsgType)
  278. {
  279. case CSystemMsg::eMsgOut:
  280. lplvcd->clrTextBk = RGB(235, 242, 254);
  281. break;
  282. case CSystemMsg::eMsgIn:
  283. // lplvcd->clrTextBk = RGB(235, 242, 254);
  284. lplvcd->clrTextBk = RGB(255, 250, 237); 
  285. break;
  286. case CSystemMsg::eCmd:
  287. lplvcd->clrTextBk = RGB(235, 242, 254); // //RGB(230, 230, 250); // 175, 238, 238 //
  288. break;
  289. case CSystemMsg::eBad:
  290. lplvcd->clrTextBk = RGB(254, 238, 231);
  291. break;
  292. default:
  293. assert(false);
  294. return;
  295. }
  296. *pResult = CDRF_NEWFONT;
  297. }
  298. //*pResult = CDRF_NOTIFYSUBITEMDRAW;          // ask for subitem notifications.
  299. }
  300. break;
  301. case CDDS_ITEMPREPAINT|CDDS_SUBITEM: // recd when CDRF_NOTIFYSUBITEMDRAW is returned in
  302. {                                    // response to CDDS_ITEMPREPAINT.
  303. *pResult = CDRF_DODEFAULT;
  304. int iCol = lplvcd->iSubItem;
  305. int iRow = lplvcd->nmcd.dwItemSpec;
  306. break;
  307. }
  308. default:// it wasn't a notification that was interesting to us.
  309. *pResult = CDRF_DODEFAULT;
  310. }
  311. }