(******************************************************************************) (* This MODULE is Public Domain. Copy me like a beast! *) (* Christian Ledermann *) (* W”lfelkofen 2 *) (* 84166 Adlkofen *) (******************************************************************************) (* *) (* Started: 20.12.92 03:54:30 *) (* Version: 20.12.89 03:504:12:54 *) (* *) (******************************************************************************) (* *) (* Diese Software ist ohne jede Garantie. Ich verspreche *) (* keinerlei Wartung und bernehme keine Verantwortung fr Sch„den die *) (* durch die Benutzung dieses Programmes entstehen. *) (* Jegliche Ersatzansprche lehne ich ab. *) (* *) (******************************************************************************) DEFINITION MODULE EasyDialog; FROM SYSTEM IMPORT ADDRESS,WORD; TYPE TreePROC = PROCEDURE (ADDRESS, INTEGER); CONST (* Diese beiden CONSTanten sind in GEMAESBase falsch definiert !! *) EndMouseControl=2; BeginMouseControl=3; (* Zum Arbeiten also unbedingt(!!) diese hier benutzen *) PROCEDURE and(a,b:WORD):BOOLEAN; (********** Bitweiser Vergleich wie in C *********) PROCEDURE WorkTree(TreePtr :ADDRESS; StartObject,EndObject : INTEGER; Do : TreePROC); (************** ObjectStruktur eines Baumes durchforsten *************) (* WorkTree wandert die Objectstruktur eines Baumes ab und fhrt *) (* dabei die Routine Do aus, die das aktuelle Object bearbeitet *) (* Soll der ganze Baum bearbeitet werden, mssen StartObject und *) (* EndObject 0 sein. *) (* Portiert von c -> M2 Orginal in ST-Computer 5/88 *) (*********************************************************************) PROCEDURE FormButton(Tree :ADDRESS; Object,Clicks : INTEGER; VAR NextObject :INTEGER):INTEGER; (***** Primitive AES-Funktion wird fr FormMoveDial ben”tigt *********) (* Die Funktion wertet Mausknopfeingaben in Dialogen aus. *) (* Tree : Adresse des Dialoges, zu ermitteln mit *) (* AES.ResourceGetAddr(0,NummerDerBox,DialogAdresse) *) (* Object : enth„lt das aktuelle Object *) (* Clicks : maximale Anzahl von Mausclicks *) (* NextObject : neues Aktuelles Object nach dem Funktionsaufruf *) (* Funktionsergebnis ist ein Wert # 0 wenn ein Exit-Object ausgew„hlt*) (* wurde. Dieser Wert entspricht der Nummer des angew„hlten Objectes *) (* -> ST 2/92 *) (*********************************************************************) PROCEDURE FormKeyboard(Tree :ADDRESS; Object,Next,Char:INTEGER; VAR NextObject,NextChar :INTEGER):INTEGER; (***** Primitive AES-Funktion wird fr FormMoveDial ben”tigt *********) (* Die Funktion wertet Tastatureingaben in Dialogen aus. *) (* Tree : Adresse des Dialoges, zu ermitteln mit *) (* AES.ResourceGetAddr(0,NummerDerBox,DialogAdresse) *) (* Object : enth„lt das aktuelle Object *) (* Next : n„chstes Object *) (* NextObject : aktuelles Object nach dem Funktionsaufruf *) (* NextChar : n„chstes Zeichen *) (* Funktionsergebnis ist ein Wert # 0 wenn ein Exit-Object ausgew„hlt*) (* wurde. Dieser Wert entspricht der Nummer des angew„hlten Objectes *) (* Hier also immer die Nummer des Default-Objectes *) (* -> ST 2/92 *) (*********************************************************************) PROCEDURE FileSelectXtendedInput(VAR InPath,InSelect:ARRAY OF CHAR; VAR ExButton:INTEGER; label: ARRAY OF CHAR):INTEGER; (************** Der Fileselctor ab TOS 1.04 ***********************) (* InPath : Pfad Voreinstellung z.B. C:\Hammer\*.123 *) (* INSelect : Voreinstellung fr den Dateinamen z.B. UNTITLED.123 *) (* ExButton : 0 = Abbruch, 1 = OK *) (* label : Titeltext der File Select box *) (* Rckgabe : 0 Fehler bei der Durchfhrung, #0 Kein Fehler *) (******************************************************************) PROCEDURE EasyFileSelect(VAR Maske, DateiName: ARRAY OF CHAR; Text : ARRAY OF CHAR):BOOLEAN; (***************** Vereinfachter FileSelector *********************) (* Maske : Pfad Voreinstellungen z.B. \Hammer\*.123 *) (* Intern wird das aktuelle Laufwerk und Pfad ermittelt und Maske *) (* daran angeh„ngt, In der Fileselectbox erh„lt man also : *) (* C:\MODULA\Hammer\*.123 *) (* Zurckgegeben wird in Maske der Pfadname der Ausgew„hlten Datei*) (* ohne angeh„ngte WildCards also z.B. C:\LPR\HAMMER\ *) (* DateiName : Voreinstellnung fr den Dateinamen z.B. UNTILED.123*) (* Zurckgegeben wird der ausgew„hlte Dateinahme z.B: TEST.123 *) (* Text : Titeltext der Fileselectorbox ab TOS 1.04 ansonsten wird*) (* Text ignoriert und die 'normale' Fileselectorbox aufgerufen *) (* Hierbei wird auch der Cookie abgefragt d.h wenn Selectric *) (* installiert ist wird die Fileselectbox mit Titeltext aufgerufen*) (* Rckgabe : TRUE Kein Fehler OK angew„hlt *) (* FALSE Abbruch gew„hlt oder Fehler *) (* c->M2 -> ST 4/93 *) (******************************************************************) PROCEDURE MoveFormDo(TreePtr :ADDRESS; EditObject :INTEGER):INTEGER; (****************** Dialog Box Ausfhren *****************************) (* Der GegenPart zu AES.FormDo mit den unter DoMoveDialog *) (* beschriebenen Erweiterungen. Die Checkboxen werden allerdings nur *) (* unter DoMoveDialog initialisiert -> entweder muž der Status *) (* Selected schon im RCS gegeben werden oder hier vorher "von Hand" *) (* Meine Empfehlung: Beim ersten Aufruf einer DialogBox DoMoveDialog *) (* verwenden, und sp„ter dann mit MoveFormDo weitermachen dann merkt *) (* die Dialogbox sich auch ihren Ort und taucht immer an der selben *) (* Stelle auf. *) (*********************************************************************) PROCEDURE DoDialog(DialogAdresse:ADDRESS;ErstesObject:INTEGER):INTEGER; (****************** Dialog Box Ausfhren *****************************) (* DialogAdresse : Adresse des Dialoges, zu ermitteln mit *) (* AES.ResourceGetAddr(0,NummerDerBox,DialogAdresse) *) (* NummerDerBox ist Vom RCS erzeugt worden und Steht in der .I -Datei*) (* ErstesObject : Erstes Editierbares Object, dort steht dann der *) (* Cursor im Edit Feld *) (* Rckgabe : Das Feld das zum Verlassen der Box angeklickt wurde. *) (* DoDialog zeichnet eine Dialogbox und fhrt Sie aus. Es werden *) (* Grow- und Shrink-Boxen von der Cursor Position ab und am Ende zu *) (* ihr hin Gezeichnet. Redraw Message wird ans GEM geschickt *) (*********************************************************************) PROCEDURE DoMoveDialog(DialogAdresse:ADDRESS;ErstesObject:INTEGER):INTEGER; (****************** Dialog Box Ausfhren *****************************) (* DialogAdresse : Adresse des Dialoges, zu ermitteln mit *) (* AES.ResourceGetAddr(0,NummerDerBox,DialogAdresse) *) (* NummerDerBox ist Vom RCS erzeugt worden und Steht in der .I -Datei*) (* ErstesObject : Erstes Editierbares Object, dort steht dann der *) (* Cursor im Edit Feld *) (* Rckgabe : Das Feld das zum Verlassen der Box angeklickt wurde. *) (* DoMoveDialog zeichnet eine verschiebbare Dialogbox und fhrt Sie *) (* aus. Es werden keine Grow- und Shrink-Boxen gezeichnet *) (* ihr hin Gezeichnet. Der Bildschirm wird selbstt„tig renoviert *) (* Der Dialog kann wie gew”hnlich im RCS erzeugt werden !!! *) (* Als Schmankerln sind hier noch ein paar Erweiterungen eingebaut *) (* 1.) Tastatursteuerung: wird Alt+Taste gedrckt so wird der Button *) (* im Dialogbaum ausgefhrt der als letztes(!) diese Taste in Grož- *) (* buchstaben enth„lt. Dabei ist es gleichgltig ob der Buttontext *) (* noch andere Grožbuchstaben enth„lt. OK reagiert also auf Alt-O *) (* und(!) auf Alt-K. *) (* 2.) Checkboxes: Ein Object vom Typ GBox das die Hintergrundfarbe *) (* schwarz hat und den Status crossed besitzt wird a) beim Aufruf *) (* von DoMoveDialog invertiert so das es nun eine weiže Box mit *) (* schwarzem Kreuz ist und b) wenn es im Dialog angeklickt wird mit *) (* dem Status Checked+Selected belegt -> weiže Box *) (* 3.) Wenn es kein DEFAULT-Object gibt wird mit ENTER bzw. RETURN *) (* der n„chste editierbare Eintrag angesprungen. *) (*********************************************************************) (* In der ST 6/92 'XObjects' ist beschrieben wie man die Unterstriche*) (* u.a. erzeugt *) (* ST 7,8/91 'Checkboxen unter GEM'gab die Anregung zu den Checkboxen *) (* ST 2/92 Form_kebd & Form_Button in Maxon Pascal gaben die Anregung *) (* zur Implementierung der Tastatursteuerung *) PROCEDURE DrawDialog(DialogAdresse:ADDRESS); (****************** Dialog Box ausgeben *****************************) (* DialogAdresse : Adresse des Dialoges *) (* DrawDialog zeichnet eine Dialogbox. Es wird eine *) (* Grow-Box von der Cursor Position aus ge”ffnet. *) (* Der Bildschirmhintergrund wird gesichert. *) (* !!! DrawDialog und UndrawDialog niemals einzeln verwenden !! *) (*********************************************************************) PROCEDURE UndrawDialog(DialogAdresse : ADDRESS); (****************** Dialog Box schliessen ***************************) (* DialogAdresse : Adresse des Dialoges *) (* UndrawDialog shliesst eine Dialogbox. Es wird eine *) (* Shrink-Box zur Cursor Position hin gezeichnet. Der Bildschirm *) (* wird restauriert oder ggf. eine Redraw Message ans GEM geschickt. *) (* !!! DrawDialog und UndrawDialog niemals einzeln verwenden !! *) (*********************************************************************) PROCEDURE IsSelected(Index:INTEGER; TreePtr:ADDRESS ) : BOOLEAN; (*********** Hat das Object Index den Status Selected ? ************) (* Index : Nummer des Objectes. *) (* TreePtr: Adresse des Dialoges (s.o.) *) (* Rckgabe: TRUE = Ist selectiert, FALSE = Nicht selectiert *) (*******************************************************************) PROCEDURE IsCrossed(Index:INTEGER; TreePtr:ADDRESS ) : BOOLEAN; (*********** Hat das Object Index den Status Crossed ? *************) (* Index : Nummer des Objectes. *) (* TreePtr: Adresse des Dialoges (s.o.) *) (* Rckgabe: TRUE = Angekreuzt, FALSE = Nicht angekreuzt *) (*******************************************************************) PROCEDURE GetObjectFlags(Index:INTEGER; TreePtr:ADDRESS ) : INTEGER; (************** Welche flags hat das Object Index *****************) (* Index : Nummer des Objectes. *) (* TreePtr: Adresse des Dialoges (s.o.) *) (* Rckgabe: flags *) (* M”gliche Rckgaben sind None, Selectabel, default, Exit, .. *) (* HideTree, Indirect. (Siehe GEMAESBase) *) (*******************************************************************) PROCEDURE SetObjectFlags(Index:INTEGER; TreePtr:ADDRESS; NewFlag:INTEGER ); (************** Setzt die flags des Objects Index *****************) (* Index : Nummer des Objectes. *) (* TreePtr: Adresse des Dialoges (s.o.) *) (* NewFlags: Dieses flag wird gesetzt. *) (* M”gliche Angaben sind None, Selectabel, default, Exit, .. *) (* HideTree. (Siehe GEMAESBase) *) (* Die Routine wurde entwickelt um das Hidetree und Editable flag *) (* zu Setzen d.h. um Eintr„ge in DialogBoxen Unsichtbar zu Machen *) (* oder EditFelder editierbar oder nichteditierbar zu machen *) (*******************************************************************) PROCEDURE GetObjectXYWH(Index:INTEGER; TreePtr:ADDRESS;VAR x,y,w,h:CARDINAL); (************** Welchen Position hat das Object Index? *************) (* Index : Nummer des Objectes. *) (* TreePtr: Adresse des Dialoges (s.o.) *) (* x,y,w,h : Position des Objectes *) (*******************************************************************) PROCEDURE SetObjectXYWH(Index:INTEGER; TreePtr:ADDRESS;x,y,w,h:CARDINAL ); (************** Setze Position des Objectes Index *****************) (* Index : Nummer des Objectes. *) (* TreePtr: Adresse des Dialoges (s.o.) *) (* x,y,w,h : Neue Position des Objectes *) (*******************************************************************) PROCEDURE GetText(Index:INTEGER;TreePtr:ADDRESS; VAR String:ARRAY OF CHAR); (************** Welchen Text hat das Object Index *****************) (* Index : Nummer des Objectes. *) (* TreePtr: Adresse des Dialoges (s.o.) *) (* String : Hier Kommt der Text rein. *) (* Wurde zum einfachen Umgang mit Editfeldern in DialogBoxen *) (* entwickelt. *) (*******************************************************************) PROCEDURE SetText(Index:INTEGER;TreePtr:ADDRESS; String:ARRAY OF CHAR); (************** Setze den Text des Objects Index * *****************) (* Index : Nummer des Objectes. *) (* TreePtr: Adresse des Dialoges (s.o.) *) (* String : Neuer Text, Er sollte nicht l„nger sein als der *) (* Orginaltext der Dialogbox, sonst kommt es zu unangenehmen *) (* šberraschungen ! *) (* Wurde zum einfachen Umgang mit Editfeldern in DialogBoxen *) (* entwickelt. *) (*******************************************************************) PROCEDURE GetObjectTail( TreePtr:ADDRESS; Index :INTEGER ) : INTEGER; PROCEDURE GetObjectHead( TreePtr:ADDRESS; Index :INTEGER ) : INTEGER; PROCEDURE GetNextObject( TreePtr:ADDRESS; Index :INTEGER ) : INTEGER; PROCEDURE GetObjectState( TreePtr:ADDRESS; Index :INTEGER ) : INTEGER; PROCEDURE GetObjectType( TreePtr:ADDRESS; Index :INTEGER ) : INTEGER; PROCEDURE GetBoxColor(Index:INTEGER;TreePtr:ADDRESS):INTEGER; PROCEDURE InitCheckBoxes(TreePtr : ADDRESS); END EasyDialog.