#include "RtsAPI.h"
#include "Rts.h"
#include <windows.h>
#include <commctrl.h>
#include <docobj.h>
#include "../../vs_haskell_ui/resource.h"

static HsInt32 __stdcall eval_setProperty0(StgStablePtr the_stableptr, HsPtr a1, HsWord32 a2, HsInt32 a3, VARIANT v)
{
	Capability *cap;
	HaskellObj ret;
	HsInt32 cret;
	cap = rts_lock();
	cap=rts_evalIO(cap,rts_apply(cap,(HaskellObj)runIO_closure,rts_apply(cap,rts_apply(cap,rts_apply(cap,rts_apply(cap,(StgClosure*)deRefStablePtr(the_stableptr),rts_mkPtr(cap,a1)),rts_mkWord32(cap,a2)),rts_mkInt32(cap,a3)),rts_mkPtr(cap,(HsPtr) &v))) ,&ret);
	rts_checkSchedStatus("VsProjectProxy_dd3B",cap);
	cret=rts_getInt32(ret);
	rts_unlock(cap);
	return cret;
}

void *export_setProperty0(StgStablePtr hptr)
{
	return createAdjustor(0, hptr, eval_setProperty0, "i");
}

static GUID GUID_VsUIHierarchyWindowCmds  = {0x60481700, 0x078b, 0x11d1, {0xaa, 0xf8, 0x00, 0xa0, 0xc9, 0x05, 0x5a, 0x90}};
static GUID CMDSETID_StandardCommandSet97 = {0x5efc7975, 0x14bc, 0x11cf, {0x9b, 0x2b, 0x00, 0xaa, 0x00, 0x57, 0x38, 0x19}};
static GUID CMDSETID_StandardCommandSet2K = {0x1496A755, 0x94DE, 0x11D0, {0x8C, 0x3F, 0x00, 0xC0, 0x4F, 0xC2, 0xAA, 0xE2}};

static HsInt32 __stdcall eval_queryStatusCommand(StgStablePtr the_stableptr, IUnknown *this, DWORD itemid, GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText)
{
	if (cCmds != 1)
		return OLECMDERR_E_NOTSUPPORTED;

	if ((IsEqualGUID(&GUID_VsUIHierarchyWindowCmds,  pguidCmdGroup) && (prgCmds->cmdID ==   1 || prgCmds->cmdID ==    2 || prgCmds->cmdID ==    3)) ||
	    (IsEqualGUID(&CMDSETID_StandardCommandSet97, pguidCmdGroup) && (prgCmds->cmdID == 220 || prgCmds->cmdID ==  244 || prgCmds->cmdID ==  245 || prgCmds->cmdID ==  261)) ||
	    (IsEqualGUID(&CMDSETID_StandardCommandSet2K, pguidCmdGroup) && (prgCmds->cmdID == 600 || prgCmds->cmdID == 1109 || prgCmds->cmdID == 1110 || prgCmds->cmdID == 1113)))
	{
		Capability *cap;
		HaskellObj ret;
		HsInt32 cret;

		cap = rts_lock();
		cap=rts_evalIO(cap,rts_apply(cap,(HaskellObj)runIO_closure,rts_apply(cap,rts_apply(cap,rts_apply(cap,rts_apply(cap,rts_apply(cap,rts_apply(cap,(StgClosure*)deRefStablePtr(the_stableptr),rts_mkPtr(cap,this)),rts_mkWord32(cap,itemid)),rts_mkPtr(cap,pguidCmdGroup)),rts_mkWord32(cap,cCmds)),rts_mkPtr(cap,prgCmds)),rts_mkPtr(cap,pCmdText))) ,&ret);
		rts_checkSchedStatus("eval_queryStatusCommand",cap);
		cret=rts_getInt32(ret);
		rts_unlock(cap);
		return cret;
	}

	//OutputDebugString("eval_queryStatusCommand");
	//prgCmds[0].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
	return OLECMDERR_E_NOTSUPPORTED;
}

void *export_queryStatusCommand(StgStablePtr hptr)
{
	return createAdjustor(0, hptr, eval_queryStatusCommand, "i");
}

static HsInt32 __stdcall eval_queryStatus(StgStablePtr the_stableptr, IUnknown *this, GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText)
{
	if (cCmds != 1)
		return OLECMDERR_E_NOTSUPPORTED;

	if ((IsEqualGUID(&GUID_VsUIHierarchyWindowCmds,  pguidCmdGroup) && (prgCmds->cmdID ==   1 || prgCmds->cmdID ==    2 || prgCmds->cmdID ==    3)) ||
	    (IsEqualGUID(&CMDSETID_StandardCommandSet97, pguidCmdGroup) && (prgCmds->cmdID == 220 || prgCmds->cmdID ==  244 || prgCmds->cmdID ==  245 || prgCmds->cmdID ==  261)) ||
	    (IsEqualGUID(&CMDSETID_StandardCommandSet2K, pguidCmdGroup) && (prgCmds->cmdID == 600 || prgCmds->cmdID == 1109 || prgCmds->cmdID == 1110 || prgCmds->cmdID == 1113)))
	{
		Capability *cap;
		HaskellObj ret;
		HsInt32 cret;

		cap = rts_lock();
		cap=rts_evalIO(cap,rts_apply(cap,(HaskellObj)runIO_closure,rts_apply(cap,rts_apply(cap,rts_apply(cap,rts_apply(cap,rts_apply(cap,(StgClosure*)deRefStablePtr(the_stableptr),rts_mkPtr(cap,this)),rts_mkPtr(cap,pguidCmdGroup)),rts_mkWord32(cap,cCmds)),rts_mkPtr(cap,prgCmds)),rts_mkPtr(cap,pCmdText))) ,&ret);
		rts_checkSchedStatus("eval_queryStatus",cap);
		cret=rts_getInt32(ret);
		rts_unlock(cap);
		return cret;
	}

	//prgCmds[0].cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
	//OutputDebugString("eval_queryStatus");
	return OLECMDERR_E_NOTSUPPORTED;
}

void *export_queryStatus(StgStablePtr hptr)
{
	return createAdjustor(0, hptr, eval_queryStatus, "i");
}