(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) (* Last modified on Thu Oct 29 23:07:35 PST 1992 by msm *) (* modified on Mon Feb 24 14:01:20 PST 1992 by muller *) <*PRAGMA LL*> MODULE StableVBT; IMPORT Axis, Filter, Rect, VBT, VBTClass, Trestle, Point; CONST NoPref = ARRAY Axis.T OF INTEGER {-1, ..}; BigPref = ARRAY Axis.T OF INTEGER{VBT.DefaultShape.hi, ..}; REVEAL T = Public BRANDED OBJECT <* LL >= {SELF} *> pref := NoPref; scrShape := BigPref; proj := TRUE OVERRIDES shape := Shape; reshape := Reshape; rescreen := Rescreen; init := Init; END; PROCEDURE Disable(v: VBT.T) = BEGIN LOOP TYPECASE v OF NULL => RETURN | T (w) => LOCK w DO w.pref := NoPref END; RETURN ELSE v := VBT.Parent(v) END END END Disable; PROCEDURE GetProjecting(v: VBT.T): BOOLEAN = BEGIN LOOP TYPECASE v OF NULL => RETURN FALSE | T (w) => LOCK w DO RETURN w.proj END ELSE v := VBT.Parent(v) END END END GetProjecting; PROCEDURE SetProjecting (v: VBT.T; proj: BOOLEAN) = BEGIN LOOP TYPECASE v OF NULL => RETURN | T (w) => LOCK w DO w.proj := proj END; RETURN ELSE v := VBT.Parent(v) END END END SetProjecting; PROCEDURE SetShape (v: VBT.T; hPref, vPref: CARDINAL) = BEGIN LOOP TYPECASE v OF NULL => RETURN | T (w) => LOCK w DO IF hPref # 0 THEN w.pref[Axis.T.Hor] := hPref END; IF vPref # 0 THEN w.pref[Axis.T.Ver] := vPref END END; VBT.NewShape(v); RETURN ELSE v := VBT.Parent(v) END END END SetShape; PROCEDURE Shape (w: T; ax: Axis.T; n: CARDINAL): VBT.SizeRange = VAR res: VBT.SizeRange; BEGIN IF n = 0 THEN n := Rect.Size(ax, VBT.Domain(w)) END; res := Filter.T.shape(w, ax, n); LOCK w DO IF res.lo <= w.pref[ax] AND w.pref[ax] < res.hi THEN res.pref := w.pref[ax] ELSIF w.pref[ax] < 0 THEN res.pref := MAX(res.lo, MIN(res.pref, w.scrShape[ax])) ELSIF w.proj THEN res.pref := MAX(res.lo, MIN(res.hi - 1, w.pref[ax])) END END; RETURN res END Shape; PROCEDURE Reshape(w: T; READONLY cd: VBT.ReshapeRec) = BEGIN IF NOT Rect.IsEmpty(cd.new) THEN LOCK w DO FOR ax := FIRST(Axis.T) TO LAST(Axis.T) DO w.pref[ax] := Rect.Size(ax, cd.new) END END END; Filter.T.reshape(w, cd) END Reshape; PROCEDURE Rescreen (w: T; READONLY cd: VBT.RescreenRec) = VAR dom := Trestle.ScreenOf(w, Point.Origin).dom; BEGIN FOR ax := FIRST(Axis.T) TO LAST(Axis.T) DO w.scrShape[ax] := Rect.Size(ax, dom) END; Public.rescreen(w, cd) END Rescreen; PROCEDURE Init(v: T; ch: VBT.T; proj: BOOLEAN): T = BEGIN LOCK v DO v.proj := proj END; EVAL Filter.T.init(v, ch); RETURN v END Init; PROCEDURE New(ch: VBT.T; project := TRUE): T = BEGIN RETURN NEW(T).init(ch, project) END New; BEGIN END StableVBT.