mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
787 lines
24 KiB
C++
787 lines
24 KiB
C++
|
#include "main.h"
|
||
|
#include "config.h"
|
||
|
#include "api__gen_ml.h"
|
||
|
#include "resource.h"
|
||
|
#include "./navigation.h"
|
||
|
#include "./ml_ipc_0313.h"
|
||
|
|
||
|
#include <shlwapi.h>
|
||
|
#include <strsafe.h>
|
||
|
|
||
|
extern HNAVCTRL hNavigation;
|
||
|
|
||
|
#define PASSWORD_MAXLEN 256
|
||
|
|
||
|
void encode_mimestr(char *in, char *out)
|
||
|
{
|
||
|
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||
|
int shift = 0;
|
||
|
int accum = 0;
|
||
|
|
||
|
while (in && *in)
|
||
|
{
|
||
|
if (*in)
|
||
|
{
|
||
|
accum <<= 8;
|
||
|
shift += 8;
|
||
|
accum |= *in++;
|
||
|
}
|
||
|
while (shift >= 6)
|
||
|
{
|
||
|
shift -= 6;
|
||
|
*out++ = alphabet[(accum >> shift) & 0x3F];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (shift == 4)
|
||
|
{
|
||
|
*out++ = alphabet[(accum & 0xF) << 2];
|
||
|
*out++ = '=';
|
||
|
}
|
||
|
|
||
|
else if (shift == 2)
|
||
|
{
|
||
|
*out++ = alphabet[(accum & 0x3) << 4];
|
||
|
*out++ = '=';
|
||
|
*out++ = '=';
|
||
|
}
|
||
|
*out++ = 0;
|
||
|
}
|
||
|
|
||
|
int ResizeComboBoxDropDown(HWND hwndDlg, UINT id, const wchar_t * str, int width){
|
||
|
SIZE size = {0};
|
||
|
HWND control = GetDlgItem(hwndDlg, id);
|
||
|
HDC hdc = GetDC(control);
|
||
|
// get and select parent dialog's font so that it'll calculate things correctly
|
||
|
HFONT font = (HFONT)SendMessage(hwndDlg,WM_GETFONT,0,0), oldfont = (HFONT)SelectObject(hdc,font);
|
||
|
GetTextExtentPoint32W(hdc, str, lstrlenW(str)+1, &size);
|
||
|
|
||
|
int ret = width;
|
||
|
if(size.cx > width)
|
||
|
{
|
||
|
SendDlgItemMessage(hwndDlg, id, CB_SETDROPPEDWIDTH, size.cx, 0);
|
||
|
ret = size.cx;
|
||
|
}
|
||
|
|
||
|
SelectObject(hdc, oldfont);
|
||
|
ReleaseDC(control, hdc);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static void CenterPopup(HWND hwnd, HWND hCenter)
|
||
|
{
|
||
|
if (NULL == hwnd || NULL == hCenter)
|
||
|
return;
|
||
|
|
||
|
RECT centerRect, windowRect;
|
||
|
if (!GetWindowRect(hwnd, &windowRect) || !GetWindowRect(hCenter, ¢erRect))
|
||
|
return;
|
||
|
windowRect.left = centerRect.left + ((centerRect.right - centerRect.left) - (windowRect.right - windowRect.left))/2;
|
||
|
windowRect.top = centerRect.top + ((centerRect.bottom - centerRect.top) - (windowRect.bottom - windowRect.top))/2;
|
||
|
|
||
|
SetWindowPos(hwnd, NULL, windowRect.left, windowRect.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
|
||
|
}
|
||
|
|
||
|
static INT MessageBoxWA(HWND hwnd, LPCWSTR pszText, LPCWSTR pszCaption, UINT uType)
|
||
|
{
|
||
|
WCHAR szText[128] = {0}, szCaption[2048] = {0};
|
||
|
if (IS_INTRESOURCE(pszText))
|
||
|
{
|
||
|
if (NULL != pszText)
|
||
|
{
|
||
|
WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)pszText, szText, ARRAYSIZE(szText));
|
||
|
pszText = szText;
|
||
|
}
|
||
|
}
|
||
|
if (IS_INTRESOURCE(pszCaption))
|
||
|
{
|
||
|
if (NULL != pszCaption)
|
||
|
{
|
||
|
WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)pszCaption, szCaption, ARRAYSIZE(szCaption));
|
||
|
pszCaption = szCaption;
|
||
|
}
|
||
|
}
|
||
|
return MessageBoxW(hwnd, pszText, pszCaption, uType);
|
||
|
}
|
||
|
|
||
|
static INT_PTR CALLBACK Prefs1Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
CheckDlgButton(hwndDlg, IDC_PLPLAYLIST, !!g_config->ReadInt(L"plplaymode", 1));
|
||
|
CheckDlgButton(hwndDlg, IDC_VIEWPLAYMODE, !!g_config->ReadInt(L"viewplaymode", 1));
|
||
|
|
||
|
wchar_t* str = WASABI_API_LNGSTRINGW(IDS_PLAY_SELECTED);
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)str);
|
||
|
int width = ResizeComboBoxDropDown(hwndDlg, IDC_COMBO1, str, 0);
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)(str = WASABI_API_LNGSTRINGW(IDS_ENQUEUE_SELECTED)));
|
||
|
ResizeComboBoxDropDown(hwndDlg, IDC_COMBO1, str, width);
|
||
|
SendDlgItemMessage(hwndDlg, IDC_COMBO1, CB_SETCURSEL, g_config->ReadInt(L"enqueuedef", 0) ? 1 : 0, 0);
|
||
|
CheckDlgButton(hwndDlg, IDC_CHECK1, !!g_config->ReadInt(L"attachlbolt", 0));
|
||
|
CheckDlgButton(hwndDlg, IDC_PL_SEND_TO, !!g_config->ReadInt(L"pl_send_to", 1));
|
||
|
CheckDlgButton(hwndDlg, IDC_PMP_SEND_TO, !!g_config->ReadInt(L"pmp_send_to", 1));
|
||
|
if (!GetModuleHandleW(L"ml_pmp.dll")) EnableWindow(GetDlgItem(hwndDlg, IDC_PMP_SEND_TO), FALSE);
|
||
|
CheckDlgButton(hwndDlg, IDC_WRITE_RATINGS, !!g_config->ReadInt(L"writeratings", 0));
|
||
|
CheckDlgButton(hwndDlg, IDC_GROUP_BUTTONS, !!g_config->ReadInt(L"groupbtn", 1));
|
||
|
|
||
|
int colresmode = g_config->ReadInt(L"column_resize_mode", 0);
|
||
|
width = 0;
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_COMBO2, CB_ADDSTRING, 0, (LPARAM)(str = WASABI_API_LNGSTRINGW(IDS_COL_NORMAL)));
|
||
|
width = ResizeComboBoxDropDown(hwndDlg, IDC_COMBO2, str, width);
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_COMBO2, CB_ADDSTRING, 0, (LPARAM)(str = WASABI_API_LNGSTRINGW(IDS_COL_SELONLY)));
|
||
|
ResizeComboBoxDropDown(hwndDlg, IDC_COMBO2, str, width);
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_COMBO2, CB_ADDSTRING, 0, (LPARAM)(str = WASABI_API_LNGSTRINGW(IDS_COL_PROP)));
|
||
|
ResizeComboBoxDropDown(hwndDlg, IDC_COMBO2, str, 0);
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_COMBO2, CB_SETCURSEL, colresmode, 0);
|
||
|
}
|
||
|
break;
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_COMBO1:
|
||
|
if (HIWORD(wParam) == CBN_SELCHANGE)
|
||
|
{
|
||
|
int a = (INT)SendDlgItemMessage(hwndDlg, IDC_COMBO1, CB_GETCURSEL, 0, 0),
|
||
|
mode = g_config->ReadInt(L"enqueuedef", 0);
|
||
|
if ((a == 1) != mode)
|
||
|
{
|
||
|
mode = (a == 1);
|
||
|
g_config->WriteInt(L"enqueuedef", mode);
|
||
|
HWND hView = (HWND)SENDMLIPC(g_hwnd, ML_IPC_GETCURRENTVIEW, 0);
|
||
|
if (IsWindow(hView)) PostMessageW(hView, WM_DISPLAYCHANGE, 0, 0);
|
||
|
}
|
||
|
|
||
|
// v5.66+ - send a general notification so plug-ins can (if needed update on
|
||
|
// the play / enqueue mode change (mainly added for ml_playlists)
|
||
|
pluginMessage p = {ML_MSG_VIEW_PLAY_ENQUEUE_CHANGE, (INT_PTR)!!mode,
|
||
|
(INT_PTR)!!g_config->ReadInt(L"groupbtn", 1), 0};
|
||
|
SENDMLIPC(g_hwnd, ML_IPC_SEND_PLUGIN_MESSAGE, (WPARAM)&p);
|
||
|
}
|
||
|
break;
|
||
|
case IDC_PL_SEND_TO:
|
||
|
g_config->WriteInt(L"pl_send_to", !!IsDlgButtonChecked(hwndDlg, IDC_PL_SEND_TO));
|
||
|
break;
|
||
|
case IDC_PMP_SEND_TO:
|
||
|
g_config->WriteInt(L"pmp_send_to", !!IsDlgButtonChecked(hwndDlg, IDC_PMP_SEND_TO));
|
||
|
break;
|
||
|
case IDC_WRITE_RATINGS:
|
||
|
g_config->WriteInt(L"writeratings", !!IsDlgButtonChecked(hwndDlg, IDC_WRITE_RATINGS));
|
||
|
break;
|
||
|
case IDC_PLPLAYLIST:
|
||
|
g_config->WriteInt(L"plplaymode", !!IsDlgButtonChecked(hwndDlg, IDC_PLPLAYLIST));
|
||
|
break;
|
||
|
case IDC_VIEWPLAYMODE:
|
||
|
g_config->WriteInt(L"viewplaymode", !!IsDlgButtonChecked(hwndDlg, IDC_VIEWPLAYMODE));
|
||
|
break;
|
||
|
case IDC_COMBO2:
|
||
|
if (HIWORD(wParam) == CBN_SELCHANGE)
|
||
|
{
|
||
|
int colresmode = (INT)SendDlgItemMessage(hwndDlg, IDC_COMBO2, CB_GETCURSEL, 0, 0);
|
||
|
g_config->WriteInt(L"column_resize_mode", colresmode);
|
||
|
}
|
||
|
break;
|
||
|
case IDC_CHECK1:
|
||
|
g_config->WriteInt(L"attachlbolt", !!IsDlgButtonChecked(hwndDlg, IDC_CHECK1));
|
||
|
break;
|
||
|
case IDC_GROUP_BUTTONS:
|
||
|
{
|
||
|
g_config->WriteInt(L"groupbtn", !!IsDlgButtonChecked(hwndDlg, IDC_GROUP_BUTTONS));
|
||
|
// refresh the current view as otherwise is a pain to dynamically update as needed
|
||
|
PostMessage(g_hwnd, WM_USER + 30, 0, 0);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static INT_PTR CALLBACK GetTVPassProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
PostMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwndDlg, IDC_GPASS), TRUE);
|
||
|
}
|
||
|
break;
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDOK:
|
||
|
{
|
||
|
char pass1[64] = {0};
|
||
|
char password[4096] = {0};
|
||
|
GetDlgItemTextA(hwndDlg, IDC_GPASS, pass1, sizeof(pass1) - 1);
|
||
|
encode_mimestr(pass1, password);
|
||
|
if (strcmp(password, g_config->ReadString("stctka", "none")) != 0)
|
||
|
{
|
||
|
wchar_t titleStr[32] = {0};
|
||
|
MessageBoxW(NULL,
|
||
|
WASABI_API_LNGSTRINGW(IDS_INVALID_PASSWORD),
|
||
|
WASABI_API_LNGSTRINGW_BUF(IDS_INTERNET_ACCESS,titleStr,32),
|
||
|
MB_OK);
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EndDialog(hwndDlg, 1);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
case IDCANCEL:
|
||
|
{
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static INT_PTR InternetPassword_OnInitDialog(HWND hwnd, HWND hFocus, LPARAM lParam)
|
||
|
{
|
||
|
HWND hControl = GetDlgItem(hwnd, IDC_EDIT_PASSWORD);
|
||
|
if (NULL != hControl)
|
||
|
PostMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)hControl, TRUE);
|
||
|
|
||
|
hControl = GetDlgItem(hwnd, IDOK);
|
||
|
if (NULL != hControl)
|
||
|
EnableWindow(hControl, FALSE);
|
||
|
|
||
|
HWND hCenter = (HWND)lParam;
|
||
|
if (NULL != hCenter && IsWindow(hCenter))
|
||
|
CenterPopup(hwnd, hCenter);
|
||
|
|
||
|
SendMessage(hwnd, DM_REPOSITION, 0, 0L);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
static BOOL InternetPassword_GetPassword(HWND hwnd, LPWSTR pszBuffer, INT cchBufferMax)
|
||
|
{
|
||
|
|
||
|
HWND hEdit1 = GetDlgItem(hwnd, IDC_EDIT_PASSWORD);
|
||
|
HWND hEdit2 = GetDlgItem(hwnd, IDC_EDIT_PASSWORD_VERIFY);
|
||
|
if (NULL != hEdit1 && NULL != hEdit2)
|
||
|
{
|
||
|
WCHAR szPwd1[PASSWORD_MAXLEN] = {0}, szPwd2[PASSWORD_MAXLEN] = {0};
|
||
|
|
||
|
INT cchPwd1 = GetWindowTextW(hEdit1, szPwd1, ARRAYSIZE(szPwd1));
|
||
|
INT cchPwd2 = GetWindowTextW(hEdit2, szPwd2, ARRAYSIZE(szPwd2));
|
||
|
|
||
|
if (0 != cchPwd1 &&
|
||
|
cchPwd1 == cchPwd2 &&
|
||
|
CSTR_EQUAL == CompareStringW(LOCALE_USER_DEFAULT, 0, szPwd1, cchPwd1, szPwd2, cchPwd2))
|
||
|
{
|
||
|
if (NULL != pszBuffer && cchBufferMax > 0)
|
||
|
{
|
||
|
if (FAILED(StringCchCopyW(pszBuffer, cchBufferMax, szPwd1)))
|
||
|
return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
static void InternetPassword_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND hControl)
|
||
|
{
|
||
|
switch (commandId)
|
||
|
{
|
||
|
case IDC_EDIT_PASSWORD:
|
||
|
case IDC_EDIT_PASSWORD_VERIFY:
|
||
|
switch(eventId)
|
||
|
{
|
||
|
case EN_UPDATE:
|
||
|
|
||
|
HWND hButton = GetDlgItem(hwnd, IDOK);
|
||
|
if (NULL != hButton)
|
||
|
{
|
||
|
EnableWindow(hButton, InternetPassword_GetPassword(hwnd, NULL, 0));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case IDOK:
|
||
|
{
|
||
|
WCHAR szPassword[PASSWORD_MAXLEN] = {0};
|
||
|
BOOL passwordOk = InternetPassword_GetPassword(hwnd, szPassword, ARRAYSIZE(szPassword));
|
||
|
|
||
|
if (FALSE == passwordOk)
|
||
|
{
|
||
|
MessageBoxWA(hwnd, MAKEINTRESOURCEW(IDS_PASSWORD_NO_MATCH), MAKEINTRESOURCEW(IDS_INTERNET_ACCESS),
|
||
|
MB_OK | MB_ICONEXCLAMATION);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
char szPasswordAnsi[PASSWORD_MAXLEN * 2] = {0};
|
||
|
BOOL fInvalidChar;
|
||
|
if (0 == WideCharToMultiByte(CP_ACP, 0, szPassword, -1, szPasswordAnsi, ARRAYSIZE(szPasswordAnsi), NULL, &fInvalidChar) ||
|
||
|
FALSE != fInvalidChar)
|
||
|
{
|
||
|
// TODO: put better error description
|
||
|
LPCWSTR pszMessage = MAKEINTRESOURCEW(IDS_INVALID_PASSWORD);
|
||
|
MessageBoxWA(hwnd, pszMessage, MAKEINTRESOURCEW(IDS_INTERNET_ACCESS), MB_OK | MB_ICONERROR);
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
char szEncoded[PASSWORD_MAXLEN * 2] = {0};
|
||
|
encode_mimestr(szPasswordAnsi, szEncoded);
|
||
|
g_config->WriteString("stctka", szEncoded);
|
||
|
EndDialog(hwnd, IDOK);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hwnd, IDCANCEL);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static INT_PTR CALLBACK InternetPassword_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG: return InternetPassword_OnInitDialog(hwnd, (HWND)wParam, lParam);
|
||
|
case WM_COMMAND: InternetPassword_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static INT_PTR CALLBACK Prefs2Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
int passprompt = g_config->ReadInt(L"tvpp", 0);
|
||
|
if (passprompt && strcmp("none", g_config->ReadString("stctka", "none")) == 0)
|
||
|
{
|
||
|
wchar_t titleStr[32] = {0};
|
||
|
MessageBoxW(hwndDlg,
|
||
|
WASABI_API_LNGSTRINGW(IDS_RATINGS_PASSWORD_MISSING),
|
||
|
WASABI_API_LNGSTRINGW_BUF(IDS_SERCURITY_ALERT,titleStr,32),
|
||
|
MB_OK);
|
||
|
passprompt = 0;
|
||
|
}
|
||
|
|
||
|
CheckDlgButton(hwndDlg, IDC_CHECK_PASSPROMPT, passprompt);
|
||
|
EnableWindow(GetDlgItem(hwndDlg, IDC_ITV_CHANGEPASS), passprompt);
|
||
|
|
||
|
{
|
||
|
int rating = g_config->ReadInt(L"tvrating", 7);
|
||
|
CheckDlgButton(hwndDlg, IDC_CHECK_RATING0, !!(rating&1) || !!(rating&2));
|
||
|
CheckDlgButton(hwndDlg, IDC_CHECK_RATING1, !!(rating&4));
|
||
|
CheckDlgButton(hwndDlg, IDC_CHECK_RATING2, !!(rating&8));
|
||
|
CheckDlgButton(hwndDlg, IDC_CHECK_RATING3, !!(rating&16) || !!(rating&32));
|
||
|
CheckDlgButton(hwndDlg, IDC_CHECK_RATING4, !!(rating&64));
|
||
|
}
|
||
|
|
||
|
if (passprompt && strcmp("none", g_config->ReadString("stctka", "none")) != 0)
|
||
|
{
|
||
|
INT_PTR result = WASABI_API_DIALOGBOX(IDD_PREFS_ITV_GETPASS, hwndDlg, GetTVPassProc);
|
||
|
if (!result)
|
||
|
{
|
||
|
HWND next = GetWindow(hwndDlg,GW_CHILD);
|
||
|
HWND warning = GetDlgItem(hwndDlg,IDC_STATIC_INFO);
|
||
|
while(IsWindow(next))
|
||
|
{
|
||
|
if(next != warning)
|
||
|
{
|
||
|
HWND remove = next;
|
||
|
next = GetWindow(next, GW_HWNDNEXT);
|
||
|
DestroyWindow(remove);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
next = GetWindow(next, GW_HWNDNEXT);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DestroyWindow(GetDlgItem(hwndDlg,IDC_STATIC_INFO));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DestroyWindow(GetDlgItem(hwndDlg,IDC_STATIC_INFO));
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_CHECK_PASSPROMPT:
|
||
|
{
|
||
|
int passprompt = 0;
|
||
|
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_PASSPROMPT)) passprompt = 1;
|
||
|
else g_config->WriteString("stctka", 0);
|
||
|
EnableWindow(GetDlgItem(hwndDlg, IDC_ITV_CHANGEPASS), passprompt);
|
||
|
break;
|
||
|
}
|
||
|
case IDC_ITV_CHANGEPASS:
|
||
|
{
|
||
|
WASABI_API_DIALOGBOXPARAMW(IDD_PREFS_ITV_ASSIGNPASS, hwndDlg, InternetPassword_DialogProc, (LPARAM)hwndDlg);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
{
|
||
|
if(!IsWindow(GetDlgItem(hwndDlg,IDC_STATIC_INFO)))
|
||
|
{
|
||
|
int rating = 0;
|
||
|
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_RATING0)) rating |= (1 | 2);
|
||
|
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_RATING1)) rating |= 4;
|
||
|
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_RATING2)) rating |= 8;
|
||
|
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_RATING3)) rating |= (16 | 32);
|
||
|
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_RATING4)) rating |= 64;
|
||
|
g_config->WriteInt(L"tvrating", rating);
|
||
|
int passprompt = 0;
|
||
|
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_PASSPROMPT)) passprompt = 1;
|
||
|
g_config->WriteInt(L"tvpp", passprompt);
|
||
|
if (passprompt)
|
||
|
{
|
||
|
if (strcmp("none", g_config->ReadString("stctka", "none")) == 0)
|
||
|
{
|
||
|
WASABI_API_DIALOGBOX(IDD_PREFS_ITV_ASSIGNPASS, hwndDlg, InternetPassword_DialogProc);
|
||
|
}
|
||
|
}
|
||
|
#if 0 // no radio
|
||
|
radio_updateTvView(1);
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
C_Config *g_view_metaconf = NULL;
|
||
|
static UINT msgNotify = 0;
|
||
|
static HINSTANCE cloud_hinst;
|
||
|
static int IPC_GET_CLOUD_HINST = -1, last_pos;
|
||
|
static INT_PTR CALLBACK Prefs3Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
static int edit_inited;
|
||
|
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
wchar_t buffer[MAX_PATH] = {0};
|
||
|
edit_inited = 0;
|
||
|
|
||
|
LPCWSTR pszPath = (LPCWSTR)SendMessageW(plugin.hwndParent, WM_WA_IPC, 0, IPC_GETPLUGINDIRECTORYW);
|
||
|
if(PathCombineW(buffer, pszPath, L"ml_disc.dll") && PathFileExistsW(buffer))
|
||
|
{
|
||
|
PathCombineW(buffer, WINAMP_INI_DIR, L"Plugins\\ml\\cdrom.vmd");
|
||
|
g_view_metaconf = new C_Config(buffer);
|
||
|
|
||
|
CheckDlgButton(hwndDlg, IDC_SHOW_EJECT_ICONS, g_view_metaconf->ReadInt(L"showeject", 1));
|
||
|
CheckDlgButton(hwndDlg, IDC_GROUP_DRIVES, g_view_metaconf->ReadInt(L"showparent", 0));
|
||
|
if(!msgNotify) msgNotify = RegisterWindowMessageW(L"ripburn_nav_update");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DestroyWindow(GetDlgItem(hwndDlg,IDC_CD_DVD_ITEMS));
|
||
|
DestroyWindow(GetDlgItem(hwndDlg,IDC_SHOW_EJECT_ICONS));
|
||
|
DestroyWindow(GetDlgItem(hwndDlg,IDC_GROUP_DRIVES));
|
||
|
RECT r;
|
||
|
HWND frame = GetDlgItem(hwndDlg,IDC_ML_TREE_OPTS);
|
||
|
GetWindowRect(frame, &r);
|
||
|
SetWindowPos(frame, 0, 0, 0, (r.right - r.left), (r.bottom - r.top) - 72,
|
||
|
SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE);
|
||
|
}
|
||
|
|
||
|
CheckDlgButton(hwndDlg, IDC_SHOW_ICONS, !!g_config->ReadInt(L"Navigation_ShowIcons", 1));
|
||
|
CheckDlgButton(hwndDlg, IDC_HIGHLIGHT_FULL_TREE_ITEM, !!g_config->ReadInt(L"Navigation_FullRowSel", 1));
|
||
|
CheckDlgButton(hwndDlg, IDC_RCLICK_TO_SELECT, g_config->ReadInt(L"Navigation_MouseDownSel", 0));
|
||
|
SetDlgItemInt(hwndDlg, IDC_ITEM_HEIGHT, g_config->ReadInt(L"Navigation_ItemHeight", 18), 0);
|
||
|
|
||
|
CheckDlgButton(hwndDlg, IDC_PARENT_PODCASTS, g_config->ReadInt(L"podcast_parent", 0));
|
||
|
|
||
|
/*if (IPC_GET_CLOUD_HINST == -1) IPC_GET_CLOUD_HINST = (INT)SendMessage(plugin.hwndParent, WM_WA_IPC, (WPARAM)&"WinampCloud", IPC_REGISTER_WINAMP_IPCMESSAGE);
|
||
|
if (!cloud_hinst) cloud_hinst = (HINSTANCE)SendMessage(plugin.hwndParent, WM_WA_IPC, 0, IPC_GET_CLOUD_HINST);
|
||
|
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_SETITEMDATA, SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_ADDSTRING, 0, (LPARAM)L"as a top level tree item (default)"), 0);
|
||
|
if (cloud_hinst && cloud_hinst != (HINSTANCE)1)
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_SETITEMDATA, SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_ADDSTRING, 0, (LPARAM)L"under the 'Cloud Library' item"), 1);
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_SETITEMDATA, SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_ADDSTRING, 0, (LPARAM)L"under the 'Devices' item"), 2);
|
||
|
|
||
|
last_pos = g_config->ReadInt(L"txviewpos", 0);
|
||
|
int i = 0, count = SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_GETCOUNT, 0, 0);
|
||
|
for (; i < count; i++)
|
||
|
{
|
||
|
int item = SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_GETITEMDATA, i, 0);
|
||
|
if (item == last_pos)
|
||
|
{
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_SETCURSEL, i, 0);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (i == count)
|
||
|
SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_SETCURSEL, 0, 0);*/
|
||
|
|
||
|
edit_inited = 1;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_SHOW_ICONS:
|
||
|
g_config->WriteInt(L"Navigation_ShowIcons", !!IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
|
||
|
NavCtrlI_UpdateLook(hNavigation);
|
||
|
// tell ml_disc to update if present
|
||
|
if(g_view_metaconf)SendMessage(plugin.hwndParent, msgNotify, 0, 0);
|
||
|
break;
|
||
|
|
||
|
case IDC_HIGHLIGHT_FULL_TREE_ITEM:
|
||
|
g_config->WriteInt(L"Navigation_FullRowSel", !!IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
|
||
|
NavCtrlI_UpdateLook(hNavigation);
|
||
|
break;
|
||
|
|
||
|
case IDC_RCLICK_TO_SELECT:
|
||
|
g_config->WriteInt(L"Navigation_MouseDownSel", !!IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
|
||
|
NavCtrlI_UpdateLook(hNavigation);
|
||
|
break;
|
||
|
|
||
|
case IDC_ITEM_HEIGHT:
|
||
|
if(HIWORD(wParam) == EN_CHANGE && edit_inited)
|
||
|
{
|
||
|
BOOL success = 0;
|
||
|
UINT val = GetDlgItemInt(hwndDlg, LOWORD(wParam), &success, 0);
|
||
|
if(success)
|
||
|
{
|
||
|
g_config->WriteInt(L"Navigation_ItemHeight", val);
|
||
|
NavCtrlI_UpdateLook(hNavigation);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_SHOW_EJECT_ICONS:
|
||
|
g_view_metaconf->WriteInt(L"showeject", !!IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
|
||
|
SendMessage(plugin.hwndParent, msgNotify, 0, 0);
|
||
|
NavCtrlI_UpdateLook(hNavigation);
|
||
|
break;
|
||
|
|
||
|
case IDC_GROUP_DRIVES:
|
||
|
g_view_metaconf->WriteInt(L"showparent", !!IsDlgButtonChecked(hwndDlg, LOWORD(wParam)));
|
||
|
SendMessage(plugin.hwndParent, msgNotify, 1, 0);
|
||
|
NavCtrlI_UpdateLook(hNavigation);
|
||
|
break;
|
||
|
|
||
|
case IDC_PARENT_PODCASTS:
|
||
|
{
|
||
|
int parent = !!IsDlgButtonChecked(hwndDlg, LOWORD(wParam));
|
||
|
g_config->WriteInt(L"podcast_parent", parent);
|
||
|
|
||
|
pluginMessage p = {ML_MSG_DOWNLOADS_VIEW_POSITION, (INT_PTR)parent, (INT_PTR)1, 0};
|
||
|
SENDMLIPC(g_hwnd, ML_IPC_SEND_PLUGIN_MESSAGE, (WPARAM)&p);
|
||
|
NavCtrlI_UpdateLook(hNavigation);
|
||
|
break;
|
||
|
}
|
||
|
case IDC_TRANSFERS_COMBO:
|
||
|
if (HIWORD(wParam) == CBN_SELCHANGE)
|
||
|
{
|
||
|
int a = (INT)SendDlgItemMessage(hwndDlg, IDC_TRANSFERS_COMBO, CB_GETCURSEL, 0, 0);
|
||
|
if (a != CB_ERR)
|
||
|
{
|
||
|
g_config->WriteInt(L"txviewpos", SendDlgItemMessageW(hwndDlg, IDC_TRANSFERS_COMBO, CB_GETITEMDATA, a, 0));
|
||
|
wchar_t titleStr[32] = {0};
|
||
|
if ((a != last_pos) &&
|
||
|
MessageBoxW(hwndDlg, WASABI_API_LNGSTRINGW(IDS_RESTART_MESSAGE),
|
||
|
WASABI_API_LNGSTRINGW_BUF(IDS_RESTART, titleStr, 32),
|
||
|
MB_ICONQUESTION | MB_YESNO) == IDYES)
|
||
|
{
|
||
|
WritePrivateProfileStringW(L"winamp", L"show_prefs", L"-1", WINAMP_INI);
|
||
|
PostMessage(plugin.hwndParent, WM_WA_IPC, 0, IPC_RESTARTWINAMP);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
if(g_view_metaconf)
|
||
|
{
|
||
|
delete(g_view_metaconf);
|
||
|
g_view_metaconf = 0;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static INT_PTR CALLBACK Prefs4Proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
CheckDlgButton(hwndDlg, IDC_CHECK_USEPLFONT, !!g_config->ReadInt(L"plfont_everywhere", 1));
|
||
|
CheckDlgButton(hwndDlg, IDC_FF_SCROLLBARS, config_use_ff_scrollbars);
|
||
|
CheckDlgButton(hwndDlg, IDC_ALTERNATEITEMS, config_use_alternate_colors);
|
||
|
CheckDlgButton(hwndDlg, IDC_SKINNED_MENUS, IsSkinnedPopupEnabled(FALSE));
|
||
|
CheckDlgButton(hwndDlg, IDC_GENO, !!GetPrivateProfileIntW(L"winamp", L"geno", 1, WINAMP_INI));
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_CHECK_USEPLFONT:
|
||
|
g_config->WriteInt(L"plfont_everywhere", !!IsDlgButtonChecked(hwndDlg, IDC_CHECK_USEPLFONT));
|
||
|
PostMessage(plugin.hwndParent, WM_DISPLAYCHANGE, 0, 0);
|
||
|
break;
|
||
|
case IDC_FF_SCROLLBARS:
|
||
|
config_use_ff_scrollbars = !!IsDlgButtonChecked(hwndDlg, IDC_FF_SCROLLBARS);
|
||
|
g_config->WriteInt(L"ffsb", config_use_ff_scrollbars);
|
||
|
PostMessage(plugin.hwndParent, WM_DISPLAYCHANGE, 0, 0);
|
||
|
break;
|
||
|
case IDC_ALTERNATEITEMS:
|
||
|
config_use_alternate_colors = !!IsDlgButtonChecked(hwndDlg, IDC_ALTERNATEITEMS);
|
||
|
g_config->WriteInt(L"alternate_items", config_use_alternate_colors);
|
||
|
PostMessage(plugin.hwndParent, WM_DISPLAYCHANGE, 0, 0);
|
||
|
break;
|
||
|
case IDC_SKINNED_MENUS:
|
||
|
EnableSkinnedPopup(BST_CHECKED == IsDlgButtonChecked(hwndDlg, IDC_SKINNED_MENUS));
|
||
|
break;
|
||
|
case IDC_GENO:
|
||
|
{
|
||
|
wchar_t buf[64] = {L"1"};
|
||
|
StringCchPrintfW(buf, 64, L"%d", !!IsDlgButtonChecked(hwndDlg, IDC_GENO));
|
||
|
WritePrivateProfileStringW(L"winamp", L"geno", buf, WINAMP_INI);
|
||
|
break;
|
||
|
}
|
||
|
case IDC_RATING_COLUMN:
|
||
|
SendMessage(g_hwnd,WM_COMMAND,MAKEWPARAM(ID_SHOW_RATINGTWEAK,0),0);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
HWND subWnd = 0, prefsWnd = 0;
|
||
|
|
||
|
static void _dosetsel(HWND hwndDlg)
|
||
|
{
|
||
|
HWND tabwnd = GetDlgItem(hwndDlg, IDC_TAB1);
|
||
|
int sel = TabCtrl_GetCurSel(tabwnd);
|
||
|
|
||
|
if (sel >= 0 && (sel != g_config->ReadInt(L"lastprefp", 0) || !subWnd))
|
||
|
{
|
||
|
g_config->WriteInt(L"lastprefp", sel);
|
||
|
if (subWnd) DestroyWindow(subWnd);
|
||
|
subWnd = 0;
|
||
|
|
||
|
UINT t = 0;
|
||
|
DLGPROC p;
|
||
|
switch (sel)
|
||
|
{
|
||
|
case 0: t = IDD_PREFS1; p = Prefs1Proc; break;
|
||
|
case 1: t = IDD_PREFS2; p = Prefs2Proc; break;
|
||
|
case 2: t = IDD_PREFS3; p = Prefs3Proc; break;
|
||
|
case 3: t = IDD_PREFS4; p = Prefs4Proc; break;
|
||
|
}
|
||
|
if (t) subWnd = WASABI_API_CREATEDIALOGW(t, hwndDlg, p);
|
||
|
|
||
|
if (subWnd)
|
||
|
{
|
||
|
RECT r;
|
||
|
GetClientRect(tabwnd, &r);
|
||
|
TabCtrl_AdjustRect(tabwnd, FALSE, &r);
|
||
|
SetWindowPos(subWnd, HWND_TOP, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOACTIVATE);
|
||
|
ShowWindow(subWnd, SW_SHOWNA);
|
||
|
}
|
||
|
|
||
|
if (!SendMessage(plugin.hwndParent,WM_WA_IPC,IPC_ISWINTHEMEPRESENT,IPC_USE_UXTHEME_FUNC))
|
||
|
{
|
||
|
SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)tabwnd,IPC_USE_UXTHEME_FUNC);
|
||
|
SendMessage(plugin.hwndParent,WM_WA_IPC,(WPARAM)subWnd,IPC_USE_UXTHEME_FUNC);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#define TabCtrl_InsertItemW(hwnd, iItem, pitem) \
|
||
|
(int)SNDMSG((hwnd), TCM_INSERTITEMW, (WPARAM)(int)(iItem), (LPARAM)(const TC_ITEMW *)(pitem))
|
||
|
|
||
|
// frame proc
|
||
|
INT_PTR CALLBACK PrefsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
{
|
||
|
TCITEMW item;
|
||
|
HWND tabwnd = GetDlgItem(hwndDlg, IDC_TAB1);
|
||
|
item.mask = TCIF_TEXT;
|
||
|
item.pszText = WASABI_API_LNGSTRINGW(IDS_LIBRARY_OPTIONS);
|
||
|
TabCtrl_InsertItemW(tabwnd, 0, &item);
|
||
|
item.pszText = WASABI_API_LNGSTRINGW(IDS_ONLINE_MEDIA);
|
||
|
TabCtrl_InsertItemW(tabwnd, 1, &item);
|
||
|
item.pszText = WASABI_API_LNGSTRINGW(IDS_TREE_OPTIONS);
|
||
|
TabCtrl_InsertItemW(tabwnd, 2, &item);
|
||
|
item.pszText = WASABI_API_LNGSTRINGW(IDS_APPEARANCE);
|
||
|
TabCtrl_InsertItemW(tabwnd, 3, &item);
|
||
|
TabCtrl_SetCurSel(tabwnd, g_config->ReadInt(L"lastprefp", 0));
|
||
|
_dosetsel(hwndDlg);
|
||
|
|
||
|
prefsWnd = hwndDlg;
|
||
|
}
|
||
|
return 0;
|
||
|
case WM_NOTIFY:
|
||
|
{
|
||
|
LPNMHDR p = (LPNMHDR) lParam;
|
||
|
if (p->idFrom == IDC_TAB1 && p->code == TCN_SELCHANGE) _dosetsel(hwndDlg);
|
||
|
}
|
||
|
return 0;
|
||
|
case WM_DESTROY:
|
||
|
subWnd = NULL;
|
||
|
prefsWnd = NULL;
|
||
|
return 0;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void refreshPrefs(INT_PTR screen)
|
||
|
{
|
||
|
if (subWnd && g_config->ReadInt(L"lastprefp", -1) == screen)
|
||
|
{
|
||
|
if (screen == 4) SendMessage(subWnd, WM_INITDIALOG, 0, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
extern prefsDlgRecW myPrefsItem;
|
||
|
|
||
|
void openPrefs(INT_PTR screen)
|
||
|
{
|
||
|
if (!subWnd)
|
||
|
{
|
||
|
if (screen != -1) g_config->WriteInt(L"lastprefp", (INT)screen);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (screen != -1)
|
||
|
{
|
||
|
HWND tabwnd = GetDlgItem(prefsWnd, IDC_TAB1);
|
||
|
TabCtrl_SetCurSel(tabwnd, screen);
|
||
|
_dosetsel(prefsWnd);
|
||
|
}
|
||
|
}
|
||
|
SendMessage(plugin.hwndParent, WM_WA_IPC, (WPARAM)&myPrefsItem, IPC_OPENPREFSTOPAGE);
|
||
|
}
|