#ifndef LIBRARIES_GADTOOLS_H
#define LIBRARIES_GADTOOLS_H
/*
**	$Id: gadtools.h,v 39.9 92/08/19 18:12:26 vertex Exp $
**
**	gadtools.library definitions
**
**	(C) Copyright 1989-1992, Commodore-Amiga, Inc.
**	All Rights Reserved
*/

/*------------------------------------------------------------------------*/

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

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

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

/*------------------------------------------------------------------------*/

/* The kinds (almost classes) of gadgets that GadTools supports.
 * Use these identifiers when calling CreateGadgetA()
 */

#define GENERIC_KIND	0
#define BUTTON_KIND	1
#define CHECKBOX_KIND	2
#define INTEGER_KIND	3
#define LISTVIEW_KIND	4
#define MX_KIND		5
#define NUMBER_KIND	6
#define CYCLE_KIND	7
#define PALETTE_KIND	8
#define SCROLLER_KIND	9
/* Kind number 10 is reserved */
#define SLIDER_KIND	11
#define STRING_KIND	12
#define TEXT_KIND	13

#define NUM_KINDS	14

/*------------------------------------------------------------------------*/

/* 'Or' the appropriate set together for your Window IDCMPFlags: */

#define ARROWIDCMP	(IDCMP_GADGETUP | IDCMP_GADGETDOWN |\
	IDCMP_INTUITICKS | IDCMP_MOUSEBUTTONS)

#define BUTTONIDCMP	(IDCMP_GADGETUP)
#define CHECKBOXIDCMP	(IDCMP_GADGETUP)
#define INTEGERIDCMP	(IDCMP_GADGETUP)
#define LISTVIEWIDCMP	(IDCMP_GADGETUP | IDCMP_GADGETDOWN |\
	IDCMP_MOUSEMOVE | ARROWIDCMP)

#define MXIDCMP		(IDCMP_GADGETDOWN)
#define NUMBERIDCMP	(0L)
#define CYCLEIDCMP	(IDCMP_GADGETUP)
#define PALETTEIDCMP	(IDCMP_GADGETUP)

/* Use ARROWIDCMP|SCROLLERIDCMP if your scrollers have arrows: */
#define SCROLLERIDCMP	(IDCMP_GADGETUP | IDCMP_GADGETDOWN | IDCMP_MOUSEMOVE)
#define SLIDERIDCMP	(IDCMP_GADGETUP | IDCMP_GADGETDOWN | IDCMP_MOUSEMOVE)
#define STRINGIDCMP	(IDCMP_GADGETUP)

#define TEXTIDCMP	(0L)

/*------------------------------------------------------------------------*/

/* Generic NewGadget used by several of the gadget classes: */

struct NewGadget
{
    WORD ng_LeftEdge, ng_TopEdge;	/* gadget position */
    WORD ng_Width, ng_Height;		/* gadget size */
    UBYTE *ng_GadgetText;		/* gadget label */
    struct TextAttr *ng_TextAttr;	/* desired font for gadget label */
    UWORD ng_GadgetID;			/* gadget ID */
    ULONG ng_Flags;			/* see below */
    APTR ng_VisualInfo;			/* Set to retval of GetVisualInfo() */
    APTR ng_UserData;			/* gadget UserData */
};


/* ng_Flags control certain aspects of the gadget.  The first five control
 * the placement of the descriptive text.  Each gadget kind has its default,
 * which is usually PLACETEXT_LEFT.  Consult the autodocs for details.
 */

#define PLACETEXT_LEFT	0x0001	/* Right-align text on left side */
#define PLACETEXT_RIGHT	0x0002  /* Left-align text on right side */
#define PLACETEXT_ABOVE	0x0004  /* Center text above */
#define PLACETEXT_BELOW	0x0008  /* Center text below */
#define PLACETEXT_IN	0x0010  /* Center text on */

#define NG_HIGHLABEL	0x0020  /* Highlight the label */


/*------------------------------------------------------------------------*/

/* Fill out an array of these and pass that to CreateMenus(): */

struct NewMenu
{
    UBYTE nm_Type;		/* See below */
    /* Compiler inserts a PAD byte here */
    STRPTR nm_Label;		/* Menu's label */
    STRPTR nm_CommKey;		/* MenuItem Command Key Equiv */
    UWORD nm_Flags;		/* Menu or MenuItem flags (see note) */
    LONG nm_MutualExclude;	/* MenuItem MutualExclude word */
    APTR nm_UserData;		/* For your own use, see note */
};

/* Needed only by inside IM_ definitions below */
#define MENU_IMAGE	128

/* nm_Type determines what each NewMenu structure corresponds to.
 * for the NM_TITLE, NM_ITEM, and NM_SUB values, nm_Label should
 * be a text string to use for that menu title, item, or sub-item.
 * For IM_ITEM or IM_SUB, set nm_Label to point at the Image structure
 * you wish to use for this item or sub-item.
 * NOTE: At present, you may only use conventional images.
 * Custom images created from Intuition image-classes do not work.
 */
#define NM_TITLE	1	/* Menu header */
#define NM_ITEM		2	/* Textual menu item */
#define NM_SUB		3	/* Textual menu sub-item */

#define IM_ITEM		(NM_ITEM|MENU_IMAGE)	/* Graphical menu item */
#define IM_SUB		(NM_SUB|MENU_IMAGE)	/* Graphical menu sub-item */

/* The NewMenu array should be terminated with a NewMenu whose
 * nm_Type equals NM_END.
 */
#define NM_END		0	/* End of NewMenu array */

/* Starting with V39, GadTools will skip any NewMenu entries whose
 * nm_Type field has the NM_IGNORE bit set.
 */
#define NM_IGNORE	64


/* nm_Label should be a text string for textual items, a pointer
 * to an Image structure for graphical menu items, or the special
 * constant NM_BARLABEL, to get a separator bar.
 */
#define NM_BARLABEL	((STRPTR)-1)

/* The nm_Flags field is used to fill out either the Menu->Flags or
 * MenuItem->Flags field.  Note that the sense of the MENUENABLED or
 * ITEMENABLED bit is inverted between this use and Intuition's use,
 * in other words, NewMenus are enabled by default.  The following
 * labels are provided to disable them:
 */
#define NM_MENUDISABLED	MENUENABLED
#define NM_ITEMDISABLED	ITEMENABLED

/* New for V39:  NM_COMMANDSTRING.  For a textual MenuItem or SubItem,
 * point nm_CommKey at an arbitrary string, and set the NM_COMMANDSTRING
 * flag.
 */
#define NM_COMMANDSTRING COMMSEQ

/* The following are pre-cleared (COMMSEQ, ITEMTEXT, and HIGHxxx are set
 * later as appropriate):
 * Under V39, the COMMSEQ flag bit is not cleared, since it now has
 * meaning.
 */
#define NM_FLAGMASK	(~(COMMSEQ | ITEMTEXT | HIGHFLAGS))
#define NM_FLAGMASK_V39	(~(ITEMTEXT | HIGHFLAGS))

/* You may choose among CHECKIT, MENUTOGGLE, and CHECKED.
 * Toggle-select menuitems are of type CHECKIT|MENUTOGGLE, along
 * with CHECKED if currently selected.  Mutually exclusive ones
 * are of type CHECKIT, and possibly CHECKED too.  The nm_MutualExclude
 * is a bit-wise representation of the items excluded by this one,
 * so in the simplest case (choose 1 among n), these flags would be
 * ~1, ~2, ~4, ~8, ~16, etc.  See the Intuition Menus chapter.
 */

/* A UserData pointer can be associated with each Menu and MenuItem structure.
 * The CreateMenus() call allocates space for a UserData after each
 * Menu or MenuItem (header, item or sub-item).  You should use the
 * GTMENU_USERDATA() or GTMENUITEM_USERDATA() macro to extract it.
 */

#define GTMENU_USERDATA(menu) (* ( (APTR *)(((struct Menu *)menu)+1) ) )
#define GTMENUITEM_USERDATA(menuitem) (* ( (APTR *)(((struct MenuItem *)menuitem)+1) ) )

/* Here is an old one for compatibility.  Do not use in new code! */
#define MENU_USERDATA(menuitem) (* ( (APTR *)(menuitem+1) ) )

/* These return codes can be obtained through the GTMN_SecondaryError tag */
#define GTMENU_TRIMMED	0x00000001	/* Too many menus, items, or subitems,
					 * menu has been trimmed down
					 */
#define GTMENU_INVALID	0x00000002	/* Invalid NewMenu array */
#define GTMENU_NOMEM	0x00000003	/* Out of memory */

/*------------------------------------------------------------------------*/

/* Starting with V39, checkboxes and mx gadgets can be scaled to your
 * specified gadget width/height.  Use the new GTCB_Scaled or GTMX_Scaled
 * tags, respectively.  Under V37, and by default in V39, the imagery
 * is of the following fixed size:
 */

/* MX gadget default dimensions: */
#define MX_WIDTH	17
#define MX_HEIGHT	9

/* Checkbox default dimensions: */
#define CHECKBOX_WIDTH	26
#define CHECKBOX_HEIGHT	11

/*------------------------------------------------------------------------*/

/* Tags for GadTools functions: */

#define GT_TagBase	     TAG_USER + 0x80000

#define GTVI_NewWindow	     GT_TagBase+1  /* Unused */
#define GTVI_NWTags	     GT_TagBase+2  /* Unused */

#define GT_Private0	     GT_TagBase+3  /* (private) */

#define GTCB_Checked	     GT_TagBase+4  /* State of checkbox */

#define GTLV_Top	     GT_TagBase+5  /* Top visible one in listview */
#define GTLV_Labels	     GT_TagBase+6  /* List to display in listview */
#define GTLV_ReadOnly	     GT_TagBase+7  /* TRUE if listview is to be
					    * read-only
					    */
#define GTLV_ScrollWidth     GT_TagBase+8  /* Width of scrollbar */

#define GTMX_Labels	     GT_TagBase+9  /* NULL-terminated array of labels */
#define GTMX_Active	     GT_TagBase+10 /* Active one in mx gadget */

#define GTTX_Text	     GT_TagBase+11 /* Text to display */
#define GTTX_CopyText	     GT_TagBase+12 /* Copy text label instead of
					    * referencing it
					    */

#define GTNM_Number	     GT_TagBase+13 /* Number to display */

#define GTCY_Labels	     GT_TagBase+14 /* NULL-terminated array of labels */
#define GTCY_Active	     GT_TagBase+15 /* The active one in the cycle gad */

#define GTPA_Depth	     GT_TagBase+16 /* Number of bitplanes in palette */
#define GTPA_Color	     GT_TagBase+17 /* Palette color */
#define GTPA_ColorOffset     GT_TagBase+18 /* First color to use in palette */
#define GTPA_IndicatorWidth  GT_TagBase+19 /* Width of current-color indicator */
#define GTPA_IndicatorHeight GT_TagBase+20 /* Height of current-color indicator */

#define GTSC_Top	     GT_TagBase+21 /* Top visible in scroller */
#define GTSC_Total	     GT_TagBase+22 /* Total in scroller area */
#define GTSC_Visible	     GT_TagBase+23 /* Number visible in scroller */
#define GTSC_Overlap	     GT_TagBase+24 /* Unused */

/*  GT_TagBase+25 through GT_TagBase+37 are reserved */

#define GTSL_Min	     GT_TagBase+38 /* Slider min value */
#define GTSL_Max	     GT_TagBase+39 /* Slider max value */
#define GTSL_Level	     GT_TagBase+40 /* Slider level */
#define GTSL_MaxLevelLen     GT_TagBase+41 /* Max length of printed level */
#define GTSL_LevelFormat     GT_TagBase+42 /* Format string for level */
#define GTSL_LevelPlace      GT_TagBase+43 /* Where level should be placed */
#define GTSL_DispFunc	     GT_TagBase+44 /* Callback for number calculation
					    * before display
					    */

#define GTST_String	     GT_TagBase+45 /* String gadget's displayed string */
#define GTST_MaxChars	     GT_TagBase+46 /* Max length of string */

#define GTIN_Number	     GT_TagBase+47 /* Number in integer gadget */
#define GTIN_MaxChars	     GT_TagBase+48 /* Max number of digits */

#define GTMN_TextAttr	     GT_TagBase+49 /* MenuItem font TextAttr */
#define GTMN_FrontPen	     GT_TagBase+50 /* MenuItem text pen color */

#define GTBB_Recessed	     GT_TagBase+51 /* Make BevelBox recessed */

#define GT_VisualInfo	     GT_TagBase+52 /* result of VisualInfo call */

#define GTLV_ShowSelected    GT_TagBase+53 /* show selected entry beneath
		* listview, set tag data = NULL for display-only, or pointer
		* to a string gadget you've created
		*/
#define GTLV_Selected	     GT_TagBase+54 /* Set ordinal number of selected
					    * entry in the list
					    */
#define GT_Reserved1	     GT_TagBase+56 /* Reserved for future use */

#define GTTX_Border	     GT_TagBase+57 /* Put a border around
					    * Text-display gadgets
					    */
#define GTNM_Border	     GT_TagBase+58 /* Put a border around
					    * Number-display gadgets
					    */

#define GTSC_Arrows	     GT_TagBase+59 /* Specify size of arrows for
					    * scroller
					    */

#define GTMN_Menu	     GT_TagBase+60 /* Pointer to Menu for use by
					    * LayoutMenuItems()
					    */
#define GTMX_Spacing	     GT_TagBase+61 /* Added to font height to
		* figure spacing between mx choices.  Use this instead
		* of LAYOUTA_SPACING for mx gadgets.
		*/

/* New to V37 GadTools.  Ignored by GadTools V36 */
#define GTMN_FullMenu	     GT_TagBase+62 /* Asks CreateMenus() to
		* validate that this is a complete menu structure
		*/
#define GTMN_SecondaryError  GT_TagBase+63 /* ti_Data is a pointer
		* to a ULONG to receive error reports from CreateMenus()
		*/
#define GT_Underscore	     GT_TagBase+64 /* ti_Data points to the symbol
		* that preceeds the character you'd like to underline in a
		* gadget label
		*/
#define GTST_EditHook	     GT_TagBase+55 /* String EditHook */
#define GTIN_EditHook	     GTST_EditHook /* Same thing, different name,
		* just to round out INTEGER_KIND gadgets
		*/

/* New to V39 GadTools.  Ignored by GadTools V36 and V37 */
#define GTMN_Checkmark	     GT_TagBase+65 /* ti_Data is checkmark img to use */
#define GTMN_AmigaKey	     GT_TagBase+66 /* ti_Data is Amiga-key img to use */
#define GTMN_NewLookMenus    GT_TagBase+67 /* ti_Data is boolean */

/* New to V39 GadTools.  Ignored by GadTools V36 and V37.
 * Set to TRUE if you want the checkbox or mx image scaled to
 * the gadget width/height you specify.  Defaults to FALSE,
 * for compatibility.
 */
#define GTCB_Scaled	     GT_TagBase+68 /* ti_Data is boolean */
#define GTMX_Scaled	     GT_TagBase+69 /* ti_Data is boolean */

#define GTPA_NumColors       GT_TagBase+70 /* Number of colors in palette */

#define GTMX_TitlePlace      GT_TagBase+71 /* Where to put the title */

#define GTTX_FrontPen        GT_TagBase+72 /* Text color in TEXT_KIND gad */
#define GTTX_BackPen         GT_TagBase+73 /* Bgrnd color in TEXT_KIND gad */
#define GTTX_Justification   GT_TagBase+74 /* See GTJ_#? constants */

#define GTNM_FrontPen        GT_TagBase+72 /* Text color in NUMBER_KIND gad */
#define GTNM_BackPen         GT_TagBase+73 /* Bgrnd color in NUMBER_KIND gad */
#define GTNM_Justification   GT_TagBase+74 /* See GTJ_#? constants */
#define GTNM_Format          GT_TagBase+75 /* Formatting string for number */
#define GTNM_MaxNumberLen    GT_TagBase+76 /* Maximum length of number */

#define GTBB_FrameType       GT_TagBase+77 /* defines what kind of boxes
                                            * DrawBevelBox() renders. See
                                            * the BBFT_#? constants for
                                            * possible values
                                            */

#define GTLV_MakeVisible     GT_TagBase+78 /* Make this item visible */
#define GTLV_ItemHeight      GT_TagBase+79 /* Height of an individual item */

#define GTSL_MaxPixelLen     GT_TagBase+80 /* Max pixel size of level display */
#define GTSL_Justification   GT_TagBase+81 /* how should the level be displayed */

#define GTPA_ColorTable      GT_TagBase+82 /* colors to use in palette */

#define GTLV_CallBack        GT_TagBase+83 /* general-purpose listview call back */
#define GTLV_MaxPen          GT_TagBase+84 /* maximum pen number used by call back */

#define GTTX_Clipped         GT_TagBase+85 /* make a TEXT_KIND clip text */
#define GTNM_Clipped         GT_TagBase+85 /* make a NUMBER_KIND clip text */

/* Old definition, now obsolete: */
#define GT_Reserved0	     GTST_EditHook

/*------------------------------------------------------------------------*/

/* Justification types for GTTX_Justification and GTNM_Justification tags */
#define GTJ_LEFT   0
#define GTJ_RIGHT  1
#define GTJ_CENTER 2

/*------------------------------------------------------------------------*/

/* Bevel box frame types for GTBB_FrameType tag */
#define BBFT_BUTTON	 1  /* Standard button gadget box */
#define BBFT_RIDGE	 2  /* Standard string gadget box */
#define BBFT_ICONDROPBOX 3  /* Standard icon drop box     */

/*------------------------------------------------------------------------*/

/* Typical suggested spacing between "elements": */
#define INTERWIDTH	8
#define INTERHEIGHT	4

/*------------------------------------------------------------------------*/

/* "NWay" is an old synonym for cycle gadgets */
#define NWAY_KIND	CYCLE_KIND
#define NWAYIDCMP	CYCLEIDCMP
#define GTNW_Labels	GTCY_Labels
#define GTNW_Active	GTCY_Active

/*------------------------------------------------------------------------*/

/* These two definitions are obsolete, but are here for backwards
 * compatibility.  You never need to worry about these:
 */
#define GADTOOLBIT	(0x8000)
/* Use this mask to isolate the user part: */
#define GADTOOLMASK	(~GADTOOLBIT)

/*------------------------------------------------------------------------*/

/* These definitions are for the GTLV_CallBack tag */

/* The different types of messages that a listview callback hook can see */
#define LV_DRAW       0x202L	/* draw yourself, with state */

/* Possible return values from a callback hook */
#define LVCB_OK       0	        /* callback understands this message type    */
#define LVCB_UNKNOWN  1		/* callback does not understand this message */

/* states for LVDrawMsg.lvdm_State */
#define LVR_NORMAL	      0  	/* the usual                 */
#define LVR_SELECTED	      1 	/* for selected gadgets	     */
#define LVR_NORMALDISABLED    2		/* for disabled gadgets	     */
#define	LVR_SELECTEDDISABLED  8		/* disabled and selected     */

/* structure of LV_DRAW messages, object is a (struct Node *) */
struct LVDrawMsg
{
    ULONG             lvdm_MethodID;   /* LV_DRAW                   */
    struct RastPort  *lvdm_RastPort;   /* where to render to        */
    struct DrawInfo  *lvdm_DrawInfo;   /* useful to have around     */
    struct Rectangle  lvdm_Bounds;     /* limits of where to render */
    ULONG             lvdm_State;      /* how to render             */
};

/*------------------------------------------------------------------------*/

#endif /* LIBRARIES_GADTOOLS_H */
