#ifndef INTUITION_INTUITION_H
#define INTUITION_INTUITION_H

#ifndef TYPES_H
#include <types.h>
#endif

#ifndef GRAPHICS_RASTPORT_H
#include <graphics/rastport.h>
#endif

#ifndef EXEC_PORTS_H
#include <exec/ports.h>
#endif

struct MenuItem
   {struct MenuItem *NextItem;
    SHORT  LeftEdge,TopEdge;
    SHORT  Width,Height;
    USHORT Flags;
    LONG   MutualExclude;
    APTR   ItemFill;
    APTR   SelectFill;
    BYTE   Command;
    struct MenuItem *Subitem;
    USHORT NextSelect;
    };

#define CHECKIT		0x0001
#define ITEMTEXT	0x0002
#define COMMSEQ 	0x0004
#define MENUTOGGLE	0x0008
#define ITEMENABLED	0x0010
#define HIGHFLAGS	0x0020
#define HIGHCOMP	0x0040
#define HIGHBOX 	0x0080
#define HIGHNONE	0x00C0
#define CHECKED 	0x0100
#define ISDRAWN 	0x1000
#define HIGHITEM	0x2000
#define MENUTOGGLED	0x4000

struct Menu
   {struct Menu *NextMenu;
    SHORT  LeftEdge,TopEdge;
    SHORT  Width,Height;
    USHORT Flags;
    char   *MenuName;
    struct MenuItem *FirtsItem;
    SHORT  JazzX,JazzY,BeatX,BeatY;
    };

#define MENUENABLED 0x0001
#define MIDRAWN     0x0100

struct IntuiText
   {UBYTE  FrontPen,BackPen;
    UBYTE  DrawMode;
    SHORT  LeftEdge,TopEdge;
    struct TextAttr *ITextFont;
    char   *IText;
    struct IntuiText *NextText;
    };

#define GADGHIBITS	0X0003
#define GADGHCOMP	0X0000
#define GADGHBOX	0X0001
#define GADGHIMAGE	0X0002
#define GADGHNONE	0X0003

struct Gadget
   {struct Gadget *NextGadget;
    SHORT  LeftEdge,TopEdge;
    SHORT  Width,Height;
    USHORT Flags;
    USHORT Activation;
    USHORT GadgetType;
    APTR   GadgetRender;
    APTR   SelectRender;
    struct IntuiText *GadgetText;
    LONG   MutualExclude;
    APTR   SpecialInfo;
    USHORT GadgetID;
    APTR   UserData;
    };

#define RELVERIFY	0X0001
#define GADGIMMEDIATE	0X0002
#define ENDGADGET	0x0004

#define LONGINT		0x0800

/* Gadget types */
#define GADGETTYPE	0xfc00
#define SYSGADGET	0x8000
#define SCRGADGET	0x4000
#define GZZGADGET	0x2000
#define REQGADGET	0x1000

#define SIZING		0x0010
#define WDRAGGING	0x0020
#define SDRAGGING	0x0030
#define WUPFRONT	0x0040
#define SUPFRONT	0x0050
#define WDOWNBACK	0x0060
#define SDOWNBACK	0x0070
#define CLOSE		0x0080

#define BOOLGADGET	0X0001
#define GADGET0002	0X0002
#define PROPGADGET	0X0003
#define STRGADGET	0X0004

struct IntuiMessage
   {
    struct Message ExecMessage;
    ULONG  Class;
    USHORT Code;
    USHORT Qualifier;
    APTR   IAddress;
    SHORT  MouseX,MouseY;
    ULONG  Seconds,Micros;
    struct Window *IDCMPWindow;
    struct IntuiMessage *SpecialLink;
    };

#define SIZEVERIFY	0x00000001
#define NEWSIZE		0x00000002
#define REFRESHWINDOW	0x00000004
#define MOUSEBUTTONS	0x00000008
#define MOUSEMOVE	0x00000010
#define GADGETDOWN	0x00000020
#define GADGETUP	0x00000040
#define REQSET  	0x00000080
#define MENUPICK	0x00000100
#define CLOSEWINDOW	0x00000200
#define RAWKEY  	0x00000400
#define REQVERIFY	0x00000800
#define REQCLEAR	0x00001000
#define MENUVERIFY	0x00002000
#define NEWPREFS	0x00004000
#define DISKINSERTED	0x00008000
#define DISKREMOVED	0x00010000
#define WBENCHMESSAGE	0x00020000
#define ACTIVEWINDOW	0x00040000
#define INACTIVEWINDOW	0x00080000
#define DELTAMOVE	0x00100000
#define VANILLAKEY	0x00200000
#define INTUITICKS	0x00400000

struct Window
   {struct Window *NextWindow;
    SHORT  LeftEdge,TopEdge;
    SHORT  Width,Height;
    SHORT  MouseX,MouseY;
    SHORT  MinWidth,MinHeight;
    SHORT  MaxWidth,MaxHeight;
    ULONG  Flags;
    struct Menu *MenuStrip;
    UBYTE  *Title;
    struct Requester *FirstRequest;
    struct Requester *DMRequest;
    SHORT  ReqCount;
    struct Screen *WScreen;
    struct RastPort *RPort;
    BYTE   BorderLeft,BorderTop,BorderRight,BorderBottom;
    struct RastPort *BorderRPort;
    struct Gadget *FirstGadget;
    struct Window *Parent,*Descendant;
    USHORT *Pointer;
    BYTE   PtrHeight,PtrWidth;
    BYTE   XOffset,YOffset;
    ULONG  IDCMPFlags;
    struct MsgPort *UserPort,*WindowPort;
    APTR   _MessageKey;
    UBYTE  DetailPen,BlockPen;
    APTR   _CheckMark;
    UBYTE  *ScreenTitle;
    SHORT  GZZMouseX,GZZMouseY;
    SHORT  GZZWidth,GZZHeight;
    UBYTE  *ExtData;
    BYTE   *UserData;
    APTR   _WLayer;
    APTR   _IFont;
    };

#define WINDOWSIZING	0x0001
#define WINDOWDRAG	0x0002
#define WINDOWDEPTH	0x0004
#define WINDOWCLOSE	0x0008

#define SIZEBRIGHT	0x0010
#define SIZEBBOTTOM	0x0020

#define REFRESHBITS	0x00C0
#define SMART_REFRESH	0x0000
#define SIMPLE_REFRESH	0x0040
#define SUPER_BITMAP	0x0080
#define OTHER_REFRESH	0x00C0

#define BACKDROP	0x0100
#define REPORTMOUSE	0x0200
#define GIMMEZEROZERO	0x0400
#define BORDERLESS	0x0800
#define ACTIVATE	0x1000
#define WINDOWACTIVE	0x2000
#define INREQUEST	0x4000
#define MENUSTATE	0x8000

struct NewWindow
   {SHORT LeftEdge,TopEdge;
    SHORT Width,Height;
    UBYTE DetailPen,BlockPen;
    ULONG IDCMPFlags;
    ULONG Flags;
    struct Gadget *FirstGadget;
    struct Image  *CheckMark;
    char  *Title;
    struct Screen *Screen;
    struct Bitmap *Bitmap;
    SHORT  MinWidth,MinHeight;
    SHORT  MaxWidth,MaxHeight;
    USHORT Type;
    };

struct Border
   {
    SHORT LeftEdge,TopEdge;
    UBYTE FrontPen,BackPen;
    UBYTE DrawMode;
    BYTE  Count;
    SHORT *XY;
    struct Border *NextBorder;
    };

struct Requester
   {
    struct Requester *OlderRequester;
    SHORT  LeftEdge,TopEdge;
    SHORT  Width,Height;
    SHORT  RelLeft,RelTop;
    struct Gadget *ReqGadget;
    struct Border *ReqBorder;
    struct IntuiText *ReqText;
    USHORT Flags;
    UBYTE  BackFill;
    struct Layer *ReqLayer;
    UBYTE  ReqPad1[32];
    struct BitMap *ImageBMap;
    struct Window *RWindow;
    UBYTE  ReqPad2[36];
    };

struct StringInfo
   {
    UBYTE *Buffer;
    UBYTE *UndoBuffer;
    SHORT BufferPos;
    SHORT MaxChars;
    SHORT DispPos;
    SHORT UndoPos;
    SHORT NumChars;
    SHORT DispCount;
    SHORT CLeft,CTop;
    struct Layer *LayerPtr;
    LONG  LongInt;
    struct KeyMap *AltKeyMap;
    };

/* Requester BoolInfo PropInfo StringInfo Image IntuiMessage */
/* not typed in */

#define MENUNUM(n)  (n & 0x1F)
#define ITEMNUM(n)  ((n >> 5) & 0x3F)
#define SUBNUM(n)   ((n >> 11) & 0x1F)

#define NOMENU  0x1f
#define NOITEM  0x3f
#define NOSUB   0x1f
#define MENUNULL 0xffff

#define CHECKWIDTH  19
#define COMMWIDTH   27
#define LOWCHECKWIDTH  13
#define LOWCOMMWIDTH   16

#endif /* INTUITION_INTUITION_H */
