560 lines
12 KiB
C
560 lines
12 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1999 - 1999
|
||
|
//
|
||
|
// File: bennodes.h
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
// BenefitsNodes.h
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#if !defined(AFX_BENEFITSNODES_H__E0573E77_D325_11D1_846C_00104B211BE5__INCLUDED_)
|
||
|
#define AFX_BENEFITSNODES_H__E0573E77_D325_11D1_846C_00104B211BE5__INCLUDED_
|
||
|
|
||
|
#if _MSC_VER > 1000
|
||
|
#pragma once
|
||
|
#endif // _MSC_VER > 1000
|
||
|
|
||
|
#include "Benefits.h"
|
||
|
|
||
|
//
|
||
|
// Added to support the generated COM dispatch interface.
|
||
|
//
|
||
|
#import "SampCtrl\SampCtrl.ocx"
|
||
|
using namespace SampCtrl;
|
||
|
|
||
|
class CRetirementNode : public CBenefitsData< CRetirementNode >
|
||
|
{
|
||
|
public:
|
||
|
SNAPINMENUID( IDR_UPDATE_MENU )
|
||
|
BEGIN_SNAPINCOMMAND_MAP( CRetirementNode, FALSE )
|
||
|
SNAPINCOMMAND_ENTRY(ID_TASK_ENROLL, OnEnroll)
|
||
|
SNAPINCOMMAND_ENTRY(ID_TOP_UPDATE, OnUpdate)
|
||
|
END_SNAPINCOMMAND_MAP()
|
||
|
BEGIN_SNAPINTOOLBARID_MAP( CRetirementNode )
|
||
|
END_SNAPINTOOLBARID_MAP()
|
||
|
|
||
|
CRetirementNode( CEmployee* pCurEmployee );
|
||
|
virtual ~CRetirementNode();
|
||
|
|
||
|
//
|
||
|
// Overridden to display web page as results.
|
||
|
//
|
||
|
STDMETHOD( GetResultViewType )( LPOLESTR *ppViewType, long *pViewOptions );
|
||
|
|
||
|
//
|
||
|
// Overridden to provide strings for various columns.
|
||
|
//
|
||
|
LPOLESTR GetResultPaneColInfo(int nCol);
|
||
|
|
||
|
//
|
||
|
// Command handler for "Enroll" functionality.
|
||
|
//
|
||
|
STDMETHOD( OnEnroll )(bool& bHandled, CSnapInObjectRootBase* pObj);
|
||
|
|
||
|
//
|
||
|
// Command handler for "Update" functionality.
|
||
|
//
|
||
|
STDMETHOD( OnUpdate )(bool& bHandled, CSnapInObjectRootBase* pObj);
|
||
|
|
||
|
//
|
||
|
// Overridden to cache the OCX pointer.
|
||
|
//
|
||
|
STDMETHOD(Notify)( MMC_NOTIFY_TYPE event,
|
||
|
long arg,
|
||
|
long param,
|
||
|
IComponentData* pComponentData,
|
||
|
IComponent* pComponent,
|
||
|
DATA_OBJECT_TYPES type)
|
||
|
{
|
||
|
HRESULT hr = E_NOTIMPL;
|
||
|
|
||
|
switch (event)
|
||
|
{
|
||
|
case MMCN_SHOW:
|
||
|
//
|
||
|
// Always respond to the show call so that the
|
||
|
// console knows this has been processed and can
|
||
|
// properly seat toolbars, etc.
|
||
|
//
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
|
||
|
case MMCN_INITOCX:
|
||
|
//
|
||
|
// The IUnknown of the OCX is passed in. Do
|
||
|
// any other initialization of the OCX here.
|
||
|
//
|
||
|
m_spControl = (IUnknown*) param;
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
//
|
||
|
// Always default to calling the base class implementation.
|
||
|
//
|
||
|
hr = CBenefitsData<CRetirementNode>::Notify( event,
|
||
|
arg,
|
||
|
param,
|
||
|
pComponentData,
|
||
|
pComponent,
|
||
|
type );
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
//
|
||
|
// Definition generated by compiler. IDispatch implementation.
|
||
|
//
|
||
|
_SampleControlPtr m_spControl;
|
||
|
};
|
||
|
|
||
|
#define TASKPAD_LOCALQUERY 100
|
||
|
|
||
|
class CHealthNode : public CBenefitsData< CHealthNode >,
|
||
|
public CTaskpadItem
|
||
|
{
|
||
|
public:
|
||
|
SNAPINMENUID( IDR_ENROLL_MENU )
|
||
|
BEGIN_SNAPINCOMMAND_MAP( CHealthNode, FALSE )
|
||
|
SNAPINCOMMAND_ENTRY(ID_TASK_ENROLL, OnEnroll)
|
||
|
SNAPINCOMMAND_ENTRY(ID_TOP_IMPORT, OnImport)
|
||
|
SNAPINCOMMAND_ENTRY(ID_TOP_EXPORT, OnExport)
|
||
|
SNAPINCOMMAND_ENTRY(ID_VIEW_TASKPAD, OnTaskpad)
|
||
|
END_SNAPINCOMMAND_MAP()
|
||
|
BEGIN_SNAPINTOOLBARID_MAP( CHealthNode )
|
||
|
SNAPINTOOLBARID_ENTRY( IDR_ENROLLTOOLBAR )
|
||
|
END_SNAPINTOOLBARID_MAP()
|
||
|
|
||
|
CHealthNode( CEmployee* pCurEmployee );
|
||
|
virtual ~CHealthNode();
|
||
|
|
||
|
//
|
||
|
// Overridden to display web page as results.
|
||
|
//
|
||
|
STDMETHOD( GetResultViewType )( LPOLESTR *ppViewType, long *pViewOptions );
|
||
|
|
||
|
//
|
||
|
// Overridden to provide strings for various columns.
|
||
|
//
|
||
|
LPOLESTR GetResultPaneColInfo(int nCol);
|
||
|
|
||
|
//
|
||
|
// Command handler for "Enroll" functionality.
|
||
|
//
|
||
|
STDMETHOD( OnEnroll )(bool& bHandled, CSnapInObjectRootBase* pObj);
|
||
|
|
||
|
//
|
||
|
// Restores any state, especially in the case of using a
|
||
|
// taskpad, when the back and forward buttons are used by
|
||
|
// the user for navigation.
|
||
|
//
|
||
|
STDMETHOD( OnRestoreView )( MMC_RESTORE_VIEW* pRestoreView, BOOL* pfHandled );
|
||
|
|
||
|
//
|
||
|
// Command handler for "OnTaskpad" functionality.
|
||
|
//
|
||
|
STDMETHOD( OnTaskpad )(bool& bHandled, CSnapInObjectRootBase* pObj)
|
||
|
{
|
||
|
UNUSED_ALWAYS( bHandled );
|
||
|
CComPtr<IConsole> spConsole;
|
||
|
|
||
|
//
|
||
|
// Switch the current view mode to a taskpad view.
|
||
|
//
|
||
|
m_fTaskpad = !m_fTaskpad;
|
||
|
|
||
|
//
|
||
|
// Reselect the node to cause GetResultViewType() to get
|
||
|
// called once again.
|
||
|
//
|
||
|
if ( pObj->m_nType == 1 )
|
||
|
spConsole = ((CBenefits*)pObj)->m_spConsole;
|
||
|
else
|
||
|
spConsole = ((CBenefitsComponent*)pObj)->m_spConsole;
|
||
|
|
||
|
spConsole->SelectScopeItem( m_scopeDataItem.ID );
|
||
|
|
||
|
return( S_OK );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Overridden to set the checkmark state of the taskpad menuitem.
|
||
|
//
|
||
|
void UpdateMenuState(UINT id, LPTSTR pBuf, UINT *flags)
|
||
|
{
|
||
|
UNUSED_ALWAYS( pBuf );
|
||
|
|
||
|
//
|
||
|
// Check the menuitem if we are currently in "taskpad"
|
||
|
// mode.
|
||
|
//
|
||
|
if ( id == ID_VIEW_TASKPAD )
|
||
|
*flags |= m_fTaskpad ? MFS_CHECKED : MFS_UNCHECKED;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Overridden to enable the delete verb.
|
||
|
//
|
||
|
STDMETHOD(Notify)( MMC_NOTIFY_TYPE event,
|
||
|
long arg,
|
||
|
long param,
|
||
|
IComponentData* pComponentData,
|
||
|
IComponent* pComponent,
|
||
|
DATA_OBJECT_TYPES type)
|
||
|
{
|
||
|
HRESULT hr = E_NOTIMPL;
|
||
|
|
||
|
switch (event)
|
||
|
{
|
||
|
case MMCN_SELECT:
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
|
||
|
case MMCN_RESTORE_VIEW:
|
||
|
//
|
||
|
// Called when the history list is used to navigate by
|
||
|
// the user. Since we have a taskpad display, it's up
|
||
|
// to us to restore that view, as appropriate.
|
||
|
//
|
||
|
hr = OnRestoreView( (MMC_RESTORE_VIEW*) arg, (BOOL*) param );
|
||
|
break;
|
||
|
|
||
|
case MMCN_SHOW:
|
||
|
//
|
||
|
// Always respond to the show call so that the
|
||
|
// console knows this has been processed and can
|
||
|
// properly seat toolbars, etc.
|
||
|
//
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
//
|
||
|
// Always default to calling the base class implementation.
|
||
|
//
|
||
|
hr = CBenefitsData< CHealthNode >::Notify( event,
|
||
|
arg,
|
||
|
param,
|
||
|
pComponentData,
|
||
|
pComponent,
|
||
|
type );
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Called when one of the tasks is clicked.
|
||
|
//
|
||
|
STDMETHOD( TaskNotify )( IConsole* pConsole, VARIANT* arg, VARIANT* param );
|
||
|
|
||
|
//
|
||
|
// Returns an enumerator for all of these tasks.
|
||
|
//
|
||
|
STDMETHOD( EnumTasks )( LPOLESTR szTaskGroup, IEnumTASK** ppEnumTASK );
|
||
|
|
||
|
protected:
|
||
|
//
|
||
|
// Indicates whether we should be displayed in a taskpad view.
|
||
|
//
|
||
|
bool m_fTaskpad;
|
||
|
};
|
||
|
|
||
|
class CBuildingNode;
|
||
|
class CKeyNode : public CChildrenBenefitsData< CKeyNode >
|
||
|
{
|
||
|
public:
|
||
|
SNAPINMENUID( IDR_ACCESS_MENU )
|
||
|
BEGIN_SNAPINCOMMAND_MAP( CKeyNode, FALSE )
|
||
|
SNAPINCOMMAND_ENTRY(ID_NEW_BUILDINGACCESS, OnGrantAccess)
|
||
|
END_SNAPINCOMMAND_MAP()
|
||
|
BEGIN_SNAPINTOOLBARID_MAP( CKeyNode )
|
||
|
SNAPINTOOLBARID_ENTRY( IDR_ACCESSTOOLBAR )
|
||
|
END_SNAPINTOOLBARID_MAP()
|
||
|
|
||
|
CKeyNode( CEmployee* pCurEmployee );
|
||
|
virtual ~CKeyNode();
|
||
|
|
||
|
//
|
||
|
// Overridden to call the base class implementation.
|
||
|
//
|
||
|
STDMETHOD(Notify)( MMC_NOTIFY_TYPE event,
|
||
|
long arg,
|
||
|
long param,
|
||
|
IComponentData* pComponentData,
|
||
|
IComponent* pComponent,
|
||
|
DATA_OBJECT_TYPES type)
|
||
|
{
|
||
|
ATLTRACE2( atlTraceSnapin, 0, _T( "CNotifyImpl::Notify\n" ) );
|
||
|
|
||
|
// Add code to handle the different notifications.
|
||
|
// Handle MMCN_SHOW and MMCN_EXPAND to enumerate children items.
|
||
|
// In response to MMCN_SHOW you have to enumerate both the scope
|
||
|
// and result pane items.
|
||
|
// For MMCN_EXPAND you only need to enumerate the scope items
|
||
|
// Use IConsoleNameSpace::InsertItem to insert scope pane items
|
||
|
// Use IResultData::InsertItem to insert result pane item.
|
||
|
HRESULT hr = E_NOTIMPL;
|
||
|
|
||
|
_ASSERTE( pComponentData != NULL || pComponent != NULL );
|
||
|
|
||
|
CComPtr<IConsole> spConsole;
|
||
|
CComQIPtr<IHeaderCtrl, &IID_IHeaderCtrl> spHeader;
|
||
|
if (pComponentData != NULL)
|
||
|
spConsole = ((CBenefits*)pComponentData)->m_spConsole;
|
||
|
else
|
||
|
{
|
||
|
spConsole = ((CBenefitsComponent*)pComponent)->m_spConsole;
|
||
|
spHeader = spConsole;
|
||
|
}
|
||
|
|
||
|
switch (event)
|
||
|
{
|
||
|
case MMCN_SELECT:
|
||
|
//
|
||
|
// Call our select handler.
|
||
|
//
|
||
|
hr = OnSelect( spConsole );
|
||
|
break;
|
||
|
|
||
|
case MMCN_SHOW:
|
||
|
//
|
||
|
// Only setup colums if we're displaying the result pane.
|
||
|
//
|
||
|
if ( arg == TRUE )
|
||
|
hr = OnShowColumn( spHeader );
|
||
|
hr = OnShow( event, arg, param, spConsole, type );
|
||
|
break;
|
||
|
|
||
|
case MMCN_EXPAND:
|
||
|
//
|
||
|
// We do not expand as normal, since the building nodes are
|
||
|
// only displayed in the result pane.
|
||
|
//
|
||
|
break;
|
||
|
|
||
|
case MMCN_ADD_IMAGES:
|
||
|
hr = OnAddImages( event, arg, param, spConsole, type );
|
||
|
break;
|
||
|
|
||
|
case MMCN_QUERY_PASTE:
|
||
|
//
|
||
|
// Called to determine if the current object can be pasted
|
||
|
// or not into this context.
|
||
|
//
|
||
|
hr = OnQueryPaste( (LPDATAOBJECT) arg );
|
||
|
break;
|
||
|
|
||
|
case MMCN_PASTE:
|
||
|
//
|
||
|
// Called by MMC when the item should be pasted.
|
||
|
//
|
||
|
hr = OnPaste( spConsole, (LPDATAOBJECT) arg, (LPDATAOBJECT*) param );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Ensures that the appropriate verbs are displayed.
|
||
|
//
|
||
|
STDMETHOD( OnSelect )( IConsole* pConsole )
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
CComPtr<IConsoleVerb> spConsoleVerb;
|
||
|
|
||
|
//
|
||
|
// Enable the delete verb.
|
||
|
//
|
||
|
hr = pConsole->QueryConsoleVerb( &spConsoleVerb );
|
||
|
_ASSERTE( SUCCEEDED( hr ) );
|
||
|
|
||
|
//
|
||
|
// Enable the copy and paste verbs.
|
||
|
//
|
||
|
hr = spConsoleVerb->SetVerbState( MMC_VERB_PASTE, ENABLED, TRUE );
|
||
|
_ASSERTE( SUCCEEDED( hr ) );
|
||
|
|
||
|
return( hr );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Called by the console to determine if we can paste the
|
||
|
// specified node.
|
||
|
//
|
||
|
STDMETHOD( OnQueryPaste )( LPDATAOBJECT pItem );
|
||
|
|
||
|
//
|
||
|
// Called by MMC when the item should be pasted.
|
||
|
//
|
||
|
STDMETHOD( OnPaste )( IConsole* pConsole, LPDATAOBJECT pItem, LPDATAOBJECT* pItemCut );
|
||
|
|
||
|
//
|
||
|
// Overridden to provide strings for various columns.
|
||
|
//
|
||
|
LPOLESTR GetResultPaneColInfo(int nCol);
|
||
|
|
||
|
//
|
||
|
// Overridden to add new columns to the results
|
||
|
// display.
|
||
|
//
|
||
|
STDMETHOD( OnShowColumn )( IHeaderCtrl* pHeader );
|
||
|
|
||
|
//
|
||
|
// Command handler for "Grant Acess" functionality.
|
||
|
//
|
||
|
STDMETHOD( OnGrantAccess )( bool& bHandled, CSnapInObjectRootBase* pObj );
|
||
|
|
||
|
//
|
||
|
// Called by one of our children nodes to inform us that
|
||
|
// they should be deleted. This occurs when the user selects
|
||
|
// a delete action on the building. This function should not
|
||
|
// only delete the building, but also handle the refresh of
|
||
|
// the result display.
|
||
|
//
|
||
|
STDMETHOD( OnDeleteBuilding )( IConsole* pConsole, CBuildingNode* pChildNode );
|
||
|
};
|
||
|
|
||
|
class CBuildingNode : public CBenefitsData< CBuildingNode >
|
||
|
{
|
||
|
public:
|
||
|
BEGIN_SNAPINCOMMAND_MAP(CBuildingNode, FALSE)
|
||
|
END_SNAPINCOMMAND_MAP()
|
||
|
|
||
|
BEGIN_SNAPINTOOLBARID_MAP(CBuildingNode)
|
||
|
END_SNAPINTOOLBARID_MAP()
|
||
|
|
||
|
CBuildingNode( CKeyNode* pParentNode, BSTR bstrName, BSTR bstrLocation );
|
||
|
CBuildingNode( const CBuildingNode& inNode );
|
||
|
|
||
|
//
|
||
|
// Overridden to provide strings for various columns.
|
||
|
//
|
||
|
LPOLESTR GetResultPaneColInfo(int nCol);
|
||
|
|
||
|
//
|
||
|
// Hold the location of this building.
|
||
|
//
|
||
|
BSTR m_bstrLocation;
|
||
|
|
||
|
//
|
||
|
// Pointer to our parent node to handle deletion
|
||
|
// issues.
|
||
|
//
|
||
|
CKeyNode* m_pParentNode;
|
||
|
|
||
|
//
|
||
|
// Overridden to enable the delete verb.
|
||
|
//
|
||
|
STDMETHOD(Notify)( MMC_NOTIFY_TYPE event,
|
||
|
long arg,
|
||
|
long param,
|
||
|
IComponentData* pComponentData,
|
||
|
IComponent* pComponent,
|
||
|
DATA_OBJECT_TYPES type)
|
||
|
{
|
||
|
HRESULT hr = E_NOTIMPL;
|
||
|
CComPtr<IConsole> spConsole;
|
||
|
CComQIPtr<IHeaderCtrl, &IID_IHeaderCtrl> spHeader;
|
||
|
|
||
|
if (pComponentData != NULL)
|
||
|
spConsole = ((CBenefits*)pComponentData)->m_spConsole;
|
||
|
else
|
||
|
{
|
||
|
spConsole = ((CBenefitsComponent*)pComponent)->m_spConsole;
|
||
|
spHeader = spConsole;
|
||
|
}
|
||
|
|
||
|
switch (event)
|
||
|
{
|
||
|
case MMCN_DELETE:
|
||
|
//
|
||
|
// Call our delete handler.
|
||
|
//
|
||
|
hr = OnDelete( spConsole );
|
||
|
break;
|
||
|
|
||
|
case MMCN_SELECT:
|
||
|
//
|
||
|
// Call our select handler.
|
||
|
//
|
||
|
hr = OnSelect( spConsole );
|
||
|
break;
|
||
|
|
||
|
case MMCN_SHOW:
|
||
|
//
|
||
|
// Always respond to the show call so that the
|
||
|
// console knows this has been processed and can
|
||
|
// properly seat toolbars, etc.
|
||
|
//
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
//
|
||
|
// Always default to calling the base class implementation.
|
||
|
//
|
||
|
hr = CBenefitsData< CBuildingNode >::Notify( event,
|
||
|
arg,
|
||
|
param,
|
||
|
pComponentData,
|
||
|
pComponent,
|
||
|
type );
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Delete handler.
|
||
|
//
|
||
|
STDMETHOD( OnDelete )( IConsole* pConsole )
|
||
|
{
|
||
|
_ASSERT( m_pParentNode != NULL );
|
||
|
HRESULT hr;
|
||
|
|
||
|
//
|
||
|
// Calls the parent node to tell it to delete
|
||
|
// ourselves.
|
||
|
//
|
||
|
hr = m_pParentNode->OnDeleteBuilding( pConsole, this );
|
||
|
|
||
|
return( hr );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Ensures that the appropriate verbs are displayed.
|
||
|
//
|
||
|
STDMETHOD( OnSelect )( IConsole* pConsole )
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
CComPtr<IConsoleVerb> spConsoleVerb;
|
||
|
|
||
|
//
|
||
|
// Enable the delete verb.
|
||
|
//
|
||
|
hr = pConsole->QueryConsoleVerb( &spConsoleVerb );
|
||
|
_ASSERTE( SUCCEEDED( hr ) );
|
||
|
hr = spConsoleVerb->SetVerbState( MMC_VERB_DELETE, ENABLED, TRUE );
|
||
|
_ASSERTE( SUCCEEDED( hr ) );
|
||
|
|
||
|
//
|
||
|
// Enable the copy and paste verbs.
|
||
|
//
|
||
|
hr = spConsoleVerb->SetVerbState( MMC_VERB_COPY, ENABLED, TRUE );
|
||
|
_ASSERTE( SUCCEEDED( hr ) );
|
||
|
|
||
|
return( hr );
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#endif // !defined(AFX_BENEFTISNODES_H__E0573E77_D325_11D1_846C_00104B211BE5__INCLUDED_)
|