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

275 lines
9 KiB
C++

// Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
/*************************************************************/
/* Name: sprm_OnInitDialog
/* Description: OnInitDialog for the Viewing Options page
/*************************************************************/
#include "stdafx.h"
#include "COptDlg.h"
// Language ID's supported by DVD Nav
WORD langIDs[] = {
LANG_AFRIKAANS ,
LANG_ALBANIAN ,
LANG_ARABIC ,
LANG_BASQUE ,
LANG_BELARUSIAN ,
LANG_BULGARIAN ,
LANG_CATALAN ,
LANG_CHINESE ,
LANG_CROATIAN ,
LANG_CZECH ,
LANG_DANISH ,
LANG_DUTCH ,
LANG_ENGLISH ,
LANG_ESTONIAN ,
LANG_FAEROESE ,
LANG_FARSI ,
LANG_FINNISH ,
LANG_FRENCH ,
LANG_GERMAN ,
LANG_GREEK ,
LANG_HEBREW ,
LANG_HUNGARIAN ,
LANG_ICELANDIC ,
LANG_INDONESIAN ,
LANG_ITALIAN ,
LANG_JAPANESE ,
LANG_KOREAN ,
LANG_LATVIAN ,
LANG_LITHUANIAN ,
LANG_MALAY ,
LANG_NORWEGIAN ,
LANG_POLISH ,
LANG_PORTUGUESE ,
LANG_ROMANIAN ,
LANG_RUSSIAN ,
LANG_SERBIAN ,
LANG_SLOVAK ,
LANG_SLOVENIAN ,
LANG_SPANISH ,
LANG_SWAHILI ,
LANG_SWEDISH ,
LANG_THAI ,
LANG_TURKISH ,
LANG_UKRAINIAN
};
/*************************************************************/
/* Name: sprm_InitLangList
/* Description: Initial a combo box with available languages
/* highlight the one with LCID equal to id
/*************************************************************/
HRESULT COptionsDlg::sprm_InitLangList(HWND cList, WORD id)
{
USES_CONVERSION;
::SendMessage(cList, CB_RESETCONTENT, 0, 0);
LPTSTR pszDefault = LoadStringFromRes(IDS_INI_TITLE_DEFAULT);
::SendMessage(cList, CB_INSERTSTRING, 0, (LPARAM)pszDefault);
::SendMessage(cList, CB_SETCURSEL, 0, 0);
delete pszDefault;
if (id == LANG_NEUTRAL) {
id = PRIMARYLANGID(::GetUserDefaultLangID());
}
for (int i=0; i<sizeof(langIDs)/sizeof(WORD); i++) {
CComBSTR strLang;
m_pDvd->GetLangFromLangID(long(langIDs[i]), &strLang);
::SendMessage(cList, CB_INSERTSTRING, (UINT)-1, (LPARAM)OLE2T(strLang));
if (langIDs[i] == id)
// First item in list is "Title Default"
::SendMessage(cList, CB_SETCURSEL, i+1, 0);
}
return S_OK;
}
/*************************************************************/
/* Name: sprm_OnInitDialog
/* Description:
/*************************************************************/
HRESULT COptionsDlg::sprm_OnInitDialog(HWND hwndDlg)
{
HWND hwndAudList = ::GetDlgItem(hwndDlg, IDC_AUDIO_LANG);
HWND hwndSPList = ::GetDlgItem(hwndDlg, IDC_SUBPIC_LANG);
HWND hwndMenuList = ::GetDlgItem(hwndDlg, IDC_MENU_LANG);
HWND screenSaverCheck = ::GetDlgItem(hwndDlg, IDC_DISABLE_SCREENSAVER);
HWND bookmarkOnStopCheck = ::GetDlgItem(hwndDlg, IDC_BOOKMARK_STOP);
HWND bookmarkOnCloseCheck = ::GetDlgItem(hwndDlg, IDC_BOOKMARK_CLOSE);
if (!hwndAudList || !hwndSPList || !hwndMenuList)
return S_FALSE;
try {
HRESULT hr = S_OK;
CComPtr<IMSDVDAdm> pDvdAdm;
hr = GetDvdAdm((LPVOID*) &pDvdAdm);
if (FAILED(hr) || !pDvdAdm)
throw(hr);
VARIANT_BOOL temp;
LCID audioLCID;
LCID subpictureLCID;
LCID menuLCID;
pDvdAdm->get_DisableScreenSaver(&temp);
BOOL fDisabled = (temp == VARIANT_FALSE? FALSE:TRUE);
::SendMessage(screenSaverCheck, BM_SETCHECK, fDisabled, 0);
pDvdAdm->get_BookmarkOnStop(&temp);
fDisabled = (temp == VARIANT_FALSE? FALSE:TRUE);
::SendMessage(bookmarkOnStopCheck, BM_SETCHECK, fDisabled, 0);
pDvdAdm->get_BookmarkOnClose(&temp);
fDisabled = (temp == VARIANT_FALSE? FALSE:TRUE);
::SendMessage(bookmarkOnCloseCheck, BM_SETCHECK, fDisabled, 0);
pDvdAdm->get_DefaultAudioLCID((long*)&audioLCID);
pDvdAdm->get_DefaultSubpictureLCID((long*)&subpictureLCID);
pDvdAdm->get_DefaultMenuLCID((long*)&menuLCID);
sprm_InitLangList(hwndAudList, PRIMARYLANGID(LANGIDFROMLCID(audioLCID)));
sprm_InitLangList(hwndSPList, PRIMARYLANGID(LANGIDFROMLCID(subpictureLCID)));
sprm_InitLangList(hwndMenuList, PRIMARYLANGID(LANGIDFROMLCID(menuLCID)));
}
catch (HRESULT hr) {
DVDMessageBox(hwndDlg, IDS_SPRM_FAIL);
sprm_OnInitDialog(hwndDlg);
return hr;
}
return S_OK;
}
/*************************************************************/
/* Name: sprm_OnApply
/* Description: OnApply for Viewing Options page
/*************************************************************/
HRESULT COptionsDlg::sprm_OnApply(HWND hwnd)
{
HWND hwndMenuList = ::GetDlgItem(hwnd, IDC_MENU_LANG);
HWND hwndSPList = ::GetDlgItem(hwnd, IDC_SUBPIC_LANG);
HWND hwndAudList = ::GetDlgItem(hwnd, IDC_AUDIO_LANG);
HWND screenSaverCheck = ::GetDlgItem(hwnd, IDC_DISABLE_SCREENSAVER);
HWND bookmarkOnStopCheck = ::GetDlgItem(hwnd, IDC_BOOKMARK_STOP);
HWND bookmarkOnCloseCheck = ::GetDlgItem(hwnd, IDC_BOOKMARK_CLOSE);
// Get current selections;
INT nAudioCurSel = (INT) SendMessage(hwndAudList, CB_GETCURSEL, 0, 0);
INT nMenuCurSel = (INT) SendMessage(hwndMenuList, CB_GETCURSEL, 0, 0);
INT nSPCurSel = (INT) SendMessage(hwndSPList, CB_GETCURSEL, 0, 0);
try {
HRESULT hr = S_OK;
CComPtr<IMSDVDAdm> pDvdAdm;
hr = GetDvdAdm((LPVOID*) &pDvdAdm);
if (FAILED(hr) || !pDvdAdm)
throw(hr);
if (nAudioCurSel>=0 || nMenuCurSel>=0 || nSPCurSel>=0) {
BOOL bSubpictureLCIDChanged = FALSE;
BOOL bAudioLCIDChanged = FALSE;
BOOL bMenuLCIDChanged = FALSE;
// Title default
LCID subpictureLCID = (LCID)-1;
LCID audioLCID = (LCID)-1;
LCID menuLCID = (LCID)-1;
LCID savedLCID;
if (nAudioCurSel>0) {
audioLCID = MAKELCID(MAKELANGID(langIDs[nAudioCurSel-1], SUBLANG_DEFAULT), SORT_DEFAULT);
}
pDvdAdm->get_DefaultAudioLCID((long*)&savedLCID);
if (audioLCID != savedLCID) {
bAudioLCIDChanged = TRUE;
}
if (nSPCurSel>0) {
subpictureLCID = MAKELCID(MAKELANGID(langIDs[nSPCurSel-1], SUBLANG_DEFAULT), SORT_DEFAULT);
}
pDvdAdm->get_DefaultSubpictureLCID((long*)&savedLCID);
if (subpictureLCID != savedLCID) {
bSubpictureLCIDChanged = TRUE;
}
if (nMenuCurSel>0) {
menuLCID = MAKELCID(MAKELANGID(langIDs[nMenuCurSel-1], SUBLANG_DEFAULT), SORT_DEFAULT);
}
pDvdAdm->get_DefaultMenuLCID((long*)&savedLCID);
if (menuLCID != savedLCID) {
bMenuLCIDChanged = TRUE;
}
if (bAudioLCIDChanged || bSubpictureLCIDChanged || bMenuLCIDChanged) {
//m_pDvd->SaveState();
hr = m_pDvd->Stop();
if (FAILED(hr))
throw (hr);
if (bAudioLCIDChanged) {
if (::IsValidLocale(audioLCID, LCID_SUPPORTED)){
hr = m_pDvd->SelectDefaultAudioLanguage(audioLCID, 0);
if (FAILED(hr))
throw (hr);
}
hr = pDvdAdm->put_DefaultAudioLCID(audioLCID);
}
if (bSubpictureLCIDChanged) {
if (::IsValidLocale(subpictureLCID, LCID_SUPPORTED)){
hr = m_pDvd->SelectDefaultSubpictureLanguage(subpictureLCID, dvdSPExt_NotSpecified);
if (FAILED(hr))
throw (hr);
}
hr = pDvdAdm->put_DefaultSubpictureLCID(subpictureLCID);
}
if (bMenuLCIDChanged) {
if (::IsValidLocale(menuLCID, LCID_SUPPORTED)){
hr = m_pDvd->put_DefaultMenuLanguage(menuLCID);
if (FAILED(hr))
throw (hr);
}
hr = pDvdAdm->put_DefaultMenuLCID(menuLCID);
}
hr = m_pDvd->Play();
if (FAILED(hr))
throw (hr);
//m_pDvd->RestoreState();
}
}
BOOL fDisabled = (BOOL) SendMessage(screenSaverCheck, BM_GETCHECK, 0, 0);
VARIANT_BOOL temp = (fDisabled==FALSE? VARIANT_FALSE:VARIANT_TRUE);
hr = pDvdAdm->put_DisableScreenSaver(temp);
if (FAILED(hr))
throw (hr);
BOOL fEnabled = (BOOL) SendMessage(bookmarkOnStopCheck, BM_GETCHECK, 0, 0);
temp = (fEnabled==FALSE? VARIANT_FALSE:VARIANT_TRUE);
hr = pDvdAdm->put_BookmarkOnStop(temp);
if (FAILED(hr))
throw (hr);
fEnabled = (BOOL) SendMessage(bookmarkOnCloseCheck, BM_GETCHECK, 0, 0);
temp = (fEnabled==FALSE? VARIANT_FALSE:VARIANT_TRUE);
hr = pDvdAdm->put_BookmarkOnClose(temp);
if (FAILED(hr))
throw (hr);
}
catch (HRESULT hr) {
DVDMessageBox(hwnd, IDS_SPRM_FAIL);
sprm_OnInitDialog(hwnd);
return hr;
}
return S_OK;
}