#include "main.h"
#include "./skinnedmenu.h"
#include "./skinnedmenuwnd.h"


SkinnedMenu::SkinnedMenu()
{	
	hwndOwner = NULL;
	skinStyle = SMS_NORMAL;
	hmlil = NULL;
	width = 0;

	if (FAILED(SkinnedMenuThreadInfo::GetInstance(TRUE, &threadInfo)))
		threadInfo = NULL;
}

SkinnedMenu::~SkinnedMenu(void)
{	
	if (NULL != threadInfo)
	{
		threadInfo->RemoveAttachHook(this);
		threadInfo->Release();
	}
}

HWND SkinnedMenu::WindowFromHandle(HMENU menu)
{	
	HWND hwnd;
	SkinnedMenuThreadInfo *threadInfo;

	if (S_OK != SkinnedMenuThreadInfo::GetInstance(FALSE, &threadInfo))
		return NULL;

	hwnd = threadInfo->FindMenuWindow(menu);

	threadInfo->Release();

	return hwnd;
}

BOOL SkinnedMenu::InitializeHook(HWND hwndOwner, UINT skinStyle, HMLIMGLST hmlil, INT width, MENUCUSTOMIZEPROC _customProc, ULONG_PTR customParam)
{
	if (NULL == threadInfo)
		return FALSE;

	if (FALSE != threadInfo->IsAttachHookActive())
		return FALSE;
	
	this->hwndOwner = hwndOwner;
	this->hmlil = hmlil;
	this->width = width;
	this->skinStyle = skinStyle;
	this->customProc = _customProc;
	this->customParam = customParam;

	return threadInfo->SetAttachHook(this);
}

BOOL SkinnedMenu::TrackMenuPopupEx(HMENU hmenu, UINT fuFlags, INT x, INT y, HWND hwnd, LPTPMPARAMS lptpm, UINT skinStyle, 
								   HMLIMGLST hmlil, INT width, MENUCUSTOMIZEPROC customProc, ULONG_PTR customParam)
{
	if (NULL == hwnd || 
		!InitializeHook(hwnd, skinStyle, hmlil, width, customProc, customParam)) 
	{
		return FALSE;
	}
	
	return TrackPopupMenuEx(hmenu, fuFlags, x, y, hwnd, lptpm);
}

BOOL SkinnedMenu::AttachToHwnd(HWND hwndMenu)
{
	SkinnedMenuWnd *psw = new SkinnedMenuWnd(skinStyle, hmlil, width, customProc, customParam);
	if (!psw || !psw->Attach(hwndMenu, hwndOwner))
	{
		delete(psw);
		return FALSE;
	}

	return TRUE;
}