//____________________________________________________________________________ // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 1996. // // File: dlg.cxx // // Contents: // // Classes: // // Functions: // // History: 3/4/1996 RaviR Created // //____________________________________________________________________________ #include "..\pch\headers.hxx" #pragma hdrstop #include "..\inc\dll.hxx" #include "dlg.hxx" #include "..\inc\misc.hxx" #include "..\inc\sadat.hxx" #include "..\folderui\dbg.h" #include "..\folderui\util.hxx" // // extern EXTERN_C // extern HINSTANCE g_hInstance; CPropPage::CPropPage( LPCTSTR szTmplt, LPTSTR ptszTaskPath): m_hPage(NULL), m_fTaskInTasksFolder(FALSE), m_fSupportsSystemRequired(FALSE), m_bPlatformId(0), m_fDirty(FALSE), m_fInInit(FALSE) { Win4Assert(ptszTaskPath != NULL && *ptszTaskPath); lstrcpyn(m_ptszTaskPath, ptszTaskPath, ARRAY_LEN(m_ptszTaskPath)); ZeroMemory(&m_psp, sizeof(m_psp)); m_psp.dwSize = sizeof(PROPSHEETPAGE); m_psp.dwFlags = PSP_USECALLBACK; m_psp.hInstance = g_hInstance; m_psp.pszTemplate = szTmplt; m_psp.pfnDlgProc = StaticDlgProc; m_psp.pfnCallback = PageRelease; m_psp.pcRefParent = NULL; // do not set PSP_USEREFPARENT m_psp.lParam = (LPARAM) this; } CPropPage::~CPropPage() { } INT_PTR CALLBACK CPropPage::StaticDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CPropPage *pThis = (CPropPage *)GetWindowLongPtr(hDlg, DWLP_USER); if (uMsg == WM_INITDIALOG) { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE)lParam; pThis = (CPropPage *) ppsp->lParam; pThis->m_hPage = hDlg; SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pThis); } if (pThis != NULL) { return pThis->DlgProc(uMsg, wParam, lParam); } else { return DefWindowProc(hDlg, uMsg, wParam, lParam); } } LRESULT CPropPage::DlgProc( UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT lr; switch (uMsg) { case WM_INITDIALOG: m_fInInit = TRUE; _BaseInit(); lr = _OnInitDialog(lParam); m_fInInit = FALSE; return lr; case PSM_QUERYSIBLINGS: return _OnPSMQuerySibling(wParam, lParam); case WM_NOTIFY: return _OnNotify(uMsg, (UINT)wParam, lParam); case WM_WININICHANGE: return _OnWinIniChange(wParam, lParam); case WM_SETFOCUS: return _OnSetFocus((HWND)wParam); case WM_TIMER: return _OnTimer((UINT)wParam); case WM_HELP: return _OnHelp(((LPHELPINFO) lParam)->hItemHandle, HELP_WM_HELP); case WM_CONTEXTMENU: return _OnHelp((HANDLE) wParam, HELP_CONTEXTMENU); case WM_COMMAND: if (m_fInInit) { return TRUE; } return(_OnCommand(GET_WM_COMMAND_ID(wParam, lParam), GET_WM_COMMAND_HWND(wParam, lParam), GET_WM_COMMAND_CMD(wParam, lParam))); case WM_DESTROY: return _OnDestroy(); default: return(FALSE); } return(TRUE); } LRESULT CPropPage::_OnNotify( UINT uMessage, UINT uParam, LPARAM lParam) { switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: return _OnApply(); case PSN_RESET: _OnCancel(); return FALSE; // allow the property sheet to be destroyed. case PSN_SETACTIVE: return _OnPSNSetActive(lParam); case PSN_KILLACTIVE: return _OnPSNKillActive(lParam); case DTN_DATETIMECHANGE: return _OnDateTimeChange(lParam); case UDN_DELTAPOS: return _OnSpinDeltaPos((NM_UPDOWN *)lParam); default: return _ProcessListViewNotifications(uMessage, uParam, lParam); } return TRUE; } LRESULT CPropPage::_OnPSMQuerySibling( WPARAM wParam, LPARAM lParam) { SetWindowLongPtr(Hwnd(), DWLP_MSGRESULT, 0); return 0; } LRESULT CPropPage::_OnSpinDeltaPos( NM_UPDOWN * pnmud) { _EnableApplyButton(); // Return FALSE to allow the change in the control's position. return FALSE; } LRESULT CPropPage::_OnCommand( int id, HWND hwndCtl, UINT codeNotify) { return FALSE; } LRESULT CPropPage::_OnWinIniChange( WPARAM wParam, LPARAM lParam) { return FALSE; } LRESULT CPropPage::_OnApply(void) { return FALSE; } LRESULT CPropPage::_OnCancel(void) { return FALSE; } LRESULT CPropPage::_OnSetFocus( HWND hwndLoseFocus) { // An application should return zero if it processes this message. return 1; } LRESULT CPropPage::_OnPSNSetActive( LPARAM lParam) { SetWindowLongPtr(m_hPage, DWLP_MSGRESULT, 0); return TRUE; } LRESULT CPropPage::_OnPSNKillActive( LPARAM lParam) { SetWindowLongPtr(m_hPage, DWLP_MSGRESULT, 0); return TRUE; } LRESULT CPropPage::_OnDateTimeChange( LPARAM lParam) { SetWindowLongPtr(m_hPage, DWLP_MSGRESULT, 0); return TRUE; } LRESULT CPropPage::_OnDestroy(void) { // If an application processes this message, it should return zero. return 1; } LRESULT CPropPage::_OnTimer( UINT idTimer) { // If an application processes this message, it should return zero. return 1; } BOOL CPropPage::_ProcessListViewNotifications( UINT uMsg, WPARAM wParam, LPARAM lParam) { return FALSE; } UINT CALLBACK CPropPage::PageRelease( HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp) { if (uMsg == PSPCB_RELEASE) { // // Determine instance that invoked this static function // CPropPage *pThis = (CPropPage *) ppsp->lParam; // // If page was created using an indirect dialog template, delete // that. // if (pThis->m_psp.dwFlags & PSP_DLGINDIRECT) { delete [] (BYTE *)pThis->m_psp.pResource; } delete pThis; } return TRUE; } //+--------------------------------------------------------------------------- // // Member: CPropPage::_BaseInit, private // // Synopsis: Initialize scheduling-agent specific private data members, // m_fTaskInTasksFolder & m_bPlatformId. Do so by reading SA.DAT // in the folder containing the task. // // Arguments: None. // // Returns: None. // // Notes: None. // //---------------------------------------------------------------------------- void CPropPage::_BaseInit(void) { TCHAR tszFolder[MAX_PATH + 1]; ::GetParentDirectory(m_ptszTaskPath, tszFolder); // // If running on the local system, we can determine whether resume // timers are supported directly instead of by checking sa.dat, which // might be stale. // BOOL fLocal = IsLocalFilename(m_ptszTaskPath); if (fLocal) { CheckSaDat(tszFolder); } // // Read sa.dat on target machine // HRESULT hr; DWORD dwVersion; BYTE bSvcFlags; hr = SADatGetData(tszFolder, &dwVersion, &m_bPlatformId, &bSvcFlags); if (SUCCEEDED(hr)) { m_fTaskInTasksFolder = TRUE; if (fLocal) { m_fSupportsSystemRequired = ResumeTimersSupported(); } else { m_fSupportsSystemRequired = bSvcFlags & SA_DAT_SVCFLAG_RESUME_TIMERS; } } else { // // Default on error (the file doesn't exist or the read failed). // Assume the task is external to the task folder and it exists // on a non-NT machine that doesn't support the system required // flag. // m_fTaskInTasksFolder = FALSE; m_bPlatformId = VER_PLATFORM_WIN32_WINDOWS; m_fSupportsSystemRequired = FALSE; } } //____________________________________________________________________________ //____________________________________________________________________________ //________________ _________________________________________ //________________ class CDlg _________________________________________ //________________ _________________________________________ //____________________________________________________________________________ //____________________________________________________________________________ INT_PTR CDlg::RealDlgProc( UINT uMsg, WPARAM wParam, LPARAM lParam) { return(FALSE); } INT_PTR CALLBACK CDlg::DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CDlg *pThis = (CDlg *)GetWindowLongPtr(hDlg, DWLP_USER); if (uMsg == WM_INITDIALOG) { pThis = (CDlg *)lParam; pThis->m_hDlg = hDlg; SetWindowLongPtr(hDlg, DWLP_USER, lParam); } if (pThis != NULL) { return pThis->RealDlgProc(uMsg, wParam, lParam); } else { return DefWindowProc(hDlg, uMsg, wParam, lParam); } } INT_PTR CDlg::DoModal( UINT idRes, HWND hParent) { return(DialogBoxParam(g_hInstance, MAKEINTRESOURCE(idRes), hParent, DlgProc, (LPARAM)this)); } HWND CDlg::DoModeless( UINT idRes, HWND hParent) { return(CreateDialogParam(g_hInstance, MAKEINTRESOURCE(idRes), hParent, DlgProc, (LPARAM)this)); }