windows-nt/Source/XPSP1/NT/admin/activec/samples/benefits/rootnode.h
2020-09-26 16:20:57 +08:00

219 lines
4.9 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: rootnode.h
//
//--------------------------------------------------------------------------
// RootNode.h: interface for the CRootNode class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ROOTNODE_H__E0573E78_D325_11D1_846C_00104B211BE5__INCLUDED_)
#define AFX_ROOTNODE_H__E0573E78_D325_11D1_846C_00104B211BE5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Benefits.h"
#include "Employee.h"
class CRootNode : public CChildrenBenefitsData< CRootNode >
{
public:
BEGIN_SNAPINTOOLBARID_MAP( CRootNode )
END_SNAPINTOOLBARID_MAP()
CRootNode();
//
// Creates the benefits subnodes for the scope pane.
//
BOOL InitializeSubNodes();
//
// Overridden to provide employee name for root node.
//
STDMETHOD( FillData )( CLIPFORMAT cf, LPSTREAM pStream );
//
// Overridden to add new columns to the results
// display.
//
STDMETHOD( OnShowColumn )( IHeaderCtrl* pHeader );
//
// Handles creation of our property pages.
//
STDMETHOD( CreatePropertyPages )(LPPROPERTYSHEETCALLBACK lpProvider,
long handle,
IUnknown* pUnk,
DATA_OBJECT_TYPES type);
//
// Determines if pages should be displayed. This has been
// modified to ensure that we're called by the snap-in manager
// when it's first inserted.
//
STDMETHOD( QueryPagesFor )(DATA_OBJECT_TYPES type)
{
if ( type == CCT_SCOPE || type == CCT_RESULT || type == CCT_SNAPIN_MANAGER )
return S_OK;
return S_FALSE;
}
//
// Ensures that the appropriate verbs are displayed.
//
STDMETHOD( OnSelect )( IConsole* pConsole );
//
// 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)
{
// Add code to handle the different notifications.
// Handle MMCN_SHOW and MMCN_EXPAND to enumerate children 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:
hr = OnSelect( spConsole );
break;
case MMCN_SHOW:
// Only setup colums if we're displaying the result pane.
if ( arg == TRUE )
hr = OnShowColumn( spHeader );
break;
case MMCN_EXPAND:
//
// Since the insert item is never called, we don't have a valid
// HSCOPEITEM as you would in sub-nodes. The Expand message is
// intercepted and stored for use later.
//
m_scopeDataItem.ID = param;
hr = OnExpand( event, arg, param, spConsole, type );
break;
case MMCN_ADD_IMAGES:
hr = OnAddImages( event, arg, param, spConsole, type );
break;
}
return hr;
}
//
// Uses the dirty flag to determine whether or not this node
// needs to be persisted.
//
STDMETHOD(IsDirty)()
{
return ( m_fDirty ? S_OK : S_FALSE );
}
//
// Loads the employee information from the stream.
//
STDMETHOD(Load)(LPSTREAM pStm)
{
DWORD dwRead;
pStm->Read( &m_Employee, sizeof( m_Employee ), &dwRead );
_ASSERTE( dwRead == sizeof( m_Employee ) );
return( S_OK );
}
//
// Stores the employee information to the stream and clears
// our dirty flag.
//
STDMETHOD(Save)(LPSTREAM pStm, BOOL fClearDirty)
{
DWORD dwWritten;
pStm->Write( &m_Employee, sizeof( m_Employee ), &dwWritten );
_ASSERTE( dwWritten == sizeof( m_Employee ) );
//
// Clear the dirty flag.
//
if ( fClearDirty )
m_fDirty = FALSE;
return( S_OK );
}
//
// Returns the size of the employee structure.
//
STDMETHOD(GetSizeMax)(ULARGE_INTEGER FAR* pcbSize )
{
pcbSize->LowPart = sizeof( m_Employee );
return( S_OK );
}
//
// Received when a property has changed. This function
// modifies the employee's display text. At a later date,
// it may post this message to its sub-nodes.
//
STDMETHOD( OnPropertyChange )( IConsole* pConsole );
protected:
//
// Simply function to create the display name from the
// employee data.
//
int CreateDisplayName( TCHAR* szBuf );
//
// Called to set the dirty flag for persistence.
//
void SetModified( bool fDirty = true )
{
m_fDirty = fDirty;
}
//
// Contains the the employees entire datastore for this
// sample.
//
CEmployee m_Employee;
//
// Flag set to indicate whether the datastore is "dirty".
//
bool m_fDirty;
};
#endif // !defined(AFX_ROOTNODE_H__E0573E78_D325_11D1_846C_00104B211BE5__INCLUDED_)