(* ------------------------------------------------------------------------
  :Program.       ProTools
  :Contents.      displays a progress indicator
  :Author.        André Schenk [as]
  :Address.       Snail-Mail:              E-Mail:
  :Address.       Tapachstraße 97 C        2:244/90.4@fidonet
  :Address.       D-7000 Stuttgart 40      
  :History.       v1.0 [as] 25-Apr-93 (started written history)
  :Language.      Oberon
  :Translator.    AMIGA OBERON v3.00d
  :Remark.        Thanks to Kai Bolay
------------------------------------------------------------------------ *)
MODULE ProTools;

IMPORT
  c0 := Conversions0,
  d  := Dos,
  f  := FontSupport,
  g  := Graphics,
  G  := GadTools,
  I  := Intuition,
  s  := Strings,
  u  := Utility;

VAR
  PIWindow                 : I.WindowPtr;
  PIVInfo                  : G.VisualInfo;
  Left, Top, Width, Height : INTEGER; (* Begrenzungen der Bevelbox *)

PROCEDURE QuitPI *;
BEGIN
  IF PIWindow # NIL THEN I.CloseWindow (PIWindow);   PIWindow := NIL END;
  IF PIVInfo  # NIL THEN G.FreeVisualInfo (PIVInfo); PIVInfo  := NIL END;
  f.CloseFont
END QuitPI;

PROCEDURE OpenPI * (Screen : I.ScreenPtr; Text : ARRAY OF CHAR);
(* öffnet das Progress-Indicator-Fenster *)
VAR MyWindow : I.NewWindow;

  PROCEDURE InitPIWindow;
  BEGIN
    MyWindow.width       := Screen^.width DIV 2;
    MyWindow.height      := 5 * f.Fonthoehe;
    MyWindow.leftEdge    := (Screen^.width  - MyWindow.width)  DIV 2;
    MyWindow.topEdge     := (Screen^.height - MyWindow.height) DIV 2;
    MyWindow.idcmpFlags  := LONGSET {};
    MyWindow.flags       := LONGSET {I.borderless};
    MyWindow.detailPen   := 0;
    MyWindow.blockPen    := 1;
    MyWindow.firstGadget := NIL;
    MyWindow.checkMark   := NIL;
    MyWindow.title       := NIL;
    MyWindow.screen      := Screen;
    MyWindow.bitMap      := NIL;
    MyWindow.type        := {I.publicScreen}
  END InitPIWindow;

BEGIN
  IF Screen = NIL THEN RETURN END;
  IF PIWindow = NIL THEN
    IF Screen^.font # NIL THEN
      f.OpenFont (Screen^.font^.name^, Screen^.font^.ySize)
    END;
    InitPIWindow;
    PIWindow := I.OpenWindowTags (MyWindow, u.done);
    IF PIWindow # NIL THEN
      PIVInfo := G.GetVisualInfo (Screen, u.done);
      IF PIVInfo # NIL THEN
        (* -------------------- großen Rahmen zeichnen ---------------------- *)
        G.DrawBevelBox (PIWindow^.rPort,   PIWindow^.borderLeft,  PIWindow^.borderTop,
                        PIWindow^.width  - PIWindow^.borderLeft - PIWindow^.borderRight,
                        PIWindow^.height - PIWindow^.borderTop  - PIWindow^.borderBottom,
                        G.visualInfo, PIVInfo, u.done);
        (* ---------------------- Screenfont einstellen ----------------------*)
        g.SetFont (PIWindow^.rPort, f.Diskfont);
        (* ------------------ Text über den Balken schreiben ---------------- *)
        g.Move (PIWindow^.rPort,
                (PIWindow^.width - g.TextLength (PIWindow^.rPort, Text,
                                                 s.Length (Text)))      DIV 2,
                PIWindow^.borderTop + 3 * f.Fonthoehe DIV 2);
        g.SetAPen (PIWindow^.rPort, 1);
        g.Text (PIWindow^.rPort, Text, s.Length (Text));
        (* -------- Begrenzungen für den Rahmen des Balkens bestimmen ------- *)
        Left   := PIWindow^.borderLeft + 20;
        Top    := PIWindow^.borderTop  + 2 * f.Fonthoehe;
        Width  := PIWindow^.width - Left - PIWindow^.borderRight - 20;
        Height := f.Fonthoehe;
        (* -------------------- kleinen Rahmen zeichnen --------------------- *)
        G.DrawBevelBox (PIWindow^.rPort, Left, Top, Width, Height,
                        G.visualInfo, PIVInfo, G.bbRecessed, I.LTRUE, u.done);
        (* ---------------------- Markierung zeichnen ----------------------- *)
        g.RectFill (PIWindow^.rPort, Left,                   Top + Height, Left + 1,                   Top + Height + 1);
        g.RectFill (PIWindow^.rPort, Left + Width DIV 4,     Top + Height, Left + Width DIV 4 + 1,     Top + Height + 1);
        g.RectFill (PIWindow^.rPort, Left + Width DIV 2,     Top + Height, Left + Width DIV 2 + 1,     Top + Height + 1);
        g.RectFill (PIWindow^.rPort, Left + 3 * Width DIV 4, Top + Height, Left + 3 * Width DIV 4 + 1, Top + Height + 1);
        g.RectFill (PIWindow^.rPort, Left + Width - 2,       Top + Height, Left + Width - 1,           Top + Height + 1)
      END
    END
  END
END OpenPI;

PROCEDURE UpdatePI * (min, max : LONGINT);
(* zeichnet den Balken *)
VAR Prozent : ARRAY 6 OF CHAR;
BEGIN
  IF (max = 0) OR (PIWindow = NIL) OR (PIVInfo = NIL) THEN RETURN END;
  (* ---------------------------- Balken zeichnen --------------------------- *)
  g.SetAPen (PIWindow^.rPort, 3);
  g.RectFill (PIWindow^.rPort, Left + 2, Top + 1,
                               SHORT (Left + min * (Width - 3) DIV max),
                               Top + Height - 2);
  (* ----------------- Prozentwert unter den Balken schreiben --------------- *)
  IF c0.ValToStr (min * 100 DIV max, Prozent, 1) THEN
    s.Append (Prozent, " %");
    g.Move (PIWindow^.rPort,
            (PIWindow^.width - g.TextLength (PIWindow^.rPort, Prozent,
                                             s.Length (Prozent)))      DIV 2,
            Top + 5 * f.Fonthoehe DIV 2);
    g.SetAPen (PIWindow^.rPort, 1);
    g.Text (PIWindow^.rPort, Prozent, s.Length (Prozent))
  END;
  IF min = max THEN d.Delay (25); QuitPI END
END UpdatePI;

BEGIN
  PIWindow := NIL; PIVInfo := NIL
CLOSE
  QuitPI
END ProTools.
