PACKET uebersichtsanzeige (*************************************************************************) (* *) (* Anzeige von EUDAS-Dateien als Übersicht *) (* *) (* Version 02 *) (* *) (* Autor: Thomas Berlage *) (* Stand: 08.07.87 *) (* *) (*************************************************************************) DEFINES uebersicht, uebersichtsfenster : ROW 24 INT VAR zeilensatz; ROW 24 INT VAR zeilenkombi; FENSTER VAR fenster; fenster initialisieren (fenster); INT VAR laenge := 24, breite := 79, zeilen anf := 1, spalten anf := 1, freier rest, feldversion := -1; BOOL VAR bis zeilenende, satznummer markieren; TEXT VAR feldnummern; LET niltext = "", begin mark = ""15"", end mark = ""14"", blank = " ", piep = ""7"", cleol = ""5""; LET t satznr = #901# ""15"Satznr. ", t dateiende = #902# " << DATEIENDE >>", uebersicht status = #903# "UEBERSICHT: Rollen: HOP OBEN, HOP UNTEN Beenden: ESC q Hilfe: ESC ?"; PROC uebersichtsfenster (INT CONST x anf, y anf, x laenge, y laenge) : fenstergroesse setzen (fenster, x anf, y anf, x laenge, y laenge); bis zeilenende := x anf + x laenge >= 80; laenge := y laenge; breite := x laenge; zeilen anf := y anf; spalten anf := x anf END PROC uebersichtsfenster; PROC uebersicht (TEXT CONST nummern, PROC hilfe) : TEXT VAR eingabezeichen; BOOL VAR dummy; INT VAR angezeigter satz := 1, ausgegebene zeilen := 0, eingabezustand := 1; fensterzugriff (fenster, dummy); status anzeigen (uebersicht status); feldnummern bestimmen; satznummer markieren := FALSE; aktueller satz wird erster; REP kommando annehmen und zeile ausgeben; alte markierung entfernen; kommando interpretieren END REP . feldnummern bestimmen : IF nummern = niltext THEN ggf alte auswahl uebernehmen ELSE feldnummern := nummern; feldversion := dateiversion END IF . ggf alte auswahl uebernehmen : IF feldversion <> dateiversion THEN alle felder anzeigen; feldversion := dateiversion END IF . alle felder anzeigen : INT VAR i; feldnummern := niltext; FOR i FROM 1 UPTO anzahl felder REP feldnummern CAT code (i) END REP . kommando annehmen und zeile ausgeben : WHILE ausgegebene zeilen < laenge REP eingabezeichen := getcharety; IF eingabezeichen <> "" THEN LEAVE kommando annehmen und zeile ausgeben END IF; eine zeile ausgeben; ausgegebene zeilen INCR 1 END REP; aktuellen satz markieren und einnehmen; getchar (eingabezeichen) . eine zeile ausgeben : IF ausgegebene zeilen = 0 THEN ueberschrift ausgeben ELIF ausgegebene zeilen = 1 THEN erste zeile ausgeben ELSE weitere zeile ausgeben END IF . ueberschrift ausgeben : cursor (spalten anf, zeilen anf); out (t satznr); freier rest := breite - 10; INT VAR feldindex; FOR feldindex FROM 1 UPTO length (feldnummern) WHILE freier rest > 0 REP feldnamen bearbeiten (code (feldnummern SUB feldindex), PROC (TEXT CONST, INT CONST, INT CONST) feld bis rest) END REP; zeilenrest loeschen; cursor (spalten anf + breite - 1, zeilen anf); out (end mark) . erste zeile ausgeben : auf uebersichtssatz (1); satznummer in zeile (1); satz als zeile ausgeben . weitere zeile ausgeben : cursor (spalten anf, zeilen anf + ausgegebene zeilen); IF dateiende THEN zeilensatz (ausgegebene zeilen) := 0; freier rest := breite; zeilenrest loeschen ELSE naechsten satz einnehmen; satznummer in zeile (ausgegebene zeilen); satz als zeile ausgeben END IF . naechsten satz einnehmen : weiter (2); auf abbruch testen; zeilensatz (ausgegebene zeilen) := satznummer; zeilenkombi (ausgegebene zeilen) := satzkombination . auf abbruch testen : IF NOT (satz ausgewaehlt OR dateiende) THEN LEAVE uebersicht END IF . alte markierung entfernen : IF angezeigter satz < ausgegebene zeilen THEN satznummer in zeile (angezeigter satz) END IF; cursor (spalten anf, zeilen anf + angezeigter satz) . aktuellen satz markieren und einnehmen : satznummer markieren := TRUE; WHILE zeilensatz (angezeigter satz) = 0 REP angezeigter satz DECR 1 END REP; satznummer in zeile (angezeigter satz); auf uebersichtssatz (angezeigter satz); markierung ausgeben; satznummer markieren := FALSE . kommando interpretieren : SELECT eingabezustand OF CASE 1 : normales kommando interpretieren CASE 2 : hop kommando interpretieren CASE 3 : esc kommando interpretieren END SELECT . normales kommando interpretieren : SELECT pos (""3""10""1""27"+-", eingabezeichen) OF CASE 1 : zeile nach oben CASE 2 : zeile nach unten CASE 3 : eingabezustand := 2 CASE 4 : eingabezustand := 3 CASE 5 : markieren CASE 6 : demarkieren OTHERWISE out (piep) END SELECT . hop kommando interpretieren : SELECT pos (""3""10""13"", eingabezeichen) OF CASE 1 : seite nach oben CASE 2 : seite nach unten CASE 3 : hop return OTHERWISE out (piep) END SELECT; eingabezustand := 1 . esc kommando interpretieren : SELECT pos ("19qh?", eingabezeichen) OF CASE 1 : esc 1 CASE 2 : esc 9 CASE 3, 4 : esc q CASE 5 : hilfestellung OTHERWISE out (piep) END SELECT; eingabezustand := 1 . zeile nach oben : IF angezeigter satz > 1 THEN angezeigter satz DECR 1; ELSE nach oben rollen (1); ausgegebene zeilen := 1 END IF . zeile nach unten : IF NOT dateiende THEN IF angezeigter satz < laenge - 1 THEN angezeigter satz INCR 1 ELSE zeilensatz (1) := zeilensatz (2); zeilenkombi (1) := zeilenkombi (2); ausgegebene zeilen := 1 END IF END IF . markieren : IF NOT satz markiert THEN markierung aendern END IF . demarkieren : IF satz markiert THEN markierung aendern END IF . seite nach oben : IF angezeigter satz > 1 THEN angezeigter satz := 1 ELSE nach oben rollen (laenge - 1); ausgegebene zeilen := 1 END IF . seite nach unten : IF angezeigter satz = laenge - 1 AND NOT dateiende THEN weiter (2); aktueller satz wird erster; ausgegebene zeilen := 1 ELSE angezeigter satz := laenge - 1 END IF . hop return : IF angezeigter satz <> 1 THEN zeilensatz (1) := zeilensatz (angezeigter satz); zeilenkombi (1) := zeilenkombi (angezeigter satz); angezeigter satz := 1; ausgegebene zeilen := 1 END IF . esc 1 : auf satz (1); IF NOT satz ausgewaehlt THEN weiter (2) END IF; aktueller satz wird erster; angezeigter satz := 1; ausgegebene zeilen := 1 . esc 9 : auf satz (32767); aktueller satz wird erster; nach oben rollen (laenge - 2); ausgegebene zeilen := 1 . esc q : satznummer markieren := true; satznummer in zeile (angezeigter satz); LEAVE uebersicht . hilfestellung : hilfe; status anzeigen (uebersicht status); ausgegebene zeilen := 0 . END PROC uebersicht; PROC nach oben rollen (INT CONST gerollt) : INT VAR i; auf uebersichtssatz (1); FOR i FROM 1 UPTO gerollt WHILE satznummer > 1 REP zurueck (2) END REP; aktueller satz wird erster END PROC nach oben rollen; PROC auf uebersichtssatz (INT CONST zeile) : auf satz (zeilensatz (zeile)); WHILE satzkombination <> zeilenkombi (zeile) REP weiter (1) END REP END PROC auf uebersichtssatz; PROC aktueller satz wird erster : zeilensatz (1) := satznummer; zeilenkombi (1) := satzkombination END PROC aktueller satz wird erster; BOOL PROC uebereinstimmung (INT CONST zeile) : satznummer = zeilensatz (zeile) CAND satzkombination = zeilenkombi (zeile) END PROC uebereinstimmung; PROC feld bis rest (TEXT CONST satz, INT CONST von, bis) : INT CONST laenge := min (freier rest, bis - von + 1); outsubtext (satz, von, von + laenge - 1); freier rest DECR laenge; IF freier rest >= 2 THEN out (", "); freier rest DECR 2 ELIF freier rest = 1 THEN out (","); freier rest := 0 END IF END PROC feld bis rest; PROC satznummer in zeile (INT CONST zeile) : cursor (spalten anf, zeilen anf + zeile); IF satznummer markieren THEN out (begin mark) ELSE out (blank) END IF; outtext (text (zeilensatz (zeile)), 1, 5); IF satznummer markieren THEN out (end mark) ELSE out (blank) END IF; freier rest := breite - 7 END PROC satznummer in zeile; PROC zeilenrest loeschen : IF bis zeilenende THEN out (cleol) ELSE freier rest TIMESOUT blank END IF END PROC zeilenrest loeschen; PROC satz als zeile ausgeben : IF satz ausgewaehlt THEN markierung ausgeben; felder ausgeben ELIF dateiende THEN out (t dateiende); freier rest DECR 17 ELSE markierung ausgeben; out ("<< >>"); freier rest DECR 5 END IF; zeilenrest loeschen . felder ausgeben : INT VAR feldindex; FOR feldindex FROM 1 UPTO length (feldnummern) WHILE freier rest > 0 REP feld bearbeiten (code (feldnummern SUB feldindex), PROC (TEXT CONST, INT CONST, INT CONST) feld bis rest) END REP . END PROC satz als zeile ausgeben; PROC markierung ausgeben : IF satz markiert THEN out ("+ ") ELSE out ("- ") END IF; freier rest DECR 2 END PROC markierung ausgeben; END PACKET uebersichtsanzeige;