From afd4c3c448381f6eb706090911a15c162fdaf8af Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Sun, 9 Oct 2016 11:28:19 +0200 Subject: Decompress source files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EUMEL’s TEXT dataspaces wastes a lot of storage space. Some files were therefore “compressed” by storing them as a single line, reducing overhead significantly. --- menugenerator/ls-Menu-Generator 2 | 720 +++++++++++++++++++++++++++++++++++--- 1 file changed, 673 insertions(+), 47 deletions(-) (limited to 'menugenerator/ls-Menu-Generator 2') diff --git a/menugenerator/ls-Menu-Generator 2 b/menugenerator/ls-Menu-Generator 2 index 608f680..e38fc7e 100644 --- a/menugenerator/ls-Menu-Generator 2 +++ b/menugenerator/ls-Menu-Generator 2 @@ -22,51 +22,677 @@ *) -PACKET ls menu generator 2 DEFINES{} oeffne menukarte,{} oeffne menu,{} oberbegriff,{} menufunktion,{} trennlinie,{} schliesse menu,{} schliesse menukarte,{} testinstallation:{}LET menutafeltype = 1954,{} kennung = "ls - Menu - Generator",{} mm taskname = "ls-MENUKARTEN",{} menutafelpraefix = "ls-MENUKARTE:",{} menu grundtext = "ls-MENUBASISTEXTE",{} zwischenablagename = "MENU-ZWISCHENABLAGEDATEI INTERN";{} -LET maxmenus = 6,{} maxmenutexte = 300,{} maxinfotexte = 2000,{} maxhauptmenupunkte = 10,{} maxuntermenupunkte = 15,{} maxmenubreite = 71; (* Breite der Hauptmenüzeile - 2 *){}LET blank = " ",{} cleop = ""4"",{} piep = ""7"",{} trennzeilensymbol = "###",{} bleibt leer symbol = "***",{} hauptmenuluecke = " ";{}LET dummyname = "Dummy für Anwendertexte",{} - install finished = "Installation abgeschlossen!",{} card finished = "Menukartengenerierung abgeschlossen!",{} filetype = 1003;{}TYPE MENUPUNKT = STRUCT (TEXT punktkuerzel,{} punktname,{} procname,{} boxtext,{} BOOL aktiv,{} angewaehlt),{} EINZELMENU = STRUCT (INT belegt,{} TEXT ueberschrift,{} - INT anfangsposition,{} maxlaenge,{} ROW maxuntermenupunkte MENUPUNKT menupunkt,{} INT aktueller untermenupunkt,{} TEXT startprozedurname,{} leaveprozedurname),{} MENU = STRUCT (TEXT menuname,{} INT anzahl hauptmenupunkte,{} ROW maxhauptmenupunkte EINZELMENU einzelmenu,{} - TEXT menueingangsprozedur,{} menuausgangsprozedur,{} menuinfo,{} lizenznummer,{} versionsnummer,{} INT hauptmenuzeiger,{} untermenuanfang,{} untermenuzeiger),{} INFOTEXT = STRUCT (INT anzahl infotexte,{} ROW maxinfotexte TEXT stelle),{} - MENUTEXT = STRUCT (INT anzahl menutexte,{} ROW maxmenutexte TEXT platz),{} MENULEISTE = STRUCT (INT belegt, zeigeraktuell, zeigerhintergrund,{} ROW maxmenus MENU menu,{} MENUTEXT menutext,{} INFOTEXT infotext);{}ROW 14 TEXT CONST aussage :: ROW 14 TEXT : ({}"ACHTUNG - Eine Menukarte mit diesem Namen existiert bereits - ACHTUNG",{}"Kann die bereits existierende Menukarte gelöscht werden",{} -"Dann kann keine neue Menukarte mit diesem Namen erstellt werden!",{}"Zum Weitermachen bitte irgendeine Taste tippen!",{}"Sollen auch Anwendungstexte in die Menukarte aufgenommen werden",{}"Auswahl der Datei, in der die Anwendungstexte stehen.",{}"Bitte die gewünschte Datei ankreuzen!",{}"Durchgang 1 von 2 Durchgängen - in Arbeit ist Zeile: ",{}"Durchgang 2 von 2 Durchgängen - in Arbeit ist Zeile: ",{}"",{}"Einlesen von Texten aus Datei : ",{}"Bearbeitet wird Menu : ",{}"Eingetragen wird Oberbegriff : ",{} -"Eingetragen wird Menufunktion : "{});{}ROW 22 TEXT CONST fehlermeldung :: ROW 22 TEXT : ({}"Ohne die Datei '",{}"' "13""10""10" ist die Menuerstellung "15"unmöglich "14"!!",{}"Hier muß unbedingt eine Datei angekreuzt werden!",{}"Ausgewählte Datei hat falschen Typ (<> 1003) )",{}"Zu viele Anwendungstexte in der Datei ",{}"Anführungszeichen fehlt am Anfang oder Ende der Zeile ",{}"Anführungszeichen fehlt irgendwo in Zeile ",{}"Die angegebene Datei existiert nicht!",{}"Menukarte noch nicht geöffnet ('oeffne menukarte' fehlt)! ",{} -"Vorausgehendes Menu nicht geschlossen! ",{}"Zu viele Menus in der Menukarte (> " + text (maxmenus) + ")!",{}"Menuname ist mehrfach vorhanden!",{}"Menu noch nicht geoeffnet ('oeffne menu' fehlt)!",{}"Zu viele Oberbegriffe in einem Menu (> " + text (maxhauptmenupunkte) + ")!",{}"Die Kopfzeile ist zu lang (> " + text (maxmenubreite) + ")!",{}"Menupunkt-Kürzel ist länger als ein Zeichen!",{}"Menupunkt-Kürzel kommt mehrfach vor (nicht eindeutig)!",{}"Menupunkt-Bezeichnung ist zu lang!",{}"Zu viele (> " + text (maxuntermenupunkte) + ") Menupunkte in einem Pull-Down-Menu!",{} -"Menukarte '",{}"' gibt es nicht in dieser Task!",{}"' hat falsche(n) Typ/Bezeichnung"{});{}TEXT VAR menuinfotextdateiname,{} aktueller menudateiname;{}BOOL VAR menuleiste ist bereit :: FALSE,{} menu ist geoeffnet :: FALSE;{}BOUND MENULEISTE VAR menuleiste;{}BOUND MENUTEXT VAR basistexte;{}BOUND MENU VAR aktuelles menu;{}DATASPACE VAR ds;{}OP := (MENUTEXT VAR ziel, MENUTEXT VAR quelle):{} INT VAR z;{} ziel.anzahl menutexte := quelle.anzahl menutexte;{} FOR z FROM 1 UPTO quelle.anzahl menutexte REP{} - ziel.platz [z] := quelle.platz [z]{} PER{}END OP :=;{}OP := (MENU VAR ziel, MENU CONST quelle):{} CONCR (ziel) := CONCR (quelle){}END OP :=;{}OP := (EINZELMENU VAR ziel, EINZELMENU CONST quelle):{} CONCR (ziel) := CONCR (quelle){}END OP :=;{}OP := (MENUPUNKT VAR ziel, MENUPUNKT CONST quelle):{} CONCR (ziel) := CONCR (quelle){}END OP :=;{}PROC oeffne menukarte (TEXT CONST menukartenname):{} gib bildschirmhinweis aus;{} ueberpruefe voraussetzungen;{} erfrage den namen der datei mit den anwendertexten;{} - erstelle neue menuleiste.{} gib bildschirmhinweis aus:{} page; out (center (invers (kennung))).{} ueberpruefe voraussetzungen:{} ueberpruefe ob basistexte vorhanden sind;{} ueberpruefe ob menukarte schon vorhanden ist.{} ueberpruefe ob basistexte vorhanden sind:{} IF NOT exists (menu grundtext){} THEN gib hinweis und brich ab{} FI.{} gib hinweis und brich ab:{} disable stop;{} fetch (menu grundtext, /mm taskname);{} IF is error{} THEN clear error;{} enable stop;{} - cursor (1, 4); out (cleop);{} errorstop (fehlermeldung [1] + menu grundtext + fehlermeldung [2]){} ELSE clear error;{} enable stop{} FI.{} ueberpruefe ob menukarte schon vorhanden ist:{} IF exists (menukarte){} THEN gib hinweis auf vorhandene menukarte;{} frage ob die alte karte geloescht werden darf{} FI.{} menukarte:{} menutafelpraefix + menukartenname.{} gib hinweis auf vorhandene menukarte:{} cursor (1, 4); out (cleop);{} - cursor (1, 4); out (center (menukarte));{} cursor (1, 6); out (center (invers (aussage [1]))).{} frage ob die alte karte geloescht werden darf:{} cursor (2, 9);{} IF yes (aussage [2]){} THEN forget (menukarte, quiet){} ELSE weiterarbeit ist unmoeglich{} FI.{} weiterarbeit ist unmoeglich:{} cursor (1, 12); out (center (invers (aussage [3])));{} cursor (2, 15); out (aussage [4]);{} cursor (2, 16); pause; page;{} errorstop ("").{} erfrage den namen der datei mit den anwendertexten:{} - cursor (1, 4); out (cleop);{} IF yes (aussage [5]){} THEN biete dateiauswahl an{} ELSE erzeuge dateidummy{} FI.{} biete dateiauswahl an:{} menuinfotextdateiname := one (2, 6, 77, 19, ALL myself,{} aussage [6], aussage [7]);{} ueberpruefe den dateinamen;{} ueberpruefe den dateityp.{} ueberpruefe den dateinamen:{} IF compress (menuinfotextdateiname) = ""{} THEN page; errorstop (fehlermeldung [3]){} FI.{} ueberpruefe den dateityp:{} - IF datei hat falschen typ{} THEN page; errorstop (fehlermeldung [4]){} FI.{} datei hat falschen typ:{} ds := old (menuinfotextdateiname);{} IF type (ds) <> filetype{} THEN forget (ds); TRUE{} ELSE forget (ds); FALSE{} FI.{} erzeuge dateidummy:{} forget (dummyname, quiet);{} FILE VAR datei :: sequential file (modify, dummyname);{} to line (datei, 1);{} menuinfotextdateiname := dummyname.{} erstelle neue menuleiste:{} INT VAR zeiger;{} TEXT VAR zeileninhalt;{} - initialisiere werte;{} aktueller menudateiname := menukarte;{} menuleiste := new (aktueller menudateiname);{} type (old (aktueller menudateiname), menutafeltype);{} menuleiste.belegt := 0;{} menuleiste ist bereit := TRUE;{} trage menubasistexte ein;{} trage anwendungstexte ein.{} initialisiere werte:{} menuleiste ist bereit := FALSE;{} menu ist geoeffnet := FALSE.{} trage menubasistexte ein:{} basistexte := old (menu grundtext);{} - menuleiste.menutext := basistexte.{} trage anwendungstexte ein:{} konvertiere (menuinfotextdateiname, zwischenablagename,{} menuleiste.infotext.anzahl infotexte);{} ueberpruefe anwendungstextanzahl;{} trage anwendungstexte in die menuleiste.{} ueberpruefe anwendungstextanzahl:{} IF menuleiste.infotext.anzahl infotexte > maxinfotexte{} THEN forget (zwischenablagename, quiet);{} forget (aktueller menudateiname, quiet);{} errorstop (fehlermeldung [5] + "'" + menuinfotextdateiname + "'"){} - FI.{} trage anwendungstexte in die menuleiste:{} gib hinweis auf anwendungstexteintrag;{} FILE VAR ein :: sequential file (input, zwischenablagename);{} FOR zeiger FROM 1 UPTO menuleiste.infotext.anzahl infotexte REP{} getline (ein, zeileninhalt);{} menuleiste.infotext.stelle [zeiger] := zeileninhalt;{} cout (zeiger){} PER;{} forget (zwischenablagename, quiet);{} forget (dummyname , quiet).{} gib hinweis auf anwendungstexteintrag:{} cursor (1, 7); out (aussage [9]).{} -END PROC oeffne menukarte;{}PROC konvertiere (TEXT CONST eingabedatei, ausgabedatei,{} INT VAR anzahl konvertierter saetze):{} loesche ausgabedatei;{} untersuche eingabedatei;{} konvertiere saetze.{} loesche ausgabedatei:{} IF exists (ausgabedatei){} THEN forget (ausgabedatei, quiet){} FI.{} untersuche eingabedatei:{} IF NOT exists (eingabedatei){} THEN errorstop (fehlermeldung [8]){} FI.{} konvertiere saetze:{} gib hinweis;{} konvertiere satzweise.{} - gib hinweis:{} cursor (1, 4); out (cleop);{} cursor (1, 4); out (aussage [11] + "'" + eingabedatei + "'");{} cursor (1, 6); out (aussage [ 8]);{} anzahl konvertierter saetze := 0.{} konvertiere satzweise:{} TEXT VAR zeileninhalt :: "";{} FILE VAR eingabe :: sequential file (input, eingabedatei);{} WHILE NOT eof (eingabe) REP{} behandle eine dateizeile{} PER;{} optimiere ausgabedatei.{} behandle eine dateizeile:{} getline (eingabe, zeileninhalt);{} anzahl konvertierter saetze INCR 1;{} - cout (anzahl konvertierter saetze);{} untersuche zeile;{} wandle die zeile um;{} FILE VAR aus :: sequential file (output, ausgabedatei);{} write (aus, textausgabe).{} untersuche zeile:{} zeileninhalt := compress (zeileninhalt);{} IF zeileninhalt = ""{} THEN zeileninhalt := """"""{} FI;{} IF (zeileninhalt SUB 1) <> """"{} OR (zeileninhalt SUB length (zeileninhalt)) <> """"{} THEN bereite abgang vor;{} errorstop (fehlermeldung [6] + text (anzahl konvertierter saetze)){} - FI.{} wandle die zeile um:{} TEXT VAR textausgabe :: "", codekette;{} zeileninhalt := subtext (zeileninhalt, 2, length (zeileninhalt) - 1);{} WHILE gaensefuesschenposition > 0 REP{} textausgabe CAT subtext (zeileninhalt, 1, gaensefuesschenposition - 1);{} zeileninhalt := subtext (zeileninhalt, gaensefuesschenposition);{} codekette := subtext (zeileninhalt, 1, pos (zeileninhalt, """", 2));{} IF codekette = """7"""{} THEN textausgabe CAT ""7""{} - ELIF codekette = """5"""{} THEN textausgabe CAT ""5""{} ELIF codekette = """4"""{} THEN textausgabe CAT ""4""{} ELIF codekette = """10"""{} THEN textausgabe CAT ""10""{} ELIF codekette = """13"""{} THEN textausgabe CAT ""13""{} ELIF codekette = """14"""{} THEN textausgabe CAT ""14""{} ELIF codekette = """15"""{} THEN textausgabe CAT ""15""{} ELIF codekette = """"""{} THEN textausgabe CAT """"{} - ELSE errorstop (fehlermeldung [7] +{} text (anzahl konvertierter saetze)){} FI;{} zeileninhalt := subtext (zeileninhalt, 1 + length (codekette)){} PER;{} textausgabe CAT zeileninhalt.{} gaensefuesschenposition:{} pos (zeileninhalt, """").{} bereite abgang vor:{} forget (ausgabedatei, quiet);{} line (2).{} optimiere ausgabedatei:{} FILE VAR ausgabe :: sequential file (modify, ausgabedatei);{} WHILE lines (ausgabe) > 0 CAND letzter satz ist leer REP{} - to line (ausgabe, lines (ausgabe));{} delete record (ausgabe);{} anzahl konvertierter saetze DECR 1;{} cout (anzahl konvertierter saetze ){} PER.{} letzter satz ist leer:{} TEXT VAR satz;{} to line (ausgabe,lines (ausgabe));{} read record (ausgabe, satz);{} IF compress (satz) = "" OR compress (satz) = ""13""{} THEN TRUE{} ELSE FALSE{} FI.{}END PROC konvertiere;{}PROC oeffne menu (TEXT CONST name, einstiegsproc, ausstiegsproc,{} itext, ltext, vtext):{} - gib hinweis auf geoeffnetes menu;{} ueberpruefe auf ungereimtheiten;{} nimm eintragungen in datenraum vor.{} gib hinweis auf geoeffnetes menu:{} cursor (1, 4); out (cleop);{} out (aussage [12]); out (invers (name));{} cursor (1, 6).{} ueberpruefe auf ungereimtheiten:{} pruefe auf bereits geoeffnete menuliste;{} pruefe auf noch geoeffnetes menu;{} pruefe auf noch freie menuplaetze;{} pruefe auf schon vorhandenen menunamen.{} pruefe auf bereits geoeffnete menuliste:{} IF NOT menuleiste ist bereit{} - THEN bereinige eintragungen (9){} FI.{} pruefe auf noch geoeffnetes menu:{} IF menu ist geoeffnet{} THEN bereinige eintragungen (10){} FI.{} pruefe auf noch freie menuplaetze:{} IF menuleiste.belegt = maxmenus{} THEN bereinige eintragungen (11){} FI.{} pruefe auf schon vorhandenen menunamen:{} IF menuname schon vorhanden{} THEN bereinige eintragungen (12){} FI.{} menuname schon vorhanden:{} INT VAR i;{} FOR i FROM 1 UPTO menuleiste.belegt REP{} - untersuche einzelnen menunamen{} PER;{} FALSE.{} untersuche einzelnen menunamen:{} IF menuleiste.menu [i].menuname = compress (name){} THEN LEAVE menuname schon vorhanden WITH TRUE{} FI.{} nimm eintragungen in datenraum vor:{} forget (ds);{} ds := nilspace;{} aktuelles menu := ds;{} init (aktuelles menu);{} aktuelles menu.menuname := compress (name);{} aktuelles menu.menueingangsprozedur := compress (einstiegsproc);{} - aktuelles menu.menuausgangsprozedur := compress (ausstiegsproc);{} IF itext <> ""{} THEN aktuelles menu.menuinfo := itext;{} aktuelles menu.lizenznummer := ltext;{} aktuelles menu.versionsnummer := vtext{} ELSE aktuelles menu.menuinfo := bleibt leer symbol;{} aktuelles menu.lizenznummer := "";{} aktuelles menu.versionsnummer := ""{} FI;{} menu ist geoeffnet := TRUE.{}END PROC oeffne menu;{} -PROC oeffne menu (TEXT CONST name, einstiegsproc, ausstiegsproc):{} oeffne menu (name, einstiegsproc, ausstiegsproc, "", "", ""){}END PROC oeffne menu;{}PROC oeffne menu (TEXT CONST name):{} oeffne menu (name, "", "", "", "", ""){}END PROC oeffne menu;{}PROC bereinige eintragungen (INT CONST nummer):{} forget (ds);{} forget (aktueller menudateiname, quiet);{} menuleiste ist bereit := FALSE;{} menu ist geoeffnet := FALSE;{} errorstop (fehlermeldung [nummer]){}END PROC bereinige eintragungen;{} -PROC init (MENU VAR m):{} m.menuname := "";{} m.hauptmenuzeiger := 1;{} m.untermenuanfang := 0;{} m.untermenuzeiger := 0;{} m.menueingangsprozedur := "";{} m.menuausgangsprozedur := "";{} m.menuinfo := "";{} m.versionsnummer := "";{} m.anzahl hauptmenupunkte := 0;{} belege hauptmenupunkte.{} belege hauptmenupunkte:{} INT VAR i;{} FOR i FROM 1 UPTO maxhauptmenupunkte REP{} - aktuelles einzelmenu.belegt := 0;{} aktuelles einzelmenu.ueberschrift := "";{} aktuelles einzelmenu.anfangsposition := 0;{} aktuelles einzelmenu.maxlaenge := 0;{} aktuelles einzelmenu.aktueller untermenupunkt := 1;{} aktuelles einzelmenu.startprozedurname := "";{} aktuelles einzelmenu.leaveprozedurname := "";{} belege untermenuepunkte{} PER.{} belege untermenuepunkte:{} - INT VAR j;{} FOR j FROM 1 UPTO maxuntermenupunkte REP{} aktueller menupunkt.punktkuerzel := "";{} aktueller menupunkt.punktname := "";{} aktueller menupunkt.procname := "";{} aktueller menupunkt.boxtext := "";{} aktueller menupunkt.aktiv := TRUE;{} aktueller menupunkt.angewaehlt := FALSE{} PER.{} aktuelles einzelmenu: m.einzelmenu [i].{} aktueller menupunkt: aktuelles einzelmenu.menupunkt [j].{}END PROC init;{}PROC oberbegriff (TEXT CONST punktname, startprocname, leaveprocname):{} - gib hinweis auf oberbegriff;{} untersuche ob menu geoeffnet und bereit ist;{} untersuche oberbegriffe;{} trage neuen oberbegriff ein;{} notiere die anfangsposition;{} notiere start und leaveprozedur;{} erhoehe die anzahl der oberbegriffe.{} gib hinweis auf oberbegriff:{} cursor (1, 6); out (cleop);{} cursor (1, 6); out (aussage [13]); out (invers (punktname)); line.{} untersuche ob menu geoeffnet und bereit ist:{} IF NOT menuleiste ist bereit{} THEN bereinige eintragungen ( 9){} - FI;{} IF NOT menu ist geoeffnet{} THEN bereinige eintragungen (13){} FI.{} untersuche oberbegriffe:{} IF zu viele oberbegriffe{} THEN bereinige eintragungen (14){} FI;{} IF gesamtlaenge > maxmenubreite{} THEN bereinige eintragungen (15){} FI.{} zu viele oberbegriffe:{} aktuelles menu.anzahl hauptmenupunkte = maxhauptmenupunkte.{} gesamtlaenge:{} gesamtlaenge ohne letzten punkt + length (compress (punktname)).{} gesamtlaenge ohne letzten punkt:{} length (hauptmenuzeile).{} - hauptmenuzeile:{} INT VAR zaehler;{} TEXT VAR zeile :: "";{} schreibe menunamen;{} schreibe oberbegriffe;{} zeile.{} schreibe menunamen:{} IF aktuelles menu. menuname <> ""{} THEN zeile CAT aktuelles menu.menuname;{} zeile CAT ":"{} FI.{} schreibe oberbegriffe:{} FOR zaehler FROM 1 UPTO aktuelles menu.anzahl hauptmenupunkte REP{} zeile CAT hauptmenuluecke;{} zeile CAT aktuelles menu. einzelmenu [zaehler].ueberschrift{} PER;{} zeile CAT hauptmenuluecke.{} - trage neuen oberbegriff ein:{} neuer menupunkt.ueberschrift := compress (punktname).{} notiere die anfangsposition:{} neuer menupunkt.anfangsposition := gesamtlaenge ohne letzten punkt + 1.{} notiere start und leaveprozedur:{} neuer menupunkt.startprozedurname := compress (startprocname);{} neuer menupunkt.leaveprozedurname := compress (leaveprocname).{} neuer menupunkt:{} aktuelles menu.einzelmenu [aktuelles menu.anzahl hauptmenupunkte + 1].{} erhoehe die anzahl der oberbegriffe:{} - aktuelles menu.anzahl hauptmenupunkte INCR 1.{}END PROC oberbegriff;{}PROC oberbegriff (TEXT CONST punktname):{} oberbegriff (punktname, "", ""){}END PROC oberbegriff;{}PROC menufunktionseintrag (TEXT CONST kuerzel,{} punktbezeichnung,{} prozedurname,{} infotext,{} BOOL CONST ist aktiv):{} gib hinweis auf menufunktionseintrag;{} trage menupunkt ein;{} organisiere menu neu.{} - gib hinweis auf menufunktionseintrag:{} line;{} out (aussage [14]);{} out ("'" + kuerzelzeichen + "' - " + punktname).{} kuerzelzeichen:{} IF kuerzel = "" THEN " " ELSE kuerzel FI.{} punktname:{} IF punktbezeichnung = trennzeilensymbol{} THEN "----------"{} ELSE punktbezeichnung{} FI.{} trage menupunkt ein:{} ueberpruefe das kuerzel;{} ueberpruefe die punktbreite;{} ueberpruefe die eintragsnummer;{} aktuelles menu.einzelmenu [stelle].belegt INCR 1;{} - aktueller menupunkt.punktkuerzel := compress (kuerzel);{} aktueller menupunkt.punktname := normierter menupunkt;{} aktueller menupunkt.procname := compress (prozedurname);{} aktueller menupunkt.boxtext := infotext;{} aktueller menupunkt.aktiv := ist aktiv;{} aktueller menupunkt.angewaehlt := FALSE.{} aktueller menupunkt:{} aktuelles untermenu.menupunkt [aktuelles untermenu.belegt].{} aktuelles untermenu:{} aktuelles menu.einzelmenu [stelle].{} - stelle:{} aktuelles menu.anzahl hauptmenupunkte.{} normierter menupunkt:{} blank + compress (punktbezeichnung).{} ueberpruefe das kuerzel:{} TEXT VAR kurz :: compress (kuerzel);{} IF kuerzel ist zu lang{} THEN bereinige eintragungen (16){} ELIF kuerzel ist schon vorhanden{} THEN bereinige eintragungen (17){} FI.{} kuerzel ist zu lang:{} length (kurz) > 1.{} kuerzel ist schon vorhanden:{} (length (kurz) = 1) AND (pos (vorhandene kuerzel, kurz) > 0).{} - vorhandene kuerzel:{} TEXT VAR liste :: "";{} INT VAR zeiger;{} FOR zeiger FROM 1 UPTO aktuelles untermenu.belegt REP{} liste CAT aktuelles untermenu.menupunkt [zeiger].punktkuerzel{} PER;{} liste.{} ueberpruefe die punktbreite:{} IF length (compress (punktbezeichnung)) > maxmenubreite - 10{} THEN bereinige eintragungen (18){} FI.{} ueberpruefe die eintragsnummer:{} IF aktuelles untermenu.belegt = maxuntermenupunkte{} THEN bereinige eintragungen (19){} - FI.{} organisiere menu neu:{} IF neue punktlaenge > aktuelles untermenu.maxlaenge{} THEN aktuelles untermenu.maxlaenge := neue punktlaenge{} FI.{} neue punktlaenge:{} length (aktueller menupunkt.punktname).{}END PROC menufunktionseintrag;{}PROC menufunktion (TEXT CONST kuerzel, punktbezeichnung,{} prozedurname, infotext):{} menufunktionseintrag (kuerzel, punktbezeichnung, prozedurname, infotext,{} TRUE){}END PROC menufunktion;{} -PROC trennlinie:{} menufunktionseintrag ("", trennzeilensymbol, "", "", FALSE){}END PROC trennlinie;{}PROC schliesse menu:{} menuleiste. belegt INCR 1;{} menuleiste.menu [menuleiste.belegt] := aktuelles menu;{} menu ist geoeffnet := FALSE{}END PROC schliesse menu;{}PROC schliesse menukarte:{} forget (ds);{} page; out (piep); put (card finished){}END PROC schliesse menukarte;{}PROC testinstallation (TEXT CONST kartenname):{} ueberpruefe menukarte;{} nimm installation vor.{} - ueberpruefe menukarte:{} IF NOT exists (kartenname){} THEN errorstop (fehlermeldung [20] + kartenname + fehlermeldung [21]){} ELIF (pos (kartenname, menutafelpraefix) <> 1){} OR (type (old (kartenname)) <> menutafeltype){} THEN errorstop (fehlermeldung [20] + kartenname + fehlermeldung [22]){} FI.{} nimm installation vor:{} TEXT CONST neuer kartenname{} :: kartenname + " von Task '" + name (myself) + "'";{} command dialogue (FALSE);{} - rename (kartenname, neuer kartenname);{} save (neuer kartenname,task (mmtaskname));{} forget (neuer kartenname, quiet);{} reset dialog;{} install menu (neuer kartenname, FALSE);{} fetch (neuer kartenname, task (mmtaskname));{} rename (neuer kartenname, kartenname);{} command dialogue (TRUE);{} page; out (piep); put (install finished){}END PROC testinstallation;{}END PACKET ls menu generator 2;{} +PACKET ls menu generator 2 DEFINES + oeffne menukarte, + oeffne menu, + oberbegriff, + menufunktion, + trennlinie, + schliesse menu, + schliesse menukarte, + testinstallation: +LET menutafeltype = 1954, + kennung = "ls - Menu - Generator", + mm taskname = "ls-MENUKARTEN", + menutafelpraefix = "ls-MENUKARTE:", + menu grundtext = "ls-MENUBASISTEXTE", + zwischenablagename = "MENU-ZWISCHENABLAGEDATEI INTERN"; + +LET maxmenus = 6, + maxmenutexte = 300, + maxinfotexte = 2000, + maxhauptmenupunkte = 10, + maxuntermenupunkte = 15, + maxmenubreite = 71; (* Breite der Hauptmenüzeile - 2 *) +LET blank = " ", + cleop = ""4"", + piep = ""7"", + trennzeilensymbol = "###", + bleibt leer symbol = "***", + hauptmenuluecke = " "; +LET dummyname = "Dummy für Anwendertexte", + + install finished = "Installation abgeschlossen!", + card finished = "Menukartengenerierung abgeschlossen!", + filetype = 1003; +TYPE MENUPUNKT = STRUCT (TEXT punktkuerzel, + punktname, + procname, + boxtext, + BOOL aktiv, + angewaehlt), + EINZELMENU = STRUCT (INT belegt, + TEXT ueberschrift, + + INT anfangsposition, + maxlaenge, + ROW maxuntermenupunkte MENUPUNKT menupunkt, + INT aktueller untermenupunkt, + TEXT startprozedurname, + leaveprozedurname), + MENU = STRUCT (TEXT menuname, + INT anzahl hauptmenupunkte, + ROW maxhauptmenupunkte EINZELMENU einzelmenu, + + TEXT menueingangsprozedur, + menuausgangsprozedur, + menuinfo, + lizenznummer, + versionsnummer, + INT hauptmenuzeiger, + untermenuanfang, + untermenuzeiger), + INFOTEXT = STRUCT (INT anzahl infotexte, + ROW maxinfotexte TEXT stelle), + + MENUTEXT = STRUCT (INT anzahl menutexte, + ROW maxmenutexte TEXT platz), + MENULEISTE = STRUCT (INT belegt, zeigeraktuell, zeigerhintergrund, + ROW maxmenus MENU menu, + MENUTEXT menutext, + INFOTEXT infotext); +ROW 14 TEXT CONST aussage :: ROW 14 TEXT : ( +"ACHTUNG - Eine Menukarte mit diesem Namen existiert bereits - ACHTUNG", +"Kann die bereits existierende Menukarte gelöscht werden", + +"Dann kann keine neue Menukarte mit diesem Namen erstellt werden!", +"Zum Weitermachen bitte irgendeine Taste tippen!", +"Sollen auch Anwendungstexte in die Menukarte aufgenommen werden", +"Auswahl der Datei, in der die Anwendungstexte stehen.", +"Bitte die gewünschte Datei ankreuzen!", +"Durchgang 1 von 2 Durchgängen - in Arbeit ist Zeile: ", +"Durchgang 2 von 2 Durchgängen - in Arbeit ist Zeile: ", +"", +"Einlesen von Texten aus Datei : ", +"Bearbeitet wird Menu : ", +"Eingetragen wird Oberbegriff : ", + +"Eingetragen wird Menufunktion : " +); +ROW 22 TEXT CONST fehlermeldung :: ROW 22 TEXT : ( +"Ohne die Datei '", +"' "13""10""10" ist die Menuerstellung "15"unmöglich "14"!!", +"Hier muß unbedingt eine Datei angekreuzt werden!", +"Ausgewählte Datei hat falschen Typ (<> 1003) )", +"Zu viele Anwendungstexte in der Datei ", +"Anführungszeichen fehlt am Anfang oder Ende der Zeile ", +"Anführungszeichen fehlt irgendwo in Zeile ", +"Die angegebene Datei existiert nicht!", +"Menukarte noch nicht geöffnet ('oeffne menukarte' fehlt)! ", + +"Vorausgehendes Menu nicht geschlossen! ", +"Zu viele Menus in der Menukarte (> " + text (maxmenus) + ")!", +"Menuname ist mehrfach vorhanden!", +"Menu noch nicht geoeffnet ('oeffne menu' fehlt)!", +"Zu viele Oberbegriffe in einem Menu (> " + text (maxhauptmenupunkte) + ")!", +"Die Kopfzeile ist zu lang (> " + text (maxmenubreite) + ")!", +"Menupunkt-Kürzel ist länger als ein Zeichen!", +"Menupunkt-Kürzel kommt mehrfach vor (nicht eindeutig)!", +"Menupunkt-Bezeichnung ist zu lang!", +"Zu viele (> " + text (maxuntermenupunkte) + ") Menupunkte in einem Pull-Down-Menu!", + +"Menukarte '", +"' gibt es nicht in dieser Task!", +"' hat falsche(n) Typ/Bezeichnung" +); +TEXT VAR menuinfotextdateiname, + aktueller menudateiname; +BOOL VAR menuleiste ist bereit :: FALSE, + menu ist geoeffnet :: FALSE; +BOUND MENULEISTE VAR menuleiste; +BOUND MENUTEXT VAR basistexte; +BOUND MENU VAR aktuelles menu; +DATASPACE VAR ds; +OP := (MENUTEXT VAR ziel, MENUTEXT VAR quelle): + INT VAR z; + ziel.anzahl menutexte := quelle.anzahl menutexte; + FOR z FROM 1 UPTO quelle.anzahl menutexte REP + + ziel.platz [z] := quelle.platz [z] + PER +END OP :=; +OP := (MENU VAR ziel, MENU CONST quelle): + CONCR (ziel) := CONCR (quelle) +END OP :=; +OP := (EINZELMENU VAR ziel, EINZELMENU CONST quelle): + CONCR (ziel) := CONCR (quelle) +END OP :=; +OP := (MENUPUNKT VAR ziel, MENUPUNKT CONST quelle): + CONCR (ziel) := CONCR (quelle) +END OP :=; +PROC oeffne menukarte (TEXT CONST menukartenname): + gib bildschirmhinweis aus; + ueberpruefe voraussetzungen; + erfrage den namen der datei mit den anwendertexten; + + erstelle neue menuleiste. + gib bildschirmhinweis aus: + page; out (center (invers (kennung))). + ueberpruefe voraussetzungen: + ueberpruefe ob basistexte vorhanden sind; + ueberpruefe ob menukarte schon vorhanden ist. + ueberpruefe ob basistexte vorhanden sind: + IF NOT exists (menu grundtext) + THEN gib hinweis und brich ab + FI. + gib hinweis und brich ab: + disable stop; + fetch (menu grundtext, /mm taskname); + IF is error + THEN clear error; + enable stop; + + cursor (1, 4); out (cleop); + errorstop (fehlermeldung [1] + menu grundtext + fehlermeldung [2]) + ELSE clear error; + enable stop + FI. + ueberpruefe ob menukarte schon vorhanden ist: + IF exists (menukarte) + THEN gib hinweis auf vorhandene menukarte; + frage ob die alte karte geloescht werden darf + FI. + menukarte: + menutafelpraefix + menukartenname. + gib hinweis auf vorhandene menukarte: + cursor (1, 4); out (cleop); + + cursor (1, 4); out (center (menukarte)); + cursor (1, 6); out (center (invers (aussage [1]))). + frage ob die alte karte geloescht werden darf: + cursor (2, 9); + IF yes (aussage [2]) + THEN forget (menukarte, quiet) + ELSE weiterarbeit ist unmoeglich + FI. + weiterarbeit ist unmoeglich: + cursor (1, 12); out (center (invers (aussage [3]))); + cursor (2, 15); out (aussage [4]); + cursor (2, 16); pause; page; + errorstop (""). + erfrage den namen der datei mit den anwendertexten: + + cursor (1, 4); out (cleop); + IF yes (aussage [5]) + THEN biete dateiauswahl an + ELSE erzeuge dateidummy + FI. + biete dateiauswahl an: + menuinfotextdateiname := one (2, 6, 77, 19, ALL myself, + aussage [6], aussage [7]); + ueberpruefe den dateinamen; + ueberpruefe den dateityp. + ueberpruefe den dateinamen: + IF compress (menuinfotextdateiname) = "" + THEN page; errorstop (fehlermeldung [3]) + FI. + ueberpruefe den dateityp: + + IF datei hat falschen typ + THEN page; errorstop (fehlermeldung [4]) + FI. + datei hat falschen typ: + ds := old (menuinfotextdateiname); + IF type (ds) <> filetype + THEN forget (ds); TRUE + ELSE forget (ds); FALSE + FI. + erzeuge dateidummy: + forget (dummyname, quiet); + FILE VAR datei :: sequential file (modify, dummyname); + to line (datei, 1); + menuinfotextdateiname := dummyname. + erstelle neue menuleiste: + INT VAR zeiger; + TEXT VAR zeileninhalt; + + initialisiere werte; + aktueller menudateiname := menukarte; + menuleiste := new (aktueller menudateiname); + type (old (aktueller menudateiname), menutafeltype); + menuleiste.belegt := 0; + menuleiste ist bereit := TRUE; + trage menubasistexte ein; + trage anwendungstexte ein. + initialisiere werte: + menuleiste ist bereit := FALSE; + menu ist geoeffnet := FALSE. + trage menubasistexte ein: + basistexte := old (menu grundtext); + + menuleiste.menutext := basistexte. + trage anwendungstexte ein: + konvertiere (menuinfotextdateiname, zwischenablagename, + menuleiste.infotext.anzahl infotexte); + ueberpruefe anwendungstextanzahl; + trage anwendungstexte in die menuleiste. + ueberpruefe anwendungstextanzahl: + IF menuleiste.infotext.anzahl infotexte > maxinfotexte + THEN forget (zwischenablagename, quiet); + forget (aktueller menudateiname, quiet); + errorstop (fehlermeldung [5] + "'" + menuinfotextdateiname + "'") + + FI. + trage anwendungstexte in die menuleiste: + gib hinweis auf anwendungstexteintrag; + FILE VAR ein :: sequential file (input, zwischenablagename); + FOR zeiger FROM 1 UPTO menuleiste.infotext.anzahl infotexte REP + getline (ein, zeileninhalt); + menuleiste.infotext.stelle [zeiger] := zeileninhalt; + cout (zeiger) + PER; + forget (zwischenablagename, quiet); + forget (dummyname , quiet). + gib hinweis auf anwendungstexteintrag: + cursor (1, 7); out (aussage [9]). + +END PROC oeffne menukarte; +PROC konvertiere (TEXT CONST eingabedatei, ausgabedatei, + INT VAR anzahl konvertierter saetze): + loesche ausgabedatei; + untersuche eingabedatei; + konvertiere saetze. + loesche ausgabedatei: + IF exists (ausgabedatei) + THEN forget (ausgabedatei, quiet) + FI. + untersuche eingabedatei: + IF NOT exists (eingabedatei) + THEN errorstop (fehlermeldung [8]) + FI. + konvertiere saetze: + gib hinweis; + konvertiere satzweise. + + gib hinweis: + cursor (1, 4); out (cleop); + cursor (1, 4); out (aussage [11] + "'" + eingabedatei + "'"); + cursor (1, 6); out (aussage [ 8]); + anzahl konvertierter saetze := 0. + konvertiere satzweise: + TEXT VAR zeileninhalt :: ""; + FILE VAR eingabe :: sequential file (input, eingabedatei); + WHILE NOT eof (eingabe) REP + behandle eine dateizeile + PER; + optimiere ausgabedatei. + behandle eine dateizeile: + getline (eingabe, zeileninhalt); + anzahl konvertierter saetze INCR 1; + + cout (anzahl konvertierter saetze); + untersuche zeile; + wandle die zeile um; + FILE VAR aus :: sequential file (output, ausgabedatei); + write (aus, textausgabe). + untersuche zeile: + zeileninhalt := compress (zeileninhalt); + IF zeileninhalt = "" + THEN zeileninhalt := """""" + FI; + IF (zeileninhalt SUB 1) <> """" + OR (zeileninhalt SUB length (zeileninhalt)) <> """" + THEN bereite abgang vor; + errorstop (fehlermeldung [6] + text (anzahl konvertierter saetze)) + + FI. + wandle die zeile um: + TEXT VAR textausgabe :: "", codekette; + zeileninhalt := subtext (zeileninhalt, 2, length (zeileninhalt) - 1); + WHILE gaensefuesschenposition > 0 REP + textausgabe CAT subtext (zeileninhalt, 1, gaensefuesschenposition - 1); + zeileninhalt := subtext (zeileninhalt, gaensefuesschenposition); + codekette := subtext (zeileninhalt, 1, pos (zeileninhalt, """", 2)); + IF codekette = """7""" + THEN textausgabe CAT ""7"" + + ELIF codekette = """5""" + THEN textausgabe CAT ""5"" + ELIF codekette = """4""" + THEN textausgabe CAT ""4"" + ELIF codekette = """10""" + THEN textausgabe CAT ""10"" + ELIF codekette = """13""" + THEN textausgabe CAT ""13"" + ELIF codekette = """14""" + THEN textausgabe CAT ""14"" + ELIF codekette = """15""" + THEN textausgabe CAT ""15"" + ELIF codekette = """""" + THEN textausgabe CAT """" + + ELSE errorstop (fehlermeldung [7] + + text (anzahl konvertierter saetze)) + FI; + zeileninhalt := subtext (zeileninhalt, 1 + length (codekette)) + PER; + textausgabe CAT zeileninhalt. + gaensefuesschenposition: + pos (zeileninhalt, """"). + bereite abgang vor: + forget (ausgabedatei, quiet); + line (2). + optimiere ausgabedatei: + FILE VAR ausgabe :: sequential file (modify, ausgabedatei); + WHILE lines (ausgabe) > 0 CAND letzter satz ist leer REP + + to line (ausgabe, lines (ausgabe)); + delete record (ausgabe); + anzahl konvertierter saetze DECR 1; + cout (anzahl konvertierter saetze ) + PER. + letzter satz ist leer: + TEXT VAR satz; + to line (ausgabe,lines (ausgabe)); + read record (ausgabe, satz); + IF compress (satz) = "" OR compress (satz) = ""13"" + THEN TRUE + ELSE FALSE + FI. +END PROC konvertiere; +PROC oeffne menu (TEXT CONST name, einstiegsproc, ausstiegsproc, + itext, ltext, vtext): + + gib hinweis auf geoeffnetes menu; + ueberpruefe auf ungereimtheiten; + nimm eintragungen in datenraum vor. + gib hinweis auf geoeffnetes menu: + cursor (1, 4); out (cleop); + out (aussage [12]); out (invers (name)); + cursor (1, 6). + ueberpruefe auf ungereimtheiten: + pruefe auf bereits geoeffnete menuliste; + pruefe auf noch geoeffnetes menu; + pruefe auf noch freie menuplaetze; + pruefe auf schon vorhandenen menunamen. + pruefe auf bereits geoeffnete menuliste: + IF NOT menuleiste ist bereit + + THEN bereinige eintragungen (9) + FI. + pruefe auf noch geoeffnetes menu: + IF menu ist geoeffnet + THEN bereinige eintragungen (10) + FI. + pruefe auf noch freie menuplaetze: + IF menuleiste.belegt = maxmenus + THEN bereinige eintragungen (11) + FI. + pruefe auf schon vorhandenen menunamen: + IF menuname schon vorhanden + THEN bereinige eintragungen (12) + FI. + menuname schon vorhanden: + INT VAR i; + FOR i FROM 1 UPTO menuleiste.belegt REP + + untersuche einzelnen menunamen + PER; + FALSE. + untersuche einzelnen menunamen: + IF menuleiste.menu [i].menuname = compress (name) + THEN LEAVE menuname schon vorhanden WITH TRUE + FI. + nimm eintragungen in datenraum vor: + forget (ds); + ds := nilspace; + aktuelles menu := ds; + init (aktuelles menu); + aktuelles menu.menuname := compress (name); + aktuelles menu.menueingangsprozedur := compress (einstiegsproc); + + aktuelles menu.menuausgangsprozedur := compress (ausstiegsproc); + IF itext <> "" + THEN aktuelles menu.menuinfo := itext; + aktuelles menu.lizenznummer := ltext; + aktuelles menu.versionsnummer := vtext + ELSE aktuelles menu.menuinfo := bleibt leer symbol; + aktuelles menu.lizenznummer := ""; + aktuelles menu.versionsnummer := "" + FI; + menu ist geoeffnet := TRUE. +END PROC oeffne menu; + +PROC oeffne menu (TEXT CONST name, einstiegsproc, ausstiegsproc): + oeffne menu (name, einstiegsproc, ausstiegsproc, "", "", "") +END PROC oeffne menu; +PROC oeffne menu (TEXT CONST name): + oeffne menu (name, "", "", "", "", "") +END PROC oeffne menu; +PROC bereinige eintragungen (INT CONST nummer): + forget (ds); + forget (aktueller menudateiname, quiet); + menuleiste ist bereit := FALSE; + menu ist geoeffnet := FALSE; + errorstop (fehlermeldung [nummer]) +END PROC bereinige eintragungen; + +PROC init (MENU VAR m): + m.menuname := ""; + m.hauptmenuzeiger := 1; + m.untermenuanfang := 0; + m.untermenuzeiger := 0; + m.menueingangsprozedur := ""; + m.menuausgangsprozedur := ""; + m.menuinfo := ""; + m.versionsnummer := ""; + m.anzahl hauptmenupunkte := 0; + belege hauptmenupunkte. + belege hauptmenupunkte: + INT VAR i; + FOR i FROM 1 UPTO maxhauptmenupunkte REP + + aktuelles einzelmenu.belegt := 0; + aktuelles einzelmenu.ueberschrift := ""; + aktuelles einzelmenu.anfangsposition := 0; + aktuelles einzelmenu.maxlaenge := 0; + aktuelles einzelmenu.aktueller untermenupunkt := 1; + aktuelles einzelmenu.startprozedurname := ""; + aktuelles einzelmenu.leaveprozedurname := ""; + belege untermenuepunkte + PER. + belege untermenuepunkte: + + INT VAR j; + FOR j FROM 1 UPTO maxuntermenupunkte REP + aktueller menupunkt.punktkuerzel := ""; + aktueller menupunkt.punktname := ""; + aktueller menupunkt.procname := ""; + aktueller menupunkt.boxtext := ""; + aktueller menupunkt.aktiv := TRUE; + aktueller menupunkt.angewaehlt := FALSE + PER. + aktuelles einzelmenu: m.einzelmenu [i]. + aktueller menupunkt: aktuelles einzelmenu.menupunkt [j]. +END PROC init; +PROC oberbegriff (TEXT CONST punktname, startprocname, leaveprocname): + + gib hinweis auf oberbegriff; + untersuche ob menu geoeffnet und bereit ist; + untersuche oberbegriffe; + trage neuen oberbegriff ein; + notiere die anfangsposition; + notiere start und leaveprozedur; + erhoehe die anzahl der oberbegriffe. + gib hinweis auf oberbegriff: + cursor (1, 6); out (cleop); + cursor (1, 6); out (aussage [13]); out (invers (punktname)); line. + untersuche ob menu geoeffnet und bereit ist: + IF NOT menuleiste ist bereit + THEN bereinige eintragungen ( 9) + + FI; + IF NOT menu ist geoeffnet + THEN bereinige eintragungen (13) + FI. + untersuche oberbegriffe: + IF zu viele oberbegriffe + THEN bereinige eintragungen (14) + FI; + IF gesamtlaenge > maxmenubreite + THEN bereinige eintragungen (15) + FI. + zu viele oberbegriffe: + aktuelles menu.anzahl hauptmenupunkte = maxhauptmenupunkte. + gesamtlaenge: + gesamtlaenge ohne letzten punkt + length (compress (punktname)). + gesamtlaenge ohne letzten punkt: + length (hauptmenuzeile). + + hauptmenuzeile: + INT VAR zaehler; + TEXT VAR zeile :: ""; + schreibe menunamen; + schreibe oberbegriffe; + zeile. + schreibe menunamen: + IF aktuelles menu. menuname <> "" + THEN zeile CAT aktuelles menu.menuname; + zeile CAT ":" + FI. + schreibe oberbegriffe: + FOR zaehler FROM 1 UPTO aktuelles menu.anzahl hauptmenupunkte REP + zeile CAT hauptmenuluecke; + zeile CAT aktuelles menu. einzelmenu [zaehler].ueberschrift + PER; + zeile CAT hauptmenuluecke. + + trage neuen oberbegriff ein: + neuer menupunkt.ueberschrift := compress (punktname). + notiere die anfangsposition: + neuer menupunkt.anfangsposition := gesamtlaenge ohne letzten punkt + 1. + notiere start und leaveprozedur: + neuer menupunkt.startprozedurname := compress (startprocname); + neuer menupunkt.leaveprozedurname := compress (leaveprocname). + neuer menupunkt: + aktuelles menu.einzelmenu [aktuelles menu.anzahl hauptmenupunkte + 1]. + erhoehe die anzahl der oberbegriffe: + + aktuelles menu.anzahl hauptmenupunkte INCR 1. +END PROC oberbegriff; +PROC oberbegriff (TEXT CONST punktname): + oberbegriff (punktname, "", "") +END PROC oberbegriff; +PROC menufunktionseintrag (TEXT CONST kuerzel, + punktbezeichnung, + prozedurname, + infotext, + BOOL CONST ist aktiv): + gib hinweis auf menufunktionseintrag; + trage menupunkt ein; + organisiere menu neu. + + gib hinweis auf menufunktionseintrag: + line; + out (aussage [14]); + out ("'" + kuerzelzeichen + "' - " + punktname). + kuerzelzeichen: + IF kuerzel = "" THEN " " ELSE kuerzel FI. + punktname: + IF punktbezeichnung = trennzeilensymbol + THEN "----------" + ELSE punktbezeichnung + FI. + trage menupunkt ein: + ueberpruefe das kuerzel; + ueberpruefe die punktbreite; + ueberpruefe die eintragsnummer; + aktuelles menu.einzelmenu [stelle].belegt INCR 1; + + aktueller menupunkt.punktkuerzel := compress (kuerzel); + aktueller menupunkt.punktname := normierter menupunkt; + aktueller menupunkt.procname := compress (prozedurname); + aktueller menupunkt.boxtext := infotext; + aktueller menupunkt.aktiv := ist aktiv; + aktueller menupunkt.angewaehlt := FALSE. + aktueller menupunkt: + aktuelles untermenu.menupunkt [aktuelles untermenu.belegt]. + aktuelles untermenu: + aktuelles menu.einzelmenu [stelle]. + + stelle: + aktuelles menu.anzahl hauptmenupunkte. + normierter menupunkt: + blank + compress (punktbezeichnung). + ueberpruefe das kuerzel: + TEXT VAR kurz :: compress (kuerzel); + IF kuerzel ist zu lang + THEN bereinige eintragungen (16) + ELIF kuerzel ist schon vorhanden + THEN bereinige eintragungen (17) + FI. + kuerzel ist zu lang: + length (kurz) > 1. + kuerzel ist schon vorhanden: + (length (kurz) = 1) AND (pos (vorhandene kuerzel, kurz) > 0). + + vorhandene kuerzel: + TEXT VAR liste :: ""; + INT VAR zeiger; + FOR zeiger FROM 1 UPTO aktuelles untermenu.belegt REP + liste CAT aktuelles untermenu.menupunkt [zeiger].punktkuerzel + PER; + liste. + ueberpruefe die punktbreite: + IF length (compress (punktbezeichnung)) > maxmenubreite - 10 + THEN bereinige eintragungen (18) + FI. + ueberpruefe die eintragsnummer: + IF aktuelles untermenu.belegt = maxuntermenupunkte + THEN bereinige eintragungen (19) + + FI. + organisiere menu neu: + IF neue punktlaenge > aktuelles untermenu.maxlaenge + THEN aktuelles untermenu.maxlaenge := neue punktlaenge + FI. + neue punktlaenge: + length (aktueller menupunkt.punktname). +END PROC menufunktionseintrag; +PROC menufunktion (TEXT CONST kuerzel, punktbezeichnung, + prozedurname, infotext): + menufunktionseintrag (kuerzel, punktbezeichnung, prozedurname, infotext, + TRUE) +END PROC menufunktion; + +PROC trennlinie: + menufunktionseintrag ("", trennzeilensymbol, "", "", FALSE) +END PROC trennlinie; +PROC schliesse menu: + menuleiste. belegt INCR 1; + menuleiste.menu [menuleiste.belegt] := aktuelles menu; + menu ist geoeffnet := FALSE +END PROC schliesse menu; +PROC schliesse menukarte: + forget (ds); + page; out (piep); put (card finished) +END PROC schliesse menukarte; +PROC testinstallation (TEXT CONST kartenname): + ueberpruefe menukarte; + nimm installation vor. + + ueberpruefe menukarte: + IF NOT exists (kartenname) + THEN errorstop (fehlermeldung [20] + kartenname + fehlermeldung [21]) + ELIF (pos (kartenname, menutafelpraefix) <> 1) + OR (type (old (kartenname)) <> menutafeltype) + THEN errorstop (fehlermeldung [20] + kartenname + fehlermeldung [22]) + FI. + nimm installation vor: + TEXT CONST neuer kartenname + :: kartenname + " von Task '" + name (myself) + "'"; + command dialogue (FALSE); + + rename (kartenname, neuer kartenname); + save (neuer kartenname,task (mmtaskname)); + forget (neuer kartenname, quiet); + reset dialog; + install menu (neuer kartenname, FALSE); + fetch (neuer kartenname, task (mmtaskname)); + rename (neuer kartenname, kartenname); + command dialogue (TRUE); + page; out (piep); put (install finished) +END PROC testinstallation; +END PACKET ls menu generator 2; + -- cgit v1.2.3