(*-------------------------------------------------------------------------*)
(*                                                                         *)
(*  Amiga Oberon Library Module: Requests             Date: 02-Nov-92      *)
(*                                                                         *)
(*   © 1991 by Fridtjof Siebert                                            *)
(*                                                                         *)
(*-------------------------------------------------------------------------*)

MODULE Requests;

IMPORT sys := SYSTEM,
       str := Strings,
       I*  := Intuition,
       arg := Arguments,
       ol  := OberonLib,
              Exec,
              Dos,
       g   := Graphics;



PROCEDURE RequestWin*(head,msg,pos,neg: ARRAY OF CHAR; win: I.WindowPtr): BOOLEAN; (* $CopyArrays- *)
(* erzeugt Retry/Cancel Request.

    Beispiel:
     IF Request("MyProgram:", "What shall I do?",
                "Retry", "Abort",mywindow) THEN Retry
                                           ELSE Abort END;


  pos kann "" sein, dann wird das entsprechende Gadget weggelassen.

*)

VAR
  c: CHAR;
  body,text,ok,cl: I.IntuiText;
  okadr,cladr: I.IntuiTextPtr;
  width,w: INTEGER;
  scrn: I.ScreenPtr;

BEGIN
  body.frontPen := 0;
  body.backPen  := 1;
  body.drawMode := g.jam2;
  body.leftEdge := 12;
  body.topEdge  := 8;
  body.iTextFont:= NIL;
  body.nextText := NIL;
  text := body; ok := body;
  body.iText    := sys.ADR(head);
  body.nextText := sys.ADR(text);
  text.iText    := sys.ADR(msg); text.topEdge := 22;
  ok.leftEdge:= 6;
  ok.topEdge := 3; cl := ok;
  ok.iText := sys.ADR(pos);
  cl.iText := sys.ADR(neg);
  okadr := sys.ADR(ok);
  IF pos[0]=0X THEN okadr := NIL END;
  IF I.int.libNode.version<36 THEN
    width := SHORT(str.Length(head));
    w     := SHORT(str.Length(msg ));
    IF w>width THEN width := w END;
    width := width*8+80;
    IF width<320 THEN width := 320 END;
  ELSE
    IF win#NIL THEN scrn := win.wScreen;
               ELSE scrn := I.LockPubScreen(NIL) END;
    IF scrn#NIL THEN
      text.topEdge := scrn.font.ySize+14;
      IF win=NIL THEN I.UnlockPubScreen(NIL,scrn) END;
    END;
  END;
  RETURN I.AutoRequest(win,sys.ADR(body),okadr,sys.ADR(cl),LONGSET{},LONGSET{},width,69);
END RequestWin;


PROCEDURE Request*(head,msg,pos,neg: ARRAY OF CHAR): BOOLEAN; (* $CopyArrays- *)
BEGIN
  RETURN RequestWin(head,msg,pos,neg,NIL);
END Request;


(*-------------------------------------------------------------------------*)


PROCEDURE Assert*(cc: BOOLEAN; msg: ARRAY OF CHAR);  (* $CopyArrays- *)
(* bricht Programm mit der Meldung msg ab, wen cc nicht erfüllt ist.
   Beispiel:

    NEW(p); Assert(p#NIL,"Kein Speicher!");
*)

VAR
  myname: ARRAY 80 OF CHAR;

BEGIN
  IF ~ cc THEN
    IF ol.wbStarted THEN
      arg.GetArg(0,myname);
      IF str.Length(myname)<80 THEN str.AppendChar(myname,":") END;
      IF Request(myname,msg,"","Cancel") THEN END;
    ELSE
      IF Dos.Write(Dos.Output(),"\n",1)=0 THEN END;
      IF Dos.Write(Dos.Output(),msg,str.Length(msg))=0 THEN END;
      IF Dos.Write(Dos.Output(),"\n",1)=0 THEN END;
    END;
    HALT(20);
  END;
END Assert;


(*-------------------------------------------------------------------------*)


PROCEDURE Fail*(msg: ARRAY OF CHAR);  (* $CopyArrays- *)
(* bricht Programm mit der Meldung msg ab.
   Beispiel:

    NEW(p); Assert(p#NIL,"Kein Speicher!");
*)

BEGIN
  Assert(FALSE,msg);
END Fail;


(*-------------------------------------------------------------------------*)


PROCEDURE BreakPoint*(msg: ARRAY OF CHAR); (* $CopyArrays- *)

BEGIN
  IF ~ Request("Oberon Breakpoint:",msg,"CONTINUE","HALT") THEN HALT(10) END;
END BreakPoint;


(*-------------------------------------------------------------------------*)


PROCEDURE OOM;
VAR
  thisCommand : ARRAY 40 OF CHAR;

BEGIN
  arg.GetArg(0,thisCommand);
  (* $IF English *)
    IF ~ Request(thisCommand,"Out of memory!",
                             " Retry "," Cancel ") THEN HALT(20) END;
  (* $ELSE *)
    IF ~ Request(thisCommand,"Speichermangel",
                             " Nochmal versuchen "," Abbruch ") THEN HALT(20) END;
  (* $END *)
END OOM;


(*-------------------------------------------------------------------------*)


BEGIN
  ol.OutOfMemHandler := OOM;
END Requests.









