#ifndef LIBRARIES_GADTOOLS_H
#define LIBRARIES_GADTOOLS_H 1
/*
** gadtools.h for ACE Basic
**
** Note: Translated to ACE by ConvertC2ACE
**       @ MapMeadow Software, Nils Sjoholm
**
**
** Date: 09/01/95
**
**
*/

/*
** This are the StructPointer defines for gadtools.h
*/
#ifndef LVDrawMsgPtr
#define LVDrawMsgPtr ADDRESS
#endif
#ifndef NewGadgetPtr
#define NewGadgetPtr ADDRESS
#endif
#ifndef NewMenuPtr
#define NewMenuPtr ADDRESS
#endif
/*
** End of StructPointer defines for gadtools.h
*/


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

#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 OR IDCMP_GADGETDOWN OR \
    IDCMP_INTUITICKS OR IDCMP_MOUSEBUTTONS)

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

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

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

#define TEXTIDCMP   (0&)

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

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

STRUCT NewGadget
 
    SHORTINT ng_LeftEdge 
    SHORTINT   ng_TopEdge    /* gadget position */
    SHORTINT ng_Width 
    SHORTINT   ng_Height        /* gadget size */
    ADDRESS   ng_GadgetText        /* gadget label */
    TextAttrPtr  ng_TextAttr    /* desired font for gadget label */
    SHORTINT ng_GadgetID           /* gadget ID */
    LONGINT ng_Flags          /* see below */
    ADDRESS ng_VisualInfo          /* Set to retval of GetVisualInfo() */
    ADDRESS ng_UserData            /* gadget UserData */
END STRUCT 


/* 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  &H0001  /* Right-align text on left side */
#define PLACETEXT_RIGHT &H0002  /* Left-align text on right side */
#define PLACETEXT_ABOVE &H0004  /* Center text above */
#define PLACETEXT_BELOW &H0008  /* Center text below */
#define PLACETEXT_IN    &H0010  /* Center text on */

#define NG_HIGHLABEL    &H0020  /* Highlight the label */


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

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

STRUCT NewMenu
 
    BYTE  nm_Type       /* See below */

    /* C Compilers insert a PAD byte here, but ACE doesn't. So, we add one for ACE. */
    BYTE nm_PadByte0

    ADDRESS nm_Label         /* Menu's label */
    ADDRESS nm_CommKey       /* MenuItem Command Key Equiv */
    SHORTINT nm_Flags      /* Menu or MenuItem flags (see note) */
    LONGINT nm_MutualExclude   /* MenuItem MutualExclude SHORTINT */
    ADDRESS nm_UserData        /* For your own use,  see note */
END STRUCT 

/* 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 ((ADDRESS)-1)*/
#define NM_BARLABEL -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 (NOT(COMMSEQ OR ITEMTEXT OR HIGHFLAGS))
#define NM_FLAGMASK_V39 (NOT(ITEMTEXT OR 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_INVALID  &H00000002  /* Invalid NewMenu array */
#define GTMENU_NOMEM    &H00000003  /* 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 + &H80000

#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 LONGINT 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  (&H8000)
/* Use this mask to isolate the user part: */
#define GADTOOLMASK (NOT GADTOOLBIT)

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

/* These definitions are for the GTLV_CallBack tag */

/* The different types of messages that a listview callback hook can see */
#define LV_DRAW       &H202&    /* 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
 
    LONGINT         lvdm_MethodID    /* LV_DRAW           */
    RastPortPtr  lvdm_RastPort    /* where to render to        */
    DrawInfoPtr  lvdm_DrawInfo    /* useful to have around     */
    Rectangle lvdm_Bounds      /* limits of where to render */
    LONGINT         lvdm_State       /* how to render     */
END STRUCT 

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



#endif /* LIBRARIES_GADTOOLS_H */
