//==============================================================; // // This source code is only intended as a supplement to // existing Microsoft documentation. // // // // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. // // // //==============================================================; #include #include #include #include "People.h" const GUID CPeoplePoweredVehicle::thisGuid = { 0x2974380d, 0x4c4b, 0x11d2, { 0x89, 0xd8, 0x0, 0x0, 0x21, 0x47, 0x31, 0x28 } }; const GUID CBicycleFolder::thisGuid = { 0xef163732, 0x9353, 0x11d2, { 0x99, 0x67, 0x0, 0x80, 0xc7, 0xdc, 0xb3, 0xdc } }; const GUID CSkateboardFolder::thisGuid = { 0xef163733, 0x9353, 0x11d2, { 0x99, 0x67, 0x0, 0x80, 0xc7, 0xdc, 0xb3, 0xdc } }; const GUID CIceSkateFolder::thisGuid = { 0xf6c660b0, 0x9353, 0x11d2, { 0x99, 0x67, 0x0, 0x80, 0xc7, 0xdc, 0xb3, 0xdc } }; const GUID CBicycle::thisGuid = { 0xef163734, 0x9353, 0x11d2, { 0x99, 0x67, 0x0, 0x80, 0xc7, 0xdc, 0xb3, 0xdc } }; const GUID CSkateboard::thisGuid = { 0xef163735, 0x9353, 0x11d2, { 0x99, 0x67, 0x0, 0x80, 0xc7, 0xdc, 0xb3, 0xdc } }; const GUID CIceSkate::thisGuid = { 0xf6c660b1, 0x9353, 0x11d2, { 0x99, 0x67, 0x0, 0x80, 0xc7, 0xdc, 0xb3, 0xdc } }; //--------------------------------------------------------------------------- // Creates a string with the format // "res:/// // // It is up to the caller to make sure the memory allocated with // CoTaskMemAlloc for the string is freed. // If null is passed in the first parameter, the path to MMC.EXE will be // returned, if the instance handle is passed the returned path will point // the Snap-in dll. // LPOLESTR CreateResourcePath ( HINSTANCE hInst, //[in] Global instance handle LPOLESTR szResource //[in] Path to stored resource ) { _TCHAR szBuffer[MAX_PATH]; ZeroMemory(szBuffer, sizeof(szBuffer)); _tcscpy(szBuffer, _T("res://")); _TCHAR *szTemp = szBuffer + _tcslen(szBuffer); GetModuleFileName(hInst, szTemp, sizeof(szBuffer) - _tcslen(szBuffer)); _tcscat(szBuffer, _T("/")); MAKE_TSTRPTR_FROMWIDE(szname, szResource); _tcscat(szBuffer, szname); MAKE_WIDEPTR_FROMTSTR(wszname, szBuffer); LPOLESTR szOutBuffer = static_cast(CoTaskMemAlloc((wcslen(wszname) + 1) * sizeof(WCHAR))); wcscpy(szOutBuffer, wszname); return szOutBuffer; } //end CreateResoucePath() static LPOLESTR OleDuplicateString(LPOLESTR lpStr) { LPOLESTR tmp = static_cast(CoTaskMemAlloc((wcslen(lpStr) + 1) * sizeof(WCHAR))); wcscpy(tmp, lpStr); return tmp; } //============================================================== // // CPeoplePoweredVehicle implementation // // CPeoplePoweredVehicle::CPeoplePoweredVehicle() { children[0] = new CBicycleFolder; children[1] = new CSkateboardFolder; children[2] = new CIceSkateFolder; } CPeoplePoweredVehicle::~CPeoplePoweredVehicle() { for (int n = 0; n < NUMBER_OF_CHILDREN; n++) delete children[n]; } HRESULT CPeoplePoweredVehicle::OnExpand(IConsoleNameSpace *pConsoleNameSpace, IConsole *pConsole, HSCOPEITEM parent) { SCOPEDATAITEM sdi; if (!bExpanded) { // create the child nodes, then expand them for (int n = 0; n < NUMBER_OF_CHILDREN; n++) { ZeroMemory(&sdi, sizeof(SCOPEDATAITEM) ); sdi.mask = SDI_STR | // Displayname is valid SDI_PARAM | // lParam is valid SDI_IMAGE | // nImage is valid SDI_OPENIMAGE | // nOpenImage is valid SDI_PARENT | // relativeID is valid SDI_CHILDREN; // cChildren is valid sdi.relativeID = (HSCOPEITEM)parent; sdi.nImage = children[n]->GetBitmapIndex(); sdi.nOpenImage = INDEX_OPENFOLDER; sdi.displayname = MMC_CALLBACK; sdi.lParam = (LPARAM)children[n]; // The cookie sdi.cChildren = 0; HRESULT hr = pConsoleNameSpace->InsertItem( &sdi ); _ASSERT( SUCCEEDED(hr) ); } } return S_OK; } CBicycleFolder::CBicycleFolder() { for (int n = 0; n < NUMBER_OF_CHILDREN; n++) { children[n] = new CBicycle(n + 1); } } CBicycleFolder::~CBicycleFolder() { for (int n = 0; n < NUMBER_OF_CHILDREN; n++) if (children[n]) { delete children[n]; } } HRESULT CBicycleFolder::GetResultViewType(LPOLESTR *ppViewType, long *pViewOptions) { TCHAR taskpad[1024]; TCHAR szThis[16]; _ultot((unsigned long)this, szThis, 16); _tcscpy(taskpad, _T("horizontal.htm#")); _tcscat(taskpad, szThis); MAKE_WIDEPTR_FROMTSTR_ALLOC(pszW, taskpad); *ppViewType = CreateResourcePath( NULL, pszW ); *pViewOptions = MMC_VIEW_OPTIONS_NONE; return S_OK; } MMC_TASK *CBicycleFolder::GetTaskList(LPOLESTR szTaskGroup, LONG *nCount) { *nCount = 5; MMC_TASK *tasks = new MMC_TASK[*nCount]; for (int t = 0; t < *nCount; t++) { tasks[t].sDisplayObject.eDisplayType = MMC_TASK_DISPLAY_TYPE_BITMAP; tasks[t].sDisplayObject.uBitmap.szMouseOverBitmap = CreateResourcePath(g_hinst, L"buttonover.bmp"); tasks[t].sDisplayObject.uBitmap.szMouseOffBitmap = CreateResourcePath(g_hinst, L"buttonoff.bmp"); switch (t) { case 0: tasks[t].szText = OleDuplicateString(L"Tune bicycle"); tasks[t].szHelpString = OleDuplicateString(L"Click here to Tune bicycle"); break; case 1: tasks[t].szText = OleDuplicateString(L"Ride bicycle"); tasks[t].szHelpString = OleDuplicateString(L"Click here to ride bicycle"); break; case 2: tasks[t].szText = OleDuplicateString(L"Stop riding bicycle"); tasks[t].szHelpString = OleDuplicateString(L"Click here to stop riding bicycle"); break; case 3: tasks[t].szText = OleDuplicateString(L"Purchase bicycle"); tasks[t].szHelpString = OleDuplicateString(L"Click here to purchase bicycle"); case 4: tasks[t].szText = OleDuplicateString(L"Sell bicycle"); tasks[t].szHelpString = OleDuplicateString(L"Click here to sell bicycle"); break; } tasks[t].eActionType = MMC_ACTION_ID; tasks[t].nCommandID = t; } return tasks; } HRESULT CBicycleFolder::TaskNotify(IConsole *pConsole, VARIANT *v1, VARIANT *v2) { RESULTDATAITEM rdi; IResultData *pResultData; ZeroMemory(&rdi, sizeof(RESULTDATAITEM)); HRESULT hr = S_OK; hr = pConsole->QueryInterface(IID_IResultData, (void **)&pResultData); if (SUCCEEDED(hr)) { rdi.mask = RDI_STATE | RDI_PARAM; // Use selected state to get param. rdi.nState = LVIS_SELECTED | LVIS_FOCUSED; rdi.nIndex = -1; // Start looking for selected item from top of list view hr = pResultData->GetNextItem(&rdi); pResultData->Release(); } if (SUCCEEDED(hr)) { _TCHAR buf[256]; switch (v1->lVal) { case 0: wsprintf(buf, _T("Bicycle %d tuned."), rdi.nIndex); break; case 1: wsprintf(buf, _T("Riding bicycle %d."), rdi.nIndex); break; case 2: wsprintf(buf, _T("Not riding bicycle %d."), rdi.nIndex); break; case 3: wsprintf(buf, _T("Bicycle %d purchased."), rdi.nIndex); break; case 4: wsprintf(buf, _T("Bicycle %d sold."), rdi.nIndex); break; case 102: wsprintf(buf, _T("Special bicycle task choosen (%d)."), rdi.nIndex); break; } MessageBox(NULL, buf, _T("Task Notification"), MB_OK | MB_ICONINFORMATION); } return hr; } HRESULT CBicycleFolder::GetTaskpadTitle(LPOLESTR *pszTitle) { *pszTitle = OleDuplicateString(L"Bicycle Tasks"); return S_OK; } HRESULT CBicycleFolder::GetTaskpadDescription(LPOLESTR *pszDescription) { *pszDescription = OleDuplicateString(L"This is a sample task pad for bicycle nodes"); return S_OK; } HRESULT CBicycleFolder::GetTaskpadBackground(MMC_TASK_DISPLAY_OBJECT *pTDO) { pTDO->eDisplayType = MMC_TASK_DISPLAY_TYPE_BITMAP; pTDO->uBitmap.szMouseOverBitmap = CreateResourcePath(g_hinst, L"bicycle.bmp"); return S_OK; } HRESULT CBicycleFolder::GetListpadInfo(MMC_LISTPAD_INFO *lpListPadInfo) { lpListPadInfo->szTitle = OleDuplicateString(L"Bicycle"); lpListPadInfo->szButtonText = OleDuplicateString(L"Special"); lpListPadInfo->nCommandID = 102; return S_OK; } HRESULT CBicycleFolder::OnListpad(IConsole *pConsole, BOOL bAttaching) { HRESULT hr = S_OK; IHeaderCtrl *pHeaderCtrl = NULL; IResultData *pResultData = NULL; IImageList *pImageList = NULL; if (bAttaching) { hr = pConsole->QueryResultImageList(&pImageList); _ASSERT( SUCCEEDED(hr) ); hr = pImageList->ImageListSetStrip((long *)m_pBMapSm, // pointer to a handle (long *)m_pBMapLg, // pointer to a handle 0, // index of the first image in the strip RGB(0, 128, 128) // color of the icon mask ); _ASSERT( SUCCEEDED(hr) ); pImageList->Release(); hr = pConsole->QueryInterface(IID_IHeaderCtrl, (void **)&pHeaderCtrl); _ASSERT( SUCCEEDED(hr) ); hr = pConsole->QueryInterface(IID_IResultData, (void **)&pResultData); _ASSERT( SUCCEEDED(hr) ); // Set the column headers in the results pane hr = pHeaderCtrl->InsertColumn( 0, L"Name ", 0, MMCLV_AUTO ); _ASSERT( S_OK == hr ); hr = pHeaderCtrl->InsertColumn( 1, L"Bicycle License ", 0, MMCLV_AUTO ); _ASSERT( S_OK == hr ); // insert items here RESULTDATAITEM rdi; hr = pResultData->DeleteAllRsltItems(); _ASSERT( SUCCEEDED(hr) ); if (!bExpanded) { // create the child nodes, then expand them for (int n = 0; n < NUMBER_OF_CHILDREN; n++) { ZeroMemory(&rdi, sizeof(RESULTDATAITEM) ); rdi.mask = RDI_STR | // Displayname is valid RDI_IMAGE | RDI_PARAM; // nImage is valid rdi.nImage = children[n]->GetBitmapIndex(); rdi.str = MMC_CALLBACK; rdi.nCol = 0; rdi.lParam = (LPARAM)children[n]; hr = pResultData->InsertItem( &rdi ); _ASSERT( SUCCEEDED(hr) ); } } pHeaderCtrl->Release(); pResultData->Release(); } return hr; } CIceSkateFolder::CIceSkateFolder() { for (int n = 0; n < NUMBER_OF_CHILDREN; n++) { children[n] = new CIceSkate(n + 1); } } CIceSkateFolder::~CIceSkateFolder() { for (int n = 0; n < NUMBER_OF_CHILDREN; n++) if (children[n]) { delete children[n]; } } HRESULT CIceSkateFolder::GetResultViewType(LPOLESTR *ppViewType, long *pViewOptions) { TCHAR taskpad[1024]; TCHAR szThis[16]; _ultot((unsigned long)this, szThis, 16); _tcscpy(taskpad, _T("listpad.htm#")); _tcscat(taskpad, szThis); MAKE_WIDEPTR_FROMTSTR_ALLOC(pszW, taskpad); *ppViewType = CreateResourcePath( NULL, pszW ); *pViewOptions = MMC_VIEW_OPTIONS_NONE; return S_OK; } MMC_TASK *CIceSkateFolder::GetTaskList(LPOLESTR szTaskGroup, LONG *nCount) { *nCount = 4; MMC_TASK *tasks = new MMC_TASK[*nCount]; for (int t = 0; t < *nCount; t++) { tasks[t].sDisplayObject.eDisplayType = MMC_TASK_DISPLAY_TYPE_BITMAP; tasks[t].sDisplayObject.uBitmap.szMouseOverBitmap = CreateResourcePath(g_hinst, L"buttonover.bmp"); tasks[t].sDisplayObject.uBitmap.szMouseOffBitmap = CreateResourcePath(g_hinst, L"buttonoff.bmp"); switch (t) { case 0: tasks[t].szText = OleDuplicateString(L"Sharpen Skate"); tasks[t].szHelpString = OleDuplicateString(L"Click here to Sharpen skate"); break; case 1: tasks[t].szText = OleDuplicateString(L"Tighten skate laces"); tasks[t].szHelpString = OleDuplicateString(L"Click here to Tighten skate"); break; case 2: tasks[t].szText = OleDuplicateString(L"Wear skate"); tasks[t].szHelpString = OleDuplicateString(L"Click here to Wear skate"); break; case 3: tasks[t].szText = OleDuplicateString(L"Remove skate"); tasks[t].szHelpString = OleDuplicateString(L"Click here to Remove skate"); break; } tasks[t].eActionType = MMC_ACTION_ID; tasks[t].nCommandID = t; } return tasks; } HRESULT CIceSkateFolder::TaskNotify(IConsole *pConsole, VARIANT *v1, VARIANT *v2) { RESULTDATAITEM rdi; IResultData *pResultData; ZeroMemory(&rdi, sizeof(RESULTDATAITEM)); HRESULT hr = S_OK; hr = pConsole->QueryInterface(IID_IResultData, (void **)&pResultData); if (SUCCEEDED(hr)) { rdi.mask = RDI_STATE | RDI_PARAM; // Use selected state to get param. rdi.nState = LVIS_SELECTED | LVIS_FOCUSED; rdi.nIndex = -1; // Start looking for selected item from top of list view hr = pResultData->GetNextItem(&rdi); pResultData->Release(); } if (SUCCEEDED(hr)) { _TCHAR buf[256]; switch (v1->lVal) { case 0: wsprintf(buf, _T("Skate %d sharpened."), rdi.nIndex); break; case 1: wsprintf(buf, _T("Skate %d tightened."), rdi.nIndex); break; case 2: wsprintf(buf, _T("Wearing skate %d."), rdi.nIndex); break; case 3: wsprintf(buf, _T("Skate %d removed."), rdi.nIndex); break; case 101: wsprintf(buf, _T("Special skate task choosen (%d)."), rdi.nIndex); break; } MessageBox(NULL, buf, _T("Task Notification"), MB_OK | MB_ICONINFORMATION); } return hr; } HRESULT CIceSkateFolder::GetTaskpadTitle(LPOLESTR *pszTitle) { *pszTitle = OleDuplicateString(L"Iceskate Tasks"); return S_OK; } HRESULT CIceSkateFolder::GetTaskpadDescription(LPOLESTR *pszDescription) { *pszDescription = OleDuplicateString(L"This is a sample task pad for ice skate nodes"); return S_OK; } HRESULT CIceSkateFolder::GetTaskpadBackground(MMC_TASK_DISPLAY_OBJECT *pTDO) { pTDO->eDisplayType = MMC_TASK_DISPLAY_TYPE_BITMAP; pTDO->uBitmap.szMouseOverBitmap = CreateResourcePath(g_hinst, L"iceskate.bmp"); return S_OK; } HRESULT CIceSkateFolder::GetListpadInfo(MMC_LISTPAD_INFO *lpListPadInfo) { lpListPadInfo->szTitle = OleDuplicateString(L"Ice Skates"); lpListPadInfo->szButtonText = OleDuplicateString(L"Special"); lpListPadInfo->nCommandID = 101; return S_OK; } HRESULT CIceSkateFolder::OnSelect(IConsole *pConsole, BOOL bScope, BOOL bSelect) { IConsole2 *pConsole2; HRESULT hr = S_OK; if (TRUE == bSelect) { hr = pConsole->QueryInterface(IID_IConsole2, (void **)&pConsole2); if (SUCCEEDED(hr)) { hr = pConsole2->SetStatusText(L"Hello, you've selected the ice skate folder"); pConsole2->Release(); } } return hr; } HRESULT CIceSkateFolder::OnListpad(IConsole *pConsole, BOOL bAttaching) { HRESULT hr = S_OK; IHeaderCtrl *pHeaderCtrl = NULL; IResultData *pResultData = NULL; IImageList *pImageList = NULL; if (bAttaching) { hr = pConsole->QueryResultImageList(&pImageList); _ASSERT( SUCCEEDED(hr) ); hr = pImageList->ImageListSetStrip((long *)m_pBMapSm, // pointer to a handle (long *)m_pBMapLg, // pointer to a handle 0, // index of the first image in the strip RGB(0, 128, 128) // color of the icon mask ); _ASSERT( SUCCEEDED(hr) ); pImageList->Release(); hr = pConsole->QueryInterface(IID_IHeaderCtrl, (void **)&pHeaderCtrl); _ASSERT( SUCCEEDED(hr) ); hr = pConsole->QueryInterface(IID_IResultData, (void **)&pResultData); _ASSERT( SUCCEEDED(hr) ); // Set the column headers in the results pane hr = pHeaderCtrl->InsertColumn( 0, L"Name ", 0, MMCLV_AUTO ); _ASSERT( S_OK == hr ); hr = pHeaderCtrl->InsertColumn( 1, L"Sharpness ", 0, MMCLV_AUTO ); _ASSERT( S_OK == hr ); // insert items here RESULTDATAITEM rdi; hr = pResultData->DeleteAllRsltItems(); _ASSERT( SUCCEEDED(hr) ); if (!bExpanded) { // create the child nodes, then expand them for (int n = 0; n < NUMBER_OF_CHILDREN; n++) { ZeroMemory(&rdi, sizeof(RESULTDATAITEM) ); rdi.mask = RDI_STR | // Displayname is valid RDI_IMAGE | RDI_PARAM; // nImage is valid rdi.nImage = children[n]->GetBitmapIndex(); rdi.str = MMC_CALLBACK; rdi.nCol = 0; rdi.lParam = (LPARAM)children[n]; hr = pResultData->InsertItem( &rdi ); _ASSERT( SUCCEEDED(hr) ); } } pHeaderCtrl->Release(); pResultData->Release(); } return hr; } HRESULT CIceSkate::OnSelect(IConsole *pConsole, BOOL bScope, BOOL bSelect) { bSelected = bSelect ? true : false; return S_FALSE; } CSkateboardFolder::CSkateboardFolder() { for (int n = 0; n < NUMBER_OF_CHILDREN; n++) { children[n] = new CSkateboard(n + 1); } } CSkateboardFolder::~CSkateboardFolder() { for (int n = 0; n < NUMBER_OF_CHILDREN; n++) if (children[n]) { delete children[n]; } } HRESULT CSkateboardFolder::GetResultViewType(LPOLESTR *ppViewType, long *pViewOptions) { TCHAR taskpad[1024]; TCHAR szThis[16]; _ultot((unsigned long)this, szThis, 16); _tcscpy(taskpad, _T("default.htm#")); _tcscat(taskpad, szThis); MAKE_WIDEPTR_FROMTSTR_ALLOC(pszW, taskpad); *ppViewType = CreateResourcePath( NULL, pszW ); *pViewOptions = MMC_VIEW_OPTIONS_NONE; return S_OK; } MMC_TASK *CSkateboardFolder::GetTaskList(LPOLESTR szTaskGroup, LONG *nCount) { *nCount = 4; _TCHAR buf[256]; MMC_TASK *tasks = new MMC_TASK[*nCount]; for (int t = 0; t < *nCount; t++) { tasks[t].sDisplayObject.eDisplayType = MMC_TASK_DISPLAY_TYPE_BITMAP; tasks[t].sDisplayObject.uBitmap.szMouseOverBitmap = CreateResourcePath(g_hinst, L"buttonover.bmp"); tasks[t].sDisplayObject.uBitmap.szMouseOffBitmap = CreateResourcePath(g_hinst, L"buttonoff.bmp"); _stprintf(buf, _T("Task #%d"), t); MAKE_WIDEPTR_FROMTSTR(wszText, buf); tasks[t].szText = OleDuplicateString(wszText); _stprintf(buf, _T("Click here to start task #%d"), t); MAKE_WIDEPTR_FROMTSTR(wszHelpString, buf); tasks[t].szHelpString = OleDuplicateString(wszHelpString); tasks[t].eActionType = MMC_ACTION_ID; tasks[t].nCommandID = t; } return tasks; } HRESULT CSkateboardFolder::TaskNotify(IConsole *pConsole, VARIANT *v1, VARIANT *v2) { _TCHAR buf[256]; wsprintf(buf, _T("Skateboard task %ld has been selected."), v1->lVal); MessageBox(NULL, buf, _T("Task Notification"), MB_OK | MB_ICONINFORMATION); return S_OK; } HRESULT CSkateboardFolder::GetTaskpadTitle(LPOLESTR *pszTitle) { *pszTitle = OleDuplicateString(L"Skateboard Tasks"); return S_OK; } HRESULT CSkateboardFolder::GetTaskpadDescription(LPOLESTR *pszDescription) { *pszDescription = OleDuplicateString(L"This is a sample task pad for skateboard nodes"); return S_OK; } HRESULT CSkateboardFolder::GetTaskpadBackground(MMC_TASK_DISPLAY_OBJECT *pTDO) { pTDO->eDisplayType = MMC_TASK_DISPLAY_TYPE_BITMAP; pTDO->uBitmap.szMouseOverBitmap = CreateResourcePath(g_hinst, L"skateboard.bmp"); return S_OK; } HRESULT CSkateboardFolder::GetListpadInfo(MMC_LISTPAD_INFO *lpListPadInfo) { return S_FALSE; } const _TCHAR *CBicycle::GetDisplayName(int nCol) { static _TCHAR buf[128]; if (nCol == 0) { _stprintf(buf, _T("Bicycle #%d"), id); } else if (nCol == 1) { _stprintf(buf, _T("%ld"), (long)this); } return buf; } const _TCHAR *CSkateboard::GetDisplayName(int nCol) { static _TCHAR buf[128]; _stprintf(buf, _T("Skateboard #%d"), id); return buf; } const _TCHAR *CIceSkate::GetDisplayName(int nCol) { static _TCHAR buf[128]; if (nCol == 0) { _stprintf(buf, _T("Ice Skate #%d"), id); } else if (nCol == 1) { _stprintf(buf, _T("Sharpness %ld"), (long)this); } return buf; }