From cbe3cb21f5bca61a03bbd4ae811ee906e09b3f4f Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sat, 13 Jun 2015 16:55:17 +0000 Subject: - 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 --- src/modules/options/descbutton.cpp | 326 --------- src/modules/options/filter.cpp | 159 ----- src/modules/options/filter.h | 95 --- src/modules/options/headerbar.cpp | 349 ---------- src/modules/options/iconheader.cpp | 534 --------------- src/modules/options/options.cpp | 1327 ------------------------------------ 6 files changed, 2790 deletions(-) delete mode 100644 src/modules/options/descbutton.cpp delete mode 100644 src/modules/options/filter.cpp delete mode 100644 src/modules/options/filter.h delete mode 100644 src/modules/options/headerbar.cpp delete mode 100644 src/modules/options/iconheader.cpp delete mode 100644 src/modules/options/options.cpp (limited to 'src/modules/options') 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 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 -{ - CPageList(); -public: - CPageList( int aincr, FTSortFunc afunc = CPageKeywords::PageSortFunc) : OBJLIST(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 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 &pList, ItemDestuctor pItemDestructor) -{ - for (int i=0; irgbBkgBottom.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; ipList.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("") -#define CORE_MODULES_FILTER LPGEN("") - -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 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; -} -- cgit v1.2.3