winamp/Src/Plugins/Library/ml_online/Setup/setupDetailsGroup.cpp
2024-09-24 14:54:57 +02:00

284 lines
7.6 KiB
C++

#include "./setupDetails.h"
#include "../common.h"
#include "../resource.h"
#include "../api__ml_online.h"
#include "../../winamp/commandLink.h"
#include "./setupGroup.h"
#include <commctrl.h>
#include <strsafe.h>
#ifndef IDC_HELPLINK
#define IDC_HELPLINK 10000
#endif
struct GROUPDETAILSCREATEPARAM
{
GROUPDETAILSCREATEPARAM() : group(NULL), name(NULL) {}
SetupGroup *group;
LPCWSTR name;
};
struct GROUPDETAILS
{
GROUPDETAILS() : group(NULL), name(NULL), fontTitle(NULL) {}
SetupGroup *group;
LPWSTR name;
HFONT fontTitle;
};
#define GetDetails(__hwnd) ((GROUPDETAILS*)GetPropW((__hwnd), MAKEINTATOM(DETAILS_PROP)))
static INT_PTR WINAPI GroupDetails_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HWND SetupDetails_CreateGroupView(HWND hParent, LPCWSTR pszName, SetupGroup *group)
{
GROUPDETAILSCREATEPARAM param;
param.group = group;
param.name = pszName;
return WASABI_API_CREATEDIALOGPARAMW(IDD_SETUP_GROUPDETAILS, hParent, GroupDetails_DialogProc, (LPARAM)&param);
}
static void GroupDetails_SetTitle(HWND hwnd, SetupGroup *group)
{
HWND hTitle = GetDlgItem(hwnd, IDC_TITLE);
if (NULL == hTitle) return;
WCHAR szBuffer[128] = {0};
if (NULL == group ||
FAILED(group->GetLongName(szBuffer, ARRAYSIZE(szBuffer))))
{
szBuffer[0] = L'\0';
}
GROUPDETAILS *details = GetDetails(hwnd);
if (NULL != details && NULL == details->fontTitle)
{
HFONT dialogFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0L);
LOGFONT lf;
if (0 != GetObject(dialogFont, sizeof(LOGFONT), &lf))
{
StringCchCopy(lf.lfFaceName, ARRAYSIZE(lf.lfFaceName), L"Arial Bold");
lf.lfWidth = 0;
lf.lfWeight = FW_DONTCARE;
lf.lfHeight += (lf.lfHeight < 0) ? -2 : +2;
lf.lfQuality = 5/*ANTIALIASED_QUALITY*/;
details->fontTitle = CreateFontIndirect(&lf);
}
if (NULL != details->fontTitle)
{
SendMessage(hTitle, WM_SETFONT, (WPARAM)details->fontTitle, 0L);
}
}
SetWindowText(hTitle, szBuffer);
InvalidateRect(hTitle, NULL, TRUE);
}
static void GroupDetails_SetDescription(HWND hwnd, SetupGroup *group)
{
HWND hDescription = GetDlgItem(hwnd, IDC_DESCRIPTION);
if (NULL == hDescription) return;
WCHAR szBuffer[4096] = {0};
if (NULL == group ||
FAILED(group->GetDescription(szBuffer, ARRAYSIZE(szBuffer))))
{
szBuffer[0] = L'\0';
}
SetupDetails_SetDescription(hDescription, szBuffer);
}
static BOOL GroupDetails_ShowHelp(HWND hwnd)
{
INT result = (INT)(INT_PTR)ShellExecuteW(hwnd, L"open",
L"https://help.winamp.com/hc/articles/8112753225364-Online-Services-Security",
NULL, NULL, SW_SHOWNORMAL);
return (result > 32);
}
static void GroupDetails_UpdateLayout(HWND hwnd, BOOL fRedraw)
{
RECT clientRect, rect;
if(FALSE == GetClientRect(hwnd, &clientRect))
return;
UINT commonFlags = SWP_NOACTIVATE | SWP_NOZORDER;
if (FALSE != fRedraw) commonFlags |= SWP_NOREDRAW;
LONG bottomLine = clientRect.bottom;
HWND hControl;
SIZE linkSize;
RECT linkMargins;
if (NULL != (hControl = GetDlgItem(hwnd, IDC_HELPLINK)) &&
CommandLink_GetIdealSize(hControl, &linkSize))
{
if (!CommandLink_GetMargins(hControl, &linkMargins))
SetRectEmpty(&linkMargins);
if (linkSize.cy > 0)
bottomLine -= linkSize.cy;
SetWindowPos(hControl, NULL, clientRect.left + 4, bottomLine, linkSize.cx, linkSize.cy, commonFlags);
}
else
{
ZeroMemory(&linkSize, sizeof(linkSize));
SetRectEmpty(&linkMargins);
}
if (NULL != (hControl = GetDlgItem(hwnd, IDC_HELPTEXT)))
{
LONG x = clientRect.left + 4 + linkSize.cx/* - linkMargins.right*/;
LONG y = 0;
HDC hdc = GetDCEx(hControl, NULL, DCX_CACHE | DCX_WINDOW | DCX_NORESETATTRS);
if (NULL != hdc)
{
HFONT font = (HFONT)SendMessage(hControl, WM_GETFONT, 0, 0L);
HFONT originalFont = (HFONT)SelectObject(hdc, font);
TEXTMETRICW tm;
if (GetTextMetricsW(hdc, &tm))
y = tm.tmHeight;
SelectObject(hdc, originalFont);
ReleaseDC(hControl, hdc);
}
SetWindowPos(hControl, NULL, x, clientRect.bottom - linkMargins.bottom - y, clientRect.right - x, y, commonFlags);
}
if (NULL != (hControl = GetDlgItem(hwnd, IDC_DESCRIPTION)) &&
FALSE != GetWindowRect(hControl, &rect))
{
MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rect, 2);
SetWindowPos(hControl, NULL, rect.left, rect.right, rect.right - rect.left, bottomLine - rect.top,
commonFlags | SWP_NOMOVE);
}
}
static INT_PTR GroupDetails_OnInitDialog(HWND hwnd, HWND hFocus, LPARAM lParam)
{
GROUPDETAILSCREATEPARAM *param = (GROUPDETAILSCREATEPARAM*)lParam;
GROUPDETAILS *details = (GROUPDETAILS*)calloc(1, sizeof(GROUPDETAILS));
if (NULL == details) return FALSE;
if (!SetProp(hwnd, MAKEINTATOM(DETAILS_PROP), details))
return FALSE;
if (NULL != param)
{
if (NULL != param->group)
{
details->group = param->group;
details->group->AddRef();
}
details->name = Plugin_CopyString(param->name);
}
HINSTANCE winampInstance = (NULL != WASABI_API_APP) ? WASABI_API_APP->main_gethInstance() : NULL;
if (NULL != winampInstance)
{
WCHAR szBuffer[256] = {0};
WASABI_API_LNGSTRINGW_BUF(IDS_CLICKHERE, szBuffer, ARRAYSIZE(szBuffer));
HWND hLink = CreateWindowExW(WS_EX_NOPARENTNOTIFY | WS_EX_TRANSPARENT, NWC_COMMANDLINKW, szBuffer,
WS_VISIBLE | WS_CHILD | WS_TABSTOP | CLS_ALWAYSUNDERLINE | CLS_DEFAULTCOLORS /* | CLS_HOTTRACK */,
0, 0, 0, 0, hwnd, (HMENU)IDC_HELPLINK, winampInstance, NULL);
if (NULL != hLink)
{
SendMessageW(hLink, WM_SETFONT, (WPARAM)SendMessageW(hwnd, WM_GETFONT, 0, 0L), 0L);
}
}
GroupDetails_UpdateLayout(hwnd, FALSE);
if (NULL != param)
{
GroupDetails_SetTitle(hwnd, param->group);
GroupDetails_SetDescription(hwnd, param->group);
}
return FALSE;
}
static void GroupDetails_OnDestroy(HWND hwnd)
{
GROUPDETAILS *details = GetDetails(hwnd);
RemoveProp(hwnd, MAKEINTATOM(DETAILS_PROP));
if (NULL != details)
{
if (NULL != details->group)
details->group->Release();
if (NULL != details->fontTitle)
DeleteObject(details->fontTitle);
Plugin_FreeString(details->name);
}
}
static INT_PTR GroupDetails_OnDialogColor(HWND hwnd, HDC hdc, HWND hControl)
{
HWND hParent = GetAncestor(hwnd, GA_PARENT);
if (NULL != hParent && hParent != hwnd)
return (INT_PTR)SendMessage(hParent, WM_CTLCOLORDLG, (WPARAM)hdc, (LPARAM)hControl);
return 0;
}
static INT_PTR GroupDetails_OnStaticColor(HWND hwnd, HDC hdc, HWND hControl)
{
HWND hParent = GetAncestor(hwnd, GA_PARENT);
if (NULL != hParent && hParent != hwnd)
return (INT_PTR)SendMessage(hParent, WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hControl);
return 0;
}
static LRESULT GroupDetails_OnNotify(HWND hwnd, INT controlId, NMHDR *pnmh)
{
switch(controlId)
{
case IDC_HELPLINK:
if (NM_CLICK == pnmh->code)
GroupDetails_ShowHelp(hwnd);
return TRUE;
}
return 0;
}
static BOOL GroupDetails_OnGetUniqueName(HWND hwnd, LPWSTR pszBuffer, UINT cchBufferMax)
{
if (NULL == pszBuffer)
return FALSE;
GROUPDETAILS *details = GetDetails(hwnd);
return SUCCEEDED(StringCchCopy(pszBuffer, cchBufferMax,
(NULL != details && NULL != details->name) ? details->name : L""));
}
static INT_PTR WINAPI GroupDetails_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG: return GroupDetails_OnInitDialog(hwnd, (HWND)wParam, lParam);
case WM_DESTROY: GroupDetails_OnDestroy(hwnd); break;
case WM_CTLCOLORDLG: return GroupDetails_OnDialogColor(hwnd, (HDC)wParam, (HWND)lParam);
case WM_CTLCOLORSTATIC: return GroupDetails_OnStaticColor(hwnd, (HDC)wParam, (HWND)lParam);
case WM_NOTIFY: MSGRESULT(hwnd, GroupDetails_OnNotify(hwnd, (INT)wParam, (NMHDR*)lParam));
case NSDM_GETUNIQUENAME: MSGRESULT(hwnd, GroupDetails_OnGetUniqueName(hwnd, (LPWSTR)lParam, (UINT)wParam));
}
return 0;
}