winamp/Src/Plugins/General/gen_ml/prefs.cpp
2024-09-24 14:54:57 +02:00

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, &centerRect))
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);
}