Zum Artikel
< >

Aktives GUI-Element

Statisches GUI-Element

Quelltext

WPS-Objekt

Datei/Pfad

Befehlszeile

Inhalt Eingabefeld

[Tastenkombination]

mehr

Rechtschreibprüfung im EPM mit einfach umschaltbaren Wörterbuchdateien

von V. Weise, © April 2006

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

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:

Tab. 1: Variablen für die Implementierung der Umschaltung
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.

Sollte HOME auf Ihrem System nicht vorhanden sein, kann dem durch Erstellen eines Verzeichnisses x:\my\home, Hinzufügen von set home=x:\my\home zur CONFIG.SYS und anschließenden Systemneustart abgeholfen werden.
 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).

EPM mit Möglichkeit zur Umschaltung der Wörterbücher im Menü
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].

Formatierung: Christian Hennecke
Korrektur: Christian Hennecke
Daten und Quellen

[1] Woleck, Heinz: Gratispackung, Workshop EPM, Teil 1. OS/2-Inside (1997)3, S.64-68.
[2] Woleck, Heinz: My Editor, Workshop EPM, Teil 2. OS/2-Inside (1997)4, S.60-64.
[3] Woleck, Heinz: Profilneurose, Workshop EPM, Teil 3. OS/2-Inside (1997)6, S.64-67.
[4] Woleck, Heinz: Ein königlicher Editor, Workshop EPM, Teil 4. OS/2-Inside (1997)8, S.69-73.
[5] Woleck, Heinz: Unendliche Tiefen, Workshop EPM, Teil 5. OS/2-Inside (1997)12, S.61-64.