
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <string.h>

char *cycletext[] = {"Eins","Zwei","Drei","Vier",NULL};

#define GID_AUSWAHL  4711
#define GID_EINGABE  4712
#define GID_WEITER   4713
#define GID_ABBRUCH  4714

int main (void)

{
struct Gadget *gad;		/* Zeiger auf das aktuelle Gadget */
struct Gadget *glist;	/* Zeiger auf das erste Gadget der Liste */
struct NewGadget ng;	/* Allgemeine Informationen für neue Gadgets (Größe, Font, Text etc.) */
struct Screen *scr;
struct Window *win;
struct IntuiMessage *imsg;
BOOL cont;
long winw,winh;
long num;
char *text;

if (scr = LockPubScreen (NULL))
	{
	glist = NULL;
	gad = CreateContext (&glist);	/* Hiermit wird die Gadget-Liste initialisiert. */

	/* Werte setzen, die für alle Gadgets gleich sind */
	ng.ng_VisualInfo = GetVisualInfo (scr,TAG_END);
	ng.ng_TextAttr   = scr->Font;
	ng.ng_Flags      = 0;

	/* Der folgende Block (inkl. CreateGadget) wird für jedes neue Gadget wiederholt. */
	/* Dabei werden nur die Werte angepaßt, die sich ändern.                          */
	/* An CreateGadget wird jeweils das vorherige Gadget übergeben, damit die         */
    /* Verkettung aufgebaut werden kann.                                              */
	/* Dabei muß nicht jedesmal geprüft werden, ob ein Ergebnis erzielt wurde. Wenn   */
    /* das vorherige Gadget NULL war, werden auch alle weiteren Gadgets NULL, sodaß   */
    /* man nur einmal am Ende prüfen muß.                                             */
	ng.ng_LeftEdge   = scr->WBorLeft + 4 + 10 * scr->RastPort.TxWidth;
	ng.ng_TopEdge    = scr->WBorTop + scr->RastPort.TxHeight + 5;
	ng.ng_Width      = 20 * scr->RastPort.TxWidth + 20;
	ng.ng_Height     = scr->RastPort.TxHeight + 6;
	ng.ng_GadgetText = "Auswahl";
	ng.ng_GadgetID   = GID_AUSWAHL;
	gad = CreateGadget (CYCLE_KIND,gad,&ng,GTCY_Labels,cycletext,TAG_END);

	ng.ng_TopEdge   += ng.ng_Height + 4;
	ng.ng_GadgetText = "Eingabe";
	ng.ng_GadgetID   = GID_EINGABE;
	gad = CreateGadget (STRING_KIND,gad,&ng,TAG_END);

	ng.ng_LeftEdge   = scr->WBorLeft + 4;
	ng.ng_TopEdge   += ng.ng_Height + 4;
	ng.ng_Width      = 15 * scr->RastPort.TxWidth + 8;
	ng.ng_GadgetText = "Weiter";
	ng.ng_GadgetID   = GID_WEITER;
	gad = CreateGadget (BUTTON_KIND,gad,&ng,TAG_END);

	ng.ng_LeftEdge  += ng.ng_Width + 4;
	ng.ng_GadgetText = "Abbruch";
	ng.ng_GadgetID   = GID_ABBRUCH;
	gad = CreateGadget (BUTTON_KIND,gad,&ng,TAG_END);

	/* Das letzte Gadget ist ganz unten rechts, deshalb kann seine Größe und Position */
	/* benutzt werden, um die Fenstergröße zu berechnen.                              */
	winw = ng.ng_LeftEdge + ng.ng_Width + 4 + scr->WBorRight;
	winh = ng.ng_TopEdge + ng.ng_Height + 4 + scr->WBorBottom;

	if (gad)	/* Prüfen, ob alle Gadgets angelegt wurden */
		{
		/* Beim Öffnen des Fensters müssen die IDCMP-Flags für Gadtools-Gadgets angegeben werden. */
		/* Hierfür dienen die Konstanten <typ>IDCMP. */
		if (win = OpenWindowTags (NULL,
				WA_Width,winw,
				WA_Height,winh,
				WA_Left,(scr->Width - winw) / 2,	/* Fenster auf dem Bildschirm zentrieren */
				WA_Top,(scr->Height - winh) / 2,
				WA_PubScreen,scr,
				WA_Title,"Fenster",
				WA_Flags,WFLG_CLOSEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_ACTIVATE,
				WA_IDCMP,IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | IDCMP_REFRESHWINDOW | BUTTONIDCMP | CYCLEIDCMP | STRINGIDCMP,
				WA_Gadgets,glist,
				TAG_END))
			{
			GT_RefreshWindow (win,NULL);	/* Alle Gadtools-Gadgets neu zeichnen.       */
											/* Dies muß einmal am Anfang gemacht werden. */

			UnlockPubScreen (NULL,scr);		/* das Fenster blockiert den Screen ohnehin,       */
			scr = NULL;						/* deshalb wird der Lock hier nicht mehr benötigt. */

			/* Es folgt eine ganz normale Eingabeabfrage für Fenster.                      */
			/* Nur statt den üblichen GetMsg / ReplyMsg werden Gadtools-Funktionen benutzt */
			cont = TRUE;
			do	{
				if (Wait ((1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
					cont = FALSE;

				while (imsg = GT_GetIMsg (win->UserPort))
					{
					switch (imsg->Class)
						{
					case IDCMP_GADGETUP:
						gad = (struct Gadget *) imsg->IAddress;
						switch (gad->GadgetID)
							{
						case GID_AUSWAHL:
							GT_GetGadgetAttrs (gad,win,NULL,GTCY_Active,&num,TAG_END);
							Printf ("Auswahl: %s\n",cycletext[num]);
							break;
						case GID_EINGABE:
							GT_GetGadgetAttrs (gad,win,NULL,GTST_String,&text,TAG_END);
							Printf ("Eingabe: <%s>\n",text);
							break;
						case GID_WEITER:
							Printf ("Weiter\n");
							break;
						case GID_ABBRUCH:
							Printf ("Abbruch\n");
							break;
							}
						break;
					case IDCMP_VANILLAKEY:
						if (imsg->Code == 0x1b) /* Esc */
							cont = FALSE;
						break;
					case IDCMP_CLOSEWINDOW:
						cont = FALSE;
						break;
					case IDCMP_REFRESHWINDOW:
						GT_BeginRefresh(win);
						GT_EndRefresh(win, TRUE);
						break;
						}
					GT_ReplyIMsg (imsg);
					}
				}
			while (cont);

			CloseWindow (win);
			}
		}

	FreeGadgets (glist);

	FreeVisualInfo (ng.ng_VisualInfo);

	if (scr) UnlockPubScreen (NULL,scr);
	}

return (0);
}
