MsgTreeView.cpp
上传用户:zslianheng
上传日期:2013-04-03
资源大小:946k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Visual C++

  1. /***************************************************************************
  2.  *                                                                         *
  3.  *   This program is free software; you can redistribute it and/or modify  *
  4.  *   it under the terms of the GNU General Public License as published by  *
  5.  *   the Free Software Foundation; either version 2 of the License, or     *
  6.  *   (at your option) any later version.                                   *
  7.  *                                                                         *
  8.  *   copyright            : (C) 2002 by Zhang Yong                         *
  9.  *   email                : z-yong163@163.com                              *
  10.  ***************************************************************************/
  11. // MsgTreeView.cpp : implementation file
  12. //
  13. #include "stdafx.h"
  14. #include "myicq.h"
  15. #include "MsgTreeView.h"
  16. #include "MsgListView.h"
  17. #include "myicqDlg.h"
  18. #include "serversession.h"
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24. void writeMsgTxt(CStdioFile &file, uint32 uin)
  25. {
  26. CString tmp, nick, str;
  27. tmp.LoadString(IDS_MSG_OBJ);
  28. if (uin) {
  29. IcqContact *c = icqLink->findContact(uin);
  30. if (c)
  31. nick = c->nick.c_str();
  32. else
  33. nick.Format("%lu", uin);
  34. str.Format("%s:%lu(%s)n", (LPCTSTR) tmp, uin, (LPCTSTR) nick);
  35. } else {
  36. str.LoadString(IDS_SYSMSG);
  37. str = tmp + ":" + str + 'n';
  38. }
  39. file.WriteString("--------------------------------------------------n");
  40. file.WriteString(str);
  41. file.WriteString("--------------------------------------------------n");
  42. PtrList msgList;
  43. IcqDB::loadMsg(uin, msgList);
  44. while (!msgList.empty()) {
  45. IcqMsg *msg = (IcqMsg *) msgList.front();
  46. msgList.pop_front();
  47. if (!uin)
  48. nick.Format("%lu", msg->uin);
  49. exportMsgTxt(file, msg, nick);
  50. delete msg;
  51. }
  52. file.WriteString("n");
  53. }
  54. void writeContact(CStdioFile &file, IcqContact *c) {
  55. FILE *fp = file.m_pStream;
  56. CString str, tmp;
  57. tmp.LoadString(IDS_MSG_OBJ);
  58. str.Format("%s:%lu(%s)n", (LPCTSTR) tmp, c->uin, c->nick.c_str());
  59. file.WriteString("--------------------------------------------------n");
  60. file.WriteString(str);
  61. file.WriteString("--------------------------------------------------n");
  62. str.LoadString(IDS_UIN);
  63. tmp.Format("%lu", c->uin);
  64. file.WriteString(str + " " + tmp + "nn");
  65. str.LoadString(IDS_NICK);
  66. file.WriteString(str + " " + c->nick.c_str() + "nn");
  67. str.LoadString(IDS_AGE);
  68. tmp.Format("%d", c->age);
  69. file.WriteString(str + " " + tmp + "nn");
  70. str.LoadString(IDS_GENDER);
  71. file.WriteString(str + " " + getApp()->genderNames[c->gender] + "nn");
  72. str.LoadString(IDS_COUNTRY);
  73. file.WriteString(str + " " + c->country.c_str() + "nn");
  74. str.LoadString(IDS_PROVINCE);
  75. file.WriteString(str + " " + c->province.c_str() + "nn");
  76. str.LoadString(IDS_CITY);
  77. file.WriteString(str + " " + c->city.c_str() + "nn");
  78. str.LoadString(IDS_EMAIL);
  79. file.WriteString(str + " " + c->email.c_str() + "nn");
  80. str.LoadString(IDS_ADDRESS);
  81. file.WriteString(str + " " + c->address.c_str() + "nn");
  82. str.LoadString(IDS_ZIPCODE);
  83. file.WriteString(str + " " + c->zipcode.c_str() + "nn");
  84. str.LoadString(IDS_TEL);
  85. file.WriteString(str + " " + c->tel.c_str() + "nn");
  86. str.LoadString(IDS_REALNAME);
  87. file.WriteString(str + " " + c->name.c_str() + "nn");
  88. str.LoadString(IDS_BLOODTYPE);
  89. file.WriteString(str + " " + getApp()->bloodNames[c->blood] + "nn");
  90. str.LoadString(IDS_COLLEGE);
  91. file.WriteString(str + " " + c->college.c_str() + "nn");
  92. str.LoadString(IDS_PROFESSION);
  93. file.WriteString(str + " " + c->profession.c_str() + "nn");
  94. str.LoadString(IDS_HOMEPAGE);
  95. file.WriteString(str + " " + c->homepage.c_str() + "nn");
  96. str.LoadString(IDS_SELFINTRO);
  97. file.WriteString(str + " " + c->intro.c_str() + "nn");
  98. file.WriteString("n");
  99. }
  100. #define NODE_FOLDER 0xffffffff
  101. /////////////////////////////////////////////////////////////////////////////
  102. // CMsgTreeView
  103. IMPLEMENT_DYNCREATE(CMsgTreeView, CTreeView)
  104. CMsgTreeView::CMsgTreeView()
  105. {
  106. listView = NULL;
  107. }
  108. CMsgTreeView::~CMsgTreeView()
  109. {
  110. }
  111. DWORD CMsgTreeView::getUIN()
  112. {
  113. HTREEITEM item = GetTreeCtrl().GetSelectedItem();
  114. return (item ? GetTreeCtrl().GetItemData(item) : NODE_FOLDER);
  115. }
  116. void CMsgTreeView::save(DBOutStream &out)
  117. {
  118. out << GetTreeCtrl().GetTextColor();
  119. out << GetTreeCtrl().GetBkColor();
  120. }
  121. void CMsgTreeView::load(DBInStream &in)
  122. {
  123. COLORREF color;
  124. in >> color;
  125. GetTreeCtrl().SetTextColor(color);
  126. in >> color;
  127. GetTreeCtrl().SetBkColor(color);
  128. }
  129. HTREEITEM CMsgTreeView::findItem(HTREEITEM item, DWORD uin)
  130. {
  131. CTreeCtrl &tree = GetTreeCtrl();
  132. if (tree.ItemHasChildren(item)) {
  133. HTREEITEM child = tree.GetChildItem(item);
  134. while (child) {
  135. HTREEITEM ret = findItem(child, uin);
  136. if (ret)
  137. return ret;
  138. child = tree.GetNextSiblingItem(child);
  139. }
  140. } else if (tree.GetItemData(item) == uin)
  141. return item;
  142. return NULL;
  143. }
  144. void CMsgTreeView::expand(DWORD uin)
  145. {
  146. CTreeCtrl &tree = GetTreeCtrl();
  147. HTREEITEM root = tree.GetRootItem();
  148. if (uin) {
  149. HTREEITEM item = findItem(root, uin);
  150. if (item) {
  151. tree.SelectItem(item);
  152. while ((item = tree.GetParentItem(item)) != NULL)
  153. tree.Expand(item, TVE_EXPAND);
  154. }
  155. } else
  156. tree.Expand(root, TVE_EXPAND);
  157. }
  158. void CMsgTreeView::delMsg(HTREEITEM item)
  159. {
  160. CTreeCtrl &tree = GetTreeCtrl();
  161. uint32 uin = tree.GetItemData(item);
  162. if (uin == NODE_FOLDER) {
  163. HTREEITEM child = tree.GetChildItem(item);
  164. while (child) {
  165. delMsg(child);
  166. child = tree.GetNextSiblingItem(child);
  167. }
  168. } else {
  169. uin = tree.GetItemData(item);
  170. IcqDB::delMsg(uin);
  171. }
  172. }
  173. void CMsgTreeView::exportTxt(CStdioFile &file, HTREEITEM item)
  174. {
  175. CTreeCtrl &tree = GetTreeCtrl();
  176. uint32 uin = tree.GetItemData(item);
  177. if (uin == NODE_FOLDER) {
  178. HTREEITEM child = tree.GetChildItem(item);
  179. while (child) {
  180. exportTxt(file, child);
  181. child = tree.GetNextSiblingItem(child);
  182. }
  183. } else
  184. writeMsgTxt(file, uin);
  185. }
  186. void CMsgTreeView::exportContact(CStdioFile &file, HTREEITEM item)
  187. {
  188. CTreeCtrl &tree = GetTreeCtrl();
  189. uint32 uin = tree.GetItemData(item);
  190. if (uin == NODE_FOLDER) {
  191. HTREEITEM child = tree.GetChildItem(item);
  192. while (child) {
  193. exportContact(file, child);
  194. child = tree.GetNextSiblingItem(child);
  195. }
  196. } else if (uin) {
  197. CString nick;
  198. IcqContact *c = icqLink->findContact(uin);
  199. if (c)
  200. writeContact(file, c);
  201. }
  202. }
  203. void CMsgTreeView::exportBak(const char *fileName, HTREEITEM item)
  204. {
  205. CTreeCtrl &tree = GetTreeCtrl();
  206. uint32 uin = tree.GetItemData(item);
  207. if (uin == NODE_FOLDER) {
  208. HTREEITEM child = tree.GetChildItem(item);
  209. while (child) {
  210. exportBak(fileName, child);
  211. child = tree.GetNextSiblingItem(child);
  212. }
  213. } else
  214. IcqDB::exportMsg(fileName, uin);
  215. }
  216. void CMsgTreeView::exportTxt(CStdioFile &file)
  217. {
  218. HTREEITEM item = GetTreeCtrl().GetSelectedItem();
  219. if (item)
  220. exportTxt(file, item);
  221. }
  222. void CMsgTreeView::exportContact(CStdioFile &file)
  223. {
  224. HTREEITEM item = GetTreeCtrl().GetSelectedItem();
  225. if (item)
  226. exportContact(file, item);
  227. }
  228. void CMsgTreeView::delSelectedMsg()
  229. {
  230. CTreeCtrl &tree = GetTreeCtrl();
  231. HTREEITEM item = tree.GetSelectedItem();
  232. if (item) {
  233. delMsg(item);
  234. listView->clear();
  235. }
  236. }
  237. BEGIN_MESSAGE_MAP(CMsgTreeView, CTreeView)
  238. //{{AFX_MSG_MAP(CMsgTreeView)
  239. ON_WM_CREATE()
  240. ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
  241. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  242. ON_UPDATE_COMMAND_UI(ID_EDIT_DEL, OnUpdateEditDel)
  243. ON_UPDATE_COMMAND_UI(ID_EXPORT_CONTACT, OnUpdateExportContact)
  244. ON_UPDATE_COMMAND_UI(ID_EXPORT_BAK, OnUpdateExportBak)
  245. ON_COMMAND(ID_EXPORT_BAK, OnExportBak)
  246. ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
  247. ON_COMMAND(ID_EXPORT_BACKUP, OnExportBackup)
  248. //}}AFX_MSG_MAP
  249. END_MESSAGE_MAP()
  250. /////////////////////////////////////////////////////////////////////////////
  251. // CMsgTreeView diagnostics
  252. #ifdef _DEBUG
  253. void CMsgTreeView::AssertValid() const
  254. {
  255. CTreeView::AssertValid();
  256. }
  257. void CMsgTreeView::Dump(CDumpContext& dc) const
  258. {
  259. CTreeView::Dump(dc);
  260. }
  261. #endif //_DEBUG
  262. /////////////////////////////////////////////////////////////////////////////
  263. // CMsgTreeView message handlers
  264. BOOL CMsgTreeView::PreCreateWindow(CREATESTRUCT& cs) 
  265. {
  266. cs.style |= TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_HASBUTTONS | TVS_HASLINES;
  267. return CTreeView::PreCreateWindow(cs);
  268. }
  269. int CMsgTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  270. {
  271. if (CTreeView::OnCreate(lpCreateStruct) == -1)
  272. return -1;
  273. CTreeCtrl &tree = GetTreeCtrl();
  274. tree.SetImageList(&getApp()->smallImageList, TVSIL_NORMAL);
  275. tree.SetItemHeight(24);
  276. IcqUser &myInfo = icqLink->myInfo;
  277. CString str;
  278. str.Format("%lu(%s)", myInfo.uin, myInfo.nick.c_str());
  279. HTREEITEM root = tree.InsertItem(str, getApp()->getImageIndex(myInfo.face),
  280. getApp()->getImageIndex(myInfo.face, STATUS_AWAY), NULL);
  281. tree.SetItemData(root, NODE_FOLDER);
  282. MyICQCtrl &outbar = ((CIcqDlg *) AfxGetMainWnd())->outbarCtrl;
  283. int n = outbar.getFolderCount();
  284. CString name;
  285. int image;
  286. HTREEITEM stranger = NULL;
  287. UinList msgUinList;
  288. IcqDB::getMsgUinList(msgUinList);
  289. for (int i = 0; i < n; ++i) {
  290. outbar.getFolderName(i, name);
  291. image = getApp()->iconIndex(ICON_FOLDER);
  292. HTREEITEM parent = tree.InsertItem(name, image, image, root);
  293. tree.SetItemData(parent, NODE_FOLDER);
  294. int nrItems = outbar.getItemCount(i);
  295. for (int j = 0; j < nrItems; ++j) {
  296. IcqContact *c = outbar.contact(i, j);
  297. str.Format("%lu(%s)", c->uin, c->nick.c_str());
  298. HTREEITEM hItem = tree.InsertItem(str, getApp()->getImageIndex(c->face),
  299. getApp()->getImageIndex(c->face, STATUS_AWAY), parent);
  300. tree.SetItemData(hItem, c->uin);
  301. msgUinList.remove(c->uin);
  302. }
  303. if (i == n - 2)
  304. stranger = parent;
  305. }
  306. // add the remaining UINs to the stranger folder
  307. UinList::iterator it;
  308. for (it = msgUinList.begin(); it != msgUinList.end(); ++it) {
  309. uint32 uin = *it;
  310. if (uin) {
  311. str.Format("%lu", uin);
  312. HTREEITEM item = tree.InsertItem(str, getApp()->getImageIndex(0),
  313. getApp()->getImageIndex(0, STATUS_AWAY), stranger);
  314. tree.SetItemData(item, uin);
  315. }
  316. }
  317. str.LoadString(IDS_SYSMSG);
  318. image = getApp()->iconIndex(ICON_SYSMSG);
  319. tree.InsertItem(str, image, image, root);
  320. return 0;
  321. }
  322. void CMsgTreeView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
  323. {
  324. CMenu menu;
  325. menu.LoadMenu(IDR_MSGMGR_POPUP);
  326. CPoint pt;
  327. GetCursorPos(&pt);
  328. ScreenToClient(&pt);
  329. UINT flags;
  330. HTREEITEM item = GetTreeCtrl().HitTest(pt, &flags);
  331. GetTreeCtrl().SelectItem(item);
  332. GetCursorPos(&pt);
  333. menu.GetSubMenu(0)->TrackPopupMenu(0, pt.x, pt.y, GetParentFrame());
  334. *pResult = 0;
  335. }
  336. void CMsgTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  337. {
  338. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  339. HTREEITEM item = pNMTreeView->itemNew.hItem;
  340. uint32 uin = (item ? GetTreeCtrl().GetItemData(item) : NODE_FOLDER);
  341. listView->showMsg(uin);
  342. *pResult = 0;
  343. }
  344. void CMsgTreeView::OnUpdateEditDel(CCmdUI* pCmdUI) 
  345. {
  346. if (GetParentFrame()->GetActiveView() == this)
  347. pCmdUI->Enable(GetTreeCtrl().GetSelectedItem() != NULL);
  348. }
  349. void CMsgTreeView::OnUpdateExportContact(CCmdUI* pCmdUI) 
  350. {
  351. if (GetParentFrame()->GetActiveView() == this) {
  352. CTreeCtrl &tree = GetTreeCtrl();
  353. HTREEITEM item = tree.GetSelectedItem();
  354. if (item) {
  355. uint32 uin = tree.GetItemData(item);
  356. pCmdUI->Enable(uin != 0);
  357. }
  358. }
  359. }
  360. void CMsgTreeView::OnUpdateExportBak(CCmdUI* pCmdUI) 
  361. {
  362. if (GetParentFrame()->GetActiveView() == this)
  363. pCmdUI->Enable(GetTreeCtrl().GetSelectedItem() != NULL);
  364. }
  365. void CMsgTreeView::OnExportBak() 
  366. {
  367. CTreeCtrl &tree = GetTreeCtrl();
  368. HTREEITEM item = tree.GetSelectedItem();
  369. uint32 uin = tree.GetItemData(item);
  370. CString fileName;
  371. if (uin > 0 && uin <= 0xfffffff0)
  372. fileName.Format("%lu", uin);
  373. CString filter;
  374. filter.LoadString(IDS_FILTER_BAK);
  375. CFileDialog dlg(FALSE, "bak", fileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter);
  376. if (dlg.DoModal() == IDOK)
  377. exportBak(dlg.GetPathName(), item);
  378. }
  379. void CMsgTreeView::OnFileImport() 
  380. {
  381. CString filter;
  382. filter.LoadString(IDS_FILTER_BAK);
  383. CFileDialog dlg(TRUE, "bak", NULL, OFN_HIDEREADONLY, filter);
  384. if (dlg.DoModal() == IDOK) {
  385. IcqDB::importRecord(dlg.GetPathName());
  386. // refresh
  387. CTreeCtrl &tree = GetTreeCtrl();
  388. HTREEITEM item = tree.GetSelectedItem();
  389. uint32 uin = (item ? tree.GetItemData(item) : NODE_FOLDER);
  390. listView->showMsg(uin);
  391. }
  392. }
  393. void CMsgTreeView::OnExportBackup() 
  394. {
  395. CString filter;
  396. filter.LoadString(IDS_FILTER_BAK);
  397. CFileDialog dlg(FALSE, "bak", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter);
  398. if (dlg.DoModal() == IDOK) {
  399. CString pathName = dlg.GetPathName();
  400. CFile::Remove(pathName);
  401. exportBak(pathName, GetTreeCtrl().GetRootItem());
  402. }
  403. }