home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
EFFO
/
forum8.lzh
/
PROGRAMME
/
MODULA
/
WINDOW
/
area2.mod
< prev
next >
Wrap
Text File
|
1989-01-19
|
10KB
|
266 lines
(*
-------------------------------------------------------------------------------
@@@@@@@@@@@@@@@@@@@*) IMPLEMENTATION MODULE Area2; (*@@@@@@@@@@@@@@@@@@@@@@
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
| Kurzbeschreibung | Verwaltung von Doppelfenstern: oben ein separates |
| | Fenster fuer Titel etc. |
---------------------+---------------------------------------------------------
| Programm - Version | 1.1 | Text - Version | V#005 |
---------------------+--------+-------------------------+----------------------
| Modulholder | WS | Urversion | WS | Januar 89 |
---------------------+---------------------------------------------------------
| System - Version | OS-9, Miele-Modula-2 3.5 |
---------------------+---------------------------------------------------------
| Copyright | Freigegeben fuer nichtkommerzielle Nutzung |
| | durch Teilnehmer am EFFO |
---------------------+---------------------------------------------------------
| Hardware | GEPARD 68010, 1 MByte RAM, 80Zeichen-Textkarte |
---------------------+---------------------------------------------------------
| besondere Importe | |
-------------------------------------------------------------------------------
| Autoren | WS | Werner Stehling, Seilerwis 3, |
| | | CH-8606 Greifensee, Tel. 01/256 42 21 |
---------------------+---------------------------------------------------------
| U P D A T E S | |
---------------------- |
| Datum Version Autor Bemerkungen |
| -------- ------- ----- ----------- |
| 6. 2.89 1.0 WS Beruecksichtigung, dass kein Fenster offen ist |
| 7. 2.89 1.1 WS SetTemp2 neu |
| 9. 2.89 1.1 WS ResetAktiv2 definiert zum Beschleunigen |
| |
-------------------------------------------------------------------------------
| Modul-Beschreibung | siehe Definition Module, area.def, areaio.def |
---------------------- |
| Verwaltung von zwei Fenstern gemeinsam, wobei das obere Fenster als Titel- |
| bereich angesehen wird. |
| |
| Programmtechnisch wird ausgenutzt, dass alle geoeffneten Fenster in einer |
| linearen Liste verkettet sind. Wenn das Titelfenster immer direkt hinter |
| dem eigentlichen IO-Bereich liegt, ist ein schneller Zugriff ohne grosse |
| Verwaltung moeglich. |
| |
| W A R N U N G : |
| =============== |
| Die Prozeduren dieses Moduls und darauf aufbauender Module duerfen nicht |
| gemeinsam mit anderen I/O-Prozeduren (z.B. aus InOut) verwendet werden, da |
| ueber den Bildschirm-Inhalt und die Cursorpositionen separat Buch gefuehrt |
| wird. |
-------------------------------------------------------------------------------
*)
FROM Area IMPORT MakeArea, SetAktiv, GetAktiv, GetAreaPar, PositArea,
DimArea, ReturnArea, WriteLn, Area, ClearArea,
SaveScreen, ResetAktiv;
FROM AreaIO IMPORT WriteStr;
(*==========================================================================*)
(**** Prozeduren zur Fensterverwaltung ****)
(*==========================================================================*)
PROCEDURE MakeArea2 (x0, y0, dx, dy, dw : CARDINAL) : Area;
(*--------------------------------------------------------------------------*)
VAR a1, a2 : Area;
BEGIN
a1 := MakeArea (x0, y0+dw+1, dx, dy);
a2 := MakeArea (x0, a1^.ymin-dw-1, dx, dw);
RETURN a1
END MakeArea2;
(*--------------------------------------------------------------------------*)
PROCEDURE SetAktivt (bereich : Area);
(*--------------------------------------------------------------------------*)
BEGIN
IF (bereich <> NIL) AND (bereich^.nextarea <> NIL) THEN
SetAktiv (bereich^.nextarea)
END
END SetAktivt;
(*--------------------------------------------------------------------------*)
PROCEDURE ResetAktiv2 (bereich : Area);
(*--------------------------------------------------------------------------*)
BEGIN
IF (bereich <> NIL) AND (bereich^.nextarea <> NIL) THEN
ResetAktiv (bereich^.nextarea);
ResetAktiv (bereich)
END
END ResetAktiv2;
(*--------------------------------------------------------------------------*)
PROCEDURE SetAktiv2 (bereich : Area);
(*--------------------------------------------------------------------------*)
BEGIN
IF (bereich <> NIL) AND (bereich^.nextarea <> NIL) THEN
SetAktiv (bereich^.nextarea);
SetAktiv (bereich)
END
END SetAktiv2;
(*--------------------------------------------------------------------------*)
PROCEDURE SetTemp2 (bereich : Area);
(*--------------------------------------------------------------------------*)
(* Rettet den absoluten Bildschirmbereich auf den Stack, bevor der neue *)
(* Bereich angezeigt wird. Restaurieren durch EndTemp aus Area *)
BEGIN
IF (bereich <> NIL) AND (bereich^.nextarea <> NIL) THEN
WITH bereich^ DO
SaveScreen (nextarea^.xmin-1, nextarea^.ymin-1,
breite+2, hoehe+nextarea^.hoehe+3)
END
END;
SetAktiv2 (bereich)
END SetTemp2;
(*--------------------------------------------------------------------------*)
PROCEDURE GetAreaPar2 (bereich : Area;
VAR x0, y0, dx, dy, dw : CARDINAL);
(*--------------------------------------------------------------------------*)
BEGIN
IF bereich <> NIL THEN
WITH bereich^ DO
dx := breite;
dy := hoehe;
dw := bereich^.nextarea^.hoehe;
x0 := bereich^.nextarea^.xmin;
y0 := bereich^.nextarea^.ymin
END
ELSE
GetAreaPar (bereich, x0, y0, dx, dy);
dw := 0
END
END GetAreaPar2;
(*--------------------------------------------------------------------------*)
PROCEDURE PositArea2 (VAR bereich : Area; x0, y0 : CARDINAL);
(*--------------------------------------------------------------------------*)
VAR a1 : Area;
BEGIN
IF bereich <> NIL THEN
GetAktiv (a1);
SetAktiv (NIL);
PositArea (bereich, x0, y0+bereich^.nextarea^.hoehe+1);
PositArea (bereich^.nextarea, x0, bereich^.ymin-bereich^.nextarea^.hoehe-1);
IF a1 = bereich THEN
SetAktiv (bereich^.nextarea);
SetAktiv (bereich)
ELSE
SetAktiv (a1)
END
END
END PositArea2;
(*--------------------------------------------------------------------------*)
PROCEDURE DimArea2 (VAR bereich : Area; dx, dy, dw : CARDINAL);
(*--------------------------------------------------------------------------*)
VAR i, k : CARDINAL;
a1, a2 : Area;
flag : BOOLEAN;
BEGIN
IF (bereich <> NIL) AND (bereich^.nextarea <> NIL) THEN
GetAktiv (a1);
IF a1 = bereich THEN
flag := TRUE
ELSE
flag := FALSE
END;
a2 := bereich^.nextarea;
SetAktiv (NIL);
i := bereich^.nextarea^.hoehe;
k := bereich^.ymin;
IF dw <> i THEN
PositArea (bereich, bereich^.xmin, k+dw-i)
END;
DimArea (bereich, dx, dy);
i := bereich^.ymin - dw - 1;
k := a2^.ymin;
IF i <> k THEN
PositArea (a2, bereich^.xmin, i)
END;
DimArea (a2, dx, dw);
IF flag THEN
SetAktiv (bereich^.nextarea);
SetAktiv (bereich)
ELSE
SetAktiv (a1)
END
END
END DimArea2;
(*--------------------------------------------------------------------------*)
PROCEDURE ReturnArea2 (bereich : Area);
(*--------------------------------------------------------------------------*)
BEGIN
ReturnArea (bereich^.nextarea);
ReturnArea (bereich)
END ReturnArea2;
(*--------------------------------------------------------------------------*)
PROCEDURE ClearArea2;
(*--------------------------------------------------------------------------*)
VAR a1 : Area;
BEGIN
GetAktiv (a1);
IF (a1 <> NIL) AND (a1^.nextarea <> NIL) THEN
SetAktiv (a1^.nextarea);
ClearArea;
SetAktiv (a1)
END;
ClearArea
END ClearArea2;
(*==========================================================================*)
(**** Prozeduren zur Titelverwaltung ****)
(*==========================================================================*)
PROCEDURE WriteLnt;
(*--------------------------------------------------------------------------*)
VAR a1 : Area;
BEGIN
GetAktiv (a1);
IF (a1 <> NIL) AND (a1^.nextarea <> NIL) THEN
SetAktiv (a1^.nextarea);
WriteLn;
SetAktiv (a1)
ELSE
WriteLn
END;
END WriteLnt;
(*--------------------------------------------------------------------------*)
PROCEDURE WriteTitel (VAR s : ARRAY OF CHAR; space : INTEGER);
(*--------------------------------------------------------------------------*)
VAR a1 : Area;
BEGIN
GetAktiv (a1);
IF (a1 <> NIL) AND (a1^.nextarea <> NIL) THEN
SetAktiv (a1^.nextarea);
WriteStr (s, space);
SetAktiv (a1)
ELSE
WriteStr (s, space)
END
END WriteTitel;
(*--------------------------------------------------------------------------*)
BEGIN
END Area2.