#ifndef _GTLAYOUT_H
#define _GTLAYOUT_H

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

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


#ifdef LIB_CODE
#define REG(x)	register __ ## x
#define LIBENT	__asm __saveds
#else
#define REG(x)
#define LIBENT	__regargs
#endif	/* LIB_CODE */


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


#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif

#ifndef INTUITION_INTUITION_H
#include <intuition/intuition.h>
#endif

#ifndef UTILITY_TAGITEM_H
#include <utility/tagitem.h>
#endif

#ifndef INTUITION_GADGETCLASS_H
#include <intuition/gadgetclass.h>
#endif

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


typedef char enum PlacementTypes
{
	PLACE_LEFT,
	PLACE_RIGHT,
	PLACE_ABOVE,
	PLACE_IN,
	PLACE_BELOW
} PlacementTypes;

typedef char enum AlignmentTypes
{
	ALIGNTEXT_LEFT,
	ALIGNTEXT_CENTERED,
	ALIGNTEXT_RIGHT,
	ALIGNTEXT_PAD
} AlignmentTypes;

typedef LONG __stdargs (* DISPFUNC)(struct Gadget *gad,WORD value);

#define ALIGNF_RIGHT		(1 << 0)
#define ALIGNF_LEFT		(1 << 1)
#define ALIGNF_TOP		(1 << 2)
#define ALIGNF_BOTTOM		(1 << 3)
#define ALIGNF_EXTRA_RIGHT	(1 << 4)
#define ALIGNF_EXTRA_LEFT	(1 << 5)
#define ALIGNF_EXTRA_TOP	(1 << 6)
#define ALIGNF_EXTRA_BOTTOM	(1 << 7)


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


/* Generic tags, applicable for several object types */
#define LA_Chars		TAG_USER+2
#define LA_LabelPlace		TAG_USER+3
#define LA_ExtraSpace		TAG_USER+4
#define LA_Center		TAG_USER+60
#define LA_NoKey		TAG_USER+30
#define LA_HighLabel		TAG_USER+31
#define LA_LabelText		TAG_USER+37
#define LA_LabelID		TAG_USER+38
#define LA_ID			TAG_USER+39
#define LA_Type			TAG_USER+40
#define LA_PageSelector		TAG_USER+79

/* Storage type tags */
#define STORE_BYTE		TAG_USER+63
#define LA_BYTE			TAG_USER+63
#define STORE_UBYTE		TAG_USER+64
#define LA_UBYTE		TAG_USER+64
#define STORE_WORD		TAG_USER+65
#define LA_WORD			TAG_USER+65
#define STORE_UWORD		TAG_USER+66
#define LA_UWORD		TAG_USER+66
#define STORE_LONG		TAG_USER+67
#define LA_LONG			TAG_USER+67
#define STORE_ULONG		TAG_USER+68
#define LA_ULONG		TAG_USER+68
#define STORE_STRPTR		TAG_USER+69
#define LA_STRPTR		TAG_USER+69
#define STORE_FRACTION		TAG_USER+68
#define LA_FRACTION		TAG_USER+68

/* for use with LT_GetAttributes() only */
#define LA_Left			TAG_USER+16
#define LA_Top			TAG_USER+17
#define LA_Width		TAG_USER+18
#define LA_Height		TAG_USER+19

/* TEXT_KIND */
#define LATX_Picker		TAG_USER+5

/* VERTICAL_KIND, HORIZONTAL_KIND */
#define LAGR_Spread		TAG_USER+6
#define LAGR_SameSize		TAG_USER+8
#define LAGR_LastAttributes	TAG_USER+46
#define LAGR_ActivePage		TAG_USER+58

/* FRAME_KIND */
#define LAFR_InnerWidth		TAG_USER+9
#define LAFR_InnerHeight	TAG_USER+10
#define LAFR_DrawBox		TAG_USER+11

/* BOX_KIND */
#define LABX_Labels		TAG_USER+12
#define LABX_Lines		TAG_USER+13
#define LABX_Rows		TAG_USER+1
#define LABX_Index		TAG_USER+14
#define LABX_Text		TAG_USER+15
#define LABX_AlignText		TAG_USER+27
#define LABX_DrawBox		TAG_USER+11
#define LABX_FirstLabel		TAG_USER+44
#define LABX_LastLabel		TAG_USER+45
#define LABX_ReserveSpace	TAG_USER+72

/* FRACTION_KIND */
#define LAFC_MaxChars		TAG_USER+20
#define LAFC_Number		TAG_USER+21
#define LAFC_LastGadget		TAG_USER+28
#define LAFC_Min		TAG_USER+23
#define LAFC_Max		TAG_USER+24
#define LAFC_HistoryLines	TAG_USER+59
#define LAFC_HistoryHook	TAG_USER+80

/* SLIDER_KIND */
#define LASL_FullCheck		TAG_USER+22

/* LISTVIEW_KIND */
#define LALV_ExtraLabels	TAG_USER+26
#define LALV_Labels		TAG_USER+33
#define LALV_CursorKey		TAG_USER+35
#define LALV_Lines		TAG_USER+1
#define LALV_Link		TAG_USER+7
#define LALV_FirstLabel		TAG_USER+44
#define LALV_LastLabel		TAG_USER+45
#define LALV_MaxGrowX		TAG_USER+77
#define LALV_MaxGrowY		TAG_USER+78

/* INTEGER_KIND */
#define LAIN_LastGadget		TAG_USER+28
#define LAIN_Min		TAG_USER+23
#define LAIN_Max		TAG_USER+24
#define LAIN_UseIncrementers	TAG_USER+57
#define LAIN_HistoryLines	TAG_USER+59
#define LAIN_HistoryHook	TAG_USER+80

/* STRING_KIND */
#define LAST_LastGadget		TAG_USER+28
#define LAST_Link		TAG_USER+7
#define LAST_Picker		TAG_USER+5
#define LAST_HistoryLines	TAG_USER+59
#define LAST_HistoryHook	TAG_USER+80

/* PASSWORD_KIND */
#define LAPW_LastGadget		TAG_USER+28
#define LAPW_HistoryLines	TAG_USER+59
#define LAPW_HistoryHook	TAG_USER+80

/* PALETTE_KIND */
#define LAPA_SmallPalette	TAG_USER+32
#define LAPA_Lines		LA_Lines

/* BUTTON_KIND */
#define LABT_ReturnKey		TAG_USER+34
#define LABT_EscKey		TAG_USER+56
#define LABT_ExtraFat		TAG_USER+29

/* GAUGE_KIND */
#define LAGA_Percent		TAG_USER+36
#define LAGA_InfoLength		TAG_USER+70
#define LAGA_InfoText		TAG_USER+71

/* CYCLE_KIND */
#define LACY_FirstLabel		TAG_USER+44
#define LACY_LastLabel		TAG_USER+45

/* MX_KIND */
#define LAMX_FirstLabel		TAG_USER+44
#define LAMX_LastLabel		TAG_USER+45

/* SCROLLER_KIND */
#define LASC_Thin		TAG_USER+62

/* XBAR_KIND */
#define LAXB_FullSize		TAG_USER+50

/* Applicable for window only */
#define LAWN_Menu		TAG_USER+25
#define LAWN_UserPort		TAG_USER+47
#define LAWN_Left		TAG_USER+48
#define LAWN_Top		TAG_USER+49
#define LAWN_Zoom		TAG_USER+50
#define LAWN_MaxPen		TAG_USER+52
#define LAWN_BelowMouse		TAG_USER+53
#define LAWN_MoveToWindow	TAG_USER+54
#define LAWN_AutoRefresh	TAG_USER+55
#define LAWN_HelpHook		TAG_USER+73

/* Applicable for layout handle only */
#define LH_Font			TAG_USER+41
#define LH_AutoActivate		TAG_USER+42
#define LH_LocaleHook		TAG_USER+4
#define LH_CloningPermitted	TAG_USER+61
#define LH_EditHook		TAG_USER+74
#define LH_ExactClone		TAG_USER+75
#define LH_MenuGlyphs		TAG_USER+76

/* Last tag item value used */
#define LAST_TAG		TAG_USER+80

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


/* Identifies the absence of a link for a listview or a string gadget */
#define NIL_LINK		-2


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


	/* String gadget type history hook support: you will either get one
	 * of the following values passed as the message parameter to your
	 * hook function, or a pointer to a null-terminated string you should
	 * copy and create a Node from which you should then add to the tail
	 * of your history list. Place a pointer to your history list in the
	 * Hook.h_Data entry.
	 */

#define HISTORYHOOK_DISCARD_OLDEST	0	// Discard oldest entry


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


/* Obsolete tags, don't use in new code */
#define LA_Lines		LABX_Rows
#define LA_Spread		LAGR_Spread
#define LA_SameSize		LAGR_SameSize
#define LA_FullCheck		LASL_FullCheck
#define LA_ExtraLabels		LALV_ExtraLabels
#define LA_LastGadget		LAFC_LastGadget
#define LA_SmallPalette		LAPA_SmallPalette
#define LA_Labels		LALV_Labels
#define LA_Picker		LATX_Picker
#define LA_DrawBox		LAFR_DrawBox
#define LA_FirstLabel		LABX_FirstLabel
#define LA_LastLabel		LABX_LastLabel
#define LA_Min			LAFC_Min
#define LA_Max			LAFC_Max
#define LA_Link			LALV_Link
#define LA_Menu			LAWN_Menu
#define LA_HistoryLines		LAST_HistoryLines
#define LA_HistoryHook		LAST_HistoryHook
#define LA_ReturnKey		LABT_ReturnKey
#define LA_ExtraFat		LABT_ExtraFat
#define LA_CursorKey		LALV_CursorKey

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


/* kinds of objects support in addition to the normal GadTools kinds */
#define HORIZONTAL_KIND		45
#define VERTICAL_KIND		46
#define END_KIND		47
#define FRAME_KIND		48
#define BOX_KIND		49
#define FRACTION_KIND		50
#define XBAR_KIND		51
#define YBAR_KIND		52
#define PASSWORD_KIND		53
#define GAUGE_KIND		54


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


/* in support of FRACTION_KIND gadgets */

typedef ULONG			FIXED;
#define FIXED_UNITY		10000

#define TO_FIXED(l,r)		(FIXED_UNITY * (l) + (r))
#define FIXED_LEFT(f)		((f) / FIXED_UNITY)
#define FIXED_RIGHT(f)		((f) % FIXED_UNITY)


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


#ifndef _GTLAYOUT_C
typedef struct LayoutHandle
{
	struct Screen		*Screen;
	struct DrawInfo		*DrawInfo;
	struct Window		*Window;
	APTR			 VisualInfo;
	struct Image		*AmigaGlyph,
				*CheckGlyph;

	/* private fields follow.... */
} LayoutHandle;
#endif



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


VOID LIBENT			LT_LevelWidth(REG(a0) struct LayoutHandle *handle,REG(a1) STRPTR levelFormat,REG(a2) DISPFUNC dispFunc,REG(d0) LONG min,REG(d1) LONG max,REG(a3) LONG *maxWidth,REG(a5) LONG *maxLen,REG(d2) BOOL fullCheck);
VOID LIBENT			LT_DeleteHandle(REG(a0) struct LayoutHandle *Handle);
struct LayoutHandle * LIBENT	LT_CreateHandle(REG(a0) struct Screen *Screen,REG(a1) struct TextAttr *Font);
struct LayoutHandle * LIBENT	LT_CreateHandleTagList(REG(a0) struct Screen *Screen,REG(a1) struct TagItem *TagList);
BOOL LIBENT			LT_Rebuild(REG(a0) struct LayoutHandle *handle,REG(a1) struct IBox *bounds,REG(a2) LONG extraWidth,REG(d0) LONG extraHeight,REG(d1) BOOL clear);
VOID LIBENT			LT_HandleInput(REG(a0) struct LayoutHandle *Handle,REG(d0) ULONG MsgQualifier,REG(a1) ULONG *MsgClass,REG(a2) UWORD *MsgCode,REG(a3) struct Gadget **MsgGadget);
VOID LIBENT			LT_BeginRefresh(REG(a0) struct LayoutHandle *handle);
VOID LIBENT			LT_EndRefresh(REG(a0) struct LayoutHandle *handle,REG(d0) BOOL complete);
LONG LIBENT			LT_GetAttributesA(REG(a0) struct LayoutHandle *Handle,REG(d0) LONG ID,REG(a1) struct TagItem *TagList);
VOID LIBENT			LT_SetAttributesA(REG(a0) struct LayoutHandle *handle,REG(d0) LONG id,REG(a1) struct TagItem *TagList);
VOID LIBENT			LT_AddA(REG(a0) struct LayoutHandle *Handle,REG(d0) UBYTE Type,REG(d1) STRPTR Label,REG(d2) LONG ID,REG(a1) struct TagItem *TagList);
VOID LIBENT			LT_NewA(REG(a0) struct LayoutHandle *handle,REG(a1) struct TagItem *tagList);
VOID LIBENT			LT_EndGroup(REG(a0) struct LayoutHandle *handle);
struct Window * LIBENT		LT_LayoutA(REG(a0) struct LayoutHandle *handle, REG(a1) STRPTR title,REG(a2) struct IBox *bounds,REG(d0) LONG extraWidth, REG(d1) LONG extraHeight,REG(d2) ULONG IDCMP, REG(d3) UBYTE align, REG(a3) struct TagItem *TagParams);
struct Menu * LIBENT		LT_LayoutMenusA(REG(a0) struct LayoutHandle *handle,REG(a1) struct NewMenu *menuTemplate,REG(a2) struct TagItem *TagParams);
VOID LIBENT			LT_Fixed2String(REG(d0) FIXED fixed,REG(d1) STRPTR buffer);
FIXED LIBENT			LT_String2Fixed(REG(a0) STRPTR buffer);
ULONG LIBENT			LT_FixedMult(REG(d0) FIXED fixed,REG(d1) ULONG factor);
LONG LIBENT			LT_LabelWidth(REG(a0) struct LayoutHandle *handle,REG(a1) STRPTR label);
LONG LIBENT			LT_LabelChars(REG(a0) struct LayoutHandle *handle,REG(a1) STRPTR label);
VOID LIBENT			LT_LockWindow(REG(a0) struct Window *window);
VOID LIBENT			LT_UnlockWindow(REG(a0) struct Window *window);
VOID LIBENT			LT_DeleteWindowLock(REG(a0) struct Window *window);
VOID LIBENT			LT_ShowWindow(REG(a0) struct LayoutHandle *handle,REG(a1) BOOL activate);
VOID LIBENT			LT_Activate(REG(a0) struct LayoutHandle *handle,REG(d0) LONG id);
VOID LIBENT			LT_PressButton(REG(a0) struct LayoutHandle *handle,REG(d0) LONG id);
WORD LIBENT			LT_GetCode(REG(d0) ULONG MsgQualifier,REG(d1) ULONG MsgClass,REG(d2) UWORD MsgCode,REG(a0) struct Gadget *MsgGadget);
struct IntuiMessage * LIBENT	LT_GetIMsg(REG(a0) struct LayoutHandle *Handle);
VOID LIBENT			LT_ReplyIMsg(REG(a0) struct IntuiMessage *Msg);

BOOL				LT_Init(VOID);
VOID				LT_Exit(VOID);

struct LayoutHandle * __stdargs	LT_CreateHandleTags(struct Screen *Screen,...);
LONG __stdargs			LT_GetAttributes(struct LayoutHandle *Handle,LONG ID,...);
VOID __stdargs			LT_SetAttributes(struct LayoutHandle *handle,LONG id,...);
VOID __stdargs			LT_AddL(struct LayoutHandle *handle,UBYTE type,ULONG labelID,LONG id,...);
VOID __stdargs			LT_Add(struct LayoutHandle *Handle,UBYTE Type,STRPTR Label,LONG ID,...);
VOID __stdargs			LT_New(struct LayoutHandle *handle,...);
struct Window * __stdargs	LT_Layout(struct LayoutHandle *handle, STRPTR title,struct IBox *bounds,LONG extraWidth, LONG extraHeight,ULONG IDCMP, UBYTE align, ...);
struct Menu * __stdargs		LT_LayoutMenus(struct LayoutHandle *handle,struct NewMenu *menuTemplate,...);

/* Obsolete routines, redone as macros */
#define LT_GetDrawInfo(Handle)		(Handle) ? ((Handle) -> DrawInfo)	: NULL
#define LT_GetVisualInfo(Handle)	(Handle) ? ((Handle) -> VisualInfo)	: NULL
#define LT_GetScreen(Handle)		(Handle) ? ((Handle) -> Screen)		: NULL
#define LT_SetAutoActivate(Handle,Mode)	LT_SetAttributes(Handle,0,LH_AutoActivate,Mode,TAG_DONE)

#define LT_GetString(Handle,Code)	((STRPTR)LT_GetAttributes((Handle),(Code),TAG_DONE))

#if !defined(LIB_CODE) && !defined(_GTLAYOUT_C) && !defined(NO_PRAGMAS)
#pragma libcall GTLayoutBase LT_DeleteHandle 24 801
#pragma libcall GTLayoutBase LT_CreateHandle 2a 9802
#pragma libcall GTLayoutBase LT_CreateHandleTagList 30 9802
#pragma tagcall GTLayoutBase LT_CreateHandleTags 30 9802
#pragma libcall GTLayoutBase LT_Rebuild 36 10a9805
#pragma libcall GTLayoutBase LT_HandleInput 3c ba90805
#pragma libcall GTLayoutBase LT_BeginRefresh 42 801
#pragma libcall GTLayoutBase LT_EndRefresh 48 802
#pragma tagcall GTLayoutBase LT_GetAttributes 4e 90803
#pragma libcall GTLayoutBase LT_GetAttributesA 4e 90803
#pragma tagcall GTLayoutBase LT_SetAttributes 54 90803
#pragma libcall GTLayoutBase LT_SetAttributesA 54 90803
#pragma tagcall GTLayoutBase LT_Add 5a 9210805
#pragma libcall GTLayoutBase LT_AddA 5a 9210805
#pragma tagcall GTLayoutBase LT_New 60 9802
#pragma libcall GTLayoutBase LT_NewA 60 9802
#pragma libcall GTLayoutBase LT_EndGroup 66 801
#pragma tagcall GTLayoutBase LT_Layout 6c b3210a9808
#pragma libcall GTLayoutBase LT_LayoutA 6c b3210a9808
#pragma tagcall GTLayoutBase LT_LayoutMenus 72 a9803
#pragma libcall GTLayoutBase LT_LayoutMenusA 72 a9803
#pragma libcall GTLayoutBase LT_Fixed2String 78 1002
#pragma libcall GTLayoutBase LT_String2Fixed 7e 801
#pragma libcall GTLayoutBase LT_FixedMult 84 1002
#pragma libcall GTLayoutBase LT_LabelWidth 8a 9802
#pragma libcall GTLayoutBase LT_LabelChars 90 9802
#pragma libcall GTLayoutBase LT_LockWindow 96 801
#pragma libcall GTLayoutBase LT_UnlockWindow 9c 801
#pragma libcall GTLayoutBase LT_DeleteWindowLock a2 801
#pragma libcall GTLayoutBase LT_ShowWindow a8 9802
#pragma libcall GTLayoutBase LT_Activate ae 802
#pragma libcall GTLayoutBase LT_PressButton b4 802
#pragma libcall GTLayoutBase LT_GetCode ba 821004
#pragma libcall GTLayoutBase LT_GetIMsg c0 801
#pragma libcall GTLayoutBase LT_ReplyIMsg c6 801
#endif	/* !LIB_CODE && !_GTLAYOUT_C && !NO_PRAGMAS */

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


#endif	/* _GTLAYOUT_H */
