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

#ifndef _GTLAYOUT_DEFINES_H
#define _GTLAYOUT_DEFINES_H 1

	// Debugging stuff

#ifdef DEBUG
#define DB(x)	x
#else
#define DB(x)	;
#endif	/* DEBUG */

	// Keep this one handy

VOID __stdargs	kprintf(STRPTR,...);

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


	// 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 _GTLAYOUT_GLOBAL_H
#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
#define DO_BOOPSI_KIND
#define DO_MENUS
#define DO_POPUP_KIND
#define DO_TAB_KIND
#else
#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
#define DO_BOOPSI_KIND
#define DO_MENUS
#define DO_POPUP_KIND
#define DO_TAB_KIND
#endif	// _GTLAYOUT_GLOBAL_H


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


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

APTR __stdargs __asm AsmCreatePool(register __d0 ULONG MemFlags,register __d1 ULONG PuddleSize,register __d2 ULONG ThreshSize,register __a6 struct ExecBase *SysBase);
VOID __stdargs __asm AsmDeletePool(register __a0 APTR PoolHeader,register __a6 struct ExecBase *SysBase);
APTR __stdargs __asm AsmAllocPooled(register __a0 APTR PoolHeader,register __d0 ULONG Size,register __a6 struct ExecBase *SysBase);
VOID __stdargs __asm AsmFreePooled(register __a0 APTR PoolHeader,register __a1 APTR Memory,register __d0 ULONG MemSize,register __a6 struct ExecBase *SysBase);


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


	// 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;
	BOOLEAN			 NoTicks;
	BOOLEAN			 Discrete;
	WORD			 LastPercentage;
} GaugeExtra;

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

typedef struct ButtonExtra
{
	struct Image		*ButtonImage;
	STRPTR			 KeyStroke;
	STRPTR			*Lines;
	UBYTE			 LineCount;

	BOOLEAN 		 ReturnKey;
	BOOLEAN 		 EscKey;
	BOOLEAN 		 ExtraFat;
	BOOLEAN			 DefaultCorrection;
	BOOLEAN			 Smaller;
} ButtonExtra;

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

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

typedef struct FrameExtra
{
	UWORD			 InnerWidth;
	UWORD			 InnerHeight;
	struct Hook		*RefreshHook;
	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;
	BOOLEAN			 Frame;
	BOOLEAN			 IndentX,
				 IndentY;
	BOOLEAN			 NoIndent;
} GroupExtra;

typedef struct ListExtra
{
	struct List		*Labels;
	struct Gadget		*Link;
	LONG			 LinkID;
	struct Hook		*CallBack;
	LONG			 AutoPageID;
	STRPTR			*ExtraLabels;
	UWORD			 ExtraLabelWidth;
	UWORD			 MaxPen;
	UWORD			 MaxGrowX,MaxGrowY;
	UWORD			 MinChars,MinLines;
	struct TextAttr		*TextAttr;
	WORD			 FixedGlyphWidth,
				 FixedGlyphHeight;
	BOOLEAN 		 ReadOnly;
	BOOLEAN 		 CursorKey;
	BOOLEAN 		 AllocatedList;
	BOOLEAN			 LockSize;
	BOOLEAN			 SizeLocked;
	BOOLEAN			 ResizeX;
	BOOLEAN			 ResizeY;
	BOOLEAN			 FlushLabelLeft;
	BOOLEAN			 IgnoreListContents;
} ListExtra;

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

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

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

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

typedef struct PalExtra
{
	UBYTE			*ColourTable;
	UBYTE			*TranslateBack;
	struct Gadget		*Picker;
	UWORD			 Depth;
	UWORD			 NumColours;
	UWORD			 IndicatorWidth;
	BOOLEAN 		 SmallPalette;
	BOOLEAN			 UsePicker;
} 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;
	BOOLEAN			 Activate;
} 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;
	BOOLEAN			 CustomHook;

	struct Gadget		*LeftIncrementer;
	struct Gadget		*RightIncrementer;

	struct Hook		*IncrementerHook;
	BOOLEAN			 Activate;
} 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 BOOPSIExtra
{
	struct Library		*ClassBase;
	Class			*ClassInstance;
	STRPTR			 ClassName;
	STRPTR			 ClassLibraryName;
	struct TagItem		*ClassTags;
	ULONG			 TagCurrent,
				 TagTextAttr,
				 TagDrawInfo,
				 TagLink,
				 TagScreen;
	LONG			 Link;
	WORD			 ExactWidth,
				 ExactHeight;
	WORD			 RelFontHeight;
	struct ObjectNode	*Parent;
	struct Hook		*ActivateHook;
	BOOLEAN			 FullWidth,
				 FullHeight;
} BOOPSIExtra;

typedef struct PopupExtra
{
	STRPTR			*Choices;
	LONG			 AutoPageID;
	BOOLEAN			 TabKey;
} PopupExtra;

typedef struct TabExtra
{
	STRPTR			*Choices;
	LONG			 AutoPageID;
	struct ObjectNode	*Parent;
	BOOLEAN			 TabKey;
	BOOLEAN			 FullWidth;
} TabExtra;

typedef struct ObjectNode
{
	struct MinNode		 Node;
	struct Gadget		*Host;
	struct ObjectNode	*PointBack;
	STRPTR			 Label;
	LONG			 ID;
	UBYTE			 Type;
	BYTE			 LabelPlace;
	BOOLEAN 		 Disabled;
	BYTE			 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 		 PageSelector;
	UBYTE			 Key;
	UBYTE			 StorageType;
	WORD			 LabelChars;
	APTR			 Storage;

	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;
		BOOPSIExtra		BOOPSI;
		PopupExtra		Popup;
		TabExtra		Tab;
	} Special;
} ObjectNode;

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

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

		// End of public part

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

		// BOOPSI support

	Object			*BOOPSIPrevious;
	Object			*BOOPSIList;

		// Incrementers

	ObjectNode		*ActiveIncrementer;
	WORD			 IncrementerCountdown;
	WORD			 IncrementerAccelerate;
	LONG			 IncrementerIncrement;

		// Cached from DrawInfo structure

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

		// Double-click support

	ULONG			 ClickSeconds;
	ULONG			 ClickMicros;
	ObjectNode		*ClickObject;

	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;
	ObjectNode		*ResizeView;
	ObjectNode		*TabKey;
	ObjectNode		*ActiveString;
#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;
	struct BitMap		 BackfillBitMap;

#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;
	BOOLEAN			 NeedDelay;
	BOOLEAN			 RawKeyFilter;

#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
	BOOLEAN			 BlockParent;
	BOOL			 ExitFlush;

	BOOLEAN			 SizeVerified;
	WORD			 SizeWidth,
				 SizeHeight;

	BOOLEAN			 FlushLeft,
				 FlushTop;
#ifdef DO_LEVEL_KIND
	ObjectNode		*CurrentLevel;
#endif	/* DO_LEVEL_KIND */

	struct TTextAttr	 FixedFont;

	struct LayoutHandle	*PointBack;

	LONG			 GroupID;
} LayoutHandle;

#define PHANTOM_GROUP_ID	-10000	// Phantom groups, i.e those without proper
					// IDs start with this ID

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


	// 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,

				 LineCount;	// Number of lines below

	STRPTR			*Lines;		// Text lines
	STRPTR			 KeyStroke;	// Points to char that acts as keystroke identifier

	STRPTR			 Label;		// Single label if any

	BOOLEAN			 Emboss;	// Emboss the bevel box
} ImageInfo;

	// Image class extension types

#define IIA_ImageType	(TAG_USER+739)
#define IIA_GlyphWidth	(TAG_USER+740)
#define IIA_GlyphHeight	(TAG_USER+741)
#define IIA_Lines	(TAG_USER+742)
#define IIA_LineCount	(TAG_USER+743)
#define IIA_KeyStroke	(TAG_USER+744)
#define IIA_Emboss	(TAG_USER+745)
#define IIA_Label	(TAG_USER+746)

	// 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,
	IMAGECLASS_MULTILINEBUTTON
} 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;
};


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


#define ITEMF_HasSub	(1 << 0)		// Next item is a subitem
#define ITEMF_FirstSub	(1 << 1)		// This is the first subitem
#define ITEMF_IsSub	(1 << 2)		// This is a subitem
#define ITEMF_LastItem	(1 << 3)		// This is the last item
#define ITEMF_IsBar	(1 << 4)		// This is a separator bar
#define ITEMF_Command	(1 << 5)		// This item has a long command key sequence

typedef struct ItemNode
{
	struct MinNode	 Node;
	struct MenuItem	 Item;
	APTR		 UserData;
	ULONG		 ID;			// Item ID

	UWORD		 Flags;			// Flag bits as defined above
	WORD		 Left,			// Actual left edge
			 Top;			// Actual top edge
	WORD		 Width;			// Actual width
	STRPTR		 ExtraLabel;		// For long command sequence labels

	UWORD		 Code;			// Message code
	ULONG		 Qualifier;		// Message qualifier
	UBYTE		 Char;			// ASCII code

	UWORD		 MenuCode;		// Intuition menu code
} ItemNode, *pItemNode;

typedef struct MenuNode
{
	struct MinNode	 Node;
	struct Menu	 Menu;
	APTR		 UserData;
	ULONG		 ID;			// Item ID

	WORD		 Width;			// Actual width

	UWORD		 MenuCode;		// Intuition menu code
} MenuNode, *pMenuNode;

typedef struct RootMenu
{
	APTR			 Pool;		// Memory allocation
	struct TextFont		*Font;		// Preferred item font
	struct TextAttr		*TextAttr;	// What goes into the single items
	struct TTextAttr	 BoldAttr;	// Same as above, just in boldface
	struct DrawInfo		*DrawInfo;	// Screen drawing info
	struct Screen		*Screen;	// The screen we are building the menu for
	struct RastPort		 RPort;		// Dummy RastPort for font measuring

	WORD			 ItemHeight;	// Default item height
	UWORD			 TextPen;	// Text rendering pen

	ULONG			 CheckWidth,	// Size of the checkmark glyph
				 CheckHeight,
				 AmigaWidth,	// Size of the Amiga glyph
				 AmigaHeight;

	struct MinList		 MenuList;	// List of menus
	struct MinList		 ItemList;	// List of menu items

	LayoutHandle		*Handle;	// Layout handle if any
	struct Hook		*LocaleHook;	// Localization, if no handle is provided

	struct MinNode		 Node;		// The initial menu all the data is tied to
	struct Menu		 Menu;
	APTR			 UserData;
	ULONG			 ID;
	WORD			 Width;
	UWORD			 MenuCode;
} RootMenu, *pRootMenu;


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


	// Layer backfill hook support

struct LayerMsg
{
	ULONG			Layer;
	struct Rectangle	Bounds;
};


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


typedef struct PopInfo
{
	STRPTR		*Labels;
	LONG		 NumLabels;
	LONG		 Active;
	LONG		 InitialActive;
	UWORD		 ActiveLen;

	UWORD		 MarkLeft;
	UWORD		 MarkWidth;

	UWORD		 LabelBase;
	UWORD		 LabelLeft;
	UWORD		 LabelTop;

	UWORD		 LineTop;
	UWORD		 LineBase;

	UWORD		 ArrowTop;
	UWORD		 ArrowWidth;
	UWORD		 ArrowHeight;

	LONG		 MaxLen;
	LONG		 MaxWidth;

	UWORD		 PopLeft;
	UWORD		 PopWidth;

	struct Window	*Window;
	struct TextFont	*Font;

	UWORD		 BoxLeft,BoxTop,
			 BoxWidth,BoxHeight;

	UWORD		 BoxLines;

	UWORD		 SingleWidth,
			 SingleHeight;

	LONG		 TopMost;

	LONG		 LastDrawn;
	STRPTR		 LastLabelDrawn;

	UWORD		 MenuText,MenuBack;
	UWORD		 MenuTextSelect,MenuBackSelect;

	UBYTE		 Flags;
} PopInfo;

#define PIA_Labels	(TAG_USER+0x80000)
#define PIA_Active	(TAG_USER+0x80001)
#define PIA_Font	(TAG_USER+0x80002)
#define PIA_Highlight	(TAG_USER+0x80003)


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


typedef struct TabEntry
{
	struct BitMap	*BitMap;
	UWORD		 Left;
} TabEntry;

typedef struct TabInfo
{
	struct BitMap	*BitMap;
	struct RastPort	 RPort;
	PLANEPTR	 Mask;

	TabEntry	*Tabs;
	WORD		 Count;
	WORD		 Current;
	WORD		 Initial;

	UWORD		 Thick;
	UWORD		 TabWidth;
	UWORD		 TabHeight;

	WORD		 Offset;
} TabInfo;

#define TIA_Labels	(TAG_USER+0x90000)
#define TIA_Font	(TAG_USER+0x90001)
#define TIA_Screen	(TAG_USER+0x90002)
#define TIA_Index	(TAG_USER+0x90003)
#define TIA_DrawInfo	(TAG_USER+0x90004)
#define TIA_SizeType	(TAG_USER+0x90005)


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


#endif
