DIALOGS.C

/***************************************************************************** 
*
* Dialogs.c - This module handles the Menu and Dialog user interactions.
*
* Microsoft Confidential
* Copyright 1992 - 1998 Microsoft Corporation
*
****************************************************************************/

#include <stdio.h>
#include <wchar.h> // for swscanf

#include "perfmon.h"
#include "perfmops.h" // for ConvertDecimalPoint

#include "alert.h" // for SetAlertTimer, AlertData
#include "graph.h"
#include "cderr.h"
#include "utils.h"
#include "playback.h" // for PlayingBackLog
#include "grafdisp.h" // for ToggleGraphRefresh
#include "pmhelpid.h" // Help IDs


BOOL LocalManualRefresh ;


/***************************************************************************/
BOOL FAR PASCAL GraphOptionDlg(HWND hDlg, WORD msg, DWORD wParam, LONG lParam)
/***************************************************************************/
{
static GRAPH_OPTIONS goLocalCopy ;

INT iTimeMilliseconds ;
TCHAR szBuff[MiscTextLen] ;
PGRAPHSTRUCT lgraph;

lParam ;
lgraph = pGraphs;

switch(msg)
{

case WM_INITDIALOG:

dwCurrentDlgID = HC_PM_idDlgOptionChart ;

// Init the Radio button, Check boxes and text fields.

goLocalCopy.iGraphOrHistogram =
lgraph->gOptions.iGraphOrHistogram ;
if (lgraph->gOptions.iGraphOrHistogram == LINE_GRAPH)
CheckRadioButton(hDlg, ID_GRAPH, ID_HISTOGRAM, ID_GRAPH) ;
else
CheckRadioButton(hDlg, ID_GRAPH, ID_HISTOGRAM, ID_HISTOGRAM) ;

CheckDlgButton(hDlg, ID_LEGEND, lgraph->gOptions.bLegendChecked) ;
if (!(lgraph->gOptions.bLegendChecked))
{
// can't display valuebar w/o legend
DialogEnable (hDlg, IDD_CHARTOPTIONSVALUEBAR, FALSE) ;
}

CheckDlgButton(hDlg, ID_LABELS, lgraph->gOptions.bLabelsChecked) ;
CheckDlgButton(hDlg, ID_VERT_GRID, lgraph->gOptions.bVertGridChecked) ;
CheckDlgButton(hDlg, ID_HORZ_GRID, lgraph->gOptions.bHorzGridChecked) ;
CheckDlgButton(hDlg, IDD_CHARTOPTIONSVALUEBAR,
lgraph->gOptions.bStatusBarChecked) ;

TSPRINTF(szBuff, TEXT("%d"), lgraph->gOptions.iVertMax) ;
SendDlgItemMessage(hDlg, ID_VERT_MAX, WM_SETTEXT, 0, (LONG) szBuff) ;

TSPRINTF(szBuff, TEXT("%3.3f"), lgraph->gOptions.eTimeInterval) ;
ConvertDecimalPoint (szBuff) ;
SendDlgItemMessage(hDlg, IDD_CHARTOPTIONSINTERVAL, WM_SETTEXT, 0, (LONG) szBuff) ;

// Pickup a local copy of the Graph Options.

goLocalCopy = lgraph->gOptions ;
LocalManualRefresh = lgraph->bManualRefresh ;

if (PlayingBackLog())
{
DialogEnable (hDlg, IDD_CHARTOPTIONSPERIODIC, FALSE) ;
DialogEnable (hDlg, IDD_CHARTOPTIONSUPDATETEXT, FALSE) ;
DialogEnable (hDlg, IDD_CHARTOPTIONSMANUALREFRESH, FALSE) ;
}
else
{
CheckRadioButton (hDlg,
IDD_CHARTOPTIONSMANUALREFRESH,
IDD_CHARTOPTIONSPERIODIC,
LocalManualRefresh ? IDD_CHARTOPTIONSMANUALREFRESH :
IDD_CHARTOPTIONSPERIODIC) ;
}

if (lgraph->bManualRefresh || PlayingBackLog())
{
DialogEnable (hDlg, IDD_CHARTOPTIONSINTERVALTEXT, FALSE) ;
DialogEnable (hDlg, IDD_CHARTOPTIONSINTERVAL, FALSE) ;
}
else
{
DialogEnable (hDlg, IDD_CHARTOPTIONSINTERVALTEXT, TRUE) ;
DialogEnable (hDlg, IDD_CHARTOPTIONSINTERVAL, TRUE) ;
}

EditSetLimit (GetDlgItem(hDlg, ID_VERT_MAX),
sizeof(szBuff) / sizeof(TCHAR) - 1) ;

EditSetLimit (GetDlgItem(hDlg, IDD_CHARTOPTIONSINTERVAL),
ShortTextLen) ;

WindowCenter (hDlg) ;
return(TRUE);

case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_VERT_MAX:
if (HIWORD(wParam) == EN_CHANGE)
{
DialogText(hDlg, ID_VERT_MAX, szBuff) ;
swscanf(szBuff, TEXT("%d"), &goLocalCopy.iVertMax) ;
}
break ;


case IDD_CHARTOPTIONSINTERVAL:
if (HIWORD(wParam) == EN_CHANGE)
{
goLocalCopy.eTimeInterval =
DialogFloat (hDlg, IDD_CHARTOPTIONSINTERVAL, NULL) ;
}
break ;

case IDD_CHARTOPTIONSPERIODIC:
case IDD_CHARTOPTIONSMANUALREFRESH:
// check if the Manual refresh is currently checked.
// Then toggle the ManualRefresh button
LocalManualRefresh =
(LOWORD(wParam) == IDD_CHARTOPTIONSMANUALREFRESH) ;

CheckRadioButton (hDlg,
IDD_CHARTOPTIONSMANUALREFRESH,
IDD_CHARTOPTIONSPERIODIC,
LocalManualRefresh ? IDD_CHARTOPTIONSMANUALREFRESH :
IDD_CHARTOPTIONSPERIODIC) ;

// gray out time interval if necessary...
DialogEnable (hDlg, IDD_CHARTOPTIONSINTERVALTEXT,
!LocalManualRefresh) ;
DialogEnable (hDlg, IDD_CHARTOPTIONSINTERVAL,
!LocalManualRefresh) ;
break ;

case IDD_CHARTOPTIONSVALUEBAR:
if (goLocalCopy.bStatusBarChecked == TRUE)
goLocalCopy.bStatusBarChecked = FALSE ;
else
goLocalCopy.bStatusBarChecked = TRUE ;
break ;


case ID_LEGEND:
if (goLocalCopy.bLegendChecked == TRUE)
goLocalCopy.bLegendChecked = FALSE ;
else
goLocalCopy.bLegendChecked = TRUE ;

DialogEnable (hDlg, IDD_CHARTOPTIONSVALUEBAR,
goLocalCopy.bLegendChecked) ;

break ;


case ID_LABELS:
if (goLocalCopy.bLabelsChecked == TRUE)
goLocalCopy.bLabelsChecked = FALSE ;
else
goLocalCopy.bLabelsChecked = TRUE ;
break ;


case ID_VERT_GRID:
if (goLocalCopy.bVertGridChecked == TRUE)
goLocalCopy.bVertGridChecked = FALSE ;
else
goLocalCopy.bVertGridChecked = TRUE ;
break ;


case ID_HORZ_GRID:
if (goLocalCopy.bHorzGridChecked == TRUE)
goLocalCopy.bHorzGridChecked = FALSE ;
else
goLocalCopy.bHorzGridChecked = TRUE ;
break ;


case ID_GRAPH:
case ID_HISTOGRAM:
if (LOWORD(wParam) == ID_GRAPH)
{
goLocalCopy.iGraphOrHistogram = LINE_GRAPH ;
}
else
{
goLocalCopy.iGraphOrHistogram = BAR_GRAPH ;
}
CheckRadioButton(hDlg, ID_GRAPH, ID_HISTOGRAM,
goLocalCopy.iGraphOrHistogram == LINE_GRAPH ?
ID_GRAPH : ID_HISTOGRAM) ;

break ;

case IDOK:
// verify some numeric entries first
if (goLocalCopy.iVertMax > MAX_VERTICAL ||
goLocalCopy.iVertMax < MIN_VERTICAL)
{
DlgErrorBox (hDlg, ERR_BADVERTMAX) ;
SetFocus (DialogControl (hDlg, ID_VERT_MAX)) ;
EditSetTextEndPos (hDlg, ID_VERT_MAX) ;
return (FALSE) ;
break ;
}
if (goLocalCopy.eTimeInterval > MAX_INTERVALSEC ||
goLocalCopy.eTimeInterval < MIN_INTERVALSEC)
{
DlgErrorBox (hDlg, ERR_BADTIMEINTERVAL) ;
SetFocus (DialogControl (hDlg, IDD_CHARTOPTIONSINTERVAL)) ;
EditSetTextEndPos (hDlg, IDD_CHARTOPTIONSINTERVAL) ;
return (FALSE) ;
break ;
}

// We need to send a size message to the main window
// so it can setup the redraw of the graph and legend.

lgraph->gOptions.bLegendChecked = goLocalCopy.bLegendChecked ;
lgraph->gOptions.bStatusBarChecked = goLocalCopy.bStatusBarChecked ;

if (lgraph->gOptions.eTimeInterval != goLocalCopy.eTimeInterval
&& !LocalManualRefresh)
{
iTimeMilliseconds = (INT) (goLocalCopy.eTimeInterval * (FLOAT) 1000.0) ;
pGraphs->gInterval = iTimeMilliseconds ;
if (!PlayingBackLog())
{
SetGraphTimer(pGraphs) ;
}
lgraph->bManualRefresh = LocalManualRefresh ;

}
else if (LocalManualRefresh != lgraph->bManualRefresh)
{
ToggleGraphRefresh (hWndGraph) ;
}
// Assign the local copy of the graph options to the
// global copy.

lgraph->gOptions = goLocalCopy ;

SizeGraphComponents (hWndGraph) ;
WindowInvalidate (hWndGraph) ;
dwCurrentDlgID = 0 ;
EndDialog (hDlg, 1) ;
return (TRUE) ;
break ;


case IDCANCEL:
dwCurrentDlgID = 0 ;
EndDialog(hDlg,0);
return(TRUE);

case ID_HELP:
CallWinHelp (dwCurrentDlgID) ;
break ;

default:
break;
}
break;

default:
break;

}
return(FALSE);
}




DWORD iIntervalMSecs ;

void static OnAlertOptionDlgInit (HWND hDlg, PALERT pAlert)
{
BOOL EnableFlag ;

iIntervalMSecs = pAlert->iIntervalMSecs ;

LocalManualRefresh = pAlert->bManualRefresh ;

if (PlayingBackLog())
{
// When playingback log, disable all controls except
// the alert interval
//
EnableFlag = TRUE ;
DialogEnable (hDlg, IDD_ALERTOPTIONSMANUALREFRESH, FALSE) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSPOPUP, FALSE) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSNETWORKALERT, FALSE) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSNETGROUPTEXT, FALSE) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSMSGNAME, FALSE) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSMSGNAMETEXT, FALSE) ;
}
else
{
EnableFlag = !LocalManualRefresh ;
DialogEnable (hDlg, IDD_ALERTOPTIONSMSGNAME, pAlert->bNetworkAlert) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSMSGNAMETEXT, pAlert->bNetworkAlert) ;
}

// setup the Update time interval group items
DialogSetInterval (hDlg, IDD_ALERTOPTIONSINTERVAL, iIntervalMSecs) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSINTERVAL, EnableFlag) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSINTERVALTEXT, EnableFlag) ;
CheckRadioButton(hDlg, IDD_ALERTOPTIONSMANUALREFRESH,
IDD_ALERTOPTIONSPERIODIC,
!EnableFlag ? IDD_ALERTOPTIONSMANUALREFRESH : IDD_ALERTOPTIONSPERIODIC) ;

CheckDlgButton (hDlg, IDD_ALERTOPTIONSEVENTLOG, pAlert->bEventLog) ;
CheckDlgButton (hDlg, IDD_ALERTOPTIONSPOPUP, pAlert->bSwitchToAlert) ;
CheckDlgButton (hDlg, IDD_ALERTOPTIONSNETWORKALERT, pAlert->bNetworkAlert) ;

if (pAlert->MessageName[0])
{
DialogSetString (hDlg, IDD_ALERTOPTIONSMSGNAME, pAlert->MessageName) ;
}

EditSetLimit (GetDlgItem(hDlg, IDD_ALERTOPTIONSMSGNAME),
sizeof(pAlert->MessageName)/sizeof(TCHAR) - 1) ;

dwCurrentDlgID = HC_PM_idDlgOptionAlert ;

WindowCenter (hDlg) ;

} // OnAlertOptionDlgInit

BOOL FAR PASCAL AlertOptionDlg (HWND hDlg, WORD msg,
DWORD wParam, LONG lParam)
{

PALERT pAlert ;

switch(msg)
{

case WM_INITDIALOG:
pAlert = (PALERT) lParam ;
OnAlertOptionDlgInit (hDlg, pAlert) ;
return(TRUE);

case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
{
FLOAT eTimeInterval ;

pAlert = AlertData (hWndAlert) ;

eTimeInterval = DialogFloat (hDlg, IDD_ALERTOPTIONSINTERVAL, NULL) ;

if (eTimeInterval > MAX_INTERVALSEC ||
eTimeInterval < MIN_INTERVALSEC)
{
DlgErrorBox (hDlg, ERR_BADTIMEINTERVAL) ;
SetFocus (DialogControl (hDlg, IDD_ALERTOPTIONSINTERVAL)) ;
EditSetTextEndPos (hDlg, IDD_ALERTOPTIONSINTERVAL) ;
return (FALSE) ;
break ;
}

eTimeInterval = eTimeInterval * (FLOAT) 1000.0 +
(FLOAT) 0.5 ;

iIntervalMSecs = (DWORD) eTimeInterval ;

pAlert->bNetworkAlert =
IsDlgButtonChecked (hDlg, IDD_ALERTOPTIONSNETWORKALERT) ;

pAlert->bSwitchToAlert =
IsDlgButtonChecked (hDlg, IDD_ALERTOPTIONSPOPUP) ;

pAlert->bEventLog =
IsDlgButtonChecked (hDlg, IDD_ALERTOPTIONSEVENTLOG) ;



if (!PlayingBackLog())
{
DialogText (hDlg,
IDD_ALERTOPTIONSMSGNAME,
pAlert->MessageName) ;
}

dwCurrentDlgID = 0 ;
EndDialog (hDlg, 1) ;
}
break ;

case IDCANCEL:
dwCurrentDlgID = 0 ;
EndDialog(hDlg,0);
return(TRUE);

case IDD_ALERTOPTIONSPERIODIC:
case IDD_ALERTOPTIONSMANUALREFRESH:

if (!PlayingBackLog())
{
// check if the Manual refresh is currently checked.
// Then toggle the ManualRefresh button
LocalManualRefresh =
(LOWORD(wParam) == IDD_ALERTOPTIONSMANUALREFRESH) ;

CheckRadioButton(hDlg,
IDD_ALERTOPTIONSMANUALREFRESH,
IDD_ALERTOPTIONSPERIODIC,
LocalManualRefresh ? IDD_ALERTOPTIONSMANUALREFRESH :
IDD_ALERTOPTIONSPERIODIC) ;

DialogEnable (hDlg,
IDD_ALERTOPTIONSINTERVAL,
!LocalManualRefresh) ;

DialogEnable (hDlg,
IDD_ALERTOPTIONSINTERVALTEXT,
!LocalManualRefresh) ;
}

break ;
#if 0
case IDD_ALERTOPTIONSPOPUP:
bSwitchToAlert = !bSwitchToAlert ;
CheckDlgButton (hDlg, IDD_ALERTOPTIONSPOPUP, bSwitchToAlert) ;
break;
#endif

case IDD_ALERTOPTIONSNETWORKALERT:
{
BOOL bNetworkAlert ;

bNetworkAlert =
IsDlgButtonChecked (hDlg, IDD_ALERTOPTIONSNETWORKALERT) ;

DialogEnable (hDlg, IDD_ALERTOPTIONSMSGNAME, bNetworkAlert) ;
DialogEnable (hDlg, IDD_ALERTOPTIONSMSGNAMETEXT, bNetworkAlert) ;

if (bNetworkAlert)
{
SetFocus (GetDlgItem(hDlg, IDD_ALERTOPTIONSMSGNAME)) ;
SendDlgItemMessage(hDlg, IDD_ALERTOPTIONSMSGNAME,
EM_SETSEL, 0, 16) ;
}
}
break;

case IDD_DISPLAYHELP:
CallWinHelp (dwCurrentDlgID) ;
break ;

default:
break;
}
break;


default:
break;

}

return (FALSE);
} // AlertOptionDlg


BOOL DisplayAlertOptions (HWND hWndParent,
HWND hWndAlert)
{ // DisplayAlertOptions
PALERT pAlert ;

pAlert = AlertData (hWndParent) ;

if (DialogBoxParam (hInstance, idDlgAlertOptions,
hWndParent, (DLGPROC) AlertOptionDlg,
(LPARAM) pAlert))
{ // if

if (pAlert->bNetworkAlert && pAlert->hNetAlertThread == 0)
{
AlertCreateThread (pAlert) ;
}

if (PlayingBackLog())
{
if (pAlert->iIntervalMSecs != iIntervalMSecs)
{
// a new time interval, re-do the backing back log
// using the new value...
pAlert->iIntervalMSecs = iIntervalMSecs ;
DialogSetInterval (hWndAlert, IDD_ALERTINTERVAL, iIntervalMSecs) ;
if (pAlert->pLineFirst)
{
PlaybackAlert (hWndAlert, 0) ;
WindowInvalidate (hWndAlert) ;
}
}
}
else if (LocalManualRefresh != pAlert->bManualRefresh)
{
if (!LocalManualRefresh)
{
pAlert->iIntervalMSecs = iIntervalMSecs ;
DialogSetInterval (hWndAlert, IDD_ALERTINTERVAL, iIntervalMSecs) ;
}
ToggleAlertRefresh (hWndAlert) ;
}
else if (!LocalManualRefresh)
{
pAlert->iIntervalMSecs = iIntervalMSecs ;
SetAlertTimer (pAlert) ;
DialogSetInterval (hWndAlert, IDD_ALERTINTERVAL, iIntervalMSecs) ;
}
} // if

return (TRUE) ;
} // DisplayAlertOptions