#ifndef _skin_h
#define _skin_h

#include "WimpLib:Coords.h"
#include "WimpLib:Font.h"
#include "WimpLib:Sprites.h"
#include "WimpLib:CPtrArray.h"

typedef struct
{
	CPtrArray	m_pPanels;
	CPtrArray	m_pFonts;
	CPtrArray	m_pPointers;
} Skin;

typedef struct
{
	char*		pId;
	char*		pName;
	CSize		Size;
	HFont		Handle;
} SkFont;

typedef struct
{
	char*		pId;
	char*		pName;
	CPoint		Offset;
	CSpriteHdr*	pSprite;
} SkPointer;

typedef struct
{
	char*		pName;
	CSpriteHdr*	pSprite;
} SkSprite;

typedef enum
{
	  sk_cmd_none
	, sk_cst_author
	, sk_cst_title
	, sk_cst_track
	, sk_cst_volume
	, sk_text_author
	, sk_text_title
	, sk_text_track
	, sk_text_timemode
	, sk_text_time
	, sk_text_duration
	, sk_text_volume
	, sk_cmd_play
	, sk_cmd_pause
	, sk_cmd_stop
	, sk_cmd_rewind
	, sk_cmd_forward
	, sk_cmd_previous
	, sk_cmd_next
	, sk_cmd_tracklist
	, sk_slide_volume
	, sk_slide_position
	, sk_toggle_timemode
	, sk_toggle_loop
	, sk_toggle_introscan
	, sk_toggle_shuffle
	, sk_toggle_program
	, sk_cmd_track_remove
	, sk_cmd_track_delete_file
	, sk_cmd_track_show_properties
	, sk_cmd_playlist_show
	, sk_cmd_cd_opendrawer
	, sk_cmd_cd_edit
	, sk_cmd_window_back
	, sk_cmd_window_close
	, sk_cmd_window_pin
	, sk_cmd_window_switch
	, sk_cmd_maxcmd
} SkAction_Enum;

typedef enum
{
	  sk_type_text
	, sk_type_button
	, sk_type_toggle
	, sk_type_slider
	, sk_type_area
	, sk_type_panel
} SkType;

struct VSkObject;

typedef struct SkObject
{
	const struct VSkObject*	pVFs;
	char*			pId;
	SkType			Type;
	CRect			Box;
	SkPointer*		pPointer;
	SkAction_Enum		Action;
	void*			ActionParams;
	struct SkObject*	pParent;
	struct SkObject*	pFirstChild;
	struct SkObject*	pLastChild;
	struct SkObject*	pPrevious;
	struct SkObject*	pNext;
} SkObject;

typedef void (*VSkObject_Delete)(SkObject*);
typedef void (*throw_VSkObject_Validate)(Skin*, SkObject*);
typedef struct VSkObject
{
	VSkObject_Delete	Delete;
	throw_VSkObject_Validate	Validate;
} VSkObject;

typedef struct
{
	SkObject	Object;
	SkFont*		pFont;
	char*		pContents;
} SkText;

typedef struct
{
	SkObject	Object;
	CPtrArray	Sprites;
} SkButton;

typedef struct
{
	SkObject	Object;
	CPtrArray	Sprites;
} SkToggle;

typedef struct
{
	SkObject	Object;
} SkSlider;

typedef struct
{
	SkObject	Object;
	CPtrArray	Sprites;
} SkArea;

typedef struct
{
	SkObject	Object;
} SkPanel;

Skin* throw_New_Skin(const char* pFilename);
void Delete_Skin(Skin*);
void Skin_Skin(Skin*, const char* pFilename);
void Skin_NotSkin(Skin*);
SkFont* Skin_FindFont(const Skin*, const char* pName);
SkPointer* Skin_FindPointer(const Skin*, const char* pName);

#endif
