home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 02 / hyperkey / hyperkey.edt < prev    next >
Encoding:
Text File  |  1987-11-11  |  7.6 KB  |  160 lines

  1. (* ------------------------------------------------------------------------- *)
  2. (*                              HYPERKEY.EDT                                 *)
  3. (*             Modul zum Editieren eines Eintrags der Makro-Liste            *)
  4. (* ------------------------------------------------------------------------- *)
  5. PROCEDURE EditEntry (VAR ListPtr :ListPtrType);
  6.    VAR Quit, InsMode, NewEntry, Replace :BOOLEAN;
  7.        i,                                     (* Cursor-Position im m-Array  *)
  8.        j,                                     (* Cursor-Position im Editfeld *)
  9.        k, Key, Code :INTEGER;
  10.        m            :MacroType;
  11.        Len          :INTEGER ABSOLUTE m;         (* m[0], die "Laenge" von m *)
  12.        DummyPtr     :ListPtrType;
  13.        MacroStr     :StringType;            (* String fuer Uebergabe an ANSI *)
  14.  
  15.    (*       holt den Scancode der mit einem Makro zu belegenden Taste:       *)
  16.    PROCEDURE GetScanCode (VAR ListPtr :ListPtrType; VAR Key :INTEGER);
  17.       VAR DummyPtr :ListPtrType;  found :BOOLEAN;
  18.    BEGIN
  19.       CursorShape (Line);
  20.       REPEAT
  21.          MenuLine ('Bitte zu belegende Taste druecken .....');
  22.          GetKey (Key);   DummyPtr := ListHead;   found := FALSE;
  23.          WHILE (DummyPtr <> NIL) AND NOT found DO
  24.             WITH DummyPtr^ DO BEGIN
  25.                found := (Scancode = Key) AND (DummyPtr <> ListPtr);
  26.                DummyPtr := Next
  27.             END;
  28.          IF found THEN  ErrorMsg (2)
  29.          ELSE                                (* HYPERKEY-Taste ist verboten: *)
  30.             IF Hi(Key) = TSR_Char THEN  ErrorMsg (3)
  31.       UNTIL NOT found AND (Hi(Key) <> TSR_Char);
  32.       CursorShape (ShapeType(InsMode));
  33.       MenuLine (EditMenu);   SetColors (Pen, KeyBack);
  34.       WITH ListPtr^ DO BEGIN
  35.          WriteString (15, 3, NumStr(EntryNr,3));
  36.          WriteString (32, 3, HexWord(Key));
  37.          WriteString (51, 3, Status[Ord(Active)])
  38.       END
  39.    END;
  40.    (*   fuegt den Scancode einer gedrueckten Taste zum Makro-Array m hinzu:  *)
  41.    PROCEDURE AddKey (Key :INTEGER);
  42.    BEGIN
  43.       IF InsMode THEN                                      (* Einfuege-Modus *)
  44.          IF Len < MaxMacroLen THEN BEGIN
  45.             IF i <> Succ(Len) THEN  Move (m[i], m[Succ(i)], Succ(Len-i) SHL 1);
  46.             m[i] := Key;   Len := Succ (Len);   i := Succ (i);
  47.             IF j < 44 THEN  j := Succ (j)
  48.          END
  49.          ELSE
  50.       ELSE                                             (* Ueberschreib-Modus *)
  51.          IF i = Succ(Len) THEN
  52.             IF Len < MaxMacroLen THEN BEGIN
  53.                m[i] := Key;   Len := Succ (Len);   i := Succ (i);
  54.                IF j < 44 THEN  j := Succ (j)
  55.             END
  56.             ELSE
  57.          ELSE BEGIN
  58.             m[i] := Key;   i := Succ (i);
  59.             IF j < 44 THEN  j := Succ (j)
  60.          END
  61.    END;
  62.    (*   schreibt den aktuellen Ausschnitt des Makro-Strings ins Editierfeld: *)
  63.    PROCEDURE WriteEditField;
  64.       VAR p,k,c :INTEGER;   CurCode :STRING[4];   CurChar :STRING[9];
  65.    BEGIN
  66.       SetColors (Pen, EditBack);
  67.       FOR k:=1 TO 44 DO BEGIN
  68.          p := i - j + k;
  69.          IF p <= Len THEN BEGIN
  70.             c := Lo (m[p]);
  71.             IF c < 32 THEN BEGIN                         (* Control-Zeichen? *)
  72.                SetColors (AltPen, EditBack);  WriteString (14+k, 6, Chr(c+64));
  73.                SetColors (Pen, EditBack)
  74.             END
  75.             ELSE  WriteString (14+k, 6, Chr(c))
  76.          END
  77.          ELSE  WriteString (14+k, 6, ' ')
  78.       END;
  79.       SetCursor (14+j, 6);
  80.       IF i > Len THEN  k := Pred (i)
  81.       ELSE  k := i;
  82.       SetColors (Pen, InfoBack);
  83.       IF Len <> 0 THEN BEGIN
  84.          CurCode := HexWord (m[k]);
  85.          CurChar := HexByte(Lo(m[k])) + 'h (' + NumStr(Lo(m[k]),3) + ')'
  86.       END
  87.       ELSE BEGIN  CurCode := Space (4);  CurChar := Space (9)  END;
  88.       WriteString (15, 9, NumStr(i,3));
  89.       WriteString (30, 9, CurCode);      WriteString (49, 9, CurChar)
  90.    END;
  91.  
  92. BEGIN (* EditEntry *)
  93.    InsMode := TRUE;                      (* defaultmaessig Einfuege-Modus an *)
  94.    WITH ListPtr^ DO BEGIN
  95.       NewEntry := (Scancode = $FFFF);                      (* neuer Eintrag? *)
  96.       IF NewEntry THEN BEGIN
  97.          DummyPtr := NIL; ShowEntry (DummyPtr); (* alle Fensterchen loeschen *)
  98.          GetScanCode (ListPtr, Code)
  99.       END
  100.       ELSE  Code := Scancode;
  101.       m := Replacement
  102.    END;
  103.    MenuLine (EditMenu);   Quit := FALSE;   CursorShape (ShapeType(InsMode));
  104.    i := 1;   j := 1;
  105.    REPEAT
  106.       WriteEditField;   GetKey (Key);
  107.       IF ScrollLock THEN  AddKey (Key)   (* ist Sonderzeichen-Eingabe aktiv? *)
  108.       ELSE
  109.          CASE Key OF
  110.             Left:     IF i > 1 THEN BEGIN   (* Cursor ein Zeichen nach links *)
  111.                          i := Pred (i);  IF j > 1 THEN j := Pred (j)
  112.                       END;
  113.             Right:    IF i <= Len THEN BEGIN          (* ... und nach rechts *)
  114.                          i := Succ (i);  IF j < 44 THEN j := Succ (j)
  115.                       END;
  116.             Home:     BEGIN  i := 1; j := 1;  END; (* Cursor an Zeilenanfang *)
  117.             End_:     BEGIN                         (* Cursor ans Zeilenende *)
  118.                          i := Succ (Len);  IF i > 44 THEN j := 44 ELSE j := i
  119.                       END;
  120.             Delete:   IF i <= Len THEN BEGIN   (* Zeichen u. Cursor loeschen *)
  121.                          IF i <> Len THEN Move(m[Succ(i)],m[i],(Len-i) SHL 1);
  122.                          Len := Pred (Len)
  123.                       END;
  124.             Clear:    IF i > 1 THEN BEGIN     (* Zeichen vor Cursor loeschen *)
  125.                          IF i <> Succ(Len) THEN
  126.                             Move (m[i], m[i-1], Succ(Len-i) SHL 1);
  127.                          Len := Pred (Len);   i := Pred (i);
  128.                          IF j > 1 THEN  j := Pred (j)
  129.                       END;                        (* gesamte Zeile loeschen: *)
  130.             CtrlHome: BEGIN  i := 1;  j := 1;  Len := 0;  END;
  131.             CtrlEnd:  Len := Pred (i);            (* bis Zeilenende loeschen *)
  132.             Insert:   BEGIN                     (* Ueberschreibmodus ein/aus *)
  133.                         InsMode := NOT InsMode; CursorShape(ShapeType(InsMode))
  134.                       END;
  135.             Tab:      GetScanCode (ListPtr, Code);   (* Tastencode editieren *)
  136.             Help:     EditHelp;             (* Edit-Hilfsbildschirm anzeigen *)
  137.             Return:   BEGIN               (* sichern, zurueck ins Hauptmenue *)
  138.                          Quit := TRUE;   Replace := TRUE
  139.                       END;
  140.             CtrlRet:  BEGIN                (* Makrostring an ANSI uebergeben *)
  141.                          Quit := TRUE;   Replace := FALSE;   MacroStr := '';
  142.                          FOR k := 1 TO m[0] DO
  143.                             MacroStr := MacroStr + Chr(Lo(m[k]));
  144.                          SetKey (ListPtr^.Scancode, MacroStr);
  145.                          DeleteEntry (ListPtr)
  146.                       END;
  147.             Escape:   BEGIN                         (* Bearbeitung abbrechen *)
  148.                          Quit := TRUE;   Replace := FALSE;
  149.                          IF NewEntry THEN  DeleteEntry (ListPtr)
  150.                       END
  151.             ELSE      AddKey (Key)      (* Taste dem Makro-Array hinzufuegen *)
  152.          END;
  153.    UNTIL Quit;
  154.    IF Replace THEN               (* wurde die Bearbeitung nicht abgebrochen? *)
  155.       WITH ListPtr^ DO BEGIN   Replacement := m;   Scancode := Code   END;
  156.    MenuLine (MainMenu)
  157. END;
  158. (* ------------------------------------------------------------------------- *)
  159. (*                                HYPERKEY.EDT                               *)
  160.