|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: benefits.h
//
//--------------------------------------------------------------------------
#ifndef __BENEFITS_H_
#define __BENEFITS_H_
#include "resource.h"
#include <atlsnap.h>
#include "snaphelp.h"
#include "atltask.h"
#include "BenSvr.h"
#include "Employee.h"
//
// Property page containing employee information.
//
class CEmployeeNamePage : public CSnapInPropertyPageImpl<CEmployeeNamePage> { public : CEmployeeNamePage(long lNotifyHandle, bool fStartup, bool bDeleteHandle = false, TCHAR* pTitle = NULL) : CSnapInPropertyPageImpl<CEmployeeNamePage> (pTitle),\ m_fStartup( fStartup ), m_lNotifyHandle(lNotifyHandle), m_bDeleteHandle(bDeleteHandle) // Should be true for only page.
{ m_pEmployee = NULL; }
~CEmployeeNamePage() { if (m_bDeleteHandle) MMCFreeNotifyHandle(m_lNotifyHandle); }
enum { IDD = IDD_NAME_PAGE };
BEGIN_MSG_MAP(CEmployeeNamePage) MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) COMMAND_CODE_HANDLER( EN_CHANGE, OnChange ) CHAIN_MSG_MAP(CSnapInPropertyPageImpl<CEmployeeNamePage>) END_MSG_MAP()
HRESULT PropertyChangeNotify(long param) { return MMCPropertyChangeNotify(m_lNotifyHandle, param); }
//
// Handler to initialize values in dialog.
//
LRESULT OnInitDialog( UINT uiMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled );
//
// Calls OnWizardFinish() to handle the storage of employee
// data.
//
BOOL OnApply() { return( OnWizardFinish() ); };
//
// Calls OnWizardFinish() to handle the storage of employee
// data.
//
BOOL OnWizardNext() { return( OnWizardFinish() ); };
//
// This is overridden to modify the UI depending on whether
// we're in start-up mode or not.
//
BOOL OnSetActive();
//
// Overridden to store new values of employee.
//
BOOL OnWizardFinish();
//
// Called when one of the values has been modified. We need
// to inform the property page of the change.
//
LRESULT OnChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { UNUSED_ALWAYS( wNotifyCode ); UNUSED_ALWAYS( wID ); UNUSED_ALWAYS( hWndCtl ); UNUSED_ALWAYS( bHandled );
SetModified();
return( TRUE ); }
public: long m_lNotifyHandle; bool m_bDeleteHandle; CEmployee* m_pEmployee; bool m_fStartup; };
//
// Property page containing employee information.
//
class CEmployeeAddressPage : public CSnapInPropertyPageImpl<CEmployeeAddressPage> { public : CEmployeeAddressPage(long lNotifyHandle, bool fStartup, bool bDeleteHandle = false, TCHAR* pTitle = NULL) : CSnapInPropertyPageImpl<CEmployeeAddressPage> (pTitle),\ m_fStartup( fStartup ), m_lNotifyHandle(lNotifyHandle), m_bDeleteHandle(bDeleteHandle) // Should be true for only page.
{ m_pEmployee = NULL; }
~CEmployeeAddressPage() { if (m_bDeleteHandle) MMCFreeNotifyHandle(m_lNotifyHandle); }
enum { IDD = IDD_ADDRESS_PAGE };
BEGIN_MSG_MAP(CEmployeeAddressPage) MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) COMMAND_CODE_HANDLER( EN_CHANGE, OnChange ) CHAIN_MSG_MAP(CSnapInPropertyPageImpl<CEmployeeAddressPage>) END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
HRESULT PropertyChangeNotify(long param) { return MMCPropertyChangeNotify(m_lNotifyHandle, param); }
//
// Handler to initialize values in dialog.
//
LRESULT OnInitDialog( UINT uiMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled );
//
// Calls OnWizardFinish() to handle the storage of employee
// data.
//
BOOL OnApply() { return( OnWizardFinish() ); };
//
// This is overridden to modify the UI depending on whether
// we're in start-up mode or not.
//
BOOL OnSetActive();
//
// Overridden to store new values of employee.
//
BOOL OnWizardFinish();
//
// Called when one of the values has been modified. We need
// to inform the property page of the change.
//
LRESULT OnChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { UNUSED_ALWAYS( wNotifyCode ); UNUSED_ALWAYS( wID ); UNUSED_ALWAYS( hWndCtl ); UNUSED_ALWAYS( bHandled );
SetModified();
return( TRUE ); }
public: long m_lNotifyHandle; bool m_bDeleteHandle; CEmployee* m_pEmployee; bool m_fStartup; };
template< class T > class CBenefitsData : public CSnapInItemImpl< T > { public: static const GUID* m_NODETYPE; static const TCHAR* m_SZNODETYPE; static const TCHAR* m_SZDISPLAY_NAME; static const CLSID* m_SNAPIN_CLASSID;
CBenefitsData( CEmployee* pEmployee ) { //
// Assign the given employee to our internal containment.
// This employee will be assumed valid for the lifetime of
// this object since persistence is maintained by our parent
// node.
//
m_pEmployee = pEmployee;
//
// Always initialize our display name with the static declared.
//
m_bstrDisplayName = m_SZDISPLAY_NAME;
//
// Image indexes may need to be modified depending on the images specific to
// the snapin.
//
memset(&m_scopeDataItem, 0, sizeof(SCOPEDATAITEM)); m_scopeDataItem.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE | SDI_PARAM; m_scopeDataItem.displayname = MMC_CALLBACK; m_scopeDataItem.nImage = 0; // May need modification
m_scopeDataItem.nOpenImage = 0; // May need modification
m_scopeDataItem.lParam = (LPARAM) this; memset(&m_resultDataItem, 0, sizeof(RESULTDATAITEM)); m_resultDataItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM; m_resultDataItem.str = MMC_CALLBACK; m_resultDataItem.nImage = 0; // May need modification
m_resultDataItem.lParam = (LPARAM) this; }
~CBenefitsData() { }
STDMETHOD(GetScopePaneInfo)(SCOPEDATAITEM *pScopeDataItem) { if (pScopeDataItem->mask & SDI_STR) pScopeDataItem->displayname = m_bstrDisplayName; if (pScopeDataItem->mask & SDI_IMAGE) pScopeDataItem->nImage = m_scopeDataItem.nImage; if (pScopeDataItem->mask & SDI_OPENIMAGE) pScopeDataItem->nOpenImage = m_scopeDataItem.nOpenImage; if (pScopeDataItem->mask & SDI_PARAM) pScopeDataItem->lParam = m_scopeDataItem.lParam; if (pScopeDataItem->mask & SDI_STATE ) pScopeDataItem->nState = m_scopeDataItem.nState;
//
// SDI_CHILDREN should be overridden by its derived classes.
//
return S_OK; }
STDMETHOD(GetResultPaneInfo)(RESULTDATAITEM *pResultDataItem) { if (pResultDataItem->bScopeItem) { if (pResultDataItem->mask & RDI_STR) { pResultDataItem->str = GetResultPaneColInfo(pResultDataItem->nCol); } if (pResultDataItem->mask & RDI_IMAGE) { pResultDataItem->nImage = m_scopeDataItem.nImage; } if (pResultDataItem->mask & RDI_PARAM) { pResultDataItem->lParam = m_scopeDataItem.lParam; }
return S_OK; }
if (pResultDataItem->mask & RDI_STR) { pResultDataItem->str = GetResultPaneColInfo(pResultDataItem->nCol); } if (pResultDataItem->mask & RDI_IMAGE) { pResultDataItem->nImage = m_resultDataItem.nImage; } if (pResultDataItem->mask & RDI_PARAM) { pResultDataItem->lParam = m_resultDataItem.lParam; } if (pResultDataItem->mask & RDI_INDEX) { pResultDataItem->nIndex = m_resultDataItem.nIndex; }
return S_OK; }
//
// Overridden to provide result icons.
//
STDMETHOD( OnAddImages )( MMC_NOTIFY_TYPE event, long arg, long param, IConsole* pConsole, DATA_OBJECT_TYPES type ) { UNUSED_ALWAYS( event ); UNUSED_ALWAYS( param ); UNUSED_ALWAYS( pConsole ); UNUSED_ALWAYS( type );
// Add Images
IImageList* pImageList = (IImageList*) arg; HRESULT hr = E_FAIL;
// 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) { HBITMAP hBitmap32 = LoadBitmap( _Module.GetResourceInstance(), MAKEINTRESOURCE( IDB_BENEFITS_32 ) ); if (hBitmap32 != NULL) { hr = pImageList->ImageListSetStrip( (long*)hBitmap16, (long*) hBitmap32, 0, RGB( 0, 128, 128 ) ); if ( FAILED( hr ) ) ATLTRACE( _T( "IImageList::ImageListSetStrip failed\n" ) ); } }
return( hr ); }
virtual LPOLESTR GetResultPaneColInfo(int nCol) { if (nCol == 0) { T* pT = static_cast<T*>(this); return( pT->m_bstrDisplayName ); }
// TODO : Return the text for other columns
return OLESTR("Generic Description"); }
//
// Helper function to extract the appropriate console from
// a base object type.
//
STDMETHOD( GetConsole )( CSnapInObjectRootBase* pObj, IConsole** ppConsole ) { HRESULT hr = E_FAIL;
if ( pObj->m_nType == 1 ) { //
// This is the id of the data object.
//
*ppConsole = ( (CBenefits*) pObj )->m_spConsole; (*ppConsole)->AddRef(); hr = S_OK; } else if ( pObj->m_nType == 2 ) { //
// This is the id of the component object.
//
*ppConsole = ( (CBenefitsComponent*) pObj )->m_spConsole; (*ppConsole)->AddRef(); hr = S_OK; }
return( hr ); }
//
// Called to determine if the clipboard data can be obtained and
// if it has a node type that matches the given GUID.
//
STDMETHOD( IsClipboardDataType )( LPDATAOBJECT pDataObject, GUID inGuid ) { HRESULT hr = S_FALSE;
if ( pDataObject == NULL ) return( E_POINTER );
STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL }; FORMATETC formatetc = { CSnapInItem::m_CCF_NODETYPE, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
//
// Allocate memory to received the GUID.
//
stgmedium.hGlobal = GlobalAlloc( 0, sizeof( GUID ) ); if ( stgmedium.hGlobal == NULL ) return( E_OUTOFMEMORY );
//
// Retrieve the GUID of the paste object.
//
hr = pDataObject->GetDataHere( &formatetc, &stgmedium ); if( FAILED( hr ) ) { GlobalFree(stgmedium.hGlobal); return( hr ); }
//
// Make a local copy of the GUID.
//
GUID guid; memcpy( &guid, stgmedium.hGlobal, sizeof( GUID ) ); GlobalFree( stgmedium.hGlobal );
//
// Check to see if the node is of the appropriate type.
//
if ( IsEqualGUID( guid, inGuid ) ) hr = S_OK; else hr = S_FALSE;
return( hr ); }
//
// Command handler for "OnImport" functionality. For the current
// sample, display a simple message box.
//
STDMETHOD( OnImport )(bool& bHandled, CSnapInObjectRootBase* pObj) { UNUSED_ALWAYS( bHandled ); USES_CONVERSION; int nResult; CComPtr<IConsole> spConsole;
//
// Retrieve the appropriate console.
//
GetConsole( pObj, &spConsole ); spConsole->MessageBox( T2OLE( _T( "Data successfully imported" ) ), T2OLE( _T( "Benefits" ) ), MB_ICONINFORMATION | MB_OK, &nResult );
return( S_OK ); };
//
// Command handler for "OnExport" functionality. For the current
// sample, display a simple message box.
//
STDMETHOD( OnExport )(bool& bHandled, CSnapInObjectRootBase* pObj) { UNUSED_ALWAYS( bHandled ); USES_CONVERSION; int nResult; CComPtr<IConsole> spConsole;
//
// Retrieve the appropriate console.
//
GetConsole( pObj, &spConsole ); spConsole->MessageBox( T2OLE( _T( "Data successfully exported" ) ), T2OLE( _T( "Benefits" ) ), MB_ICONINFORMATION | MB_OK, &nResult );
return( S_OK ); };
protected: //
// Container for the employee information.
//
CEmployee* m_pEmployee; };
template< class T > class CChildrenBenefitsData : public CBenefitsData< T > { public: //
// Call the benefits data with no employee. All of our
// containment nodes are not passed in an employee.
//
CChildrenBenefitsData< T >( CEmployee* pEmployee = NULL ) : CBenefitsData< T >( pEmployee ) { };
//
// Overridden to automatically clean-up any child nodes.
//
virtual ~CChildrenBenefitsData() { //
// Free any added nodes.
//
for ( int i = 0; i < m_Nodes.GetSize(); i++ ) { CSnapInItem* pNode; pNode = m_Nodes[ i ]; _ASSERTE( pNode != NULL ); delete pNode; } }
//
// Overridden to automatically expand any child nodes.
//
STDMETHOD( OnShow )( MMC_NOTIFY_TYPE event, long arg, long param, IConsole* pConsole, DATA_OBJECT_TYPES type) { UNUSED_ALWAYS( event ); UNUSED_ALWAYS( param ); UNUSED_ALWAYS( type ); HRESULT hr = E_NOTIMPL; ATLTRACE2(atlTraceSnapin, 0, _T("CChildNodeImpl::OnExpand\n"));
//
// Only add the items if we're being selected.
//
if ( arg == TRUE ) { CComQIPtr<IResultData,&IID_IResultData> spResultData( pConsole ); //
// Loop through and add each subnode.
//
for ( int i = 0; i < m_Nodes.GetSize(); i++ ) { CSnapInItem* pNode; RESULTDATAITEM* pResultData;
pNode = m_Nodes[ i ]; _ASSERTE( pNode != NULL );
//
// Get the scope pane info for the node and set
// relative id.
//
pNode->GetResultData( &pResultData ); _ASSERTE( pResultData != NULL );
//
// Add the item to the scope list using the newly
// populated scope data item.
//
hr = spResultData->InsertItem( pResultData ); _ASSERTE( SUCCEEDED( hr ) ); } }
return( hr ); };
//
// Overridden to automatically expand any child nodes.
//
STDMETHOD( OnExpand )( MMC_NOTIFY_TYPE event, long arg, long param, IConsole* pConsole, DATA_OBJECT_TYPES type) { UNUSED_ALWAYS( event ); UNUSED_ALWAYS( arg ); UNUSED_ALWAYS( type ); ATLTRACE2(atlTraceSnapin, 0, _T("CChildNodeImpl::OnExpand\n"));
CComQIPtr<IConsoleNameSpace, &IID_IConsoleNameSpace> pNameSpace( pConsole ); HRESULT hr = E_NOTIMPL; //
// Loop through and add each subnode.
//
for ( int i = 0; i < m_Nodes.GetSize(); i++ ) { CSnapInItem* pNode; SCOPEDATAITEM* pScopeData;
pNode = m_Nodes[ i ]; _ASSERTE( pNode != NULL );
//
// Get the scope pane info for the node and set
// relative id.
//
pNode->GetScopeData( &pScopeData ); _ASSERTE( pScopeData != NULL ); pScopeData->relativeID = param;
//
// Add the item to the scope list using the newly
// populated scope data item.
//
hr = pNameSpace->InsertItem( pScopeData ); _ASSERTE( SUCCEEDED( hr ) ); }
return( hr ); };
//
// Used as containment for all child nodes.
//
CSimpleArray<CSnapInItem*> m_Nodes; };
class CBenefits; class CBenefitsComponent : public CComObjectRootEx<CComSingleThreadModel>, public CSnapInObjectRoot<2, CBenefits >, public IExtendPropertySheetImpl<CBenefitsComponent>, public IExtendContextMenuImpl<CBenefitsComponent>, public IExtendControlbarImpl<CBenefitsComponent>, public IComponentImpl<CBenefitsComponent>, public IExtendTaskPadImpl<CBenefitsComponent> { public: BEGIN_COM_MAP(CBenefitsComponent) COM_INTERFACE_ENTRY(IComponent) COM_INTERFACE_ENTRY(IExtendPropertySheet) COM_INTERFACE_ENTRY(IExtendContextMenu) COM_INTERFACE_ENTRY(IExtendControlbar) COM_INTERFACE_ENTRY(IExtendTaskPad) END_COM_MAP()
public: CBenefitsComponent() { //
// Taskpad initialization stuff.
//
m_pszTitle = L"Benefits Taskpad"; m_pszBackgroundPath = NULL; }
STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param) { if (lpDataObject != NULL) return IComponentImpl<CBenefitsComponent>::Notify(lpDataObject, event, arg, param); return E_NOTIMPL; }
//
// Taskpad related information. Specifies titles, background
// information, etc.
//
LPOLESTR m_pszTitle; LPOLESTR m_pszBackgroundPath; };
class CBenefits : public CComObjectRootEx<CComSingleThreadModel>, public CSnapInObjectRoot<1, CBenefits>, public IComponentDataImpl<CBenefits, CBenefitsComponent>, public IExtendPropertySheetImpl<CBenefits>, public IExtendContextMenuImpl<CBenefits>, public IPersistStream, public CComCoClass<CBenefits, &CLSID_Benefits>, public ISnapinHelpImpl<CBenefits> { public: CBenefits(); ~CBenefits();
BEGIN_COM_MAP(CBenefits) COM_INTERFACE_ENTRY(IComponentData) COM_INTERFACE_ENTRY(IExtendPropertySheet) COM_INTERFACE_ENTRY(IExtendContextMenu) COM_INTERFACE_ENTRY(IPersistStream) COM_INTERFACE_ENTRY(ISnapinHelp) END_COM_MAP()
DECLARE_REGISTRY_RESOURCEID(IDR_BENEFITS)
DECLARE_NOT_AGGREGATABLE(CBenefits)
//
// Return the classid of this object.
//
STDMETHOD(GetClassID)(CLSID *pClassID) { *pClassID = GetObjectCLSID(); return S_OK; }
//
// Call the root node's implementation.
//
STDMETHOD(IsDirty)();
//
// Call the root node's implementation.
//
STDMETHOD(Load)(LPSTREAM pStm);
//
// Call the root node's implementation.
//
STDMETHOD(Save)(LPSTREAM pStm, BOOL fClearDirty);
//
// Call the root node's implementation.
//
STDMETHOD(GetSizeMax)(ULARGE_INTEGER FAR* pcbSize );
STDMETHOD(Initialize)(LPUNKNOWN pUnknown);
static void WINAPI ObjectMain(bool bStarting) { if (bStarting) CSnapInItem::Init(); }
//
// This is overridden to handle update notifications from
// the property pages.
//
STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param); };
class ATL_NO_VTABLE CBenefitsAbout : public ISnapinAbout, public CComObjectRoot, public CComCoClass< CBenefitsAbout, &CLSID_BenefitsAbout> { public: DECLARE_REGISTRY(CBenefitsAbout, _T("BenefitsAbout.1"), _T("BenefitsAbout.1"), IDS_BENEFITS_DESC, THREADFLAGS_BOTH);
BEGIN_COM_MAP(CBenefitsAbout) COM_INTERFACE_ENTRY(ISnapinAbout) END_COM_MAP()
STDMETHOD(GetSnapinDescription)(LPOLESTR *lpDescription) { USES_CONVERSION; TCHAR szBuf[256]; if (::LoadString(_Module.GetResourceInstance(), IDS_BENEFITS_DESC, szBuf, 256) == 0) return E_FAIL;
*lpDescription = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR)); if (*lpDescription == NULL) return E_OUTOFMEMORY;
ocscpy(*lpDescription, T2OLE(szBuf));
return S_OK; }
STDMETHOD(GetProvider)(LPOLESTR *lpName) { USES_CONVERSION; TCHAR szBuf[256]; if (::LoadString(_Module.GetResourceInstance(), IDS_BENEFITS_PROVIDER, szBuf, 256) == 0) return E_FAIL;
*lpName = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR)); if (*lpName == NULL) return E_OUTOFMEMORY;
ocscpy(*lpName, T2OLE(szBuf));
return S_OK; }
STDMETHOD(GetSnapinVersion)(LPOLESTR *lpVersion) { USES_CONVERSION; TCHAR szBuf[256]; if (::LoadString(_Module.GetResourceInstance(), IDS_BENEFITS_VERSION, szBuf, 256) == 0) return E_FAIL;
*lpVersion = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR)); if (*lpVersion == NULL) return E_OUTOFMEMORY;
ocscpy(*lpVersion, T2OLE(szBuf));
return S_OK; }
STDMETHOD(GetSnapinImage)(HICON *hAppIcon) { *hAppIcon = NULL; return S_OK; }
STDMETHOD(GetStaticFolderImage)(HBITMAP *hSmallImage, HBITMAP *hSmallImageOpen, HBITMAP *hLargeImage, COLORREF *cMask) { UNUSED_ALWAYS( hSmallImage ); UNUSED_ALWAYS( cMask );
*hSmallImageOpen = *hLargeImage = *hLargeImage = 0;
return S_OK; } };
#endif
|