729 lines
21 KiB
C++
729 lines
21 KiB
C++
|
//==============================================================;
|
||
|
//
|
||
|
// 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 <windows.h>
|
||
|
#include <commctrl.h>
|
||
|
#include <stdio.h>
|
||
|
#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://<Path to this object>/<path to resource>
|
||
|
//
|
||
|
// 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<LPOLESTR>(CoTaskMemAlloc((wcslen(wszname) + 1) * sizeof(WCHAR)));
|
||
|
|
||
|
wcscpy(szOutBuffer, wszname);
|
||
|
|
||
|
return szOutBuffer;
|
||
|
|
||
|
} //end CreateResoucePath()
|
||
|
|
||
|
|
||
|
static LPOLESTR OleDuplicateString(LPOLESTR lpStr) {
|
||
|
LPOLESTR tmp = static_cast<LPOLESTR>(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;
|
||
|
}
|
||
|
|