|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995
//
// File: dialogs.cxx
//
// Contents: Implementation of dialog classes
//
//----------------------------------------------------------------------------
#include "headers.hxx"
//+---------------------------------------------------------------------------
//
// Function: ConfigDlgProc
//
// Synopsis: Handles the Config dialog
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK ConfigDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { CConfig * pConfig;
pConfig = (CConfig *)GetWindowLong(hwnd, DWL_USER);
switch (msg) { case WM_INITDIALOG: pConfig = (CConfig*)lParam; SetWindowLong(hwnd, DWL_USER, lParam);
pConfig->InitializeConfigDialog(hwnd);
return TRUE;
case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (pConfig->CommitConfigChanges(hwnd)) EndDialog(hwnd, 0); break;
case IDCANCEL: EndDialog(hwnd, 1); break; }
return TRUE; }
return FALSE; }
HRESULT CConfig::QueryInterface(REFIID iid, void **ppvObj) { VERIFY_THREAD();
if (iid == IID_IUnknown) { *ppvObj = (IUnknown *)this; } else { *ppvObj = NULL; return E_NOINTERFACE; }
((IUnknown *)*ppvObj)->AddRef(); return S_OK; }
DWORD CConfig::ThreadMain() { AddRef();
SetName("Config");
ThreadStarted(S_OK); // Must be after the AddRef() call!
int ret = DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_CONFIGPATHS), NULL, ConfigDlgProc, (LPARAM)this); if (ret == -1) { ErrorPopup(L"Could not bring up config dialog"); }
Release();
return 0; }
void CConfig::InitializeConfigDialog(HWND hwnd) { CStr cstr; CStr cstrInit;
_hwnd = hwnd;
_pMT->_options.GetScriptPath(&cstr); _pMT->_options.GetInitScript(&cstrInit);
SetDlgItemText(hwnd, IDD_SCRIPTPATH, cstr); SetDlgItemText(hwnd, IDD_INITSCRIPT, cstrInit); }
BOOL CConfig::CommitConfigChanges(HWND hwnd) { LOCK_LOCALS(_pMT);
CStr cstr;
TCHAR achBufPath[MAX_PATH]; TCHAR achBufScript[MAX_PATH];
// Read in the options from the dialog and store them. Need to have a
// way to revert to defaults. Right now the user can revert to the
// defaults by clearing the textbox(s) and clicking OK.
GetDlgItemText(hwnd, IDD_SCRIPTPATH, achBufPath, sizeof(achBufPath)); GetDlgItemText(hwnd, IDD_INITSCRIPT, achBufScript, sizeof(achBufScript)); EnableWindow(_hwnd, FALSE); BOOL retval = _pMT->SetScriptPath(achBufPath, achBufScript); EnableWindow(_hwnd, TRUE); return retval; }
//+---------------------------------------------------------------------------
//
// Function: MBTimeoutDlgProc
//
// Synopsis: Handles the MessageBoxTimeout dialog
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK MBTimeoutDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { CMessageBoxTimeout * pDialog;
pDialog = (CMessageBoxTimeout *)GetWindowLong(hwnd, DWL_USER);
switch (msg) { case WM_INITDIALOG: pDialog = (CMessageBoxTimeout*)lParam; SetWindowLong(hwnd, DWL_USER, lParam);
pDialog->InitializeDialog(hwnd);
return TRUE;
case WM_COMMAND: pDialog->OnCommand(LOWORD(wParam), HIWORD(wParam)); return TRUE;
case WM_TIMER: pDialog->OnTimer(); return TRUE;
case WM_CLOSE: return TRUE;
case WM_DESTROY: pDialog->_hwnd = NULL; break; }
return FALSE; }
HRESULT CMessageBoxTimeout::QueryInterface(REFIID iid, void **ppvObj) { VERIFY_THREAD();
if (iid == IID_IUnknown) { *ppvObj = (IUnknown *)this; } else { *ppvObj = NULL; return E_NOINTERFACE; }
((IUnknown *)*ppvObj)->AddRef(); return S_OK; }
DWORD CMessageBoxTimeout::ThreadMain() { AddRef();
Assert(_pmbt != NULL);
SetName("MsgBoxTO");
ThreadStarted(S_OK); // Must be after the AddRef() call!
int ret = DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_MESSAGEBOX), NULL, MBTimeoutDlgProc, (LPARAM)this); if (ret == -1) { _pmbt->mbts = MBTS_ERROR; } else { _pmbt->mbts = (MBT_SELECT)ret; }
SetEvent(_pmbt->hEvent);
Release();
return 0; }
void CMessageBoxTimeout::InitializeDialog(HWND hwnd) { CStr cstrButtons; TCHAR *pch = NULL; int i;
_hwnd = hwnd;
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
cstrButtons.Set(_pmbt->bstrButtonText);
SetDlgItemText(hwnd, IDD_MESSAGE, _pmbt->bstrMessage);
for (i = 5; i > 0; i--) { pch = (i == 1) ? cstrButtons : _tcsrchr(cstrButtons, L',');
if (pch && i != 1) // Skip the comma
pch++;
if (_pmbt->cButtons >= i && pch) { SetDlgItemText(hwnd, IDD_BUTTON1+i-1, pch);
if (i > 1) *(pch-1) = L'\0'; } else { ShowWindow(GetDlgItem(hwnd, IDD_BUTTON1+i-1), SW_HIDE); } }
if (_pmbt->lTimeout == 0) { ShowWindow(GetDlgItem(hwnd, IDD_TIMEMSG), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDD_TIME), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDD_CANCELCOUNT), SW_HIDE); } else { TCHAR achBuf[30];
if (!_pmbt->fCanCancel) EnableWindow(GetDlgItem(hwnd, IDD_CANCELCOUNT), FALSE);
_lSecondsTilCancel = _pmbt->lTimeout * 60; _lSecondsTilNextEvent = _pmbt->lEventInterval * 60;
wsprintf(achBuf, L"%01d:%02d", _lSecondsTilCancel / 60, _lSecondsTilCancel % 60);
SetDlgItemText(hwnd, IDD_TIME, achBuf);
// Setup a 1 second timer
SetTimer(hwnd, 1, 1000, NULL); } }
void CMessageBoxTimeout::OnCommand(USHORT id, USHORT wNotify) { switch (id) { case IDD_BUTTON1: case IDD_BUTTON2: case IDD_BUTTON3: case IDD_BUTTON4: case IDD_BUTTON5: if (_pmbt->fConfirm) { TCHAR achBuf[100]; TCHAR achText[100];
GetDlgItemText(_hwnd, id, achText, 100);
wsprintf(achBuf, L"Click OK to confirm your choice of '%s'", achText);
if (MessageBox(_hwnd, achBuf, L"Gauntlet", MB_OKCANCEL | MB_SETFOREGROUND) == IDCANCEL) { break; } } KillTimer(_hwnd, 1); EndDialog(_hwnd, id-IDD_BUTTON1+MBTS_BUTTON1); break;
case IDD_CANCELCOUNT: KillTimer(_hwnd, 1); SetDlgItemText(_hwnd, IDD_TIME, L""); SetDlgItemText(_hwnd, IDD_TIMEMSG, L"The countdown has been canceled."); EnableWindow(GetDlgItem(_hwnd, IDD_CANCELCOUNT), FALSE); break; } }
void CMessageBoxTimeout::OnTimer() { TCHAR achBuf[30];
_lSecondsTilCancel--; _lSecondsTilNextEvent--;
wsprintf(achBuf, L"%01d:%02d", _lSecondsTilCancel / 60, _lSecondsTilCancel % 60);
SetDlgItemText(_hwnd, IDD_TIME, achBuf);
if (_lSecondsTilCancel <= 0) { KillTimer(_hwnd, 1);
EndDialog(_hwnd, MBTS_TIMEOUT);
return; }
if (_lSecondsTilNextEvent <= 0 && _pmbt->lEventInterval != 0) { _pmbt->mbts = MBTS_INTERVAL;
SetEvent(_pmbt->hEvent);
_lSecondsTilNextEvent = _pmbt->lEventInterval * 60;
// If we're minimized, unminimize to remind that we're still there.
ShowWindow(_hwnd, SW_SHOWNORMAL); } }
|