#ifndef INTUITION_GADGETCLASS_H
#define INTUITION_GADGETCLASS_H

/*
    (C) 1995-96 AROS - The Amiga Replacement OS
    $Id: gadgetclass.h,v 1.3 1996/11/19 11:02:08 aros Exp $

    Desc: Headerfile for Intuitions' GadgetClass and ButtonGClass
    Lang: english
*/
#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

/* GadgetClass attributes */
#define GA_Dummy	    (TAG_USER + 0x30000)
#define GA_Left 	    (GA_Dummy +  1) /* (LONG) Left edge */
#define GA_RelRight	    (GA_Dummy +  2) /* (LONG) Left=Win->Width-this-1 */
#define GA_Top		    (GA_Dummy +  3) /* (LONG) Top edge */
#define GA_RelBottom	    (GA_Dummy +  4) /* (LONG) Top=Win->Height-this-1 */
#define GA_Width	    (GA_Dummy +  5) /* (LONG) Width */
#define GA_RelWidth	    (GA_Dummy +  6) /* (LONG) Width=Win->Width-this */
#define GA_Height	    (GA_Dummy +  7) /* (LONG) Height */
#define GA_RelHeight	    (GA_Dummy +  8)
#define GA_Text 	    (GA_Dummy +  9) /* (UBYTE *) */
#define GA_Image	    (GA_Dummy + 10)
#define GA_Border	    (GA_Dummy + 11)
#define GA_SelectRender     (GA_Dummy + 12)
#define GA_Highlight	    (GA_Dummy + 13)
#define GA_Disabled	    (GA_Dummy + 14)
#define GA_GZZGadget	    (GA_Dummy + 15)
#define GA_ID		    (GA_Dummy + 16)
#define GA_UserData	    (GA_Dummy + 17)
#define GA_SpecialInfo	    (GA_Dummy + 18)
#define GA_Selected	    (GA_Dummy + 19)
#define GA_EndGadget	    (GA_Dummy + 20)
#define GA_Immediate	    (GA_Dummy + 21)
#define GA_RelVerify	    (GA_Dummy + 22)
#define GA_FollowMouse	    (GA_Dummy + 23)
#define GA_RightBorder	    (GA_Dummy + 24)
#define GA_LeftBorder	    (GA_Dummy + 25)
#define GA_TopBorder	    (GA_Dummy + 26)
#define GA_BottomBorder     (GA_Dummy + 27)
#define GA_ToggleSelect     (GA_Dummy + 28)
#define GA_SysGadget	    (GA_Dummy + 29) /* internal */
#define GA_SysGType	    (GA_Dummy + 30) /* internal */
#define GA_Previous	    (GA_Dummy + 31) /* Previous Gadget [I.G] */
#define GA_Next 	    (GA_Dummy + 32)
#define GA_DrawInfo	    (GA_Dummy + 33) /* Some Gadgets need this */

/* You should use at most ONE of GA_Text, GA_IntuiText, and GA_LabelImage */
#define GA_IntuiText	    (GA_Dummy + 34) /* ti_Data is (struct IntuiText *) */
#define GA_LabelImage	    (GA_Dummy + 35) /* ti_Data is an image (object) */

#define GA_TabCycle	    (GA_Dummy + 36) /* BOOL: Handle Tab/Shift-Tab */
#define GA_GadgetHelp	    (GA_Dummy + 37) /* Send GADGETHELP message */
#define GA_Bounds	    (GA_Dummy + 38) /* struct IBox * */
#define GA_RelSpecial	    (GA_Dummy + 39) /* Special handling in GM_LAYOUT */
#define GA_TextAttr	    (GA_Dummy + 40) /* (struct TextAttr *) */
#define GA_ReadOnly	    (GA_Dummy + 41) /* (BOOL) */


/* PROPGCLASS attributes */
#define PGA_Dummy	    (TAG_USER + 0x31000)
#define PGA_Freedom	    (PGA_Dummy +  1) /* only one of FREEVERT or FREEHORIZ */
#define PGA_Borderless	    (PGA_Dummy +  2)
#define PGA_HorizPot	    (PGA_Dummy +  3)
#define PGA_HorizBody	    (PGA_Dummy +  4)
#define PGA_VertPot	    (PGA_Dummy +  5)
#define PGA_VertBody	    (PGA_Dummy +  6)
#define PGA_Total	    (PGA_Dummy +  7)
#define PGA_Visible	    (PGA_Dummy +  8)
#define PGA_Top 	    (PGA_Dummy +  9)
#define PGA_NewLook	    (PGA_Dummy + 10)

/* STRGCLASS attributes */
#define STRINGA_Dummy	    (TAG_USER      +0x32000)
#define STRINGA_MaxChars    (STRINGA_Dummy +  1)
#define STRINGA_Buffer	    (STRINGA_Dummy +  2)
#define STRINGA_UndoBuffer  (STRINGA_Dummy +  3)
#define STRINGA_WorkBuffer  (STRINGA_Dummy +  4)
#define STRINGA_BufferPos   (STRINGA_Dummy +  5)
#define STRINGA_DispPos     (STRINGA_Dummy +  6)
#define STRINGA_AltKeyMap   (STRINGA_Dummy +  7)
#define STRINGA_Font	    (STRINGA_Dummy +  8)
#define STRINGA_Pens	    (STRINGA_Dummy +  9)
#define STRINGA_ActivePens  (STRINGA_Dummy + 10)
#define STRINGA_EditHook    (STRINGA_Dummy + 11)
#define STRINGA_EditModes   (STRINGA_Dummy + 12)

/* booleans */
#define STRINGA_ReplaceMode	(STRINGA_Dummy + 13)
#define STRINGA_FixedFieldMode	(STRINGA_Dummy + 14)
#define STRINGA_NoFilterMode	(STRINGA_Dummy + 15)
#define STRINGA_Justification	(STRINGA_Dummy + 16) /* GACT_STRINGCENTER,
							GACT_STRINGLEFT,
							GACT_STRINGRIGHT */
#define STRINGA_LongVal 	(STRINGA_Dummy + 17)
#define STRINGA_TextVal 	(STRINGA_Dummy + 18)
#define STRINGA_ExitHelp	(STRINGA_Dummy + 19) /* Exit on "Help" */

#define SG_DEFAULTMAXCHARS	(128)

/* Gadget Layout related attributes	*/
#define LAYOUTA_Dummy		(TAG_USER  + 0x38000)
#define LAYOUTA_LayoutObj	(LAYOUTA_Dummy + 1)
#define LAYOUTA_Spacing 	(LAYOUTA_Dummy + 2)
#define LAYOUTA_Orientation	(LAYOUTA_Dummy + 3)
#define LAYOUTA_ChildMaxWidth	(LAYOUTA_Dummy + 4)
#define LAYOUTA_ChildMaxHeight	(LAYOUTA_Dummy + 5)

/* orientation values	*/
#define LORIENT_NONE	0
#define LORIENT_HORIZ	1
#define LORIENT_VERT	2


/* Gadget Method ID's   */
#define GM_HITTEST	(0)     /* return GMR_GADGETHIT if you are hit
				   (works in disabled state, too). */
#define GM_RENDER	(1)     /* draw yourself in the right state */
#define GM_GOACTIVE	(2)     /* You will receive input */
#define GM_HANDLEINPUT	(3)     /* handle input */
#define GM_GOINACTIVE	(4)     /* no more input */
#define GM_HELPTEST	(5)     /* Will you send gadget help if the mouse is
				   at the specified coordinates?  See below
				   for possible GMR_ values. */
#define GM_LAYOUT	(6)     /* re-evaluate your size based on the GadgetInfo
				   Domain. Do NOT re-render yourself yet, you
				   will be called when it is time... */
#define GM_DOMAIN	(7)     /* Query the sizing requirements */

/* Parameter "Messages" passed to gadget class methods  */

/* GM_HITTEST and GM_HELPTEST send this message.
 * For GM_HITTEST, gpht_Mouse are coordinates relative to the gadget
 * select box.	For GM_HELPTEST, the coordinates are relative to
 * the gadget bounding box (which defaults to the select box).
 */
struct gpHitTest
{
    STACKULONG		MethodID;
    struct GadgetInfo  *gpht_GInfo;
    struct
    {
	STACKWORD X;
	STACKWORD Y;
    }			gpht_Mouse;
};

/* For GM_HITTEST, return GMR_GADGETHIT if you were indeed hit,
 * otherwise return zero.
 *
 * For GM_HELPTEST, return GMR_NOHELPHIT (zero) if you were not hit.
 * Typically, return GMR_HELPHIT if you were hit.
 * It is possible to pass a UWORD to the application via the Code field
 * of the IDCMP_GADGETHELP message.  Return GMR_HELPCODE or'd with
 * the UWORD-sized result you wish to return.
 *
 * GMR_HELPHIT yields a Code value of ((UWORD) ~0), which should
 * mean "nothing particular" to the application.
 */

#define GMR_GADGETHIT	(0x00000004)    /* GM_HITTEST hit */

#define GMR_NOHELPHIT	(0x00000000)    /* GM_HELPTEST didn't hit */
#define GMR_HELPHIT	(0xFFFFFFFF)    /* GM_HELPTEST hit, return code = ~0 */
#define GMR_HELPCODE	(0x00010000)    /* GM_HELPTEST hit, return low word as code */

/* GM_RENDER	*/
struct gpRender
{
    STACKULONG		MethodID;
    struct GadgetInfo  *gpr_GInfo;	/* gadget context		*/
    struct RastPort    *gpr_RPort;	/* all ready for use		*/
    STACKLONG		gpr_Redraw;	/* might be a "highlight pass"  */
};

/* values of gpr_Redraw */
#define GREDRAW_UPDATE	(2)     /* incremental update, e.g. prop slider */
#define GREDRAW_REDRAW	(1)     /* redraw gadget        */
#define GREDRAW_TOGGLE	(0)     /* toggle highlight, if applicable      */

/* GM_GOACTIVE, GM_HANDLEINPUT	*/
struct gpInput
{
    STACKULONG		MethodID;
    struct GadgetInfo  *gpi_GInfo;
    struct InputEvent  *gpi_IEvent;
    STACKLONG	       *gpi_Termination;
    struct
    {
	STACKWORD X;
	STACKWORD Y;
    }			gpi_Mouse;

    /* (V39) Pointer to TabletData structure, if this event originated
     * from a tablet which sends IESUBCLASS_NEWTABLET events, or NULL if
     * not.
     *
     * DO NOT ATTEMPT TO READ THIS FIELD UNDER INTUITION PRIOR TO V39!
     * IT WILL BE INVALID!
     */
    struct TabletData  *gpi_TabletData;
};

/* GM_HANDLEINPUT and GM_GOACTIVE  return code flags	*/
/* return GMR_MEACTIVE (0) alone if you want more input.
   Otherwise, return ONE of GMR_NOREUSE and GMR_REUSE, and optionally
   GMR_VERIFY.
*/
#define GMR_MEACTIVE	(0)
#define GMR_NOREUSE	(1 << 1)
#define GMR_REUSE	(1 << 2)
#define GMR_VERIFY	(1 << 3)        /* you MUST set gpi_Termination */

/*
    You can end activation with one of GMR_NEXTACTIVE and GMR_PREVACTIVE,
    which instructs Intuition to activate the next or previous gadget
    that has GFLG_TABCYCLE set.
*/
#define GMR_NEXTACTIVE	(1 << 4)
#define GMR_PREVACTIVE	(1 << 5)

/* GM_GOINACTIVE */
struct gpGoInactive
{
    STACKULONG		MethodID;
    struct GadgetInfo  *gpgi_GInfo;

    /* V37 field only!	DO NOT attempt to read under V36! */
    STACKULONG		gpgi_Abort;	/* gpgi_Abort=1 if gadget was aborted
					 * by Intuition and 0 if gadget went
					 * inactive at its own request
					 */
};


/* New for V39: Intuition sends GM_LAYOUT to any GREL_ gadget when
 * the gadget is added to the window (or when the window opens, if
 * the gadget was part of the NewWindow.FirstGadget or the WA_Gadgets
 * list), or when the window is resized.  Your gadget can set the
 * GA_RelSpecial property to get GM_LAYOUT events without Intuition
 * changing the interpretation of your gadget select box.  This
 * allows for completely arbitrary resizing/repositioning based on
 * window size.
 */
/* GM_LAYOUT */
struct gpLayout
{
    STACKULONG		MethodID;
    struct GadgetInfo  *gpl_GInfo;
    STACKULONG		gpl_Initial;	/* non-zero if this method was invoked
					 * during AddGList() or OpenWindow()
					 * time.  zero if this method was invoked
					 * during window resizing.
					 */
};


/*
    The GM_DOMAIN method is used to obtain the sizing requirements of an
    object for a class before ever creating an object.
*/
/* GM_DOMAIN */
struct gpDomain
{
    STACKULONG		 MethodID;
    struct GadgetInfo	*gpd_GInfo;
    struct RastPort	*gpd_RPort;	/* RastPort to layout for */
    STACKLONG		 gpd_Which;
    struct IBox 	 gpd_Domain;	/* Resulting domain */
    struct TagItem	*gpd_Attrs;	/* Additional attributes */
};

#define GDOMAIN_MINIMUM 	(0) /* Minimum size */
#define GDOMAIN_NOMINAL 	(1) /* Nominal size */
#define GDOMAIN_MAXIMUM 	(2) /* Maximum size */

#endif /* INTUITION_GADGETCLASS_H */
