// 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;
}