#ifndef __CIcon__H
#define __CIcon__H

#include "std.h"
#include <stdarg.h>

#include <stdbool.h>
#include "WimpLib:Coords.h"
#include "WimpLib:Sprites.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef union
{
	struct
	{
		char* buffer;
		char* validation;
		int   buf_size;
	} it;
	char t[12];
	char s[12];
	char st[12];
	struct
	{
		char*        sprite_name;
		CSpriteArea* sprite_area;
		int          sprite_name_length;
	} is;
	struct
	{
		char* buffer;
		char* validation;
		int   buf_size;
	} ist;
} CIconData;

#define EIcon_Text                       0x00000001
#define EIcon_Sprite                     0x00000002
#define EIcon_Border                     0x00000004
#define EIcon_HCentre                    0x00000008
#define EIcon_VCentre                    0x00000010
#define EIcon_Filled                     0x00000020
#define EIcon_Font                       0x00000040
#define EIcon_Redraw                     0x00000080
#define EIcon_Indirect                   0x00000100
#define EIcon_RightAlign                 0x00000200
#define EIcon_Adjust                     0x00000400
#define EIcon_HalveSprite                0x00000800
#define EIcon_ButtonTypeMask             0x0000F000
#define EIcon_ButtonType_Never           0x00000000
#define EIcon_ButtonType_Always          0x00001000
#define EIcon_ButtonType_Repeat          0x00002000
#define EIcon_ButtonType_Click           0x00003000
#define EIcon_ButtonType_Release         0x00004000
#define EIcon_ButtonType_DoubleClick     0x00005000
#define EIcon_ButtonType_ClickDrag       0x00006000
#define EIcon_ButtonType_ReleaseDrag     0x00007000
#define EIcon_ButtonType_DoubleDrag      0x00008000
#define EIcon_ButtonType_MenuIcon        0x00009000
#define EIcon_ButtonType_DoubleClickDrag 0x0000A000
#define EIcon_ButtonType_Radio           0x0000B000
#define EIcon_ButtonType_WriteClickDrag  0x0000E000
#define EIcon_ButtonType_Writable        0x0000F000
#define EIcon_ESGMask                    0x001F0000
#define EIcon_Selected                   0x00200000
#define EIcon_Dimmed                     0x00400000
#define EIcon_Deleted                    0x00800000

typedef struct
{
	CRect        box;
	unsigned int flags;
	CIconData    data;
} CIcon;

HIcon throw_Icon_Create(HWind id, CIcon* picon);
void Icon_Delete(HWind id, HIcon icon);
bool Icon_GetInfo(HWind id, HIcon icon, CIcon* picon);
void Icon_Plot(const CIcon* picon);
void Icon_Redraw(HWind id, HIcon icon);
void Icon_ForceRedraw(HWind id, HIcon icon);
HIcon throw_Icon_Move(HWind id, HIcon icon, const CRect* pbox);
bool Icon_SetData(HWind id, HIcon icon, const char* pdata);
#ifdef __CC_NORCROFT
#pragma -v1 // hint to the compiler to check f/s/printf format
#endif
void Icon_Printf(HWind id, HIcon icon, const char* pformat, ...);
#ifdef __CC_NORCROFT
#pragma -v0 // return to default
#endif
void Icon_VPrintf(HWind id, HIcon icon, const char* pformat, va_list arg);
char* Icon_GetData(HWind id, HIcon icon);
void Icon_SetValidation(HWind id, HIcon icon, const char* pvalid);
#ifdef __CC_NORCROFT
#pragma -v1 // hint to the compiler to check f/s/printf format
#endif
void Icon_PrintfValidation(HWind id, HIcon icon, const char* pformat, ...);
#ifdef __CC_NORCROFT
#pragma -v0 // return to default
#endif
void Icon_VPrintfValidation(HWind id, HIcon icon, const char* pformat, va_list arg);
void Icon_SetHighlight(HWind id, HIcon icon, bool on);
void Icon_SetDimmed(HWind id, HIcon icon, bool on);
void Icon_PushControl(HWind id, HIcon icon, int time);
void Icon_SetState(HWind id, HIcon icon, unsigned int state, unsigned int mask);
unsigned int Icon_GetState(HWind id, HIcon icon, unsigned int mask);
void Icon_GetScreenBox(HWind id, HIcon icon, CRect* pbox);
void Icon_SetFocus(HWind id, HIcon icon, int index);

#ifdef __cplusplus
}
#endif

#endif
