Annotation of mstools/samples/sdktools/perfmon/addline.c, revision 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.