dps/src/PagerDLE.m3


Copyright (C) 1994, Digital Equipment Corp.

MODULE PagerDLE;

IMPORT DisplayList, DPS, DPSWindow;

PROCEDURE Init (t: T; pages: REF ARRAY OF DisplayList.T := NIL) =
  BEGIN
  IF t.initialized THEN RETURN; END;
  t.pages := pages; (* NIL or not ... *)
  IF pages=NIL THEN t.pageCount := 0;
   ELSE t.pageCount := NUMBER(pages^);
    END;
  t.page := -1; (* None displayed. *)
  t.box := DPS.EverywhereBox; (* Don't know how big children are. *)
  t.initialized := TRUE;
  IF pages#NIL THEN NthPage (t, 0); END;
  END Init;

PROCEDURE AppendPage ( t: T; page: DisplayList.T ) =
 VAR new: REF ARRAY OF DisplayList.T;
  BEGIN
  Init (t, NIL);
  IF t.pages = NIL THEN
    t.pages := NEW (REF ARRAY OF DisplayList.T, 10);
    END;
  IF t.pageCount >= NUMBER(t.pages^) THEN
    new := NEW (REF ARRAY OF DisplayList.T, NUMBER(t.pages^) + 10);
    FOR j := 0 TO NUMBER(t.pages^)-1 DO
      new[j] := t.pages[j];
      END;
    t.pages := new;
    END;
  t.pages[t.pageCount] := page;
  t.pageCount := t.pageCount + 1;
  IF t.First()=NIL THEN NthPage (t, 0); END;
  END AppendPage;

PROCEDURE NthPage (t: T; page: INTEGER) =
 VAR first: DisplayList.T;
 VAR haveFocus: BOOLEAN;
  BEGIN
  haveFocus := t.childWithInputFocus # NIL; (* Crude. *)
  IF page < 0 THEN RETURN; END;
  IF page > t.pageCount-1 THEN RETURN; END;
  IF page = t.page THEN RETURN; END;
  first := t.First();
  IF first#NIL THEN first.Remove(); END;
  t.Append (t.pages^[page]);
  t.page := page;
  IF haveFocus THEN t.GetInputFocus (t.First()); END;
  t.Dirty (DPS.EverywhereBox);
  END NthPage;

PROCEDURE NextPage (t: T) =
  BEGIN
  NthPage (t, t.page + 1);
  END NextPage;

PROCEDURE Mouse (t: T; window: DPSWindow.T; event: DPS.MouseEvent): BOOLEAN =
 VAR e: DisplayList.E;
  BEGIN
  Init (t);

  IF t.canMouseChildren THEN
    e := t.Last();
    WHILE e # NIL DO
      IF e.Mouse (window, event) THEN RETURN TRUE; END;
      e := e.Previous();
      END;
    END;

  IF event.clickType # DPS.ClickType.FirstDown THEN RETURN FALSE; END;
  RETURN FALSE;

  END Mouse;

PROCEDURE Char (e: E; window: DPSWindow.T; char: CHAR): BOOLEAN =
 VAR ee: DisplayList.E;
  BEGIN
  Init (e);
  ee := e.childWithInputFocus;
  IF ee = NIL THEN RETURN FALSE; END;
  IF ee.Char (window, char) THEN RETURN TRUE; END;
  CASE char OF
  | ' ' =>  NextPage (e); RETURN TRUE;
  | '!' =>  NthPage (e, 0); RETURN TRUE;
  | '@' =>  NthPage (e, 1); RETURN TRUE;
  | '#' =>  NthPage (e, 2); RETURN TRUE;
  | '$' =>  NthPage (e, 3); RETURN TRUE;
  | '%' =>  NthPage (e, 4); RETURN TRUE;
  | '^' =>  NthPage (e, 5); RETURN TRUE;
  | '&' =>  NthPage (e, 6); RETURN TRUE;
  | '*' =>  NthPage (e, 7); RETURN TRUE;
  | '(' =>  NthPage (e, 8); RETURN TRUE;
   ELSE RETURN FALSE;
    END; (* of CASE *)
  END Char;

BEGIN
END PagerDLE.