summaryrefslogtreecommitdiff
path: root/app/eudas/5.3/src/eudas.fenster.06
diff options
context:
space:
mode:
Diffstat (limited to 'app/eudas/5.3/src/eudas.fenster.06')
-rw-r--r--app/eudas/5.3/src/eudas.fenster.06253
1 files changed, 253 insertions, 0 deletions
diff --git a/app/eudas/5.3/src/eudas.fenster.06 b/app/eudas/5.3/src/eudas.fenster.06
new file mode 100644
index 0000000..cb9578b
--- /dev/null
+++ b/app/eudas/5.3/src/eudas.fenster.06
@@ -0,0 +1,253 @@
+PACKET fenster
+
+(*************************************************************************)
+(* *)
+(* Bildschirmaufteilung in Fenster *)
+(* *)
+(* Version 06 *)
+(* *)
+(* Autor: Thomas Berlage *)
+(* Stand: 15.01.88 *)
+(* *)
+(*************************************************************************)
+
+ DEFINES
+
+ FENSTER,
+ fenster initialisieren,
+ fenstergroesse setzen,
+ fenstergroesse,
+ fenster veraendert,
+ fensterzugriff,
+ bildschirm neu :
+
+
+TYPE FENSTER = STRUCT (INT koordinaten, version);
+
+LET
+ maxfenster = 16,
+ BITVEKTOR = INT,
+ GROESSE = STRUCT (INT x anf, y anf, x laenge, y laenge);
+
+ROW maxfenster STRUCT (INT referenzen, aktuelle version,
+ BITVEKTOR ueberschneidungen,
+ GROESSE groesse)
+ VAR fenstergroessen;
+
+INT VAR naechste version := 1;
+
+BITVEKTOR VAR veraenderungen;
+
+INT VAR i;
+FOR i FROM 2 UPTO maxfenster REP
+ fenstergroessen (i). referenzen := 0
+END REP;
+fenstergroessen (1). referenzen := 1;
+fenstergroessen (1). aktuelle version := 0;
+fenstergroessen (1). ueberschneidungen := 0;
+fenstergroessen (1). groesse := GROESSE : (1, 1, 79, 24);
+
+
+(************************* fenster anfordern *****************************)
+
+PROC fenster initialisieren (FENSTER VAR f) :
+
+ f. koordinaten := 1;
+ fenstergroessen (1). referenzen INCR 1;
+ neue version (f. version)
+
+END PROC fenster initialisieren;
+
+PROC neue version (INT VAR version) :
+
+ version := naechste version;
+ naechste version INCR 1;
+ IF naechste version >= 32000 THEN naechste version := -32000 END IF
+
+END PROC neue version;
+
+PROC fenstergroesse setzen (FENSTER VAR links, FENSTER CONST rechts) :
+
+ neue version (links. version);
+ fenstergroessen (links. koordinaten). referenzen DECR 1;
+ links. koordinaten := rechts. koordinaten;
+ fenstergroessen (rechts. koordinaten). referenzen INCR 1
+
+END PROC fenstergroesse setzen;
+
+PROC fenstergroesse setzen (FENSTER VAR f,
+ INT CONST x anf, y anf, x laenge, y laenge) :
+
+ INT VAR stelle;
+ passendes fenster suchen;
+ IF stelle > maxfenster THEN
+ freie stelle suchen;
+ neue koordinaten initialisieren;
+ ueberschneidungen bestimmen
+ END IF;
+ auf referenz setzen .
+
+passendes fenster suchen :
+ stelle := 1;
+ WHILE stelle <= maxfenster REP
+ IF groesse passt THEN
+ LEAVE passendes fenster suchen
+ END IF;
+ stelle INCR 1
+ END REP .
+
+groesse passt :
+ g. x anf = x anf AND g. y anf = y anf AND g. x laenge = x laenge AND
+ g. y laenge = y laenge .
+
+g :
+ fenstergroessen (stelle). groesse .
+
+freie stelle suchen :
+ stelle := 1;
+ WHILE stelle <= maxfenster REP
+ IF fenstergroessen (stelle). referenzen = 0 THEN
+ LEAVE freie stelle suchen
+ END IF;
+ stelle INCR 1
+ END REP;
+ errorstop ("zu viele Fenstergroessen");
+ LEAVE fenstergroesse setzen .
+
+neue koordinaten initialisieren :
+ fenstergroessen (stelle). referenzen := 0;
+ fenstergroessen (stelle). aktuelle version := 0;
+ fenstergroessen (stelle). groesse :=
+ GROESSE : (x anf, y anf, x laenge, y laenge);
+ fenstergroessen (stelle). ueberschneidungen := 0 .
+
+ueberschneidungen bestimmen :
+ INT VAR vergleich;
+ FOR vergleich FROM 1 UPTO maxfenster REP
+ IF fenstergroessen (vergleich). referenzen > 0 THEN
+ vergleiche auf ueberschneidung
+ END IF
+ END REP .
+
+vergleiche auf ueberschneidung :
+ IF ueberschneidung (neues fenster, vergleichsfenster) THEN
+ set bit (fenstergroessen (stelle). ueberschneidungen, vergleich);
+ set bit (fenstergroessen (vergleich). ueberschneidungen, stelle)
+ ELSE
+ reset bit (fenstergroessen (vergleich). ueberschneidungen, stelle)
+ END IF .
+
+neues fenster :
+ fenstergroessen (stelle). groesse .
+
+vergleichsfenster :
+ fenstergroessen (vergleich). groesse .
+
+auf referenz setzen :
+ fenstergroessen (f. koordinaten). referenzen DECR 1;
+ f. koordinaten := stelle;
+ fenstergroessen (stelle). referenzen INCR 1 .
+
+END PROC fenstergroesse setzen;
+
+BOOL PROC ueberschneidung (GROESSE CONST a, b) :
+
+ ueberschneidung in x richtung AND ueberschneidung in y richtung .
+
+ueberschneidung in x richtung :
+ IF a. x anf <= b. x anf THEN
+ b. x anf < a. x anf + a. x laenge
+ ELSE
+ a. x anf < b. x anf + b. x laenge
+ END IF .
+
+ueberschneidung in y richtung :
+ IF a. y anf <= b. y anf THEN
+ b. y anf < a. y anf + a. y laenge
+ ELSE
+ a. y anf < b. y anf + b. y laenge
+ END IF .
+
+END PROC ueberschneidung;
+
+PROC fenstergroesse (FENSTER CONST f,
+ INT VAR x anf, y anf, x laenge, y laenge) :
+
+ x anf := g. x anf;
+ y anf := g. y anf;
+ x laenge := g. x laenge;
+ y laenge := g. y laenge .
+
+g :
+ fenstergroessen (f. koordinaten). groesse .
+
+END PROC fenstergroesse;
+
+
+(************************** fenster veraendert ***************************)
+
+PROC fenster veraendert (FENSTER CONST f) :
+
+ fenstergroessen (f. koordinaten). aktuelle version := 0;
+ veraenderungen := veraenderungen OR meine ueberschneidungen .
+
+meine ueberschneidungen :
+ fenstergroessen (f. koordinaten). ueberschneidungen .
+
+END PROC fenster veraendert;
+
+
+(************************** fensterzugriff *******************************)
+
+PROC fensterzugriff (FENSTER CONST f, BOOL VAR veraendert) :
+
+ veraendert := bit (veraenderungen, f. koordinaten);
+ IF fenstergroessen (f. koordinaten). aktuelle version <> f. version THEN
+ fenstergroessen (f. koordinaten). aktuelle version := f. version;
+ veraendert := TRUE
+ END IF;
+ veraenderungen := veraenderungen OR meine ueberschneidungen;
+ reset bit (veraenderungen, f. koordinaten) .
+
+meine ueberschneidungen :
+ fenstergroessen (f. koordinaten). ueberschneidungen .
+
+END PROC fensterzugriff;
+
+
+(************************ bildschirm neu *********************************)
+
+PROC bildschirm neu :
+
+ veraenderungen := - 1
+
+END PROC bildschirm neu;
+
+
+(**************************** BITVEKTOR **********************************)
+
+(* Erforderlich, da 'reset bit' im EUMEL nicht richtig funktionierte. *)
+
+ROW 16 INT VAR bitwert := ROW 16 INT :
+ (1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,-32767-1);
+
+PROC set bit (BITVEKTOR VAR vektor, INT CONST stelle) :
+
+ vektor := vektor OR bitwert (stelle)
+
+END PROC set bit;
+
+PROC reset bit (BITVEKTOR VAR vektor, INT CONST stelle) :
+
+ vektor := vektor AND (-1 - bitwert (stelle))
+
+END PROC reset bit;
+
+BOOL PROC bit (BITVEKTOR CONST vektor, INT CONST stelle) :
+
+ (vektor AND bitwert (stelle)) <> 0
+
+END PROC bit;
+
+END PACKET fenster;
+