home *** CD-ROM | disk | FTP | other *** search
- (*---------------------------------------------------------------------------
- Unit Menue - Menüroutinen.
-
- Letzte Bearbeitung: 4.10.1988 ST
-
- Copyright (C) 1987&1988 by Lutz&Stefan Tandecki, D-3307 Schöppenstedt.
- ---------------------------------------------------------------------------*)
-
- Unit Menue;
-
- Interface
-
- Uses Crt, MenRouts;
-
- Const ITEM_LEFT = $01;
- ITEM_CENTER = $02;
- ITEM_RIGHT = $04;
- CENTER_HORIZ = $08;
- CENTER_VERT = $10;
- ESC_BREAKS = $20;
- WHITESPACE = $40;
- DONT_DRAW = $80;
-
- Simple = 0; (* Konstanten für den Rahmen *)
- Double = 1;
-
- TopLeft : Array[0..1] Of Char = ('┌', '╔');
- TopEdge : Array[0..1] Of Char = ('─', '═');
- TopRight : Array[0..1] Of Char = ('┐', '╗');
- SideEdge : Array[0..1] Of Char = ('│', '║');
- BottomLeft : Array[0..1] Of Char = ('└', '╚');
- BottomRight : Array[0..1] Of Char = ('┘', '╝');
-
- Type String20 = String[20];
-
- Function HandleMenu (x, y, First, Flags, Border: Integer;
- DateiName: String20;
- AnfIndex, EndIndex: Integer;
- Kopf: String20): Integer;
-
- Implementation
-
- Type ListPtr = ^ListElement;
-
- ListElement = Record
- Prev, Next : ListPtr;
- Text : WorkString;
- Index : Integer;
- End;
-
- (*---------------------------------------------------------------------------
- HandleMenu - Hauptroutine.
- ---------------------------------------------------------------------------*)
-
- Function HandleMenu (x, y, First, Flags, Border: Integer;
- DateiName: String20;
- AnfIndex, EndIndex: Integer;
- Kopf: String20): Integer;
-
- Var i, s, MenuNr, Hoehe, Breite : Integer;
- Key : Char;
- Ende, KeyIsValid : Boolean;
- Anfang, Vorg, Hilf, Items : ListPtr;
- Line : WorkString;
- Datei : Text;
- HeapTop : ^Integer;
- LinkerRand : Array[1..30] Of Byte;
- Attr : Byte;
-
- Begin
- CursorOff;
- ReversAus;
- LowVideo;
-
- Assign (Datei, DateiName);
- (*$I-*) Reset (Datei); (*$I+*)
-
- If (IOResult <> 0) Then (* Fehler, Datei nicht gefunden!! *)
- Begin
- CursorOn;
- ReversAus;
- Write (^G);
-
- Write ('Datei '+DateiName+' nicht vorhanden! Programmende mit RETURN.');
- While (ReadKey <> #13) Do;
-
- Halt;
- End;
-
- (* Bis zur Zeile AnfIndex Datei überlesen. *)
-
- For i:=1 To AnfIndex-1 Do
- ReadLn (Datei, Line);
-
- Hoehe := EndIndex - AnfIndex + 2;
- Mark (HeapTop);
-
- Anfang := Nil;
- Vorg := Nil;
- i := 1;
- Breite := Length (Kopf);
-
- (* Menüzeilen werden eingelesen und in die verkettete Liste einsortiert. *)
-
- While (i < Hoehe) Do
- Begin
- ReadLn (Datei, Line);
- New (Hilf);
-
- With Hilf^ Do
- Begin
- Text := Line;
-
- If (Length (Text) > Breite) Then
- Breite := Length (Text);
-
- Index := i;
- Next := Nil;
- End; (* Of With Hilf^ *)
-
- INC (i);
-
- If (Anfang = Nil) Then
- Anfang := Hilf;
-
- If (Vorg <> Nil) Then
- Vorg^.Next := Hilf;
-
- Hilf^.Prev := Vorg;
- Vorg := Hilf;
- End; (* Of While *)
-
- Close (Datei);
- Items := Anfang;
- Breite := Breite + 2;
-
- If (Flags And WHITESPACE) <> 0 Then
- Breite := Breite + 2;
-
- If (Flags And CENTER_HORIZ) <> 0 Then
- x := (80 - Breite) Div 2;
-
- If (Flags And CENTER_VERT) <> 0 Then
- y := (25 - Hoehe) Div 2;
-
- i := 1;
- Hilf := Anfang;
-
- If (Flags And DONT_DRAW) = 0 Then
- Begin
- While (Hilf <> Nil) Do
- Begin
- If (Flags And ITEM_LEFT) <> 0 Then
- LinkerRand[i] := x + 1;
-
- If (Flags And ITEM_CENTER) <> 0 Then
- LinkerRand[i] := x + (Breite - Length (Hilf^.Text)) Div 2;
-
- If (Flags And ITEM_RIGHT) <> 0 Then
- LinkerRand[i] := x + Breite - Length (Hilf^.Text);
-
- Hilf := Hilf^.Next;
- INC (i);
- End; (* Of While *)
-
- InitMergeClip;
- WriteInMergeClip (x, y, TopLeft[Border] +
- Kette (Breite-2, Ord (TopEdge[Border])) +
- TopRight[Border]);
-
- (* Schreiben einer Kopfzeile, wenn gewünscht. *)
- If (Kopf <> '') Then
- Begin
- Attr := TextAttr;
- s := x + (Breite - Length (Kopf)) Div 2;
-
- If (Flags And WHITESPACE <> 0) Then
- WriteInMergeClip (s-1, y, #2' '+Kopf+' ')
- Else
- WriteInMergeClip (s, y, #2+Kopf);
-
- TextAttr := Attr;
- End;
-
- i := 1;
- Hilf := Anfang;
-
- While (Hilf <> Nil) Do
- Begin
- WriteInMergeClip (x, y+i, SideEdge[Border]);
- WriteInMergeClip (LinkerRand[i], y+i, Hilf^.Text);
- WriteInMergeClip (x+Breite-1, y+i, SideEdge[Border]);
-
- Hilf := Hilf^.Next;
- INC (i);
- End; (* Of While *)
-
- WriteInMergeClip (x, y+Hoehe, BottomLeft[Border] + Kette (Breite-2,
- Ord (TopEdge[Border])) + BottomRight[Border]);
- MergeBoxInScreen (x, y, x+Breite, y+Hoehe, x, y);
- End;
-
- Release (HeapTop);
- MenuNr := First;
- Ende := False;
-
- While Not Ende Do
- Begin
- ReversEin;
- FillLinePart (y+MenuNr, x+1, Breite-2);
-
- Repeat
- Key:= ReadKey;
- KeyIsValid := False;
-
- Case Ord (Key) Of
- 27: If (Flags And ESC_BREAKS) <> 0 Then
- Begin
- ReversAus;
- CursorOn;
- HandleMenu := -1;
- Ende := True;
- End;
- 13: Begin
- ReversAus;
- CursorOn;
- HandleMenu := MenuNr;
- Ende := True;
- End;
- 0: If KeyPressed Then
- Begin
- Key := ReadKey;
-
- If (Key In [#118, #132, #72, #80]) Then
- Begin
- KeyIsValid := True;
- ReversAus;
- LowVideo;
- FillLinePart (y+MenuNr, x+1, Breite-2);
- End;
-
- Case Ord (Key) Of
- 132: MenuNr := 1; (* Ctrl-Page up *)
- 118: MenuNr := Hoehe-1; (* Ctrl-Page down *)
- 72: Begin (* Cursor up *)
- DEC (MenuNr);
-
- If (MenuNr < 1) Then
- MenuNr := Hoehe-1;
- End;
- 80: Begin (* Cursor down *)
- INC (MenuNr);
-
- If (MenuNr > Hoehe-1) Then
- MenuNr := 1;
- End;
- End; (* Of Case Ord (Key) *)
- End;
- End; (* Of Case Ord (Key) *)
- Until (KeyIsValid) Or (Ende);
- End; (* Of While *)
- End;
-
- Begin (* Of Unit *)
- End.