DEFINITION Viewers; (* portable *)

(*
The module viewers provide the data type for implementing the tiled viewers

of the Oberon system. Each track of the Oberon system consists of a number of
viewers.
*)
 IMPORT Display;

 TYPE
  Viewer = POINTER TO ViewerDesc;
  ViewerDesc = RECORD ( Display.FrameDesc ) 
   state: INTEGER;
         (* state > 1: displayed
      state = 1: filler
      state = 0: closed
      state < 0: suspended.*)
  END;

 VAR 
  curW: INTEGER; (* Current width of the logical display. *)
  minH: INTEGER; (* Minimum viewer height. *)

 (* Open a new viewer V with top at Y in track X. *)
 PROCEDURE Open (V: Viewer; X, Y: INTEGER);

 (* Expand or shrink a viewer vertically to new top Y. *)
 PROCEDURE Change (V: Viewer; Y: INTEGER);

 (* Remove viewer V from the display. *)
 PROCEDURE Close (V: Viewer);

 (* Recall most recently closed viewer. *)
 PROCEDURE Recall (VAR V: Viewer);

 (* Return viewer located at display coordinates X, Y. *)
 PROCEDURE This (X, Y: INTEGER): Viewer;

 (* Return next upper neighbour of V in a track. *)
 PROCEDURE Next (V: Viewer): Viewer;

 (* In the track at X locate the following viewers: filler fil, bottom-most
viewer, an 
 alternative viewer alt of height >= H, and the viewer with the maximum height.
*)
 PROCEDURE Locate (X, H: INTEGER; VAR fil, bot, alt, max: Display.Frame);

 (* Append to the current logical display and init track of width W and height
H, and install filler. *)
 PROCEDURE InitTrack (W, H: INTEGER; Filler: Viewer);

 (* Open new track overlaying span of [X, X +W[. *)
 PROCEDURE OpenTrack (X, W: INTEGER; Filler: Viewer);

 (* Close track at X and restore overlaid tracks. *)
 PROCEDURE CloseTrack (X: INTEGER);
END Viewers.

(* Remarks:

1. Each track consists of a filler and a set of viewers linked together in a
ring 
(with the next field) with the filler as sentinel. The filler is the top-most
viewer 
in a track and covers the remainding part of the track the viewers do not cover.

The set of tracks form the root objects of the display space.

2. Tracks can overlay each other. Closing a track exposes the track (and viewers)

lying below it. Overlayed tracks and viewers do not receive message broadcasts

in the display space. Before being overlayed, the contents of a track receive
a 
Display.ControlMsg with id set to suspend.

3. The logical display increases from X coordinate 0 onwards through multiple

physical displays. Opening a new display involves adding a tracks beyond curW

(typically a system and user track). Oberon uses a single coordinate system
to 
address all the different displays. Note that many Oberon systems restrict the

size of the display to the size of the host window.

4. Changing the top coordinate of a viewer with Change results in a 
Display.ModifyMsg with id set to reduce or extend (in size) being sent 
to the viewer contents (located in V.dsc).

5. The ratio of user and system track width is 5:3.

6. Programmers seldom need to use the Viewers module. Higher level modukes 
like Documents provide a simpler display abstraction.

*)