// SystemGroup.cpp : implementation file // #include "stdafx.h" #include "snapin.h" #include "SystemGroup.h" #include "EventManager.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CSystemGroup IMPLEMENT_SERIAL(CSystemGroup, CHMObject, 1) CSystemGroup::CSystemGroup() { EnableAutomation(); // To keep the application running as long as an OLE automation // object is active, the constructor calls AfxOleLockApp. AfxOleLockApp(); m_nState = HMS_NORMAL; // create the GUID GUID ChildGuid; CoCreateGuid(&ChildGuid); OLECHAR szGuid[GUID_CCH]; ::StringFromGUID2(ChildGuid, szGuid, GUID_CCH); CString sGuid = OLE2CT(szGuid); SetGuid(sGuid); } CSystemGroup::~CSystemGroup() { // To terminate the application when all objects created with // with OLE automation, the destructor calls AfxOleUnlockApp. AfxOleUnlockApp(); } int CSystemGroup::AddShortcut(CHMObject* pObject) { TRACEX(_T("CSystemGroup::AddShortcut\n")); TRACEARGn(pObject); if( ! GfxCheckObjPtr(pObject,CHMObject) ) { TRACE(_T("FAILED : pObject is not a valid pointer.\n")); return -1; } pObject->SetScopePane(GetScopePane()); int iIndex = (int)m_Shortcuts.Add(pObject); for( int i = 0; i < GetScopeItemCount(); i++ ) { CScopePaneItem* pItem = pObject->CreateScopeItem(); if( ! pItem->Create(m_pPane,GetScopeItem(i)) ) { ASSERT(FALSE); delete pItem; return -1; } if( pObject->GetScopeItemCount() ) { pItem->SetDisplayNames(pObject->GetScopeItem(0)->GetDisplayNames()); } else { pItem->SetDisplayName(0,pObject->GetName()); } pItem->SetIconIndex(pObject->GetState()); pItem->SetOpenIconIndex(pObject->GetState()); if( GfxCheckObjPtr(pItem,CHMScopeItem) ) { ((CHMScopeItem*)pItem)->SetObjectPtr(pObject); } int iIndex = GetScopeItem(i)->AddChild(pItem); pItem->InsertItem(iIndex); pObject->AddScopeItem(pItem); } EvtGetEventManager()->AddSystemShortcutAssociation(GetGuid(),pObject->GetSystemName()); return iIndex; } void CSystemGroup::RemoveShortcut(CHMObject* pObject) { TRACEX(_T("CSystemGroup::RemoveShortcut\n")); TRACEARGn(pObject); if( ! pObject ) { return; } EvtGetEventManager()->RemoveSystemShortcutAssociation(GetGuid(),pObject->GetSystemName()); for( int i = 0; i < m_Shortcuts.GetSize(); i++ ) { if( m_Shortcuts[i] == pObject ) { for( int j = pObject->GetScopeItemCount()-1; j >= 0; j-- ) { CScopePaneItem* pChildItem = pObject->GetScopeItem(j); if( pChildItem ) { CHMScopeItem* pParentItem = (CHMScopeItem*)pChildItem->GetParent(); if( pParentItem && pParentItem->GetObjectPtr() == this ) { pObject->RemoveScopeItem(j); pParentItem->DestroyChild(pChildItem); } } } m_Shortcuts.RemoveAt(i); return; } } } void CSystemGroup::OnFinalRelease() { // When the last reference for an automation object is released // OnFinalRelease is called. The base class will automatically // deletes the object. Add additional cleanup required for your // object before calling the base class. CHMObject::OnFinalRelease(); } BEGIN_MESSAGE_MAP(CSystemGroup, CHMObject) //{{AFX_MSG_MAP(CSystemGroup) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(CSystemGroup, CHMObject) //{{AFX_DISPATCH_MAP(CSystemGroup) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() // Note: we add support for IID_ISystemGroup to support typesafe binding // from VBA. This IID must match the GUID that is attached to the // dispinterface in the .ODL file. // {D9BF4F9D-F673-11D2-BDC4-0000F87A3912} static const IID IID_ISystemGroup = { 0xd9bf4f9d, 0xf673, 0x11d2, { 0xbd, 0xc4, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12 } }; BEGIN_INTERFACE_MAP(CSystemGroup, CHMObject) INTERFACE_PART(CSystemGroup, IID_ISystemGroup, Dispatch) END_INTERFACE_MAP() // {D9BF4F9E-F673-11D2-BDC4-0000F87A3912} IMPLEMENT_OLECREATE_EX(CSystemGroup, "SnapIn.SystemGroup", 0xd9bf4f9e, 0xf673, 0x11d2, 0xbd, 0xc4, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12) BOOL CSystemGroup::CSystemGroupFactory::UpdateRegistry(BOOL bRegister) { if (bRegister) return AfxOleRegisterServerClass(m_clsid, m_lpszProgID, m_lpszProgID, m_lpszProgID, OAT_DISPATCH_OBJECT); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID); } ///////////////////////////////////////////////////////////////////////////// // CSystemGroup message handlers ///////////////////////////////////////////////////////////////////////////// // CAllSystemsGroup IMPLEMENT_SERIAL(CAllSystemsGroup, CSystemGroup, 1) CAllSystemsGroup::CAllSystemsGroup() { EnableAutomation(); // To keep the application running as long as an OLE automation // object is active, the constructor calls AfxOleLockApp. AfxOleLockApp(); m_nState = HMS_NORMAL; // create the GUID GUID ChildGuid; CoCreateGuid(&ChildGuid); OLECHAR szGuid[GUID_CCH]; ::StringFromGUID2(ChildGuid, szGuid, GUID_CCH); CString sGuid = OLE2CT(szGuid); SetGuid(sGuid); } CAllSystemsGroup::~CAllSystemsGroup() { // To terminate the application when all objects created with // with OLE automation, the destructor calls AfxOleUnlockApp. AfxOleUnlockApp(); }