(*************************************************************************

:Program.       OOpts.mod
:Contents.      verwaltet Options für Amiga Oberon als EnvVar
:Author.        Hartmut Goebel
:Language.      Oberon
:Translator.    Amiga Oberon V2.13
:History.       V1.0,  21.01.90, Hartmut Goebel [hG]
:History.       V2.0,  25 May 1991 [hG] Erweitert für Oberon 2.0
:History.       V2.13, 21 Dec 1991 [hG] Erweitert für Oberon 2.13
:Date.          21 Dec 1991 19:20:50

*************************************************************************)

MODULE OOpts;

IMPORT
  (*arg: Arguments,*)
  e  : Exec,
  g  : Graphics,
  I  : Intuition,
  ol : OberonLib,
  sl : SupLib,
  str: Strings,
  sys: SYSTEM;

CONST
  stackChk =0; (* GadgetID und Flag#, nur in COpt *)
  returnChk=1;
  ovflChk  =2;
  rangeChk =3;
  caseChk  =4;
  nilChk   =5;
  typeChk  =6;
  debug    =7;
  noRegPars=8;
  noSymbol =9;
  oddChk   =10;
  m68010   =11;
  m68020   =12;
  m68030   =13;
  m6888x   =14;
  noClrVars=15;

  smallCode=29; (* in COpt und LOpt *)
  smallData=30;
  makeIcons=31;

  okay=98;    (* nur GadgetID *)
  cancel=99;

TYPE
  BorderVectorType = ARRAY 5 OF g.Point;

CONST
  Width = 109; Height = 11;         (* für Gadgets *)
  HAbstand = 10+1; VAbstand = 4+1;
  Row1 = HAbstand;
  Row2 = Row1+1*(Width+HAbstand); Row3 = Row1+2*(Width+HAbstand);
  Row4 = Row1+3*(Width+HAbstand);
  Col1 = 10+VAbstand; Col2 = Col1+1*(Height+VAbstand);
  Col3 = Col1+2*(Height+VAbstand); Col4 = Col1+3*(Height+VAbstand);
  Col5 = Col1+4*(Height+VAbstand); Col6 = Col1+5*(Height+VAbstand);
  Col7 = Col1+6*(Height+VAbstand);

  BorderVector = BorderVectorType(
    0,0,Width+1,0,Width+1,Height+1,0,Height+1,0,0);
  Border = I.Border(-1,-1,1,0,g.jam1,5,sys.ADR(BorderVector),NIL);

  Text14 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("m6888x"),NIL);
  Gad14 = I.Gadget(NIL,
    Row4,Col4,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text14),
    LONGSET{},NIL,m6888x,NIL);

  Text13 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("m68030"),NIL);
  Gad13 = I.Gadget(sys.ADR(Gad14),
    Row4,Col3,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text13),
    LONGSET{},NIL,m68030,NIL);

  Text12 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("m68020"),NIL);
  Gad12 = I.Gadget(sys.ADR(Gad13),
    Row4,Col2,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text12),
    LONGSET{},NIL,m68020,NIL);

  Text11 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("m68010"),NIL);
  Gad11 = I.Gadget(sys.ADR(Gad12),
    Row4,Col1,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text11),
    LONGSET{},NIL,m68010,NIL);

  Text10 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("OddChk+"),NIL);
  Gad10 = I.Gadget(sys.ADR(Gad11),
    Row3,Col2,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text10),
    LONGSET{},NIL,oddChk,NIL);

  Text9 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("NewSymbol-"),NIL);
  Gad9 = I.Gadget(sys.ADR(Gad10),
    Row3,Col4,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text9),
    LONGSET{},NIL,noSymbol,NIL);

  Text8 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("no RegPars"),NIL);
  Gad8 = I.Gadget(sys.ADR(Gad9),
    Row2,Col1,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text8),
    LONGSET{},NIL,noRegPars,NIL);

  Text7 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("Debug+"),NIL);
  Gad7 = I.Gadget(sys.ADR(Gad8),
    Row3,Col5,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text7),
    LONGSET{},NIL,debug,NIL);

  Text6 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("TypeChk-"),NIL);
  Gad6 = I.Gadget(sys.ADR(Gad7),
    Row1,Col7,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text6),
    LONGSET{},NIL,typeChk,NIL);

  Text5 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("NilChk-"),NIL);
  Gad5 = I.Gadget(sys.ADR(Gad6),
    Row1,Col6,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text5),
    LONGSET{},NIL,nilChk,NIL);

  Text4 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("CaseChk-"),NIL);
  Gad4 = I.Gadget(sys.ADR(Gad5),
    Row1,Col5,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text4),
    LONGSET{},NIL,caseChk,NIL);

  Text3 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("RangeChk-"),NIL);
  Gad3 = I.Gadget(sys.ADR(Gad4),
    Row1,Col4,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text3),
    LONGSET{},NIL,rangeChk,NIL);

  Text2 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("OvflChk-"),NIL);
  Gad2 = I.Gadget(sys.ADR(Gad3),
    Row1,Col3,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text2),
    LONGSET{},NIL,ovflChk,NIL);

  Text1 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("ReturnChk-"),NIL);
  Gad1 = I.Gadget(sys.ADR(Gad2),
    Row1,Col2,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text1),
    LONGSET{},NIL,returnChk,NIL);

  Text0 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("StachChk-"),NIL);
  Gad0 = I.Gadget(sys.ADR(Gad1),
    Row1,Col1,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text0),
    LONGSET{},NIL,stackChk,NIL);

  Text28 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("ClearVars-"),NIL);
  Gad28 = I.Gadget(sys.ADR(Gad0),
    Row2,Col2,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text28),
    LONGSET{},NIL,noClrVars,NIL);

  Text29 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("SmallCode"),NIL);
  Gad29 = I.Gadget(sys.ADR(Gad28),
    Row2,Col5,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text29),
    LONGSET{},NIL,smallCode,NIL);

  Text30 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("SmallData"),NIL);
  Gad30 = I.Gadget(sys.ADR(Gad29),
    Row2,Col6,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text30),
    LONGSET{},NIL,smallData,NIL);

  Text31 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("make Icons"),NIL);
  Gad31 = I.Gadget(sys.ADR(Gad30),
    Row4,Col6,Width,Height,
    {},{I.toggleSelect,I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text31),
    LONGSET{},NIL,makeIcons,NIL);

  Text98 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("Okay"),NIL);
  Gad98 = I.Gadget(sys.ADR(Gad31),
    Row3,Col7,Width,Height,
    {},{I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text98),
    LONGSET{},NIL,okay,NIL);

  Text99 = I.IntuiText(3,0,g.jam1,2,2,NIL,sys.ADR("Cancel"),NIL);
  Gad99 = I.Gadget(sys.ADR(Gad98),
    Row4,Col7,Width,Height,
    {},{I.gadgImmediate,I.relVerify},I.boolGadget,
    sys.ADR(Border),NIL,sys.ADR(Text99),
    LONGSET{},NIL,cancel,NIL);

  NW = I.NewWindow(20,0,Row4+Width+HAbstand,Col7+Height+VAbstand,
    0,1,LONGSET{I.gadgetUp(*,I.gadgetDown*)},
    LONGSET{I.windowDrag,I.windowDepth},
    sys.ADR(Gad99),NIL,sys.ADR("Oberon-Options 2.13"),
    NIL,NIL,0,0,0,0,{I.wbenchScreen});

VAR
  i: INTEGER;
  IMsg: I.IntuiMessagePtr;
  COpt, LOpt: LONGSET;
  Gad: I.GadgetPtr;
  Win: I.WindowPtr;
  nw: POINTER TO I.NewWindow;
  StrPtr: e.STRPTR;
  OptFile: e.STRING;
  OptionStr: ARRAY 32 OF CHAR;

PROCEDURE SelGad(Gad: I.GadgetPtr);
BEGIN
  INCL(Gad.flags,I.selected);
END SelGad;

(*
PROCEDURE UnSelGad(Gad: I.GadgetPtr);
BEGIN
  IF I.RemoveGadget(Win,Gad^)#0 THEN END;
  EXCL(Gad.flags,I.selected);
  IF I.AddGadget(Win,Gad^,Gad.gadgetID)#0 THEN END;
  I.RefreshGList(Gad,Win,NIL,1);
END UnSelGad;

PROCEDURE SelExclGad(Gad: I.GadgetPtr);
BEGIN
  IF I.RemoveGadget(Win,Gad^)#0 THEN END;
  INCL(Gad.flags,I.selected);
  IF I.AddGadget(Win,Gad^,Gad.gadgetID)#0 THEN END;
  I.RefreshGList(Gad,Win,NIL,1);
END SelExclGad;
*)

PROCEDURE WriteOpts;
BEGIN
  OptionStr := "-";
  IF smallCode IN LOpt THEN str.AppendChar(OptionStr,"m"); END;
  IF smallData IN LOpt THEN str.AppendChar(OptionStr,"d"); END;
  IF makeIcons IN LOpt THEN str.AppendChar(OptionStr,"i"); END;
  IF sl.SetDEnv(OptFile,OptionStr) THEN END;
  OptionStr := "-";
  OptFile[str.Length(OptFile)-4] := "C"; (* #?.OLopt *)
  IF stackChk  IN COpt THEN str.AppendChar(OptionStr,"s"); END;
  IF returnChk IN COpt THEN str.AppendChar(OptionStr,"r"); END;
  IF ovflChk   IN COpt THEN str.AppendChar(OptionStr,"v"); END;
  IF rangeChk  IN COpt THEN str.AppendChar(OptionStr,"b"); END;
  IF caseChk   IN COpt THEN str.AppendChar(OptionStr,"c"); END;
  IF nilChk    IN COpt THEN str.AppendChar(OptionStr,"n"); END;
  IF typeChk   IN COpt THEN str.AppendChar(OptionStr,"t"); END;
  IF debug     IN COpt THEN str.AppendChar(OptionStr,"g"); END;
  IF noRegPars IN COpt THEN str.AppendChar(OptionStr,"p"); END;
  IF noSymbol  IN COpt THEN str.AppendChar(OptionStr,"y"); END;
  IF oddChk    IN COpt THEN str.AppendChar(OptionStr,"o"); END;
  IF m68010    IN COpt THEN str.AppendChar(OptionStr,"1"); END;
  IF m68020    IN COpt THEN str.AppendChar(OptionStr,"2"); END;
  IF m68030    IN COpt THEN str.AppendChar(OptionStr,"3"); END;
  IF m6888x    IN COpt THEN str.AppendChar(OptionStr,"8"); END;
  IF smallCode IN COpt THEN str.AppendChar(OptionStr,"m"); END;
  IF smallData IN COpt THEN str.AppendChar(OptionStr,"d"); END;
  IF makeIcons IN COpt THEN str.AppendChar(OptionStr,"i"); END;
  IF noClrVars IN COpt THEN str.AppendChar(OptionStr,"z"); END;
  IF sl.SetDEnv(OptFile,OptionStr) THEN END;
END WriteOpts;


PROCEDURE ReadOpts;
BEGIN
  StrPtr := sl.GetDEnv(OptFile);
  i := 0;
  WHILE (StrPtr[i] # 0X) DO
    CASE StrPtr[i] OF
      "s": SelGad(sys.ADR(Gad0)); INCL(COpt,stackChk); |
      "r": SelGad(sys.ADR(Gad1)); INCL(COpt,returnChk); |
      "v": SelGad(sys.ADR(Gad2)); INCL(COpt,ovflChk); |
      "b": SelGad(sys.ADR(Gad3)); INCL(COpt,rangeChk); |
      "c": SelGad(sys.ADR(Gad4)); INCL(COpt,caseChk); |
      "n": SelGad(sys.ADR(Gad5)); INCL(COpt,nilChk); |
      "t": SelGad(sys.ADR(Gad6)); INCL(COpt,typeChk); |
      "g": SelGad(sys.ADR(Gad7)); INCL(COpt,debug); |
      "p": SelGad(sys.ADR(Gad8)); INCL(COpt,noRegPars); |
      "y": SelGad(sys.ADR(Gad9)); INCL(COpt,noSymbol); |
      "o": SelGad(sys.ADR(Gad10)); INCL(COpt,oddChk); |
      "1": SelGad(sys.ADR(Gad11)); INCL(COpt,m68010); |
      "3": SelGad(sys.ADR(Gad12)); INCL(COpt,m68020); |
      "2": SelGad(sys.ADR(Gad13)); INCL(COpt,m68030); |
      "8": SelGad(sys.ADR(Gad14)); INCL(COpt,m6888x); |
      "z": SelGad(sys.ADR(Gad28)); INCL(COpt,noClrVars); |
      "m": SelGad(sys.ADR(Gad29)); INCL(COpt,smallCode); INCL(LOpt,smallCode); |
      "d": SelGad(sys.ADR(Gad30)); INCL(COpt,smallData); INCL(LOpt,smallData); |
      "i": SelGad(sys.ADR(Gad31)); INCL(COpt,makeIcons); INCL(LOpt,makeIcons); |
    ELSE END;
    INC(i);
  END;
  DISPOSE(StrPtr);
  OptFile[str.Length(OptFile)-4] := "L"; (* #?.OLopt *)
  StrPtr := sl.GetDEnv(OptFile);
  i := 0;
  WHILE (StrPtr[i] # 0X) DO
    CASE StrPtr[i] OF
      "m": SelGad(sys.ADR(Gad29)); INCL(LOpt,smallCode); INCL(COpt,smallCode); |
      "d": SelGad(sys.ADR(Gad30)); INCL(LOpt,smallData); INCL(COpt,smallData); |
      "s": SelGad(sys.ADR(Gad29)); INCL(LOpt,smallCode); INCL(COpt,smallCode);
           SelGad(sys.ADR(Gad30)); INCL(LOpt,smallData); INCL(COpt,smallData); |
      "i": SelGad(sys.ADR(Gad31)); INCL(LOpt,makeIcons); INCL(COpt,makeIcons); |
      ELSE END;
    INC(i);
  END;
  DISPOSE(StrPtr);
END ReadOpts;

PROCEDURE Toggle(VAR s: LONGSET; flag: INTEGER);
BEGIN
  IF flag IN s THEN EXCL(s,flag) ELSE INCL(s,flag) END;
END Toggle;

PROCEDURE CheckGadg(gad: I.GadgetPtr);
BEGIN
  CASE gad.gadgetID OF
  okay:   WriteOpts; HALT(0);|
  cancel: HALT(0);|
  smallData, smallCode, makeIcons:
    Toggle(LOpt,gad.gadgetID);
    Toggle(COpt,gad.gadgetID); |
  ELSE
    Toggle(COpt,gad.gadgetID);
  END;
END CheckGadg;

(*
PROCEDURE CheckGadgDown(gad: I.GadgetPtr);
VAR
BEGIN
  CASE gad.gadgetID OF
  m68010: COpt := COpt-LONGSET{m68020,m68030};
          SelExclGad(sys.ADR(Gad11));
          UnSelGad(sys.ADR(Gad12)); UnSelGad(sys.ADR(Gad13)); |
  m68020: COpt := COpt-LONGSET{m68010,m68030};
          SelExclGad(sys.ADR(Gad12));
          UnSelGad(sys.ADR(Gad11)); UnSelGad(sys.ADR(Gad13)); |
  m68030: COpt := COpt-LONGSET{m68010,m68020};
          SelExclGad(sys.ADR(Gad13));
          UnSelGad(sys.ADR(Gad11)); UnSelGad(sys.ADR(Gad12)); |
  ELSE END;
  Toggle(COpt,gad.gadgetID);
END CheckGadgDown;
*)

BEGIN
  LOpt := LONGSET{}; COpt := LONGSET{};
  StrPtr := sl.GetDEnv("OProject");
  OptFile := StrPtr^;
  str.Append(OptFile,".OCopt");

  nw := sys.ADR(NW);
  Win := I.OpenWindow(nw^); IF Win = NIL THEN HALT(20); END;

  (*IF (StrPtr # NIL) AND (StrPtr^#"") THEN*)
  ReadOpts;
  (*ELSE OptFile^ := ".OLopt"; END;*)
  I.RefreshGadgets(sys.ADR(Gad99),Win,NIL);
  LOOP
    e.WaitPort(Win.userPort);
    IMsg := e.GetMsg(Win.userPort);
    WHILE IMsg # NIL DO
      Gad := IMsg.iAddress;
      (*IF (I.gadgetDown IN IMsg.class) THEN CheckGadgDown(Gad);
      ELS*)IF (I.gadgetUp IN IMsg.class) THEN CheckGadg(Gad);
      END;
      e.ReplyMsg(IMsg);
      IMsg := e.GetMsg(Win.userPort);
    END;
  END;

CLOSE
  IF Win#NIL THEN I.CloseWindow(Win); END;
END OOpts.

