PageRenderTime 51ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/taskswitchxp/Source/ConfigTsXP/exclusions.cpp

http://windowpicker.googlecode.com/
C++ | 330 lines | 247 code | 70 blank | 13 comment | 52 complexity | 7e10faceb5fcbbe3fd835fe0eeb4299a MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause
  1. // exclusions.cpp
  2. #include "stdafx.h"
  3. #include "main.h"
  4. #include "ownerdrawXp.h"
  5. #include "lang.h"
  6. #include "excldlg.h"
  7. #include "exclusions.h"
  8. #include "resource.h"
  9. #include <strsafe.h>
  10. //-----------------------------------------------------------------
  11. vector<TSEXCLUSION> _vExclList;
  12. //-----------------------------------------------------------------
  13. BOOL Excl_OnInitDialog(HWND hwnd, HWND, LPARAM) {
  14. g_phPages[PAGE_EXCLUSIONS] = hwnd;
  15. if (g_pfnEnableThemeDialogTexture)
  16. g_pfnEnableThemeDialogTexture(hwnd, ETDT_ENABLETAB);
  17. HWND h = GetDlgItem(hwnd, IDC_EXCLLIST);
  18. ListView_SetExtendedListViewStyle(h,
  19. LVS_EX_CHECKBOXES | LVS_EX_ONECLICKACTIVATE | LVS_EX_UNDERLINEHOT | \
  20. LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
  21. RECT rc;
  22. int nScroll = GetSystemMetrics(SM_CXHSCROLL);
  23. GetClientRect(h, &rc);
  24. LVCOLUMN lvc;
  25. lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
  26. lvc.pszText = L"";
  27. lvc.fmt = LVCFMT_LEFT;
  28. lvc.cx = 160;
  29. lvc.iSubItem = 0;
  30. ListView_InsertColumn(h, 0, &lvc);
  31. lvc.cx = rc.right - rc.left - 160 - nScroll - 2;
  32. lvc.iSubItem = 1;
  33. ListView_InsertColumn(h, 1, &lvc);
  34. _vExclList.clear();
  35. SendMessage(hwnd, WM_LANGCHANGED, 0, 0);
  36. return(FALSE);
  37. }
  38. //-----------------------------------------------------------------
  39. BOOL UpdateExclItem(HWND hwndLV, int nItem) {
  40. _ASSERT(nItem >= 0 && nItem < ListView_GetItemCount(hwndLV));
  41. _ASSERT(ListView_GetItemCount(hwndLV) == (int)_vExclList.size());
  42. TSEXCLUSION& tseItem = _vExclList[nItem];
  43. ListView_SetCheckState(hwndLV, nItem, !(tseItem.dwFlags & TSEXCLF_DISABLED));
  44. LVITEM lvi;
  45. lvi.iItem = nItem;
  46. lvi.iSubItem = 0;
  47. lvi.mask = LVIF_TEXT | LVIF_GROUPID;
  48. lvi.pszText = (LPWSTR)tseItem.szExclName;
  49. lvi.iGroupId = (tseItem.dwFlags & TSEXCLF_PREVIEW) ? 0 : 1;
  50. ListView_SetItem(hwndLV, &lvi);
  51. lvi.mask = LVIF_TEXT;
  52. WCHAR szBuff[MAX_FILENAME + MAX_CLASSNAME + MAX_CAPTION + 20] = L"";
  53. if (tseItem.dwFlags & TSEXCLF_BYPROCESS)
  54. StringCchCat(szBuff, SIZEOF_ARRAY(szBuff), tseItem.szExeName);
  55. if (tseItem.dwFlags & TSEXCLF_BYCLASS) {
  56. if (szBuff[0] != L'\0')
  57. StringCchCat(szBuff, SIZEOF_ARRAY(szBuff), L", ");
  58. StringCchCat(szBuff, SIZEOF_ARRAY(szBuff), tseItem.szClassName);
  59. }
  60. if (tseItem.dwFlags & TSEXCLF_BYCAPTION) {
  61. if (szBuff[0] != L'\0')
  62. StringCchCat(szBuff, SIZEOF_ARRAY(szBuff), L", ");
  63. StringCchCat(szBuff, SIZEOF_ARRAY(szBuff), L"\"");
  64. StringCchCat(szBuff, SIZEOF_ARRAY(szBuff), tseItem.szCaption);
  65. StringCchCat(szBuff, SIZEOF_ARRAY(szBuff), L"\"");
  66. }
  67. lvi.pszText = szBuff;
  68. lvi.iSubItem = 1;
  69. ListView_SetItem(hwndLV, &lvi);
  70. //ListView_MoveItemToGroup(hwndLV, nItem,
  71. // (tseItem.dwFlags & TSEXCLF_PREVIEW) ? 0 : 1);
  72. return(TRUE);
  73. }
  74. int AddExclItem(HWND hwndLV, const PTSEXCLUSION ptse) {
  75. _ASSERT(hwndLV && ptse);
  76. int nItem = (int)_vExclList.size();
  77. _ASSERT(nItem == ListView_GetItemCount(hwndLV));
  78. for (vector<TSEXCLUSION>::iterator it = _vExclList.begin(); it != _vExclList.end(); it++) {
  79. if ((it->dwFlags & TSEXCLF_MASK) == (ptse->dwFlags & TSEXCLF_MASK)) {
  80. if (!(ptse->dwFlags & TSEXCLF_BYPROCESS) ||
  81. !lstrcmp(it->szExeName, ptse->szExeName)) {
  82. if (!(ptse->dwFlags & TSEXCLF_BYCLASS) ||
  83. !lstrcmp(it->szClassName, ptse->szClassName)) {
  84. if (!(ptse->dwFlags & TSEXCLF_BYCAPTION) ||
  85. !lstrcmp(it->szCaption, ptse->szCaption)) {
  86. return(-1);
  87. }
  88. }
  89. }
  90. }
  91. }
  92. _vExclList.push_back(*ptse);
  93. LV_ITEM lvi;
  94. lvi.mask = LVIF_TEXT;
  95. lvi.iItem = nItem;
  96. lvi.iSubItem = 0;
  97. lvi.pszText = L"";
  98. ListView_InsertItem(hwndLV, &lvi);
  99. ListView_SetCheckState(hwndLV, nItem, !(ptse->dwFlags & TSEXCLF_DISABLED));
  100. _vExclList[nItem].dwFlags = ptse->dwFlags;
  101. UpdateExclItem(hwndLV, nItem);
  102. return(nItem);
  103. }
  104. void EmptyExclList(HWND hwndLV) {
  105. _vExclList.clear();
  106. ListView_DeleteAllItems(hwndLV);
  107. }
  108. //-----------------------------------------------------------------
  109. void EditExclItem(HWND hwndLV, int sel) {
  110. if (sel >= 0 && sel < (int)_vExclList.size()) {
  111. TSEXCLUSION tse;
  112. CopyMemory(&tse, (PVOID)&_vExclList[sel], sizeof(TSEXCLUSION));
  113. tse.dwFlags &= ~TSEXCLF_NEW;
  114. /*if (ListView_GetCheckState(hwndLV, sel))
  115. tse.dwFlags &= ~TSEXCLF_DISABLED;
  116. else tse.dwFlags |= TSEXCLF_DISABLED;*/
  117. g_dwCmdLine |= CCLF_MODALACTIVE;
  118. if (DialogBoxParam(g_hinstExe, MAKEINTRESOURCE(IDD_EXCLUDEWND),
  119. g_hwndMain, Dlg_ExcludeWindowProc, (LPARAM)&tse) == IDOK) {
  120. CopyMemory((PVOID)&_vExclList[sel], &tse, sizeof(TSEXCLUSION));
  121. UpdateExclItem(hwndLV, sel);
  122. ListView_SetItemState(hwndLV, sel, LVIS_SELECTED, LVIS_SELECTED);
  123. ListView_EnsureVisible(hwndLV, sel, FALSE);
  124. EnableWindow(GetDlgItem(g_hwndMain, IDC_APPLY), TRUE);
  125. }
  126. g_dwCmdLine &= ~CCLF_MODALACTIVE;
  127. }
  128. }
  129. //-----------------------------------------------------------------
  130. void Excl_OnCommand(HWND hwnd, int id, HWND /*hwndCtl*/, UINT codeNotify) {
  131. if (codeNotify == BN_CLICKED) {
  132. switch (id) {
  133. case IDC_EXCLNEW: {
  134. TSEXCLUSION tse;
  135. ZeroMemory(&tse, sizeof(TSEXCLUSION));
  136. tse.dwFlags = TSEXCLF_NEW;
  137. g_dwCmdLine |= CCLF_MODALACTIVE;
  138. if (DialogBoxParam(g_hinstExe, MAKEINTRESOURCE(IDD_EXCLUDEWND),
  139. g_hwndMain, Dlg_ExcludeWindowProc, (LPARAM)&tse) == IDOK) {
  140. HWND hwndLV = GetDlgItem(hwnd, IDC_EXCLLIST);
  141. int nItem = AddExclItem(hwndLV, &tse);
  142. ListView_SetItemState(hwndLV, nItem, LVIS_SELECTED, LVIS_SELECTED);
  143. ListView_EnsureVisible(hwndLV, nItem, FALSE);
  144. EnableWindow(GetDlgItem(g_hwndMain, IDC_APPLY), TRUE);
  145. }
  146. g_dwCmdLine &= ~CCLF_MODALACTIVE;
  147. break;
  148. }
  149. case IDC_EXCLEDIT: {
  150. HWND hwndLV = GetDlgItem(hwnd, IDC_EXCLLIST);
  151. int sel = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
  152. EditExclItem(hwndLV, sel);
  153. break;
  154. }
  155. case IDC_EXCLREMOVE: {
  156. HWND hwndLV = GetDlgItem(hwnd, IDC_EXCLLIST);
  157. int sel = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
  158. if (sel >= 0 && sel < (int)_vExclList.size()) {
  159. _vExclList.erase(_vExclList.begin() + sel);
  160. ListView_DeleteItem(hwndLV, sel);
  161. sel = MIN(ListView_GetItemCount(hwndLV) - 1, sel);
  162. ListView_SetItemState(hwndLV, sel, LVIS_SELECTED, LVIS_SELECTED);
  163. ListView_EnsureVisible(hwndLV, sel, FALSE);
  164. EnableWindow(GetDlgItem(g_hwndMain, IDC_APPLY), TRUE);
  165. }
  166. break;
  167. }
  168. }
  169. }
  170. }
  171. //-----------------------------------------------------------------
  172. INT_PTR CALLBACK Dlg_ExclusionsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  173. switch (uMsg) {
  174. HANDLE_MSG(hwnd, WM_COMMAND, Excl_OnCommand);
  175. case WM_NOTIFY: {
  176. NMHDR* pnmhdr = (NMHDR*)lParam;
  177. if (pnmhdr->idFrom == IDC_EXCLLIST) {
  178. switch (pnmhdr->code) {
  179. case LVN_ITEMCHANGED: {
  180. LPNMLISTVIEW pnmlv = reinterpret_cast<LPNMLISTVIEW>(pnmhdr);
  181. if (pnmlv->uNewState & LVIS_SELECTED) {
  182. EnableWindow(GetDlgItem(hwnd, IDC_EXCLEDIT), TRUE);
  183. EnableWindow(GetDlgItem(hwnd, IDC_EXCLREMOVE), TRUE);
  184. } else if (pnmlv->uOldState & LVIS_SELECTED) {
  185. EnableWindow(GetDlgItem(hwnd, IDC_EXCLEDIT), FALSE);
  186. EnableWindow(GetDlgItem(hwnd, IDC_EXCLREMOVE), FALSE);
  187. } else if (pnmlv->iItem >= 0 && pnmlv->iItem < (int)_vExclList.size()) {
  188. BOOL fEnabled = ListView_GetCheckState(pnmhdr->hwndFrom, pnmlv->iItem);
  189. TSEXCLUSION& tse = _vExclList[pnmlv->iItem];
  190. if ((fEnabled && tse.dwFlags & TSEXCLF_DISABLED) ||
  191. (!fEnabled && !(tse.dwFlags & TSEXCLF_DISABLED))) {
  192. if (fEnabled) tse.dwFlags &= ~TSEXCLF_DISABLED;
  193. else tse.dwFlags |= TSEXCLF_DISABLED;
  194. EnableWindow(GetDlgItem(g_hwndMain, IDC_APPLY), TRUE);
  195. }
  196. }
  197. break;
  198. }
  199. case LVN_KEYDOWN: {
  200. LPNMLVKEYDOWN pnmkd = reinterpret_cast<LPNMLVKEYDOWN>(pnmhdr);
  201. if (pnmkd->wVKey == VK_DELETE) {
  202. Excl_OnCommand(hwnd, IDC_EXCLREMOVE, NULL, BN_CLICKED);
  203. }
  204. break;
  205. }
  206. case NM_RETURN: {
  207. Excl_OnCommand(hwnd, IDC_EXCLEDIT, NULL, BN_CLICKED);
  208. break;
  209. }
  210. case NM_DBLCLK: {
  211. LPNMITEMACTIVATE pnmia = reinterpret_cast<LPNMITEMACTIVATE>(pnmhdr);
  212. EditExclItem(pnmhdr->hwndFrom, pnmia->iItem);
  213. break;
  214. }
  215. }
  216. }
  217. break;
  218. }
  219. case WM_LANGCHANGED: {
  220. WCHAR szBuff[MAX_LANGLEN];
  221. for (int id = 0; id <= (IDS_EXCLREMOVE - IDS_EXCLNEW); id++) {
  222. LangLoadString(IDS_EXCLNEW + id, szBuff, MAX_LANGLEN);
  223. SetDlgItemText(hwnd, IDC_EXCLNEW + id, szBuff);
  224. }
  225. LVCOLUMN lvc;
  226. lvc.mask = LVCF_TEXT;
  227. lvc.pszText = szBuff;
  228. HWND h = GetDlgItem(hwnd, IDC_EXCLLIST);
  229. LangLoadString(IDS_EXCLNAME, szBuff, MAX_LANGLEN);
  230. ListView_SetColumn(h, 0, &lvc);
  231. LangLoadString(IDS_EXCLPARAMS, szBuff, MAX_LANGLEN);
  232. ListView_SetColumn(h, 1, &lvc);
  233. ListView_RemoveAllGroups(h);
  234. ListView_EnableGroupView(h, TRUE);
  235. LVGROUP lvg;
  236. lvg.cbSize = sizeof(LVGROUP);
  237. lvg.mask = LVGF_ALIGN | LVGF_GROUPID | LVGF_HEADER;
  238. lvg.uAlign = LVGA_HEADER_LEFT;
  239. lvg.iGroupId = 0;
  240. lvg.pszHeader = szBuff;
  241. lvg.cchHeader = 0;
  242. LangLoadString(IDS_EXCLPREVIEWGROUP, szBuff, MAX_LANGLEN);
  243. ListView_InsertGroup(h, 0, &lvg);
  244. lvg.iGroupId = 1;
  245. LangLoadString(IDS_EXCLENUMGROUP, szBuff, MAX_LANGLEN);
  246. ListView_InsertGroup(h, 1, &lvg);
  247. LVITEM lvi;
  248. lvi.iSubItem = 0;
  249. lvi.mask = LVIF_GROUPID;
  250. for (lvi.iItem = 0; lvi.iItem < (int)_vExclList.size(); lvi.iItem++) {
  251. lvi.iGroupId = (_vExclList[lvi.iItem].dwFlags & TSEXCLF_PREVIEW) ? 0 : 1;
  252. ListView_SetItem(h, &lvi);
  253. }
  254. break;
  255. }
  256. HANDLE_MSG(hwnd, WM_INITDIALOG, Excl_OnInitDialog);
  257. }
  258. return(0);
  259. }
  260. //-----------------------------------------------------------------