#include <classes/Workbench/icon.h>

#include <pragma/icon_lib.h>
#include <pragma/dos_lib.h>

DiskObjectC::DiskObjectC(STRPTR name, BPTR lock)
{
	objectname = name;
	objectlock = lock;
	icon = NULL;
}

DiskObjectC::~DiskObjectC()
{
	if (icon)
		FreeDiskObject(icon);
}

BOOL DiskObjectC::get()
{
	if (objectname)
		if (!objectlock)
			return (icon = GetDiskObject(objectname)) != NULL
		else {
			BPTR olddir = CurrentDir(objectlock);
			BOOL b = ((icon = GetDiskObject(objectname)) != NULL);
			CurrentDir(olddir);
			return b;
		};
	return FALSE;
}

BOOL DiskObjectC::remove()
{
	if (objectname)
		return DeleteDiskObject(objectname);
	return FALSE;
}

UBYTE DiskObjectC::type()
{
	if (icon)
		return icon->do_Type;
	return 0;
}

STRPTR *DiskObjectC::toolTypes()
{
	if (icon)
		return (STRPTR *) icon->do_ToolTypes;
	return NULL;
}

STRPTR DiskObjectC::defaultTool()
{
	if (icon)
		return icon->do_DefaultTool;
	return NULL;
}

LONG DiskObjectC::stackSize()
{
	if (icon)
		return icon->do_StackSize;
	return 0;
}

LONG DiskObjectC::currentX()
{
	if (icon)
		return icon->do_CurrentX;
	return NO_ICON_POSITION;
}

LONG DiskObjectC::currentY()
{
	if (icon)
		return icon->do_CurrentY;
	return NO_ICON_POSITION;
}

STRPTR DiskObjectC::findToolType(STRPTR type)
{
	if (icon)
		return FindToolType((UBYTE **) icon->do_ToolTypes,type);
	return NULL;
}

BOOL DiskObjectC::matchToolType(STRPTR type, STRPTR value)
{
	if (icon)
	{
		STRPTR x = FindToolType((UBYTE **) icon->do_ToolTypes,type);
		if (x)
			return MatchToolValue(x,value);
	};
	return FALSE;
}

BOOL DiskObjectC::matchToolValue(STRPTR tooltype, STRPTR value)
{
	if (tooltype)
		return MatchToolValue(tooltype,value);
	return FALSE;
}

// ******************************************************

ToolTypeCursorC::ToolTypeCursorC(DiskObjectC &o)
{
	object = &o;
	pos = NULL;
}

VOID ToolTypeCursorC::first()
{
	pos = object->toolTypes();
}

VOID ToolTypeCursorC::next()
{
	if (!isDone())
		pos++;
}

BOOL ToolTypeCursorC::isDone()
{
	if (!pos)
		first();
	if (!pos)
		return TRUE;
	return *pos == NULL;
}

STRPTR ToolTypeCursorC::item()
{
	if (isDone())
		return NULL;
	return *pos;
}

// *******************************************************

BOOL DiskObjectNewC::get()
{
	if (objectname)
		if (!objectlock)
			return (icon = GetDiskObjectNew(objectname)) != NULL
		else {
			BPTR olddir = CurrentDir(objectlock);
			BOOL b = ((icon = GetDiskObjectNew(objectname)) != NULL);
			CurrentDir(olddir);
			return b;
		};
	return FALSE;
}

// *******************************************************

DefDiskObjectC::DefDiskObjectC(LONG type)
	: DiskObjectC(NULL)
{
	objecttype = type;
}

DefDiskObjectC::~DefDiskObjectC()
{
}

BOOL DefDiskObjectC::get()
{
	return (icon = GetDefDiskObject(objecttype)) != NULL;
}

// ******************************************************

NewDiskObjectC::NewDiskObjectC(UBYTE type)
{
	object.do_Magic = WB_DISKMAGIC;
	object.do_Version = WB_DISKVERSION;
	object.do_Gadget.Flags = GADGIMAGE;
	object.do_Gadget.Activation = RELVERIFY|GADGIMMEDIATE;
	object.do_Gadget.GadgetType = BOOLGADGET;
	object.do_Type = type;
	object.do_CurrentX = NO_ICON_POSITION;
	object.do_CurrentY = NO_ICON_POSITION;
	switch (type)
	{
		case WBDISK:
		case WBDRAWER:
		case WBGARBAGE:
			object.do_DrawerData = &drawer;
			drawer.dd_CurrentX = NO_ICON_POSITION;
			drawer.dd_CurrentY = NO_ICON_POSITION;
			break;
	};
	object.do_StackSize = 4000;
}

NewDiskObjectC::NewDiskObjectC(DiskObjectC &obj)
{
	object.do_Magic = WB_DISKMAGIC;
	object.do_Version = WB_DISKVERSION;
	object.do_Gadget.Flags = GADGIMAGE;
	object.do_Gadget.Activation = RELVERIFY|GADGIMMEDIATE;
	object.do_Gadget.GadgetType = BOOLGADGET;
	drawer.dd_CurrentX = NO_ICON_POSITION;
	drawer.dd_CurrentY = NO_ICON_POSITION;
	source = &obj;
}

NewDiskObjectC::~NewDiskObjectC()
{
}

BOOL NewDiskObjectC::put(STRPTR name)
{
	return FALSE;
}

// ******************************************************
