summaryrefslogtreecommitdiff
path: root/src/modules/options
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2015-06-13 16:55:17 +0000
committerGeorge Hazan <george.hazan@gmail.com>2015-06-13 16:55:17 +0000
commitcbe3cb21f5bca61a03bbd4ae811ee906e09b3f4f (patch)
tree4854fb66f4d59940efa3c1590237915851074dbf /src/modules/options
parent351bcbec48ed77af5f8efcc4d5198707922c5d86 (diff)
- miranda32.exe now does nothing bug extends PATH to %miranda_root%\libs and loads mir_app.dll;
- everything that was in miranda32.exe (including resources) moved to mir_app.dll; - exports from mir_app.dll now available for using directly, without perversions; - src/stdplug.h deleted; git-svn-id: http://svn.miranda-ng.org/main/trunk@14143 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'src/modules/options')
-rw-r--r--src/modules/options/descbutton.cpp326
-rw-r--r--src/modules/options/filter.cpp159
-rw-r--r--src/modules/options/filter.h95
-rw-r--r--src/modules/options/headerbar.cpp349
-rw-r--r--src/modules/options/iconheader.cpp534
-rw-r--r--src/modules/options/options.cpp1327
6 files changed, 0 insertions, 2790 deletions
diff --git a/src/modules/options/descbutton.cpp b/src/modules/options/descbutton.cpp
deleted file mode 100644
index f6b66eb041..0000000000
--- a/src/modules/options/descbutton.cpp
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-Copyright (c) 2007 Artem Shpynov
-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 "m_descbutton.h"
-
-extern HINSTANCE hInst;
-
-////////////////////////////////////////////////////////////////////////////////////
-// Internals
-
-#define DBC_BORDER_SIZE 7
-#define DBC_VSPACING 15
-#define DBC_HSPACING 10
-
-static LRESULT CALLBACK MDescButtonWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
-
-// structure is used for storing list of tab info
-struct MDescButtonCtrl
-{
- HWND hwnd;
- BOOL bSharedIcon;
- HICON hIcon;
- TCHAR *lpzTitle;
- TCHAR *lpzDescription;
-
- // UI info
- BOOL bMouseInside;
- RECT rc;
- int width, height;
- HFONT hfntTitle;
-
- // control colors
- RGBQUAD rgbBkgTop, rgbBkgBottom;
- RGBQUAD rgbSelTop, rgbSelBottom;
- RGBQUAD rgbHotTop, rgbHotBottom;
- COLORREF clText, clBackground;
- COLORREF clSelText, clSelBorder;
- COLORREF clHotText, clHotBorder;
-
- // fonts
- HFONT hFont;
-};
-
-int LoadDescButtonModule()
-{
- WNDCLASSEX wc;
-
- memset(&wc, 0, sizeof(wc));
- wc.cbSize = sizeof(wc);
- wc.lpszClassName = MIRANDADESCBUTTONCLASS;
- wc.lpfnWndProc = MDescButtonWndProc;
- wc.hCursor = LoadCursor(NULL, IDC_HAND);
- wc.cbWndExtra = sizeof(MDescButtonCtrl *);
- wc.hbrBackground = 0; //GetStockObject(WHITE_BRUSH);
- wc.style = CS_GLOBALCLASS | CS_SAVEBITS;
- RegisterClassEx(&wc);
- return 0;
-}
-
-static void MDescButton_SetupColors(MDescButtonCtrl *dat)
-{
- COLORREF cl = GetSysColor(COLOR_WINDOW);
- dat->rgbBkgBottom.rgbRed = (dat->rgbBkgTop.rgbRed = GetRValue(cl)) * .95;
- dat->rgbBkgBottom.rgbGreen = (dat->rgbBkgTop.rgbGreen = GetGValue(cl)) * .95;
- dat->rgbBkgBottom.rgbBlue = (dat->rgbBkgTop.rgbBlue = GetBValue(cl)) * .95;
-
- cl = GetSysColor(COLOR_HIGHLIGHT);
- dat->rgbSelTop.rgbRed = (dat->rgbSelBottom.rgbRed = GetRValue(cl)) * .75;
- dat->rgbSelTop.rgbGreen = (dat->rgbSelBottom.rgbGreen = GetGValue(cl)) * .75;
- dat->rgbSelTop.rgbBlue = (dat->rgbSelBottom.rgbBlue = GetBValue(cl)) * .75;
-
- dat->rgbHotTop.rgbRed = (dat->rgbSelTop.rgbRed + 255) / 2;
- dat->rgbHotTop.rgbGreen = (dat->rgbSelTop.rgbGreen + 255) / 2;
- dat->rgbHotTop.rgbBlue = (dat->rgbSelTop.rgbBlue + 255) / 2;
-
- dat->rgbHotBottom.rgbRed = (dat->rgbSelBottom.rgbRed + 255) / 2;
- dat->rgbHotBottom.rgbGreen = (dat->rgbSelBottom.rgbGreen + 255) / 2;
- dat->rgbHotBottom.rgbBlue = (dat->rgbSelBottom.rgbBlue + 255) / 2;
-
- dat->clBackground = GetSysColor(COLOR_3DFACE);
- dat->clText = GetSysColor(COLOR_WINDOWTEXT);
- dat->clSelText = GetSysColor(COLOR_HIGHLIGHTTEXT);
- dat->clSelBorder = RGB(dat->rgbSelTop.rgbRed, dat->rgbSelTop.rgbGreen, dat->rgbSelTop.rgbBlue);
- dat->clHotBorder = RGB(dat->rgbHotTop.rgbRed, dat->rgbHotTop.rgbGreen, dat->rgbHotTop.rgbBlue);
-
- if (!dat->hFont) dat->hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
-}
-
-static void MDescButton_FillRect(HDC hdc, int x, int y, int width, int height, COLORREF cl)
-{
- int oldMode = SetBkMode(hdc, OPAQUE);
- COLORREF oldColor = SetBkColor(hdc, cl);
-
- RECT rc; SetRect(&rc, x, y, x + width, y + height);
- ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, "", 0, 0);
-
- SetBkMode(hdc, oldMode);
- SetBkColor(hdc, oldColor);
-}
-
-static void MDescButton_DrawGradient(HDC hdc, int x, int y, int width, int height, RGBQUAD *rgb0, RGBQUAD *rgb1)
-{
- int oldMode = SetBkMode(hdc, OPAQUE);
- COLORREF oldColor = SetBkColor(hdc, 0);
-
- RECT rc; SetRect(&rc, x, 0, x + width, 0);
- for (int i = y + height; --i >= y;) {
- COLORREF color = RGB(
- ((height - i - 1)*rgb0->rgbRed + i*rgb1->rgbRed) / height,
- ((height - i - 1)*rgb0->rgbGreen + i*rgb1->rgbGreen) / height,
- ((height - i - 1)*rgb0->rgbBlue + i*rgb1->rgbBlue) / height);
- rc.top = rc.bottom = i;
- ++rc.bottom;
- SetBkColor(hdc, color);
- ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, "", 0, 0);
- }
-
- SetBkMode(hdc, oldMode);
- SetBkColor(hdc, oldColor);
-}
-
-static LRESULT MDescButton_OnPaint(HWND hwndDlg, MDescButtonCtrl *dat, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- PAINTSTRUCT ps;
- HDC hdc = BeginPaint(hwndDlg, &ps);
- HDC tempDC = CreateCompatibleDC(hdc);
-
- SIZE titleSize = { 0 };
-
- HBITMAP hBmp = CreateCompatibleBitmap(hdc, dat->width, dat->height);
- HBITMAP hOldBmp = (HBITMAP)SelectObject(tempDC, hBmp);
-
- RECT temprc;
- temprc.left = 0;
- temprc.right = dat->width;
- temprc.top = 0;
-
- // Draw background
- if (dat->bMouseInside || (GetFocus() == hwndDlg)) {
- MDescButton_FillRect(tempDC, 0, 0, dat->width, dat->height, dat->clSelBorder);
- MDescButton_DrawGradient(tempDC, 1, 1, dat->width - 2, dat->height - 2, &dat->rgbSelTop, &dat->rgbSelBottom);
- SetTextColor(tempDC, dat->clSelText);
- }
- else {
- MDescButton_FillRect(tempDC, 0, 0, dat->width, dat->height, dat->clBackground);
- SetTextColor(tempDC, dat->clText);
- }
-
- if (dat->hIcon)
- DrawIcon(tempDC, DBC_BORDER_SIZE, DBC_BORDER_SIZE, dat->hIcon);
-
- HFONT hfntSave = (HFONT)SelectObject(tempDC, dat->hFont);
- SetBkMode(tempDC, TRANSPARENT);
-
- if (dat->lpzTitle) {
- LOGFONT lf;
- GetObject(dat->hFont, sizeof(lf), &lf);
- lf.lfWeight = FW_BOLD;
- lf.lfHeight *= 1.5;
- HFONT hfntSave = (HFONT)SelectObject(tempDC, CreateFontIndirect(&lf));
-
- RECT textRect;
- textRect.left = DBC_BORDER_SIZE + (dat->hIcon ? 32 + DBC_VSPACING : 0);
- textRect.right = dat->width - DBC_BORDER_SIZE;
- textRect.top = DBC_BORDER_SIZE;
- textRect.bottom = dat->height - DBC_BORDER_SIZE;
- DrawText(tempDC, dat->lpzTitle, -1, &textRect, DT_TOP | DT_LEFT | DT_END_ELLIPSIS);
- GetTextExtentPoint32(tempDC, dat->lpzTitle, (int)mir_tstrlen(dat->lpzTitle), &titleSize);
-
- DeleteObject(SelectObject(tempDC, hfntSave));
- }
-
- if (dat->lpzDescription) {
- RECT textRect;
- textRect.left = DBC_BORDER_SIZE + (dat->hIcon ? 32 + DBC_VSPACING : 0);
- textRect.right = dat->width - DBC_BORDER_SIZE;
- textRect.top = DBC_BORDER_SIZE + titleSize.cy ? titleSize.cy + DBC_HSPACING : 0;
- textRect.bottom = dat->height - DBC_BORDER_SIZE;
- DrawText(tempDC, dat->lpzDescription, -1, &textRect, DT_TOP | DT_LEFT | DT_WORDBREAK | DT_END_ELLIPSIS);
- GetTextExtentPoint32(tempDC, dat->lpzTitle, (int)mir_tstrlen(dat->lpzTitle), &titleSize);
- }
-
- SelectObject(tempDC, hfntSave);
-
- //Copy to output
- BitBlt(hdc, dat->rc.left, dat->rc.top, dat->width, dat->height, tempDC, 0, 0, SRCCOPY);
- SelectObject(tempDC, hOldBmp);
- DeleteObject(hBmp);
- DeleteDC(tempDC);
- EndPaint(hwndDlg, &ps);
-
- return TRUE;
-}
-
-static LRESULT CALLBACK MDescButtonWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- MDescButtonCtrl *dat = (MDescButtonCtrl *)GetWindowLongPtr(hwndDlg, 0);
- switch (msg) {
- case WM_NCCREATE:
- dat = (MDescButtonCtrl*)mir_alloc(sizeof(MDescButtonCtrl));
- if (dat == NULL)
- return FALSE;
-
- memset(dat, 0, sizeof(MDescButtonCtrl));
- SetWindowLongPtr(hwndDlg, 0, (LONG_PTR)dat);
- MDescButton_SetupColors(dat);
- return TRUE;
-
- case WM_SETFONT:
- dat->hFont = (HFONT)wParam;
- break;
-
- case WM_SIZE:
- GetClientRect(hwndDlg, &dat->rc);
- dat->width = dat->rc.right - dat->rc.left;
- dat->height = dat->rc.bottom - dat->rc.top;
- return TRUE;
-
- case WM_THEMECHANGED:
- case WM_STYLECHANGED:
- MDescButton_SetupColors(dat);
- return TRUE;
-
- case WM_MOUSEMOVE:
- if (!dat->bMouseInside) {
- TRACKMOUSEEVENT tme = { 0 };
- tme.cbSize = sizeof(tme);
- tme.dwFlags = TME_LEAVE;
- tme.hwndTrack = hwndDlg;
- _TrackMouseEvent(&tme);
- dat->bMouseInside = TRUE;
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- }
- return 0;
-
- case WM_MOUSELEAVE:
- dat->bMouseInside = FALSE;
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- return 0;
-
- case WM_LBUTTONUP:
- SendMessage(GetParent(hwndDlg), WM_COMMAND, MAKEWPARAM(GetWindowLongPtr(hwndDlg, GWL_ID), 0), 0);
- return 0;
-
- case WM_ERASEBKGND:
- return 1;
-
- case WM_NCPAINT:
- InvalidateRect(hwndDlg, NULL, FALSE);
- break;
-
- case WM_PAINT:
- MDescButton_OnPaint(hwndDlg, dat, msg, wParam, lParam);
- break;
-
- case DBCM_SETTITLE:
- if (dat->lpzTitle)
- mir_free(dat->lpzTitle);
- if (wParam & MDBCF_UNICODE)
- dat->lpzTitle = mir_u2t((WCHAR *)lParam);
- else
- dat->lpzTitle = mir_a2t((char *)lParam);
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- return TRUE;
-
- case DBCM_SETDESCRIPTION:
- if (dat->lpzDescription)
- mir_free(dat->lpzDescription);
- if (wParam & MDBCF_UNICODE)
- dat->lpzDescription = mir_u2t((WCHAR *)lParam);
- else
- dat->lpzDescription = mir_a2t((char *)lParam);
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- return TRUE;
-
- case DBCM_SETICON:
- if (dat->hIcon && !dat->bSharedIcon)
- DestroyIcon(dat->hIcon);
-
- if (wParam & MDBCF_SHAREDICON) {
- dat->bSharedIcon = TRUE;
- dat->hIcon = (HICON)lParam;
- }
- else {
- dat->bSharedIcon = FALSE;
- dat->hIcon = CopyIcon((HICON)lParam);
- }
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- return TRUE;
-
- case WM_DESTROY:
- if (dat->lpzTitle)
- mir_free(dat->lpzTitle);
- if (dat->lpzDescription)
- mir_free(dat->lpzDescription);
- if (dat->hIcon && !dat->bSharedIcon)
- DestroyIcon(dat->hIcon);
- mir_free(dat);
- return TRUE;
- }
-
- return DefWindowProc(hwndDlg, msg, wParam, lParam);
-}
diff --git a/src/modules/options/filter.cpp b/src/modules/options/filter.cpp
deleted file mode 100644
index 982fe77399..0000000000
--- a/src/modules/options/filter.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda 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"
-
-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 (mir_tstrlen(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 (mir_tstrlen(title) > 0)
- AddFilterString(key, title);
-
- TCHAR szClass[64];
- GetClassName(hWndDlg, szClass, SIZEOF(szClass));
-
- if (mir_tstrcmpi(szClass, _T("SysTreeView32")) == 0) {
- HTREEITEM hItem = TreeView_GetRoot(hWndDlg);
- AddTreeViewNodes(hWndDlg, key, hItem);
- return;
- }
-
- if (mir_tstrcmpi(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 (mir_tstrlen(title) > 0)
- AddFilterString(key, title);
- }
- }
- }
- return;
- }
-
- if (mir_tstrcmpi(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 (mir_tstrlen(title) > 0)
- AddFilterString(key, title);
- }
- return;
- }
-
- if (mir_tstrcmpi(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 (mir_tstrlen(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);
- }
-}
diff --git a/src/modules/options/filter.h b/src/modules/options/filter.h
deleted file mode 100644
index 9317547726..0000000000
--- a/src/modules/options/filter.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda 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.
-*/
-
-#ifndef M_OPTIONS_FILTERING_H
-#define M_OPTIONS_FILTERING_H
-
-extern HANDLE hOptionsInitialize;
-
-typedef DWORD PageHash;
-
-void AddFilterString(const PageHash key, const TCHAR *data);
-BOOL ContainsFilterString(const PageHash key, TCHAR *data);
-void ClearFilterStrings();
-void GetDialogStrings(int enableKeywordFiltering, const PageHash key, TCHAR *pluginName, HWND hWnd, TCHAR *group, TCHAR *title, TCHAR *tab, TCHAR *name);
-
-_inline TCHAR *_tcslwr_locale(TCHAR *buf)
-{
- LCMapString(Langpack_GetDefaultLocale() , LCMAP_LOWERCASE, buf, (int)mir_tstrlen(buf), buf, (int)mir_tstrlen(buf));
- return buf;
-}
-
-typedef LIST<TCHAR> KeywordList;
-class CPageKeywords
-{
- PageHash _pageHashKey;
- KeywordList _pageKeyWords;
- static int _KeyWordsSortFunc(const TCHAR* p1, const TCHAR* p2) { return mir_tstrcmp(p1, p2); };
-
-public:
- CPageKeywords(PageHash pageHashKey) : _pageHashKey(pageHashKey), _pageKeyWords(1, _KeyWordsSortFunc) {};
- ~CPageKeywords()
- {
- for (int j = 0; j < _pageKeyWords.getCount(); j++)
- mir_free(_pageKeyWords[j]);
- };
-
- void AddKeyWord(TCHAR *ptKeyWord)
- {
- TCHAR *plwrWord = _tcslwr_locale(mir_tstrdup(ptKeyWord));
- if (_pageKeyWords.getIndex(plwrWord) == -1)
- _pageKeyWords.insert(plwrWord);
- else
- mir_free(plwrWord);
- };
-
- BOOL ContainsString(TCHAR *data)
- {
- for (int i=0; i < _pageKeyWords.getCount(); i++)
- if (_tcsstr(_pageKeyWords[i], data))
- return TRUE;
- return FALSE;
- }
- static int PageSortFunc(const CPageKeywords* p1, const CPageKeywords* p2)
- {
- if (p1->_pageHashKey < p2->_pageHashKey) { return -1; }
- else if (p1->_pageHashKey > p2->_pageHashKey) { return 1; }
- return 0;
- }
-};
-
-class CPageList : public OBJLIST<CPageKeywords>
-{
- CPageList();
-public:
- CPageList( int aincr, FTSortFunc afunc = CPageKeywords::PageSortFunc) : OBJLIST<CPageKeywords>(aincr, afunc) {};
- CPageKeywords * operator[](PageHash key)
- {
- CPageKeywords keyToSearch(key);
- return this->find(&keyToSearch);
- }
- ~CPageList() {};
-};
-
-#endif //M_OPTIONS_FILTERING_H
diff --git a/src/modules/options/headerbar.cpp b/src/modules/options/headerbar.cpp
deleted file mode 100644
index fe0c0bd2da..0000000000
--- a/src/modules/options/headerbar.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-Copyright (c) 2007 Artem Shpynov
-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 "m_iconheader.h"
-
-extern HINSTANCE hInst;
-
-static BOOL IsAeroMode()
-{
- BOOL result;
- return dwmIsCompositionEnabled && (dwmIsCompositionEnabled(&result) == S_OK) && result;
-}
-
-static BOOL IsVSMode()
-{
- return IsWinVerVistaPlus() && IsThemeActive();
-}
-
-////////////////////////////////////////////////////////////////////////////////////
-// Internals
-
-static LRESULT CALLBACK MHeaderbarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
-
-// structure is used for storing list of tab info
-struct MHeaderbarCtrl : public MZeroedObject
-{
- MHeaderbarCtrl() {}
- ~MHeaderbarCtrl() { mir_free(controlsToRedraw); }
-
- HWND hwnd;
-
- // UI info
- RECT rc;
- int width, height;
- HICON hIcon;
-
- // control colors
- RGBQUAD rgbBkgTop, rgbBkgBottom;
- COLORREF clText;
-
- int nControlsToRedraw;
- HWND *controlsToRedraw;
-
- // fonts
- HFONT hFont;
-};
-
-int LoadHeaderbarModule()
-{
- WNDCLASSEX wc = { 0 };
- wc.cbSize = sizeof(wc);
- wc.lpszClassName = _T("MHeaderbarCtrl");
- wc.lpfnWndProc = MHeaderbarWndProc;
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.cbWndExtra = sizeof(MHeaderbarCtrl*);
- wc.style = CS_GLOBALCLASS|CS_SAVEBITS;
- RegisterClassEx(&wc);
- return 0;
-}
-
-static void MHeaderbar_SetupColors(MHeaderbarCtrl *dat)
-{
- COLORREF cl = GetSysColor(COLOR_WINDOW);
- dat->rgbBkgBottom.rgbRed = (dat->rgbBkgTop.rgbRed = GetRValue(cl)) * .95;
- dat->rgbBkgBottom.rgbBlue = (dat->rgbBkgTop.rgbBlue = GetBValue(cl)) * .95;
- dat->rgbBkgBottom.rgbGreen = (dat->rgbBkgTop.rgbGreen = GetGValue(cl)) * .95;
-
- dat->clText = GetSysColor(COLOR_WINDOWTEXT);
- if (!dat->hFont)
- dat->hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
-}
-
-static void MHeaderbar_FillRect(HDC hdc, int x, int y, int width, int height, COLORREF cl)
-{
- int oldMode = SetBkMode(hdc, OPAQUE);
- COLORREF oldColor = SetBkColor(hdc, cl);
-
- RECT rc; SetRect(&rc, x, y, x+width, y+height);
- ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, "", 0, 0);
-
- SetBkMode(hdc, oldMode);
- SetBkColor(hdc, oldColor);
-}
-
-static void MHeaderbar_DrawGradient(HDC hdc, int x, int y, int width, int height, RGBQUAD *rgb0, RGBQUAD *rgb1)
-{
- int oldMode = SetBkMode(hdc, OPAQUE);
- COLORREF oldColor = SetBkColor(hdc, 0);
-
- RECT rc; SetRect(&rc, x, 0, x + width, 0);
- for (int i = y + height; --i >= y;) {
- COLORREF color = RGB(
- ((height - i - 1)*rgb0->rgbRed + i*rgb1->rgbRed) / height,
- ((height - i - 1)*rgb0->rgbGreen + i*rgb1->rgbGreen) / height,
- ((height - i - 1)*rgb0->rgbBlue + i*rgb1->rgbBlue) / height);
- rc.top = rc.bottom = i;
- ++rc.bottom;
- SetBkColor(hdc, color);
- ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, "", 0, 0);
- }
-
- SetBkMode(hdc, oldMode);
- SetBkColor(hdc, oldColor);
-}
-
-static LRESULT MHeaderbar_OnPaint(HWND hwndDlg, MHeaderbarCtrl *mit, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- int iTopSpace = IsAeroMode() ? 0 : 3;
- PAINTSTRUCT ps;
- HBITMAP hBmp, hOldBmp;
-
- int titleLength = GetWindowTextLength(hwndDlg) + 1;
- TCHAR *szTitle = (TCHAR *)mir_alloc(sizeof(TCHAR) * titleLength);
- GetWindowText(hwndDlg, szTitle, titleLength);
-
- TCHAR *szSubTitle = _tcschr(szTitle, _T('\n'));
- if (szSubTitle)
- *szSubTitle++ = 0;
-
- HDC hdc = BeginPaint(hwndDlg, &ps);
- HDC tempDC = CreateCompatibleDC(hdc);
-
- BITMAPINFO bmi;
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = mit->width;
- bmi.bmiHeader.biHeight = -mit->height; // we need this for DrawThemeTextEx
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biBitCount = 32;
- bmi.bmiHeader.biCompression = BI_RGB;
- hBmp = CreateDIBSection(tempDC, &bmi, DIB_RGB_COLORS, NULL, NULL, 0);
-
- hOldBmp = (HBITMAP)SelectObject(tempDC, hBmp);
-
- if (IsAeroMode()) {
- RECT temprc = { 0, 0, mit->width, mit->width };
- FillRect(tempDC, &temprc, (HBRUSH)GetStockObject(BLACK_BRUSH));
-
- MARGINS margins = { 0, 0, mit->height, 0 };
- dwmExtendFrameIntoClientArea(GetParent(hwndDlg), &margins);
-
- WTA_OPTIONS opts;
- opts.dwFlags = opts.dwMask = WTNCA_NOSYSMENU | WTNCA_NODRAWICON;
- setWindowThemeAttribute(GetParent(hwndDlg), WTA_NONCLIENT, &opts, sizeof(opts));
- }
- else {
- if (IsVSMode())
- MHeaderbar_FillRect(tempDC, 0, 0, mit->width, mit->height, GetSysColor(COLOR_WINDOW));
- else
- MHeaderbar_DrawGradient(tempDC, 0, 0, mit->width, mit->height, &mit->rgbBkgTop, &mit->rgbBkgBottom);
-
- MHeaderbar_FillRect(tempDC, 0, mit->height-2, mit->width, 1, GetSysColor(COLOR_BTNSHADOW));
- MHeaderbar_FillRect(tempDC, 0, mit->height-1, mit->width, 1, GetSysColor(COLOR_BTNHIGHLIGHT));
- }
-
- HFONT hFont = mit->hFont;
- SetBkMode(tempDC, TRANSPARENT);
- SetTextColor(tempDC, mit->clText);
-
- LOGFONT lf;
- GetObject(hFont, sizeof(lf), &lf);
- lf.lfWeight = FW_BOLD;
- HFONT hFntBold = CreateFontIndirect(&lf), hOldFont;
-
- if (mit->hIcon)
- DrawIcon(tempDC, 10, iTopSpace, mit->hIcon);
- else {
- HICON hIcon = (HICON)SendMessage(GetParent(hwndDlg), WM_GETICON, ICON_BIG, 0);
- if (hIcon == NULL)
- hIcon = (HICON)SendMessage(GetParent(hwndDlg), WM_GETICON, ICON_SMALL, 0);
- DrawIcon(tempDC, 10, iTopSpace, hIcon);
- }
-
- RECT textRect;
- textRect.left = 50;
- textRect.right = mit->width;
- textRect.top = 2 + iTopSpace;
- textRect.bottom = GetSystemMetrics(SM_CYICON) - 2 + iTopSpace;
-
- if (IsAeroMode()) {
- DTTOPTS dto = { 0 };
- dto.dwSize = sizeof(dto);
- dto.dwFlags = DTT_COMPOSITED | DTT_GLOWSIZE;
- dto.iGlowSize = 10;
-
- HANDLE hTheme = OpenThemeData(hwndDlg, L"Window");
- textRect.left = 50;
- hOldFont = (HFONT)SelectObject(tempDC, hFntBold);
-
- wchar_t *szTitleW = mir_t2u(szTitle);
- drawThemeTextEx(hTheme, tempDC, WP_CAPTION, CS_ACTIVE, szTitleW, -1, DT_TOP | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_END_ELLIPSIS, &textRect, &dto);
- mir_free(szTitleW);
-
- if (szSubTitle) {
- textRect.left = 66;
- SelectObject(tempDC, hFont);
-
- wchar_t *szSubTitleW = mir_t2u(szSubTitle);
- drawThemeTextEx(hTheme, tempDC, WP_CAPTION, CS_ACTIVE, szSubTitleW, -1, DT_BOTTOM | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_END_ELLIPSIS, &textRect, &dto);
- mir_free(szSubTitleW);
- }
- CloseThemeData(hTheme);
- }
- else {
- textRect.left = 50;
- hOldFont = (HFONT)SelectObject(tempDC, hFntBold);
- DrawText(tempDC, szTitle, -1, &textRect, DT_TOP | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_END_ELLIPSIS);
-
- if (szSubTitle) {
- textRect.left = 66;
- SelectObject(tempDC, hFont);
- DrawText(tempDC, szSubTitle, -1, &textRect, DT_BOTTOM | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_END_ELLIPSIS);
- }
- }
-
- DeleteObject(hFntBold);
-
- mir_free(szTitle);
-
- //Copy to output
- if (mit->nControlsToRedraw) {
- RECT temprc;
- temprc.left = 0;
- temprc.right = mit->width;
- temprc.top = 0;
- temprc.bottom = mit->width;
- HRGN hRgn = CreateRectRgnIndirect(&temprc);
-
- for (int i = 0; i < mit->nControlsToRedraw; i++) {
- GetWindowRect(mit->controlsToRedraw[i], &temprc);
- MapWindowPoints(NULL, hwndDlg, (LPPOINT)&temprc, 2);
- HRGN hRgnTmp = CreateRectRgnIndirect(&temprc);
- CombineRgn(hRgn, hRgn, hRgnTmp, RGN_DIFF);
- DeleteObject(hRgnTmp);
- }
- SelectClipRgn(hdc, hRgn);
- DeleteObject(hRgn);
- }
-
- BitBlt(hdc, mit->rc.left, mit->rc.top, mit->width, mit->height, tempDC, 0, 0, SRCCOPY);
-
- SelectClipRgn(hdc, NULL);
-
- SelectObject(tempDC, hOldBmp);
- DeleteObject(hBmp);
- SelectObject(tempDC, hOldFont);
- DeleteDC(tempDC);
-
- EndPaint(hwndDlg, &ps);
-
- return TRUE;
-}
-
-static LRESULT CALLBACK MHeaderbarWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- MHeaderbarCtrl* itc = (MHeaderbarCtrl *)GetWindowLongPtr(hwndDlg, 0);
- switch (msg) {
- case WM_NCCREATE:
- itc = new MHeaderbarCtrl; //(MHeaderbarCtrl*)mir_alloc(sizeof(MHeaderbarCtrl));
-
- SetWindowLongPtr(hwndDlg, 0, (LONG_PTR)itc);
- MHeaderbar_SetupColors(itc);
-
- {
- HWND hParent = GetParent(hwndDlg);
- RECT rcWnd; GetWindowRect(hwndDlg, &rcWnd);
- itc->controlsToRedraw = 0;
- itc->nControlsToRedraw = 0;
- for (HWND hChild = FindWindowEx(hParent, NULL, NULL, NULL); hChild; hChild = FindWindowEx(hParent, hChild, NULL, NULL)) {
- if (hChild != hwndDlg) {
- RECT rcChild; GetWindowRect(hChild, &rcChild);
- RECT rc;
- IntersectRect(&rc, &rcChild, &rcWnd);
- if (!IsRectEmpty(&rc)) {
- ++itc->nControlsToRedraw;
- itc->controlsToRedraw = (HWND *)mir_realloc(itc->controlsToRedraw, sizeof(HWND) * itc->nControlsToRedraw);
- itc->controlsToRedraw[itc->nControlsToRedraw - 1] = hChild;
- }
- }
- }
- }
-
- break;
-
- case WM_SETFONT:
- itc->hFont = (HFONT)wParam;
- break;
-
- case WM_SIZE:
- GetClientRect(hwndDlg, &itc->rc);
- itc->width = itc->rc.right - itc->rc.left;
- itc->height = itc->rc.bottom - itc->rc.top;
- return TRUE;
-
- case WM_THEMECHANGED:
- case WM_STYLECHANGED:
- MHeaderbar_SetupColors(itc);
- return TRUE;
-
- case WM_LBUTTONDOWN:
- SendMessage(GetParent(hwndDlg), WM_SYSCOMMAND, 0xF012, 0);
- return 0;
-
- case WM_SETICON:
- if (wParam < 3) {
- itc->hIcon = (HICON)lParam;
- InvalidateRect(hwndDlg, NULL, FALSE);
- }
- break;
-
- case WM_ERASEBKGND:
- return 1;
-
- case WM_NCPAINT:
- InvalidateRect(hwndDlg, NULL, FALSE);
- break;
-
- case WM_PAINT:
- MHeaderbar_OnPaint(hwndDlg, itc, msg, wParam, lParam);
- break;
-
- case WM_DESTROY:
- delete itc;
- break;
- }
- return DefWindowProc(hwndDlg, msg, wParam, lParam);
-}
diff --git a/src/modules/options/iconheader.cpp b/src/modules/options/iconheader.cpp
deleted file mode 100644
index 42ec5d2fbb..0000000000
--- a/src/modules/options/iconheader.cpp
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-Copyright (c) 2007 Artem Shpynov
-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 "m_iconheader.h"
-
-extern HINSTANCE hInst;
-
-static BOOL IsAeroMode()
-{
- BOOL result;
- return dwmIsCompositionEnabled && (dwmIsCompositionEnabled(&result) == S_OK) && result;
-}
-
-static BOOL IsVSMode()
-{
- return IsWinVerVistaPlus() && IsThemeActive();
-}
-
-////////////////////////////////////////////////////////////////////////////////////
-// Internals
-
-#define ITC_BORDER_SIZE 3
-
-static LRESULT CALLBACK MIcoTabWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
-
-// structure is used for storing list of tab info
-struct MIcoTabCtrl : public MZeroedObject
-{
- MIcoTabCtrl(): pList(1) {}
-
- HWND hwnd;
- int nSelectedIdx, nHotIdx;
- LIST<MIcoTab> pList;
-
- // UI info
- BOOL bMouseInside;
- RECT rc;
- int width, height;
- int itemWidth, itemHeight;
-
- //background bitmap
- HBITMAP hBkgBmp;
- HBITMAP hBkgOldBmp;
- HDC hBkgDC;
- SIZE BkgSize;
-
- // control colors
- RGBQUAD rgbBkgTop, rgbBkgBottom;
- RGBQUAD rgbSelTop, rgbSelBottom;
- RGBQUAD rgbHotTop, rgbHotBottom;
- COLORREF clText;
- COLORREF clSelText, clSelBorder;
- COLORREF clHotText, clHotBorder;
-
- // fonts
- HFONT hFont;
-};
-
-typedef void (*ItemDestuctor)(void*);
-
-static void MITListDestructor(void * adr)
-{
- MIcoTab * mit = (MIcoTab *)adr;
- mir_free(mit->tcsName);
- if (mit->hIcon && !(mit->flag&MITCF_SHAREDICON))
- DestroyIcon(mit->hIcon);
- mir_free(adr);
-}
-
-void li_ListDestruct(LIST<MIcoTab> &pList, ItemDestuctor pItemDestructor)
-{
- for (int i=0; i<pList.getCount(); i++) pItemDestructor(pList[i]);
- pList.destroy();
-}
-
-int LoadIcoTabsModule()
-{
- WNDCLASSEX wc;
-
- memset(&wc, 0, sizeof(wc));
- wc.cbSize = sizeof(wc);
- wc.lpszClassName = MIRANDAICOTABCLASS;
- wc.lpfnWndProc = MIcoTabWndProc;
-// wc.hCursor = LoadCursor(NULL, IDC_HAND);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.cbWndExtra = sizeof(MIcoTabCtrl*);
- wc.hbrBackground = 0; //GetStockObject(WHITE_BRUSH);
- wc.style = CS_GLOBALCLASS/*|CS_SAVEBITS*/;
- RegisterClassEx(&wc);
- return 0;
-}
-
-static void MIcoTab_SetupColors(MIcoTabCtrl *dat)
-{
- COLORREF cl;
-
- cl = GetSysColor(COLOR_WINDOW);
- dat->rgbBkgBottom.rgbRed = (dat->rgbBkgTop.rgbRed = GetRValue(cl)) * .95;
- dat->rgbBkgBottom.rgbGreen = (dat->rgbBkgTop.rgbGreen = GetGValue(cl)) * .95;
- dat->rgbBkgBottom.rgbBlue = (dat->rgbBkgTop.rgbBlue = GetBValue(cl)) * .95;
-
- cl = GetSysColor(COLOR_HIGHLIGHT);
- dat->rgbSelTop.rgbRed = (dat->rgbSelBottom.rgbRed = GetRValue(cl)) * .75;
- dat->rgbSelTop.rgbGreen = (dat->rgbSelBottom.rgbGreen = GetGValue(cl)) * .75;
- dat->rgbSelTop.rgbBlue = (dat->rgbSelBottom.rgbBlue = GetBValue(cl)) * .75;
-
- dat->rgbHotTop.rgbRed = (dat->rgbSelTop.rgbRed + 255) / 2;
- dat->rgbHotTop.rgbGreen = (dat->rgbSelTop.rgbGreen + 255) / 2;
- dat->rgbHotTop.rgbBlue = (dat->rgbSelTop.rgbBlue + 255) / 2;
-
- dat->rgbHotBottom.rgbRed = (dat->rgbSelBottom.rgbRed + 255) / 2;
- dat->rgbHotBottom.rgbGreen = (dat->rgbSelBottom.rgbGreen + 255) / 2;
- dat->rgbHotBottom.rgbBlue = (dat->rgbSelBottom.rgbBlue + 255) / 2;
-
- dat->clText = GetSysColor(COLOR_WINDOWTEXT);
- dat->clSelText = GetSysColor(COLOR_HIGHLIGHTTEXT);
- dat->clSelBorder = RGB(dat->rgbSelTop.rgbRed, dat->rgbSelTop.rgbGreen, dat->rgbSelTop.rgbBlue);
- dat->clHotBorder = RGB(dat->rgbHotTop.rgbRed, dat->rgbHotTop.rgbGreen, dat->rgbHotTop.rgbBlue);
-
- if (!dat->hFont) dat->hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
-}
-
-static void MIcoTab_FillRect(HDC hdc, int x, int y, int width, int height, COLORREF cl)
-{
- int oldMode = SetBkMode(hdc, OPAQUE);
- COLORREF oldColor = SetBkColor(hdc, cl);
-
- RECT rc; SetRect(&rc, x, y, x+width, y+height);
- ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, "", 0, 0);
-
- SetBkMode(hdc, oldMode);
- SetBkColor(hdc, oldColor);
-}
-
-static void MIcoTab_DrawGradient(HDC hdc, int x, int y, int width, int height, RGBQUAD *rgb0, RGBQUAD *rgb1)
-{
- int oldMode = SetBkMode(hdc, OPAQUE);
- COLORREF oldColor = SetBkColor(hdc, 0);
-
- RECT rc; SetRect(&rc, x, 0, x+width, 0);
- for (int i = y+height; --i >= y;) {
- COLORREF color = RGB(
- ((height-i-1)*rgb0->rgbRed + i*rgb1->rgbRed) / height,
- ((height-i-1)*rgb0->rgbGreen + i*rgb1->rgbGreen) / height,
- ((height-i-1)*rgb0->rgbBlue + i*rgb1->rgbBlue) / height);
- rc.top = rc.bottom = i;
- ++rc.bottom;
- SetBkColor(hdc, color);
- ExtTextOutA(hdc, 0, 0, ETO_OPAQUE, &rc, "", 0, 0);
- }
-
- SetBkMode(hdc, oldMode);
- SetBkColor(hdc, oldColor);
-}
-
-static void MIcoTab_DrawItem(HWND hwnd, HDC hdc, MIcoTabCtrl *dat, MIcoTab *tab, int i)
-{
- int iTopSpace = IsAeroMode() ? 0 : ITC_BORDER_SIZE;
- int itemX = ITC_BORDER_SIZE + dat->itemWidth * i;
- int iconTop = iTopSpace + 5;
- int textTop = iconTop + 32 + 3;
-
- HFONT hFntSave = NULL;
-
- if (dat->nSelectedIdx == i) {
- LOGFONT lf;
- GetObject(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf);
- lf.lfWeight = FW_BOLD;
- hFntSave = (HFONT)SelectObject(hdc, CreateFontIndirect(&lf));
-
- if (IsVSMode()) {
- RECT rc;
- rc.left = itemX;
- rc.top = iTopSpace;
- rc.right = itemX + dat->itemWidth;
- rc.bottom = iTopSpace + dat->itemHeight;
- HANDLE hTheme = OpenThemeData(hwnd, L"ListView");
- if (dat->nHotIdx == i || GetFocus() == hwnd)
- DrawThemeBackground(hTheme, hdc, LVP_LISTITEM, LISS_HOTSELECTED, &rc, NULL);
- else
- DrawThemeBackground(hTheme, hdc, LVP_LISTITEM, LISS_SELECTED, &rc, NULL);
-
- CloseThemeData(hTheme);
- }
- else {
- MIcoTab_FillRect(hdc, itemX, ITC_BORDER_SIZE, dat->itemWidth, dat->itemHeight, dat->clSelBorder);
- MIcoTab_DrawGradient(hdc, itemX+1, ITC_BORDER_SIZE+1, dat->itemWidth-2, dat->itemHeight-2, &dat->rgbSelTop, &dat->rgbSelBottom);
- }
- SetTextColor(hdc, dat->clSelText);
- }
- else if (dat->nHotIdx == i) {
- if (IsVSMode()) {
- RECT rc;
- rc.left = itemX;
- rc.top = iTopSpace;
- rc.right = itemX + dat->itemWidth;
- rc.bottom = iTopSpace + dat->itemHeight;
- SetWindowTheme(hwnd, L"explorer", NULL);
- HANDLE hTheme = OpenThemeData(hwnd, L"ListView");
- DrawThemeBackground(hTheme, hdc, LVP_LISTITEM, LISS_HOT, &rc, NULL);
- CloseThemeData(hTheme);
- }
- else {
- MIcoTab_FillRect(hdc, itemX, ITC_BORDER_SIZE, dat->itemWidth, dat->itemHeight, dat->clHotBorder);
- MIcoTab_DrawGradient(hdc, itemX+1, ITC_BORDER_SIZE+1, dat->itemWidth-2, dat->itemHeight-2, &dat->rgbHotTop, &dat->rgbHotBottom);
- }
- SetTextColor(hdc, dat->clHotText);
- }
- else SetTextColor(hdc, dat->clText);
-
- RECT textRect;
- textRect.left = itemX;
- textRect.right = itemX+dat->itemWidth;
- textRect.top = textTop;
- textRect.bottom = iconTop+dat->itemHeight;
- DrawIcon(hdc, itemX+dat->itemWidth/2-16, iconTop, tab->hIcon);
-
- if (IsVSMode()) {
- DTTOPTS dto = {0};
- dto.dwSize = sizeof(dto);
- dto.dwFlags = DTT_COMPOSITED|DTT_GLOWSIZE;
- dto.iGlowSize = 10;
- HANDLE hTheme = OpenThemeData(hwnd, L"Window");
- wchar_t *tcsNameW = mir_t2u(tab->tcsName);
- drawThemeTextEx(hTheme, hdc, WP_CAPTION, CS_ACTIVE, tcsNameW, -1, DT_VCENTER|DT_CENTER|DT_END_ELLIPSIS, &textRect, &dto);
- mir_free(tcsNameW);
- CloseThemeData(hTheme);
- }
- else DrawText(hdc, tab->tcsName, -1, &textRect, DT_VCENTER|DT_CENTER|DT_END_ELLIPSIS);
-
- if (hFntSave)
- DeleteObject(SelectObject(hdc, hFntSave));
-}
-
-static LRESULT MIcoTab_OnPaint(HWND hwndDlg, MIcoTabCtrl *mit, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- PAINTSTRUCT ps;
-
- HDC hdc = BeginPaint(hwndDlg, &ps);
- HDC tempDC = CreateCompatibleDC(hdc);
-
- BITMAPINFO bmi;
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = mit->width;
- bmi.bmiHeader.biHeight = -mit->height; // we need this for DrawThemeTextEx
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biBitCount = 32;
- bmi.bmiHeader.biCompression = BI_RGB;
- HBITMAP hBmp = CreateDIBSection(tempDC, &bmi, DIB_RGB_COLORS, NULL, NULL, 0);
-
- HBITMAP hOldBmp = (HBITMAP)SelectObject(tempDC, hBmp);
-
- if (IsAeroMode()) {
- RECT temprc;
- temprc.left = 0;
- temprc.right = mit->width;
- temprc.top = 0;
- temprc.bottom = mit->width;
- FillRect(tempDC, &temprc, (HBRUSH)GetStockObject(BLACK_BRUSH));
- }
- else {
- if (mit->hBkgBmp)
- StretchBlt(tempDC, 0, 0, mit->width, mit->height, mit->hBkgDC, 0, 0, mit->BkgSize.cx, mit->BkgSize.cy, SRCCOPY);
- else {
- if (IsVSMode())
- MIcoTab_FillRect(tempDC, 0, 0, mit->width, mit->height, GetSysColor(COLOR_WINDOW));
- else
- MIcoTab_DrawGradient(tempDC, 0, 0, mit->width, mit->height, &mit->rgbBkgTop, &mit->rgbBkgBottom);
-
- MIcoTab_FillRect(tempDC, 0, mit->height-2, mit->width, 1, GetSysColor(COLOR_BTNSHADOW));
- MIcoTab_FillRect(tempDC, 0, mit->height-1, mit->width, 1, GetSysColor(COLOR_BTNHIGHLIGHT));
- }
- }
-
- //Draw Items
- HFONT hFont = mit->hFont;
- HFONT hOldFont = (HFONT)SelectObject(tempDC, hFont);
- SetBkMode(tempDC, TRANSPARENT);
-
- for (int i=0; i<mit->pList.getCount(); i++) {
- MIcoTab *tab = (MIcoTab *)mit->pList[i];
- MIcoTab_DrawItem(hwndDlg, tempDC, mit, tab, i);
- }
-
- //Copy to output
- BitBlt(hdc, mit->rc.left, mit->rc.top, mit->width, mit->height, tempDC, 0, 0, SRCCOPY);
- SelectObject(tempDC, hOldBmp);
- DeleteObject(hBmp);
- SelectObject(tempDC,hOldFont);
- DeleteDC(tempDC);
-
- EndPaint(hwndDlg, &ps);
-
- return TRUE;
-}
-
-static LRESULT CALLBACK MIcoTabWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- MIcoTabCtrl* itc = (MIcoTabCtrl *)GetWindowLongPtr(hwndDlg, 0);
- switch(msg) {
- case WM_NCCREATE:
- itc = new MIcoTabCtrl; //(MIcoTabCtrl*)mir_alloc(sizeof(MIcoTabCtrl));
- itc->nSelectedIdx = -1;
- itc->nHotIdx = -1;
- itc->bMouseInside = FALSE;
- SetWindowLongPtr(hwndDlg, 0, (LONG_PTR)itc);
- MIcoTab_SetupColors(itc);
-
- if (IsAeroMode()) {
- RECT rc; GetWindowRect(hwndDlg, &rc);
- MARGINS margins = {0, 0, rc.bottom-rc.top, 0};
- dwmExtendFrameIntoClientArea(GetParent(hwndDlg), &margins);
- }
-
- return TRUE;
-
- case WM_SETFONT:
- itc->hFont = (HFONT)wParam;
- break;
-
- case WM_SIZE:
- GetClientRect(hwndDlg, &itc->rc);
- itc->width = itc->rc.right-itc->rc.left;
- itc->height = itc->rc.bottom-itc->rc.top;
-
- if (itc->pList.getCount()) {
- itc->itemWidth = (itc->width-2*ITC_BORDER_SIZE)/itc->pList.getCount();
- itc->itemHeight = itc->height-2*ITC_BORDER_SIZE-2;
- }
- else itc->itemWidth = itc->itemHeight = 0;
- return TRUE;
-
- case WM_THEMECHANGED:
- case WM_STYLECHANGED:
- MIcoTab_SetupColors(itc);
- return TRUE;
-
- case WM_MOUSEMOVE:
- if (!itc->bMouseInside) {
- TRACKMOUSEEVENT tme = {0};
- tme.cbSize = sizeof(tme);
- tme.dwFlags = TME_LEAVE;
- tme.hwndTrack = hwndDlg;
- _TrackMouseEvent(&tme);
- itc->bMouseInside = TRUE;
- }
-
- itc->nHotIdx = (LOWORD(lParam) - ITC_BORDER_SIZE) / itc->itemWidth;
- if (itc->nHotIdx >= itc->pList.getCount())
- itc->nHotIdx = -1;
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- return 0;
-
- case WM_MOUSELEAVE:
- itc->bMouseInside = FALSE;
- itc->nHotIdx = -1;
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- return 0;
-
- case WM_LBUTTONUP:
- if ((itc->nHotIdx >= 0) && (itc->nHotIdx != itc->nSelectedIdx))
- {
- itc->nSelectedIdx = itc->nHotIdx;
- SetWindowText(hwndDlg, itc->pList[itc->nSelectedIdx]->tcsName);
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- SendMessage(GetParent(hwndDlg), WM_COMMAND,
- MAKEWPARAM(GetWindowLongPtr(hwndDlg, GWL_ID), ITCN_SELCHANGED),
- itc->nSelectedIdx);
- }
- return 0;
-
- case WM_SETFOCUS:
- case WM_KILLFOCUS:
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- break;
-
- case WM_MOUSEACTIVATE:
- SetFocus(hwndDlg);
- return MA_ACTIVATE;
-
- case WM_GETDLGCODE:
- {
- if (lParam)
- {
- MSG *msg = (MSG *) lParam;
- if (msg->message == WM_KEYDOWN)
- {
- if (msg->wParam == VK_TAB)
- return 0;
- if (msg->wParam == VK_ESCAPE)
- return 0;
- } else
- if (msg->message == WM_CHAR)
- {
- if (msg->wParam == '\t')
- return 0;
- if (msg->wParam == 27)
- return 0;
- }
- }
- return DLGC_WANTMESSAGE;
- }
-
- case WM_KEYDOWN:
- {
- int newIdx = itc->nSelectedIdx;
- switch (wParam)
- {
- case VK_NEXT:
- case VK_RIGHT:
- newIdx++;
- break;
- case VK_PRIOR:
- case VK_LEFT:
- newIdx--;
- break;
- }
- if ((newIdx >= 0) && (newIdx < itc->pList.getCount()) && (newIdx != itc->nSelectedIdx))
- {
- itc->nSelectedIdx = newIdx;
- SetWindowText(hwndDlg, itc->pList[itc->nSelectedIdx]->tcsName);
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- SendMessage(GetParent(hwndDlg), WM_COMMAND,
- MAKEWPARAM(GetWindowLongPtr(hwndDlg, GWL_ID), ITCN_SELCHANGEDKBD),
- itc->nSelectedIdx);
- }
- return 0;
- }
-
- case WM_ERASEBKGND:
- return 1;
-
- case WM_NCPAINT:
- InvalidateRect(hwndDlg, NULL, FALSE);
- break;
-
- case WM_PAINT:
- MIcoTab_OnPaint(hwndDlg, itc, msg, wParam, lParam);
- break;
-
- case ITCM_SETBACKGROUND:
- itc->hBkgBmp = (HBITMAP)lParam;
- if (!itc->hBkgDC)
- itc->hBkgDC = CreateCompatibleDC(NULL);
- itc->hBkgOldBmp = (HBITMAP)SelectObject(itc->hBkgDC, itc->hBkgBmp);
- {
- BITMAPINFO bmp;
- GetObject(itc->hBkgBmp, sizeof(bmp), &bmp);
- itc->BkgSize.cx = bmp.bmiHeader.biWidth;
- itc->BkgSize.cy = bmp.bmiHeader.biHeight;
- }
- return TRUE;
-
- case ITCM_ADDITEM:
- {
- MIcoTab* pMit = (MIcoTab *)wParam;
- if (!pMit)
- return FALSE;
-
- MIcoTab* pListMit = (MIcoTab *)mir_calloc(sizeof(MIcoTab));
- pListMit->flag = pMit->flag;
- pListMit->data = pMit->data;
- if (pMit->flag & MITCF_UNICODE)
- pListMit->tcsName = mir_u2t(pMit->lpwzName);
- else
- pListMit->tcsName = mir_a2t(pMit->lpzName);
- if (pMit->hIcon) {
- if (pListMit->flag&MITCF_SHAREDICON)
- pListMit->hIcon = pMit->hIcon;
- else
- pListMit->hIcon = CopyIcon(pMit->hIcon);
- }
- itc->pList.insert(pListMit);
-
- itc->itemWidth = (itc->width-2*ITC_BORDER_SIZE)/itc->pList.getCount();
- itc->itemHeight = itc->height-2*ITC_BORDER_SIZE-2;
-
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- return TRUE;
- }
-
- case ITCM_SETSEL:
- if ((int)wParam >= 0 && (int)wParam < itc->pList.getCount()) {
- itc->nSelectedIdx = wParam;
- SetWindowText(hwndDlg, itc->pList[itc->nSelectedIdx]->tcsName);
- RedrawWindow(hwndDlg, NULL, NULL, RDW_INVALIDATE);
- SendMessage(GetParent(hwndDlg), WM_COMMAND,
- MAKEWPARAM(GetWindowLongPtr(hwndDlg, GWL_ID), ITCN_SELCHANGED),
- itc->nSelectedIdx);
- }
- return TRUE;
-
- case ITCM_GETSEL:
- return itc->nSelectedIdx;
-
- case ITCM_GETITEMDATA:
- if ((int)wParam >= 0 && (int)wParam < itc->pList.getCount())
- return ((MIcoTab *)itc->pList[wParam])->data;
- return 0;
-
- case WM_DESTROY:
- if (itc->hBkgDC) {
- SelectObject(itc->hBkgDC, itc->hBkgOldBmp);
- DeleteDC(itc->hBkgDC);
- }
- li_ListDestruct(itc->pList, MITListDestructor);
- delete itc;
- return TRUE;
- }
- return DefWindowProc(hwndDlg, msg, wParam, lParam);
-}
diff --git a/src/modules/options/options.cpp b/src/modules/options/options.cpp
deleted file mode 100644
index 61e3f3775f..0000000000
--- a/src/modules/options/options.cpp
+++ /dev/null
@@ -1,1327 +0,0 @@
-/*
-
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-12 Miranda IM project,
-Copyright (c) 2007 Artem Shpynov
-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"
-
-#define FILTER_TIMEOUT_TIMER 10012
-
-#define ALL_MODULES_FILTER LPGEN("<all modules>")
-#define CORE_MODULES_FILTER LPGEN("<core modules>")
-
-int LangpackOptionsInit(WPARAM, LPARAM);
-
-static HANDLE hOptionsInitEvent;
-static HWND hwndOptions = NULL;
-static HWND hFilterSearchWnd = NULL;
-
-// Thread for search keywords in dialogs
-static BYTE bSearchState = 0; // 0 - not executed; 1 - in progress; 2 - completed;
-static int FilterPage = 0;
-static int FilterLoadProgress = 100;
-static int FilterTimerId = 0;
-
-struct OptionsPageInit
-{
- int pageCount;
- OPTIONSDIALOGPAGE *odp;
-};
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-class COptionPageDialog : public CDlgBase
-{
- DLGPROC m_wndProc;
- LPARAM m_lParam;
-
-public:
- COptionPageDialog(HINSTANCE hInst, int idDialog, DLGPROC pProc, LPARAM lParam) :
- CDlgBase(hInst, idDialog),
- m_wndProc(pProc),
- m_lParam(lParam)
- {
- }
-
- virtual INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
- {
- if (msg == WM_INITDIALOG)
- lParam = m_lParam;
-
- LRESULT res = m_wndProc(m_hwnd, msg, wParam, lParam);
-
- if (msg == WM_DESTROY)
- m_hwnd = NULL;
-
- return res;
- }
-};
-
-struct OptionsPageData : public MZeroedObject
-{
- OptionsPageData(OPTIONSDIALOGPAGE *src)
- {
- if (src->hInstance != NULL && src->pszTemplate != NULL)
- pDialog = new COptionPageDialog(src->hInstance, (int)src->pszTemplate, src->pfnDlgProc, src->dwInitParam);
- else
- pDialog = src->pDialog;
- assert(pDialog != NULL);
-
- flags = src->flags;
- hLangpack = src->hLangpack;
-
- if (src->flags & ODPF_UNICODE)
- ptszTitle = mir_tstrdup(src->ptszTitle);
- else
- ptszTitle = mir_a2t(src->pszTitle);
-
- if (src->flags & ODPF_UNICODE)
- ptszGroup = mir_tstrdup(src->ptszGroup);
- else
- ptszGroup = mir_a2t(src->pszGroup);
-
- if (src->flags & ODPF_UNICODE)
- ptszTab = mir_tstrdup(src->ptszTab);
- else
- ptszTab = mir_a2t(src->pszTab);
- }
-
- ~OptionsPageData()
- {
- if (pDialog && getHwnd() != NULL)
- DestroyWindow(getHwnd());
- }
-
- CDlgBase *pDialog;
- int hLangpack;
- ptrT ptszTitle, ptszGroup, ptszTab;
- HTREEITEM hTreeItem;
- int changed;
- int height;
- int width;
- DWORD flags;
- BOOL insideTab;
-
- __forceinline HWND getHwnd() const { return pDialog->GetHwnd(); }
- __forceinline HINSTANCE getInst() const { return pDialog->GetInst(); }
-
- __forceinline TCHAR* getString(TCHAR *ptszStr)
- {
- if (flags & ODPF_DONTTRANSLATE)
- return ptszStr;
- return TranslateTH(hLangpack, ptszStr);
- }
-};
-
-struct OptionsDlgData : public MZeroedObject
-{
- OptionsDlgData() :
- arOpd(10)
- {}
-
- int currentPage;
- HTREEITEM hCurrentPage;
- LIST<OptionsPageData> arOpd;
- RECT rcDisplay;
- RECT rcTab;
- HFONT hBoldFont;
- TCHAR szFilterString[1024];
- HANDLE hPluginLoad, hPluginUnload;
-
- OptionsPageData* getCurrent() const
- { return (currentPage == -1) ? NULL : arOpd[currentPage];
- }
-};
-
-HTREEITEM FindNamedTreeItemAtRoot(HWND hwndTree, const TCHAR* name)
-{
- TCHAR str[128];
- TVITEM tvi;
- tvi.mask = TVIF_TEXT;
- tvi.pszText = str;
- tvi.cchTextMax = SIZEOF(str);
- tvi.hItem = TreeView_GetRoot(hwndTree);
- while (tvi.hItem != NULL) {
- SendMessage(hwndTree, TVM_GETITEM, 0, (LPARAM)&tvi);
- if (!mir_tstrcmpi(str, name))
- return tvi.hItem;
-
- tvi.hItem = TreeView_GetNextSibling(hwndTree, tvi.hItem);
- }
- return NULL;
-}
-
-static HTREEITEM FindNamedTreeItemAtChildren(HWND hwndTree, HTREEITEM hItem, const TCHAR* name)
-{
- TCHAR str[128];
- TVITEM tvi;
- tvi.mask = TVIF_TEXT;
- tvi.pszText = str;
- tvi.cchTextMax = SIZEOF(str);
- tvi.hItem = TreeView_GetChild(hwndTree, hItem);
- while (tvi.hItem != NULL) {
- SendMessage(hwndTree, TVM_GETITEM, 0, (LPARAM)&tvi);
- if (!mir_tstrcmpi(str, name))
- return tvi.hItem;
-
- tvi.hItem = TreeView_GetNextSibling(hwndTree, tvi.hItem);
- }
- return NULL;
-}
-
-static BOOL CALLBACK BoldGroupTitlesEnumChildren(HWND hwnd, LPARAM lParam)
-{
- TCHAR szClass[64];
- GetClassName(hwnd, szClass, SIZEOF(szClass));
-
- if (!mir_tstrcmp(szClass, _T("Button")) && (GetWindowLongPtr(hwnd, GWL_STYLE) & 0x0F) == BS_GROUPBOX)
- SendMessage(hwnd, WM_SETFONT, lParam, 0);
- return TRUE;
-}
-
-#define OPTSTATE_PREFIX "s_"
-
-static void SaveOptionsTreeState(HWND hdlg)
-{
- TVITEMA tvi;
- char buf[130], str[128];
- tvi.mask = TVIF_TEXT | TVIF_STATE;
- tvi.pszText = str;
- tvi.cchTextMax = SIZEOF(str);
- tvi.hItem = TreeView_GetRoot(GetDlgItem(hdlg, IDC_PAGETREE));
- while (tvi.hItem != NULL) {
- if (SendDlgItemMessageA(hdlg, IDC_PAGETREE, TVM_GETITEMA, 0, (LPARAM)&tvi)) {
- mir_snprintf(buf, "%s%s", OPTSTATE_PREFIX, str);
- db_set_b(NULL, "Options", buf, (BYTE)((tvi.state & TVIS_EXPANDED) ? 1 : 0));
- }
- tvi.hItem = TreeView_GetNextSibling(GetDlgItem(hdlg, IDC_PAGETREE), tvi.hItem);
- }
-}
-
-#define DM_FOCUSPAGE (WM_USER+10)
-#define DM_REBUILDPAGETREE (WM_USER+11)
-
-#define HM_MODULELOAD (WM_USER+12)
-#define HM_MODULEUNLOAD (WM_USER+13)
-
-static void ThemeDialogBackground(HWND hwnd, BOOL tabbed)
-{
- EnableThemeDialogTexture(hwnd, (tabbed ? ETDT_ENABLE : ETDT_DISABLE) | ETDT_USETABTEXTURE);
-}
-
-static TCHAR* GetPluginName(HINSTANCE hInstance, TCHAR *buffer, int size)
-{
- TCHAR tszModuleName[MAX_PATH];
- GetModuleFileName(hInstance, tszModuleName, SIZEOF(tszModuleName));
- TCHAR *dllName = _tcsrchr(tszModuleName, '\\');
- if (!dllName)
- dllName = tszModuleName;
- else
- dllName++;
-
- _tcsncpy_s(buffer, size, dllName, _TRUNCATE);
- return buffer;
-}
-
-PageHash GetPluginPageHash(const OptionsPageData *page)
-{
- return mir_hashstrT(page->ptszGroup) + mir_hashstrT(page->ptszTitle) + mir_hashstrT(page->ptszTab);
-}
-
-static HWND CreateOptionWindow(const OptionsPageData *opd, HWND hWndParent)
-{
- opd->pDialog->SetParent(hWndParent);
- opd->pDialog->Create();
- return opd->pDialog->GetHwnd();
-}
-
-static void FindFilterStrings(int enableKeywordFiltering, int current, HWND hWndParent, const OptionsPageData *page)
-{
- HWND hWnd = 0;
- if (enableKeywordFiltering) {
- if (current)
- hWnd = page->getHwnd();
- else {
- hWnd = CreateOptionWindow(page, hWndParent);
- ShowWindow(hWnd, SW_HIDE); // make sure it's hidden
- }
- }
-
- DWORD key = GetPluginPageHash(page); // get the plugin page hash
-
- TCHAR pluginName[MAX_PATH];
- char *temp = GetPluginNameByInstance(page->getInst());
- GetDialogStrings(enableKeywordFiltering, key, GetPluginName(page->getInst(), pluginName, SIZEOF(pluginName)), hWnd, page->ptszGroup, page->ptszTitle, page->ptszTab, _A2T(temp));
-
- if (enableKeywordFiltering && !current)
- DestroyWindow(hWnd); // destroy the page, we're done with it
-}
-
-static int MatchesFilter(const OptionsPageData *page, TCHAR *szFilterString)
-{
- return ContainsFilterString(GetPluginPageHash(page), szFilterString);
-}
-
-static LRESULT CALLBACK OptionsFilterSubclassProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- if (message != WM_PAINT && message != WM_PRINT)
- return mir_callNextSubclass(hWnd, OptionsFilterSubclassProc, message, wParam, lParam);
-
- if (GetFocus() == hWnd || GetWindowTextLength(hWnd))
- return mir_callNextSubclass(hWnd, OptionsFilterSubclassProc, message, wParam, lParam);
-
- RECT rc;
- GetClientRect(hWnd, &rc);
-
- PAINTSTRUCT paint;
- HDC hdc = (message == WM_PAINT) ? BeginPaint(hWnd, &paint) : (HDC)wParam;
-
- TCHAR buf[255];
- if (bSearchState == 1 && FilterLoadProgress < 100 && FilterLoadProgress > 0)
- mir_sntprintf(buf, TranslateT("Loading... %d%%"), FilterLoadProgress);
- else
- mir_sntprintf(buf, TranslateT("Search"));
-
- bool bDrawnByTheme = false;
-
- int oldMode = SetBkMode(hdc, TRANSPARENT);
-
- HTHEME hTheme = OpenThemeData(hWnd, L"EDIT");
- if (hTheme) {
- if (IsThemeBackgroundPartiallyTransparent(hTheme, EP_EDITTEXT, ETS_NORMAL))
- DrawThemeParentBackground(hWnd, hdc, &rc);
-
- RECT rc2;
- GetThemeBackgroundContentRect(hTheme, hdc, EP_EDITTEXT, ETS_NORMAL, &rc, &rc2);
- rc2.top = 2 * rc.top - rc2.top;
- rc2.left = 2 * rc.left - rc2.left;
- rc2.bottom = 2 * rc.bottom - rc2.bottom;
- rc2.right = 2 * rc.right - rc2.right;
-
- DrawThemeBackground(hTheme, hdc, EP_EDITTEXT, ETS_NORMAL, &rc2, &rc);
- HFONT hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0);
- HFONT oldFont = (HFONT)SelectObject(hdc, hFont);
-
- wchar_t *bufW = mir_t2u(buf);
- DrawThemeText(hTheme, hdc, EP_EDITTEXT, ETS_DISABLED, bufW, -1, 0, 0, &rc);
- mir_free(bufW);
-
- SelectObject(hdc, oldFont);
- CloseThemeData(hTheme);
- bDrawnByTheme = true;
- }
-
- SetBkMode(hdc, oldMode);
-
- if (!bDrawnByTheme) {
- HFONT hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0);
- HFONT oldFont = (HFONT)SelectObject(hdc, hFont);
- SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT));
- FillRect(hdc, &rc, GetSysColorBrush(COLOR_WINDOW));
- int oldMode = SetBkMode(hdc, TRANSPARENT);
- DrawText(hdc, buf, -1, &rc, 0);
- SetBkMode(hdc, oldMode);
- SelectObject(hdc, oldFont);
- }
-
- if (message == WM_PAINT)
- EndPaint(hWnd, &paint);
-
- return 0;
-}
-
-static bool CheckPageShow(HWND hdlg, OptionsDlgData *dat, int i)
-{
- OptionsPageData *opd = dat->arOpd[i];
- if (dat->szFilterString[0] && !MatchesFilter(opd, dat->szFilterString))
- return false;
- return true;
-}
-
-static BOOL IsAeroMode()
-{
- BOOL result;
- return dwmIsCompositionEnabled && (dwmIsCompositionEnabled(&result) == S_OK) && result;
-}
-
-static void FreeOptionsData(OptionsPageInit* popi)
-{
- for (int i = 0; i < popi->pageCount; i++) {
- mir_free((char*)popi->odp[i].pszTitle);
- mir_free(popi->odp[i].pszGroup);
- mir_free(popi->odp[i].pszTab);
- if ((DWORD_PTR)popi->odp[i].pszTemplate & 0xFFFF0000)
- mir_free((char*)popi->odp[i].pszTemplate);
- }
- mir_free(popi->odp);
-}
-
-static LRESULT CALLBACK AeroPaintSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
-
-static void AeroPaintControl(HWND hwnd, HDC hdc, UINT msg, LPARAM lpFlags)
-{
- RECT rc;
- GetClientRect(hwnd, &rc);
-
- HDC tempDC = CreateCompatibleDC(hdc);
-
- BITMAPINFO bmi;
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = rc.right;
- bmi.bmiHeader.biHeight = -rc.bottom;
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biBitCount = 32;
- bmi.bmiHeader.biCompression = BI_RGB;
-
- BYTE *pBits;
- HBITMAP hBmp = CreateDIBSection(tempDC, &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);
- HBITMAP hOldBmp = (HBITMAP)SelectObject(tempDC, hBmp);
-
- // paint
- SetPropA(hwnd, "Miranda.AeroRender.Active", (HANDLE)TRUE);
- mir_callNextSubclass(hwnd, AeroPaintSubclassProc, msg, (WPARAM)tempDC, lpFlags);
- SetPropA(hwnd, "Miranda.AeroRender.Active", (HANDLE)FALSE);
-
- // Fix alpha channel
- GdiFlush();
- for (int i = 0; i < rc.right*rc.bottom; i++, pBits += 4)
- if (!pBits[3])
- pBits[3] = 255;
-
- // Copy to output
- BitBlt(hdc, 0, 0, rc.right, rc.bottom, tempDC, 0, 0, SRCCOPY);
- SelectObject(tempDC, hOldBmp);
- DeleteObject(hBmp);
- DeleteDC(tempDC);
-}
-
-static LRESULT CALLBACK AeroPaintSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- switch (msg) {
- case WM_CTLCOLOREDIT:
- if (!GetPropA((HWND)lParam, "Miranda.AeroRender.Active"))
- RedrawWindow((HWND)lParam, NULL, NULL, RDW_INVALIDATE);
- break;
-
- case WM_ERASEBKGND:
- return TRUE;
-
- case WM_PRINT:
- case WM_PRINTCLIENT:
- AeroPaintControl(hwnd, (HDC)wParam, msg, lParam);
- return TRUE;
-
- case WM_DESTROY:
- RemovePropA(hwnd, "Miranda.AeroRender.Active");
- break;
-
- case WM_PAINT:
- PAINTSTRUCT ps;
- HDC hdc = BeginPaint(hwnd, &ps);
- AeroPaintControl(hwnd, hdc, WM_PRINT, PRF_CLIENT | PRF_NONCLIENT);
- EndPaint(hwnd, &ps);
- return TRUE;
- }
- return mir_callNextSubclass(hwnd, AeroPaintSubclassProc, msg, wParam, lParam);
-}
-
-static void CALLBACK FilterSearchTimerFunc(HWND hwnd, UINT, UINT_PTR, DWORD)
-{
- OptionsDlgData *dat = (OptionsDlgData*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
- if (!dat)
- return;
-
- if (hFilterSearchWnd == NULL)
- hFilterSearchWnd = CreateWindowA("STATIC", "Test", WS_OVERLAPPED | WS_DISABLED, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, GetModuleHandle(NULL), 0); // Fake window to keep option page focused
-
- if (FilterPage < dat->arOpd.getCount())
- FindFilterStrings(TRUE, dat->currentPage == FilterPage, hFilterSearchWnd, dat->arOpd[FilterPage]);
-
- FilterPage++;
- FilterLoadProgress = FilterPage * 100 / ((dat->arOpd.getCount()) ? dat->arOpd.getCount() : FilterPage);
- if (FilterPage >= dat->arOpd.getCount()) {
- KillTimer(hwnd, FilterTimerId);
- FilterTimerId = 0;
- bSearchState = 2;
- FilterLoadProgress = 100;
- DestroyWindow(hFilterSearchWnd);
- hFilterSearchWnd = NULL;
- }
- RedrawWindow(GetDlgItem(hwnd, IDC_KEYWORD_FILTER), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE);
-}
-
-static void ExecuteFindFilterStringsTimer(HWND hdlg)
-{
- bSearchState = 1;
- FilterPage = 0;
- if (FilterTimerId) KillTimer(hdlg, FilterTimerId);
- FilterTimerId = SetTimer(hdlg, NULL, 1, FilterSearchTimerFunc);
-}
-
-static void FillFilterCombo(HWND hDlg, OptionsDlgData* dat)
-{
- HINSTANCE *KnownInstances = (HINSTANCE*)alloca(sizeof(HINSTANCE)*dat->arOpd.getCount());
- int countKnownInst = 0;
- SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT)CB_RESETCONTENT, 0, 0);
- int index = SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT)CB_ADDSTRING, 0, (LPARAM)TranslateT(ALL_MODULES_FILTER));
- SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT)CB_SETITEMDATA, (WPARAM)index, 0);
- index = SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT)CB_ADDSTRING, 0, (LPARAM)TranslateT(CORE_MODULES_FILTER));
- SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT)CB_SETITEMDATA, (WPARAM)index, (LPARAM)hInst);
-
- for (int i = 0; i < dat->arOpd.getCount(); i++) {
- OptionsPageData *opd = dat->arOpd[i];
- FindFilterStrings(FALSE, FALSE, hDlg, opd); // only modules name (fast enougth)
-
- HINSTANCE inst = opd->getInst();
- if (inst == hInst)
- continue;
-
- int j;
- for (j = 0; j < countKnownInst; j++)
- if (KnownInstances[j] == inst)
- break;
- if (j != countKnownInst)
- continue;
-
- KnownInstances[countKnownInst] = inst;
- countKnownInst++;
-
- TCHAR tszModuleName[MAX_PATH];
- GetModuleFileName(inst, tszModuleName, SIZEOF(tszModuleName));
-
- TCHAR *dllName = mir_a2t(GetPluginNameByInstance(inst));
- if (!dllName) dllName = mir_tstrdup(_tcsrchr(tszModuleName, _T('\\')));
- if (!dllName) dllName = mir_tstrdup(tszModuleName);
- if (dllName) {
- index = SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT)CB_ADDSTRING, 0, (LPARAM)dllName);
- SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT)CB_SETITEMDATA, (WPARAM)index, (LPARAM)inst);
- mir_free(dllName);
- }
- }
-
- FilterLoadProgress = 100;
-}
-
-static void RebuildPageTree(HWND hdlg, OptionsDlgData *dat)
-{
- LPARAM oldSel = SendDlgItemMessage(hdlg, IDC_KEYWORD_FILTER, CB_GETEDITSEL, 0, 0);
- GetDlgItemText(hdlg, IDC_KEYWORD_FILTER, dat->szFilterString, SIZEOF(dat->szFilterString));
-
- // if filter string is set to all modules then make the filter string empty (this will return all modules)
- BOOL bRemoveFocusFromFilter = FALSE;
- if (mir_tstrcmp(dat->szFilterString, TranslateT(ALL_MODULES_FILTER)) == 0) {
- dat->szFilterString[0] = 0;
- bRemoveFocusFromFilter = TRUE;
- }
- // if filter string is set to core modules replace it with the name of the executable (this will return all core modules)
- else if (mir_tstrcmp(dat->szFilterString, TranslateT(CORE_MODULES_FILTER)) == 0) {
- // replace string with process name - that will show core settings
- TCHAR szFileName[300];
- GetModuleFileName(NULL, szFileName, SIZEOF(szFileName));
- TCHAR *pos = _tcsrchr(szFileName, _T('\\'));
- if (pos)
- pos++;
- else
- pos = szFileName;
-
- _tcsncpy_s(dat->szFilterString, pos, _TRUNCATE);
- }
- else {
- int sel = SendDlgItemMessage(hdlg, IDC_KEYWORD_FILTER, (UINT)CB_GETCURSEL, 0, 0);
- if (sel != -1) {
- HINSTANCE hinst = (HINSTANCE)SendDlgItemMessage(hdlg, IDC_KEYWORD_FILTER, (UINT)CB_GETITEMDATA, sel, 0);
- TCHAR szFileName[300];
- GetModuleFileName(hinst, szFileName, SIZEOF(szFileName));
- TCHAR *pos = _tcsrchr(szFileName, _T('\\'));
- if (pos) pos++;
- else pos = szFileName;
- _tcsncpy_s(dat->szFilterString, pos, _TRUNCATE);
- }
- }
-
- _tcslwr_locale(dat->szFilterString); //all strings are stored as lowercase ... make sure filter string is lowercase too
-
- HWND hwndTree = GetDlgItem(hdlg, IDC_PAGETREE);
- SendMessage(hwndTree, WM_SETREDRAW, FALSE, 0);
-
- HWND oldWnd = NULL;
- HWND oldTab = NULL;
- CMString fullTitle;
-
- OptionsPageData *opd = dat->getCurrent();
- if (opd != NULL) {
- oldWnd = opd->getHwnd();
- if (opd->insideTab)
- oldTab = GetDlgItem(hdlg, IDC_TAB);
- }
-
- dat->hCurrentPage = NULL;
-
- TreeView_SelectItem(hwndTree, NULL);
- TreeView_DeleteAllItems(hwndTree);
-
- TVINSERTSTRUCT tvis;
- tvis.hParent = NULL;
- tvis.hInsertAfter = TVI_SORT;
- tvis.item.mask = TVIF_TEXT | TVIF_STATE | TVIF_PARAM;
- tvis.item.state = tvis.item.stateMask = TVIS_EXPANDED;
- for (int i = 0; i < dat->arOpd.getCount(); i++) {
- if (!CheckPageShow(hdlg, dat, i))
- continue;
-
- opd = dat->arOpd[i];
- TCHAR *ptszGroup = TranslateTH(opd->hLangpack, opd->ptszGroup);
- TCHAR *ptszTitle = opd->getString(opd->ptszTitle), *useTitle;
- TCHAR *ptszTab = TranslateTH(opd->hLangpack, opd->ptszTab);
-
- tvis.hParent = NULL;
- useTitle = ptszTitle;
-
- if (ptszGroup != NULL) {
- tvis.hParent = FindNamedTreeItemAtRoot(hwndTree, ptszGroup);
- if (tvis.hParent == NULL) {
- tvis.item.lParam = -1;
- tvis.item.pszText = ptszGroup;
- tvis.hParent = TreeView_InsertItem(hwndTree, &tvis);
- }
- }
- else {
- TVITEM tvi;
- tvi.hItem = FindNamedTreeItemAtRoot(hwndTree, useTitle);
- if (tvi.hItem != NULL) {
- if (i == dat->currentPage) dat->hCurrentPage = tvi.hItem;
- tvi.mask = TVIF_PARAM;
- TreeView_GetItem(hwndTree, &tvi);
- if (tvi.lParam == -1) {
- tvi.lParam = i;
- TreeView_SetItem(hwndTree, &tvi);
- continue;
- }
- }
- }
-
- if (ptszTab != NULL) {
- HTREEITEM hItem;
- if (tvis.hParent == NULL)
- hItem = FindNamedTreeItemAtRoot(hwndTree, useTitle);
- else
- hItem = FindNamedTreeItemAtChildren(hwndTree, tvis.hParent, useTitle);
- if (hItem != NULL) {
- if (i == dat->currentPage) {
- TVITEM tvi;
- tvi.hItem = hItem;
- tvi.mask = TVIF_PARAM;
- tvi.lParam = dat->currentPage;
- TreeView_SetItem(hwndTree, &tvi);
- dat->hCurrentPage = hItem;
- }
- continue;
- }
- }
-
- tvis.item.pszText = useTitle;
- tvis.item.lParam = i;
- opd->hTreeItem = TreeView_InsertItem(hwndTree, &tvis);
- if (i == dat->currentPage)
- dat->hCurrentPage = opd->hTreeItem;
- }
-
- char str[128];
- TVITEMA tvi;
- tvi.mask = TVIF_TEXT | TVIF_STATE;
- tvi.pszText = str;
- tvi.cchTextMax = SIZEOF(str);
- tvi.hItem = TreeView_GetRoot(hwndTree);
- while (tvi.hItem != NULL) {
- if (SendMessageA(hwndTree, TVM_GETITEMA, 0, (LPARAM)&tvi)) {
- char buf[130];
- mir_snprintf(buf, "%s%s", OPTSTATE_PREFIX, str);
- if (!db_get_b(NULL, "Options", buf, 1))
- TreeView_Expand(hwndTree, tvi.hItem, TVE_COLLAPSE);
- }
- tvi.hItem = TreeView_GetNextSibling(hwndTree, tvi.hItem);
- }
-
- if (dat->hCurrentPage == NULL) {
- dat->hCurrentPage = TreeView_GetRoot(hwndTree);
- dat->currentPage = -1;
- }
- TreeView_SelectItem(hwndTree, dat->hCurrentPage);
-
- if (oldWnd) {
- opd = dat->getCurrent();
- if (opd && oldWnd != opd->getHwnd()) {
- ShowWindow(oldWnd, SW_HIDE);
- if (oldTab && (opd == NULL || !opd->insideTab))
- ShowWindow(oldTab, SW_HIDE);
- }
- }
-
- if (dat->szFilterString[0] == 0) // Clear the keyword combo box
- SetDlgItemText(hdlg, IDC_KEYWORD_FILTER, _T(""));
- if (!bRemoveFocusFromFilter)
- SetFocus(GetDlgItem(hdlg, IDC_KEYWORD_FILTER)); //set the focus back to the combo box
-
- SendDlgItemMessage(hdlg, IDC_KEYWORD_FILTER, CB_SETEDITSEL, 0, oldSel); //but don't select any of the text
-
- SendMessage(hwndTree, WM_SETREDRAW, TRUE, 0);
- TreeView_EnsureVisible(hwndTree, dat->hCurrentPage);
-}
-
-static BOOL IsInsideTab(HWND hdlg, OptionsDlgData *dat, int i)
-{
- OptionsPageData *opd = dat->arOpd[i];
- int pages = 0;
- if (opd->ptszTab != NULL) {
- // Count tabs to calc position
- for (int j = 0; j < dat->arOpd.getCount() && pages < 2; j++) {
- OptionsPageData* opd2 = dat->arOpd[j];
- if (!CheckPageShow(hdlg, dat, j)) continue;
- if (mir_tstrcmp(opd2->ptszTitle, opd->ptszTitle) || mir_tstrcmp(opd2->ptszGroup, opd->ptszGroup))
- continue;
- pages++;
- }
- }
- return (pages > 1);
-}
-
-static void LoadOptionsModule(HWND hdlg, OptionsDlgData *dat, HINSTANCE hInst)
-{
- OptionsPageInit opi = { 0 };
- CallPluginEventHook(hInst, hOptionsInitEvent, (WPARAM)&opi, 0);
- if (opi.pageCount == 0)
- return;
-
- for (int i = 0; i < opi.pageCount; i++) {
- OptionsPageData *opd = new OptionsPageData(&opi.odp[i]);
- if (opd->pDialog == NULL) // smth went wrong
- delete opd;
- else
- dat->arOpd.insert(opd);
- }
-
- FreeOptionsData(&opi);
- PostMessage(hdlg, DM_REBUILDPAGETREE, 0, 0);
-}
-
-static void UnloadOptionsModule(HWND hdlg, OptionsDlgData *dat, HINSTANCE hInst)
-{
- bool bToRebuildTree = false;
-
- for (int i = dat->arOpd.getCount() - 1; i >= 0; i--) {
- OptionsPageData *opd = dat->arOpd[i];
- if (opd->getInst() != hInst)
- continue;
-
- if (dat->currentPage > i)
- dat->currentPage--;
-
- dat->arOpd.remove(i);
- delete opd;
- bToRebuildTree = true;
- }
-
- if (bToRebuildTree)
- PostMessage(hdlg, DM_REBUILDPAGETREE, 0, 0);
-}
-
-static INT_PTR CALLBACK OptionsDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
- OptionsPageData *opd;
- OptionsDlgData *dat = (OptionsDlgData*)GetWindowLongPtr(hdlg, GWLP_USERDATA);
- HWND hwndTree = GetDlgItem(hdlg, IDC_PAGETREE);
-
- switch (message) {
- case WM_CTLCOLORSTATIC:
- switch (GetDlgCtrlID((HWND)lParam)) {
- case IDC_WHITERECT:
- case IDC_KEYWORD_FILTER:
- SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
- return (INT_PTR)GetSysColorBrush(COLOR_WINDOW);
- }
- break;
-
- case WM_INITDIALOG:
- TranslateDialogDefault(hdlg);
-
- if (!ServiceExists(MS_MODERNOPT_SHOW))
- ShowWindow(GetDlgItem(hdlg, IDC_MODERN), FALSE);
-
- dat = new OptionsDlgData;
- SetWindowLongPtr(hdlg, GWLP_USERDATA, (LONG_PTR)dat);
-
- Utils_RestoreWindowPositionNoSize(hdlg, NULL, "Options", "");
- Window_SetIcon_IcoLib(hdlg, SKINICON_OTHER_OPTIONS);
- EnableWindow(GetDlgItem(hdlg, IDC_APPLY), FALSE);
- {
- COMBOBOXINFO cbi;
- cbi.cbSize = sizeof(COMBOBOXINFO);
- GetComboBoxInfo(GetDlgItem(hdlg, IDC_KEYWORD_FILTER), &cbi);
- mir_subclassWindow(cbi.hwndItem, OptionsFilterSubclassProc);
-
- if (IsAeroMode()) {
- mir_subclassWindow(cbi.hwndCombo, AeroPaintSubclassProc);
- mir_subclassWindow(cbi.hwndItem, AeroPaintSubclassProc);
- }
-
- PROPSHEETHEADER *psh = (PROPSHEETHEADER*)lParam;
- SetWindowText(hdlg, psh->pszCaption);
-
- LOGFONT lf;
- dat->hBoldFont = (HFONT)SendDlgItemMessage(hdlg, IDC_APPLY, WM_GETFONT, 0, 0);
- GetObject(dat->hBoldFont, sizeof(lf), &lf);
- lf.lfWeight = FW_BOLD;
- dat->hBoldFont = CreateFontIndirect(&lf);
-
- dat->hPluginLoad = HookEventMessage(ME_SYSTEM_MODULELOAD, hdlg, HM_MODULELOAD);
- dat->hPluginUnload = HookEventMessage(ME_SYSTEM_MODULEUNLOAD, hdlg, HM_MODULEUNLOAD);
- dat->currentPage = -1;
-
- ptrT lastPage, lastGroup, lastTab;
- OPENOPTIONSDIALOG *ood = (OPENOPTIONSDIALOG*)psh->pStartPage;
- if (ood->pszPage == NULL) {
- lastPage = db_get_tsa(NULL, "Options", "LastPage");
-
- if (ood->pszGroup == NULL)
- lastGroup = db_get_tsa(NULL, "Options", "LastGroup");
- else
- lastGroup = mir_a2t(ood->pszGroup);
- }
- else {
- lastPage = mir_a2t(ood->pszPage);
- lastGroup = mir_a2t(ood->pszGroup);
- }
-
- if (ood->pszTab == NULL)
- lastTab = db_get_tsa(NULL, "Options", "LastTab");
- else
- lastTab = mir_a2t(ood->pszTab);
-
- OPTIONSDIALOGPAGE *odp = (OPTIONSDIALOGPAGE*)psh->ppsp;
- for (UINT i = 0; i < psh->nPages; i++, odp++) {
- OptionsPageData *opd = new OptionsPageData(odp);
- if (opd->pDialog == NULL) // smth went wrong
- delete opd;
- else
- dat->arOpd.insert(opd);
-
- if (!mir_tstrcmp(lastPage, odp->ptszTitle) && !mir_tstrcmp(lastGroup, odp->ptszGroup))
- if ((ood->pszTab == NULL && dat->currentPage == -1) || !mir_tstrcmp(lastTab, odp->ptszTab))
- dat->currentPage = (int)i;
- }
-
- GetWindowRect(GetDlgItem(hdlg, IDC_STNOPAGE), &dat->rcDisplay);
- MapWindowPoints(NULL, hdlg, (LPPOINT)&dat->rcDisplay, 2);
-
- // Add an item to count in height
- TCITEM tie;
- tie.mask = TCIF_TEXT | TCIF_IMAGE;
- tie.iImage = -1;
- tie.pszText = _T("X");
- TabCtrl_InsertItem(GetDlgItem(hdlg, IDC_TAB), 0, &tie);
-
- GetWindowRect(GetDlgItem(hdlg, IDC_TAB), &dat->rcTab);
- MapWindowPoints(NULL, hdlg, (LPPOINT)&dat->rcTab, 2);
- TabCtrl_AdjustRect(GetDlgItem(hdlg, IDC_TAB), FALSE, &dat->rcTab);
-
- FillFilterCombo(hdlg, dat);
- PostMessage(hdlg, DM_REBUILDPAGETREE, 0, 0);
- }
- return TRUE;
-
- case DM_REBUILDPAGETREE:
- RebuildPageTree(hdlg, dat);
- break;
-
- case HM_MODULELOAD:
- LoadOptionsModule(hdlg, dat, (HINSTANCE)lParam);
- break;
-
- case HM_MODULEUNLOAD:
- UnloadOptionsModule(hdlg, dat, (HINSTANCE)lParam);
- break;
-
- case PSM_CHANGED:
- EnableWindow(GetDlgItem(hdlg, IDC_APPLY), TRUE);
-
- opd = dat->getCurrent();
- if (opd)
- opd->changed = 1;
-
- return TRUE;
-
- case PSM_GETBOLDFONT:
- SetWindowLongPtr(hdlg, DWLP_MSGRESULT, (LONG_PTR)dat->hBoldFont);
- return TRUE;
-
- case WM_NOTIFY:
- switch (wParam) {
- case IDC_TAB:
- case IDC_PAGETREE:
- switch (((LPNMHDR)lParam)->code) {
- case TVN_ITEMEXPANDING:
- SetWindowLongPtr(hdlg, DWLP_MSGRESULT, FALSE);
- return TRUE;
-
- case TCN_SELCHANGING:
- case TVN_SELCHANGING:
- opd = dat->getCurrent();
- if (opd && opd->getHwnd() != NULL) {
- PSHNOTIFY pshn;
- pshn.hdr.code = PSN_KILLACTIVE;
- pshn.hdr.hwndFrom = dat->arOpd[dat->currentPage]->getHwnd();
- pshn.hdr.idFrom = 0;
- pshn.lParam = 0;
- if (SendMessage(dat->arOpd[dat->currentPage]->getHwnd(), WM_NOTIFY, 0, (LPARAM)&pshn)) {
- SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);
- return TRUE;
- }
- }
- break;
-
- case TCN_SELCHANGE:
- case TVN_SELCHANGED:
- ShowWindow(GetDlgItem(hdlg, IDC_STNOPAGE), SW_HIDE);
-
- opd = dat->getCurrent();
- if (opd && opd->getHwnd() != NULL)
- ShowWindow(opd->getHwnd(), SW_HIDE);
-
- if (wParam != IDC_TAB) {
- TVITEM tvi;
- tvi.hItem = dat->hCurrentPage = TreeView_GetSelection(hwndTree);
- if (tvi.hItem == NULL) {
- ShowWindow(GetDlgItem(hdlg, IDC_TAB), SW_HIDE);
- break;
- }
-
- tvi.mask = TVIF_HANDLE | TVIF_PARAM;
- TreeView_GetItem(hwndTree, &tvi);
- dat->currentPage = tvi.lParam;
- ShowWindow(GetDlgItem(hdlg, IDC_TAB), SW_HIDE);
- }
- else {
- TCITEM tie;
- tie.mask = TCIF_PARAM;
- TabCtrl_GetItem(GetDlgItem(hdlg, IDC_TAB), TabCtrl_GetCurSel(GetDlgItem(hdlg, IDC_TAB)), &tie);
- dat->currentPage = tie.lParam;
-
- TVITEM tvi;
- tvi.hItem = dat->hCurrentPage;
- tvi.mask = TVIF_PARAM;
- tvi.lParam = dat->currentPage;
- TreeView_SetItem(hwndTree, &tvi);
- }
-
- opd = dat->getCurrent();
- if (opd == NULL) {
- ShowWindow(GetDlgItem(hdlg, IDC_STNOPAGE), SW_SHOW);
- break;
- }
- if (opd->getHwnd() == NULL) {
- CreateOptionWindow(opd, hdlg);
- if (opd->flags & ODPF_BOLDGROUPS)
- EnumChildWindows(opd->getHwnd(), BoldGroupTitlesEnumChildren, (LPARAM)dat->hBoldFont);
-
- RECT rcPage;
- GetClientRect(opd->getHwnd(), &rcPage);
- int w = opd->width = rcPage.right;
- int h = opd->height = rcPage.bottom;
-
- RECT rc;
- GetWindowRect(opd->getHwnd(), &rc);
-
- opd->insideTab = IsInsideTab(hdlg, dat, dat->currentPage);
- if (opd->insideTab) {
- SetWindowPos(opd->getHwnd(), HWND_TOP, (dat->rcTab.left + dat->rcTab.right - w) >> 1, dat->rcTab.top, w, h, 0);
- ThemeDialogBackground(opd->getHwnd(), TRUE);
- }
- else {
- SetWindowPos(opd->getHwnd(), HWND_TOP, (dat->rcDisplay.left + dat->rcDisplay.right - w) >> 1, (dat->rcDisplay.top + dat->rcDisplay.bottom - h) >> 1, w, h, 0);
- ThemeDialogBackground(opd->getHwnd(), FALSE);
- }
- }
-
- if (wParam != IDC_TAB) {
- opd->insideTab = IsInsideTab(hdlg, dat, dat->currentPage);
- if (opd->insideTab) {
- // Make tabbed pane
- int pages = 0, sel = 0;
- HWND hwndTab = GetDlgItem(hdlg, IDC_TAB);
- TabCtrl_DeleteAllItems(hwndTab);
-
- TCITEM tie;
- tie.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;
- tie.iImage = -1;
- for (int i = 0; i < dat->arOpd.getCount(); i++) {
- if (!CheckPageShow(hdlg, dat, i))
- continue;
-
- OptionsPageData *p = dat->arOpd[i];
- if (mir_tstrcmp(opd->ptszTitle, p->ptszTitle) || mir_tstrcmp(opd->ptszGroup, p->ptszGroup))
- continue;
-
- tie.pszText = TranslateTH(p->hLangpack, p->ptszTab);
- tie.lParam = i;
- TabCtrl_InsertItem(hwndTab, pages, &tie);
- if (!mir_tstrcmp(opd->ptszTab, p->ptszTab))
- sel = pages;
- pages++;
- }
- TabCtrl_SetCurSel(hwndTab, sel);
- ShowWindow(hwndTab, opd->insideTab ? SW_SHOW : SW_HIDE);
- }
-
- ThemeDialogBackground(opd->getHwnd(), opd->insideTab);
- }
-
- ShowWindow(opd->getHwnd(), SW_SHOW);
- if (((LPNMTREEVIEW)lParam)->action == TVC_BYMOUSE)
- PostMessage(hdlg, DM_FOCUSPAGE, 0, 0);
- else
- SetFocus(hwndTree);
- }
- }
- break;
-
- case DM_FOCUSPAGE:
- if (dat->currentPage != -1)
- SetFocus(dat->arOpd[dat->currentPage]->getHwnd());
- break;
-
- case WM_TIMER:
- if (wParam == FILTER_TIMEOUT_TIMER) {
- SaveOptionsTreeState(hdlg);
- SendMessage(hdlg, DM_REBUILDPAGETREE, 0, 0);
-
- KillTimer(hdlg, FILTER_TIMEOUT_TIMER);
- }
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDC_KEYWORD_FILTER:
- // add a timer - when the timer elapses filter the option pages
- if ((HIWORD(wParam) == CBN_SELCHANGE) || (HIWORD(wParam) == CBN_EDITCHANGE))
- if (!SetTimer(hdlg, FILTER_TIMEOUT_TIMER, 400, NULL))
- MessageBeep(MB_ICONSTOP);
- break;
-
- case IDC_MODERN:
- db_set_b(NULL, "Options", "Expert", 0);
- SaveOptionsTreeState(hdlg);
- PostMessage(hdlg, WM_CLOSE, 0, 0);
- CallService(MS_MODERNOPT_SHOW, 0, 0);
- break;
-
- case IDCANCEL:
- {
- PSHNOTIFY pshn;
- pshn.hdr.idFrom = 0;
- pshn.lParam = 0;
- pshn.hdr.code = PSN_RESET;
- for (int i = 0; i < dat->arOpd.getCount(); i++) {
- OptionsPageData *p = dat->arOpd[i];
- if (p->getHwnd() == NULL || !p->changed)
- continue;
- pshn.hdr.hwndFrom = p->getHwnd();
- SendMessage(p->getHwnd(), WM_NOTIFY, 0, (LPARAM)&pshn);
- }
- DestroyWindow(hdlg);
- }
- break;
-
- case IDOK:
- case IDC_APPLY:
- if (LOWORD(wParam) == IDOK && GetParent(GetFocus()) == GetDlgItem(hdlg, IDC_KEYWORD_FILTER))
- return TRUE;
-
- PSHNOTIFY pshn;
- EnableWindow(GetDlgItem(hdlg, IDC_APPLY), FALSE);
- SetFocus(hwndTree);
-
- opd = dat->getCurrent();
- if (opd != NULL) {
- pshn.hdr.idFrom = 0;
- pshn.lParam = LOWORD(wParam);
- pshn.hdr.code = PSN_KILLACTIVE;
- pshn.hdr.hwndFrom = opd->getHwnd();
- if (SendMessage(opd->getHwnd(), WM_NOTIFY, 0, (LPARAM)&pshn))
- break;
- }
-
- pshn.hdr.code = PSN_APPLY;
- for (int i = 0; i < dat->arOpd.getCount(); i++) {
- OptionsPageData *p = dat->arOpd[i];
- if (p->getHwnd() == NULL || !p->changed) continue;
- p->changed = 0;
- pshn.hdr.hwndFrom = p->getHwnd();
- if (SendMessage(p->getHwnd(), WM_NOTIFY, 0, (LPARAM)&pshn) == PSNRET_INVALID_NOCHANGEPAGE) {
- dat->hCurrentPage = p->hTreeItem;
- TreeView_SelectItem(hwndTree, dat->hCurrentPage);
- if (opd)
- opd->pDialog->Show(SW_HIDE);
- dat->currentPage = i;
- if (opd)
- opd->pDialog->Show();
- return 0;
- }
- }
-
- if (LOWORD(wParam) == IDOK)
- DestroyWindow(hdlg);
- }
- break;
-
- case WM_DESTROY:
- if (FilterTimerId)
- KillTimer(hdlg, FilterTimerId);
- DestroyWindow(hFilterSearchWnd);
- ClearFilterStrings();
- dat->szFilterString[0] = 0;
-
- UnhookEvent(dat->hPluginLoad);
- UnhookEvent(dat->hPluginUnload);
-
- SaveOptionsTreeState(hdlg);
- Window_FreeIcon_IcoLib(hdlg);
-
- opd = dat->getCurrent();
- if (opd) {
- if (opd->ptszTab)
- db_set_ts(NULL, "Options", "LastTab", opd->ptszTab);
- else
- db_unset(NULL, "Options", "LastTab");
- if (opd->ptszGroup)
- db_set_ts(NULL, "Options", "LastGroup", opd->ptszGroup);
- else
- db_unset(NULL, "Options", "LastGroup");
- db_set_ts(NULL, "Options", "LastPage", opd->ptszTitle);
- }
- else {
- db_unset(NULL, "Options", "LastTab");
- db_unset(NULL, "Options", "LastGroup");
- db_unset(NULL, "Options", "LastPage");
- }
-
- Utils_SaveWindowPosition(hdlg, NULL, "Options", "");
-
- for (int i = 0; i < dat->arOpd.getCount(); i++)
- delete dat->arOpd[i];
-
- DeleteObject(dat->hBoldFont);
- delete dat;
- hwndOptions = NULL;
-
- CallService(MS_MODERNOPT_RESTORE, 0, 0);
- break;
- }
- return FALSE;
-}
-
-void OpenAccountOptions(PROTOACCOUNT *pa)
-{
- if (pa->ppro == NULL)
- return;
-
- OptionsPageInit opi = { 0 };
- pa->ppro->OnEvent(EV_PROTO_ONOPTIONS, (WPARAM)&opi, 0);
- if (opi.pageCount == 0)
- return;
-
- TCHAR tszTitle[100];
- mir_sntprintf(tszTitle, SIZEOF(tszTitle), TranslateT("%s options"), pa->tszAccountName);
-
- OPENOPTIONSDIALOG ood = { sizeof(ood) };
- ood.pszGroup = LPGEN("Network");
- ood.pszPage = mir_t2a(pa->tszAccountName);
-
- PROPSHEETHEADER psh = { sizeof(psh) };
- psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
- psh.hwndParent = NULL;
- psh.nPages = opi.pageCount;
- psh.pStartPage = (LPCTSTR)&ood;
- psh.pszCaption = tszTitle;
- psh.ppsp = (PROPSHEETPAGE*)opi.odp;
- hwndOptions = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_OPTIONSPAGE), NULL, OptionsDlgProc, (LPARAM)&psh);
- mir_free((void*)ood.pszPage);
- FreeOptionsData(&opi);
-}
-
-static void OpenOptionsNow(int hLangpack, const char *pszGroup, const char *pszPage, const char *pszTab, bool bSinglePage = false)
-{
- if (IsWindow(hwndOptions)) {
- ShowWindow(hwndOptions, SW_RESTORE);
- SetForegroundWindow(hwndOptions);
- if (pszPage != NULL) {
- ptrT ptszPage(mir_a2t(pszPage));
- HTREEITEM hItem = NULL;
- if (pszGroup != NULL) {
- ptrT ptszGroup(mir_a2t(pszGroup));
- hItem = FindNamedTreeItemAtRoot(GetDlgItem(hwndOptions, IDC_PAGETREE), TranslateTH(hLangpack, ptszGroup));
- if (hItem != NULL)
- hItem = FindNamedTreeItemAtChildren(GetDlgItem(hwndOptions, IDC_PAGETREE), hItem, TranslateTH(hLangpack, ptszPage));
- }
- else hItem = FindNamedTreeItemAtRoot(GetDlgItem(hwndOptions, IDC_PAGETREE), TranslateTH(hLangpack, ptszPage));
-
- if (hItem != NULL)
- TreeView_SelectItem(GetDlgItem(hwndOptions, IDC_PAGETREE), hItem);
- }
- }
- else {
- OptionsPageInit opi = { 0 };
- NotifyEventHooks(hOptionsInitEvent, (WPARAM)&opi, 0);
- if (opi.pageCount == 0)
- return;
-
- OPENOPTIONSDIALOG ood = { 0 };
- ood.cbSize = sizeof(ood);
- ood.pszGroup = pszGroup;
- ood.pszPage = pszPage;
- ood.pszTab = pszTab;
-
- PROPSHEETHEADER psh = { 0 };
- psh.dwSize = sizeof(psh);
- psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
- psh.nPages = opi.pageCount;
- psh.pStartPage = (LPCTSTR)&ood; // more structure misuse
- psh.pszCaption = TranslateT("Miranda NG options");
- psh.ppsp = (PROPSHEETPAGE*)opi.odp; // blatent misuse of the structure, but what the hell
-
- hwndOptions = CreateDialogParam(hInst,
- MAKEINTRESOURCE(bSinglePage ? IDD_OPTIONSPAGE : IDD_OPTIONS),
- NULL, OptionsDlgProc, (LPARAM)&psh);
-
- FreeOptionsData(&opi);
- }
-}
-
-static INT_PTR OpenOptions(WPARAM wParam, LPARAM lParam)
-{
- OPENOPTIONSDIALOG *ood = (OPENOPTIONSDIALOG*)lParam;
- if (ood == NULL || ood->cbSize != sizeof(OPENOPTIONSDIALOG))
- return 1;
-
- OpenOptionsNow((int)wParam, ood->pszGroup, ood->pszPage, ood->pszTab);
- return 0;
-}
-
-static INT_PTR OpenOptionsPage(WPARAM wParam, LPARAM lParam)
-{
- OPENOPTIONSDIALOG *ood = (OPENOPTIONSDIALOG*)lParam;
- if (ood == NULL || ood->cbSize != sizeof(OPENOPTIONSDIALOG))
- return 1;
-
- OpenOptionsNow((int)wParam, ood->pszGroup, ood->pszPage, ood->pszTab, true);
- return (INT_PTR)hwndOptions;
-}
-
-static INT_PTR OpenOptionsDialog(WPARAM, LPARAM)
-{
- if (hwndOptions || !ServiceExists(MS_MODERNOPT_SHOW))
- OpenOptionsNow(NULL, NULL, NULL, NULL);
- else
- CallService(MS_MODERNOPT_SHOW, 0, 0);
- return 0;
-}
-
-static INT_PTR AddOptionsPage(WPARAM wParam, LPARAM lParam)
-{
- OPTIONSDIALOGPAGE *odp = (OPTIONSDIALOGPAGE*)lParam, *dst;
- OptionsPageInit *opi = (OptionsPageInit*)wParam;
- if (odp == NULL || opi == NULL)
- return 1;
-
- opi->odp = (OPTIONSDIALOGPAGE*)mir_realloc(opi->odp, sizeof(OPTIONSDIALOGPAGE)*(opi->pageCount + 1));
- dst = opi->odp + opi->pageCount;
- memcpy(dst, odp, sizeof(OPTIONSDIALOGPAGE));
-
- if (odp->ptszTitle != NULL) {
- if (odp->flags & ODPF_UNICODE)
- dst->ptszTitle = mir_wstrdup(odp->ptszTitle);
- else {
- dst->ptszTitle = mir_a2u(odp->pszTitle);
- dst->flags |= ODPF_UNICODE;
- }
- }
-
- if (odp->ptszGroup != NULL) {
- if (odp->flags & ODPF_UNICODE)
- dst->ptszGroup = mir_wstrdup(odp->ptszGroup);
- else {
- dst->ptszGroup = mir_a2t(odp->pszGroup);
- dst->flags |= ODPF_UNICODE;
- }
- }
-
- if (odp->ptszTab != NULL) {
- if (odp->flags & ODPF_UNICODE)
- dst->ptszTab = mir_wstrdup(odp->ptszTab);
- else {
- dst->ptszTab = mir_a2t(odp->pszTab);
- dst->flags |= ODPF_UNICODE;
- }
- }
-
- if ((DWORD_PTR)odp->pszTemplate & 0xFFFF0000)
- dst->pszTemplate = mir_strdup(odp->pszTemplate);
-
- opi->pageCount++;
- return 0;
-}
-
-static int OptModulesLoaded(WPARAM, LPARAM)
-{
- CLISTMENUITEM mi = { sizeof(mi) };
- mi.icolibItem = GetSkinIconHandle(SKINICON_OTHER_OPTIONS);
- mi.position = 1900000000;
- mi.pszName = LPGEN("&Options...");
- mi.pszService = "Options/OptionsCommand";
- Menu_AddMainMenuItem(&mi);
- return 0;
-}
-
-int ShutdownOptionsModule(WPARAM, LPARAM)
-{
- if (IsWindow(hwndOptions)) {
- DestroyWindow(hwndOptions);
- hwndOptions = NULL;
- }
- return 0;
-}
-
-int LoadOptionsModule(void)
-{
- hwndOptions = NULL;
- hOptionsInitEvent = CreateHookableEvent(ME_OPT_INITIALISE);
- HookEvent(ME_OPT_INITIALISE, LangpackOptionsInit);
-
- CreateServiceFunction("Opt/AddPage", AddOptionsPage);
- CreateServiceFunction("Opt/OpenOptions", OpenOptions);
- CreateServiceFunction("Opt/OpenOptionsPage", OpenOptionsPage);
- CreateServiceFunction("Options/OptionsCommand", OpenOptionsDialog);
- HookEvent(ME_SYSTEM_MODULESLOADED, OptModulesLoaded);
- HookEvent(ME_SYSTEM_PRESHUTDOWN, ShutdownOptionsModule);
- return 0;
-}