309 lines
8 KiB
C++
309 lines
8 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1999 - 1999
|
||
|
//
|
||
|
// File: benefits.cpp
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "BenSvr.h"
|
||
|
#include "Benefits.h"
|
||
|
#include "RootNode.h"
|
||
|
|
||
|
CBenefits::CBenefits()
|
||
|
{
|
||
|
m_pNode = new CRootNode;
|
||
|
_ASSERTE(m_pNode != NULL);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Standard destructor. Simply deletes
|
||
|
// the root node.
|
||
|
//
|
||
|
CBenefits::~CBenefits()
|
||
|
{
|
||
|
delete m_pNode;
|
||
|
m_pNode = NULL;
|
||
|
}
|
||
|
|
||
|
HRESULT CBenefits::Initialize(LPUNKNOWN pUnknown)
|
||
|
{
|
||
|
HRESULT hr = IComponentDataImpl<CBenefits, CBenefitsComponent >::Initialize(pUnknown);
|
||
|
if (FAILED(hr))
|
||
|
return hr;
|
||
|
|
||
|
CComPtr<IImageList> spImageList;
|
||
|
|
||
|
if (m_spConsole->QueryScopeImageList(&spImageList) != S_OK)
|
||
|
{
|
||
|
ATLTRACE(_T("IConsole::QueryScopeImageList failed\n"));
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
// Load bitmaps associated with the scope pane
|
||
|
// and add them to the image list
|
||
|
// Loads the default bitmaps generated by the wizard
|
||
|
// Change as required
|
||
|
HBITMAP hBitmap16 = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BENEFITS_16));
|
||
|
if (hBitmap16 == NULL)
|
||
|
return S_OK;
|
||
|
|
||
|
HBITMAP hBitmap32 = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BENEFITS_32));
|
||
|
if (hBitmap32 == NULL)
|
||
|
return S_OK;
|
||
|
|
||
|
if (spImageList->ImageListSetStrip((long*)hBitmap16,
|
||
|
(long*)hBitmap32, 0, RGB(0, 128, 128)) != S_OK)
|
||
|
{
|
||
|
ATLTRACE(_T("IImageList::ImageListSetStrip failed\n"));
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// This is called to create the unique sub-nodes.
|
||
|
//
|
||
|
( (CRootNode*) m_pNode )->InitializeSubNodes();
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// This is overridden to handle update notifications from
|
||
|
// the property pages.
|
||
|
//
|
||
|
HRESULT CBenefits::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param)
|
||
|
{
|
||
|
HRESULT hr = E_NOTIMPL;
|
||
|
|
||
|
if ( lpDataObject != NULL )
|
||
|
{
|
||
|
return IComponentDataImpl<CBenefits,CBenefitsComponent>::Notify( lpDataObject, event, arg, param );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// There are many events which are sent to Notify with
|
||
|
// the dataobject == NULL. Make sure that the correct one is
|
||
|
// being dealt with.
|
||
|
//
|
||
|
switch( event )
|
||
|
{
|
||
|
case MMCN_PROPERTY_CHANGE:
|
||
|
//
|
||
|
// Send the notification to our root node for further processing.
|
||
|
//
|
||
|
( (CRootNode*) m_pNode )->OnPropertyChange( m_spConsole );
|
||
|
|
||
|
//
|
||
|
// Since we've received an update notification, we'll cause the console
|
||
|
// to be refreshed. This should handle the updates.
|
||
|
//
|
||
|
hr = m_spConsole->UpdateAllViews( NULL, NULL, NULL );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return( hr );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Call the root node's implementation.
|
||
|
//
|
||
|
STDMETHODIMP CBenefits::IsDirty()
|
||
|
{
|
||
|
return( ( (CRootNode*) m_pNode )->IsDirty() );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Call the root node's implementation.
|
||
|
//
|
||
|
STDMETHODIMP CBenefits::Load(LPSTREAM pStm)
|
||
|
{
|
||
|
return( ( (CRootNode*) m_pNode )->Load( pStm ) );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Call the root node's implementation.
|
||
|
//
|
||
|
STDMETHODIMP CBenefits::Save(LPSTREAM pStm, BOOL fClearDirty)
|
||
|
{
|
||
|
return( ( (CRootNode*) m_pNode )->Save( pStm, fClearDirty ) );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Call the root node's implementation.
|
||
|
//
|
||
|
STDMETHODIMP CBenefits::GetSizeMax(ULARGE_INTEGER FAR* pcbSize )
|
||
|
{
|
||
|
return( ( (CRootNode*) m_pNode )->GetSizeMax( pcbSize ) );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// This function copies the data from the given employee and populates
|
||
|
// the appropriate controls within the page.
|
||
|
//
|
||
|
LRESULT CEmployeeNamePage::OnInitDialog( UINT uiMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled )
|
||
|
{
|
||
|
UNUSED_ALWAYS( uiMsg );
|
||
|
UNUSED_ALWAYS( wParam );
|
||
|
UNUSED_ALWAYS( lParam );
|
||
|
UNUSED_ALWAYS( fHandled );
|
||
|
USES_CONVERSION;
|
||
|
_ASSERTE( m_pEmployee != NULL );
|
||
|
|
||
|
SetDlgItemText( IDC_EDIT_LASTNAME, W2T( m_pEmployee->m_szLastName ) );
|
||
|
SetDlgItemText( IDC_EDIT_FIRSTNAME, W2T( m_pEmployee->m_szFirstName ) );
|
||
|
SetDlgItemText( IDC_EDIT_SOCIALSECURITY, W2T( m_pEmployee->m_szSocialSecurity ) );
|
||
|
SetDlgItemText( IDC_EDIT_MOTHERNAME, W2T( m_pEmployee->m_szMotherMaiden ) );
|
||
|
|
||
|
return( TRUE );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Handle the storage of any new values to the employee.
|
||
|
//
|
||
|
BOOL CEmployeeNamePage::OnWizardFinish()
|
||
|
{
|
||
|
USES_CONVERSION;
|
||
|
BOOL fValid = TRUE;
|
||
|
TCHAR szBuf[ 256 ];
|
||
|
|
||
|
//
|
||
|
// Get the values from the appropriate edit controls.
|
||
|
// For demo purposes, always assume success unless the last name
|
||
|
// and first are bad.
|
||
|
//
|
||
|
GetDlgItemText( IDC_EDIT_LASTNAME, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szLastName, T2W( szBuf ) );
|
||
|
GetDlgItemText( IDC_EDIT_FIRSTNAME, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szFirstName, T2W( szBuf ) );
|
||
|
GetDlgItemText( IDC_EDIT_SOCIALSECURITY, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szSocialSecurity, T2W( szBuf ) );
|
||
|
GetDlgItemText( IDC_EDIT_MOTHERNAME, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szMotherMaiden, T2W( szBuf ) );
|
||
|
|
||
|
//
|
||
|
// Check for validity of first name and last name.
|
||
|
//
|
||
|
if ( wcslen( m_pEmployee->m_szLastName ) == 0 || wcslen( m_pEmployee->m_szFirstName ) == 0 ||
|
||
|
m_pEmployee->m_szLastName[ 0 ] == ' ' || m_pEmployee->m_szFirstName[ 0 ] == ' ' )
|
||
|
{
|
||
|
//
|
||
|
// Inform the user of the error.
|
||
|
//
|
||
|
MessageBox( _T( "Must enter valid first and last name." ) );
|
||
|
|
||
|
fValid = FALSE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Data is valid. As a result, post a notification to the snap-in
|
||
|
// that the employee contents have changes. This demonstration does
|
||
|
// not use any sort of hinting, so NULL can be safely pass in as
|
||
|
// the nofication's arguement.
|
||
|
//
|
||
|
PropertyChangeNotify( NULL );
|
||
|
}
|
||
|
|
||
|
return( fValid );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// This is overridden to modify the UI depending on whether
|
||
|
// we're in start-up mode or not.
|
||
|
//
|
||
|
BOOL CEmployeeNamePage::OnSetActive()
|
||
|
{
|
||
|
if ( m_fStartup )
|
||
|
{
|
||
|
//
|
||
|
// Must use post message during the setactive message.
|
||
|
//
|
||
|
CWindow( GetParent() ).PostMessage( PSM_SETWIZBUTTONS, 0, PSWIZB_NEXT );
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// This function copies the data from the given employee and populates
|
||
|
// the appropriate controls within the page.
|
||
|
//
|
||
|
LRESULT CEmployeeAddressPage::OnInitDialog( UINT uiMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled )
|
||
|
{
|
||
|
UNUSED_ALWAYS( uiMsg );
|
||
|
UNUSED_ALWAYS( wParam );
|
||
|
UNUSED_ALWAYS( lParam );
|
||
|
UNUSED_ALWAYS( fHandled );
|
||
|
USES_CONVERSION;
|
||
|
_ASSERTE( m_pEmployee != NULL );
|
||
|
|
||
|
SetDlgItemText( IDC_EDIT_ADDRESSFIRST, W2T( m_pEmployee->m_szAddress1 ) );
|
||
|
SetDlgItemText( IDC_EDIT_ADDRESSSECOND, W2T( m_pEmployee->m_szAddress2 ) );
|
||
|
SetDlgItemText( IDC_EDIT_CITY, W2T( m_pEmployee->m_szCity ) );
|
||
|
SetDlgItemText( IDC_EDIT_STATE, W2T( m_pEmployee->m_szState ) );
|
||
|
SetDlgItemText( IDC_EDIT_ZIP, W2T( m_pEmployee->m_szZip ) );
|
||
|
SetDlgItemText( IDC_EDIT_PHONE, W2T( m_pEmployee->m_szPhone ) );
|
||
|
|
||
|
return( TRUE );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Handle the storage of any new values to the employee.
|
||
|
//
|
||
|
BOOL CEmployeeAddressPage::OnWizardFinish()
|
||
|
{
|
||
|
USES_CONVERSION;
|
||
|
BOOL fValid = TRUE;
|
||
|
TCHAR szBuf[ 256 ];
|
||
|
|
||
|
//
|
||
|
// Get the values from the appropriate edit controls.
|
||
|
// For demo purposes, always assume success unless the last name
|
||
|
// and first are bad.
|
||
|
//
|
||
|
GetDlgItemText( IDC_EDIT_ADDRESSFIRST, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szAddress1, T2W( szBuf ) );
|
||
|
GetDlgItemText( IDC_EDIT_ADDRESSSECOND, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szAddress2, T2W( szBuf ) );
|
||
|
GetDlgItemText( IDC_EDIT_CITY, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szCity, T2W( szBuf ) );
|
||
|
GetDlgItemText( IDC_EDIT_STATE, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szState, T2W( szBuf ) );
|
||
|
GetDlgItemText( IDC_EDIT_ZIP, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szZip, T2W( szBuf ) );
|
||
|
GetDlgItemText( IDC_EDIT_PHONE, szBuf, sizeof( szBuf ) );
|
||
|
wcscpy( m_pEmployee->m_szPhone, T2W( szBuf ) );
|
||
|
|
||
|
//
|
||
|
// Data is valid. As a result, post a notification to the snap-in
|
||
|
// that the employee contents have changes. This demonstration does
|
||
|
// not use any sort of hinting, so NULL can be safely pass in as
|
||
|
// the nofication's arguement.
|
||
|
//
|
||
|
PropertyChangeNotify( NULL );
|
||
|
|
||
|
return( fValid );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// This is overridden to modify the UI depending on whether
|
||
|
// we're in start-up mode or not.
|
||
|
//
|
||
|
BOOL CEmployeeAddressPage::OnSetActive()
|
||
|
{
|
||
|
if ( m_fStartup )
|
||
|
{
|
||
|
//
|
||
|
// Must use post message during the setactive message.
|
||
|
//
|
||
|
CWindow( GetParent() ).PostMessage( PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_FINISH );
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|