/*  GadTools layout toolkit
**
**  Copyright © 1993-1994 by Olaf `Olsen' Barthel
**  Freely distributable.
*/

#ifndef _GTLAYOUT_DEFINES_H
#define _GTLAYOUT_DEFINES_H 1

	// Keyboard qualifiers

#define QUALIFIER_SHIFT 	(IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
#define QUALIFIER_ALT		(IEQUALIFIER_LALT | IEQUALIFIER_RALT)
#define QUALIFIER_CONTROL	(IEQUALIFIER_CONTROL)


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


	// Undefine these to remove various chunks of support from this code

#ifdef LIB_CODE
#define DO_PASSWORD_KIND
#define DO_FRACTION_KIND
#define DO_GAUGE_KIND
#define DO_TAPEDECK_KIND
#define DO_HEXHOOK
#define DO_PICKSHORTCUTS
#define DO_CLONING
#define DO_LEVEL_KIND
#else
#define DO_PASSWORD_KIND
//#define DO_FRACTION_KIND
#define DO_GAUGE_KIND
//#define DO_HEXHOOK
#define DO_PICKSHORTCUTS
#define DO_CLONING
#define DO_TAPEDECK_KIND
#endif	/* LIB_CODE */


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


	// Stuff from amiga.lib that we want to declare stdargs/regargs

VOID __regargs	NewList(struct MinList *list);
VOID __regargs	TimeDelay(LONG unit,ULONG secs,ULONG micros);
ULONG __regargs DoSuperMethodA(struct IClass *cl, Object *obj, Msg message);
APTR __asm	AsmCreatePool(register __d0 ULONG MemFlags,register __d1 ULONG PuddleSize,register __d2 ULONG ThreshSize,register __a6 struct ExecBase *SysBase);
VOID __asm	AsmDeletePool(register __a0 APTR PoolHeader,register __a6 struct ExecBase *SysBase);
APTR __asm	AsmAllocPooled(register __a0 APTR PoolHeader, register __d0 ULONG Size,register __a6 struct ExecBase *SysBase);
VOID __asm	AsmFreePooled(register __a0 APTR PoolHeader,register __a1 APTR Memory,register __d0 ULONG MemSize,register __a6 struct ExecBase *SysBase);

VOID __stdargs	kprintf(STRPTR,...);

#define BOOLSTRING(w) ((w) ? "TRUE" : "FALSE")


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


	// Scan an Exec list

#define SCANLIST(l,n)	for(n = (APTR)((struct MinList *)l) -> mlh_Head; \
			((struct MinNode *)n) -> mln_Succ; \
			n = (APTR)((struct MinNode *)n) -> mln_Succ)

	// Scan the objects of a group

#define SCANGROUP(g,n)	for(n = (APTR)g -> Special . Group . ObjectList . mlh_Head; \
			((struct MinNode *)n) -> mln_Succ; \
			n = (APTR)((struct MinNode *)n) -> mln_Succ)

	// Scan the objects of a group, only allowing active pages

#define SCANPAGE(g,n,p) for(p = 0, n = (APTR)g -> Special . Group . ObjectList . mlh_Head; \
			((struct MinNode *)n) -> mln_Succ; \
			n = (APTR)((struct MinNode *)n) -> mln_Succ) \
			if ((p++ == g -> Special . Group . ActivePage) || !g -> Special . Group . Paging)

	// Get an object pointer from a gadget pointer

#define GETOBJECT(g,n)	((n = (ObjectNode *)g -> UserData) && (n -> Host == g) && (n -> PointBack == n))


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


#ifdef DO_PASSWORD_KIND
#define TEST_PASSWORD_KIND(n) || (n -> Type == PASSWORD_KIND)
#else
#define TEST_PASSWORD_KIND(n) || (FALSE)
#endif

#ifdef DO_FRACTION_KIND
#define TEST_FRACTION_KIND(n) || (n -> Type == FRACTION_KIND)
#else
#define TEST_FRACTION_KIND(n) || (FALSE)
#endif

	// Is an object derived from STRING_KIND?

#define LIKE_STRING_KIND(n)	((n -> Type == STRING_KIND) TEST_PASSWORD_KIND(n) TEST_FRACTION_KIND(n))


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


typedef UBYTE BOOLEAN;

#define INCREMENTER_KIND	42
#define PICKER_KIND		43
#define GROUP_KIND		44

#define LAPR_Gadget		TAG_USER+100
#define LAPR_Object		TAG_USER+101

typedef struct GaugeExtra
{
	LONG			 InfoLength;
	STRPTR			 InfoText;
} GaugeExtra;

typedef struct TapeDeckExtra
{
	struct Image		*ButtonImage;
	LONG			 ButtonWidth,
				 ButtonHeight;
	BOOLEAN 		 ButtonType,
				 Toggle,
				 Pressed,
				 Smaller;
} TapeDeckExtra;

typedef struct ButtonExtra
{
	BOOLEAN 		 ReturnKey;
	BOOLEAN 		 EscKey;
	BOOLEAN 		 ExtraFat;
} ButtonExtra;

typedef struct BarExtra
{
	struct ObjectNode	*Parent;
	BOOLEAN 		 FullSize;
} BarExtra;

typedef struct BoxExtra
{
	struct ObjectNode	*Parent;
	STRPTR			*Labels;
	STRPTR			*Lines;
	AlignmentTypes		 AlignText;
	WORD			 MaxSize;
	BOOLEAN 		 DrawBox;
	BOOLEAN 		 ReserveSpace;
} BoxExtra;

typedef struct FrameExtra
{
	UWORD			 InnerWidth;
	UWORD			 InnerHeight;
	BOOLEAN 		 DrawBox;
} FrameExtra;

typedef struct PickerExtra
{
	struct Gadget		*Parent;
	struct Image		*Image;
} PickerExtra;

typedef struct IncrementerExtra
{
	struct Gadget		*Parent;
	struct Image		*Image;
	LONG			 Amount;
} IncrementerExtra;

typedef struct GroupExtra
{
	struct MinList		 ObjectList;
	struct ObjectNode	*ParentGroup;
	UWORD			 ExtraLeft;
	UWORD			 ExtraTop;
	LONG			 MaxOffset;
	LONG			 MaxSize;
	ULONG			 ActivePage;
	BOOLEAN 		 Horizontal;
	BOOLEAN 		 Paging;
	BOOLEAN 		 Spread;
	BOOLEAN 		 SameSize;
	BOOLEAN 		 LastAttributes;
	BOOLEAN 		 Visible;
} GroupExtra;

typedef struct ListExtra
{
	struct List		*Labels;
	struct Gadget		*Link;
	LONG			 LinkID;
	struct Hook		*CallBack;
	ULONG			 ClickSeconds;
	ULONG			 ClickMicros;
	STRPTR			*ExtraLabels;
	UWORD			 ExtraLabelWidth;
	UWORD			 MaxPen;
	UWORD			 MaxGrowX,MaxGrowY;
	BOOLEAN 		 ReadOnly;
	BOOLEAN 		 CursorKey;
	BOOLEAN 		 AllocatedList;
} ListExtra;

typedef struct RadioExtra
{
	STRPTR			*Choices;
	UWORD			 LabelWidth;
	UBYTE			 TitlePlace;
	LONG			 AutoPageID;
} RadioExtra;

typedef struct TextExtra
{
	STRPTR			 Text;
	struct Gadget		*Picker;
	UWORD			 Len;
	BOOLEAN 		 Border;
	BOOLEAN 		 CopyText;
	BOOLEAN 		 UsePicker;
	UBYTE			 Justification;
} TextExtra;

typedef struct NumberExtra
{
	LONG			 Number;
	BOOLEAN 		 Border;
	UBYTE			 Justification;
} NumberExtra;

typedef struct CycleExtra
{
	STRPTR			*Choices;
	LONG			 AutoPageID;
} CycleExtra;

typedef struct PalExtra
{
	UBYTE			*ColourTable;
	UWORD			 Depth;
	UWORD			 NumColours;
	BOOLEAN 		 SmallPalette;
} PalExtra;

typedef struct SliderExtra
{
	STRPTR			 LevelFormat;
	DISPFUNC		 DispFunc;
	LONG			 MaxLevelLen;
	LONG			 LevelWidth;
	STRPTR			 OriginalLabel;
	UBYTE			 LevelPlace;
	BOOLEAN 		 FullLevelCheck;
} SliderExtra;

typedef struct StringExtra
{
	struct LayoutHandle	*LayoutHandle;
	struct Hook		*HistoryHook;
	ULONG			 MaxHistoryLines;
	ULONG			 NumHistoryLines;
	struct Node		*CurrentNode;

	STRPTR			 String;
	LONG			 MaxChars;
	struct Hook		*EditHook;
	struct Gadget		*Picker;
	STRPTR			 Backup;
	STRPTR			 RealString;
	STRPTR			 Original;
	LONG			 LinkID;
	UBYTE			 Justification;
	BOOLEAN 		 LastGadget;
	BOOLEAN 		 UsePicker;
} StringExtra;

typedef struct IntegerExtra
{
	struct LayoutHandle	*LayoutHandle;
	struct Hook		*HistoryHook;
	ULONG			 MaxHistoryLines;
	ULONG			 NumHistoryLines;
	struct Node		*CurrentNode;

	LONG			 Number;
	LONG			 MaxChars;
	struct Hook		*EditHook;
	UBYTE			 Justification;
	BOOLEAN 		 LastGadget;
	BOOLEAN 		 UseIncrementers;

	struct Gadget		*LeftIncrementer;
	struct Gadget		*RightIncrementer;

	struct Hook		*IncrementerHook;
} IntegerExtra;

typedef struct ScrollerExtra
{
	WORD			 Visible,
				 ArrowSize;
	BOOLEAN 		 RelVerify,
				 Immediate,
				 Arrows,
				 Vertical,
				 Thin;
} ScrollerExtra;

typedef struct LevelExtra
{
	struct LayoutHandle	*Handle;
	LONG			 Min,
				 Max,
				 Level,
				 Plus;
	STRPTR			 LevelFormat;
	struct Image		*LevelImage;
	DISPFUNC		 DispFunc;
	struct Hook		 CustomHook;
	LONG			 MaxLevelWidth,
				 MidOffset,
				 LevelPlace;
	BOOL			 FullLevelCheck;
} LevelExtra;

typedef struct ObjectNode
{
	struct MinNode		 Node;
	struct Gadget		*Host;
	struct ObjectNode	*PointBack;
	STRPTR			 Label;
	LONG			 ID;
	UBYTE			 Type;
	PlacementTypes		 LabelPlace;
	BOOLEAN 		 Disabled;
	PlacementTypes		 ObjectPlace;
	LONG			 Min;
	LONG			 Max;
	LONG			 Current;
	UWORD			 Left;
	UWORD			 Top;
	UWORD			 Width;
	UWORD			 Height;
	UWORD			 LabelWidth;
	UWORD			 Lines;
	UWORD			 Chars;
	WORD			 ExtraSpace;
	BOOLEAN 		 NoKey;
	BOOLEAN 		 HighLabel;
	BOOLEAN 		 GroupIndent;
	BOOLEAN 		 Centered;
	BOOLEAN 		 PageSelector;
	UBYTE			 Key;
	APTR			 Storage;
	UBYTE			 StorageType;
	UBYTE			 Pad;

	union
	{
		GaugeExtra		Gauge;
		TapeDeckExtra		TapeDeck;
		ButtonExtra		Button;
		BarExtra		Bar;
		BoxExtra		Box;
		FrameExtra		Frame;
		PickerExtra		Picker;
		IncrementerExtra	Incrementer;
		GroupExtra		Group;
		ListExtra		List;
		RadioExtra		Radio;
		TextExtra		Text;
		NumberExtra		Number;
		CycleExtra		Cycle;
		PalExtra		Palette;
		SliderExtra		Slider;
		StringExtra		String;
		IntegerExtra		Integer;
		ScrollerExtra		Scroller;
		LevelExtra		Level;
	} Special;
} ObjectNode;

typedef struct LayoutHandle
{
		// WARNING: Beginning of this structure must match the definition in gui.h!

	struct Screen		*Screen;
	struct DrawInfo 	*DrawInfo;
	struct Window		*Window;
	APTR			 VisualInfo;
	struct Image		*AmigaGlyph,
				*CheckGlyph;

	struct Screen		*PubScreen;
	struct MsgPort		*MsgPort;
	struct Gadget		**GadgetArray;
	struct Gadget		*Previous;
	struct Gadget		*List;
	ULONG			 IDCMP;

	ObjectNode		*ActiveIncrementer;
	LONG			 IncrementerCountdown;

		// Cached from DrawInfo structure

	UWORD			 TextPen;
	UWORD			 BackgroundPen;
	UWORD			 ShadowPen;
	UWORD			 ShinePen;
	UWORD			 AspectX;
	UWORD			 AspectY;

	struct Hook		*LocaleHook;
	struct TextAttr 	*TextAttr;
	struct TextAttr 	*InitialTextAttr;
	struct TTextAttr	 CopyTextAttr;
	struct RastPort 	 RPort;
	APTR			 Pool;
	UWORD			 GlyphWidth;
	UWORD			 InterWidth;
	UWORD			 InterHeight;
	LONG			 Count;
	LONG			 Index;
	LONG			 MaxID;
	ObjectNode		*TopGroup;
	ObjectNode		*CurrentGroup;
	ObjectNode		*EscKey;
	ObjectNode		*ReturnKey;
	ObjectNode		*CursorKey;
	ObjectNode		*GrowView;
#ifdef DO_FRACTION_KIND
	struct Hook		 FracEditHook;
#endif
#ifdef DO_PASSWORD_KIND
	struct Hook		 PasswordEditHook;
#endif
#ifdef DO_HEXHOOK
	struct Hook		 HexEditHook;
#endif
	struct Hook		 DefaultEditHook;
	struct Hook		*StandardEditHook;
	struct Hook		 BackfillHook;

#ifdef DO_PICKSHORTCUTS
	UBYTE			 Keys[256];
#endif

	struct Hook		*HelpHook;		// Hook to call when help key is pressed
	LONG			 MaxPen;

	BOOLEAN 		 AutoRefresh;
	BOOLEAN 		 CloseFont;
	BOOLEAN 		 Failed;
	BOOLEAN 		 Rescaled;
	BOOLEAN 		 AutoActivate;
	BOOLEAN 		 MoveToWindow;

#ifdef DO_CLONING
	BOOLEAN 		 CloningPermitted;	// Genetic engineering?
	BOOLEAN 		 ExactClone;		// Make an exact copy, i.e. preserve all colours
	BOOL			 SimpleClone;		// Just a simple clone, please
	struct CloneExtra	*CloneExtra;		// Screen cloning information
#endif

	struct Window		*Parent;		// Parent of this window
	BOOL			 BlockParent;
	BOOL			 Expand;

#ifdef DO_LEVEL_KIND
	ObjectNode		*CurrentLevel;
#endif	/* DO_LEVEL_KIND */
} LayoutHandle;


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


	// Window locking

typedef struct LockNode
{
	struct MinNode		 MinNode;
	struct Window		*Window;
	LONG			 Count;
	ULONG			 OldIDCMPFlags;
	struct Requester	 Requester;
	LONG			 MinWidth;
	LONG			 MinHeight;
	LONG			 MaxWidth;
	LONG			 MaxHeight;
} LockNode;


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


	// Image class extension

typedef struct ImageInfo
{
	UWORD			 ImageType,	// Type

				 GlyphWidth,	// Size
				 GlyphHeight,

				 Pad;		// Pad to long
} ImageInfo;

	// Image class extension types

#define IIA_ImageType	(TAG_USER+739)
#define IIA_GlyphWidth	(TAG_USER+740)
#define IIA_GlyphHeight (TAG_USER+741)

	// Supported image class extension types

typedef enum ImageTypes
{
	IMAGECLASS_PICKER,
	IMAGECLASS_LEFTINCREMENTER,
	IMAGECLASS_RIGHTINCREMENTER,
	IMAGECLASS_BACKWARD,
	IMAGECLASS_FORWARD,
	IMAGECLASS_PREVIOUS,
	IMAGECLASS_NEXT,
	IMAGECLASS_RECORD,
	IMAGECLASS_PLAY,
	IMAGECLASS_STOP,
	IMAGECLASS_PAUSE,
	IMAGECLASS_REWIND,
	IMAGECLASS_EJECT
} ImageTypes;


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


	// Level image class

typedef struct LevelImageInfo
{
	WORD		 KnobWidth,	// Width of knob (actually half of it)
			 KnobTop,	// Distance from knob to level body
			 LevelHeight;	// Height of level body

	LONG		 Position,	// Position of knob on level body
			 Max,		// Maximum value
			 Current;	// Current value

	struct DrawInfo *DrawInfo;	// Handy
} LevelImageInfo;

	// Level class control tags

#define LVIA_Current	(TAG_USER+0xF000)	// Current value
#define LVIA_Max	(TAG_USER+0xF001)	// Maximum value
#define LVIA_DrawInfo	(TAG_USER+0xF002)	// Pens, etc.
#define LVIA_Position	(TAG_USER+0xF003)	// Position of knob
#define LVIA_KnobWidth	(TAG_USER+0xF004)	// Width of knob
#define LVIA_FontWidth	(TAG_USER+0xF005)	// Reference font width


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


typedef enum StorageTypes
{
	STORAGE_BYTE,STORAGE_UBYTE,
	STORAGE_WORD,STORAGE_UWORD,
	STORAGE_LONG,STORAGE_ULONG,
	STORAGE_STRPTR
} StorageTypes;


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


	// A single colour in 96 bit precision

struct ColourTriplet
{
	ULONG			Red,		// 32 bits each
				Green,
				Blue;
};

	// A colour table ready to submit to LoadRGB32

struct ColourRecord
{
	UWORD			NumColours,	// Number of colours in this chunk
				FirstColour;	// First colour entry to set

	struct ColourTriplet	Triplets[0];	// Table entries

	WORD			Arnold; 	// Array terminator, needs to be set to zero
};

	// Screen reproduction

struct CloneExtra
{
	struct Screen		*Screen;
	LONG			*Pens;
	UWORD			*ScreenPens;
	UWORD			 MinWidth,
				 MinHeight,
				 MaxWidth,
				 MaxHeight,
				 TotalPens;
	UBYTE			 Depth;
	struct IBox		 Bounds;
};

#endif
