{ Gadget-Demo.p    ©1994 by Björn "BOMBER" Schotte }
{ written for MaxonPASCAL 3 (© by MAXON)           }
{                                                  }
{ C U in the next P.U.R.I.T.Y. !                   }
{                                                  }
{ Dieses Programm demonstriert das Kreieren von    }
{ Gadgets unter der GadTools-Library.              }
{ Es gibt noch viele andere Typen, dies sollte     }
{ aber genügen.                                    }
{                                      BS/26/07/94 }

PROGRAM GadgetDemo;

USES Intuition, Graphics, Exec;

{$incl "gadtools.lib"}

VAR
  wp			: p_Window;
  t			: ARRAY[1..11] OF TagItem;
  gad			: ARRAY[1..4] OF p_Gadget;
  gl        : p_Gadget;
  lib			: p_Library;
  ps 			: p_Screen;
  vi			: PTR;
  ng			: NewGadget;
  tattr		: TextAttr;
  xoff,yoff,
  i         : INTEGER;
  CLabels   : ARRAY[0..9] OF STR;
  MXLabels  : ARRAY[1..3] OF STR;
  dstring   : STRING;
  msg       : p_IntuiMessage;
  class     : LONG;
  act			: INTEGER;


{ Sauberes Verlassen des Programms aus jeder Situation heraus. }
PROCEDURE CleanUp(txt:STRING; rc:BYTE);
BEGIN
  IF wp <> NIL THEN CloseWindow(wp); { Fenster schliessen }
  IF gl <> NIL THEN FreeGadgets(gl); { GadgetListe freigeben }
  IF vi <> NIL THEN FreeVisualInfo(vi); { VisualInfo freigeben }
  IF txt <> "" THEN Writeln(txt);    { Text ausgeben }
  HALT(rc);
END;

BEGIN
  { Cycle- bzw. MX-Labels immer mit NIL abschliessen !!
    Labels müssen vom Typ STR sein !!                   }
  CLabels[0] := "Zustand 1";
  CLabels[1] := "Zustand 2";
  CLabels[2] := "Zustand 3";
  CLabels[3] := "Zustand 4";
  CLabels[4] := "Zustand 5";
  CLabels[5] := "Zustand 6";
  CLabels[6] := "Zustand 7";
  CLabels[7] := "Zustand 8";
  CLabels[8] := "Zustand 9";
  CLabels[9] := NIL;
  MXLabels[1] := "6 LPI";
  MXLabels[2] := "8 LPI";
  MXLabels[3] := NIL;
  act := 0;
  gl := NIL;
  wp := NIL;
  vi := NIL;
  tattr := TextAttr("topaz.font",8,0,0);
  lib := IntuitionBase;
  IF lib^.lib_Version < 36 THEN Error("Ich brauche mind. Kick 2.00 !!");
  OpenLib(GadToolsBase, "gadtools.library", 36);
  ps := LockPubScreen(NIL);
  IF ps = NIL THEN CleanUp("Kann den PublicScreen nicht locken !!",20);
  xoff := ps^.WBorLeft;
  yoff := ps^.BarHeight;
  vi := GetVisualInfoA(ps, NIL);
  UnLockPubScreen(NIL, ps);
  IF vi = NIL THEN CleanUp("Konnte keine VisualInfo bekommen !!",20);

  { Gadgets kreieren: }
  gl := NIL;
  gl := CreateContext(^gl);
  IF gl = NIL THEN CleanUp("Kein Speicher mehr frei für CreateContext !!",20);
  { Button-Gadget kreieren: }
  ng := NewGadget(xoff+1,yoff+2,            { LeftEdge, TopEdge }
                  200,13,                   { Width, Height }
                  "_Button-Gadget!",^tattr, { GadgetText, TextAttr }
                  1,PLACETEXT_IN,           { GadgetNumber, Flags }
                  vi,NIL);                  { VisualInfo, UserData }
  t[1] := TagItem(GT_Underscore, LONG("_"));
  t[2].ti_Tag := TAG_DONE;
  gad[1] := CreateGadgetA(BUTTON_KIND,gl,^ng,^t);
  IF gad[1] = NIL THEN CleanUp("Kein Speicher für CreateGadgetA frei !!",20);
  { Checkbox-Gadget kreieren: }
  ng := NewGadget(xoff+1,yoff+18,
                  26,11,
                  "Dieses Proggy ist gut",^tattr,
                  2,PLACETEXT_RIGHT,
                  vi,NIL);
  t[1] := TagItem(GTCB_Checked,1);
  t[2].ti_Tag := TAG_DONE;
  gad[2] := CreateGadgetA(CHECKBOX_KIND,gad[1],^ng,^t);
  IF gad[2] = NIL THEN CleanUp("Kein Speicher frei !!",20);
  { Cycle-Gadget kreieren: }
  ng := NewGadget(xoff+1,yoff+33,
                  200,13,
                  NIL,^tattr,
                  3,0,
                  vi,NIL);
  t[1] := TagItem(GTCY_Labels,LONG(^CLabels)); { Cycle-Texte }
  gad[3] := CreateGadgetA(CYCLE_KIND,gad[2],^ng,^t);
  IF gad[3] = NIL THEN CleanUp("Kein Speicher frei !!",20);
  { MX-Gadget kreieren: }
  ng := NewGadget(xoff+203,yoff+33,
                  MX_WIDTH,MX_HEIGHT,
                  NIL,^tattr,
                  4,PLACETEXT_RIGHT,
                  vi,NIL);
  t[1] := TagItem(GTMX_Labels, LONG(^MXLabels)); { MX-Labels }
  gad[4] := CreateGadgetA(MX_KIND,gad[3],^ng,^t);
  IF gad[4] = NIL THEN CleanUp("Kein Speicher frei !!",20);
  { Window-Tags: }
  t[1] := TagItem(WA_InnerWidth, 400); { Breite ohne Fensterrahmen }
  t[2] := TagItem(WA_InnerHeight, 150); { Höhe ohne Fensterrahmen }
  t[3] := TagItem(WA_Flags, WFLG_ACTIVATE+WFLG_NOCAREREFRESH+
                  WFLG_SMART_REFRESH+WFLG_CLOSEGADGET+WFLG_DRAGBAR+
                  WFLG_DEPTHGADGET);
  t[4] := TagItem(WA_Idcmp, IDCMP_CLOSEWINDOW+IDCMP_GADGETUP+IDCMP_GADGETDOWN);
  t[5].ti_Tag := WA_Title;
  t[5].ti_Data := "Gadget-Demo by Björn Schotte";
  t[6] := TagItem(WA_Gadgets, LONG(gl)); { Zeiger auf GadList }
  t[7].ti_Tag := TAG_DONE;
  wp := OpenWindowTagList(NIL, ^t); { Fenster öffnen }
  IF wp = NIL THEN CleanUp("Kann kein Fenster öffnen !!",20);
  { Warten ... Warten ... }
  REPEAT
    msg := p_IntuiMessage(WaitPort(wp^.UserPort));
    msg := GT_GetIMsg(wp^.UserPort);
    class := msg^.Class;
    GT_ReplyIMsg(msg);
  UNTIL class = IDCMP_CLOSEWINDOW;
  CleanUp("",0);
END.
