370 lines
8 KiB
C++
370 lines
8 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
BOOL 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,
|
||
|
(DLGPROC)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
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
BOOL 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,
|
||
|
(DLGPROC)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);
|
||
|
}
|
||
|
}
|