/* Miranda IM: the free IM client for Microsoft* Windows* Copyright 2000-2009 Miranda ICQ/IM project, all portions of this codebase are copyrighted to the people listed in contributors.txt. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "..\..\core\commonheaders.h" #include "filter.h" HANDLE hOptionsInitialize; CPageList filterStrings(1); void AddFilterString(const PageHash key, TCHAR *data) { if (ContainsFilterString(key, data)) return; CPageKeywords * values = filterStrings[key]; if (values == NULL) { values = new CPageKeywords(key); filterStrings.insert(values); } values->AddKeyWord(data); } void ClearFilterStrings() { filterStrings.destroy(); } BOOL ContainsFilterString(const PageHash key, TCHAR *data) { CPageKeywords* values = filterStrings[key]; return (values) ? values->ContainsString(data) : FALSE; } void AddTreeViewNodes(HWND hWndDlg, PageHash key, HTREEITEM root) { if (root) { TCHAR title[2048] = {0}; TVITEM item = {0}; item.mask = TVIF_TEXT; item.hItem = root; item.pszText = title; item.cchTextMax = SIZEOF(title); if (TreeView_GetItem(hWndDlg, &item)) if (_tcslen(title) > 0) AddFilterString(key, title); HTREEITEM child = root; while (child) { child = TreeView_GetNextItem(hWndDlg, child, TVGN_CHILD); AddTreeViewNodes(hWndDlg, key, child); } AddTreeViewNodes(hWndDlg, key, TreeView_GetNextSibling(hWndDlg, root)); } } void AddDialogString(HWND hWndDlg, const PageHash key) { TCHAR title[2048]; GetWindowText(hWndDlg, title, SIZEOF(title)); if (_tcslen(title) > 0) AddFilterString(key, title); TCHAR szClass[64]; GetClassName(hWndDlg, szClass, SIZEOF(szClass)); if (lstrcmpi(szClass, _T("SysTreeView32")) == 0) { HTREEITEM hItem = TreeView_GetRoot(hWndDlg); AddTreeViewNodes(hWndDlg, key, hItem); } else { if (lstrcmpi(szClass, _T("listbox")) == 0) { if (GetWindowStyle(hWndDlg) & LBS_HASSTRINGS) { int count = ListBox_GetCount(hWndDlg); for (int i = 0; i < count; i++) { title[0] = 0; //safety int res = ListBox_GetText(hWndDlg, i, title); if (res != LB_ERR) { title[SIZEOF(title) - 1] = 0; if (_tcslen(title) > 0) AddFilterString(key, title); } } } } else { if (lstrcmpi(szClass, _T("SysListView32")) == 0) { int count = ListView_GetItemCount(hWndDlg); for (int i = 0; i < count; i++) { title[0] = 0; //safety ListView_GetItemText(hWndDlg, i, 0, title, SIZEOF(title)); if (_tcslen(title) > 0) AddFilterString(key, title); } } if (lstrcmpi(szClass, _T("combobox")) == 0) { if (GetWindowStyle(hWndDlg) & CBS_HASSTRINGS) { int count = ComboBox_GetCount(hWndDlg); for (int i = 0; i < count; i++) { title[0] = 0; //safety int res = ComboBox_GetLBText(hWndDlg, i, title); if (res != CB_ERR) { title[SIZEOF(title) - 1] = 0; if (_tcslen(title) > 0) AddFilterString(key, title); } } } } } } } static BOOL CALLBACK GetDialogStringsCallback(HWND hWnd, LPARAM lParam) { AddDialogString(hWnd, lParam); return TRUE; } void GetDialogStrings(int enableKeywordFiltering, const PageHash key, TCHAR *pluginName, HWND hWnd, TCHAR * group, TCHAR * title, TCHAR * tab, TCHAR * name) { AddFilterString(key, pluginName); //add the plugin name as keyword if (group) AddFilterString(key, group); if (title) AddFilterString(key, title); if (tab) AddFilterString(key, tab); if (name) AddFilterString(key, name); if ((enableKeywordFiltering) && (hWnd != 0)) { AddDialogString(hWnd, key); EnumChildWindows(hWnd, GetDialogStringsCallback, (LPARAM) key); } } static INT_PTR CALLBACK DlgProcOptSearch(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hWnd); CheckDlgButton(hWnd, IDC_ENABLE_KEYWORDFILTERING, DBGetContactSettingWord(NULL, "Options", "EnableKeywordFiltering", TRUE) ? BST_CHECKED : BST_UNCHECKED); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_ENABLE_KEYWORDFILTERING: SendMessage(GetParent(hWnd), PSM_CHANGED, 0, 0); break; } break; case WM_SETFOCUS: SetFocus(GetDlgItem(hWnd, IDC_ENABLE_KEYWORDFILTERING)); break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: DBWriteContactSettingWord(NULL, "Options", "EnableKeywordFiltering", IsDlgButtonChecked(hWnd, IDC_ENABLE_KEYWORDFILTERING)); break; } break; } break; } return 0; } static int OnOptionsInitialise(WPARAM wParam, LPARAM) { OPTIONSDIALOGPAGE odp = {0}; odp.cbSize = sizeof(odp); odp.position = -190000000; odp.hInstance = hMirandaInst; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_KEYWORDFILTER); odp.pszTitle = LPGEN("Options search"); odp.pszGroup = LPGEN("Customize"); odp.groupPosition = 810000000; odp.flags = ODPF_BOLDGROUPS; odp.pfnDlgProc = DlgProcOptSearch; Options_AddPage(wParam, &odp); return 0; } int HookFilterEvents() { hOptionsInitialize = HookEvent(ME_OPT_INITIALISE, OnOptionsInitialise); return 0; } int UnhookFilterEvents() { UnhookEvent(hOptionsInitialize); return 0; }