Annotation of mstools/samples/sdktools/perfmon/addline.c, revision 1.1.1.1

1.1       root        1: //==========================================================================//
                      2: //                                  Includes                                //
                      3: //==========================================================================//
                      4: 
                      5: 
                      6: 
                      7: #include <stdio.h>
                      8: #include <math.h>
                      9: 
                     10: #include "perfmon.h"
                     11: #include "addline.h"
                     12: 
                     13: #include "alert.h"      // for AlertInsertLine, AlertDeleteLine
                     14: #include "grafdata.h"   // for ChartInsertLine, ChartDeleteLine
                     15: #include "graph.h"      // for SizeGraphComponents
                     16: #include "legend.h"     // for LegendAddItem
                     17: #include "line.h"       // for LineAllocate, LineFree.
                     18: #include "pmemory.h"    // for MemoryXXX (mallloc-type) routines
                     19: #include "perfdata.h"   // for QueryPerformanceData
                     20: #include "perfmops.h"   // for dlg_error_box
                     21: #include "playback.h"   // for PlaybackLines
                     22: #include "report.h"     // for ReportInsertLine, ReportDeleteLine
                     23: #include "system.h"     // for SystemGet
                     24: #include "utils.h"
                     25: #include "playback.h"   // for PlayingBackLog
                     26: #include "counters.h"
                     27: #include "pmhelpid.h"   // Help IDs
                     28: 
                     29: //==========================================================================//
                     30: //                                  Constants                               //
                     31: //==========================================================================//
                     32: 
                     33: 
                     34: #ifdef ADVANCED_PERFMON
                     35: #define ADDLINEDETAILLEVEL    PERF_DETAIL_WIZARD
                     36: #else
                     37: #define ADDLINEDETAILLEVEL    PERF_DETAIL_NOVICE
                     38: #endif
                     39: 
                     40: #define iInitialExplainLen    256
                     41: 
                     42: // defines used in owner-drawn items
                     43: #define OWNER_DRAWN_ITEM      2
                     44: #define OWNER_DRAW_FOCUS      1
                     45: 
                     46: //==========================================================================//
                     47: //                                Local Data                                //
                     48: //==========================================================================//
                     49: 
                     50: // defined in PerfData.c
                     51: extern WCHAR   NULL_NAME[] ;
                     52: 
                     53: 
                     54: COLORREF argbColors[] = 
                     55:    {
                     56:    RGB (0xff, 0x00, 0x00), 
                     57:    RGB (0x00, 0x80, 0x00), 
                     58:    RGB (0x00, 0x00, 0xff), 
                     59:    RGB (0xff, 0xff, 0x00), 
                     60:    RGB (0xff, 0x00, 0xff), 
                     61:    RGB (0x00, 0xff, 0xff), 
                     62:    RGB (0x80, 0x00, 0x00), 
                     63:    RGB (0x40, 0x40, 0x40), 
                     64:    RGB (0x00, 0x00, 0x80), 
                     65:    RGB (0x80, 0x80, 0x00), 
                     66:    RGB (0x80, 0x00, 0x80), 
                     67:    RGB (0x00, 0x80, 0x80), 
                     68:    RGB (0x40, 0x00, 0x00), 
                     69:    RGB (0x00, 0x40, 0x00), 
                     70:    RGB (0x00, 0x00, 0x40), 
                     71:    RGB (0x00, 0x00, 0x00)
                     72:    } ;
                     73: 
                     74: 
                     75: TCHAR *apszScaleFmt[] =
                     76:    {
                     77:    TEXT("%6.6f"),
                     78:    TEXT("%5.5f"),
                     79:    TEXT("%4.4f"),
                     80:    TEXT("%3.3f"),
                     81:    TEXT("%2.2f"),
                     82:    TEXT("%1.1f"),
                     83:    TEXT("%2.1f"),
                     84:    TEXT("%3.1f"),
                     85:    TEXT("%4.1f"),
                     86:    TEXT("%5.1f"),
                     87:    TEXT("%6.1f"),
                     88:    TEXT("%7.1f")
                     89:    } ;
                     90: #define DEFAULT_SCALE 0
                     91: #define NUMBER_OF_SCALE sizeof(apszScaleFmt)/sizeof(apszScaleFmt[0])
                     92: 
                     93: int               iLineType ;
                     94: static PPERFDATA  pPerfData ;
                     95: PPERFSYSTEM       pSystem ;
                     96: PLINESTRUCT       pLineEdit ;
                     97: PPERFSYSTEM       *ppSystemFirst ;
                     98: PLINEVISUAL       pVisual ;
                     99: 
                    100: #define bEditLine (pLineEdit != NULL)
                    101: 
                    102: 
                    103: BOOL              ComputerChange ;
                    104: 
                    105: //=============================//
                    106: // Alert-related locals        //
                    107: //=============================//
                    108: 
                    109: 
                    110: BOOL           bAlertOver ;         // over or under?
                    111: FLOAT          eAlertValue ;        // value to compare
                    112: BOOL           bEveryTime ;         // run every time or once?
                    113: 
                    114: // program to run; 
                    115: LPTSTR          pszAlertProgram ;  
                    116: 
                    117: 
                    118: //==========================================================================//
                    119: //                                   Macros                                 //
                    120: //==========================================================================//
                    121: 
                    122: 
                    123: #define InChartAdd()             \
                    124:    (iLineType == LineTypeChart)
                    125: 
                    126: 
                    127: #define InAlertAdd()             \
                    128:    (iLineType == LineTypeAlert)
                    129: 
                    130: #define InReportAdd()            \
                    131:    (iLineType == LineTypeReport)
                    132: 
                    133: 
                    134: 
                    135: 
                    136: #define NumColorIndexes()     \
                    137:    (sizeof (argbColors) / sizeof (argbColors[0]))
                    138: 
                    139: #define NumWidthIndexes()  5
                    140: 
                    141: #define NumStyleIndexes()  4
                    142: 
                    143: 
                    144: //==========================================================================//
                    145: //                              Forward Declarations                        //
                    146: //==========================================================================//
                    147: 
                    148: BOOL /*static*/ OnObjectChanged (HDLG hDlg) ;
                    149: 
                    150: 
                    151: //==========================================================================//
                    152: //                              Local Functions                             //
                    153: //==========================================================================//
                    154: 
                    155: 
                    156: PPERFINSTANCEDEF ParentInstance (PPERFINSTANCEDEF pInstance)
                    157:    {  // ParentInstance
                    158:    PPERFOBJECT          parent_obj ;
                    159:    PPERFINSTANCEDEF     parent_instance ;
                    160:    PERF_COUNTER_BLOCK   *counter_blk;
                    161:    LONG                 i ;
                    162: 
                    163:    parent_obj = 
                    164:       GetObjectDefByTitleIndex (pPerfData, 
                    165:                                 pInstance->ParentObjectTitleIndex) ;
                    166:    if (!parent_obj)
                    167:       return (NULL) ;
                    168: 
                    169: 
                    170:    // Then get the parent instance.
                    171:    // NOTE: can use unique ID field to match here instead
                    172:    // of name compare.
                    173:    for (i = 0, 
                    174:         parent_instance = (PERF_INSTANCE_DEFINITION *) ( (PBYTE)parent_obj
                    175:         + parent_obj->DefinitionLength);
                    176:         i < parent_obj->NumInstances;
                    177:         i++, parent_instance = (PERF_INSTANCE_DEFINITION *) ( (PBYTE)counter_blk
                    178:         + counter_blk->ByteLength))
                    179:       {  // for
                    180:       counter_blk = (PERF_COUNTER_BLOCK *) ( (PBYTE)parent_instance
                    181:                    + parent_instance->ByteLength);
                    182:      if ((DWORD)i == pInstance->ParentObjectInstance)
                    183:         return (parent_instance) ;
                    184:      }
                    185: 
                    186:    return (NULL) ;
                    187:    }  // ParentInstance
                    188: 
                    189: 
                    190: PPERFOBJECT SelectedObject (HWND hWndObjects, 
                    191:                             LPTSTR lpszObjectName)
                    192: /*
                    193:    Effect:        Return the pObject associated with the currently selected
                    194:                   combo-box item of hWndObjects. Set lpszObjectName to 
                    195:                   the object's name.
                    196: 
                    197:                   If no item is selected in the combobox, return NULL.
                    198: 
                    199:    Assert:        The pObject for each CB item was added when the string
                    200:                   was added to the CB, by CBLoadObjects.
                    201: 
                    202:    See Also:      LoadObjects.
                    203: */
                    204:    {  // SelectedObject
                    205:    int            iIndex ;
                    206: 
                    207:    iIndex = CBSelection (hWndObjects) ;
                    208:    if (iIndex == CB_ERR)
                    209:       return (NULL) ;
                    210: 
                    211:    if (lpszObjectName)
                    212:       CBString (hWndObjects, iIndex, lpszObjectName) ;
                    213: 
                    214:    return ((PPERFOBJECT) CBData (hWndObjects, iIndex)) ;
                    215:    }  // SelectedObject
                    216: 
                    217: 
                    218: 
                    219: PPERFCOUNTERDEF SelectedCounter (HWND hWndCounters, 
                    220:                                  LPTSTR lpszCounterName)
                    221: /*
                    222:    Effect:        Return the pCounter associated with the currently selected
                    223:                   LB item of hWndCounters. Set lpszCounterName to 
                    224:                   the Counter's name.
                    225: 
                    226:                   If no item is selected in the listbox, return NULL.
                    227: 
                    228:    Assert:        The pCounter for each LB item was added when the string
                    229:                   was added to the LB, by LoadCounters.
                    230: 
                    231:    See Also:      LoadCounters.
                    232: */
                    233:    {  // SelectedCounter
                    234:    int            iIndex ;
                    235: 
                    236:    iIndex = LBSelection (hWndCounters) ;
                    237:    if (iIndex == LB_ERR)
                    238:       return (NULL) ;
                    239: 
                    240:    if (lpszCounterName)
                    241:       LBString (hWndCounters, iIndex, lpszCounterName) ;
                    242:    return ((PPERFCOUNTERDEF) LBData (hWndCounters, iIndex)) ;
                    243:    }  // SelectedCounter
                    244: 
                    245: 
                    246: 
                    247: void VisualIncrement (PLINEVISUAL pVisual)
                    248: /*
                    249:    Effect:        Cycle through the combinations of color, width, and
                    250:                   style to distinguish between lines.  The color attributes
                    251:                   are like a number:
                    252:                         <style> <width> <color>
                    253: 
                    254:                   Since color is the LSB, it is always incremented. The
                    255:                   others are incremented whenever the color rolls over.
                    256: 
                    257:                   If a current index is -1, that means don't increment
                    258:                   that visual attribute.
                    259: */
                    260:    {  // VisualIncrement
                    261:    pVisual->iColorIndex = 
                    262:       (pVisual->iColorIndex + 1) % NumColorIndexes () ;
                    263: 
                    264:    if (pVisual->iColorIndex)
                    265:       return ;
                    266: 
                    267: 
                    268:    if (pVisual->iWidthIndex == -1)
                    269:       return ;
                    270: 
                    271: 
                    272:    pVisual->iWidthIndex =
                    273:       (pVisual->iWidthIndex + 1) % NumWidthIndexes () ;
                    274: 
                    275:    if (pVisual->iWidthIndex)
                    276:        return ;
                    277: 
                    278: 
                    279:    if (pVisual->iStyleIndex == -1)
                    280:       return ;
                    281: 
                    282: 
                    283:    pVisual->iStyleIndex = 
                    284:       (pVisual->iStyleIndex + 1) % NumStyleIndexes () ;
                    285:    }  // VisualIncrement
                    286: 
                    287: 
                    288: COLORREF LineColor (int iColorIndex)
                    289:    {
                    290:    return (argbColors [iColorIndex]) ;
                    291:    }
                    292: 
                    293: 
                    294: int LineWidth (int iWidthIndex)
                    295:    {
                    296:    switch (iWidthIndex)
                    297:       {  // switch
                    298:       case 0:
                    299:           return (1) ;
                    300:           break ;
                    301: 
                    302:       case 1:
                    303:           return (3) ;
                    304:           break ;
                    305: 
                    306:       case 2:
                    307:           return (5) ;
                    308:           break ;
                    309: 
                    310:       case 3:
                    311:           return (7) ;
                    312:           break ;
                    313: 
                    314:       case 4:
                    315:           return (9) ;
                    316:           break ;
                    317:       }  // switch
                    318:    }  // LineWidth
                    319: 
                    320: 
                    321: 
                    322: int LineStyle (int iStyleIndex)
                    323:    {
                    324:    return (iStyleIndex) ;
                    325:    }
                    326: 
                    327: 
                    328: BOOL /*static*/ LoadInstances (HDLG hDlg)
                    329:    {
                    330:    PPERFOBJECT       pObject ;
                    331:    PPERFINSTANCEDEF  pInstance, pInstanceParent ;
                    332:    TCHAR             szInstance [256], szInstanceParent [256] ;
                    333:    TCHAR             szCompositeName [256] ;
                    334:    TCHAR             szInstCompositeName [256] ;
                    335:                            
                    336:    LONG              iInstance ;
                    337:    UINT              iIndex ;
                    338: 
                    339:    int               xTextExtent = 0 ;
                    340:    int               currentTextExtent ;
                    341:    HFONT             hFont ;
                    342:    HDC               hDC = 0 ;
                    343:    HWND              hWndObjects = DialogControl (hDlg, IDD_ADDLINEOBJECT);
                    344:    HWND              hWndInstances = DialogControl (hDlg, IDD_ADDLINEINSTANCE);
                    345: 
                    346:    // turn off horiz. scrollbar
                    347:    LBSetHorzExtent (hWndInstances, 0) ;
                    348:    LBReset (hWndInstances) ;
                    349: 
                    350:    pObject = SelectedObject (hWndObjects, NULL) ;
                    351:    if (!pObject)
                    352:       return (FALSE) ;
                    353: 
                    354:    if (pObject->NumInstances <= 0)
                    355:       {
                    356:       MLBSetSelection (hWndInstances, 0, TRUE) ;
                    357:       return (FALSE) ;
                    358:       }
                    359: 
                    360:    // turn off Listbox redraw
                    361:    LBSetRedraw (hWndInstances, FALSE) ;
                    362: 
                    363:    if (bEditLine)
                    364:       {
                    365:       if (pLineEdit->lnObject.NumInstances > 0)
                    366:          {
                    367:          if (pLineEdit->lnInstanceDef.ParentObjectTitleIndex)
                    368:             {
                    369:             // Get the Parent Object Instance Name.
                    370:             // and prefix it to the Instance Name, to make
                    371:             // the string we want to display.
                    372:             TSPRINTF (szInstCompositeName,
                    373:                      TEXT("%s ==> %s"),
                    374:                      pLineEdit->lnPINName,
                    375:                      pLineEdit->lnInstanceName) ;
                    376:             }
                    377:          else
                    378:             {
                    379:             lstrcpy (szInstCompositeName, pLineEdit->lnInstanceName) ;
                    380:             }
                    381:          }
                    382:       else
                    383:          {
                    384:          szInstCompositeName[0] = TEXT('\0');
                    385:          }
                    386:       }
                    387: 
                    388:    if (!bEditLine && (hDC = GetDC (hWndInstances)))
                    389:       {
                    390:       hFont = (HFONT)SendMessage(hWndInstances, WM_GETFONT, 0, 0L);
                    391:       if (hFont)
                    392:          SelectObject(hDC, hFont);
                    393:       }
                    394: 
                    395: 
                    396:    for (iInstance = 0, pInstance = FirstInstance (pObject) ;
                    397:         iInstance < pObject->NumInstances; 
                    398:         iInstance++, pInstance = NextInstance (pInstance))
                    399:       {  // for
                    400:       GetInstanceName (pInstance, szInstance) ;
                    401:       pInstanceParent = ParentInstance (pInstance) ;
                    402:     
                    403:       if (pInstanceParent)
                    404:          {
                    405:          GetInstanceName (pInstanceParent, szInstanceParent) ;
                    406:          TSPRINTF (szCompositeName, TEXT("%s ==> %s"), 
                    407:                    szInstanceParent, szInstance) ;
                    408:          }
                    409:      else
                    410:         lstrcpy (szCompositeName, szInstance) ;
                    411: 
                    412:        iIndex = LBAdd (hWndInstances, szCompositeName) ;
                    413:    if (iIndex != LB_ERR)
                    414:       {
                    415:       LBSetData (hWndInstances, iIndex, (LPARAM) pInstance) ;
                    416:       }
                    417:  
                    418:    // get the biggest text width
                    419:    if (hDC)
                    420:       {
                    421:       currentTextExtent = TextWidth (hDC, szCompositeName) + xScrollWidth / 2  ;
                    422:       if (currentTextExtent > xTextExtent)
                    423:          {
                    424:          xTextExtent = currentTextExtent ;
                    425:          }
                    426:       }
                    427:    }  // for
                    428: 
                    429:    if (hDC)
                    430:       {
                    431:       // turn on horiz. scrollbar if necessary...
                    432:       LBSetHorzExtent (hWndInstances, xTextExtent) ;
                    433:       ReleaseDC (hWndInstances, hDC) ;
                    434:       }
                    435: 
                    436: 
                    437:    if (!bEditLine || szInstCompositeName[0] == TEXT('\0'))
                    438:       {
                    439:       MLBSetSelection (hWndInstances, 0, TRUE) ;
                    440:       }
                    441:    else
                    442:       {
                    443:       BOOL bSetSelection = TRUE ;
                    444: 
                    445:       iIndex = LBFind (hWndInstances, szInstCompositeName) ;
                    446:       if (iIndex == LB_ERR)
                    447:          {
                    448:          if (bEditLine)
                    449:             {
                    450:             bSetSelection = FALSE ;
                    451:             }
                    452:          iIndex = 0 ;
                    453:          }
                    454: 
                    455:       if (bSetSelection)
                    456:          {
                    457:          MLBSetSelection (hWndInstances, iIndex, TRUE) ;
                    458:          }
                    459: 
                    460:       LBSetVisible (hWndInstances, iIndex) ;
                    461:       }
                    462: 
                    463:    // turn on Listbox redraw
                    464:    LBSetRedraw (hWndInstances, TRUE) ;  
                    465: 
                    466:    }  // LoadInstances
                    467: 
                    468: 
                    469: BOOL OnCounterChanged (HDLG hDlg)
                    470: /*
                    471:    Effect:        Perform any actions necessary when the counter has changed.
                    472:                   In particular, display the explanation for the counter
                    473:                   that has the focus rectangle.
                    474: */
                    475:    {
                    476:    LPTSTR         lpszText ;
                    477:    PPERFCOUNTERDEF pCounter ;
                    478:    int            iStatus ;
                    479:    int            iFocusIndex ;
                    480:    HWND           hWndCounters = DialogControl (hDlg, IDD_ADDLINECOUNTER);
                    481:    HWND           hWndScales = DialogControl (hDlg, IDD_ADDLINESCALE) ;
                    482: 
                    483:    iFocusIndex = LBFocus (hWndCounters) ;
                    484:    if  (iFocusIndex == LB_ERR)
                    485:       return (FALSE) ;
                    486: 
                    487:    if (PlayingBackLog())
                    488:       {
                    489:       DialogEnable (hDlg, IDD_ADDLINEEXPANDEXPLAIN, FALSE) ;   
                    490:       return (TRUE) ;
                    491:       }
                    492: 
                    493:    pCounter = (PPERFCOUNTERDEF) LBData (hWndCounters, iFocusIndex) ;
                    494:    if ((!pCounter) || (pCounter == (PPERFCOUNTERDEF)LB_ERR))
                    495:       return (FALSE) ;
                    496:    
                    497:    // no need to get help text before the button is clicked
                    498:    if (!bExplainTextButtonHit)
                    499:       return (FALSE) ;
                    500: 
                    501:    // Create initial string
                    502:    lpszText = MemoryAllocate (iInitialExplainLen * sizeof (TCHAR)) ;
                    503: 
                    504:    while (TRUE)
                    505:       {
                    506:       lpszText[0] = TEXT('\0') ;
                    507: 
                    508:       #ifdef UNICODE
                    509:       iStatus = QueryPerformanceName  (pSystem,
                    510:                                        pCounter->CounterHelpTitleIndex,
                    511:                                        iLanguage,
                    512:                                        MemorySize (lpszText) / sizeof(TCHAR),
                    513:                                        lpszText,
                    514:                                        TRUE) ;
                    515:       #else
                    516:       iStatus = QueryPerformanceNameW (pSystem,
                    517:                                        pCounter->CounterHelpTitleIndex,
                    518:                                        iLanguage,
                    519:                                        MemorySize (lpszText),
                    520:                                        lpszText,
                    521:                                        TRUE) ;
                    522:       #endif
                    523: 
                    524:       if (iStatus == ERROR_SUCCESS)
                    525:          break ;
                    526: 
                    527:       if (iStatus == ERROR_MORE_DATA)
                    528:          lpszText = 
                    529:             MemoryResize (lpszText, 
                    530:                           MemorySize (lpszText) + iInitialExplainLen) ;
                    531:       else
                    532:          break ;
                    533:       }  // while
                    534: 
                    535:    SetDlgItemText (hDlg, IDD_ADDLINEEXPLAIN, lpszText) ;
                    536:    MemoryFree (lpszText) ;
                    537: 
                    538:    return (TRUE) ;
                    539:    }  // OnCounterChanged
                    540: 
                    541: 
                    542: 
                    543: BOOL LoadCounters (HDLG hDlg, 
                    544:                    UINT iSelectCounterDefn)
                    545:    {  // LoadCounters
                    546:    PPERFOBJECT       pObject ;
                    547: 
                    548:    TCHAR             szCounterName [256] ;
                    549:    TCHAR             szDefaultCounterName [256] ;
                    550:    PPERFCOUNTERDEF   pCounter ;
                    551:    UINT              i ;
                    552:    int               iIndex ;
                    553:    int               xTextExtent = 0 ;
                    554:    int               currentTextExtent ;
                    555:    HFONT             hFont ;
                    556:    HDC               hDC = 0 ;
                    557:    BOOL              bSetSelection = TRUE ;
                    558:    HWND              hWndObjects = DialogControl (hDlg, IDD_ADDLINEOBJECT);
                    559:    HWND              hWndCounters = DialogControl (hDlg, IDD_ADDLINECOUNTER);
                    560: 
                    561: 
                    562:    strclr (szDefaultCounterName) ;
                    563: 
                    564:    // turn off horiz. scrollbar
                    565:    LBSetHorzExtent (hWndCounters, 0) ;
                    566:    LBReset (hWndCounters) ;
                    567: 
                    568:    pObject = SelectedObject (hWndObjects, NULL) ;
                    569:    if (!pObject)
                    570:       return (FALSE) ;
                    571: 
                    572:    if (!bEditLine && (hDC = GetDC (hWndCounters)))
                    573:       {
                    574:       hFont = (HFONT)SendMessage(hWndCounters, WM_GETFONT, 0, 0L);
                    575:       if (hFont)
                    576:          SelectObject(hDC, hFont);
                    577:       }
                    578: 
                    579:    // turn off Listbox redraw
                    580:    LBSetRedraw (hWndCounters, FALSE) ;  
                    581: 
                    582:    for (i = 0, pCounter = FirstCounter (pObject) ;
                    583:         i < pObject->NumCounters ;
                    584:         i++, pCounter = NextCounter (pCounter))
                    585:       {  // for
                    586:       if (pCounter->CounterType != PERF_SAMPLE_BASE &&
                    587:           pCounter->CounterType != PERF_COUNTER_NODATA &&
                    588:           pCounter->CounterType != PERF_AVERAGE_BASE &&
                    589:           pCounter->CounterType != PERF_COUNTER_QUEUELEN_TYPE &&
                    590:           pCounter->CounterType != PERF_COUNTER_MULTI_BASE &&
                    591:           pCounter->CounterType != PERF_RAW_BASE &&
                    592:           pCounter->DetailLevel <= ADDLINEDETAILLEVEL)
                    593:          {   // if
                    594:          szCounterName[0] = TEXT('\0') ;
                    595:          QueryPerformanceName (pSystem, 
                    596:                                  pCounter->CounterNameTitleIndex, 
                    597:                                  0, sizeof (szCounterName) / sizeof(TCHAR),
                    598:                                  szCounterName,
                    599:                                  FALSE) ;
                    600:          
                    601:          // if szCounterName is not empty, add it to the listbox
                    602:          if (!strsame(szCounterName, NULL_NAME))
                    603:             {
                    604:             iIndex = LBAdd (hWndCounters, szCounterName) ;
                    605:             LBSetData (hWndCounters, iIndex, (DWORD) pCounter) ;
                    606: 
                    607:             // get the biggest text width
                    608:             if (hDC)
                    609:                {
                    610:                currentTextExtent = TextWidth (hDC, szCounterName) + xScrollWidth / 2 ;
                    611:                if (currentTextExtent > xTextExtent)
                    612:                   {
                    613:                   xTextExtent = currentTextExtent ;
                    614:                   }
                    615:                }
                    616:        
                    617:             if (iSelectCounterDefn == i)
                    618:                lstrcpy (szDefaultCounterName, szCounterName) ;
                    619:             } // if szCounterName is not empty
                    620:          }   // if
                    621:       }  // for
                    622: 
                    623:    if (bEditLine)
                    624:       lstrcpy (szDefaultCounterName, pLineEdit->lnCounterName) ;
                    625: 
                    626:    iIndex = LBFind (hWndCounters, szDefaultCounterName) ;
                    627:    if (iIndex == LB_ERR)
                    628:       {
                    629:       if (bEditLine)
                    630:          {
                    631:          bSetSelection = FALSE ;
                    632:          }
                    633:       iIndex = 0 ;
                    634:       }
                    635: 
                    636:    if (bSetSelection)
                    637:       {
                    638:       MLBSetSelection (hWndCounters, iIndex, TRUE) ;
                    639:       }
                    640:    LBSetVisible (hWndCounters, iIndex) ;
                    641:    
                    642:    if (hDC)
                    643:       {
                    644:       // turn on horiz. scrollbar if necessary...
                    645:       LBSetHorzExtent (hWndCounters, xTextExtent) ;
                    646:       ReleaseDC (hWndCounters, hDC) ;
                    647:       }
                    648: 
                    649:    // turn on Listbox redraw
                    650:    LBSetRedraw (hWndCounters, TRUE) ;  
                    651: 
                    652:    OnCounterChanged (hDlg) ;
                    653:    }  // LoadCounters
                    654: 
                    655: 
                    656: 
                    657: 
                    658: void LoadObjects (HDLG hDlg,
                    659:                   PPERFDATA pPerfData)
                    660: /*
                    661:    Effect:        Load into the object CB the objects for the current
                    662:                   pPerfData.
                    663: */
                    664:    {
                    665:    LPTSTR         lpszObject ;
                    666:    HWND           hWndObjects = DialogControl (hDlg, IDD_ADDLINEOBJECT);
                    667: 
                    668: 
                    669:    lpszObject = bEditLine ? pLineEdit->lnObjectName : NULL ;
                    670: 
                    671:    CBLoadObjects (hWndObjects, 
                    672:                   pPerfData,
                    673:                   pSystem,
                    674:                   ADDLINEDETAILLEVEL,
                    675:                   lpszObject,
                    676:                   FALSE) ;
                    677:    OnObjectChanged (hDlg) ;
                    678: //   UpdateWindow (hDlg) ;
                    679:    }  // LoadObjects
                    680: 
                    681: 
                    682: 
                    683: void OnComputerChanged (HDLG hDlg)
                    684:    {
                    685: 
                    686:    PPERFSYSTEM pLocalSystem;
                    687:    PPERFDATA   pLocalPerfData;
                    688: 
                    689:    pLocalPerfData = pPerfData;
                    690:    pLocalSystem = GetComputer (hDlg,
                    691:                           IDD_ADDLINECOMPUTER,
                    692:                           TRUE,
                    693:                           &pLocalPerfData,
                    694:                           ppSystemFirst) ;
                    695:    if (pLocalSystem && pLocalPerfData)
                    696:       {
                    697:       pSystem = pLocalSystem;
                    698:       pPerfData = pLocalPerfData;
                    699:       LoadObjects (hDlg, pPerfData) ;
                    700:       ComputerChange = FALSE ;
                    701:       DialogEnable (hDlg, IDD_ADDLINEADD, TRUE) ;
                    702:       }
                    703: 
                    704:    }  // OnComputerChanged
                    705: 
                    706: 
                    707:    
                    708: 
                    709: BOOL AddOneChartLine (HWND hDlg,
                    710:                       PPERFCOUNTERDEF pCounter,
                    711:                       LPTSTR lpszCounter,
                    712:                       PPERFINSTANCEDEF pInstance)                     
                    713:    {
                    714:    TCHAR             szComputer [MAX_SYSTEM_NAME_LENGTH] ;
                    715: 
                    716:    PPERFOBJECT       pObject ;
                    717:    TCHAR             szObject [PerfObjectLen] ;
                    718: 
                    719:    TCHAR             szInstance [256] ;
                    720: 
                    721:    PLINE             pLine ;
                    722: //   int               i ;
                    723:    int               iCounterIndex ;
                    724:    int               j ;
                    725: 
                    726:    PPERFINSTANCEDEF  pInstanceParent ;
                    727:    PERF_COUNTER_BLOCK *pCounterBlock ;
                    728:    TCHAR          szInstanceParent [256] ;
                    729:    TCHAR          szObjectParent [PerfObjectLen+1] ;
                    730:    HWND           hWndColors = DialogControl (hDlg, IDD_ADDLINECOLOR) ;
                    731:    HWND           hWndWidths = DialogControl (hDlg, IDD_ADDLINEWIDTH) ;
                    732:    HWND           hWndStyles = DialogControl (hDlg, IDD_ADDLINESTYLE) ;
                    733:    HWND           hWndScales = DialogControl (hDlg, IDD_ADDLINESCALE) ;
                    734:    HWND           hWndObjects = DialogControl (hDlg, IDD_ADDLINEOBJECT);
                    735: 
                    736: 
                    737:    //=============================//
                    738:    // Get selected data values    //
                    739:    //=============================//
                    740: 
                    741: 
                    742: 
                    743:    DialogText (hDlg, IDD_ADDLINECOMPUTER, szComputer) ;
                    744: 
                    745:    pObject = SelectedObject (hWndObjects, szObject) ;
                    746:    if (!pObject)
                    747:       return (FALSE) ;
                    748: 
                    749:    if (pInstance)
                    750:       GetInstanceName (pInstance, szInstance) ;
                    751: 
                    752:    //=============================//
                    753:    // Allocate the line           //
                    754:    //=============================//
                    755: 
                    756:    pLine = LineAllocate () ;
                    757:    if (!pLine)
                    758:       {
                    759:       DlgErrorBox (hDlg, ERR_NO_MEMORY);
                    760:       return (FALSE) ;
                    761:       }
                    762: 
                    763: 
                    764:    //=============================//
                    765:    // Set line's data values      //
                    766:    //=============================//
                    767: 
                    768:    pLine->iLineType = iLineType ;
                    769:    pLine->lnSystemName = StringAllocate (szComputer) ;
                    770: 
                    771:    pLine->lnObject = *pObject ;
                    772:    pLine->lnObjectName = StringAllocate (szObject) ;
                    773: 
                    774:    pLine->lnCounterDef = *pCounter ;
                    775:    pLine->lnCounterName = StringAllocate (lpszCounter) ;
                    776: 
                    777: 
                    778:    if (pObject->NumInstances > 0 && pInstance)
                    779:       {
                    780:       pLine->lnInstanceDef = *pInstance ;          
                    781:       pLine->lnInstanceName = StringAllocate (szInstance) ;
                    782: 
                    783:       pLine->lnUniqueID = pInstance->UniqueID ;
                    784: 
                    785:       if (pInstance->ParentObjectTitleIndex)
                    786:          {
                    787:          szObjectParent[0] = (TCHAR)'\0';
                    788:          QueryPerformanceName (pSystem,
                    789:                                pInstance->ParentObjectTitleIndex,
                    790:                                0,  PerfObjectLen, szObjectParent, FALSE) ;
                    791:          pLine->lnParentObjName = StringAllocate (szObjectParent) ;
                    792:          }
                    793: 
                    794:       pInstanceParent = ParentInstance (pInstance) ;
                    795:       if (pInstanceParent)
                    796:          {
                    797:          GetInstanceName (pInstanceParent, szInstanceParent) ;
                    798:          if (pInstance->ParentObjectTitleIndex)
                    799:             {
                    800:             pLine->lnPINName = StringAllocate (szInstanceParent) ;
                    801:             }
                    802:          }
                    803:       }  // if
                    804: 
                    805:    pLine->lnCounterType = pCounter->CounterType;
                    806:    pLine->lnCounterLength = pCounter->CounterSize;
                    807: 
                    808:    pLine->lnOldTime = pPerfData->PerfTime ;
                    809:    pLine->lnNewTime = pPerfData->PerfTime ;
                    810: 
                    811:    for (j = 0 ; j < 2 ; j++)
                    812:       {
                    813:       pLine->lnaCounterValue[j].LowPart = 0 ;
                    814:       pLine->lnaCounterValue[j].HighPart = 0 ;
                    815:       }
                    816: 
                    817: 
                    818:    //=============================//
                    819:    // Chart-related Values        //
                    820:    //=============================//
                    821: 
                    822:    pLine->iScaleIndex = CBSelection (hWndScales) ;
                    823:    if (pLine->iScaleIndex == 0)
                    824:       {
                    825:       // use the default scale
                    826:       pLine->eScale = (FLOAT) pow ((double)10.0,
                    827:           (double)pCounter->DefaultScale) ;
                    828:       }
                    829:    else
                    830:       {
                    831:       pLine->eScale = DialogFloat (hDlg, IDD_ADDLINESCALE, NULL) ;
                    832:       }
                    833: 
                    834:    if (pObject->NumInstances > 0 && pInstance)
                    835:       {
                    836:       pCounterBlock = (PERF_COUNTER_BLOCK *) ( (PBYTE) pInstance +
                    837:                        pInstance->ByteLength);
                    838:       }
                    839:    else
                    840:       {
                    841:       pCounterBlock = (PERF_COUNTER_BLOCK *) ( (PBYTE) pObject +
                    842:                        pObject->DefinitionLength);
                    843:       }
                    844: 
                    845:    if (pLine->lnCounterLength <= 4)
                    846:        pLine->lnaOldCounterValue[0].LowPart =
                    847:                * ( (DWORD FAR *) ( (PBYTE)pCounterBlock +
                    848:                pCounter[0].CounterOffset));
                    849:    else
                    850:       {
                    851:       pLine->lnaOldCounterValue[0] =
                    852:               * ( (LARGE_INTEGER *) ( (PBYTE)pCounterBlock +
                    853:               pCounter[0].CounterOffset));
                    854:       }
                    855: 
                    856:    // Get second counter, only if we are not at
                    857:    // the end of the counters; some computations
                    858:    // require a second counter
                    859: 
                    860:    iCounterIndex = CounterIndex (pCounter, pObject) ;
                    861:    if ((UINT) iCounterIndex < pObject->NumCounters - 1 &&
                    862:        iCounterIndex != -1)
                    863:       {
                    864:       if (pLine->lnCounterLength <= 4)
                    865:           pLine->lnaOldCounterValue[1].LowPart =
                    866:                   * ( (DWORD FAR *) ( (PBYTE)pCounterBlock +
                    867:                   pCounter[1].CounterOffset));
                    868:       else
                    869:          pLine->lnaOldCounterValue[1] =
                    870:                  * ( (LARGE_INTEGER *) ( (PBYTE)pCounterBlock +
                    871:                  pCounter[1].CounterOffset));
                    872:       }
                    873: 
                    874: //   pLine->valNext = CounterFuncEntry;
                    875:    pLine->valNext = CounterEntry;
                    876: 
                    877:    pLine->lnaOldCounterValue[0] = pLine->lnaCounterValue[0];
                    878:    pLine->lnaOldCounterValue[1] = pLine->lnaCounterValue[1];
                    879: 
                    880:    //=============================//
                    881:    // Visual Values               //
                    882:    //=============================//
                    883: 
                    884:    pLine->Visual.iColorIndex = CBSelection (hWndColors) ;
                    885:    pLine->Visual.crColor = LineColor (pLine->Visual.iColorIndex) ;
                    886: 
                    887:    pLine->Visual.iWidthIndex = CBSelection (hWndWidths) ;
                    888:    pLine->Visual.iWidth = LineWidth (pLine->Visual.iWidthIndex) ;
                    889: 
                    890:    pLine->Visual.iStyleIndex = CBSelection (hWndStyles) ;
                    891:    pLine->Visual.iStyle = LineStyle (pLine->Visual.iStyleIndex) ;
                    892: 
                    893:    *pVisual = pLine->Visual ;
                    894:    if (!bEditLine)
                    895:       VisualIncrement (pVisual) ;
                    896: 
                    897:    CBSetSelection (hWndColors, pVisual->iColorIndex) ;
                    898:    CBSetSelection (hWndWidths, pVisual->iWidthIndex) ;
                    899:    CBSetSelection (hWndStyles, pVisual->iStyleIndex) ;
                    900: 
                    901:    if (iLineType == LineTypeChart)
                    902:       {
                    903:       pLine->hPen = LineCreatePen (NULL, &(pLine->Visual), FALSE) ;
                    904:       }
                    905: 
                    906:    //=============================//
                    907:    // Alert Related Values        //
                    908:    //=============================//
                    909: 
                    910:    if (iLineType == LineTypeAlert)
                    911:       {
                    912:       pLine->bAlertOver = bAlertOver ;
                    913:       pLine->eAlertValue = eAlertValue ;
                    914:       pLine->bEveryTime = 
                    915:          IsDlgButtonChecked (hDlg, IDD_ADDLINEPROGRAMEVERYTIME) ;
                    916:       pLine->bAlerted = FALSE ;
                    917:       pLine->hBrush = CreateSolidBrush (pLine->Visual.crColor) ;
                    918:       if (!PlayingBackLog ())
                    919:          {
                    920:          pLine->lpszAlertProgram = StringAllocate (pszAlertProgram) ;
                    921:          }
                    922:       else
                    923:          {
                    924:          pLine->lpszAlertProgram = NULL ;
                    925:          }
                    926:       }
                    927:    //=============================//
                    928:    // Insert the line!            //
                    929:    //=============================//
                    930: 
                    931:    if (InsertLine (pLine) == FALSE)
                    932:       {
                    933:       // no inert occurred due to either line already existed
                    934:       // or error detected.
                    935:       LineFree (pLine) ;
                    936:       }
                    937:    else
                    938:       {
                    939:       if (pSystem->lpszValue)
                    940:          {
                    941:          if (strsame(pSystem->lpszValue, TEXT("Global ")))
                    942:             {
                    943:             // take out the "Global " string
                    944:             *(pSystem->lpszValue) = 0 ;
                    945:             }
                    946:          AppendObjectToValueList (
                    947:             pLine->lnObject.ObjectNameTitleIndex,
                    948:             pSystem->lpszValue) ;
                    949:          }
                    950:       }
                    951:    }  // AddOneChartLine
                    952: 
                    953: 
                    954: BOOL AddCounter (HWND hDlg,
                    955:                       PPERFCOUNTERDEF pCounter,
                    956:                       LPTSTR lpszCounter)
                    957:    {  // AddCounter
                    958:    int               iInstanceIndex ;
                    959:    int               iInstanceNum ;
                    960:    PPERFINSTANCEDEF  pInstance ;
                    961:    HWND              hWndInstances = DialogControl (hDlg, IDD_ADDLINEINSTANCE);
                    962: 
                    963:    // NOTE: for now, we don't check for duplicate lines
                    964:    if (!IsCounterSupported (pCounter->CounterType))
                    965:       {
                    966:       DlgErrorBox (hDlg, ERR_COUNTER_NOT_IMP);
                    967:       return (FALSE) ;
                    968:       }
                    969: 
                    970: 
                    971:    if ((iInstanceNum = LBNumItems (hWndInstances)) && iInstanceNum != LB_ERR)
                    972:       {
                    973: 
                    974:       if (iInstanceNum > 1)
                    975:          {
                    976:          // delay some of the insert actions for performacne improvement
                    977:          bDelayAddAction = TRUE ;
                    978: 
                    979:          if (InChartAdd())
                    980:             {
                    981:             LegendSetRedraw (hWndGraphLegend, FALSE) ;
                    982:             }
                    983:          else if (InAlertAdd())
                    984:             {
                    985:             LegendSetRedraw (hWndAlertLegend, FALSE) ;
                    986:             }
                    987:          }
                    988: 
                    989:       for (iInstanceIndex = 0 ;
                    990:            iInstanceIndex < iInstanceNum ;
                    991:            iInstanceIndex++)
                    992:          {  // for
                    993:          if (LBSelected (hWndInstances, iInstanceIndex))
                    994:             {  // if
                    995:             pInstance = (PPERFINSTANCEDEF) LBData (hWndInstances, iInstanceIndex) ;
                    996:             if (pInstance == (PPERFINSTANCEDEF) LB_ERR)
                    997:                {
                    998:                pInstance = NULL;
                    999:                }
                   1000:             AddOneChartLine (hDlg, pCounter, lpszCounter, pInstance) ;
                   1001:             }  // if
                   1002:          }  // for
                   1003:       
                   1004:       if (bDelayAddAction)
                   1005:          {
                   1006:          // now do the post add-line actions
                   1007:          bDelayAddAction = FALSE ;
                   1008:          if (InReportAdd())
                   1009:             {
                   1010:             PREPORT pReport ;
                   1011:       
                   1012:             pReport = ReportData (hWndReport) ;
                   1013:             ReportAddAction (pReport) ;
                   1014:             }
                   1015:          else if (InChartAdd())
                   1016:             {
                   1017:             GraphAddAction () ;
                   1018:             LegendSetRedraw (hWndGraphLegend, TRUE) ;
                   1019:             }
                   1020:          else if (InAlertAdd())
                   1021:             {
                   1022:             AlertAddAction () ;
                   1023:             LegendSetRedraw (hWndAlertLegend, TRUE) ;
                   1024:             }
                   1025:          }
                   1026:       }
                   1027:    else
                   1028:       {
                   1029:       pInstance = NULL;
                   1030:       AddOneChartLine (hDlg, pCounter, lpszCounter, pInstance) ;
                   1031:       }
                   1032: 
                   1033:    return (TRUE) ;
                   1034:    }  // AddCounter
                   1035: 
                   1036: 
                   1037: //==========================================================================//
                   1038: //                              Message Handlers                            //
                   1039: //==========================================================================//
                   1040: 
                   1041: 
                   1042: BOOL /*static*/ OnInitDialog (HWND hDlg)
                   1043:    {
                   1044:    int            i ;
                   1045:    FLOAT          ScaleFactor ;
                   1046:    TCHAR          tempBuff[ShortTextLen] ;
                   1047:    TCHAR          szCaption [WindowCaptionLen] ;
                   1048:    TCHAR          szRemoteComputerName[MAX_COMPUTERNAME_LENGTH + 3] ;
                   1049:    HWND           hWndComputer = DialogControl (hDlg, IDD_ADDLINECOMPUTER);
                   1050:    HWND           hWndObjects = DialogControl (hDlg, IDD_ADDLINEOBJECT);
                   1051:    HWND           hWndInstances = DialogControl (hDlg, IDD_ADDLINEINSTANCE);
                   1052:    HWND           hWndCounters = DialogControl (hDlg, IDD_ADDLINECOUNTER);
                   1053:    HWND           hWndColors = DialogControl (hDlg, IDD_ADDLINECOLOR) ;
                   1054:    HWND           hWndWidths = DialogControl (hDlg, IDD_ADDLINEWIDTH) ;
                   1055:    HWND           hWndStyles = DialogControl (hDlg, IDD_ADDLINESTYLE) ;
                   1056:    HWND           hWndScales = DialogControl (hDlg, IDD_ADDLINESCALE) ;
                   1057: 
                   1058:    // this is used to tell UPdateLines not to mark any
                   1059:    // system as not used
                   1060:    bAddLineInProgress = TRUE ;
                   1061:    
                   1062:    // turn this off until the Explain text button is clicked
                   1063:    bExplainTextButtonHit = FALSE ;
                   1064: 
                   1065:    if (InAlertAdd())
                   1066:       {
                   1067:       pszAlertProgram = (LPTSTR) MemoryAllocate (FilePathLen * sizeof (TCHAR)) ;
                   1068:       }
                   1069: 
                   1070:    if (!PlayingBackLog ())
                   1071:       pPerfData = MemoryAllocate (STARTING_SYSINFO_SIZE) ;
                   1072: 
                   1073:    pSystem = NULL ;
                   1074: 
                   1075:    if (!bEditLine && PlayingBackLog())
                   1076:       {
                   1077:       pPerfData = DataFromIndexPosition (&(PlaybackLog.StartIndexPos), NULL) ;
                   1078:       GetPerfComputerName(pPerfData, szRemoteComputerName);
                   1079:       DialogSetString (hDlg, IDD_ADDLINECOMPUTER, szRemoteComputerName);
                   1080:       }
                   1081:    else
                   1082:       {
                   1083:       DialogSetString (hDlg, IDD_ADDLINECOMPUTER,
                   1084:                        bEditLine ? pLineEdit->lnSystemName : LocalComputerName) ;
                   1085:       }
                   1086: 
                   1087:    OnComputerChanged (hDlg) ;
                   1088: 
                   1089:    //=============================//
                   1090:    // Set default line values     //
                   1091:    //=============================//
                   1092: 
                   1093:    bAlertOver = bEditLine ? pLineEdit->bAlertOver : TRUE ;
                   1094:    bEveryTime = bEditLine ? pLineEdit->bEveryTime : TRUE ;
                   1095: 
                   1096:    //=============================//
                   1097:    // Fill line attribute CBs     //
                   1098:    //=============================//
                   1099: 
                   1100:    // Load the colors combobox, select the default color.
                   1101:    for (i = 0 ; i < NumColorIndexes () ; i++)
                   1102:        CBAdd (hWndColors, i) ;
                   1103:    CBSetSelection (hWndColors, pVisual->iColorIndex) ;
                   1104: 
                   1105:    // Load the widths combobox, select the default width.
                   1106:    for (i = 0 ; i < NumWidthIndexes () ; i++)
                   1107:       CBAdd (hWndWidths, i) ;
                   1108:    CBSetSelection (hWndWidths, pVisual->iWidthIndex) ;
                   1109: 
                   1110:    // Load the styles combobox, select the default style.
                   1111:    for (i = 0 ; i < NumStyleIndexes () ; i++)
                   1112:       CBAdd (hWndStyles, i) ;
                   1113:    CBSetSelection (hWndStyles, pVisual->iStyleIndex) ;
                   1114: 
                   1115: 
                   1116:    // Init the scale combo box.
                   1117: 
                   1118:    StringLoad (IDS_DEFAULT, tempBuff) ;
                   1119:    CBAdd (hWndScales, tempBuff) ;
                   1120: 
                   1121:    // we are formatting the scale factors during run-time so
                   1122:    // the c-runtime library will pick up the default locale
                   1123:    // decimal "charatcer".
                   1124:    ScaleFactor = (FLOAT)0.000001 ;
                   1125:    for (i = 0 ; i < NUMBER_OF_SCALE ; i++)
                   1126:       {
                   1127:       TSPRINTF(tempBuff, apszScaleFmt[i], ScaleFactor) ;
                   1128:       ScaleFactor *= (FLOAT) 10.0 ;
                   1129:       CBAdd (hWndScales, tempBuff) ;
                   1130:       }
                   1131: 
                   1132:    CBSetSelection (hWndScales, bEditLine ? pLineEdit->iScaleIndex : DEFAULT_SCALE) ;
                   1133: 
                   1134:    
                   1135:    CheckRadioButton (hDlg, IDD_ADDLINEIFOVER, IDD_ADDLINEIFUNDER, 
                   1136:                      bAlertOver ? IDD_ADDLINEIFOVER: IDD_ADDLINEIFUNDER) ;
                   1137:    CheckRadioButton (hDlg, IDD_ADDLINEPROGRAMFIRSTTIME, IDD_ADDLINEPROGRAMEVERYTIME, 
                   1138:                      bEveryTime ? IDD_ADDLINEPROGRAMEVERYTIME: IDD_ADDLINEPROGRAMFIRSTTIME) ;
                   1139: 
                   1140:    if (bEditLine)
                   1141:       {
                   1142:       DialogSetText (hDlg, IDD_ADDLINEADD, IDS_OK) ;
                   1143:       DialogSetFloat (hDlg, IDD_ADDLINEIFVALUE, pLineEdit->eAlertValue) ;
                   1144:       if (pLineEdit->lpszAlertProgram)
                   1145:          DialogSetString (hDlg, IDD_ADDLINEPROGRAM, 
                   1146:                           pLineEdit->lpszAlertProgram) ;
                   1147: 
                   1148:       DialogEnable (hDlg, IDD_ADDLINECOMPUTERTEXT, FALSE) ;
                   1149:       DialogEnable (hDlg, IDD_ADDLINECOMPUTER, FALSE) ;
                   1150:       DialogEnable (hDlg, IDD_ADDLINEOBJECTTEXT, FALSE) ;   
                   1151:       DialogEnable (hDlg, IDD_ADDLINEOBJECT, FALSE) ;   
                   1152:       DialogEnable (hDlg, IDD_ADDLINECOUNTERTEXT, FALSE) ;   
                   1153:       DialogEnable (hDlg, IDD_ADDLINECOUNTER, FALSE) ;   
                   1154:       DialogEnable (hDlg, IDD_ADDLINEINSTANCE, FALSE) ;   
                   1155:       DialogEnable (hDlg, IDD_ADDLINEINSTANCETEXT, FALSE) ;   
                   1156:       }
                   1157:    else
                   1158:       {
                   1159:       // set the scroll limit on the edit box
                   1160:       EditSetLimit (GetDlgItem(hDlg, IDD_CHOOSECOMPUTERNAME),
                   1161:          MAX_SYSTEM_NAME_LENGTH-1) ;
                   1162: 
                   1163:       }
                   1164: 
                   1165:    if (PlayingBackLog())
                   1166:       {
                   1167:       DialogEnable (hDlg, IDD_ADDLINEEXPANDEXPLAIN, FALSE) ;   
                   1168:       }
                   1169: 
                   1170:    //=============================//
                   1171:    // LineType specific init      //
                   1172:    //=============================//
                   1173: 
                   1174:    switch (iLineType)
                   1175:       {
                   1176:       case LineTypeChart:
                   1177:          dwCurrentDlgID = bEditLine ?
                   1178:                   HC_PM_idDlgEditChartLine : HC_PM_idDlgEditAddToChart ;
                   1179: 
                   1180:          StringLoad (bEditLine ? 
                   1181:                      IDS_EDITCHART : IDS_ADDTOCHART, szCaption) ;
                   1182: 
                   1183:          DialogShow (hDlg, IDD_ADDLINEIFGROUP, FALSE) ;
                   1184:          DialogShow (hDlg, IDD_ADDLINEIFVALUE, FALSE) ;
                   1185:          DialogShow (hDlg, IDD_ADDLINEIFUNDER, FALSE) ;
                   1186:          DialogShow (hDlg, IDD_ADDLINEIFOVER, FALSE) ;
                   1187: 
                   1188:          DialogShow (hDlg, IDD_ADDLINEPROGRAMGROUP, FALSE) ;
                   1189:          DialogShow (hDlg, IDD_ADDLINEPROGRAM, FALSE) ;
                   1190:          DialogShow (hDlg, IDD_ADDLINEPROGRAMFIRSTTIME, FALSE) ;
                   1191:          DialogShow (hDlg, IDD_ADDLINEPROGRAMEVERYTIME, FALSE) ;
                   1192:          break ;
                   1193: 
                   1194:       case LineTypeAlert:
                   1195:          dwCurrentDlgID = bEditLine ?
                   1196:                   HC_PM_idDlgEditAlertEntry : HC_PM_idDlgEditAddToAlert ;
                   1197: 
                   1198:          StringLoad (bEditLine ? 
                   1199:                      IDS_EDITALERT : IDS_ADDTOALERT, szCaption) ;
                   1200: 
                   1201:          DialogShow (hDlg, IDD_ADDLINESCALE, FALSE) ;
                   1202:          DialogShow (hDlg, IDD_ADDLINESCALETEXT, FALSE) ;
                   1203: 
                   1204:          DialogShow (hDlg, IDD_ADDLINEWIDTH, FALSE) ;
                   1205:          DialogShow (hDlg, IDD_ADDLINEWIDTHTEXT, FALSE) ;
                   1206: 
                   1207:          DialogShow (hDlg, IDD_ADDLINESTYLE, FALSE) ;
                   1208:          DialogShow (hDlg, IDD_ADDLINESTYLETEXT, FALSE) ;
                   1209: 
                   1210:          if (PlayingBackLog ())
                   1211:             {
                   1212:             DialogEnable (hDlg, IDD_ADDLINEPROGRAM, FALSE) ;
                   1213:             DialogEnable (hDlg, IDD_ADDLINEPROGRAMGROUP, FALSE) ;
                   1214:             DialogEnable (hDlg, IDD_ADDLINEPROGRAMEVERYTIME, FALSE) ;
                   1215:             DialogEnable (hDlg, IDD_ADDLINEPROGRAMFIRSTTIME, FALSE) ;
                   1216:             }
                   1217: 
                   1218:          // set the scroll limit on the edit boxes
                   1219: 
                   1220:          EditSetLimit (GetDlgItem(hDlg, IDD_ADDLINEIFVALUE), ShortTextLen) ;
                   1221:          EditSetLimit (GetDlgItem(hDlg, IDD_ADDLINEPROGRAM), FilePathLen-1) ;
                   1222: 
                   1223:          break ;
                   1224: 
                   1225:       case LineTypeReport:
                   1226: 
                   1227:          dwCurrentDlgID = HC_PM_idDlgEditAddToReport ;
                   1228: 
                   1229:          StringLoad (bEditLine ? 
                   1230:                      IDS_EDITREPORT : IDS_ADDTOREPORT, szCaption) ;
                   1231: 
                   1232:          DialogShow (hDlg, IDD_ADDLINEIFGROUP, FALSE) ;
                   1233:          DialogShow (hDlg, IDD_ADDLINEIFVALUE, FALSE) ;
                   1234:          DialogShow (hDlg, IDD_ADDLINEIFUNDER, FALSE) ;
                   1235:          DialogShow (hDlg, IDD_ADDLINEIFOVER, FALSE) ;
                   1236: 
                   1237:          DialogShow (hDlg, IDD_ADDLINEPROGRAMGROUP, FALSE) ;
                   1238:          DialogShow (hDlg, IDD_ADDLINEPROGRAM, FALSE) ;
                   1239:          DialogShow (hDlg, IDD_ADDLINEPROGRAMFIRSTTIME, FALSE) ;
                   1240:          DialogShow (hDlg, IDD_ADDLINEPROGRAMEVERYTIME, FALSE) ;
                   1241: 
                   1242:          DialogShow (hDlg, IDD_ADDLINECOLOR, FALSE) ;
                   1243:          DialogShow (hDlg, IDD_ADDLINECOLORTEXT, FALSE) ;
                   1244:          DialogShow (hDlg, IDD_ADDLINESCALE, FALSE) ;
                   1245:          DialogShow (hDlg, IDD_ADDLINESCALETEXT, FALSE) ;
                   1246:          DialogShow (hDlg, IDD_ADDLINEWIDTH, FALSE) ;
                   1247:          DialogShow (hDlg, IDD_ADDLINEWIDTHTEXT, FALSE) ;
                   1248:          DialogShow (hDlg, IDD_ADDLINESTYLE, FALSE) ;
                   1249:          DialogShow (hDlg, IDD_ADDLINESTYLETEXT, FALSE) ;
                   1250:          break ;
                   1251:       }  // switch
                   1252: 
                   1253:    SetWindowText (hDlg, szCaption) ;
                   1254:    SendDlgItemMessage (hDlg, 
                   1255:                        IDD_ADDLINEEXPLAIN, WM_SETFONT, 
                   1256:                        (WPARAM) hFontScales, (LPARAM) FALSE) ;
                   1257:    WindowCenter (hDlg) ;
                   1258:    return (TRUE) ;
                   1259:    }  // OnInitDialog
                   1260: 
                   1261: 
                   1262: BOOL /*static*/ OnObjectChanged (HDLG hDlg)
                   1263: /*
                   1264:    Effect:        Perform any actions necessary when the user has selected
                   1265:                   a new object category from the object CB, or when a default
                   1266:                   object is first selected into the dialog. In particular,
                   1267:                   find and load the counters, instances, etc., for this
                   1268:                   object.
                   1269: 
                   1270:    Called by:     OnInitDialog, AddLineDlgProc (in response to an 
                   1271:                   IDM_ADDLINEOBJECT notification).
                   1272: */
                   1273:    {  // OnObjectChanged
                   1274:    PPERFOBJECT    pObject ;
                   1275:    HWND           hWndInstances = DialogControl (hDlg, IDD_ADDLINEINSTANCE);
                   1276:    HWND           hWndCounters = DialogControl (hDlg, IDD_ADDLINECOUNTER);
                   1277:    HWND           hWndObjects = DialogControl (hDlg, IDD_ADDLINEOBJECT);
                   1278: 
                   1279:    LBReset (hWndInstances) ;
                   1280:    LBReset (hWndCounters) ;
                   1281: 
                   1282:    pObject = SelectedObject (hWndObjects, NULL) ;
                   1283:    if (!pObject)
                   1284:       return (FALSE) ;
                   1285: 
                   1286:    LoadCounters (hDlg, (UINT)pObject->DefaultCounter) ;
                   1287:    LoadInstances (hDlg) ;  
                   1288: 
                   1289:    }  // OnObjectChanged
                   1290: 
                   1291: 
                   1292: 
                   1293: BOOL LineModifyAttributes (HWND hDlg, PLINE pLineToModify)
                   1294: {
                   1295:    LINEVISUAL  LineVisual ;
                   1296:    HPEN        hLinePen ;
                   1297:    int         iScaleIndex ;        // chart attribute
                   1298:    FLOAT             eScale ;             // chart attribute
                   1299: 
                   1300:    BOOL        bLocalAlertOver ;         // alert attribute - over or under?
                   1301:    FLOAT       eLocalAlertValue ;        // alert attribute - value to compare
                   1302:    LPTSTR      lpLocalszAlertProgram ;   // alert attribute - program to run
                   1303:    BOOL        bLocalEveryTime ;         // alert attribute - run every time or once?
                   1304:    BOOL        bLocalAlerted ;           // alert attribute - alert happened on line?
                   1305: 
                   1306:    HPEN        hTempPen ;
                   1307:    LPTSTR      lpTempAlertProgram ;
                   1308:    HWND        hWndColors = DialogControl (hDlg, IDD_ADDLINECOLOR) ;
                   1309:    HWND        hWndWidths = DialogControl (hDlg, IDD_ADDLINEWIDTH) ;
                   1310:    HWND        hWndStyles = DialogControl (hDlg, IDD_ADDLINESTYLE) ;
                   1311:    HWND        hWndScales = DialogControl (hDlg, IDD_ADDLINESCALE) ;
                   1312:    
                   1313:    //=============================//
                   1314:    // Visual Values               //
                   1315:    //=============================//
                   1316: 
                   1317:    LineVisual.iColorIndex = CBSelection (hWndColors) ;
                   1318:    LineVisual.crColor = LineColor (LineVisual.iColorIndex) ;
                   1319: 
                   1320:    LineVisual.iWidthIndex = CBSelection (hWndWidths) ;
                   1321:    LineVisual.iWidth = LineWidth (LineVisual.iWidthIndex) ;
                   1322: 
                   1323:    LineVisual.iStyleIndex = CBSelection (hWndStyles) ;
                   1324:    LineVisual.iStyle = LineStyle (LineVisual.iStyleIndex) ;
                   1325: 
                   1326:    hLinePen = LineCreatePen (NULL, &(LineVisual), FALSE) ;
                   1327: 
                   1328:    //=============================//
                   1329:    // Chart-related Values        //
                   1330:    //=============================//
                   1331:    
                   1332:    if (InChartAdd())
                   1333:       {
                   1334:       iScaleIndex = CBSelection (hWndScales) ;
                   1335:       if (iScaleIndex == 0)
                   1336:           {
                   1337:           // use the default scale
                   1338:           eScale = (FLOAT) pow ((double)10.0,
                   1339:               (double)pLineToModify->lnCounterDef.DefaultScale) ;
                   1340:           }
                   1341:       else
                   1342:           {
                   1343:           eScale = DialogFloat (hDlg, IDD_ADDLINESCALE, NULL) ;
                   1344:           }
                   1345:       }
                   1346: 
                   1347:    //=============================//
                   1348:    // Alert Related Values        //
                   1349:    //=============================//
                   1350:    
                   1351:    if (InAlertAdd())
                   1352:       {
                   1353:       bLocalAlertOver = bAlertOver ;
                   1354:       eLocalAlertValue = eAlertValue ;
                   1355:       bLocalEveryTime =
                   1356:          IsDlgButtonChecked (hDlg, IDD_ADDLINEPROGRAMEVERYTIME) ;
                   1357:       bLocalAlerted = FALSE ;
                   1358:       lpLocalszAlertProgram = StringAllocate (pszAlertProgram) ;
                   1359:       }
                   1360: 
                   1361:    // Just do it..
                   1362:    pLineToModify->Visual = LineVisual ;
                   1363:    if (pLineToModify->hPen)
                   1364:       {
                   1365:       hTempPen = pLineToModify->hPen ;
                   1366:       pLineToModify->hPen = hLinePen ;
                   1367:       DeleteObject (hTempPen) ;
                   1368:       }
                   1369: 
                   1370:    if (InChartAdd())
                   1371:       {
                   1372:       pLineToModify->iScaleIndex = iScaleIndex ;
                   1373:       pLineToModify->eScale = eScale ;
                   1374: 
                   1375:       }
                   1376: 
                   1377:    if (InAlertAdd())
                   1378:       {
                   1379:       pLineToModify->bAlertOver = bLocalAlertOver ;
                   1380:       pLineToModify->eAlertValue = eLocalAlertValue ;
                   1381:       pLineToModify->bEveryTime = bLocalEveryTime ;
                   1382:       pLineToModify->bAlerted = FALSE ;
                   1383: 
                   1384:       lpTempAlertProgram = pLineToModify->lpszAlertProgram ;
                   1385:       pLineToModify->lpszAlertProgram = lpLocalszAlertProgram ;
                   1386: 
                   1387:       if (lpTempAlertProgram)
                   1388:          {
                   1389:          MemoryFree (lpTempAlertProgram) ;
                   1390:          }
                   1391:       }
                   1392: 
                   1393:    return (TRUE) ;
                   1394: 
                   1395: } // LineModifyAttributes
                   1396: 
                   1397: BOOL OnAddLines (HWND hDlg)
                   1398:    {  
                   1399:    PPERFCOUNTERDEF   pCounter ;
                   1400:    TCHAR             szCounter [256] ;
                   1401:    BOOL              bOK ;
                   1402:    int               iCounter ;
                   1403:    int               iCounterNum ;
                   1404:    HWND              hWndCounters = DialogControl (hDlg, IDD_ADDLINECOUNTER);
                   1405: 
                   1406:    if (ComputerChange)
                   1407:       {
                   1408:       // if computer has changed, don't want to continue
                   1409:       // because the perfdata may have changed
                   1410:       OnComputerChanged (hDlg) ;
                   1411:       return (TRUE) ;
                   1412:       }
                   1413: 
                   1414:    //=============================//
                   1415:    // Dialog Values Acceptable?   //
                   1416:    //=============================//
                   1417: 
                   1418:    if (InAlertAdd ())
                   1419:       {
                   1420:       eAlertValue = DialogFloat (hDlg, IDD_ADDLINEIFVALUE, &bOK) ;
                   1421:       if (!bOK)
                   1422:          {
                   1423:          DlgErrorBox (hDlg, ERR_NEEDALERTVALUE);
                   1424:          SetFocus (DialogControl (hDlg, IDD_ADDLINEIFVALUE)) ;
                   1425:          return (FALSE) ;
                   1426:          }  // if
                   1427:       }  // if
                   1428: 
                   1429:    if (bEditLine)
                   1430:       {
                   1431:       LineModifyAttributes (hDlg, pLineEdit) ;
                   1432:       EndDialog (hDlg, TRUE) ;
                   1433:       }
                   1434: 
                   1435:       // If the user changed the textbox for computer name and pressed enter,
                   1436:       // the OnAddLines function would be called without a check of the 
                   1437:       // computer name. This solves that problem.
                   1438:    else
                   1439:       {
                   1440: 
                   1441:       iCounterNum = LBNumItems (hWndCounters) ;
                   1442:       for (iCounter = 0 ;
                   1443:            iCounter < iCounterNum ;
                   1444:            iCounter++)
                   1445:          {  // for
                   1446:          // NOTE: for now, we don't check for duplicate lines
                   1447:          if (LBSelected (hWndCounters, iCounter))
                   1448:             {  // if
                   1449:             pCounter = (PPERFCOUNTERDEF) LBData (hWndCounters, iCounter) ;
                   1450:             LBString (hWndCounters, iCounter, szCounter) ;
                   1451: 
                   1452:             if (!IsCounterSupported (pCounter->CounterType))
                   1453:                {
                   1454:                DlgErrorBox (hDlg, ERR_COUNTER_NOT_IMP);
                   1455:                }
                   1456:             else
                   1457:                {
                   1458:                AddCounter (hDlg, pCounter, szCounter) ;
                   1459:                }
                   1460:             }  // if
                   1461:          }  // for
                   1462:       DialogSetText (hDlg, IDCANCEL, IDS_DONE) ;
                   1463:       } // else (not bEditLine)
                   1464: 
                   1465:    if (InChartAdd ())
                   1466:       SizeGraphComponents (hWndGraph) ;
                   1467:    if (InAlertAdd ())
                   1468:       SizeAlertComponents (hWndAlert) ;
                   1469: 
                   1470:    WindowInvalidate (PerfmonViewWindow ()) ;
                   1471: 
                   1472:    }  // OnAddLines
                   1473: 
                   1474: 
                   1475: void OnExpandExplain (HWND hDlg)
                   1476: /*
                   1477:    Effect:        Perform actions needed when user clicks on the Explain...
                   1478:                   button. In particular, expand the dialog size to 
                   1479:                   uncover the explain edit box, and gray out the button.
                   1480: */
                   1481:    {  // OnExpandExplain
                   1482:    RECT           rectWindow ;
                   1483: 
                   1484:    // Disable button first
                   1485:    DialogEnable (hDlg, IDD_ADDLINEEXPANDEXPLAIN, FALSE) ;
                   1486: 
                   1487:    // go get the help text
                   1488:    bExplainTextButtonHit = TRUE ;
                   1489:    OnCounterChanged (hDlg) ;
                   1490: 
                   1491:    GetWindowRect (hDlg, &rectWindow) ;
                   1492:    MoveWindow (hDlg,
                   1493:                rectWindow.left,
                   1494:                rectWindow.top,
                   1495:                rectWindow.right - rectWindow.left,
                   1496:                rectWindow.bottom - rectWindow.top + 
                   1497:                DialogHeight (hDlg, IDD_ADDLINEEXPLAINGROUP) + 
                   1498:                yScrollHeight,
                   1499:                TRUE) ;
                   1500:    }  // OnExpandExplain
                   1501: 
                   1502: 
                   1503: 
                   1504: BOOL /*static*/ OnCommand (HWND hDlg, 
                   1505:                        WPARAM wParam, 
                   1506:                        LPARAM lParam)
                   1507:    {
                   1508:    int            iWidthIndex ;
                   1509:    int            iStyleIndex ;
                   1510:    HWND           hWndWidths = DialogControl (hDlg, IDD_ADDLINEWIDTH) ;
                   1511:    HWND           hWndStyles = DialogControl (hDlg, IDD_ADDLINESTYLE) ;
                   1512: 
                   1513:    switch (LOWORD (wParam))
                   1514:       {
                   1515:       case IDD_ADDLINEIFVALUE:
                   1516:          // We don't get the value when the user types it. We get it when
                   1517:          // the user attempts to add the line.
                   1518:          break ;
                   1519: 
                   1520:       case IDD_ADDLINEPROGRAM:
                   1521:          GetDlgItemText (hDlg,
                   1522:             IDD_ADDLINEPROGRAM,
                   1523:             pszAlertProgram,
                   1524:             FilePathLen - 1) ;
                   1525:          break ;
                   1526: 
                   1527:       case IDD_ADDLINEIFOVER:
                   1528:       case IDD_ADDLINEIFUNDER:
                   1529:          bAlertOver = !bAlertOver ;
                   1530:          CheckRadioButton (hDlg, IDD_ADDLINEIFOVER, IDD_ADDLINEIFUNDER, 
                   1531:                            bAlertOver ? IDD_ADDLINEIFOVER: IDD_ADDLINEIFUNDER) ;
                   1532:          break ;
                   1533: 
                   1534:       case IDD_ADDLINEPROGRAMFIRSTTIME:
                   1535:       case IDD_ADDLINEPROGRAMEVERYTIME:
                   1536:          bEveryTime = !bEveryTime ;
                   1537:          CheckRadioButton (hDlg, IDD_ADDLINEPROGRAMFIRSTTIME, IDD_ADDLINEPROGRAMEVERYTIME, 
                   1538:                            bEveryTime ? IDD_ADDLINEPROGRAMEVERYTIME: IDD_ADDLINEPROGRAMFIRSTTIME) ;
                   1539:          break ;
                   1540: 
                   1541:       case IDD_ADDLINEWIDTH:
                   1542:          iWidthIndex = CBSelection (hWndWidths) ;
                   1543: #if (!WIDESTYLES)
                   1544:          DialogEnable (hDlg, IDD_ADDLINESTYLETEXT, 
                   1545:                        iWidthIndex == 0  || iWidthIndex == CB_ERR) ;
                   1546:          DialogEnable (hDlg, IDD_ADDLINESTYLE, 
                   1547:                        iWidthIndex == 0  || iWidthIndex == CB_ERR) ;
                   1548: #endif
                   1549:          break ;
                   1550: 
                   1551:       case IDD_ADDLINESTYLE:
                   1552:          iStyleIndex = CBSelection (hWndStyles) ;
                   1553: #if (!WIDESTYLES)
                   1554:          DialogEnable (hDlg, IDD_ADDLINEWIDTHTEXT, 
                   1555:                        iStyleIndex == 0  || iStyleIndex == CB_ERR) ;
                   1556:          DialogEnable (hDlg, IDD_ADDLINEWIDTH, 
                   1557:                        iStyleIndex == 0  || iStyleIndex == CB_ERR) ;
                   1558: #endif
                   1559:          break ;
                   1560: 
                   1561:       case IDCANCEL:
                   1562:          EndDialog (hDlg, 0);
                   1563:          return (TRUE);
                   1564:          break ;
                   1565: 
                   1566:       case IDD_ADDLINEADD :
                   1567:          SetHourglassCursor() ;
                   1568:          OnAddLines (hDlg) ;
                   1569:          SetArrowCursor() ;
                   1570:          break;
                   1571: 
                   1572:       case IDD_ADDLINEEXPANDEXPLAIN :
                   1573:          OnExpandExplain (hDlg) ;
                   1574:          break;
                   1575: 
                   1576:       case IDD_ADDLINECOUNTER:
                   1577:          if (HIWORD (wParam) == LBN_SELCHANGE)
                   1578:             OnCounterChanged (hDlg) ;
                   1579:          break ;
                   1580:            
                   1581:       
                   1582:       case IDD_ADDLINEOBJECT:
                   1583:          if (HIWORD (wParam) == CBN_SELCHANGE)
                   1584:             OnObjectChanged (hDlg) ;
                   1585:          break ;
                   1586: 
                   1587:       case IDD_ADDLINECOMPUTER:
                   1588:          if (HIWORD (wParam) == EN_UPDATE)
                   1589:             {
                   1590:             ComputerChange = TRUE ;
                   1591:             DialogEnable (hDlg, IDD_ADDLINEADD, FALSE) ;
                   1592:             }
                   1593:          else if (HIWORD (wParam) == EN_KILLFOCUS)
                   1594:             {
                   1595:             if (ComputerChange)
                   1596:                {
                   1597:                SetHourglassCursor() ;
                   1598:                OnComputerChanged (hDlg) ;
                   1599:                }
                   1600:             }
                   1601:          break ;
                   1602: 
                   1603:       case IDD_ADDLINEHELP:
                   1604:          CallWinHelp (dwCurrentDlgID) ;
                   1605:          break ;
                   1606: 
                   1607:                default:
                   1608:                    break;
                   1609:            } // switch
                   1610: 
                   1611:    return (FALSE) ;
                   1612:    } // OnCommand
                   1613: 
                   1614: 
                   1615: void /*static*/ OnMeasureItem (HWND hDlg, 
                   1616:                            PMEASUREITEMSTRUCT pMI)
                   1617:    {
                   1618:    pMI->CtlType    = ODT_COMBOBOX ;
                   1619:    pMI->CtlID      = IDD_ADDLINECOLOR ;
                   1620:    pMI->itemData   = 0 ;
                   1621:    pMI->itemWidth  = 0 ;
                   1622: 
                   1623:    // need 14 in order to draw the thickest line width
                   1624:    pMI->itemHeight = 14 ;
                   1625: //   pMI->itemHeight = 12 ;
                   1626:    }
                   1627: 
                   1628: //***************************************************************************
                   1629: //                                                                          *
                   1630: //  FUNCTION   : HandleSelectionState(LPDRAWITEMSTRUCT)                     *
                   1631: //                                                                          *
                   1632: //  PURPOSE    : Handles a change in an item selection state. If an item is *
                   1633: //               selected, a black rectangular frame is drawn around that   *
                   1634: //               item; if an item is de-selected, the frame is removed.     *
                   1635: //                                                                          *
                   1636: //  COMMENT    : The black selection frame is slightly larger than the gray *
                   1637: //               focus frame so they won't paint over each other.           *
                   1638: //                                                                          *
                   1639: //***************************************************************************
                   1640: void static HandleSelectionState (LPDRAWITEMSTRUCT     lpdis)
                   1641: {
                   1642:        HBRUSH  hbr ;
                   1643: 
                   1644:        if (lpdis->itemState & ODS_SELECTED)
                   1645:        {
                   1646:                // selecting item -- paint a black frame
                   1647:                hbr = GetStockObject(BLACK_BRUSH) ;
                   1648:        }
                   1649:        else
                   1650:        {
                   1651:                // de-selecting item -- remove frame 
                   1652:                hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW)) ;
                   1653:        }
                   1654:        FrameRect(lpdis->hDC, (LPRECT)&lpdis->rcItem, hbr) ;
                   1655:        DeleteObject (hbr) ;
                   1656:    }  // HandleSelectionState
                   1657: 
                   1658: //***************************************************************************
                   1659: //                                                                          *
                   1660: //  FUNCTION   : HandleFocusState(LPDRAWITEMSTRUCT)                         *
                   1661: //                                                                          *
                   1662: //  PURPOSE    : Handle a change in item focus state. If an item gains the  *
                   1663: //               input focus, a gray rectangular frame is drawn around that *
                   1664: //               item; if an item loses the input focus, the gray frame is  *
                   1665: //               removed.                                                   *
                   1666: //                                                                          *
                   1667: //  COMMENT    : The gray focus frame is slightly smaller than the black    *
                   1668: //               selection frame so they won't paint over each other.       *
                   1669: //                                                                          *
                   1670: //***************************************************************************
                   1671: void static HandleFocusState (LPDRAWITEMSTRUCT lpdis)
                   1672:    {
                   1673:        RECT       rc ;
                   1674:        HBRUSH  hbr ;
                   1675: 
                   1676:        // Resize rectangle to place focus frame between the selection
                   1677:        // frame and the item.
                   1678:        CopyRect ((LPRECT)&rc, (LPRECT)&lpdis->rcItem) ;
                   1679:        InflateRect ((LPRECT)&rc, -OWNER_DRAW_FOCUS, -OWNER_DRAW_FOCUS) ;
                   1680: 
                   1681:        if (lpdis->itemState & ODS_FOCUS)
                   1682:        {
                   1683:                // gaining input focus -- paint a gray frame
                   1684:                hbr = GetStockObject(GRAY_BRUSH) ;
                   1685:        }
                   1686:        else
                   1687:        {
                   1688:                // losing input focus -- remove (paint over) frame
                   1689:                hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW)) ;
                   1690:        }
                   1691:        FrameRect(lpdis->hDC, (LPRECT)&rc, hbr) ;
                   1692:        DeleteObject (hbr) ;
                   1693:    }  // HandleFocusState
                   1694: 
                   1695: void /*static*/ OnDrawItem (HWND hDlg, PDRAWITEMSTRUCT pDI)
                   1696:    {  // OnDrawItem
                   1697:    HDC            hDC ;
                   1698:    PRECT          prect ;
                   1699:    INT            itemData, 
                   1700:                   itemID, 
                   1701:                   CtlID, 
                   1702:                   itemAction ;
                   1703:    LOGBRUSH       logBrush ;
                   1704:    HANDLE         hBrush, 
                   1705:                   hOldBrush, 
                   1706:                   hPen, 
                   1707:                   hOldPen ;
                   1708:    INT            x1, y1, x2, y2, cy ;
                   1709:    POINT          point ;
                   1710:    INT            iPenWidth ;
                   1711:    COLORREF       BackgroundColor ;
                   1712: 
                   1713:    hDC        = pDI-> hDC ;
                   1714:    CtlID      = pDI->CtlID ;
                   1715:    prect      = &pDI->rcItem ;
                   1716:    itemData   = pDI->itemData ;
                   1717:    itemID     = pDI->itemID ;
                   1718:    itemAction = pDI->itemAction ;
                   1719: 
                   1720: 
                   1721:    if (itemID == -1)
                   1722:       {
                   1723:       // invalid ID, can't go on
                   1724:       HandleFocusState (pDI) ;
                   1725:       }
                   1726:    else if (itemAction == ODA_SELECT)
                   1727:       {
                   1728:       HandleSelectionState(pDI);
                   1729:       }
                   1730:    else if (itemAction == ODA_FOCUS)
                   1731:       {
                   1732:       HandleFocusState (pDI) ;
                   1733:       }
                   1734:    else
                   1735:       {
                   1736:       
                   1737:       // draw the entire item
                   1738:       
                   1739:       InflateRect (prect, -OWNER_DRAWN_ITEM, -OWNER_DRAWN_ITEM) ;
                   1740: 
                   1741:       switch (CtlID)
                   1742:          {  // switch
                   1743:          case IDD_ADDLINECOLOR:
                   1744: 
                   1745:             // Draw a color rectangle into the control area
                   1746: 
                   1747:             logBrush.lbStyle = BS_SOLID ;
                   1748:             logBrush.lbColor = (COLORREF) argbColors[itemID] ;
                   1749:             logBrush.lbHatch = 0 ;
                   1750: 
                   1751:             hBrush = CreateBrushIndirect (&logBrush) ;
                   1752:             hOldBrush = SelectObject (hDC, hBrush) ;
                   1753: 
                   1754:             hPen = GetStockObject (NULL_PEN) ;
                   1755:             hOldPen = SelectObject (hDC, hPen) ;
                   1756: 
                   1757:             x1 = prect->left ;
                   1758:             y1 = prect->top ;
                   1759:             x2 = prect->right ;
                   1760:             y2 = prect->bottom ;
                   1761: 
                   1762:             Rectangle (hDC, x1, y1, x2, y2) ;
                   1763: 
                   1764:             SelectObject (hDC, hOldBrush) ;
                   1765:             DeleteObject (hBrush) ;
                   1766: 
                   1767:             InflateRect (prect, OWNER_DRAWN_ITEM, OWNER_DRAWN_ITEM) ;
                   1768: 
                   1769:             HandleSelectionState (pDI) ;
                   1770:             HandleFocusState (pDI) ;
                   1771: 
                   1772:             break ;
                   1773: 
                   1774:          case IDD_ADDLINEWIDTH:
                   1775:          case IDD_ADDLINESTYLE:
                   1776: 
                   1777:             // First draw a rectangle, white interior, null border
                   1778:             hBrush = GetStockObject (WHITE_BRUSH) ;
                   1779:             hOldBrush = SelectObject (hDC, hBrush) ;
                   1780: 
                   1781:             // we need to set the bk color in order to draw
                   1782:             // the dash lines coorectly during focus.  Otherwise,
                   1783:             // the COLOR_WINDOW background will make all dash lines
                   1784:             // look like solid line...
                   1785:             BackgroundColor = SetBkColor (hDC, crWhite) ;
                   1786: 
                   1787:             hPen = GetStockObject (NULL_PEN) ;
                   1788:             hOldPen = SelectObject (hDC, hPen) ;
                   1789: 
                   1790:             x1 = prect->left ;
                   1791:             y1 = prect->top ;
                   1792:             x2 = prect->right ;
                   1793:             y2 = prect->bottom ;
                   1794: 
                   1795:             Rectangle (hDC, x1, y1, x2, y2) ;
                   1796: 
                   1797:             SelectObject (hDC, hOldPen) ;
                   1798: 
                   1799:             // Draw a line of the itemID width in the middle
                   1800:             // of the control area.
                   1801: 
                   1802:             if (CtlID == IDD_ADDLINEWIDTH)
                   1803:                {
                   1804:                iPenWidth = LineWidth (itemID) ;
                   1805:                hPen = CreatePen (PS_SOLID, iPenWidth, RGB (0, 0, 0)) ;
                   1806:                }
                   1807:             else
                   1808:                {
                   1809:                hPen = CreatePen (itemID, 1, RGB (0, 0, 0)) ;
                   1810:                }
                   1811: 
                   1812:             hOldPen = SelectObject (hDC, hPen) ;
                   1813: 
                   1814:             x1 = prect->left + 8 ;
                   1815:             cy = prect->bottom - prect->top ;
                   1816:             y1 = prect->top + (cy / 2) - 1 ;
                   1817:             x2 = prect->right - 8 ;
                   1818:             MoveToEx (hDC, x1, y1, &point) ;
                   1819:             LineTo (hDC, x2, y1) ;
                   1820: 
                   1821:             SelectObject (hDC, hOldPen) ;
                   1822:             DeleteObject (hPen) ;
                   1823:             SelectObject (hDC, hOldBrush) ;
                   1824:             BackgroundColor = SetBkColor (hDC, BackgroundColor) ;
                   1825: 
                   1826:             InflateRect (prect, OWNER_DRAWN_ITEM, OWNER_DRAWN_ITEM) ;
                   1827: 
                   1828:             HandleSelectionState (pDI) ;
                   1829:             HandleFocusState (pDI) ;
                   1830: 
                   1831:             break ;
                   1832:          }   // switch
                   1833:       }  // draw entire item   
                   1834:    }  // OnDrawItem
                   1835:                         
                   1836: 
                   1837: void /*static*/ OnDestroy (HDLG hDlg)
                   1838:    {  // OnDestroy
                   1839: #if 0
                   1840:    if (!bEditLine)
                   1841:       {
                   1842:       switch (iLineType)
                   1843:          {
                   1844:          case LineTypeAlert:
                   1845:             BuildNewValueListForAlert ();
                   1846:             break;
                   1847: 
                   1848:          case LineTypeChart:
                   1849:             BuildNewValueListForGraph ();
                   1850:             break;
                   1851: 
                   1852:          case LineTypeReport:
                   1853:             BuildNewValueListForReport ();
                   1854:             break;
                   1855: 
                   1856:          default:
                   1857:             break;
                   1858:          }
                   1859:       }
                   1860: #endif
                   1861:    if (!PlayingBackLog ())
                   1862:       MemoryFree (pPerfData) ;
                   1863: 
                   1864:    if (pszAlertProgram)
                   1865:       {
                   1866:       MemoryFree (pszAlertProgram) ;
                   1867:       pszAlertProgram = NULL ;
                   1868:       }
                   1869: 
                   1870:    pLineEdit = NULL ;
                   1871:    bAddLineInProgress = FALSE ;
                   1872:    dwCurrentDlgID = 0 ;
                   1873:    bExplainTextButtonHit = FALSE ;
                   1874:    }  // OnDestroy
                   1875:    
                   1876: 
                   1877: 
                   1878: //==========================================================================//
                   1879: //                             Exported Functions                           //
                   1880: //==========================================================================//
                   1881: 
                   1882: 
                   1883: 
                   1884: BOOL FAR PASCAL AddLineDlgProc (HWND hDlg, 
                   1885:                                 WORD msg, 
                   1886:                                 DWORD wParam, 
                   1887:                                 LONG lParam)
                   1888:    {  // AddLineDlgProc
                   1889: 
                   1890:    BOOL Status;
                   1891: 
                   1892:    switch (msg)
                   1893:       {  // switch
                   1894:       case WM_COMMAND:
                   1895:          OnCommand (hDlg, wParam, lParam) ;
                   1896:          return (FALSE) ;
                   1897:          break ;
                   1898: 
                   1899: #if 0
                   1900:       case WM_DLGKILLFOCUS:
                   1901:       case WM_KILLFOCUS:
                   1902:          if (EditModified (hWndComputer))
                   1903:             {
                   1904:             SetHourglassCursor() ;
                   1905:             OnComputerChanged (hDlg) ;
                   1906:             SetArrowCursor() ;
                   1907:             }
                   1908:          EditSetModified (hWndComputer, FALSE) ;
                   1909:          break ;
                   1910: #endif
                   1911: 
                   1912:        case WM_INITDIALOG:
                   1913:          SetHourglassCursor() ;
                   1914:          Status = OnInitDialog (hDlg) ;
                   1915:          SetArrowCursor() ;
                   1916: 
                   1917:          // set focus on the "Add" button instead of the "Computer"
                   1918:          SetFocus (DialogControl (hDlg, IDD_ADDLINEADD)) ;
                   1919:          return FALSE ;
                   1920:          break ;
                   1921: 
                   1922:       case WM_MEASUREITEM:
                   1923:          OnMeasureItem (hDlg, (PMEASUREITEMSTRUCT) lParam) ;
                   1924:          return (TRUE) ;
                   1925:          break ;
                   1926: 
                   1927:       case WM_DRAWITEM:
                   1928:          OnDrawItem (hDlg, (PDRAWITEMSTRUCT) lParam) ;
                   1929:          return (TRUE) ;
                   1930:          break ;
                   1931: 
                   1932:       case WM_DESTROY:
                   1933:          OnDestroy (hDlg) ;
                   1934:          break ;
                   1935:            
                   1936:        default:
                   1937:              break;
                   1938:       }  // switch
                   1939: 
                   1940:    return (FALSE) ;
                   1941:    }  // AddLineDlgProc
                   1942: 
                   1943: 
                   1944: 
                   1945: 
                   1946: BOOL AddLine (HWND hWndParent, 
                   1947:               PPERFSYSTEM *ppSystemFirstView,
                   1948:               PLINEVISUAL pLineVisual,
                   1949:               int iLineTypeToAdd)
                   1950: /*
                   1951:    Effect:        Display the add line dialog box, allowing the user
                   1952:                   to specify the computer, object, counter, instance,
                   1953:                   and scale for a line.  The user can also select the
                   1954:                   visual aspects of color, width and line style.
                   1955: 
                   1956: */                  
                   1957:    {  // AddLine
                   1958:    pLineEdit = NULL ;
                   1959: 
                   1960:    ppSystemFirst = ppSystemFirstView ;   
                   1961:    iLineType = iLineTypeToAdd ;
                   1962:    pVisual = pLineVisual ;
                   1963: 
                   1964: 
                   1965:    return (DialogBox (hInstance, idDlgAddLine, 
                   1966:                       hWndParent, (DLGPROC) AddLineDlgProc)) ;
                   1967:    }  // AddLine
                   1968: 
                   1969: 
                   1970: 
                   1971: BOOL EditLine (HWND hWndParent,
                   1972:                PPERFSYSTEM *ppSystemFirstView,
                   1973:                PLINE pLineToEdit,
                   1974:                int iLineTypeToEdit)
                   1975:    {  // EditLine
                   1976:    if (!pLineToEdit)
                   1977:       {
                   1978:       MessageBeep (0) ;
                   1979:       return (FALSE) ;
                   1980:       }
                   1981: 
                   1982:    pLineEdit = pLineToEdit ;
                   1983: 
                   1984:    ppSystemFirst = ppSystemFirstView ;   
                   1985:    iLineType = iLineTypeToEdit ;
                   1986:    pVisual = &(pLineToEdit->Visual) ;
                   1987:    
                   1988:    return (DialogBox (hInstance, idDlgAddLine, 
                   1989:                       hWndParent, (DLGPROC) AddLineDlgProc)) ;
                   1990:    }  // EditLine
                   1991: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.