/*
 * Source generated by GenGui V1.0
 * which is (c)1994 by Matthias Meixner
 */

#ifndef _GUI_LAYOUT
#define _GUI_LAYOUT

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

#include <intuition/gadgetclass.h>
#define GL_VBOX -1
#define GL_HBOX -2
#define CUSTOM_KIND -3

#define MODE_NEW     0
#define MODE_RESIZE  1
#define MODE_REFRESH 2
#define MODE_FREE    3
#define MODE_BACKUP  4
#define MODE_RESTORE 5

#define BOXFLG_CUSTOM   1
#define BOXFLG_STRING   2
#define BOXFLG_INTEGER  4
#define BOXFLG_DISABLED 8
#define BOXFLG_BACKUP  16
#define BOXFLG_INITED  (1<<15)

#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)

struct GadDim {
   int Kind;
   USHORT Rx,Ry,Cx,Cy,Px,Py,SRx,SRy,SPx,SPy;
   USHORT Flags;
};

struct Box {
   struct GadDim Dim;
   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;
   USHORT MinX,MinY;
};

struct GadInfo {
   struct GadDim dim;
   int XSpace,YSpace,GadNum;
   int (*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(*HookFunc)(struct IntuiMessage *);
   ULONG *Tags;
   ULONG *SaveTags;
   ULONG Code;
   struct Gadget *ThisGad;
};

int RenderGui(struct Window *win, struct WinInfo *winfo);
int ResizeGui(struct WinInfo *winfo);
int RefreshGui(struct WinInfo *winfo);
void FreeGui(struct WinInfo *winfo);
void StopGui(struct WinInfo *winfo);
int SubGui(struct WinInfo *, struct WinInfo *,int ,int ,int , int );

void ClearWindow(struct Window *);
struct IntuiMessage *Gui_GetIMsg(struct MsgPort *userport,struct IntuiMessage *);

BOOL Gui_SetGadgetAttrs(struct Gadget *,struct Window *,
                        struct Requester *, ULONG ,...);
BOOL Gui_SetGadgetAttrsA(struct Gadget *,struct Window *,
                        struct Requester *, ULONG *);
#endif

#include <proto/graphics.h>
#define RED   1
#define GREEN 2
#define BLUE  3
int PaletteHook(struct IntuiMessage *msg);
int RedHook(struct IntuiMessage *msg);
int GreenHook(struct IntuiMessage *msg);
int BlueHook(struct IntuiMessage *msg);
/* We cannot write this function here, since some values of the GUI are
   not declared/defined yet, but we need the prototype */
int ActiveColor=0;
int Red;
int Green;
int Blue;
struct Gadget *InnerField_Gadgets[4];

#define InnerField_RED 0

ULONG InnerFieldTags3[]={
   PGA_Freedom,LORIENT_VERT ,GTSL_LevelPlace,PLACETEXT_BELOW ,GTSL_LevelFormat,(ULONG)"%2ld" ,GTSL_MaxLevelLen,2 ,TAG_DONE
};

struct GadInfo InnerField3={
   SLIDER_KIND,0,1,2,0,4+INTERWIDTH,0+0,0,0,0,0,0,
   INTERWIDTH,INTERHEIGHT,0,NULL,NULL,
   "",RED,0,0,RedHook ,InnerFieldTags3
};

#define InnerField_GREEN 1

ULONG InnerFieldTags4[]={
   PGA_Freedom,LORIENT_VERT ,GTSL_LevelPlace,PLACETEXT_BELOW ,GTSL_LevelFormat,(ULONG)"%2ld" ,GTSL_MaxLevelLen,2 ,TAG_DONE
};

struct GadInfo InnerField4={
   SLIDER_KIND,0,1,2,0,4+INTERWIDTH,0+0,0,0,0,0,0,
   INTERWIDTH,INTERHEIGHT,1,NULL,NULL,
   "",GREEN,0,0,GreenHook ,InnerFieldTags4
};

#define InnerField_BLUE 2

ULONG InnerFieldTags5[]={
   PGA_Freedom,LORIENT_VERT ,GTSL_LevelPlace,PLACETEXT_BELOW ,GTSL_LevelFormat,(ULONG)"%2ld" ,GTSL_MaxLevelLen,2 ,TAG_DONE
};

struct GadInfo InnerField5={
   SLIDER_KIND,0,1,2,0,4+INTERWIDTH,0+0,0,0,0,0,0,
   INTERWIDTH,INTERHEIGHT,2,NULL,NULL,
   "",BLUE,0,0,BlueHook ,InnerFieldTags5
};

struct Box *InnerFieldV2[]={
   (struct Box *)&InnerField3,
   (struct Box *)&InnerField4,
   (struct Box *)&InnerField5,
   NULL
};

struct Box InnerField2={
   GL_HBOX,1,1,0,0,0+0,0+0,0,0,0,0,0,InnerFieldV2
};

struct Box InnerField6={
   GL_VBOX,1,0,0,1,0+0,4+INTERHEIGHT,0,0,0,0,0,NULL
};

struct Box *InnerFieldV1[]={
   &InnerField2,
   &InnerField6,
   NULL
};

struct Box InnerField1={
   GL_VBOX,0,1,3*2,0,2*INTERWIDTH+3*4+INTERWIDTH,0+0,0,0,0,0,0,InnerFieldV1
};

#define InnerField_0 3

ULONG InnerFieldTags7[]={
   GTPA_Depth,2 ,GTPA_IndicatorWidth,20 ,TAG_DONE
};

struct GadInfo InnerField7={
   PALETTE_KIND,1,1,0,0,0+0,0+0,0,0,0,0,0,
   INTERWIDTH,INTERHEIGHT,3,NULL,NULL,
   "",0,0,0,PaletteHook ,InnerFieldTags7
};

struct Box *InnerFieldV0[]={
   &InnerField1,
   (struct Box *)&InnerField7,
   NULL
};

struct Box InnerField0={
   GL_HBOX,1,1,0,0,0+0,0+0,0,0,0,0,0,InnerFieldV0
};

struct WinInfo InnerField = {
   &InnerField0,InnerField_Gadgets
};

int PaletteHook(struct IntuiMessage *msg)
{
   ULONG rgb;
   if(msg) ActiveColor=msg->Code; // This function is also called from
   rgb=GetRGB4(InnerField.Window->WScreen->ViewPort.ColorMap,ActiveColor);
   Red=rgb>>8;
   rgb&=0xff;
   Green=rgb>>4;
   rgb&=0xf;
   Blue=rgb;
   Gui_SetGadgetAttrs(InnerField_Gadgets[InnerField_RED],InnerField.Window,NULL,
                     GTSL_Level,Red,TAG_DONE);
   Gui_SetGadgetAttrs(InnerField_Gadgets[InnerField_GREEN],InnerField.Window,NULL,
                     GTSL_Level,Green,TAG_DONE);
   Gui_SetGadgetAttrs(InnerField_Gadgets[InnerField_BLUE],InnerField.Window,NULL,
                     GTSL_Level,Blue,TAG_DONE);
   /* IMPORTANT! You must store the values also in the "Code" field of the
      Gadinfo structure, or it would not be vailable for resizing */
#if 0
   GetInfo(InnerField_Gadgets[InnerField_RED])->Code=Red;
   GetInfo(InnerField_Gadgets[InnerField_GREEN])->Code=Green;
   GetInfo(InnerField_Gadgets[InnerField_BLUE])->Code=Blue;
#endif
   return(1);
}
int RedHook(struct IntuiMessage *msg)
{
   Red=msg->Code;
   SetRGB4(&InnerField.Window->WScreen->ViewPort,ActiveColor,Red,Green,Blue);
   return(1);
}
int GreenHook(struct IntuiMessage *msg)
{
   Green=msg->Code;
   SetRGB4(&InnerField.Window->WScreen->ViewPort,ActiveColor,Red,Green,Blue);
   return(1);
}
int BlueHook(struct IntuiMessage *msg)
{
   Blue=msg->Code;
   SetRGB4(&InnerField.Window->WScreen->ViewPort,ActiveColor,Red,Green,Blue);
   return(1);
}
int Custom(struct WinInfo *winfo,
                     struct NewGadget *ng,
                     struct GadInfo *gad,
                     int left, int top, int width, int height)
{
   int ret;
   if(winfo->Render) {
            SetAPen(winfo->Window->RPort,0);
            RectFill(winfo->Window->RPort,ng->ng_LeftEdge,ng->ng_TopEdge,
                                     ng->ng_LeftEdge+ng->ng_Width-1,
                                     ng->ng_TopEdge+ng->ng_Height-1);
            DrawBevelBox(winfo->Window->RPort,ng->ng_LeftEdge,ng->ng_TopEdge,
                                     ng->ng_Width,ng->ng_Height,
                                     GT_VisualInfo,winfo->Visual,TAG_DONE);
   }
   ret=SubGui(winfo,&InnerField,ng->ng_LeftEdge,ng->ng_TopEdge,
                                        ng->ng_Width,ng->ng_Height);
   if(ret==0 && winfo->Mode==MODE_NEW) { // additional initialisation
      PaletteHook(NULL);
   }
   return(ret);
}
struct Gadget *TestPro_Gadgets[3];

#define TestPro_99 0

ULONG TestProTags1[]={
   TAG_DONE
};

struct GadInfo TestPro1={
   CUSTOM_KIND,1,1,0,0,0+0,0+0,0,0,0,0,BOXFLG_CUSTOM,
   INTERWIDTH,INTERHEIGHT,0,Custom ,NULL,
   "",99,0,0,NULL,TestProTags1
};

#define TestPro_4 1

ULONG TestProTags3[]={
   TAG_DONE
};

struct GadInfo TestPro3={
   BUTTON_KIND,1,0,0,1,0+0,4+INTERHEIGHT,0,0,0,0,0,
   INTERWIDTH,INTERHEIGHT,1,NULL,NULL,
   "OK" ,4,0,0,NULL,TestProTags3
};

struct Box TestPro4={
   GL_VBOX,1,1,0,0,0+0,0+0,0,0,0,0,0,NULL
};

#define TestPro_5 2

ULONG TestProTags5[]={
   TAG_DONE
};

struct GadInfo TestPro5={
   BUTTON_KIND,1,0,0,1,0+0,4+INTERHEIGHT,0,0,0,0,0,
   INTERWIDTH,INTERHEIGHT,2,NULL,NULL,
   "Cancel" ,5,0,0,NULL,TestProTags5
};

struct Box *TestProV2[]={
   (struct Box *)&TestPro3,
   &TestPro4,
   (struct Box *)&TestPro5,
   NULL
};

struct Box TestPro2={
   GL_HBOX,1,0,0,1,0+0,4+INTERHEIGHT,0,0,0,0,0,TestProV2
};

struct Box *TestProV0[]={
   (struct Box *)&TestPro1,
   &TestPro2,
   NULL
};

struct Box TestPro0={
   GL_VBOX,1,1,0,0,0+0,0+0,0,0,0,0,0,TestProV0
};

struct WinInfo TestPro = {
   &TestPro0,TestPro_Gadgets
};

