PageRenderTime 63ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/Miranda IM - CK Release/Miranda/Src/modules/clist/clcmsgs.cpp

http://miranda-dev.googlecode.com/
C++ | 483 lines | 390 code | 60 blank | 33 comment | 91 complexity | 6bcf801faa1cea9c987d98634a829c5b MD5 | raw file
Possible License(s): GPL-2.0, MPL-2.0-no-copyleft-exception, LGPL-3.0, AGPL-1.0, BSD-3-Clause, LGPL-2.1
  1. /*
  2. Clist module for
  3. Miranda IM: the free IM client for Microsoft* Windows*
  4. Copyright 2000-2012 Miranda IM project,
  5. all portions of this codebase are copyrighted to the people
  6. listed in contributors.txt.
  7. This program is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU General Public License
  9. as published by the Free Software Foundation; either version 2
  10. of the License, or (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. ===============================================================================
  19. File name : $HeadURL:
  20. Revision : $Revision:
  21. Last change on : $Date:
  22. Last change by : $Author:
  23. $Id: clcmsgs.cpp 1927 2012-05-01 16:35:47Z CHEF-KOCH $ : $Id: clcmsgs.cpp 1927 2012-05-01 16:35:47Z CHEF-KOCH $:
  24. ===============================================================================
  25. */
  26. #include "commonheaders.h"
  27. #include "clc.h"
  28. //processing of all the CLM_ messages incoming
  29. LRESULT fnProcessExternalMessages(HWND hwnd, struct ClcData *dat, UINT msg, WPARAM wParam, LPARAM lParam)
  30. {
  31. switch (msg) {
  32. case CLM_ADDCONTACT:
  33. cli.pfnAddContactToTree(hwnd, dat, (HANDLE) wParam, 1, 0);
  34. cli.pfnRecalcScrollBar(hwnd, dat);
  35. cli.pfnSortCLC(hwnd, dat, 1);
  36. break;
  37. case CLM_ADDGROUP:
  38. {
  39. DWORD groupFlags;
  40. TCHAR *szName = cli.pfnGetGroupName(wParam, &groupFlags);
  41. if (szName == NULL)
  42. break;
  43. cli.pfnAddGroup(hwnd, dat, szName, groupFlags, wParam, 0);
  44. cli.pfnRecalcScrollBar(hwnd, dat);
  45. break;
  46. }
  47. case CLM_ADDINFOITEMA:
  48. case CLM_ADDINFOITEMW:
  49. {
  50. int i;
  51. ClcContact *groupContact;
  52. ClcGroup *group;
  53. CLCINFOITEM *cii = (CLCINFOITEM *) lParam;
  54. if (cii==NULL || cii->cbSize != sizeof(CLCINFOITEM))
  55. return (LRESULT) (HANDLE) NULL;
  56. if (cii->hParentGroup == NULL)
  57. group = &dat->list;
  58. else {
  59. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) ((UINT_PTR) cii->hParentGroup | HCONTACT_ISGROUP), &groupContact, NULL, NULL))
  60. return (LRESULT) (HANDLE) NULL;
  61. group = groupContact->group;
  62. }
  63. #if defined( _UNICODE )
  64. if ( msg == CLM_ADDINFOITEMA )
  65. { WCHAR* wszText = mir_a2u(( char* )cii->pszText );
  66. i = cli.pfnAddInfoItemToGroup(group, cii->flags, wszText);
  67. mir_free( wszText );
  68. }
  69. else i = cli.pfnAddInfoItemToGroup(group, cii->flags, cii->pszText);
  70. #else
  71. i = cli.pfnAddInfoItemToGroup(group, cii->flags, cii->pszText);
  72. #endif
  73. cli.pfnRecalcScrollBar(hwnd, dat);
  74. return (LRESULT) group->cl.items[i]->hContact | HCONTACT_ISINFO;
  75. }
  76. case CLM_AUTOREBUILD:
  77. KillTimer(hwnd,TIMERID_REBUILDAFTER);
  78. cli.pfnSaveStateAndRebuildList(hwnd, dat);
  79. break;
  80. case CLM_DELETEITEM:
  81. cli.pfnDeleteItemFromTree(hwnd, (HANDLE) wParam);
  82. cli.pfnSortCLC(hwnd, dat, 1);
  83. cli.pfnRecalcScrollBar(hwnd, dat);
  84. break;
  85. case CLM_EDITLABEL:
  86. SendMessage(hwnd, CLM_SELECTITEM, wParam, 0);
  87. cli.pfnBeginRenameSelection(hwnd, dat);
  88. break;
  89. case CLM_ENDEDITLABELNOW:
  90. cli.pfnEndRename(hwnd, dat, wParam);
  91. break;
  92. case CLM_ENSUREVISIBLE:
  93. {
  94. ClcContact *contact;
  95. ClcGroup *group, *tgroup;
  96. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, &group, NULL))
  97. break;
  98. for (tgroup = group; tgroup; tgroup = tgroup->parent)
  99. cli.pfnSetGroupExpand(hwnd, dat, tgroup, 1);
  100. cli.pfnEnsureVisible(hwnd, dat, cli.pfnGetRowsPriorTo(&dat->list, group, List_IndexOf((SortedList*)&group->cl,contact)), 0);
  101. break;
  102. }
  103. case CLM_EXPAND:
  104. {
  105. ClcContact *contact;
  106. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  107. break;
  108. if (contact->type != CLCIT_GROUP)
  109. break;
  110. cli.pfnSetGroupExpand(hwnd, dat, contact->group, lParam);
  111. break;
  112. }
  113. case CLM_FINDCONTACT:
  114. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, NULL, NULL, NULL))
  115. return (LRESULT) (HANDLE) NULL;
  116. return wParam;
  117. case CLM_FINDGROUP:
  118. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) (wParam | HCONTACT_ISGROUP), NULL, NULL, NULL))
  119. return (LRESULT) (HANDLE) NULL;
  120. return wParam | HCONTACT_ISGROUP;
  121. case CLM_GETBKCOLOR:
  122. return dat->bkColour;
  123. case CLM_GETCHECKMARK:
  124. {
  125. ClcContact *contact;
  126. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  127. return 0;
  128. return (contact->flags & CONTACTF_CHECKED) != 0;
  129. }
  130. case CLM_GETCOUNT:
  131. return cli.pfnGetGroupContentsCount(&dat->list, 0);
  132. case CLM_GETEDITCONTROL:
  133. return (LRESULT) dat->hwndRenameEdit;
  134. case CLM_GETEXPAND:
  135. {
  136. ClcContact *contact;
  137. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  138. return CLE_INVALID;
  139. if (contact->type != CLCIT_GROUP)
  140. return CLE_INVALID;
  141. return contact->group->expanded;
  142. }
  143. case CLM_GETEXTRACOLUMNS:
  144. return dat->extraColumnsCount;
  145. case CLM_GETEXTRAIMAGE:
  146. {
  147. ClcContact *contact;
  148. if (LOWORD(lParam) >= dat->extraColumnsCount)
  149. return 0xFF;
  150. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  151. return 0xFF;
  152. return contact->iExtraImage[LOWORD(lParam)];
  153. }
  154. case CLM_GETEXTRAIMAGELIST:
  155. return (LRESULT) dat->himlExtraColumns;
  156. case CLM_GETFONT:
  157. if (wParam < 0 || wParam > FONTID_MAX)
  158. return 0;
  159. return (LRESULT) dat->fontInfo[wParam].hFont;
  160. case CLM_GETHIDEOFFLINEROOT:
  161. return DBGetContactSettingByte(NULL, "CLC", "HideOfflineRoot", 0);
  162. case CLM_GETINDENT:
  163. return dat->groupIndent;
  164. case CLM_GETISEARCHSTRING:
  165. lstrcpy(( TCHAR* ) lParam, dat->szQuickSearch);
  166. return lstrlen(dat->szQuickSearch);
  167. case CLM_GETITEMTEXT:
  168. {
  169. ClcContact *contact;
  170. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  171. return 0;
  172. lstrcpy(( TCHAR* ) lParam, contact->szText);
  173. return lstrlen(contact->szText);
  174. }
  175. case CLM_GETITEMTYPE:
  176. {
  177. ClcContact *contact;
  178. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  179. return CLCIT_INVALID;
  180. return contact->type;
  181. }
  182. case CLM_GETLEFTMARGIN:
  183. return dat->leftMargin;
  184. case CLM_GETNEXTITEM:
  185. {
  186. if (wParam == CLGN_ROOT) {
  187. if (dat->list.cl.count)
  188. return (LRESULT) cli.pfnContactToHItem(dat->list.cl.items[0]);
  189. return NULL;
  190. }
  191. ClcContact *contact;
  192. ClcGroup *group;
  193. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) lParam, &contact, &group, NULL))
  194. return NULL;
  195. int i = List_IndexOf((SortedList*)&group->cl,contact);
  196. switch (wParam) {
  197. case CLGN_CHILD:
  198. if (contact->type != CLCIT_GROUP)
  199. return (LRESULT) (HANDLE) NULL;
  200. group = contact->group;
  201. if (group->cl.count == 0)
  202. return NULL;
  203. return (LRESULT) cli.pfnContactToHItem(group->cl.items[0]);
  204. case CLGN_PARENT:
  205. return group->groupId | HCONTACT_ISGROUP;
  206. case CLGN_NEXT:
  207. do {
  208. if (++i >= group->cl.count)
  209. return NULL;
  210. }
  211. while (group->cl.items[i]->type == CLCIT_DIVIDER);
  212. return (LRESULT) cli.pfnContactToHItem(group->cl.items[i]);
  213. case CLGN_PREVIOUS:
  214. do {
  215. if (--i < 0)
  216. return NULL;
  217. }
  218. while (group->cl.items[i]->type == CLCIT_DIVIDER);
  219. return (LRESULT) cli.pfnContactToHItem(group->cl.items[i]);
  220. case CLGN_NEXTCONTACT:
  221. for (i++; i < group->cl.count; i++)
  222. if (group->cl.items[i]->type == CLCIT_CONTACT)
  223. break;
  224. if (i >= group->cl.count)
  225. return NULL;
  226. return (LRESULT) cli.pfnContactToHItem(group->cl.items[i]);
  227. case CLGN_PREVIOUSCONTACT:
  228. if (i >= group->cl.count)
  229. return NULL;
  230. for (i--; i >= 0; i--)
  231. if (group->cl.items[i]->type == CLCIT_CONTACT)
  232. break;
  233. if (i < 0)
  234. return NULL;
  235. return (LRESULT) cli.pfnContactToHItem(group->cl.items[i]);
  236. case CLGN_NEXTGROUP:
  237. for (i++; i < group->cl.count; i++)
  238. if (group->cl.items[i]->type == CLCIT_GROUP)
  239. break;
  240. if (i >= group->cl.count)
  241. return NULL;
  242. return (LRESULT) cli.pfnContactToHItem(group->cl.items[i]);
  243. case CLGN_PREVIOUSGROUP:
  244. if (i >= group->cl.count)
  245. return NULL;
  246. for (i--; i >= 0; i--)
  247. if (group->cl.items[i]->type == CLCIT_GROUP)
  248. break;
  249. if (i < 0)
  250. return NULL;
  251. return (LRESULT) cli.pfnContactToHItem(group->cl.items[i]);
  252. }
  253. return NULL;
  254. }
  255. case CLM_GETSCROLLTIME:
  256. return dat->scrollTime;
  257. case CLM_GETSELECTION:
  258. {
  259. ClcContact *contact;
  260. if (cli.pfnGetRowByIndex(dat, dat->selection, &contact, NULL) == -1)
  261. return NULL;
  262. return (LRESULT) cli.pfnContactToHItem(contact);
  263. }
  264. case CLM_GETTEXTCOLOR:
  265. if (wParam < 0 || wParam > FONTID_MAX)
  266. return 0;
  267. return (LRESULT) dat->fontInfo[wParam].colour;
  268. case CLM_HITTEST:
  269. {
  270. ClcContact *contact;
  271. DWORD hitFlags;
  272. int hit;
  273. hit = cli.pfnHitTest(hwnd, dat, (short) LOWORD(lParam), (short) HIWORD(lParam), &contact, NULL, &hitFlags);
  274. if (wParam)
  275. *(PDWORD) wParam = hitFlags;
  276. if (hit == -1)
  277. return NULL;
  278. return (LRESULT) cli.pfnContactToHItem(contact);
  279. }
  280. case CLM_SELECTITEM:
  281. {
  282. ClcContact *contact;
  283. ClcGroup *group, *tgroup;
  284. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, &group, NULL))
  285. break;
  286. for (tgroup = group; tgroup; tgroup = tgroup->parent)
  287. cli.pfnSetGroupExpand(hwnd, dat, tgroup, 1);
  288. dat->selection = cli.pfnGetRowsPriorTo(&dat->list, group, List_IndexOf((SortedList*)&group->cl,contact));
  289. cli.pfnEnsureVisible(hwnd, dat, dat->selection, 0);
  290. break;
  291. }
  292. case CLM_SETBKBITMAP:
  293. if (!dat->bkChanged && dat->hBmpBackground) {
  294. DeleteObject(dat->hBmpBackground);
  295. dat->hBmpBackground = NULL;
  296. }
  297. dat->hBmpBackground = (HBITMAP) lParam;
  298. dat->backgroundBmpUse = wParam;
  299. dat->bkChanged = 1;
  300. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  301. break;
  302. case CLM_SETBKCOLOR:
  303. if (!dat->bkChanged && dat->hBmpBackground) {
  304. DeleteObject(dat->hBmpBackground);
  305. dat->hBmpBackground = NULL;
  306. }
  307. dat->bkColour = wParam;
  308. dat->bkChanged = 1;
  309. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  310. break;
  311. case CLM_SETCHECKMARK:
  312. {
  313. ClcContact *contact;
  314. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  315. return 0;
  316. if (lParam)
  317. contact->flags |= CONTACTF_CHECKED;
  318. else
  319. contact->flags &= ~CONTACTF_CHECKED;
  320. cli.pfnRecalculateGroupCheckboxes(hwnd, dat);
  321. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  322. break;
  323. }
  324. case CLM_SETEXTRACOLUMNS:
  325. if (wParam > MAXEXTRACOLUMNS)
  326. return 0;
  327. dat->extraColumnsCount = wParam;
  328. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  329. break;
  330. case CLM_SETEXTRAIMAGE:
  331. {
  332. ClcContact *contact;
  333. if (LOWORD(lParam) >= dat->extraColumnsCount)
  334. return 0;
  335. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  336. return 0;
  337. contact->iExtraImage[LOWORD(lParam)] = (BYTE) HIWORD(lParam);
  338. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  339. break;
  340. }
  341. case CLM_SETEXTRAIMAGELIST:
  342. dat->himlExtraColumns = (HIMAGELIST) lParam;
  343. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  344. break;
  345. case CLM_SETFONT:
  346. if (HIWORD(lParam) < 0 || HIWORD(lParam) > FONTID_MAX)
  347. return 0;
  348. dat->fontInfo[HIWORD(lParam)].hFont = (HFONT) wParam;
  349. dat->fontInfo[HIWORD(lParam)].changed = 1;
  350. {
  351. SIZE fontSize;
  352. HDC hdc = GetDC(hwnd);
  353. SelectObject(hdc, (HFONT) wParam);
  354. GetTextExtentPoint32A(hdc, "x", 1, &fontSize);
  355. dat->fontInfo[HIWORD(lParam)].fontHeight = fontSize.cy;
  356. if (dat->rowHeight < fontSize.cy + 2)
  357. dat->rowHeight = fontSize.cy + 2;
  358. ReleaseDC(hwnd, hdc);
  359. }
  360. if (LOWORD(lParam))
  361. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  362. break;
  363. case CLM_SETGREYOUTFLAGS:
  364. dat->greyoutFlags = wParam;
  365. break;
  366. case CLM_SETHIDEEMPTYGROUPS:
  367. if (wParam)
  368. SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) | CLS_HIDEEMPTYGROUPS);
  369. else
  370. SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~CLS_HIDEEMPTYGROUPS);
  371. SendMessage(hwnd, CLM_AUTOREBUILD, 0, 0);
  372. break;
  373. case CLM_SETHIDEOFFLINEROOT:
  374. DBWriteContactSettingByte(NULL, "CLC", "HideOfflineRoot", (BYTE) wParam);
  375. SendMessage(hwnd, CLM_AUTOREBUILD, 0, 0);
  376. break;
  377. case CLM_SETINDENT:
  378. dat->groupIndent = wParam;
  379. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  380. break;
  381. case CLM_SETITEMTEXT:
  382. {
  383. ClcContact *contact;
  384. if (!cli.pfnFindItem(hwnd, dat, (HANDLE) wParam, &contact, NULL, NULL))
  385. break;
  386. lstrcpyn(contact->szText, ( TCHAR* )lParam, SIZEOF( contact->szText ));
  387. cli.pfnSortCLC(hwnd, dat, 1);
  388. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  389. break;
  390. }
  391. case CLM_SETLEFTMARGIN:
  392. dat->leftMargin = wParam;
  393. cli.pfnInvalidateRect(hwnd, NULL, FALSE);
  394. break;
  395. case CLM_SETOFFLINEMODES:
  396. dat->offlineModes = wParam;
  397. SendMessage(hwnd, CLM_AUTOREBUILD, 0, 0);
  398. break;
  399. case CLM_SETSCROLLTIME:
  400. dat->scrollTime = wParam;
  401. break;
  402. case CLM_SETTEXTCOLOR:
  403. if (wParam < 0 || wParam > FONTID_MAX)
  404. break;
  405. dat->fontInfo[wParam].colour = lParam;
  406. break;
  407. case CLM_SETUSEGROUPS:
  408. if (wParam)
  409. SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) | CLS_USEGROUPS);
  410. else
  411. SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~CLS_USEGROUPS);
  412. SendMessage(hwnd, CLM_AUTOREBUILD, 0, 0);
  413. break;
  414. }
  415. return 0;
  416. }