/*++ Copyright (C) Microsoft Corporation Module Name: events.cpp Abstract: implementation of CComponent functions Author: William Hsieh (williamh) created Revision History: --*/ #include "devmgr.h" HRESULT CComponent::OnShow(MMC_COOKIE cookie, LPARAM arg, LPARAM param) { UNREFERENCED_PARAMETER(param); // // Note - arg is TRUE when it is time to enumerate // CFolder* pFolder = FindFolder(cookie); if (arg) { m_pCurFolder = pFolder; } if (pFolder) { return pFolder->OnShow((BOOL)arg); } else { return S_OK; } } HRESULT CComponent::OnMinimize( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponent::OnViewChange( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponent::OnProperties( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponent::OnResultItemClick( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponent::OnResultItemDblClick( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_FALSE; } HRESULT CComponent::OnActivate( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponent::OnSelect( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(param); CFolder* pFolder; pFolder = FindFolder(cookie); if (pFolder && LOWORD(arg)) { // // LOWORD(arg) being set indicated this is for the scope pane item. // Save the bSelect value for use by the MenuCommand. // pFolder->m_bSelect = (BOOL) HIWORD(arg); } if (!pFolder || S_FALSE == pFolder->OnSelect()) { // // either we can not find the responsible folder // or the responsible folder asks us to do it, // set the console verb to its defaults // m_pConsoleVerb->SetVerbState(MMC_VERB_OPEN, HIDDEN, TRUE); m_pConsoleVerb->SetVerbState(MMC_VERB_DELETE, HIDDEN, TRUE); m_pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, HIDDEN, TRUE); m_pConsoleVerb->SetVerbState(MMC_VERB_PASTE, HIDDEN, TRUE); m_pConsoleVerb->SetVerbState(MMC_VERB_REFRESH, HIDDEN, TRUE); m_pConsoleVerb->SetVerbState(MMC_VERB_PRINT, HIDDEN, TRUE); m_pConsoleVerb->SetDefaultVerb(MMC_VERB_OPEN); } return S_OK; } HRESULT CComponent::OnOcxNotify( MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param ) { //TRACE1(TEXT("Componet:OnOcxNotify, event = %lx\n"), event); if (m_pCurFolder) { return m_pCurFolder->OnOcxNotify(event, arg, param); } return S_OK; } HRESULT CComponent::OnBtnClick( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponent::OnAddImages( MMC_COOKIE cookie, IImageList* pIImageList, HSCOPEITEM hScopeItem ) { UNREFERENCED_PARAMETER(hScopeItem); if (!cookie) { return LoadScopeIconsForResultPane(pIImageList); } return S_OK; } HRESULT CComponent::OnRestoreView( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(arg); if (!param) { return E_INVALIDARG; } CFolder* pFolder; pFolder = FindFolder(cookie); if (pFolder) { return pFolder->OnRestoreView((BOOL*)param); } else { *((BOOL *)param) = FALSE; return S_OK; } } HRESULT CComponent::OnContextHelp( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); String strHelpOverview; String strHelpTopic; // // Load help file and overview topic strings. // strHelpOverview.LoadString(g_hInstance, IDS_HTMLHELP_NAME); strHelpTopic.LoadString(g_hInstance, IDS_HTMLHELP_OVERVIEW_TOPIC); strHelpOverview += TEXT("::"); strHelpOverview += strHelpTopic; return m_pDisplayHelp->ShowTopic(const_cast((LPCTSTR)strHelpOverview)); } HRESULT CComponent::LoadScopeIconsForResultPane( IImageList* pIImageList ) { if (pIImageList) { HICON hIcon; HRESULT hr = S_OK; hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_DEVMGR)); if (hIcon) { hr = pIImageList->ImageListSetIcon((PLONG_PTR)hIcon, IMAGE_INDEX_DEVMGR); DeleteObject(hIcon); } return hr; } else { return E_INVALIDARG; } } #if DBG TCHAR *tvNotifyStr[] = { TEXT("CLICK"), TEXT("DBLCLK"), TEXT("RCLICK"), TEXT("RDBLCLK"), TEXT("KEYDOWN"), TEXT("CONTEXTMENU"), TEXT("EXPANDING"), TEXT("EXPANDED"), TEXT("SELCHANGING"), TEXT("SELCHANGED"), TEXT("GETDISPINFO"), TEXT("FOCUSCHANGED"), TEXT("UNKNOWN") }; #endif HRESULT CComponent::tvNotify( HWND hwndTV, MMC_COOKIE cookie, TV_NOTIFY_CODE Code, LPARAM arg, LPARAM param ) { #if DBG int i = Code; if (Code > TV_NOTIFY_CODE_UNKNOWN) { i = TV_NOTIFY_CODE_UNKNOWN; } //TRACE((TEXT("Componet:tvNotify, Code = %lx %s cookie = %lx\n"), Code, tvNotifyStr[i], cookie)); #endif CFolder* pFolder; pFolder = FindFolder(cookie); if (pFolder) { return pFolder->tvNotify(hwndTV, GetActiveCookie(cookie), Code, arg, param); } return S_FALSE; } //////////////////////////////////////////////////////////////////////////// //// IComponentData events handlers //// HRESULT CComponentData::OnProperties( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponentData::OnBtnClick( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponentData::OnDelete( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } HRESULT CComponentData::OnRename( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; } // // This function handles the MMCN_EXPAND notification code // Input: lpDataObject -- point to the target IDataObject // arg -- TRUE if expanding, FALSE if collapsing. // param -- not used. // // Output: HRESULT HRESULT CComponentData::OnExpand( LPDATAOBJECT lpDataObject, LPARAM arg, LPARAM param ) { INTERNAL_DATA tID; HRESULT hr; // // If we are not expanding, do nothing // if (!arg) { return S_OK; } hr = ExtractData(lpDataObject, CDataObject::m_cfSnapinInternal, (PBYTE)&tID, sizeof(tID)); if (SUCCEEDED(hr)) { hr = CreateScopeItems(); if (SUCCEEDED(hr) && !m_pMachine) { if (!g_MachineList.CreateMachine(m_strMachineName, &m_pMachine)) { hr = HRESULT_FROM_WIN32(GetLastError()); } } if (SUCCEEDED(hr)) { CCookie* pCookie = GetActiveCookie(tID.cookie); ASSERT(pCookie); HSCOPEITEM hScopeParent = (HSCOPEITEM)param; CScopeItem* pScopeItem = pCookie->GetScopeItem(); ASSERT(pScopeItem); pScopeItem->SetHandle(hScopeParent); // // If we have children and this is the first time we // are expanding, insert all the children to scope pane. // if (pCookie->GetChild() && !pScopeItem->IsEnumerated()) { SCOPEDATAITEM ScopeDataItem; CCookie* pTheCookie = pCookie->GetChild(); do { CScopeItem* pTheItem = pTheCookie->GetScopeItem(); ASSERT(pTheItem); ScopeDataItem.relativeID = hScopeParent; ScopeDataItem.nState = 0; ScopeDataItem.displayname = (LPOLESTR)(-1); ScopeDataItem.mask = SDI_IMAGE | SDI_OPENIMAGE | SDI_CHILDREN | SDI_STR | SDI_PARAM | SDI_STATE; ScopeDataItem.nImage = pTheItem->GetImageIndex(); ScopeDataItem.nOpenImage = pTheItem->GetOpenImageIndex(); ScopeDataItem.cChildren = pTheItem->GetChildCount(); ScopeDataItem.lParam = reinterpret_cast(pTheCookie); hr = m_pScope->InsertItem(&ScopeDataItem); if (FAILED(hr)) { break; } pTheItem->SetHandle(ScopeDataItem.ID); pTheCookie = pTheCookie->GetSibling(); } while (pTheCookie); } pScopeItem->Enumerated(); } } else { // // The provided lpDataObject is not ours, we are being // expanded as an extension snapin. Find out what // node type the data object is. If it is "MyComputer" // system tools, attach our scope items to // it. // CLSID CLSID_NodeType; hr = ExtractData(lpDataObject, CDataObject::m_cfNodeType, (PBYTE)&CLSID_NodeType, sizeof(CLSID_NodeType)); if (FAILED(hr)) { return hr; } if (CLSID_SYSTOOLS == CLSID_NodeType) { TCHAR MachineName[MAX_PATH + 1]; MachineName[0] = _T('\0'); hr = ExtractData(lpDataObject, CDataObject::m_cfMachineName, (BYTE*)MachineName, sizeof(MachineName)); if (SUCCEEDED(hr)) { m_ctRoot = COOKIE_TYPE_SCOPEITEM_DEVMGR; m_strMachineName.Empty(); if (_T('\0') != MachineName[0]) { if (_T('\\') != MachineName[0]) { m_strMachineName = TEXT("\\\\"); } m_strMachineName += MachineName; } hr = CreateScopeItems(); if (SUCCEEDED(hr)) { CMachine* pMachine; pMachine = g_MachineList.FindMachine(m_strMachineName); if (!pMachine || pMachine != m_pMachine) { if (!g_MachineList.CreateMachine(m_strMachineName, &m_pMachine)) { hr = HRESULT_FROM_WIN32(GetLastError()); } } } } if (SUCCEEDED(hr)) { // // Always insert "Device Manager" node because // we are expanding as an extention to Computer Management // CCookie* pCookie = GetActiveCookie(0); ASSERT(pCookie); CScopeItem* pScopeItem = pCookie->GetScopeItem(); ASSERT(pScopeItem); SCOPEDATAITEM ScopeDataItem; memset(&ScopeDataItem, 0, sizeof(ScopeDataItem)); ScopeDataItem.relativeID = (HSCOPEITEM)(param); ScopeDataItem.nState = 0; ScopeDataItem.displayname = (LPOLESTR)(-1); ScopeDataItem.mask = SDI_IMAGE | SDI_OPENIMAGE | SDI_CHILDREN | SDI_STR | SDI_PARAM | SDI_STATE; ScopeDataItem.nImage = pScopeItem->GetImageIndex(); ScopeDataItem.nOpenImage = pScopeItem->GetOpenImageIndex(); ScopeDataItem.cChildren = pScopeItem->GetChildCount(); ScopeDataItem.lParam = reinterpret_cast(pCookie); hr = m_pScope->InsertItem(&ScopeDataItem); pScopeItem->SetHandle(ScopeDataItem.ID); } } } return hr; } HRESULT CComponentData::OnContextMenu( MMC_COOKIE cookie, LPARAM arg, LPARAM param ) { UNREFERENCED_PARAMETER(cookie); UNREFERENCED_PARAMETER(arg); UNREFERENCED_PARAMETER(param); return S_OK; }