PROGRAM Talk2Boopsi;

{ This example creates a Boopsi prop gadget and integer string gadget, connecting them 
so they }
{ update each other when the user changes their value.  The example program only 
initializes   }
{ the gadgets and puts them on the window; it doesn't have to interact with them to 
make them  }
{ talk to each other.                                                                          
}

{
    History:

    Changed to use TAGS.
    16 Jul 2000.

    Added MessageBox for report.
    31 Jul 2000.

    nils.sjoholm@mailbox.swipnet.se

}

uses Exec, Intuition, Utility, vartags,msgbox;



VAR
   w      : pWindow;
   mymsg  : pIntuiMessage;
   prop,
   int    : pGadget;
   done   : BOOLEAN;
   dummy  : Word;
   temp   : Longint;
   prop2intmap : array[0..1] of tTagItem;
   int2propmap : array[0..1] of tTagItem;

CONST

   vers  : PChar = '$VER: Talk2boopsi 37.1';

    PROPGADGET_ID       = 1;
   INTGADGET_ID        = 2;
   PROPGADGETWIDTH     = 10;
   PROPGADGETHEIGHT    = 80;
   INTGADGETHEIGHT     = 18;
   VISIBLE             = 10;
   TOTAL               = 100;
   INITIALVAL          = 25;
   MINWINDOWWIDTH      = 80;
   MINWINDOWHEIGHT     = (PROPGADGETHEIGHT + 70);
   MAXCHARS            = 3;

PROCEDURE CleanUp(Why : STRING; err: Word);
BEGIN
    IF assigned(prop) THEN DisposeObject(prop);
    IF assigned(int) THEN DisposeObject(int);
    IF assigned(w) THEN CloseWindow(w);
    IF Why <> '' THEN MessageBox('Boopsi Report',Why,'OK');
    Halt(err);
END;

BEGIN

    done := FALSE;

    prop2intmap[0] := TagItem(PGA_Top, STRINGA_LongVal);
    prop2intmap[1].ti_Tag := TAG_END;

    int2propmap[0] := TagItem(STRINGA_LongVal, PGA_Top);
    int2propmap[1].ti_Tag := TAG_END;

    w := OpenWindowTagList(NIL,TAGS(
    WA_Flags,     WFLG_DEPTHGADGET + WFLG_DRAGBAR +
                               WFLG_CLOSEGADGET + WFLG_SIZEGADGET + WFLG_ACTIVATE,
    WA_IDCMP,     IDCMP_CLOSEWINDOW,
    WA_Width,     MINWINDOWWIDTH + 10,
    WA_Height,    MINWINDOWHEIGHT + 10,
    WA_MinWidth,  MINWINDOWWIDTH,
    WA_MinHeight, MINWINDOWHEIGHT,
    TAG_END));

    IF w=NIL THEN CleanUp('No window',20);

    prop := NewObjectA(NIL, PChar('propgclass'#0),TAGS(
    GA_ID,       PROPGADGET_ID,
    GA_Top,      (w^.BorderTop) + 5,
    GA_Left,     (w^.BorderLeft) + 5,
    GA_Width,    PROPGADGETWIDTH,
    GA_Height,   PROPGADGETHEIGHT,
    ICA_MAP,     Longint(@prop2intmap),
    PGA_Total,   TOTAL,
    PGA_Top,     INITIALVAL,
    PGA_Visible, VISIBLE,
    PGA_NewLook, ltrue, 
    TAG_END));

    IF prop = NIL THEN CleanUp('No propgadget',20);

    int := NewObjectA(NIL, PChar('strgclass'#0),TAGS(
    GA_ID,      INTGADGET_ID,
    GA_Top,     (w^.BorderTop) + 5,
    GA_Left,    (w^.BorderLeft) + PROPGADGETWIDTH + 10,
    GA_Width,   MINWINDOWWIDTH -
                                  (w^.BorderLeft + w^.BorderRight +
                                  PROPGADGETWIDTH + 15),
    GA_Height,  INTGADGETHEIGHT,

    ICA_MAP,    Longint(@int2propmap),
    ICA_TARGET, Longint(prop),
    GA_Previous, Longint(prop),

    STRINGA_LongVal,  INITIALVAL,
    STRINGA_MaxChars, MAXCHARS,
    TAG_END));

    temp := SetGadgetAttrsA(prop, w, NIL,TAGS(
    ICA_TARGET, Longint(int),
    TAG_END));

    IF int = NIL THEN CleanUp('No INTEGER gadget',20);

    dummy := AddGList(w, prop, -1, -1, NIL);
    RefreshGList(prop, w, NIL, -1);

    WHILE (NOT done) DO BEGIN
        mymsg := pIntuiMessage(WaitPort(W^.UserPort));
        mymsg := pIntuiMessage(GetMsg(W^.UserPort));
        IF mymsg^.IClass = IDCMP_CLOSEWINDOW THEN done := True;
        ReplyMsg(pMessage(mymsg));
    END;

    dummy := RemoveGList(w, prop, -1);
    CleanUp('',0);
END.





