|
|
//+-------------------------------------------------------------------------
//
// 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_)
|