// XTPTaskbarManager.cpp : implementation of the CXTPTaskbarManager class.
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "Common/XTPResourceManager.h"
#include "Common/XTPImageManager.h"

#include "XTPTaskbarManager.h"



#ifndef __ITaskbarList_INTERFACE_DEFINED__
#define __ITaskbarList_INTERFACE_DEFINED__


EXTERN_C const IID IID_ITaskbarList;

	MIDL_INTERFACE("56FDF342-FD6D-11d0-958A-006097C9A090")
	ITaskbarList : public IUnknown
	{
	public:
		virtual HRESULT STDMETHODCALLTYPE HrInit( void) = 0;

		virtual HRESULT STDMETHODCALLTYPE AddTab(
			/* [in] */  HWND hwnd) = 0;

		virtual HRESULT STDMETHODCALLTYPE DeleteTab(
			/* [in] */  HWND hwnd) = 0;

		virtual HRESULT STDMETHODCALLTYPE ActivateTab(
			/* [in] */  HWND hwnd) = 0;

		virtual HRESULT STDMETHODCALLTYPE SetActiveAlt(
			/* [in] */  HWND hwnd) = 0;

	};

#endif  /* __ITaskbarList_INTERFACE_DEFINED__ */


#ifndef __ITaskbarList2_INTERFACE_DEFINED__
#define __ITaskbarList2_INTERFACE_DEFINED__

/* interface ITaskbarList2 */
/* [object][uuid] */


EXTERN_C const IID IID_ITaskbarList2;


	MIDL_INTERFACE("602D4995-B13A-429b-A66E-1935E44F4317")
	ITaskbarList2 : public ITaskbarList
	{
	public:
		virtual HRESULT STDMETHODCALLTYPE MarkFullscreenWindow(
			/* [in] */  HWND hwnd,
			/* [in] */ BOOL fFullscreen) = 0;

	};

#endif  /* __ITaskbarList2_INTERFACE_DEFINED__ */



#ifndef __ITaskbarList3_INTERFACE_DEFINED__
#define __ITaskbarList3_INTERFACE_DEFINED__


typedef /* [v1_enum] */
enum THUMBBUTTONFLAGS
	{   THBF_ENABLED    = 0,
	THBF_DISABLED   = 0x1,
	THBF_DISMISSONCLICK = 0x2,
	THBF_NOBACKGROUND   = 0x4,
	THBF_HIDDEN = 0x8,
	THBF_NONINTERACTIVE = 0x10
	}   THUMBBUTTONFLAGS;

//DEFINE_ENUM_FLAG_OPERATORS(THUMBBUTTONFLAGS)
typedef /* [v1_enum] */
enum THUMBBUTTONMASK
	{   THB_BITMAP  = 0x1,
	THB_ICON    = 0x2,
	THB_TOOLTIP = 0x4,
	THB_FLAGS   = 0x8
	}   THUMBBUTTONMASK;

//DEFINE_ENUM_FLAG_OPERATORS(THUMBBUTTONMASK)
#include <pshpack8.h>
typedef struct THUMBBUTTON
	{
	THUMBBUTTONMASK dwMask;
	UINT iId;
	UINT iBitmap;
	HICON hIcon;
	WCHAR szTip[ 260 ];
	THUMBBUTTONFLAGS dwFlags;
	}   THUMBBUTTON;

typedef struct THUMBBUTTON *LPTHUMBBUTTON;

#include <poppack.h>
#define THBN_CLICKED        0x1800



/* interface ITaskbarList3 */
/* [object][uuid] */

typedef /* [v1_enum] */
enum TBPFLAG
	{   TBPF_NOPROGRESS = 0,
	TBPF_INDETERMINATE  = 0x1,
	TBPF_NORMAL = 0x2,
	TBPF_ERROR  = 0x4,
	TBPF_PAUSED = 0x8
	}   TBPFLAG;


EXTERN_C const IID IID_IXTPTaskbarList3;


	MIDL_INTERFACE("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")
	ITaskbarList3 : public ITaskbarList2
	{
	public:
		virtual HRESULT STDMETHODCALLTYPE SetProgressValue(
			/* [in] */  HWND hwnd,
			/* [in] */ ULONGLONG ullCompleted,
			/* [in] */ ULONGLONG ullTotal) = 0;

		virtual HRESULT STDMETHODCALLTYPE SetProgressState(
			/* [in] */  HWND hwnd,
			/* [in] */ TBPFLAG tbpFlags) = 0;

		virtual HRESULT STDMETHODCALLTYPE RegisterTab(
			/* [in] */  HWND hwndTab,
			/* [in] */  HWND hwndMDI) = 0;

		virtual HRESULT STDMETHODCALLTYPE UnregisterTab(
			/* [in] */  HWND hwndTab) = 0;

		virtual HRESULT STDMETHODCALLTYPE SetTabOrder(
			/* [in] */  HWND hwndTab,
			/* [in] */  HWND hwndInsertBefore) = 0;

		virtual HRESULT STDMETHODCALLTYPE SetTabActive(
			/* [in] */  HWND hwndTab,
			/* [in] */  HWND hwndMDI,
			/* [in] */ DWORD dwReserved) = 0;

		virtual HRESULT STDMETHODCALLTYPE ThumbBarAddButtons(
			/* [in] */  HWND hwnd,
			/* [in] */ UINT cButtons,
			/* [size_is][in] */ LPTHUMBBUTTON pButton) = 0;

		virtual HRESULT STDMETHODCALLTYPE ThumbBarUpdateButtons(
			/* [in] */  HWND hwnd,
			/* [in] */ UINT cButtons,
			/* [size_is][in] */ LPTHUMBBUTTON pButton) = 0;

		virtual HRESULT STDMETHODCALLTYPE ThumbBarSetImageList(
			/* [in] */  HWND hwnd,
			/* [in] */ HIMAGELIST himl) = 0;

		virtual HRESULT STDMETHODCALLTYPE SetOverlayIcon(
			/* [in] */  HWND hwnd,
			/* [in] */  HICON hIcon,
			/* [string][unique][in] */ LPCWSTR pszDescription) = 0;

		virtual HRESULT STDMETHODCALLTYPE SetThumbnailTooltip(
			/* [in] */  HWND hwnd,
			/* [string][unique][in] */ LPCWSTR pszTip) = 0;

		virtual HRESULT STDMETHODCALLTYPE SetThumbnailClip(
			/* [in] */  HWND hwnd,
			/* [in] */  RECT *prcClip) = 0;

	};


#endif  /* __ITaskbarList3_INTERFACE_DEFINED__ */


#ifndef __IShellItem_INTERFACE_DEFINED__
#define __IShellItem_INTERFACE_DEFINED__

/* interface IShellItem */
/* [unique][object][uuid] */

typedef /* [v1_enum] */
enum _SIGDN
	{   SIGDN_NORMALDISPLAY = 0,
	SIGDN_PARENTRELATIVEPARSING = ( int  )0x80018001,
	SIGDN_DESKTOPABSOLUTEPARSING    = ( int  )0x80028000,
	SIGDN_PARENTRELATIVEEDITING = ( int  )0x80031001,
	SIGDN_DESKTOPABSOLUTEEDITING    = ( int  )0x8004c000,
	SIGDN_FILESYSPATH   = ( int  )0x80058000,
	SIGDN_URL   = ( int  )0x80068000,
	SIGDN_PARENTRELATIVEFORADDRESSBAR   = ( int  )0x8007c001,
	SIGDN_PARENTRELATIVE    = ( int  )0x80080001
	}   SIGDN;

/* [v1_enum] */
enum _SICHINTF
	{   SICHINT_DISPLAY = 0,
	SICHINT_ALLFIELDS   = ( int  )0x80000000,
	SICHINT_CANONICAL   = 0x10000000,
	SICHINT_TEST_FILESYSPATH_IF_NOT_EQUAL   = 0x20000000
	} ;
typedef DWORD SICHINTF;

typedef ULONG SFGAOF;

EXTERN_C const IID IID_IXTPShellItem;


	MIDL_INTERFACE("43826d1e-e718-42ee-bc55-a1e261c37bfe")
	IShellItem : public IUnknown
	{
	public:
		virtual HRESULT STDMETHODCALLTYPE BindToHandler(
			/* [unique][in] */ IBindCtx *pbc,
			/* [in] */ REFGUID bhid,
			/* [in] */ REFIID riid,
			/* [iid_is][out] */ void **ppv) = 0;

		virtual HRESULT STDMETHODCALLTYPE GetParent(
			/* [out] */  IShellItem **ppsi) = 0;

		virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
			/* [in] */ SIGDN sigdnName,
			/* [string][out] */  LPWSTR *ppszName) = 0;

		virtual HRESULT STDMETHODCALLTYPE GetAttributes(
			/* [in] */ SFGAOF sfgaoMask,
			/* [out] */  SFGAOF *psfgaoAttribs) = 0;

		virtual HRESULT STDMETHODCALLTYPE Compare(
			/* [in] */  IShellItem *psi,
			/* [in] */ SICHINTF hint,
			/* [out] */  int *piOrder) = 0;

	};


#endif  /* __IShellItem_INTERFACE_DEFINED__ */

//nclude "ObjectArray.h"

#ifndef __IObjectArray_INTERFACE_DEFINED__
#define __IObjectArray_INTERFACE_DEFINED__

	MIDL_INTERFACE("92CA9DCD-5622-4bba-A805-5E9F541BD8C9")
	IObjectArray : public IUnknown
	{
	public:
		virtual HRESULT STDMETHODCALLTYPE GetCount(
			/* [out] */  UINT *pcObjects) = 0;

			virtual HRESULT STDMETHODCALLTYPE GetAt(
			/* [in] */ UINT uiIndex,
			/* [in] */  REFIID riid,
			/* [iid_is][out] */  void **ppv) = 0;

	};
#endif  /* __IObjectArray_INTERFACE_DEFINED__ */


#ifndef __IObjectCollection_INTERFACE_DEFINED__
#define __IObjectCollection_INTERFACE_DEFINED__

	/* interface IObjectCollection */
	/* [unique][object][uuid] */

	MIDL_INTERFACE("5632b1a4-e38a-400a-928a-d4cd63230295")
	IObjectCollection : public IObjectArray
	{
	public:
		virtual HRESULT STDMETHODCALLTYPE AddObject(
			/* [in] */  IUnknown *punk) = 0;

		virtual HRESULT STDMETHODCALLTYPE AddFromArray(
			/* [in] */  IObjectArray *poaSource) = 0;

		virtual HRESULT STDMETHODCALLTYPE RemoveObjectAt(
			/* [in] */ UINT uiIndex) = 0;

		virtual HRESULT STDMETHODCALLTYPE Clear( void) = 0;

	};

#endif  /* __IObjectCollection_INTERFACE_DEFINED__ */


#ifndef __ICustomDestinationList_INTERFACE_DEFINED__
#define __ICustomDestinationList_INTERFACE_DEFINED__

/* interface ICustomDestinationList */
/* [unique][object][uuid] */

typedef /* [v1_enum] */
enum KNOWNDESTCATEGORY
	{   KDC_FREQUENT    = 1,
	KDC_RECENT  = ( KDC_FREQUENT + 1 )
	}   KNOWNDESTCATEGORY;


EXTERN_C const IID IID_IXTPCustomDestinationList;


	MIDL_INTERFACE("6332debf-87b5-4670-90c0-5e57b408a49e")
	ICustomDestinationList : public IUnknown
	{
	public:
		virtual HRESULT STDMETHODCALLTYPE SetAppID(
			/* [string][in] */ LPCWSTR pszAppID) = 0;

		virtual HRESULT STDMETHODCALLTYPE BeginList(
			/* [out] */  UINT *pcMinSlots,
			/* [in] */  REFIID riid,
			/* [iid_is][out] */  void **ppv) = 0;

		virtual HRESULT STDMETHODCALLTYPE AppendCategory(
			/* [string][in] */  LPCWSTR pszCategory,
			/* [in] */  IObjectArray *poa) = 0;

		virtual HRESULT STDMETHODCALLTYPE AppendKnownCategory(
			/* [in] */ KNOWNDESTCATEGORY category) = 0;

		virtual HRESULT STDMETHODCALLTYPE AddUserTasks(
			/* [in] */  IObjectArray *poa) = 0;

		virtual HRESULT STDMETHODCALLTYPE CommitList( void) = 0;

		virtual HRESULT STDMETHODCALLTYPE GetRemovedDestinations(
			/* [in] */  REFIID riid,
			/* [iid_is][out] */  void **ppv) = 0;

		virtual HRESULT STDMETHODCALLTYPE DeleteList(
			/* [string][unique][in] */  LPCWSTR pszAppID) = 0;

		virtual HRESULT STDMETHODCALLTYPE AbortList( void) = 0;

	};

#endif  /* __ICustomDestinationList_INTERFACE_DEFINED__ */

#ifndef PROPERTYKEY_DEFINED
#define PROPERTYKEY_DEFINED
	typedef struct _tagpropertykey
	{
		GUID fmtid;
		DWORD pid;
	}   PROPERTYKEY;

#endif


#ifndef _REFPROPVARIANT_DEFINED
#define REFPROPVARIANT const PROPVARIANT &
#endif

#define INITGUID
#include "propkey.h"

#ifndef __IPropertyStore_INTERFACE_DEFINED__
#define __IPropertyStore_INTERFACE_DEFINED__

	/* interface IPropertyStore */
	/* [unique][object][helpstring][uuid] */



	EXTERN_C const IID IID_IXTPPropertyStore;


	MIDL_INTERFACE("886d8eeb-8cf2-4446-8d02-cdba1dbdcf99")
	IPropertyStore : public IUnknown
	{
	public:
		virtual HRESULT STDMETHODCALLTYPE GetCount(
			/* [out] */ DWORD *cProps) = 0;

			virtual HRESULT STDMETHODCALLTYPE GetAt(
			/* [in] */ DWORD iProp,
			/* [out] */ PROPERTYKEY *pkey) = 0;

			virtual HRESULT STDMETHODCALLTYPE GetValue(
			/* [in] */ REFPROPERTYKEY key,
			/* [out] */ PROPVARIANT *pv) = 0;

			virtual HRESULT STDMETHODCALLTYPE SetValue(
			/* [in] */ REFPROPERTYKEY key,
			/* [in] */ REFPROPVARIANT propvar) = 0;

			virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0;

	};

#endif  /* __IPropertyStore_INTERFACE_DEFINED__ */

const IID BASED_CODE IID_IXTPTaskbarList3 =
	{ 0xea1afb91, 0x9e28, 0x4b86, { 0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf } };


const CLSID BASED_CODE CLSID_XTPDestinationList =
	{ 0x77f10cf0, 0x3db5, 0x4966, { 0xb5, 0x20, 0xb7, 0xc5, 0x4f, 0xd3, 0x5e, 0xd6 } };

const CLSID BASED_CODE CLSID_XTPEnumerableObjectCollection =
	{ 0x2d3468c1, 0x36a7, 0x43b6, { 0xac, 0x24, 0xd3, 0xf0, 0x2f, 0xd9, 0x60, 0x7a } };

const IID BASED_CODE IID_IXTPObjectArray =
	{ 0x92CA9DCD, 0x5622, 0x4bba, { 0xa8, 0x05, 0x5E, 0x9F, 0x54, 0x1B, 0xD8, 0xC9 } };

const IID BASED_CODE IID_IXTPCustomDestinationList =
	{ 0x6332debf, 0x87b5, 0x4670, { 0x90, 0xc0, 0x5e, 0x57, 0xb4, 0x08, 0xa4, 0x9e } };

const IID BASED_CODE IID_IXTPObjectCollection =
	{ 0x5632b1a4, 0xe38a, 0x400a, { 0x92, 0x8a, 0xd4, 0xcd, 0x63, 0x23, 0x02, 0x95 } };

const IID BASED_CODE IID_IXTPShellItem =
	{ 0x43826d1e, 0xe718, 0x42ee, { 0xbc, 0x55, 0xa1, 0xe2, 0x61, 0xc3, 0x7b, 0xfe } };

const IID BASED_CODE IID_IXTPPropertyStore =
	{ 0x886d8eeb, 0x8cf2, 0x4446, { 0x8d, 0x02, 0xcd, 0xba, 0x1d, 0xbd, 0xcf, 0x99 } };


//////////////////////////////////////////////////////////////////////////
// CXTPTaskbarManagerJumpList

CXTPTaskbarManagerJumpList::CXTPTaskbarManagerJumpList()
{
	m_pcdl = NULL;
	m_poaRemoved = NULL;

#ifdef _XTP_ACTIVEX
	EnableAutomation();
	EnableTypeLib();
#endif
}

CXTPTaskbarManagerJumpList::~CXTPTaskbarManagerJumpList()
{

}

void CXTPTaskbarManagerJumpList::BuildList()
{
	HRESULT hr = CoCreateInstance(CLSID_XTPDestinationList, NULL, CLSCTX_INPROC_SERVER, IID_IXTPCustomDestinationList, (void**)&m_pcdl);
	if (SUCCEEDED(hr))
	{
		UINT cMinSlots;
		hr = m_pcdl->BeginList(&cMinSlots, IID_IXTPObjectArray, (void**)(&m_poaRemoved));
		if (SUCCEEDED(hr))
		{
			hr = AddUserTasks();

			if (SUCCEEDED(hr))
			{
				hr = m_pcdl->CommitList();
			}

			m_poaRemoved->Release();
			m_poaRemoved = NULL;
		}
		m_pcdl->Release();
		m_poaRemoved = NULL;
	}
}

void CXTPTaskbarManagerJumpList::DeleteList()
{
	HRESULT hr = CoCreateInstance(CLSID_XTPDestinationList, NULL, CLSCTX_INPROC_SERVER, IID_IXTPCustomDestinationList, (void**)(&m_pcdl));
	if (SUCCEEDED(hr))
	{
		hr = m_pcdl->DeleteList(NULL);
		m_pcdl->Release();
	}
}

void CXTPTaskbarManagerJumpList::Clear()
{
	m_arrTask.RemoveAll();
}

void CXTPTaskbarManagerJumpList::AddTask(LPCTSTR lpszPath, LPCTSTR lpszArgument, LPCTSTR lpszTitle, LPCTSTR lpszIconPath, int nIconIndex /*= -1*/)
{
	CTask task;
	task.m_strPath = lpszPath;
	task.m_strArguments = lpszArgument;
	task.m_strTitle = lpszTitle;
	task.m_strIconPath = lpszIconPath;
	task.m_nIconIndex = nIconIndex;

	if (task.m_strPath.IsEmpty())
	{
		TCHAR szAppPath[MAX_PATH];
		::GetModuleFileName(NULL, szAppPath, MAX_PATH);

		task.m_strPath = szAppPath;
	}

	if (nIconIndex != -1 && task.m_strIconPath.IsEmpty())
	{
		task.m_strIconPath = task.m_strPath;
	}

	m_arrTask.Add(task);
}

HRESULT CXTPTaskbarManagerJumpList::AddUserTasks()
{
	IObjectCollection *poc;
	HRESULT hr = CoCreateInstance(CLSID_XTPEnumerableObjectCollection, NULL, CLSCTX_INPROC, IID_IXTPObjectCollection, (void**)(&poc));
	if (SUCCEEDED(hr))
	{

		for (int i = 0; i < m_arrTask.GetSize(); i++)
		{
			const CTask& task = m_arrTask[i];

			IShellLinkW *psl = NULL;
			hr = CreateShellLink(XTP_CT2CW(task.m_strPath), XTP_CT2CW(task.m_strArguments),
				XTP_CT2CW(task.m_strTitle), XTP_CT2CW(task.m_strIconPath), task.m_nIconIndex, &psl);

			if (SUCCEEDED(hr))
			{
				hr = poc->AddObject(psl);
				psl->Release();
			}
			else
			{
				break;
			}
		}


		if (SUCCEEDED(hr) && m_arrTask.GetSize())
		{
			IObjectArray* poa;
			hr = poc->QueryInterface(IID_IXTPObjectArray, (void**)(&poa));
			if (SUCCEEDED(hr))
			{
				hr = m_pcdl->AddUserTasks(poa);
				poa->Release();
			}
		}
		poc->Release();
	}
	return hr;
}

HRESULT CXTPTaskbarManagerJumpList::CreateShellLink(LPCWSTR lpszApp, LPCWSTR lpszCommandLine,
	LPCWSTR lpszTitle, LPCWSTR lpszIconPath, int nIconIndex, IShellLinkW** ppSL)
{
	IShellLinkW *psl;
	HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)(&psl));
	if (SUCCEEDED(hr))
	{
		hr = psl->SetPath(lpszApp);
		if (SUCCEEDED(hr))
		{
			hr = psl->SetArguments(lpszCommandLine);
			if (SUCCEEDED(hr))
			{
				if (nIconIndex != -1)
				{
					psl->SetIconLocation(lpszIconPath, nIconIndex);
				}

				IPropertyStore *pps;
				hr = psl->QueryInterface(IID_IXTPPropertyStore, (void**)(&pps));
				if (SUCCEEDED(hr))
				{
					PROPVARIANT propvar;
					propvar.vt = VT_BSTR;
					propvar.pwszVal = SysAllocString(lpszTitle);

					hr = pps->SetValue(PKEY_Title, propvar);
					if (SUCCEEDED(hr))
					{
						hr = pps->Commit();
						if (SUCCEEDED(hr))
						{
							hr = psl->QueryInterface(IID_IShellLinkW, (void**)ppSL);
						}
					}
					PropVariantClear(&propvar);

					pps->Release();
				}
			}
		}
		else
		{
			hr = HRESULT_FROM_WIN32(GetLastError());
		}
		psl->Release();
	}
	return hr;
}


BOOL CXTPTaskbarManagerJumpList::IsItemInArray(IShellItem* pSI, IObjectArray* pArray)
{
	BOOL fRet = false;
	UINT cItems;
	if (SUCCEEDED(pArray->GetCount(&cItems)))
	{
		IShellItem *psiCompare;
		for (UINT i = 0; !fRet && i < cItems; i++)
		{
			if (SUCCEEDED(pArray->GetAt(i, IID_IXTPShellItem, (void**)(&psiCompare))))
			{
				int iOrder;
				fRet = SUCCEEDED(psiCompare->Compare(pSI, SICHINT_CANONICAL, &iOrder)) && (0 == iOrder);
				psiCompare->Release();
			}
		}
	}
	return fRet;
}

void CXTPTaskbarManagerJumpList::CommitList()
{
	DeleteList();
	BuildList();
}

//////////////////////////////////////////////////////////////////////////
// CXTPTaskbarManager

CXTPTaskbarManager::CXTPTaskbarManager()
{
	m_nProgressBarRangeMin = 0;
	m_nProgressBarRangeMax = 100;


	m_pTaskbarList3 = NULL;

	HRESULT hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_IXTPTaskbarList3, (void**)(&m_pTaskbarList3));
	if (FAILED(hr) || m_pTaskbarList3 == NULL)
	{
		SAFE_RELEASE(m_pTaskbarList3);
	}


	m_pJumpList = new CXTPTaskbarManagerJumpList();
}


CXTPTaskbarManager::~CXTPTaskbarManager()
{
	SAFE_RELEASE(m_pTaskbarList3);

	CMDTARGET_RELEASE(m_pJumpList);
}


BOOL CXTPTaskbarManager::SetOverlayIcon(HWND hWndParent, HICON hIcon, LPCTSTR lpszDescription)
{
	if (!m_pTaskbarList3)
		return FALSE;

	if (FAILED(m_pTaskbarList3->SetOverlayIcon(hWndParent, hIcon, lpszDescription ? XTP_CT2CW(lpszDescription) : L"")))
		return FALSE;

	return TRUE;
}

BOOL CXTPTaskbarManager::SetOverlayIcon(HWND hWndParent, UINT nIDResource, LPCTSTR lpszDescription)
{

	HICON hIcon = (HICON) LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(nIDResource),
		IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS);


	if (hIcon == NULL)
	{
		TRACE1("Can't load image from the resource with ID %d.", nIDResource);
		return FALSE;
	}


	BOOL bResult = SetOverlayIcon(hWndParent, hIcon, lpszDescription);
	DestroyIcon(hIcon);

	return bResult;
}


void CXTPTaskbarManager::SetProgressBarRange(HWND /*hWndParent*/, int nRangeMin, int nRangeMax)
{
	m_nProgressBarRangeMax = nRangeMax;
	m_nProgressBarRangeMin = nRangeMin;
}

void CXTPTaskbarManager::SetProgressBarPosition(HWND hWndParent, int nProgressPos)
{
	if (!m_pTaskbarList3)
		return;

	m_pTaskbarList3->SetProgressValue(hWndParent, nProgressPos - m_nProgressBarRangeMin,
		m_nProgressBarRangeMax - m_nProgressBarRangeMin);
}

void CXTPTaskbarManager::SetProgressBarState(HWND hWndParent, int nFlags)
{
	if (!m_pTaskbarList3)
		return;

	m_pTaskbarList3->SetProgressState(hWndParent, (TBPFLAG)nFlags);
}


#ifdef _XTP_ACTIVEX


BEGIN_DISPATCH_MAP(CXTPTaskbarManagerJumpList, CCmdTarget)

	DISP_FUNCTION_ID(CXTPTaskbarManagerJumpList, "AddTask", 1, AddTask, VT_EMPTY, VTS_BSTR VTS_BSTR VTS_BSTR VTS_BSTR VTS_I4)

	DISP_FUNCTION_ID(CXTPTaskbarManagerJumpList, "Clear", 2, Clear, VT_EMPTY, VTS_NONE)
	DISP_FUNCTION_ID(CXTPTaskbarManagerJumpList, "CommitList", 3, CommitList, VT_EMPTY, VTS_NONE)

END_DISPATCH_MAP()

// {AE890313-E400-4DA2-AEF5-CF1DD59DCD3B}
static const IID IID_ITreeViewNode =
{ 0xae890313, 0xe400, 0x4da2, { 0xae, 0xf5, 0xcf, 0x1d, 0xd5, 0x9d, 0xcd, 0x3b } };

BEGIN_INTERFACE_MAP(CXTPTaskbarManagerJumpList, CCmdTarget)
	INTERFACE_PART(CXTPTaskbarManagerJumpList, IID_ITreeViewNode, Dispatch)
END_INTERFACE_MAP()

IMPLEMENT_OLETYPELIB_EX(CXTPTaskbarManagerJumpList, IID_ITreeViewNode)


#endif