windows-nt/Source/XPSP1/NT/multimedia/dshow/mfvideo/msdvdopt/coptdlg.cpp
2020-09-26 16:20:57 +08:00

601 lines
19 KiB
C++

// COptionsDlg.cpp : Declaration of the COptionsDlg class
//
// Copyright (C) 1999 Microsoft Corporation
// All rights reserved.
#include "stdafx.h"
#include "COptDlg.h"
#include "resource.hm"
extern CComModule _Module;
#define RECTWIDTH(lpRect) ((lpRect)->right - (lpRect)->left)
#define RECTHEIGHT(lpRect) ((lpRect)->bottom - (lpRect)->top)
int g_helpIDArraySize = 42;
DWORD g_helpIDArray[][2] = {
{IDOK, HIDOK},
{IDCANCEL, HIDCANCEL},
{IDC_APPLY, HIDAPPLY},
{IDC_AUDIO_LIST, HIDC_AUDIO_LIST},
{IDC_STATIC_AUDIO_LIST, HIDC_AUDIO_LIST},
{IDC_STATIC_CHAN_CONTENT, HIDC_CHECK_CHAN2},
{IDC_CHECK_CHAN2, HIDC_CHECK_CHAN2},
{IDC_CHECK_CHAN3, HIDC_CHECK_CHAN2},
{IDC_CHECK_CHAN4, HIDC_CHECK_CHAN2},
{IDC_BOOKMARK_STOP, HIDC_BOOKMARK_STOP},
{IDC_BOOKMARK_CLOSE, HIDC_BOOKMARK_CLOSE},
{IDC_SUBPIC_LANG, HIDC_SUBPIC_LANG},
{IDC_AUDIO_LANG, HIDC_AUDIO_LANG},
{IDC_MENU_LANG, HIDC_MENU_LANG},
{IDC_STATIC_SUBPIC_LANG, HIDC_SUBPIC_LANG},
{IDC_STATIC_AUDIO_LANG, HIDC_AUDIO_LANG},
{IDC_STATIC_MENU_LANG, HIDC_MENU_LANG},
{IDC_EDIT_PASSWORD, HIDC_EDIT_PASSWORD},
{IDC_STATIC_PASSWORD, HIDC_EDIT_PASSWORD},
{IDC_EDIT_NEW_PASSWORD, HIDC_EDIT_NEW_PASSWORD},
{IDC_STATIC_NEW_PASSWORD, HIDC_EDIT_NEW_PASSWORD},
{IDC_EDIT_CONFIRM_NEW, HIDC_EDIT_CONFIRM_NEW},
{IDC_STATIC_CONFIRM_NEW, HIDC_EDIT_CONFIRM_NEW},
{IDC_COMBO_RATE, HIDC_COMBO_RATE},
{IDC_STATIC_CURRENT_RATE, HIDC_COMBO_RATE},
{IDC_BUTTON_CHANGE_PASSWORD, HIDC_BUTTON_CHANGE_PASSWORD},
{IDC_DISABLE_PARENT, HIDC_DISABLE_PARENT},
{IDC_DISABLE_SCREENSAVER, HIDC_DISABLE_SCREENSAVER},
{IDC_LIST_TITLES, HIDC_LIST_TITLES},
{IDC_LIST_CHAPS, HIDC_LIST_CHAPS},
{IDC_STATIC_LIST_TITLES, HIDC_LIST_TITLES},
{IDC_STATIC_LIST_CHAPS, HIDC_LIST_CHAPS},
};
/*************************************************************/
/* Name: Constructor
/* Description:
/*************************************************************/
COptionsDlg::COptionsDlg(IMSWebDVD* pDvd)
{
m_pDvd = pDvd;
m_dFFSpeed = 16.0;
m_dBWSpeed = 16.0;
m_dPlaySpeed = 1.0;
m_bChapDirty = FALSE;
m_bDirty = FALSE;
m_pDvdOpt = NULL;
m_pPasswordDlg = NULL;
for (int i=0; i<C_PAGES; i++) {
m_hwndDisplay[i] = NULL;
}
}
/*************************************************************/
/* Name:
/* Description:
/*************************************************************/
COptionsDlg::~COptionsDlg() {
if (m_pDvd) {
m_pDvd.Release();
m_pDvd = NULL;
}
if (m_pPasswordDlg) {
delete m_pPasswordDlg;
m_pPasswordDlg = NULL;
}
}
/*************************************************************/
/* Name: IsNewAdmin
/* Description: TRUE if no admin password hasn't been enter
/* FALSE otherwise
/*************************************************************/
BOOL COptionsDlg::IsNewAdmin()
{
BOOL bNewAdmin = TRUE;
TCHAR szSavedPasswd[MAX_PASSWD+PRE_PASSWD];
DWORD dwLen = MAX_PASSWD+PRE_PASSWD;
BOOL bFound = GetRegistryString(g_szPassword, szSavedPasswd, &dwLen, TEXT(""));
if (bFound && dwLen != 0)
bNewAdmin = FALSE;
return bNewAdmin;
}
/*************************************************************/
/* Name: OnInitDialog
/* Description: Create tab control
/*************************************************************/
LRESULT COptionsDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
m_pDvdOpt->Fire_OnOpen();
m_bChapDirty = FALSE;
m_bDirty = FALSE;
::EnableWindow(GetDlgItem(IDC_APPLY), FALSE);
// Save itself in the window user data
// so that child dialog proc can use it
::SetWindowLongPtr(m_hWnd, GWLP_USERDATA, (LONG_PTR)this);
SetFont((HFONT) GetStockObject(ANSI_FIXED_FONT), TRUE);
DWORD dwDlgBase = GetDialogBaseUnits();
int cxMargin = LOWORD(dwDlgBase) / 4;
int cyMargin = HIWORD(dwDlgBase) / 8;
cxMargin *= 2;
cyMargin *= 2;
m_hwndTab = GetDlgItem(IDC_TABCTRL);
TabCtrl_DeleteAllItems(m_hwndTab);
for (int i=C_PAGES-1; i>=0; i--) {
m_hwndDisplay[i] = NULL;
}
TCITEM tie;
// Add a tab for each of the three child dialog boxes.
tie.mask = TCIF_TEXT | TCIF_IMAGE;
tie.iImage = -1;
RECT rcTab;
SetRectEmpty(&rcTab);
for (i=0; i<C_PAGES; i++) {
tie.pszText = LoadStringFromRes(IDS_SEARCH+i);
TabCtrl_InsertItem(m_hwndTab, i, &tie);
// Lock the resources for the child dialog boxes.
m_apRes[i] = DoLockDlgRes(MAKEINTRESOURCE(IDD_SEARCH+i));
// Determine the bounding rectangle for all child dialog boxes.
SIZE size;
AtlGetDialogSize(m_apRes[i], &size);
if (size.cx > rcTab.right)
rcTab.right = size.cx;
if (size.cy > rcTab.bottom)
rcTab.bottom = size.cy;
}
// Calculate how large to make the tab control, so
// the display area can accommodate all the child dialog boxes.
TabCtrl_AdjustRect(m_hwndTab, TRUE, &rcTab);
OffsetRect(&rcTab,
GetSystemMetrics(SM_CXDLGFRAME) + cxMargin - rcTab.left,
GetSystemMetrics(SM_CYDLGFRAME) + cyMargin - rcTab.top);
// Calculate the display rectangle.
RECT rcDisplay;
CopyRect(&rcDisplay, &rcTab);
TabCtrl_AdjustRect(m_hwndTab, FALSE, &rcDisplay);
OffsetRect(&rcDisplay, cxMargin, cyMargin);
// Set the size and position of the tab control, buttons,
// and dialog box.
::MoveWindow(m_hwndTab,
rcTab.left, rcTab.top,
RECTWIDTH(&rcTab) + 2*cxMargin,
RECTHEIGHT(&rcTab) + 2*cyMargin,
TRUE);
// Size the dialog box.
RECT rcButton = {0, 0, 50, 14};
HWND hWndButton = GetDlgItem(IDC_APPLY);
if (hWndButton) {
::GetClientRect(hWndButton, &rcButton);
}
RECT rcDialog;
GetWindowRect(&rcDialog);
MoveWindow(rcDialog.left, rcDialog.top,
rcTab.right + 4*cxMargin + 2*GetSystemMetrics(SM_CXDLGFRAME),
rcTab.bottom + 6*cyMargin + 2*GetSystemMetrics(SM_CYDLGFRAME)
+ RECTHEIGHT(&rcButton) + GetSystemMetrics(SM_CYCAPTION),
TRUE);
// Move the apply, cancel and ok buttons
GetClientRect(&rcDialog);
// apply button
if (hWndButton) {
::MoveWindow(hWndButton,
RECTWIDTH(&rcDialog)-2*cxMargin-RECTWIDTH(&rcButton),
RECTHEIGHT(&rcDialog)-2*cyMargin-RECTHEIGHT(&rcButton),
RECTWIDTH(&rcButton),
RECTHEIGHT(&rcButton),
TRUE);
}
// cancel button
hWndButton = GetDlgItem(IDCANCEL);
if (hWndButton) {
::MoveWindow(hWndButton,
RECTWIDTH(&rcDialog)-3*cxMargin-2*RECTWIDTH(&rcButton),
RECTHEIGHT(&rcDialog)-2*cyMargin-RECTHEIGHT(&rcButton),
RECTWIDTH(&rcButton),
RECTHEIGHT(&rcButton),
TRUE);
}
// ok button
hWndButton = GetDlgItem(IDOK);
if (hWndButton) {
::MoveWindow(hWndButton,
RECTWIDTH(&rcDialog)-4*cxMargin-3*RECTWIDTH(&rcButton),
RECTHEIGHT(&rcDialog)-2*cyMargin-RECTHEIGHT(&rcButton),
RECTWIDTH(&rcButton),
RECTHEIGHT(&rcButton),
TRUE);
}
// Create individual pages
for (i=C_PAGES-1; i>=0; i--) {
m_hwndDisplay[i] = CreateDialogIndirect(_Module.GetModuleInstance(),
m_apRes[i], m_hWnd, ChildDialogProc);
::MoveWindow(m_hwndDisplay[i],
rcDisplay.left,
rcDisplay.top,
RECTWIDTH(&rcDisplay),
RECTHEIGHT(&rcDisplay),
TRUE);
}
// Simulate selection of the first item.
m_currentSel = 0;
OnSelChanged();
return 0;
}
/*************************************************************/
/* Name: OnNotify
/* Description: Tab control selection has changed
/*************************************************************/
LRESULT COptionsDlg::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
NMHDR *lpnmhdr = (LPNMHDR) lParam;
switch (lpnmhdr->code) {
case TCN_SELCHANGE:
OnSelChanged();
break;
}
return 0;
}
/*************************************************************/
/* Name: DoLockDlgRes */
/* Description: loads and locks a dialog template resource. */
/* Returns the address of the locked resource. */
/* lpszResName - name of the resource */
/*************************************************************/
DLGTEMPLATE * WINAPI COptionsDlg::DoLockDlgRes(LPCTSTR lpszResName){
HRSRC hrsrc = FindResource(_Module.GetModuleInstance(), lpszResName, RT_DIALOG);
if(NULL == hrsrc){
ATLASSERT(FALSE);
return(NULL);
}/* end of if statement */
HGLOBAL hglb = LoadResource(_Module.GetModuleInstance(), hrsrc);
return (DLGTEMPLATE *) LockResource(hglb);
} /* end of function DoLockDlgRes */
/*************************************************************/
/* Name: OnSelChanged
/* Description: processes the TCN_SELCHANGE notification.
hwndDlg - handle to the parent dialog box.
/*************************************************************/
VOID WINAPI COptionsDlg::OnSelChanged()
{
int iSel = TabCtrl_GetCurSel(m_hwndTab);
// hide current dialog box
::ShowWindow(m_hwndDisplay[m_currentSel], SW_HIDE);
::ShowWindow(m_hwndDisplay[iSel], SW_SHOW);
if(iSel == PAGE_PG && IsNewAdmin()) //first time login
{
OnDoPasswordDlg(CPasswordDlg::PASSWORDDLG_CHANGE);
}
m_currentSel = iSel;
}
/*************************************************************/
/* Name: OnHelp
/* Description: Display help message for a control
/*************************************************************/
LRESULT COptionsDlg::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HELPINFO *lphi = (LPHELPINFO) lParam;
HWND hwnd = (HWND) lphi->hItemHandle;
DWORD_PTR contextId = lphi->dwContextId;
if (contextId != 0) {
if (contextId >= HIDOK)
::WinHelp(m_hWnd, TEXT("windows.hlp"), HELP_CONTEXTPOPUP, contextId);
else
::WinHelp(m_hWnd, TEXT("dvdplay.hlp"), HELP_CONTEXTPOPUP, contextId);
}
return 0;
}
/*************************************************************/
/* Name: OnContextMenu
/* Description: Display help message for a control
/*************************************************************/
LRESULT COptionsDlg::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HWND hwnd = (HWND) wParam;
DWORD controlId = ::GetDlgCtrlID(hwnd);
POINT pt;
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
if (controlId == 0) {
::ScreenToClient(hwnd, &pt);
hwnd = ::ChildWindowFromPoint(hwnd, pt);
controlId = ::GetDlgCtrlID(hwnd);
}
for (int i=0; i<g_helpIDArraySize; i++) {
if (controlId && controlId == g_helpIDArray[i][0]) {
if (controlId <= IDC_APPLY) {
::WinHelp(hwnd, TEXT("windows.hlp"), HELP_CONTEXTMENU, (DWORD_PTR)g_helpIDArray);
return 0;
}
else {
::WinHelp(hwnd, TEXT("dvdplay.hlp"), HELP_CONTEXTMENU, (DWORD_PTR)g_helpIDArray);
return 0;
}
}
}
return 0;
}
/*************************************************************/
/* Name: OnApply
/* Description:
/*************************************************************/
LRESULT COptionsDlg::OnApply(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
bHandled = FALSE;
// apply changes in all pages
if (m_hwndDisplay[PAGE_CHAP])
chapSrch_OnApply(m_hwndDisplay[PAGE_CHAP]);
if (m_hwndDisplay[PAGE_SPRM])
sprm_OnApply(m_hwndDisplay[PAGE_SPRM]);
if (m_hwndDisplay[PAGE_PG])
pg_OnApply(m_hwndDisplay[PAGE_PG]);
if (m_hwndDisplay[PAGE_KARAOKE])
karaoke_OnApply(m_hwndDisplay[PAGE_KARAOKE]);
otherPage_Dirty(FALSE);
::EnableWindow(GetDlgItem(IDC_APPLY), FALSE);
return 1;
}
/*************************************************************/
/* Name: OnOK
/* Description:
/*************************************************************/
LRESULT COptionsDlg::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
OnApply(wNotifyCode, wID, hWndCtl, bHandled);
m_pDvdOpt->Fire_OnClose();
EndDialog(wID);
return 0;
}
/*************************************************************/
/* Name: OnEndDialog
/* Description:
/*************************************************************/
LRESULT COptionsDlg::OnEndDialog(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
m_pDvdOpt->Fire_OnClose();
EndDialog(wID);
return 0;
}
/*************************************************************/
/* Name: OnActivate
/* Description: called when the change/verify password dlg dimisses
/*************************************************************/
LRESULT COptionsDlg::OnActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (WA_ACTIVE != LOWORD(wParam))
return 0;
HWND tabControl = GetDlgItem(IDC_TABCTRL);
if (!tabControl)
return 0;
int iSel = TabCtrl_GetCurSel(m_hwndTab);
if (iSel == PAGE_PG) {
if (!m_pPasswordDlg)
return 0;
if ( m_pPasswordDlg->GetReason() == CPasswordDlg::PASSWORDDLG_VERIFY) {
// If password verification succeded
if (m_pPasswordDlg->IsVerified())
ShowRestartWarning(m_hwndDisplay[PAGE_PG]);
else
pg_OnInitDialog(m_hwndDisplay[PAGE_PG]);
}
}
return 0;
}
/*************************************************************/
/* Name: ShowRestartWarning
/* Description:
/*************************************************************/
void COptionsDlg::ShowRestartWarning(HWND hwndDlg)
{
HWND staticWarning = ::GetDlgItem(hwndDlg, IDC_WARNING_RESTART);
if (!staticWarning) return;
::ShowWindow(staticWarning, SW_SHOW);
}
/*************************************************************/
/* Name: OnChangePassword
/* Description:
/*************************************************************/
HRESULT COptionsDlg::OnDoPasswordDlg(CPasswordDlg::PASSWORDDLG_REASON reason)
{
HRESULT hr = S_OK;
if (!m_pPasswordDlg) {
CComPtr<IMSDVDAdm> pDvdAdm;
hr = GetDvdAdm((LPVOID*) &pDvdAdm);
if (FAILED(hr) || !pDvdAdm) return hr;
m_pPasswordDlg = new CPasswordDlg(pDvdAdm);
}
m_pPasswordDlg->SetReason(reason);
m_pPasswordDlg->DoModal(m_hwndDisplay[PAGE_PG]);
return hr;
}
/*************************************************************/
/* Name: ChildDialogProc
/* Description: DialogProc for the control tabs
/*************************************************************/
INT_PTR CALLBACK ChildDialogProc(
HWND hwndDlg, // handle to the child dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HWND hwndParent = GetParent(hwndDlg);
COptionsDlg *pDlgOpt = (COptionsDlg *)::GetWindowLongPtr
(hwndParent, GWLP_USERDATA);
switch(uMsg) {
case WM_INITDIALOG:
{
pDlgOpt->chapSrch_OnInitDialog(hwndDlg);
pDlgOpt->sprm_OnInitDialog(hwndDlg);
pDlgOpt->pg_OnInitDialog(hwndDlg);
if (FAILED(pDlgOpt->karaoke_OnInitDialog(hwndDlg))) {
HWND hwndTab = ::GetDlgItem(hwndParent, IDC_TABCTRL);
TabCtrl_DeleteItem(hwndTab, PAGE_ABOUT);
TabCtrl_DeleteItem(hwndTab, PAGE_KARAOKE);
// Add back the about page
TCITEM tie;
tie.mask = TCIF_TEXT | TCIF_IMAGE;
tie.iImage = -1;
tie.pszText = LoadStringFromRes(IDS_ABOUT);
TabCtrl_InsertItem(hwndTab, PAGE_KARAOKE, &tie);
pDlgOpt->m_hwndDisplay[PAGE_KARAOKE] = pDlgOpt->m_hwndDisplay[PAGE_ABOUT];
}
return TRUE;
}
case WM_COMMAND: {
CComPtr<IMSWebDVD> pDvd;
HRESULT hr = pDlgOpt->GetDvd(&pDvd);
if (FAILED(hr) || !pDvd)
return FALSE;
switch (HIWORD(wParam)) {
case BN_CLICKED:
switch(LOWORD(wParam)) {
case IDC_BUTTON_CHANGE_PASSWORD:
pDlgOpt->OnDoPasswordDlg(CPasswordDlg::PASSWORDDLG_CHANGE);
break;
case IDC_DISABLE_PARENT: {
// Return value < 32 bits. Easier to cast than to change to LRESULT
// all over the code.
BOOL disableParent = (BOOL)::SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
::EnableWindow(::GetDlgItem(hwndDlg, IDC_COMBO_RATE), !disableParent);
pDlgOpt->OnDoPasswordDlg(CPasswordDlg::PASSWORDDLG_VERIFY);
}
// Fall through
default:
pDlgOpt->otherPage_Dirty(TRUE);
::EnableWindow(::GetDlgItem(hwndParent, IDC_APPLY), TRUE);
break;
}
break;
case LBN_SELCHANGE:
switch(LOWORD(wParam)) {
case IDC_SUBPIC_LANG:
case IDC_AUDIO_LANG:
case IDC_MENU_LANG:
pDlgOpt->ShowRestartWarning(hwndDlg);
pDlgOpt->otherPage_Dirty(TRUE);
::EnableWindow(::GetDlgItem(hwndParent, IDC_APPLY), TRUE);
break;
case IDC_COMBO_RATE:
pDlgOpt->OnDoPasswordDlg(CPasswordDlg::PASSWORDDLG_VERIFY);
pDlgOpt->otherPage_Dirty(TRUE);
::EnableWindow(::GetDlgItem(hwndParent, IDC_APPLY), TRUE);
break;
case IDC_AUDIO_LIST:
pDlgOpt->karaoke_InitChannelList(hwndDlg);
::EnableWindow(::GetDlgItem(hwndParent, IDC_APPLY), TRUE);
break;
case IDC_LIST_TITLES:
pDlgOpt->chapSrch_InitChapList(hwndDlg);
// Fall through
case IDC_LIST_CHAPS:
pDlgOpt->chapSrch_Dirty(TRUE);
::EnableWindow(::GetDlgItem(hwndParent, IDC_APPLY), TRUE);
break;
default:
pDlgOpt->otherPage_Dirty(TRUE);
::EnableWindow(::GetDlgItem(hwndParent, IDC_APPLY), TRUE);
break;
}
break;
case LBN_DBLCLK:
switch(LOWORD(wParam)) {
case IDC_LIST_TITLES:
::SendMessage(::GetDlgItem(hwndDlg, IDC_LIST_CHAPS), LB_SETCURSEL, (WPARAM)-1, 0);
// Fall through
case IDC_LIST_CHAPS:
pDlgOpt->chapSrch_Dirty(TRUE);
pDlgOpt->chapSrch_OnApply(hwndDlg);
// If no other page is dirty, disable the apply button
if (!pDlgOpt->otherPage_Dirty())
::EnableWindow(::GetDlgItem(hwndParent, IDC_APPLY), FALSE);
break;
case IDC_AUDIO_LIST:
pDlgOpt->karaoke_OnApply(hwndDlg);
// If no other page is dirty, disable the apply button
if (!pDlgOpt->otherPage_Dirty())
::EnableWindow(::GetDlgItem(hwndParent, IDC_APPLY), FALSE);
break;
}
break;
}
return FALSE;
}
}
return FALSE;
}