/*++

Copyright (C) 1996-1999 Microsoft Corporation

Module Name:

    genprop.cpp

Abstract:

    <abstract>

--*/

#include <assert.h>
#include <stdio.h>
#include "genprop.h"
#include "utils.h"
#include "strids.h"
#include "smonctrl.h"
#include "winhelpr.h"

CGeneralPropPage::CGeneralPropPage ( void )
/*++

Routine Description:

    Constructor for CGeneralPropPage class. Initializes the member variables.
     
Arguments:

    None.

Return Value:

    None.

--*/
{
    m_uIDDialog = IDD_GEN_PROPP_DLG;
    m_uIDTitle = IDS_GEN_PROPP_TITLE;
    return;
}

CGeneralPropPage::~CGeneralPropPage (
    VOID
    )
/*++

Routine Description:

    Destructor for CGeneralPropPage class. .
     
Arguments:

    None.

Return Value:

    None.

--*/
{
    return;
}

BOOL
CGeneralPropPage::InitControls(
    VOID
    )
{
    HWND    hWndItem = NULL;

    hWndItem = GetDlgItem(m_hDlg, IDC_UPDATE_INTERVAL);
    if ( NULL != hWndItem ) {
        EditSetLimit(hWndItem, MAX_INTERVAL_DIGITS);
        hWndItem = NULL;
    }
    hWndItem = DialogControl (m_hDlg, IDC_COMBOAPPEARANCE) ;
    if ( NULL != hWndItem ) {
        CBAdd (hWndItem, ResourceString(IDS_APPEARANCE_FLAT));
        CBSetData( hWndItem, 0, eAppearFlat );
        CBAdd (hWndItem, ResourceString(IDS_APPEARANCE_3D));
        CBSetData( hWndItem, 1, eAppear3D );
        hWndItem = NULL;
    }    
    hWndItem = DialogControl (m_hDlg, IDC_COMBOBORDERSTYLE) ;
    if ( NULL != hWndItem ) {
        CBAdd (hWndItem, ResourceString(IDS_BORDERSTYLE_NONE));
        CBSetData( hWndItem, 0, eBorderNone );
        CBAdd (hWndItem, ResourceString(IDS_BORDERSTYLE_SINGLE));
        CBSetData( hWndItem, 1, eBorderSingle );
        hWndItem = NULL;
    }

    return TRUE;
    //assert( IsWindowUnicode( m_hDlg ) );
    //assert( IsWindowUnicode( hWndItem ) );
}

BOOL 
CGeneralPropPage::GetProperties(
    VOID
    )
/*++

Routine Description:

    GetProperties fetches the selected graph's properties via the 
    ISystemMonitor interface and loads them into the property page dialog.
    It also clears all the propery change flags.

Arguments:

    None.

Return Value:

    Boolean status - TRUE = success

--*/
{
    TCHAR   szBuff[30];
    ISystemMonitor  *pObj;
    INT iPrecision;
    HWND    hWndItem;

    // Make sure a control is selected
    if (m_cObjects == 0)
        return FALSE;
    
    // Use only the first one   
    pObj = m_ppISysmon[0];
    
    // Load each graph property
    pObj->get_DisplayType(&m_eDisplayType);
    CheckRadioButton(m_hDlg, IDC_GALLERY_GRAPH, IDC_GALLERY_REPORT,
                        IDC_GALLERY_GRAPH + m_eDisplayType - 1);

    pObj->get_ReportValueType(&m_eReportValueType);
    CheckRadioButton(m_hDlg, IDC_RPT_VALUE_DEFAULT, IDC_RPT_VALUE_MAXIMUM,
                        IDC_RPT_VALUE_DEFAULT + m_eReportValueType);

    pObj->get_ShowLegend(&m_bLegend) ;
    CheckDlgButton(m_hDlg, IDC_LEGEND, m_bLegend);
    
    pObj->get_ShowToolbar (&m_bToolbar);
    CheckDlgButton (m_hDlg, IDC_TOOLBAR, m_bToolbar);
    
    pObj->get_ShowValueBar(&m_bValueBar);
    CheckDlgButton(m_hDlg, IDC_VALUEBAR, m_bValueBar) ;

    pObj->get_MonitorDuplicateInstances(&m_bMonitorDuplicateInstances);
    CheckDlgButton(m_hDlg, IDC_DUPLICATE_INSTANCE, m_bMonitorDuplicateInstances) ;

    pObj->get_Appearance(&m_iAppearance);
    hWndItem = DialogControl (m_hDlg, IDC_COMBOAPPEARANCE) ;
    CBSetSelection (hWndItem, m_iAppearance) ;

    pObj->get_BorderStyle(&m_iBorderStyle);
    hWndItem = DialogControl (m_hDlg, IDC_COMBOBORDERSTYLE) ;
    CBSetSelection (hWndItem, m_iBorderStyle) ;

    pObj->get_UpdateInterval(&m_fSampleInterval);

    ((INT)(100 * m_fSampleInterval) != 100 * (INT)m_fSampleInterval) 
        ? iPrecision = 2 : iPrecision = 0;

        FormatNumber (
            m_fSampleInterval,
            szBuff,
            30,
            0,
            iPrecision );

    SetDlgItemText(m_hDlg, IDC_UPDATE_INTERVAL, szBuff) ;

    pObj->get_DisplayFilter(&m_iDisplayInterval);
    _stprintf(szBuff, TEXT("%d"), m_iDisplayInterval) ;
    SetDlgItemText(m_hDlg, IDC_DISPLAY_INTERVAL, szBuff) ;

    pObj->get_ManualUpdate(&m_bManualUpdate);
    CheckDlgButton (m_hDlg, IDC_PERIODIC_UPDATE, !m_bManualUpdate);

    // If manual update, disable sample (update) and display intervals 
    DialogEnable (m_hDlg, IDC_UPDATE_INTERVAL, !m_bManualUpdate) ;
    DialogEnable (m_hDlg, IDC_INTERVAL_LABEL, !m_bManualUpdate) ;
    DialogEnable (m_hDlg, IDC_DISPLAY_INTERVAL, !m_bManualUpdate) ;
    DialogEnable (m_hDlg, IDC_DISPLAY_INT_LABEL1, !m_bManualUpdate) ;
    DialogEnable (m_hDlg, IDC_DISPLAY_INT_LABEL2, !m_bManualUpdate) ;

    // Clear all change flags 
    m_bLegendChg = FALSE;
    m_bValueBarChg = FALSE;
    m_bToolbarChg = FALSE;
    m_bSampleIntervalChg = FALSE;
    m_bDisplayIntervalChg = FALSE;
    m_bDisplayTypeChg = FALSE;
    m_bReportValueTypeChg = FALSE;
    m_bManualUpdateChg = FALSE;
    m_bAppearanceChg = FALSE;
    m_bBorderStyleChg = FALSE;
    m_bMonitorDuplicateInstancesChg = FALSE;

    // Clear error flags
    m_iErrSampleInterval = 0;
    m_iErrDisplayInterval = 0;

    return TRUE;    
}


BOOL 
CGeneralPropPage::SetProperties (
    VOID
    )
/*++

Routine Description:

    SetProperties writes the changed graph properties to the selected control
    via the ISystemMonitor interface. It then resets all the change flags.
     
Arguments:

    None.

Return Value:

    Boolean status - TRUE = success

--*/
{
    ISystemMonitor  *pObj;
    
    // Make sure a control is selected
    if (m_cObjects == 0)
        return FALSE;

    // Use only the first control   
    pObj = m_ppISysmon[0];

    // Check for invalid data

    if ( !m_bManualUpdate ) {
        if ( m_iErrSampleInterval ) {
            MessageBox (m_hDlg, ResourceString(IDS_INTERVAL_ERR), ResourceString(IDS_APP_NAME), MB_OK | MB_ICONEXCLAMATION) ;
            SetFocus ( GetDlgItem ( m_hDlg, IDC_UPDATE_INTERVAL ) );
            return FALSE;
        }
        if ( m_iErrDisplayInterval ) {
            MessageBox (m_hDlg, ResourceString(IDS_DISPLAY_INT_ERR), ResourceString(IDS_APP_NAME), MB_OK | MB_ICONEXCLAMATION) ;
            SetFocus ( GetDlgItem ( m_hDlg, IDC_DISPLAY_INTERVAL ) );
            return FALSE;
        }
    }
    // Write each changed property to the control
    if (m_bLegendChg)
        pObj->put_ShowLegend(m_bLegend);

    if (m_bToolbarChg)
        pObj->put_ShowToolbar(m_bToolbar);

    if (m_bValueBarChg)
        pObj->put_ShowValueBar(m_bValueBar);

    if (m_bSampleIntervalChg)
        pObj->put_UpdateInterval(m_fSampleInterval);

    if (m_bDisplayIntervalChg) {
        pObj->put_DisplayFilter(m_iDisplayInterval);
    }

    if (m_bDisplayTypeChg)
        pObj->put_DisplayType(m_eDisplayType);

    if (m_bReportValueTypeChg)
        pObj->put_ReportValueType(m_eReportValueType);

    if (m_bManualUpdateChg)
        pObj->put_ManualUpdate(m_bManualUpdate);

    if (m_bAppearanceChg)
        pObj->put_Appearance(m_iAppearance);

    if (m_bBorderStyleChg)  
        pObj->put_BorderStyle(m_iBorderStyle);

    if (m_bMonitorDuplicateInstancesChg)
        pObj->put_MonitorDuplicateInstances(m_bMonitorDuplicateInstances);

    // Reset the change flags
    m_bLegendChg = FALSE;
    m_bValueBarChg = FALSE;
    m_bToolbarChg = FALSE;
    m_bSampleIntervalChg = FALSE;
    m_bDisplayIntervalChg = FALSE;
    m_bDisplayTypeChg = FALSE;
    m_bReportValueTypeChg = FALSE;
    m_bManualUpdateChg = FALSE;
    m_bAppearanceChg = FALSE;
    m_bBorderStyleChg = FALSE;
        
    return TRUE;    
}


VOID 
CGeneralPropPage::DialogItemChange (
    IN WORD wID, 
    IN WORD wMsg
    )
/*++

Routine Description:

    DialogItemChange handles changes to the property page dialog items. On
    each change it reads the new property value and set the property's change
    flag. On any change the SetChange routine is called to enable the "Apply"
    button.

Arguments:

    wID - Dialog item ID
    wMsg - Notification code

Return Value:

    None.

--*/
{
    BOOL fChange = FALSE;
    INT  iTemp;
    BOOL bStat = FALSE;
    HWND hWndItem;

    // Case on dialog item ID
    switch(wID) {

        case IDC_UPDATE_INTERVAL:

            // On change, set change flags
            // Wait until focus lost to read final value
            if (wMsg == EN_CHANGE) {

                fChange = TRUE;
                m_bSampleIntervalChg = TRUE;
            }
            else if (wMsg == EN_KILLFOCUS) {

                m_fSampleInterval = DialogFloat(m_hDlg, IDC_UPDATE_INTERVAL, &bStat) ;

                if (bStat && 
                     (m_fSampleInterval <= MAX_UPDATE_INTERVAL 
                        && m_fSampleInterval >= MIN_UPDATE_INTERVAL)) {
                    m_iErrSampleInterval = 0;
                } else {                
                    m_iErrSampleInterval = IDS_INTERVAL_ERR;
                }
            }
            break ;

        case IDC_DISPLAY_INTERVAL:

            // On change, set change flags
            // Wait until focus lost to read final value
            if (wMsg == EN_CHANGE) {
                fChange = TRUE;
                m_bDisplayIntervalChg = TRUE;
            } else if (wMsg == EN_KILLFOCUS) {
                m_iDisplayInterval = GetDlgItemInt(m_hDlg, IDC_DISPLAY_INTERVAL, &bStat, FALSE);
                // TodoDisplayFilter:  Support for display filter > sample filter.
                // TodoDisplayFilter:  Display filter units = seconds instead of samples

                if ( 1 != m_iDisplayInterval ) {
                    TCHAR   szBuff[30];
                    MessageBox (
                        m_hDlg, 
                        L"Display filter > 1 sample not yet implemented.\nDisplay interval in seconds not yet implemented.", 
                        ResourceString(IDS_APP_NAME), MB_OK | MB_ICONEXCLAMATION) ;
                    m_iDisplayInterval = 1;
                    _stprintf(szBuff, TEXT("%d"), m_iDisplayInterval) ;
                    SetDlgItemText(m_hDlg, IDC_DISPLAY_INTERVAL, szBuff) ;
                } else {
                    if ( FALSE == bStat) {
                        m_iErrDisplayInterval = IDS_DISPLAY_INT_ERR;
                    } else {
                        m_iErrDisplayInterval = 0;
                    }
                }
            }
            break ;

        case IDC_PERIODIC_UPDATE:

            if (wMsg == BN_CLICKED) {

                m_bManualUpdate = !m_bManualUpdate;
                m_bManualUpdateChg = TRUE;
                fChange = TRUE;
            
                // Disable sample (update) and display intervals if necessary
                DialogEnable (m_hDlg, IDC_INTERVAL_LABEL, !m_bManualUpdate) ;
                DialogEnable (m_hDlg, IDC_UPDATE_INTERVAL, !m_bManualUpdate) ;
                DialogEnable (m_hDlg, IDC_DISPLAY_INTERVAL, !m_bManualUpdate) ;
                DialogEnable (m_hDlg, IDC_DISPLAY_INT_LABEL1, !m_bManualUpdate) ;
                DialogEnable (m_hDlg, IDC_DISPLAY_INT_LABEL2, !m_bManualUpdate) ;
            }

            break ;

        case IDC_VALUEBAR:

            // If checkbox toggled, set change flags
            if (wMsg == BN_CLICKED) {

                m_bValueBar = !m_bValueBar;
                m_bValueBarChg = TRUE;
                fChange = TRUE;
            }
            break ;

        case IDC_LEGEND:

            // If checkbox toggled, set change flags
            if (wMsg == BN_CLICKED) {

                m_bLegend = !m_bLegend;
                m_bLegendChg = TRUE;
                fChange = TRUE;
            }
            break ;

        case IDC_TOOLBAR:
            if (wMsg == BN_CLICKED) {
                m_bToolbar = !m_bToolbar;
                m_bToolbarChg = TRUE;
                fChange = TRUE;
            }
            break;

        case IDC_COMBOAPPEARANCE:
            if (wMsg == CBN_SELCHANGE) {
                hWndItem = DialogControl(m_hDlg, IDC_COMBOAPPEARANCE);
                iTemp = (INT)CBSelection(hWndItem);

                if ( m_iAppearance != iTemp ) {
                    m_bAppearanceChg = TRUE;
                    fChange = TRUE;
                }

                m_iAppearance = iTemp;
            }
            break ;

        case IDC_COMBOBORDERSTYLE:
            if (wMsg == CBN_SELCHANGE) {
                hWndItem = DialogControl(m_hDlg, IDC_COMBOBORDERSTYLE);
                iTemp = (INT)CBSelection(hWndItem);

                if ( m_iBorderStyle != iTemp ) {
                    m_bBorderStyleChg = TRUE;
                    fChange = TRUE;
                }

                m_iBorderStyle = iTemp;
            }
            break ;

        case IDC_DUPLICATE_INSTANCE:

            // If checkbox toggled, set change flags
            if (wMsg == BN_CLICKED) {

                m_bMonitorDuplicateInstances = !m_bMonitorDuplicateInstances;
                m_bMonitorDuplicateInstancesChg = TRUE;
                fChange = TRUE;
            }
            break ;

        case IDC_GALLERY_GRAPH:
        case IDC_GALLERY_HISTOGRAM:
        case IDC_GALLERY_REPORT: 
            // Check which button is involved
            iTemp = wID - IDC_GALLERY_GRAPH + 1; 

            // If state changed
            if (wMsg == BN_CLICKED && iTemp != m_eDisplayType) {

                // Set change flags and update dialog
                fChange = TRUE;
                m_bDisplayTypeChg = TRUE;
                m_eDisplayType = (DisplayTypeConstants)iTemp;

                CheckRadioButton(m_hDlg, IDC_GALLERY_GRAPH, 
                                    IDC_GALLERY_REPORT, wID);
            }   
            break ;

        case IDC_RPT_VALUE_DEFAULT:
        case IDC_RPT_VALUE_CURRENT:
        case IDC_RPT_VALUE_AVERAGE:
        case IDC_RPT_VALUE_MINIMUM:
        case IDC_RPT_VALUE_MAXIMUM:
            // Check which button is involved
            iTemp = wID - IDC_RPT_VALUE_DEFAULT; 

            // If state changed
            if (wMsg == BN_CLICKED && iTemp != m_eReportValueType) {

                // Set change flags and update dialog
                fChange = TRUE;
                m_bReportValueTypeChg = TRUE;
                m_eReportValueType = (ReportValueTypeConstants)iTemp;

                CheckRadioButton(m_hDlg, IDC_RPT_VALUE_DEFAULT, 
                                    IDC_RPT_VALUE_MAXIMUM, wID);
            }   
            break ;
    }

    // Enable "Apply" button on any change
    if (fChange)
        SetChange();
}