juno-app/src/Marquee.m3


 Copyright (C) 1992, Digital Equipment Corporation                         
 All rights reserved.                                                      
 See the file COPYRIGHT for a full description.                            
                                                                           
 Last modified on Mon Oct 31 10:15:31 PST 1994 by heydon                   
      modified on Mon Oct 19 10:22:55 PST 1992 by gnelson                  

MODULE Marquee;

IMPORT HVSplit, Split, TextVBT, Text, Font, Axis;

<* FATAL Split.NotAChild *>

REVEAL
  Private = HVSplit.T BRANDED "Marquee.Private" OBJECT END;
  T = Public BRANDED "Marquee.T" OBJECT
    nameWidth, argWidth, width: INTEGER;
  OVERRIDES
    init := Init;
    erase := Erase;
    putName := PutName;
    newline := Newline;
    putArg := PutArg;
    remArg := RemArg;
  END;

CONST Blanks = ARRAY [0..79] OF CHAR{' ', ..};

PROCEDURE TextFromLen(n: INTEGER) : TEXT =
Return a text of n blanks.
  BEGIN
    RETURN Text.FromChars(SUBARRAY(Blanks, 0, MAX(0, n)))
  END TextFromLen;

PROCEDURE Init(m: T; height := 8; nameWidth := 10;
    argWidth := 12; font := Font.BuiltIn): T =
  BEGIN
    EVAL HVSplit.T.init(m, Axis.T.Ver, adjustable := FALSE);
    m.argWidth := argWidth;
    m.nameWidth := nameWidth;
    m.width := argWidth + nameWidth + 1;
    FOR i := 1 TO height - 1 DO
      Split.AddChild(m, TextVBT.New(
        TextFromLen(m.width), halign := 0.0, fnt := font))
    END;
    Split.AddChild(m, TextVBT.New("", halign := 0.0, fnt := font));
    RETURN m
  END Init;

PROCEDURE Erase(m: T) =
  BEGIN
    TextVBT.Put(Split.Pred(m, NIL), "")
  END Erase;

PROCEDURE Newline(m: T) =
  VAR
    v := Split.Succ(m, NIL);
    last := Split.Pred(m, NIL);
    lastLine := TextVBT.Get(last);
  BEGIN
    TextVBT.Put(last,
      lastLine & TextFromLen(m.width - Text.Length(lastLine)));
    Split.Delete(m, v);
    TextVBT.Put(v, "");
    Split.Insert(m, last, v)
  END Newline;

PROCEDURE PutName(m: T; nm: TEXT) =
  VAR nmP := TextFromLen(m.nameWidth - Text.Length(nm)); BEGIN
    TextVBT.Put(Split.Pred(m, NIL), nmP & nm)
  END PutName;

PROCEDURE PutArg(m: T; nm: TEXT) =
  VAR last := Split.Pred(m, NIL); BEGIN
    TextVBT.Put(last, TextVBT.Get(last) & " " & nm)
  END PutArg;

PROCEDURE RemArg(m:T) =
  VAR
    last := Split.Pred(m, NIL);
    lastLine := TextVBT.Get(last);
    i := Text.Length(lastLine) - 1;
  BEGIN
    WHILE Text.GetChar(lastLine, i) # ' ' DO DEC(i) END;
    TextVBT.Put(last, Text.Sub(lastLine, 0, i))
  END RemArg;

BEGIN
END Marquee.