
#ifndef _GENGUI_LNK_H
#define _GENGUI_LNK_H

#ifdef __cplusplus
extern "C" {
#endif

#include <exec/types.h>
#include <libraries/gadtools.h>
#include <proto/gadtools.h>
#include <intuition/gadgetclass.h>

#define GG_VBOX -1
#define GG_HBOX -2
#define GG_CUSTOM_KIND -3
#define GG_PLAINTEXT_KIND -4
#define GG_GFXBUTTON_KIND -5

#define GG_MODE_NEW     0
#define GG_MODE_RESIZE  1
#define GG_MODE_REFRESH 2
#define GG_MODE_STOP    3
#define GG_MODE_FREE    4
#define GG_MODE_BACKUP  5
#define GG_MODE_RESTORE 6

#define GG_FLAG_CUSTOM              1
#define GG_FLAG_STRING              2
#define GG_FLAG_INTEGER             4
#define GG_FLAG_DISABLED            8
#define GG_FLAG_RAISED             16
#define GG_FLAG_RECESSED           32
#define GG_FLAG_BAR                64
#define GG_FLAG_DEFAULT_HEIGHT (1<<11)
#define GG_FLAG_DEFAULT_WIDTH  (1<<12)
#define GG_FLAG_BACKUP         (1<<13)
#define GG_FLAG_SKIPREFRESH    (1<<14)
#define GG_FLAG_INITED         (1<<15)

#define GG_Left            0
#define GG_Top             0
#define GG_Right       (1<<0)
#define GG_Bottom      (1<<1)
#define GG_HCentered   (1<<2)
#define GG_VCentered   (1<<3)
#define GG_FullSize    (1<<4)
#define GG_NoHighlight (1<<5)

#define GG_FLAG_TRADEMASK (GG_FLAG_CUSTOM|GG_FLAG_STRING|GG_FLAG_INTEGER)

#define GetString(g)   (((struct StringInfo * )g->SpecialInfo)->Buffer)
#define GetNumber(g)   (((struct StringInfo * )g->SpecialInfo)->LongInt)
#define GetInfo(g)     ((struct GadInfo *)((g)->UserData))
#define GetUserData(g) (GetInfo(g)->UserData)
#define GetGadget(msg) ((struct Gadget *)msg->IAddress)

struct GadDim {
   int Kind;
   USHORT Rx,Ry,Cx,Cy,Px,Py;
   USHORT MinCx,MinCy,MinPx,MinPy;
   USHORT SRx,SRy,SPx,SPy; /* Fields for sums of Rx,Ry .... */
   USHORT XSpace,YSpace;
   USHORT Flags;
};

struct Box {
   struct GadDim Dim;
   struct Hook *Backfill;
   struct Box **Entry;
};

struct WinInfo {
   struct Box *Box;
   struct Gadget **Gadgets;
   struct Gadget *Prev;
   struct Window *Window;
   struct Gadget *GList;
   int FontX,FontY;
   struct TextAttr TextAttr;
   APTR Visual;
   char Mode,Render;
};

struct GadInfo {
   struct GadDim Dim;
   int GadNum;

   int __stdargs (*CustomFunc)(struct WinInfo *WInfo,
                     struct NewGadget *NewGad,
                     struct GadInfo *GadInfo,
                     int Left, int Top, int Width, int Height);

   struct TextAttr *TextAttr;
   char *Text;
   int GadgetID;
   ULONG Flags,UserData;
   int __stdargs (*HookFunc)(struct IntuiMessage *);
   ULONG *Tags;
   ULONG *SaveTags;
   ULONG Code;
   struct Gadget *ThisGad;
};

struct GG_ObjectSize {
   int Width,Height;
};

void GG_GfxPrintSize(struct RastPort *rast,char *text,struct GG_ObjectSize *size);
void GG_GfxPrint(struct RastPort *rast,char *text,int left,int top);
int  GG_RenderGui(struct Window *win, struct WinInfo *winfo);
int  GG_SmartRenderGui(struct Window *win, struct WinInfo *winfo,struct TextFont **);
int  GG_ResizeGui(struct WinInfo *winfo);
int  GG_RefreshGui(struct WinInfo *winfo);
void GG_FreeGui(struct WinInfo *winfo);
void GG_StopGui(struct WinInfo *winfo);
int  GG_SubGui(struct WinInfo *, struct WinInfo *,int ,int ,int , int );
void GG_ClearWindow(struct Window *);
struct IntuiMessage *GG_GetIMsg(struct MsgPort *userport);
BOOL GG_SetGadgetAttrs(struct Gadget *,struct Window *,struct Requester *, ULONG ,...);
BOOL GG_SetGadgetAttrsA(struct Gadget *,struct Window *,struct Requester *, ULONG *);
void GG_MinSize(struct Window *, struct WinInfo *,struct GG_ObjectSize *);
void GG_MinSizeFont(struct TextFont *, struct WinInfo *,struct GG_ObjectSize *);
BOOL GG_SetLowlevelAttrsA(struct GadInfo *gad, ULONG *Tag);
BOOL GG_SetLowlevelAttrs(struct GadInfo *gad, ULONG Tag1,...);
void GG_BeginResizeGui(struct WinInfo *winfo);


#define GG_ReplyIMsg(s) GT_ReplyIMsg(s);

#ifdef GG_OLDSTYLE

#define RenderGui             GG_RenderGui
#define ResizeGui             GG_ResizeGui
#define RefreshGui            GG_RefreshGui
#define FreeGui               GG_FreeGui
#define StopGui               GG_StopGui
#define SubGui                GG_SubGui
#define ClearWindow           GG_ClearWindow
#define Gui_SetGadgetAttrs    GG_SetGadgetAttrs
#define Gui_SetGadgetAttrsA   GG_SetGadgetAttrsA

static struct IntuiMessage *Gui_GetIMsg(struct MsgPort *port,struct IntuiMessage *msg)
{
   struct IntuiMessage *m;

   if(m=GG_GetIMsg(port)) {
      *msg=*m;
      GG_ReplyIMsg(m);
      return msg;
   }

   return NULL;
}

#define MODE_NEW       GG_MODE_NEW
#define MODE_RESIZE    GG_MODE_RESIZE
#define MODE_REFRESH   GG_MODE_REFRESH
#define MODE_STOP      GG_MODE_STOP
#define MODE_FREE      GG_MODE_FREE
#define MODE_BACKUP    GG_MODE_BACKUP
#define MODE_RESTORE   GG_MODE_RESTORE

#define BOXFLG_CUSTOM         GG_FLAG_CUSTOM
#define BOXFLG_STRING         GG_FLAG_STRING
#define BOXFLG_INTEGER        GG_FLAG_INTEGER
#define BOXFLG_DISABLED       GG_FLAG_DISABLED
#define BOXFLG_RAISED         GG_FLAG_RAISED
#define BOXFLG_RECESSED       GG_FLAG_RECESSED
#define BOXFLG_BAR            GG_FLAG_BAR
#define BOXFLG_BACKUP         GG_FLAG_BACKUP
#define BOXFLG_INITED         GG_FLAG_INITED
#define BOXFLG_SKIPREFRESH    GG_FLAG_SKIPREFRESH
#define BOXFLG_DEFAULT_WIDTH  GG_FLAG_DEFAULT_WIDTH
#define BOXFLG_DEFAULT_HEIGHT GG_FLAG_DEFAULT_HEIGHT
#define BOXFLG_TRADEMASK      GG_FLAG_TRADEMASK

#define GL_VBOX            GG_GL_VBOX
#define GL_HBOX            GG_GL_HBOX
#define CUSTOM_KIND        GG_CUSTOM_KIND
#define PLAINTEXT_KIND     GG_PLAINTEXT_KIND
#define GFXBUTTON_KIND     GG_GFXBUTTON_KIND

#endif



#ifdef __cplusplus
}
#endif
#endif

