Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

421 lines
11 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993.
//
// File: debugui.cxx
//
// Contents: User interface for trace tags dialog
//
// History: ??
// 10-08-93 ErikGav New UI
// 10-20-93 ErikGav Unicode cleanup
//
//----------------------------------------------------------------------------
#include <headers.h>
#if _DEBUG
#include "resource.h"
// private typedefs
typedef int TMC;
// private function prototypes
void DoTracePointsDialog(BOOL fWait);
VOID EndButton(HWND hwndDlg, TMC tmc, BOOL fDirty);
WORD TagFromSelection(HWND hwndDlg, TMC tmc);
BOOL CALLBACK DlgTraceEtc(HWND hwndDlg, UINT wm, WPARAM wparam, LPARAM lparam);
// Debug UI Globals
//
// Identifies the type of TAG with which the current modal dialog is
// dealing.
//
static BOOL fDirtyDlg;
//+-------------------------------------------------------------------------
//
// Function: TraceTagDlgThread
//
// Synopsis: Thread entry point for trace tag dialog. Keeps caller
// of DoTracePointsDialog from blocking.
//
//--------------------------------------------------------------------------
DWORD
TraceTagDlgThread(void * pv)
{
INT_PTR r;
r = DialogBoxA(g_hinstMain, "TRCAST", g_hwndMain, (DLGPROC)DlgTraceEtc);
if (r == -1)
{
MessageBoxA(NULL, "Couldn't create trace tag dialog", "Error",
MB_OK | MB_ICONSTOP);
}
return (DWORD) r;
}
//+---------------------------------------------------------------------------
//
// Function: DoTracePointsDialog
//
// Synopsis: Brings up and processes trace points dialog. Any changes
// made by the user are copied to the current debug state.
//
// Arguments: [fWait] -- If TRUE, this function will not return until the
// dialog has been closed.
//
//----------------------------------------------------------------------------
void
DoTracePointsDialog( BOOL fWait )
{
HANDLE hThread = NULL;
#ifndef _MAC
DWORD idThread;
#endif
if (!g_fInit)
{
OutputDebugString(_T("DoTracePointsDialog: Debug library not initialized"));
return;
}
if (fWait)
{
TraceTagDlgThread(NULL);
}
else
{
#ifndef _MAC
hThread = CreateThread(NULL, 0, (unsigned long (__stdcall *)(void *)) TraceTagDlgThread, NULL, 0, &idThread);
#else
#pragma message(" DEBUGUI.cxx CreateThread")
Assert (0 && " DEBUGUI.cxx CreateThread");
#endif
if (hThread == NULL)
{
MessageBox(NULL,
_T("Couldn't create trace tag dialog thread"),
_T("Error"),
MB_OK | MB_ICONSTOP);
}
#ifndef _MAC
else
{
CloseHandle(hThread);
}
#endif
}
}
/*
* FFillDebugListbox
*
* Purpose:
* Initializes Windows debug listboxes by adding the correct strings
* to the listbox for the current dialog type. This is only called
* once in the Windows interface when the dialog is initialized.
*
* Parameters:
* hwndDlg Handle to parent dialog box.
*
* Returns:
* TRUE if function is successful, FALSE otherwise.
*/
BOOL CALLBACK
FFillDebugListbox(HWND hwndDlg)
{
TAG tag;
LRESULT lresult;
TGRC * ptgrc;
HWND hwndListbox;
CHAR rgch[80];
HFONT hFont;
// Get the listbox handle
hwndListbox = GetDlgItem(hwndDlg, tmcListbox);
Assert(hwndListbox);
// Make sure it's clean
SendMessageA(hwndListbox, CB_RESETCONTENT, 0, 0);
hFont = (HFONT) GetStockObject(SYSTEM_FIXED_FONT);
SendMessage(hwndListbox, WM_SETFONT, (WPARAM) hFont, FALSE);
DeleteObject(hFont);
// Enter strings into the listbox-check all tags.
for (tag = tagMin; tag < tagMac; tag++)
{
// If tag is of correct type, enter the string for it.
if (mptagtgrc[tag].TestFlag(TGRC_FLAG_VALID))
{
ptgrc = mptagtgrc + tag;
#if 0 // old format
_snprintf(rgch, sizeof(rgch), "%d : %s %s",
tag, ptgrc->szOwner, ptgrc->szDescrip);
#endif
_snprintf(rgch, sizeof(rgch), "%-17.17s %s",
ptgrc->szOwner, ptgrc->szDescrip);
lresult = SendMessageA(hwndListbox, CB_ADDSTRING,
0, (DWORD_PTR)(LPVOID)rgch);
if (lresult == CB_ERR || lresult == CB_ERRSPACE)
return FALSE;
lresult = SendMessageA(
hwndListbox, CB_SETITEMDATA, lresult, tag);
if (lresult == CB_ERR || lresult == CB_ERRSPACE)
return FALSE;
}
}
return TRUE;
}
/*
* FDlgTraceEtc
*
* Purpose:
* Dialog procedure for Trace Points and Asserts dialogs.
* Keeps the state of the checkboxes identical to
* the state of the currently selected TAG in the listbox.
*
* Parameters:
* hwndDlg Handle to dialog window
* wm SDM dialog message
* wparam
* lparam Long parameter
*
* Returns:
* TRUE if the function processed this message, FALSE if not.
*/
BOOL CALLBACK
DlgTraceEtc(HWND hwndDlg, UINT wm, WPARAM wparam, LPARAM lparam)
{
TAG tag;
TGRC * ptgrc;
DWORD wNew;
BOOL fEnable; // enable all
TGRC_FLAG tf;
BOOL fTrace;
HWND hwndListBox;
char szTitle[MAX_PATH];
switch (wm)
{
default:
return FALSE;
break;
case WM_INITDIALOG:
fDirtyDlg = FALSE;
if (!FFillDebugListbox(hwndDlg))
{
MessageBoxA(hwndDlg,
"Error initializing listbox. Cannot display dialog.",
"Trace/Assert Dialog", MB_OK);
EndButton(hwndDlg, 0, FALSE);
break;
}
GetModuleFileNameA(NULL, szTitle, MAX_PATH);
SetWindowText(hwndDlg, szTitle);
hwndListBox = GetDlgItem(hwndDlg, tmcListbox);
Assert(hwndListBox);
SendMessage(hwndListBox, CB_SETCURSEL, 0, 0);
SendMessage(
hwndDlg,
WM_COMMAND,
MAKELONG(tmcListbox, CBN_SELCHANGE),
(LPARAM) hwndListBox);
SetForegroundWindow(hwndDlg);
break;
case WM_COMMAND:
switch (LOWORD(wparam))
{
case tmcOk:
case tmcCancel:
EndButton(hwndDlg, LOWORD(wparam), fDirtyDlg);
break;
case tmcEnableAll:
case tmcDisableAll:
fDirtyDlg = TRUE;
fEnable = FALSE;
if (LOWORD(wparam) == tmcEnableAll)
fEnable = TRUE;
for (tag = tagMin; tag < tagMac; tag++)
{
mptagtgrc[tag].fEnabled = fEnable;
}
tag = TagFromSelection(hwndDlg, tmcListbox);
CheckDlgButton(hwndDlg, tmcEnabled, fEnable);
break;
case tmcListbox:
if (HIWORD(wparam) != CBN_SELCHANGE
&& HIWORD(wparam) != CBN_DBLCLK)
break;
fDirtyDlg = TRUE;
tag = TagFromSelection(hwndDlg, tmcListbox);
Assert(tag != tagNull);
ptgrc = mptagtgrc + tag;
if (HIWORD(wparam) == CBN_DBLCLK)
ptgrc->fEnabled = !ptgrc->fEnabled;
CheckDlgButton(hwndDlg, tmcEnabled, ptgrc->fEnabled);
CheckDlgButton(hwndDlg, tmcDisk, ptgrc->TestFlag(TGRC_FLAG_DISK));
CheckDlgButton(hwndDlg, tmcCom1, ptgrc->TestFlag(TGRC_FLAG_COM1));
CheckDlgButton(hwndDlg, tmcBreak, ptgrc->TestFlag(TGRC_FLAG_BREAK));
fTrace = (ptgrc->tgty == tgtyTrace);
EnableWindow(GetDlgItem(hwndDlg, tmcDisk), fTrace);
EnableWindow(GetDlgItem(hwndDlg, tmcCom1), fTrace);
EnableWindow(GetDlgItem(hwndDlg, tmcBreak), fTrace);
break;
case tmcEnabled:
case tmcDisk:
case tmcCom1:
case tmcBreak:
fDirtyDlg = TRUE;
tag = TagFromSelection(hwndDlg, tmcListbox);
ptgrc = mptagtgrc + tag;
wNew = IsDlgButtonChecked(hwndDlg, LOWORD(wparam));
if (LOWORD(wparam) == tmcEnabled)
{
ptgrc->fEnabled = wNew;
}
else
{
switch (LOWORD(wparam))
{
case tmcDisk:
tf = TGRC_FLAG_DISK;
break;
case tmcCom1:
tf = TGRC_FLAG_COM1;
break;
case tmcBreak:
tf = TGRC_FLAG_BREAK;
break;
default:
Assert(0 && "Logic error in DlgTraceEtc");
tf = (TGRC_FLAG) 0;
break;
}
ptgrc->SetFlagValue(tf, wNew);
}
}
break;
}
return TRUE;
}
/*
* EndButton
*
* Purpose:
* Does necessary processing when either OK or Cancel is pressed in
* any of the debug dialogs. If OK is pressed, the debug state is
* saved if dirty. If Cancel is hit, the debug state is restored if
* dirty.
*
* In Windows, the EndDialog function must also be called.
*
* Parameters:
* tmc tmc of the button pressed, either tmcOk or tmcCancel.
* fDirty indicates if the debug state has been modified.
*/
void
EndButton(HWND hwndDlg, TMC tmc, BOOL fDirty)
{
HCURSOR hCursor;
if (fDirty)
{
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowCursor(TRUE);
if (tmc == tmcOk)
SaveDefaultDebugState();
else
RestoreDefaultDebugState();
ShowCursor(FALSE);
SetCursor(hCursor);
}
EndDialog(hwndDlg, tmc == tmcOk);
return;
}
/*
* TagFromSelection
*
* Purpose:
* Isolation function for dialog procedures to eliminate a bunch of
* ifdef's everytime the index of the selection in the current listbox
* is requried.
*
* Parameters:
* tmc ID value of the listbox.
*
* Returns:
* ctag for the currently selected listbox item.
*/
WORD
TagFromSelection(HWND hwndDlg, TMC tmc)
{
HWND hwndListbox;
LRESULT lresult;
hwndListbox = GetDlgItem(hwndDlg, tmcListbox);
Assert(hwndListbox);
lresult = SendMessageA(hwndListbox, CB_GETCURSEL, 0, 0);
Assert(lresult >= 0);
lresult = SendMessageA(hwndListbox, CB_GETITEMDATA, lresult, 0);
Assert(tagMin <= lresult && lresult < tagMac);
return (WORD) lresult;
}
#endif // _DEBUG