home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / useful / dev / obero / oberon-a / examples / libraries / intuition / rkmbuttonclass.mod < prev    next >
Encoding:
Text File  |  1994-08-08  |  17.7 KB  |  546 lines

  1. (*************************************************************************
  2.  
  3.      $RCSfile: RKMButtonclass.mod $
  4.   Description: Example Boopsi gadget for RKRM:Libraries
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 1.1 $
  8.       $Author: fjc $
  9.         $Date: 1994/08/08 16:55:25 $
  10.  
  11.   Copyright © 1994, Frank Copeland.
  12.   This example program is part of Oberon-A.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15.   Log entries are at the end of the file.
  16.  
  17. *************************************************************************)
  18.  
  19. MODULE RKMButtonclass;
  20.  
  21. (*
  22. ** $C= CaseChk       $I= IndexChk  $L= LongAdr   $N- NilChk
  23. ** $P- PortableCode  $R= RangeChk  $S- StackChk  $T= TypeChk
  24. ** $V= OvflChk       $Z= ZeroVars
  25. *)
  26.  
  27. IMPORT
  28.   SYS := SYSTEM,
  29.   e   := Exec,
  30.   i   := Intuition,
  31.   u   := Utility,
  32.   gfx := Graphics,
  33.   bu  := BoopsiUtil,
  34.   hu  := HookUtil,
  35.   IE  := InputEvent,
  36.   Errors,
  37.   d   := Dos(*,
  38.   iu := IntuiUtil*);
  39.  
  40. CONST
  41.   VersionTag = "$VER: RKMButtonclass 1.0 (18.7.94)\n";
  42.   VersionStr = "RKMButtonclass 1.0 (18 Jul 1994)\n";
  43.   CopyrightStr = "Copyright © 1994 Frank Copeland";
  44.  
  45. (*
  46. ** Class specifics
  47. *)
  48.  
  49. CONST
  50.  
  51.   rkmButPulse = u.tagUser + 1;
  52.  
  53. TYPE
  54.  
  55.   ButINSTPtr = CPOINTER TO ButINST;
  56.   ButINST = RECORD
  57.     midX, midY : LONGINT; (* Co-ordinates of middle of gadget *)
  58.   END;
  59.  
  60. CONST
  61.  
  62. (* ButINST has one flag: *)
  63.  
  64.   eraseOnly = 0; (* Tells rendering routine to *)
  65.                  (* only erase the gadget, not *)
  66.                  (* rerender a new one.  This  *)
  67.                  (* lets the gadget erase it-  *)
  68.                  (* self before it rescales.   *)
  69.  
  70. (**************************************************************************)
  71. (* The Main procedure connects an RKMButClass object to a Boopsi integer  *)
  72. (* gadget, which displays the RKMButClass gadget's rkmButPulse value.     *)
  73. (* The code scales and moves the gadget while it is in place.             *)
  74. (**************************************************************************)
  75.  
  76. VAR
  77.  
  78.   pulse2int : ARRAY 2 OF u.TagItem;
  79.  
  80. CONST
  81.  
  82.   intWidth = 40;
  83.   intHeight = 20;
  84.  
  85. VAR
  86.  
  87.   w : i.WindowPtr;
  88.   rkmbutcl : i.IClassPtr;
  89.   integer, but : i.GadgetPtr;
  90.   msg : i.IntuiMessagePtr;
  91.  
  92. (*------------------------------------*)
  93. PROCEDURE^ freeRKMButGadClass ( cl : i.IClassPtr );
  94.  
  95. PROCEDURE* Cleanup;
  96. BEGIN (* Cleanup *)
  97.   IF but # NIL THEN
  98.     SYS.PUTREG (0, i.base.RemoveGList (w, integer, -1));
  99.     i.base.DisposeObject (but); but := NIL
  100.   END;
  101.   IF integer # NIL THEN i.base.DisposeObject (integer); integer := NIL END;
  102.   IF rkmbutcl # NIL THEN freeRKMButGadClass (rkmbutcl); rkmbutcl := NIL END;
  103.   IF w # NIL THEN i.base.CloseWindow (w); w := NIL END
  104. END Cleanup;
  105.  
  106. (*------------------------------------*)
  107. PROCEDURE Init ();
  108.  
  109. BEGIN (* Init *)
  110.   u.OpenLib (TRUE);
  111.   pulse2int [0].tag := rkmButPulse; pulse2int [0].data := i.stringaLongVal;
  112.   pulse2int [1].tag := u.tagEnd;
  113.   but := NIL; integer := NIL; rkmbutcl := NIL; w := NIL;
  114.   SYS.SETCLEANUP (Cleanup)
  115. END Init;
  116.  
  117.  
  118. (*------------------------------------*)
  119. PROCEDURE MainLoop ( attr, value : LONGINT );
  120.  
  121.   VAR done : BOOLEAN; ignore : LONGINT;
  122.  
  123. BEGIN (* MainLoop *)
  124.   done := FALSE;
  125.   ignore := i.base.SetGadgetAttrs (but^, w, NIL, attr, value, u.tagDone);
  126.   WHILE ~done DO
  127.     e.base.WaitPort (w.userPort);
  128.     LOOP
  129.       msg := SYS.VAL (i.IntuiMessagePtr, e.base.GetMsg (w.userPort));
  130.       IF msg = NIL THEN EXIT END;
  131.       IF msg.class = {i.idcmpCloseWindow} THEN done := TRUE END;
  132.       e.base.ReplyMsg (msg)
  133.     END;
  134.   END;
  135. END MainLoop;
  136.  
  137. (*------------------------------------*)
  138. PROCEDURE RenderRKMBut
  139.   ( cl : i.IClassPtr; g : i.GadgetPtr; msg : i.RenderPtr )
  140.   : e.APTR;
  141.  
  142.   VAR
  143.     inst : ButINSTPtr;
  144.     rp : gfx.RastPortPtr;
  145.     retval : e.APTR;
  146.     pens : i.DRIPenArrayPtr;
  147.     back, shine, shadow, wd, h, x, y : INTEGER;
  148.  
  149. BEGIN (* RenderRKMBut *)
  150.   inst := bu.InstData (cl, SYS.VAL (i.ObjectPtr, g));
  151.   retval := SYS.VAL (e.APTR, e.LTRUE);
  152.   pens := msg.gInfo.drInfo.pens;
  153.   IF msg.methodID = i.gmRender THEN (* If msg is truly a gmRender message *)
  154.                                     (* (not a Input that looks like a     *)
  155.                                     (* Render), use the rastport within   *)
  156.                                     (* it...                              *)
  157.     rp := msg.rPort
  158.   ELSE                              (* ...Otherwise, get a rastport using *)
  159.                                     (* ObtainGIRPort().                   *)
  160.     rp := i.base.ObtainGIRPort (msg.gInfo)
  161.   END;
  162.   IF rp # NIL THEN
  163.     IF i.gflgSelected IN g.flags THEN      (* If the gadget is selected,  *)
  164.                                            (* reverse the meanings of the *)
  165.                                            (* pens.                       *)
  166.       back := pens [i.fillPen];
  167.       shine := pens [i.shadowPen];
  168.       shadow := pens [i.shinePen]
  169.     ELSE
  170.       back := pens [i.backGroundPen];
  171.       shine := pens [i.shinePen];
  172.       shadow := pens [i.shadowPen]
  173.     END;
  174.     gfx.base.SetDrMd (rp, gfx.jam1);
  175.  
  176.     gfx.base.SetAPen (rp, SHORT (back));          (* Erase the old gadget *)
  177.     gfx.base.RectFill
  178.       ( rp, g.leftEdge,
  179.             g.topEdge,
  180.             g.leftEdge + g.width,
  181.             g.topEdge + g.height );
  182.  
  183.     gfx.base.SetAPen (rp, SHORT (shadow));            (* Draw shadow edge *)
  184.     gfx.base.Move (rp, g.leftEdge + 1, g.topEdge + g.height);
  185.     gfx.base.Draw (rp, g.leftEdge + g.width, g.topEdge + g.height);
  186.     gfx.base.Draw (rp, g.leftEdge + g.width, g.topEdge + 1);
  187.  
  188.     wd := g.width DIV 4;         (* Draw arrows - Sorry, no frills imagery *)
  189.     h := g.height DIV 2;
  190.     x := g.leftEdge + (wd DIV 2);
  191.     y := g.topEdge + (h DIV 2);
  192.  
  193.     gfx.base.Move (rp, x, SHORT (inst.midY));
  194.     gfx.base.Draw (rp, x + wd, y);
  195.     gfx.base.Draw (rp, x + wd, y + g.height - h);
  196.     gfx.base.Draw (rp, x, SHORT (inst.midY));
  197.  
  198.     x := g.leftEdge + (wd DIV 2) + g.width DIV 2;
  199.  
  200.     gfx.base.Move (rp, x + wd, SHORT (inst.midY));
  201.     gfx.base.Draw (rp, x, y);
  202.     gfx.base.Draw (rp, x, y + g.height - h);
  203.     gfx.base.Draw (rp, x + wd, SHORT (inst.midY));
  204.  
  205.     gfx.base.SetAPen (rp, SHORT (shine));              (* Draw shine edge *)
  206.     gfx.base.Move (rp, g.leftEdge, g.topEdge + g.height - 1);
  207.     gfx.base.Draw (rp, g.leftEdge, g.topEdge);
  208.     gfx.base.Draw (rp, g.leftEdge + g.width - 1, g.topEdge);
  209.  
  210.     IF msg.methodID # i.gmRender THEN (* If we allocated a rastport, give *)
  211.                                       (* it back. *)
  212.       i.base.ReleaseGIRPort (rp)
  213.     END;
  214.   ELSE
  215.     retval := SYS.VAL (e.APTR, e.LFALSE);
  216.   END;
  217.   RETURN retval
  218. END RenderRKMBut;
  219.  
  220.  
  221. (*------------------------------------*)
  222. PROCEDURE NotifyPulse
  223.   ( cl    : i.IClassPtr;
  224.     o     : i.ObjectPtr;
  225.     flags : SET;
  226.     mid   : LONGINT;
  227.     gpi   : i.InputPtr );
  228.  
  229.   VAR
  230.     tt : ARRAY 3 OF u.TagItem;
  231.     g : i.GadgetPtr;
  232.     ignore : e.APTR;
  233.  
  234. BEGIN (* NotifyPulse *)
  235.   g := SYS.VAL (i.GadgetPtr, o);
  236.  
  237.   tt[0].tag := rkmButPulse;
  238.   tt[0].data := mid - gpi.mouse.x + g.leftEdge;
  239.  
  240.   tt[1].tag := i.gaID;
  241.   tt[1].data := g.gadgetID;
  242.  
  243.   tt[2].tag := u.tagDone;
  244.  
  245.   ignore := bu.DoSuperMethod
  246.     (cl, o, i.omNotify, SYS.ADR (tt), gpi.gInfo, flags)
  247. END NotifyPulse;
  248.  
  249. (*------------------------------------*)
  250. PROCEDURE* dispatchRKMButGad
  251.   ( hook : u.HookPtr; obj : e.APTR; message : e.APTR )
  252.   : e.APTR;
  253.  
  254.   VAR
  255.     cl : i.IClassPtr; o : i.ObjectPtr; msg : i.MsgPtr;
  256.     inst : ButINSTPtr;
  257.     retval, ignore : SYS.LONGWORD;
  258.     object : i.ObjectPtr;
  259.     g : i.GadgetPtr;
  260.     gpi : i.InputPtr;
  261.     ie : IE.InputEventPtr;
  262.     rp : gfx.RastPortPtr;
  263.     x, y, wd, h : INTEGER;
  264.     pens : i.DRIPenArrayPtr;
  265.     opSet : i.OpSetPtr;
  266.  
  267. (* $s+ Save registers on entry *)
  268. BEGIN (* dispatchRKMButGad *)
  269.   (* SYS.INLINE (048E7H, 03F32H); *)
  270.   cl := SYS.VAL (i.IClassPtr, hook);
  271.   o := obj;
  272.   msg := message;
  273.   retval := e.LTRUE;
  274.   CASE msg.methodID OF
  275.     i.omNew : (* First, pass up to superclass *)
  276.       object := bu.DoSuperMethodA (cl, o, msg^);
  277.       IF object # NIL THEN
  278.         g := SYS.VAL (i.GadgetPtr, object);
  279.                 (* Initial local instance data *)
  280.         inst := bu.InstData (cl, object);
  281.         inst.midX := g.leftEdge + (g.width DIV 2);
  282.         inst.midY := g.topEdge + (g.height DIV 2);
  283.         retval := object
  284.       END;
  285.     |
  286.     i.gmHitTest :
  287.           (* Since this is a rectangular gadget this *)
  288.           (* method always returns i.gmrGadgetHit.   *)
  289.       retval := i.gmrGadgetHit;
  290.     |
  291.     i.gmGoActive :
  292.       inst := bu.InstData (cl, o);
  293.           (* Only become active if the gmGoActive *)
  294.           (* was triggered by direct user input.  *)
  295.       gpi := SYS.VAL (i.InputPtr, msg);
  296.       IF gpi.iEvent # NIL THEN
  297.             (* This gadget is now active, change    *)
  298.             (* visual state to selected and render. *)
  299.         g := SYS.VAL (i.GadgetPtr, o);
  300.         INCL (g.flags, i.gflgSelected);
  301.         ignore := RenderRKMBut (cl, g, SYS.VAL (i.RenderPtr, msg));
  302.         retval := i.gmrMeActive
  303.       ELSE    (* The gmGoActive was not         *)
  304.               (* triggered by direct user input *)
  305.         retval := i.gmrNoReuse
  306.       END;
  307.     |
  308.     i.gmRender :
  309.       g := SYS.VAL (i.GadgetPtr, o);
  310.       retval := RenderRKMBut (cl, g, SYS.VAL (i.RenderPtr, msg));
  311.     |
  312.     i.gmHandleInput : (* While it is active, this gadget sends its      *)
  313.                       (* superclass an omNotify pulse for every         *)
  314.                       (* classTimer event that goes by (about one every *)
  315.                       (* 10th of a second).  Any object that is         *)
  316.                       (* connected to this gadget will get A LOT of     *)
  317.                       (* omUpdate messages.                             *)
  318.       g := SYS.VAL (i.GadgetPtr, o);
  319.       gpi := SYS.VAL (i.InputPtr, msg);
  320.       ie := SYS.VAL (IE.InputEventPtr, gpi.iEvent);
  321.  
  322.       inst := bu.InstData (cl, o);
  323.  
  324.       retval := i.gmrMeActive;
  325.  
  326.       IF ORD (ie.class) = IE.classRawMouse THEN
  327.         CASE ie.code OF
  328.           i.selectUp :  (* The user let go of the gadget so return       *)
  329.                         (* gmrNoReuse to deactivate and to tell          *)
  330.                         (* Intuition not to reuse this Input Event as we *)
  331.                         (* have already processed it.                    *)
  332.  
  333.                         (* If the user let go of the gadget while the    *)
  334.                         (* mouse was over it, mask gmrVerify into the    *)
  335.                         (* return value so Intuition will send a Release *)
  336.                         (* Verify (gadgetUp).                            *)
  337.             IF
  338.               (gpi.mouse.x < g.leftEdge) OR
  339.               (gpi.mouse.x > g.leftEdge + g.width) OR
  340.               (gpi.mouse.y < g.topEdge) OR
  341.               (gpi.mouse.y > g.topEdge + g.height)
  342.             THEN
  343.               retval := i.gmrNoReuse + i.gmrVerify
  344.             ELSE
  345.               retval := i.gmrNoReuse
  346.             END;
  347.  
  348.                      (* Since the gadget is going inactive, send a final *)
  349.                      (* notification to the icaTarget                    *)
  350.             NotifyPulse (cl, o, {}, inst.midX, gpi)
  351.           |
  352.           i.menuDown :  (* The user hit the menu button. Go inactive and *)
  353.                         (* let Intuition reuse the menu button event so  *)
  354.                         (* Intuition can pop up the menu bar.            *)
  355.             retval := i.gmrReuse;
  356.             NotifyPulse (cl, o, {}, inst.midX, gpi)
  357.           |
  358.         ELSE
  359.           retval := i.gmrMeActive
  360.         END
  361.       ELSIF ORD (ie.class) = IE.classTimer THEN
  362.             (* If the gadget gets a timer event, it sends an interim *)
  363.             (* omNotify to its superclass.                           *)
  364.         NotifyPulse (cl, o, {i.opuInterim}, inst.midX, gpi)
  365.       END;
  366.     |
  367.     i.gmGoInactive :      (* Intuition said to go inactive.  Clear the    *)
  368.                           (* gflgSelected bit and render using unselected *)
  369.                           (* imagery.                                     *)
  370.       g := SYS.VAL (i.GadgetPtr, o);
  371.       EXCL (g.flags, i.gflgSelected);
  372.       ignore := RenderRKMBut (cl, g, SYS.VAL (i.RenderPtr, msg));
  373.     |
  374.     i.omSet :    (* Although this class doesn't have settable attributes, *)
  375.                  (* this gadget class does have scaleable imagery, so it  *)
  376.                  (* needs to find out when its size and/or position has   *)
  377.                  (* changed so it can erase itself, THEN scale, and       *)
  378.                  (* rerender.                                             *)
  379.       opSet := SYS.VAL (i.OpSetPtr, msg);
  380.       IF
  381.         (u.base.FindTagItem (i.gaWidth, opSet.attrList) # NIL) OR
  382.         (u.base.FindTagItem (i.gaHeight, opSet.attrList) # NIL) OR
  383.         (u.base.FindTagItem (i.gaTop, opSet.attrList) # NIL) OR
  384.         (u.base.FindTagItem (i.gaLeft, opSet.attrList) # NIL)
  385.       THEN
  386.         g := SYS.VAL (i.GadgetPtr, o);
  387.  
  388.         x := g.leftEdge;
  389.         y := g.topEdge;
  390.         wd := g.width;
  391.         h := g.height;
  392.  
  393.         inst := bu.InstData (cl, o);
  394.  
  395.         retval := bu.DoSuperMethodA (cl, o, msg^);
  396.  
  397.                                     (* Get pointer to RastPort for gadget *)
  398.         rp := i.base.ObtainGIRPort (opSet.gInfo);
  399.         IF rp # NIL THEN
  400.           pens := opSet.gInfo.drInfo.pens;
  401.           gfx.base.SetAPen (rp, SHORT (pens [i.backGroundPen]));
  402.           gfx.base.SetDrMd (rp, gfx.jam1);       (* Erase the old gadget. *)
  403.           gfx.base.RectFill (rp, x, y, x+wd, y+h);
  404.  
  405.           inst.midX := g.leftEdge + (g.width DIV 2); (* Recalculate where *)
  406.           inst.midY := g.topEdge + (g.height DIV 2); (* the center of the *)
  407.                                                      (* gadget is. *)
  408.  
  409.                                                   (* Rerender the gadget. *)
  410.           ignore :=
  411.             bu.DoMethod (o, i.gmRender, opSet.gInfo, rp, i.gRedrawRedraw);
  412.           i.base.ReleaseGIRPort (rp)
  413.         END;
  414.       ELSE
  415.         retval := bu.DoSuperMethodA (cl, o, msg^)
  416.       END;
  417.     |
  418.   ELSE (* rkmbutgadclass does not recognize the methodID, let the *)
  419.        (* superclass's dispatcher take a look at it. *)
  420.     retval := bu.DoSuperMethodA (cl, o, msg^);
  421.   END;
  422.   (* SYS.INLINE (04CDFH, 04CFCH); *)
  423.   RETURN SYS.VAL (e.APTR, retval)
  424. END dispatchRKMButGad;
  425.  
  426. (*------------------------------------*)
  427. PROCEDURE initRKMButGadClass () : i.IClassPtr;
  428.  
  429.   VAR
  430.     cl : i.IClassPtr;
  431.  
  432. BEGIN (* initRKMButGadClass *)
  433.   cl := i.base.MakeClass ( "", "gadgetclass", NIL, SIZE (ButINST), {} );
  434.   IF cl # NIL THEN
  435.     (* initialize the IClass Hook *)
  436.     cl.entry := hu.HookEntry;
  437.     cl.subEntry := dispatchRKMButGad;
  438.   END;
  439.   RETURN cl
  440. END initRKMButGadClass;
  441.  
  442.  
  443. (*------------------------------------*)
  444. PROCEDURE freeRKMButGadClass ( cl : i.IClassPtr );
  445.  
  446.   VAR ignore : BOOLEAN;
  447.  
  448. BEGIN (* freeRKMButGadClass *)
  449.   ignore := i.base.FreeClass (cl)
  450. END freeRKMButGadClass;
  451.  
  452. (*------------------------------------*)
  453. PROCEDURE Main ();
  454.  
  455.   VAR ignore : INTEGER;
  456.  
  457. BEGIN (* Main *)
  458.   IF i.base.version >= 37 THEN
  459.     IF u.base.version >= 37 THEN
  460.       IF gfx.base.version >= 37 THEN
  461.         w := i.base.OpenWindowTagsA
  462.           ( NIL,
  463.             i.waFlags,  { i.wflgDepthGadget, i.wflgDragBar,
  464.                           i.wflgCloseGadget, i.wflgSizeGadget },
  465.             i.waIDCMP,  {i.idcmpCloseWindow},
  466.             i.waWidth,  640,
  467.             i.waHeight, 200,
  468.             u.tagEnd );
  469.         IF w # NIL THEN
  470.           IF i.base.WindowLimits (w, 450, 200, 640, 200) THEN END;
  471.           rkmbutcl := initRKMButGadClass();
  472.           IF rkmbutcl # NIL THEN
  473.             integer := i.base.NewObject
  474.               ( NIL, "strgclass",
  475.                 i.gaID,            1,
  476.                 i.gaTop,           LONG (w.borderTop) + 5,
  477.                 i.gaLeft,          LONG (w.borderLeft) + 5,
  478.                 i.gaWidth,         intWidth,
  479.                 i.gaHeight,        intHeight,
  480.                 i.stringaLongVal,  0,
  481.                 i.stringaMaxChars, 5,
  482.                 u.tagEnd );
  483.             IF integer # NIL THEN
  484.               but := i.base.NewObject
  485.                 ( rkmbutcl, "",
  486.                   i.gaID,            2,
  487.                   i.gaTop,           LONG (w.borderTop) + 5,
  488.                   i.gaLeft,          integer.leftEdge + integer.width + 5,
  489.                   i.gaWidth,         40,
  490.                   i.gaHeight,        intHeight,
  491.                   i.gaPrevious,      integer,
  492.                   i.icaMap,          SYS.ADR (pulse2int),
  493.                   i.icaTarget,       integer,
  494.                   u.tagEnd );
  495.               IF but # NIL THEN
  496.                 ignore := i.base.AddGList (w, integer, -1, -1, NIL);
  497.                 i.base.RefreshGList (integer, w, NIL, -1);
  498.  
  499.                 i.base.SetWindowTitles
  500.                   ( w, SYS.ADR ("<-- Click to resize gadget Height"), NIL );
  501.                 MainLoop (u.tagDone, 0);
  502.  
  503.                 i.base.SetWindowTitles
  504.                   ( w, SYS.ADR ("<-- Click to resize gadget Width"), NIL );
  505.                 MainLoop (i.gaHeight, 100);
  506.  
  507.                 i.base.SetWindowTitles
  508.                   ( w, SYS.ADR ("<-- Click to resize gadget Y position"), NIL );
  509.                 MainLoop (i.gaWidth, 100);
  510.  
  511.                 i.base.SetWindowTitles
  512.                   ( w, SYS.ADR ("<-- Click to resize gadget X position"), NIL );
  513.                 MainLoop (i.gaTop, but.topEdge + 20);
  514.  
  515.                 i.base.SetWindowTitles
  516.                   ( w, SYS.ADR ("<-- Click to quit"), NIL );
  517.                 MainLoop (i.gaLeft, but.leftEdge + 20);
  518.  
  519.                 ignore := i.base.RemoveGList (w, integer, -1);
  520.                 i.base.DisposeObject (but); but := NIL
  521.               END;
  522.               i.base.DisposeObject (integer); integer := NIL
  523.             END;
  524.             freeRKMButGadClass (rkmbutcl); rkmbutcl := NIL
  525.           END;
  526.           i.base.CloseWindow (w); w := NIL
  527.         END;
  528.       END;
  529.     END;
  530.   END
  531. END Main;
  532.  
  533. BEGIN (* RKMButtonclass *)
  534.   Init ();
  535.   Main ();
  536. END RKMButtonclass.
  537.  
  538. (*************************************************************************
  539.  
  540.   $Log: RKMButtonclass.mod $
  541. # Revision 1.1  1994/08/08  16:55:25  fjc
  542. # Release 1.4
  543. #
  544. *************************************************************************)
  545.  
  546.