// MainWnd.cpp: implementation of the CMainWnd class.
//
//////////////////////////////////////////////////////////////////////

#include "pch.h"
#include "resource.h"
#include "Page1.h"
#include "MainWnd.h"
#include "pagefact.h"


//////////////////////////////////////////////////////////////////////
// CMainWnd
//////////////////////////////////////////////////////////////////////
CMainWnd::CMainWnd(void)
{

}


CMainWnd::~CMainWnd(void)
{

}


void CMainWnd::OnFinalMessage(HWND /*hwnd*/)
{
    CloseTaskSheet();
    PostQuitMessage(0);
}

LRESULT CMainWnd::OnInitMenuPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
    const UINT uEnable = MF_BYCOMMAND | MF_ENABLED;
    const UINT uDisable = MF_BYCOMMAND | MF_DISABLED | MF_GRAYED;

    if (0 == LOWORD(lParam))
    {
        HMENU hMenu = (HMENU)wParam;
        BOOL bSheetOpen = m_spTaskSheet ? TRUE : FALSE;
        EnableMenuItem(hMenu, ID_TEST_DOMODAL, bSheetOpen ? uDisable : uEnable);
        EnableMenuItem(hMenu, ID_TEST_DOMODELESS, bSheetOpen ? uDisable : uEnable);
        EnableMenuItem(hMenu, ID_TEST_CLOSEMODELESS, bSheetOpen ? uEnable : uDisable);
    }
    return 0;
}

LRESULT CMainWnd::OnDoModal(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    CreateTaskSheet(FALSE);
    return 0;
}

LRESULT CMainWnd::OnDoModeless(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    CreateTaskSheet(TRUE);
    return 0;
}

LRESULT CMainWnd::OnCloseModeless(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    CloseTaskSheet();
    return 0;
}

LRESULT CMainWnd::OnExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    SendMessage(WM_CLOSE);
    return 0;
}

HRESULT CMainWnd::CreateTaskSheet(BOOL bModeless)
{
    HRESULT hr;

    // For sanity
    CloseTaskSheet();

    hr = m_spTaskSheet.CoCreateInstance(__uuidof(TaskSheet));

    if (SUCCEEDED(hr))
    {
        CComPtr<IPropertyBag> spProps = NULL;

        hr = m_spTaskSheet->GetPropertyBag(IID_IPropertyBag, (void**)&spProps);

        if (SUCCEEDED(hr))
        {
            CComVariant var(L"Task Sheet Test");
            spProps->Write(TS_PROP_TITLE, &var);

            var = 600;
            spProps->Write(TS_PROP_WIDTH, &var);

            var = 400;
            spProps->Write(TS_PROP_HEIGHT, &var);

            var = 400;
            spProps->Write(TS_PROP_MINWIDTH, &var);

            var = 250;
            spProps->Write(TS_PROP_MINHEIGHT, &var);

            WCHAR szTemp[MAX_PATH];
            wnsprintfW(szTemp, ARRAYSIZE(szTemp), L"res://taskapp.exe/%d/%d", RT_BITMAP, IDB_WATERMARK);
            var = szTemp;
            //var = L"file://c:\\windows\\ua_bkgnd.bmp";
            spProps->Write(TS_PROP_WATERMARK, &var);

            // Note: Make modeless be resizable and modal not-resizable,
            // just to exercise both resizable and not.
            // Ditto for showing the statusbar.
            var = bModeless;
            spProps->Write(TS_PROP_MODELESS, &var);
            spProps->Write(TS_PROP_RESIZABLE, &var);
            spProps->Write(TS_PROP_STATUSBAR, &var);

            ITaskPageFactory *pPageFactory = NULL;
            hr = CPageFactory::CreateInstance(&pPageFactory);
            if (SUCCEEDED(hr))
            {
                hr = m_spTaskSheet->Run(pPageFactory, CLSID_CPage1, m_hWnd);
                pPageFactory->Release();
            }
        }                                                       

        if (!bModeless)
            m_spTaskSheet.Release();
    }

    return hr;
}

HRESULT CMainWnd::CloseTaskSheet()
{
    HRESULT hr = E_UNEXPECTED;

    if (m_spTaskSheet)
    {
        hr = m_spTaskSheet->Close();
        m_spTaskSheet.Release();
    }

    return hr;
}