Aktives GUI-Element
Statisches GUI-Element
Quelltext
WPS-Objekt
Datei/Pfad
Befehlszeile
Inhalt Eingabefeld
[Tastenkombination]
Rechtschreibprüfung im EPM mit einfach umschaltbaren Wörterbuchdateien
Der erweiterte Editor (EPM.EXE) ist ein universelles Werkzeug, das nicht nur zum Bearbeiten einfacher Textdateien sondern z. B. auch als Frontend für LaTeX gute Dienste leistet. Die integrierte Wörterbuchfunktion kann dabei sogar zur Rechtschreibprüfung auf den LaTeX-Quelltext angewandt werden. Neben der Möglichkeit, die von LaTeX erzeugte DVI-Datei mit ISPELL auf Rechtschreibung zu prüfen, ist das natürlich ein besseres Arbeiten, da erforderliche Korrekturen sofort im Editor vorgenommen werden können. Bisher waren dazu, neben einem älteren Paket, die Wörterbuchdateien von IBMWORKS (Bonuspak) nutzbar.
Damit ergab sich sofort die Frage nach einer schnelle Möglichkeit, die aktuelle Wörterbuchkonfiguration des EPM ändern, also einfach zwischen alter und neuer deutscher Rechtschreibung oder anderen Sprachen wechseln zu können.
Da die Programmierung zusätzlicher Menüaufrufe einschließlich der zugehörigen Routinen mit der Programmiersprache E zum EPM kein Problem ist, war es auch naheliegend, das Menü zur Umschaltung der aktuell genutzten Wörterbuchdatei (zusammen mit der entsprechenden vom Nutzer angelegten Datei) zu ergänzen.
Bei der hier vorgestellten Variante wurde besonders darauf Wert gelegt, dass
- keine neuen Einträge in der Datei EPM.INI angelegt werden müssen,
- keine Rekompilierung der Datei EPM.EX erforderlich
- und der Overhead zur Verwaltung mehrerer Wörterbuchdateien möglichst gering ist.
Erstellung des Menüs für Wörterbücher
Bei richtig installierter Rechtschreibunterstützung (Optionen > Anpassung > Einstellungen > Pfade bzw. in der englischsprachigen Version: Options > Preferences > Settings > Paths) werden die Wörterbucheinstellungen durch den EPM in der Datei EPM.INI gesichert.
Mit dem folgenden Quellcode kann die Umschaltfunktion in das Menü integriert werden.
/* SwitchDict.E */
Konstanten
Zuerst erfolgt eine Definition von Text-Konstanten, die beim Aufruf der neuen Funktion(en) in der Statuszeile erscheinen sollen:
const DICT_BAR_MSG = 'Wörterbuchdatei Ändern' ActDicMSG = 'Umschalten auf Wörterbuchdatei:' definit universal defaultmenu, APP_HINI, DICTIONARY_FILENAME, ADDENDA_FILENAME, Dict_ID, Add_ID, SwDict
Die Prozedur(en) definit
werden beim Start des EPM (genauer bei jedem Öffnen eines neuen Fensters)
ausgeführt und enthalten deshalb die grundsätzlich einzusetzenden Werte. Der Zugriff auf Variablen und Konstanten,
die im EPM Verwendung finden, geschieht durch das Schlüsselwort universal
.
Variablen
Damit ist auch die Definition neuer globaler Variablen möglich, die über die jeweiligen Prozeduren hinweg gültig sind. Benötigt werden:
Interne Variablen | |
---|---|
Variable | Erläuterung |
defaultmenu | Handle zum Standard-Menü |
APP_HINI | Handle zur Datei EPM.INI |
DICTIONARY_FILENAME | Interne Variable des EPM, die den Pfad und Dateinamen des Wörterbuches enthält |
ADDENDA_FILENAME | Interne Variable des EPM, die den Pfad und Dateinamen des vom Nutzer erstellten Ergänzungswörterbuches enthält |
Neue Variablen | |
Dict_ID | Neu definierte Variable, Feld-Identifikator für Wörterbuchdateien |
Add_ID | Neu definierte Variable, Feld-Identifikator für Ergänzungs-Wörterbuchdateien |
SwDict | Neu definierte Variable, Schalter für aktuelle Dateien und Index für Feld-Variablen |
Für den Zugriff auf die verschiedenen Dateien mit einer Prozedur ist die Nutzung einer Feldstruktur unumgänglich. Die Formulierung in der Sprache E ist zwar etwas gewöhnungsbedürftig aber für die vorliegende Aufgabe ausreichend. Die Übergabe an die Felder kann nur über Variablen geschehen, die die Pfade der Dateien enthalten und damit entsprechend des vorhandenen Systems angepasst werden müssen (die Einbeziehung dieser Grundeinstellungen in die Menüstruktur des EPM ist zwar prinzipiell möglich, erfordert aber zusätzlichen Verwaltungsaufwand, z. B. über zusätzliche Einträge in der INI-Datei).
Für die Speicherung der Wörterbuch-Dateien bietet sich an, das HOME-Verzeichnis zu nutzen, was mit
Hom = get_env('home')
abgefragt werden kann.
Dic1 = HOM||'\DEUTSCH.DIC' Dic2 = HOM||'\DEUTSCH2.DIC' Dic3 = HOM||'US.DCT' Add1 = HOM||'\DEUTSCH.ADL' Add2 = HOM||'\DEUTSCH2.ADL' Add3 = HOM||'\US.ADL' do_array 1, Dict_ID, 'Dict' do_array 2, Dict_ID, '1', Dic1 do_array 2, Dict_ID, '2', Dic2 do_array 2, Dict_ID, '3', Dic3 do_array 1, Add_ID, 'Add' do_array 2, Add_ID, '1', Add1 do_array 2, Add_ID, '2', Add2 do_array 2, Add_ID, '3', Add3
Der Pfad der aktuellen Wörterbuchdatei wird über das Schlüsselwort DICTIONARY
aus der Datei
EPM.INI ermittelt und danach die Variable SwDict gesetzt, deren Wert zur
Indizierung der Feldvariablen und zur Kennzeichnung im Menü benötigt wird.
AktDict = queryprofile(APP_HINI,'EPM','DICTIONARY') if AktDict = Dic1 then SwDict = 1 elseif AktDict = Dic2 then SwDict = 2 elseif AktDict = Dic3 then SwDict = 3 endif
Definieren der Menüeinträge
Zum Neuaufbau des Menüs wird das Hilfemenü vorübergehend gelöscht:
deletemenu defaultmenu, 6, 0, 0
und das zusätzliche Untermenü eingefügt:
buildsubmenu defaultmenu,2000,'~Wörterbuchdatei',\1DICT_BAR_MSG,0x31,0 buildmenuitem defaultmenu,2000,2001,'Deutsch-Alt','SetDic 1'\1ActDicMSG Dic1,0,0 buildmenuitem defaultmenu,2000,2002,'Deutsch-Neu','SetDic 2'\1ActDicMSG Dic2,0,0 buildmenuitem defaultmenu,2000,2003,'US-English','SetDic 3'\1ActDicMSG Dic3,0,0
Die Identifikatoren 2000 ... 2003 dienen dem EPM zur Unterscheidung der Strukturen und dürfen nicht mehrfach
auftreten (bei weiteren eigenen Menüergänzungen)! Das bei Anwahl des jeweiligen Untermenüpunktes auszuführende
Kommando ist hier mit SetDict
bezeichnet und wird weiter unten definiert. Nach dem Kommando schließt
sich der in der Konstanten ActDicMSG festgelegte Kommentar an, der bei Aufruf in der Nachrichtenzeile des
EPM erscheint. Der Stil des Untermenüs wird in obigen Anweisungen durch die vorletzte Ziffer bewirkt. Hier wird der
Stil MIS_TEXT|MIS_SUBDMENU|MIS_MULTMENU = 0x31
genutzt. Die letzte Ziffer, das Attribut, wird erst
während der Menü-Initialisierung gesetzt.
Prinzipiell kann bei Einbeziehung der entsprechenden Header-Datei des Programmier-Toolkits (PMWIN.H) auch mit den symbolischen Konstanten gearbeitet werden.
Nach dem Anhängen des Hilfemenüs:
call readd_help_menu()
wird das gesamte Menü dargestellt:
showmenu defaultmenu
Soll ein größerer Auswahlbereich von Wörterbuchdateien zur Anwendung kommen, müssen die Angaben der Pfade, der Feldzuweisungen und der Untermenüpunkte entsprechend erweitert werden.
Menüaktionen
Als Nächstes erfolgt die Definition der Routine, die bei den jeweiligen Auswahlen im Menü aufgerufen wird:
defc SetDic universal APP_HINI, DICTIONARY_FILENAME, ADDENDA_FILENAME, SwDict, Dict_ID, Add_ID
Mit der Übergabe des Argumentes an die Variable SwDict:
SwDict = Arg(1)
kann der Zugriff auf die in den Feldvariablen gespeicherten Pfade erfolgen:
do_array 7, Dict_ID, SwDict, Dict do_array 7, Add_ID, SwDict, Add .
Beide Pfade werden dabei nicht nur den Variablen, die der EPM momentan nutzt übertragen, sondern auch in der INI-Datei gespeichert, damit die letzte Einstellung bei einem Neustart des EPM zur Verfügung steht.
DICTIONARY_FILENAME = Dict ADDENDA_FILENAME = Add SetProfile(APP_HINI,'EPM','DICTIONARY',Dict) SetProfile(APP_HINI,'EPM','ADDENDA',ADD)
Beim Anwahl des neuen Menüs führt der EPM folgende Routine aus, die hier dafür sorgt, dass der ausgewählte
Untermenü-Punkt, das heisst die gewählte Sprache, eine Markierung erhält. Das Attribut MIA_CHECKED =
0x2000
wird mit der internen Routine SetMenuAttribute
(in STDCTRL.E
definiert) so gesetzt, dass immer nur eine Auswahl markiert ist. Voraussetzung dafür ist der bereits bei der
Definition gesetzte und hier wiederholte Menüstil:
MIS_TEXT|MIS_SUBDMENU|MIS_MULTMENU = 0x31. defc menuinit_2000 universal SwDict SetMenuAttribute(2000, 0x31, 1) SetMenuAttribute(2001, 0x2000, SwDict<>1) SetMenuAttribute(2002, 0x2000, SwDict<>2) SetMenuAttribute(2003, 0x2000, SwDict<>3)
Aktivierung
Nach Anpassung der Pfade kann dieser Quellcode mit dem ETPM in eine Binärform compiliert werden:
ETPM SwitchDict.E
Der Compiler ETPM.EXE ist in dem auf vielen Servern verfügbaren Paket epm603b.zip enthalten.
Die Einbindung erfolgt nach Kompilierung durch eine Datei mit dem Namen PROFILE.ERX, die die Zeile
'link SwitchDict.EX'
enthalten muss. Wenn die REXX-Profil-Unterstützung im EPM (Optionen > Anpassung > Einstellungen > Verschiedenes > REXX-Profil) aktiviert ist, steht dann der neue Untermenüpunkt zur Verfügung (siehe Abb. 1).
Abb. 1: EPM mit Möglichkeit zur Umschaltung der Wörterbücher im Menü
Die Angabe falscher Pfade in der Datei SwitchDict.E führt lediglich zu einer Fehlernachricht des EPM. Nach einer Korrektur ist selbstverständlich eine Neukompilierung von SwitchDict.E erforderlich.
Schlussbemerkung
Der vorliegende Code wurden für eigene Anwendungsfälle entwickelt und kann sicher noch optimiert und/oder ausgebaut werden. Denkbar ist auch die direkte Einbeziehung in die Datei MYSTUFF.E. Mit Neukompilierung der gesamten EPM-Umgebung durch ETPM EPM.E wird dann eine neue Datei EPM.EX erzeugt, die diese Ergänzung enthält und nicht der Einbeziehung über PROFILE.ERX bedarf.
Zur Einführung in die Problematik EPM-Programmierung sei neben den Beispielen im Paket EPM603b.ZIP auch auf die Artikel in der ehemaligen OS/2-Inside hingewiesen[1] bis [5].