(******************************************************************************)
(*
	PROGRAMMNAME :	Meldung.mod
        VERSION      :  1.00
        
        AUTOR  :	Ralf Kaiser
        		Winckelmanstraße 1
                        5600 Wuppertal 2
                        0202/59 28 10
                        
        Start  :	29.11.88
	Update :	10-12-88
        Ende   :	


Diese Routine dient dazu, Meldungen an den Benutzer ansprechend auf den
Bildschirm zu bringen. Die Meldung wird als ARRAY OF CHAR an die Routine
uebergeben. Dabei dient der Oderstrich "|" als Zeilentrenner. Folgende
Meldung :
Das|ist ein |Test
würde also so auf den Bildschirm gebracht  :
Das
ist ein
Test

Die Meldung wird in einem borderless-Window, das genau in der Mitte des 
Workbenchscreens erscheint, dargestellt.
Dem Window wird dabei durch zeichnen eines zweifarbigen Randes ein 
3D-Effekt verliehen.

Zusätzlich läßt sich noch eine Zeitspanne angeben, nach der das Fenster
geschloßen wird und der Programmablauf fortgesetzt wird. Diese Zeitspanne
wird als INTEGER-Wert, der die Dauer in Ticks (1 Tick = 1/50 sek.) an-
giebt, definiert.

*)
(******************************************************************************)

IMPLEMENTATION MODULE Meldung;

FROM SYSTEM IMPORT
 ADR, BYTE;
 
FROM Arts IMPORT
 BreakPoint, Assert, TermProcedure;
 
FROM Strings IMPORT
 Delete, Insert, Length, Occurs, Copy, first, last;

FROM DOS IMPORT
 Delay;
 
FROM Intuition IMPORT
 NewScreen, NewWindow, WindowPtr, ScreenPtr, OpenScreen, OpenWindow,
 ScreenFlags, ScreenFlagSet, customScreen, WindowFlags, IDCMPFlagSet,
 WindowFlagSet, CloseWindow, CloseScreen, ShowTitle;
 
FROM Graphics IMPORT
 Text, RastPortPtr, Move, ViewModes, ViewModeSet, Draw, ScrollRaster,
 SetAPen, SetRast, DrawModes, DrawModeSet, SetDrMd, jam1;
 
FROM IntuiStruct IMPORT
 StructWindow;

            
PROCEDURE ShowMeldung (win: WindowPtr; 
                       Mtext : ARRAY OF CHAR; Zeit: INTEGER);

BEGIN
Laenge := Length (Mtext);    laengste := 0;               
Zaehler := 0;    ZeilenNr := 0;     
FOR Temp := 0 TO 10 DO
 Delete (Zeile [Temp], 0, 80);
 Zeilenlaenge [Temp] := 0;
END;

WHILE Zaehler # Laenge DO
 Zeichen [0] := Mtext [Zaehler];
 IF Zeichen[0] = "|" THEN
  INC (ZeilenNr);
  INC (Zaehler);
 ELSE
  Insert (Zeile [ZeilenNr], -1, Zeichen);
  INC (Zaehler);
  INC (Zeilenlaenge [ZeilenNr]);
 END;
END;

Zaehler := 0;    laengste := Length (Zeile [0]);
LOOP
 Temp := Length (Zeile [Zaehler]);
 IF laengste < Temp THEN laengste := Temp END;
 INC (Zaehler);
 IF Zaehler > ZeilenNr THEN EXIT; END;
END;

(*    Aufbau der NewWindow-Struktur   *)

 Mheight := ZeilenNr * 8 + 20;
 Mwidth  := laengste*8 + 32;
 
 Mtop := 256 DIV 2 - Mheight DIV 2;
 Mleft := 640 DIV 2 - Mwidth DIV 2;
 
StructWindow (nw, Mleft, Mtop, Mwidth, Mheight, 0, 1, IDCMPFlagSet{},
              WindowFlagSet{gimmeZeroZero, borderless}, NIL,
              NIL, ScreenFlagSet{wbenchScreen}); 

win := OpenWindow (nw);
Assert (win # NIL, ADR("Sorry, no Window ..."));

rp := win^.rPort;
SetRast (rp,3);
SetDrMd (rp, DrawModeSet{complement});
SetAPen (rp,1);
SetDrMd (rp, jam1);
Move (rp, 0, 0);
Draw (rp, win^.width-1, 0);
Draw (rp, win^.width-1, win^.height-1);
SetAPen (rp, 2);
Draw (rp, 0, win^.height-1);
Draw (rp, 0, 1);
SetAPen (rp, 1);

FOR Zaehler := 0 TO ZeilenNr DO
 Move (rp, 16, ((Zaehler * 8) + 3) + 10);
 Text (rp, ADR(Zeile [Zaehler]), Length (Zeile [Zaehler]));
END;
Delay (Zeit);
CloseWindow (win);
END ShowMeldung;

PROCEDURE Cleanup;
BEGIN
IF win # NIL THEN CloseWindow (win);  END;
win := NIL;
END Cleanup;

BEGIN

TermProcedure (Cleanup);

END Meldung.
