home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 093.lha / Chaos / Sources / cpanel.mod < prev    next >
Encoding:
Modula Implementation  |  1986-11-21  |  6.3 KB  |  193 lines

  1. (*
  2.     
  3.     This module handles the control panel for the 
  4.     Chaos program.
  5.         
  6.         Created: 8/22/87 by Richie Bielak
  7.         
  8.         Copyright (c) 1987 by Richie Bielak
  9.         
  10.         This program maybe freely distributed, but please leave
  11.         my name in. Thanks.....Richie
  12.  
  13. *)
  14. IMPLEMENTATION MODULE ChaosPanel;
  15.  
  16. FROM SYSTEM    IMPORT ADR, BYTE, ADDRESS, LONG, SHORT, LONGWORD;
  17. FROM Ports     IMPORT WaitPort, ReplyMsg, GetMsg, MessagePtr;
  18. FROM SimpleWindows IMPORT CreateWindow;
  19. FROM SimpleGadgets IMPORT BeginGadgetList, EndGadgetList, FreeGadgetList,
  20.                LastGadget, AddGadgetTextButton, AddGadgetString,
  21.            AddGadgetInteger;
  22. FROM Rasters   IMPORT Jam2, Jam1, DrawModeSet;
  23. FROM Intuition IMPORT
  24.                (* Types *)
  25.            WindowPtr, ScreenPtr, WindowFlags, CustomScreen,
  26.            WindowFlagsSet, IDCMPFlags, IDCMPFlagsSet, Gadget, BoolGadget,
  27.            IntuiText, GadgetTypeSet, GadgetFlagsSet, Border,
  28.            GadgetActivationSet, GadgetActivation, GadgetMutualExcludeSet,
  29.            IntuiMessagePtr, GadgetPtr, StringInfoPtr,
  30.            (* Procedures *)
  31.            OpenWindow, CloseWindow;
  32. FROM RealConversions IMPORT ConvStringToReal, ConvRealToString, Decimal;
  33. FROM Conversions IMPORT ConvStringToNumber, ConvNumberToString;
  34. FROM ChaosUtil IMPORT InitTextItem;
  35.  
  36. CONST
  37.   LeftCol  = 30;
  38.   RightCol = 220;
  39.   BuffSize = 10;
  40.  
  41. TYPE
  42.   PanelGadgetType = (OKGad, CancelGad, aCoeffGad, xIncGad, yIncGad,
  43.                      MaxIterGad, MaxOrbGad, MaxClrGad, ZoomGad);
  44.   Buffer = ARRAY [0..BuffSize-1] OF CHAR;
  45.   Buffp  = POINTER TO Buffer;
  46.  
  47. VAR
  48.   GListPtr : GadgetPtr;
  49.   GadText  : ARRAY [aCoeffGad..ZoomGad] OF IntuiText;
  50.   BuffPtr  : ARRAY [aCoeffGad..ZoomGad] OF Buffp;
  51.  
  52. (*++++++++++++++++++++++++++++++++++++++ *)
  53. (* Initialize and open a window.         *)
  54. PROCEDURE InitWindow (sp : ScreenPtr) : WindowPtr;
  55.   BEGIN
  56.     RETURN
  57.       CreateWindow (0, 12, 320, 188,
  58.                     IDCMPFlagsSet {GadgetUp, GadgetDown},
  59.                     WindowFlagsSet {Activate}, GListPtr, sp,
  60.                 ADR ("Control Panel"));
  61.   END InitWindow;
  62.  
  63. (* +++++++++++++++++++++++++++++++ *)
  64. PROCEDURE SetGadgetValues ();
  65.   BEGIN
  66.     WITH ControlValues DO
  67.       ConvRealToString (a, BuffPtr[aCoeffGad]^, 6, Decimal);
  68.       ConvRealToString (xInc, BuffPtr[xIncGad]^, 6, Decimal);
  69.       ConvRealToString (yInc, BuffPtr[yIncGad]^, 6, Decimal);
  70.       ConvRealToString (ZoomFactor, BuffPtr[ZoomGad]^, 6, Decimal);
  71.       ConvNumberToString (BuffPtr[MaxIterGad]^, LONG(IterPerOrbit), 
  72.                           FALSE, 10, 6, " ");
  73.       ConvNumberToString (BuffPtr[MaxOrbGad]^, LONG(MaxOrbits), 
  74.                           FALSE, 10, 6, " ");
  75.       ConvNumberToString (BuffPtr[MaxClrGad]^, LONG(MaxColors), 
  76.                           FALSE, 10, 6, " ");
  77.     END;
  78.   END SetGadgetValues;
  79.  
  80. (* +++++++++++++++++++++++++++++++ *)
  81. PROCEDURE GetGadgetValues ();
  82.   VAR succ : BOOLEAN; lw : LONGWORD;
  83.   BEGIN
  84.     WITH ControlValues DO
  85.       a := ConvStringToReal (BuffPtr[aCoeffGad]^);
  86.       xInc := ConvStringToReal (BuffPtr[xIncGad]^);
  87.       yInc := ConvStringToReal (BuffPtr[yIncGad]^);
  88.       ZoomFactor := ConvStringToReal  (BuffPtr[ZoomGad]^);
  89.       succ := ConvStringToNumber (BuffPtr[MaxIterGad]^, lw,
  90.                                   FALSE, 10);
  91.       IF succ THEN IterPerOrbit := INTEGER(lw) END;
  92.       succ := ConvStringToNumber (BuffPtr[MaxOrbGad]^, lw,
  93.                                   FALSE, 10);
  94.       IF succ THEN MaxOrbits := INTEGER(lw) END;
  95.       succ := ConvStringToNumber (BuffPtr[MaxClrGad]^, lw,
  96.                                   FALSE, 10);
  97.       IF succ THEN MaxColors := INTEGER(lw) END;
  98.  
  99.     END;
  100.   END GetGadgetValues;
  101.  
  102. (* +++++++++++++++++++++++++++++++ *)
  103. PROCEDURE ProcessGadgets (gptr : GadgetPtr; VAR quit : BOOLEAN);
  104.   BEGIN
  105.     CASE PanelGadgetType (gptr^.GadgetID) OF
  106.       OKGad:  
  107.         GetGadgetValues ();
  108.         quit := TRUE;  |
  109.       CancelGad:
  110.         quit := TRUE;
  111.     END; (* CASE *)
  112.   END ProcessGadgets;
  113.  
  114. (* +++++++++++++++++++++++++++++++ *)
  115. (* Open a window with some gadgets *)
  116. PROCEDURE ControlPanel (sp : ScreenPtr);
  117.   VAR
  118.     wp : WindowPtr;
  119.     class  : IDCMPFlagsSet;
  120.     msgptr : IntuiMessagePtr;
  121.     gptr : GadgetPtr;
  122.     quit : BOOLEAN;
  123.   BEGIN
  124.     SetGadgetValues ();
  125.     quit := FALSE;
  126.     wp := InitWindow (sp);
  127.     (* Now wait for gadget messages *)
  128.     REPEAT
  129.       msgptr := WaitPort (wp^.UserPort^);
  130.       LOOP
  131.         msgptr := GetMsg (wp^.UserPort^);
  132.         IF msgptr = NIL THEN EXIT END;
  133.         class := msgptr^.Class; gptr := msgptr^.IAddress;        
  134.         ReplyMsg (MessagePtr (msgptr));
  135.     IF class = IDCMPFlagsSet {GadgetUp} THEN
  136.           ProcessGadgets (gptr, quit);      
  137.     END;
  138.       END; (* LOOP *)
  139.     UNTIL quit;
  140.     CloseWindow (wp^)
  141.   END ControlPanel;
  142.  
  143. (* ++++++++++++++++++++++++++++++++++++++++ *)
  144. PROCEDURE InitStringGad (gad : PanelGadgetType; text : ADDRESS;
  145.                          L, T : INTEGER);
  146.   VAR
  147.     sp : StringInfoPtr;
  148.   BEGIN
  149.     AddGadgetString (L, T, BuffSize-1, BuffSize, NIL);
  150.     InitTextItem (GadText[gad], text, 0, -10);
  151.     LastGadget^.GadgetText := ADR(GadText[gad]);
  152.     (* Now get the pointer to the buffer *)
  153.     sp := LastGadget^.SpecialInfo;
  154.     BuffPtr[gad] := sp^.Buffer;
  155.   END InitStringGad;
  156.  
  157. (* ++++++++++++++++++++++++++++++++++++++++ *)
  158. PROCEDURE SetUpPanelGadgets ();
  159.   BEGIN
  160.     BeginGadgetList ();
  161.     AddGadgetTextButton (RightCol, 160, ADR("  OK  "));
  162.     AddGadgetTextButton (LeftCol,  160, ADR("Cancel"));    
  163.     InitStringGad (aCoeffGad, ADR('"A" coeff'), LeftCol, 40);
  164.     InitStringGad (xIncGad, ADR('"X" inc'), LeftCol, 75);
  165.     InitStringGad (yIncGad, ADR('"Y" inc'), LeftCol, 110);
  166.     InitStringGad (MaxIterGad, ADR('Iter/Orbit'), RightCol, 40);
  167.     InitStringGad (MaxOrbGad, ADR(' Orbits'), RightCol, 75);
  168.     InitStringGad (MaxClrGad,  ADR(' Colors'), RightCol, 110);
  169.     InitStringGad (ZoomGad,  ADR('Zoom Factor'), 
  170.                    (LeftCol+RightCol) DIV 2, 140);
  171.     (* Adjust the text slightly for the ZOOM factor gadget *)
  172.     GadText[ZoomGad].LeftEdge := -6;
  173.     GListPtr := EndGadgetList ();
  174.   END SetUpPanelGadgets;
  175.  
  176. (* ++++++++++++++++++++++++++++++++++++++++ *)
  177. PROCEDURE CleanUpPanelGadgets ();
  178.   BEGIN
  179.     FreeGadgetList (GListPtr^);
  180.   END CleanUpPanelGadgets;
  181.  
  182. BEGIN
  183.   (* Put in some initial values *)
  184.   WITH ControlValues DO
  185.     a := 1.5732;
  186.     xInc := 0.02; yInc := 0.02;
  187.     ZoomFactor := 1.0;
  188.     IterPerOrbit := 1000;
  189.     MaxOrbits := 100;
  190.     MaxColors := 15;
  191.   END;
  192. END ChaosPanel.
  193.