//*********************************************************************** // evntprop.cpp // // This file contains the implementation of the event properties dialog. // // Author: SEA // // History: // 20-Febuary-1996 Larry A. French // Made various changes to this code. However, much of it is // legacy code and in dire need of being rewritten. // // // Copyright (C) 1995, 1996 Microsoft Corporation. All rights reserved. // //************************************************************************ #include "stdafx.h" #include "resource.h" #include "eventrap.h" #include "evntprop.h" #include "trapreg.h" #include "globals.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif #define MAX_EVENT_COUNT 32767 #define MAX_TIME_INTERVAL 32767 #define IsWithinRange(value, lower, upper) (((value) >= (lower)) && ((value) <= (upper))) void RangeError(int iLower, int iUpper) { TCHAR szBuffer[1024]; CString sFormat; sFormat.LoadString(IDS_ERR_RANGE); _stprintf(szBuffer, (LPCTSTR) sFormat, iLower, iUpper); AfxMessageBox(szBuffer); } ///////////////////////////////////////////////////////////////////////////// // CEventPropertiesDlg dialog CEventPropertiesDlg::CEventPropertiesDlg(CWnd* pParent /*=NULL*/) : CDialog(CEventPropertiesDlg::IDD, pParent) { //{{AFX_DATA_INIT(CEventPropertiesDlg) m_sDescription = _T(""); m_sSource = _T(""); m_sEventId = _T(""); m_sLog = _T(""); m_sSourceOID = _T(""); m_sFullEventID = _T(""); //}}AFX_DATA_INIT } BOOL CEventPropertiesDlg::OnInitDialog() { CDialog::OnInitDialog(); m_spinEventCount.SetRange(1, MAX_EVENT_COUNT); if (m_iEventCount==0) { m_spinEventCount.SetPos(1); } else { m_spinEventCount.SetPos(m_iEventCount); } if (m_iTimeInterval == 0) { m_btnWithinTime.SetCheck(0); m_spinTimeInterval.SetRange(0, MAX_TIME_INTERVAL); } else { m_btnWithinTime.SetCheck(1); m_spinTimeInterval.SetRange(1, MAX_TIME_INTERVAL); } m_spinTimeInterval.SetPos(m_iTimeInterval); m_edtTimeInterval.EnableWindow(m_btnWithinTime.GetCheck() == 1); m_spinTimeInterval.EnableWindow(m_btnWithinTime.GetCheck() == 1); // If this is not a custom configuration, do not let the user // modify the configuration. if ((g_reg.GetConfigType() != CONFIG_TYPE_CUSTOM) || (g_reg.m_bRegIsReadOnly)) { m_btnOK.EnableWindow(FALSE); } m_bDidEditEventCount = FALSE; OnWithintime(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CEventPropertiesDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CEventPropertiesDlg) DDX_Control(pDX, IDC_WITHINTIME, m_btnWithinTime); DDX_Control(pDX, IDC_EVENTCOUNTSPN, m_spinEventCount); DDX_Control(pDX, IDC_TIMEINTRVLSPN, m_spinTimeInterval); DDX_Control(pDX, IDC_TIMEINTERVAL, m_edtTimeInterval); DDX_Control(pDX, IDC_EVENTCOUNT, m_edtEventCount); DDX_Control(pDX, IDOK, m_btnOK); DDX_Text(pDX, IDC_DESCRIPTION, m_sDescription); DDV_MaxChars(pDX, m_sDescription, 2048); DDX_Text(pDX, ID_STAT_SOURCE, m_sSource); DDV_MaxChars(pDX, m_sSource, 256); DDX_Text(pDX, ID_STAT_EVENTID, m_sEventId); DDX_Text(pDX, ID_STAT_LOG, m_sLog); DDX_Text(pDX, IDC_EDIT_ENTERPRISEOID, m_sSourceOID); DDX_Text(pDX, IDC_EDIT_FULL_EVENT_ID, m_sFullEventID); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CEventPropertiesDlg, CDialog) //{{AFX_MSG_MAP(CEventPropertiesDlg) ON_BN_CLICKED(IDC_WITHINTIME, OnWithintime) ON_COMMAND(ID_HELP, OnHelp) ON_WM_HELPINFO() ON_WM_CONTEXTMENU() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CEventPropertiesDlg message handlers void CEventPropertiesDlg::OnOK() { // TODO: Add extra validation here int iLower, iUpper; CString sText; m_spinEventCount.GetRange(iLower, iUpper); // Validate the event count edit item and set m_iEventCount m_edtEventCount.GetWindowText(sText); if (!IsDecimalInteger(sText)) { RangeError(iLower, iUpper); m_edtEventCount.SetSel(0, -1); m_edtEventCount.SetFocus(); return; } m_iEventCount = _ttoi(sText); if (!IsWithinRange(m_iEventCount, iLower, iUpper)) { RangeError(iLower, iUpper); sText.Format(_T("%u"), m_iEventCount); m_edtEventCount.SetWindowText(sText); m_edtEventCount.SetSel(0, -1); m_edtEventCount.SetFocus(); return; } // Validate the time interval and set m_iTimeInterval m_spinTimeInterval.GetRange(iLower, iUpper); m_edtTimeInterval.GetWindowText(sText); if (!IsDecimalInteger(sText)) { RangeError(iLower, iUpper); m_edtTimeInterval.SetSel(0, -1); m_edtTimeInterval.SetFocus(); return; } m_iTimeInterval = _ttoi(sText); if (m_btnWithinTime.GetCheck() == 1) { if (m_iEventCount < 2) { AfxMessageBox(IDS_ERR_PROP_TIME1); m_edtEventCount.SetSel(0, -1); m_edtEventCount.SetFocus(); return; } if (m_iTimeInterval < 1) { AfxMessageBox(IDS_ERR_PROP_TIME2); sText.Format(_T("%u"), m_iTimeInterval); m_edtTimeInterval.SetWindowText(sText); m_edtTimeInterval.SetSel(0, -1); m_edtTimeInterval.SetFocus(); return; } if (!IsWithinRange(m_iTimeInterval, iLower, iUpper)) { RangeError(iLower, iUpper); sText.Format(_T("%u"), m_iTimeInterval); m_edtTimeInterval.SetWindowText(sText); m_edtTimeInterval.SetSel(0, -1); m_edtTimeInterval.SetFocus(); return; } } else if (m_iEventCount < 1) { AfxMessageBox(IDS_ERR_PROP_TIME_LESS_THAN_TWO); m_edtEventCount.SetSel(0, -1); return; } CDialog::OnOK(); // We don't set the g_reg.m_bIsDirty flag here because we want to see if the // user actually changed the current settings. This check is made in // CEventPropertiesDlg::EditEventProperties on a per-event basis. } void CEventPropertiesDlg::OnWithintime() { // The WithinTime checkbox was clicked. // Enable/disable the TimeInterval control. // Check to see if the count field has been edited. If it has been edited, // mark the field as being dirty. if (m_edtEventCount.IsDirty() || m_spinEventCount.IsDirty()) { m_bDidEditEventCount = TRUE; } int iEventCount; int iTemp; SCODE sc = m_edtEventCount.GetValue(iEventCount); if (FAILED(sc)) { m_spinEventCount.GetRange(iEventCount, iTemp); m_spinEventCount.SetPos(iEventCount); m_bDidEditEventCount = FALSE; } if (m_btnWithinTime.GetCheck() == 1) { m_edtTimeInterval.EnableWindow(TRUE); m_spinTimeInterval.EnableWindow(TRUE); if (iEventCount < 2) { // If the event count is less than two, it will flip to two when the spin button's // range is set. In this event, we make it appear as if the user never edited the // value so that it will flip back when the check box is unchecked. m_bDidEditEventCount = FALSE; m_bDidFlipEventCount = TRUE; m_edtEventCount.ClearDirty(); m_spinEventCount.ClearDirty(); m_spinEventCount.SetPos(2); } m_spinEventCount.SetRange(2, MAX_EVENT_COUNT); m_spinTimeInterval.SetRange(1, MAX_TIME_INTERVAL); } else { m_edtTimeInterval.EnableWindow(FALSE); m_spinTimeInterval.EnableWindow(FALSE); m_spinEventCount.SetRange(1, MAX_EVENT_COUNT); m_spinEventCount.SetPos(iEventCount); m_spinTimeInterval.SetRange(0, MAX_TIME_INTERVAL); m_spinTimeInterval.SetPos(0); // If the initial event count was one and we flipped it to two when the "within time" // button was clicked, then flip it back to one now if it was not edited. if (m_bDidFlipEventCount) { if (!m_bDidEditEventCount) { m_spinEventCount.SetPos(1); } m_bDidFlipEventCount = FALSE; } } m_spinTimeInterval.SetRedraw(); } //*************************************************************************** // // CEventPropertiesDlg::MakeLabelsBold // // This method makes the static labels bold to enhance the appearance of // the dialog. // // This method should be called after CDIalog::InitDialog. // // Parameters: // None. // // Returns: // Nothing. // // Status: // The MFC2.0 library makes the labels invisible when an attempt // is made to change the font of a static item. I've tried this with // MFC4.0 and it works. // //*************************************************************************** void CEventPropertiesDlg::MakeLabelsBold() { #if 0 CFont* pfontDefault; LOGFONT lf; // Get the LOGFONT for the default static item font and then // switch the logfont weight to bold. pfontDefault = m_statSource.GetFont(); pfontDefault->GetObject(sizeof(lf), &lf); lf.lfWeight = FW_BOLD; // Create a bold font with all other characteristics the same as the // default font. Then switch all labels to a bold font. CFont fontNew; if (fontNew.CreateFontIndirect(&lf)) { m_statSource.SetFont(&fontNew, TRUE); m_statLog.SetFont(&fontNew, TRUE); m_statEventID.SetFont(&fontNew, TRUE); m_statEnterpriseOID.SetFont(&fontNew, TRUE); } #endif //0 } //******************************************************************** // CEventPropertiesDlg::EditEventProperties // // Edit the properties of a number of events. // // Parameters: // CEventArray& aEvents // An array of CEvent pointers. These are the events that // are to be edited. // // Returns: // BOOL // TRUE if the user clicked OK and the events were edited. // FALSE if the user clicked Cancel and the events were not // edited. // //****************************************************************** BOOL CEventPropertiesDlg::EditEventProperties(CXEventArray& aEvents) { LONG nEvents = aEvents.GetSize(); if (nEvents == 0) { return TRUE; } // The first event is taken as a representative of the other // events. Copy the appropriate data from this event to the // dialog. CString sText; CXEvent* pEvent = aEvents[0]; CXEventSource* pEventSource = pEvent->m_pEventSource; CXEventLog* pEventLog = pEventSource->m_pEventLog; LONG iEvent; BOOL bMultipleSources = FALSE; BOOL bMultipleLogs = FALSE; for (iEvent=0; iEvent < nEvents; ++iEvent) { pEvent = aEvents[iEvent]; if (pEvent->m_pEventSource != pEventSource) { bMultipleSources = TRUE; } if (pEvent->m_pEventSource->m_pEventLog != pEventLog) { bMultipleLogs = TRUE; } } if (bMultipleSources) { m_sSource.LoadString(IDS_MULTIPLE_SEL); m_sSourceOID.LoadString(IDS_MULTIPLE_SEL); } else { m_sSource = pEventSource->m_sName; pEventSource->GetEnterpriseOID(m_sSourceOID, TRUE); } if (bMultipleLogs) { m_sLog.LoadString(IDS_MULTIPLE_SEL); } else { m_sLog = pEventSource->m_pEventLog->m_sName; } // Copy the initial values. m_iTimeInterval = (int) pEvent->m_dwTimeInterval; m_iEventCount = pEvent->m_dwCount; m_bDidFlipEventCount = FALSE; // m_bWithinTime = (m_iTimeInterval != 0); if (nEvents > 1) { m_sEventId.LoadString(IDS_MULTIPLE_SEL); m_sDescription.LoadString(IDS_MULTIPLE_SEL); m_sFullEventID.LoadString(IDS_MULTIPLE_SEL); } else { pEvent->m_message.GetShortId(m_sEventId); m_sDescription = pEvent->m_message.m_sText; DecString(m_sFullEventID, pEvent->m_message.m_dwId); } // Put up the dialog and let the user edit the data. BOOL bDidCancel = (DoModal() == IDCANCEL); if (bDidCancel) { // The user canceled the dialog, so do nothing. return FALSE; } // Control comes here if the user clicked OK. Now we need to copy the // user's settings to each event that we are editing and mark the registry // as dirty if any of the settings changed. for (iEvent=0; iEvent < nEvents; ++iEvent) { pEvent = aEvents[iEvent]; if (pEvent->m_dwTimeInterval != (DWORD) m_iTimeInterval) { g_reg.SetDirty(TRUE); pEvent->m_dwTimeInterval = (DWORD) m_iTimeInterval; } if (pEvent->m_dwCount != (DWORD) m_iEventCount) { g_reg.SetDirty(TRUE); pEvent->m_dwCount = m_iEventCount; } } return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CEditField CEditField::CEditField() { m_bIsDirty = FALSE; } CEditField::~CEditField() { } BEGIN_MESSAGE_MAP(CEditField, CEdit) //{{AFX_MSG_MAP(CEditField) ON_WM_CHAR() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CEditField message handlers void CEditField::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CEdit::OnChar(nChar, nRepCnt, nFlags); m_bIsDirty = TRUE; } SCODE CEditField::GetValue(int& iValue) { CString sValue; GetWindowText(sValue); if (!IsDecimalInteger(sValue)) { return E_FAIL; } iValue = _ttoi(sValue); return S_OK; } ///////////////////////////////////////////////////////////////////////////// // CEditSpin CEditSpin::CEditSpin() { m_bIsDirty = FALSE; m_iSetPos = 0; } CEditSpin::~CEditSpin() { } BEGIN_MESSAGE_MAP(CEditSpin, CSpinButtonCtrl) //{{AFX_MSG_MAP(CEditSpin) ON_WM_LBUTTONUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CEditSpin message handlers void CEditSpin::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CSpinButtonCtrl::OnLButtonUp(nFlags, point); if (GetPos() != m_iSetPos) { m_bIsDirty = TRUE; } } int CEditSpin::SetPos(int iPos) { int iResult = CSpinButtonCtrl::SetPos(iPos); m_iSetPos = GetPos(); m_bIsDirty = FALSE; return iResult; } void CEditSpin::SetRange(int iLower, int iUpper) { int iPos = GetPos(); CSpinButtonCtrl::SetRange(iLower, iUpper); if (iPos < iLower) { iPos = iLower; } if (iPos > iUpper) { iPos = iUpper; } SetPos(iPos); SetRedraw(); m_iSetPos = iLower; m_bIsDirty = FALSE; } BOOL CEditSpin::IsDirty() { int iCurPos = GetPos(); return (m_bIsDirty || (m_iSetPos != iCurPos)); } BOOL CEventPropertiesDlg::OnHelpInfo(HELPINFO *pHelpInfo) { if (pHelpInfo->iContextType == HELPINFO_WINDOW && pHelpInfo->iCtrlId != IDD_NULL) { ::WinHelp ((HWND)pHelpInfo->hItemHandle, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (ULONG_PTR)g_aHelpIDs_IDD_PROPERTIESDLG); } return TRUE; } void CEventPropertiesDlg::OnContextMenu(CWnd* pWnd, CPoint point) { if (pWnd == this) return; ::WinHelp (pWnd->m_hWnd, AfxGetApp()->m_pszHelpFilePath, HELP_CONTEXTMENU, (ULONG_PTR)g_aHelpIDs_IDD_PROPERTIESDLG); }