Copyright (C) 1994, Digital Equipment Corp.
MODULEBug: if Shadow.Supported(v, v.shadow) changes on the fly, such as during a rescreening, the looks will be wrong because there is nothing to tickle the HighlightVBT to change.; IMPORT FeedbackVBT, Filter, HighlightVBT, MultiClass, MultiFilter, Pixmap, Point, Rect, Shadow, ShadowedVBT, VBT; REVEAL T = Public BRANDED OBJECT shadow : Shadow.T; highlighter : HighlightVBT.T; normalStyles : ARRAY BOOLEAN OF Shadow.Style; excitedStyles : ARRAY BOOLEAN OF Shadow.Style OVERRIDES init := Init; normal := Normal; excited := Excited; reshape := Reshape; END; TYPE MC = MultiClass.Filter BRANDED OBJECT OVERRIDES succ := Succ; pred := Succ; replace := Replace; END; ShadowedFeedbackVBT
PROCEDUREInit (v : T; ch : VBT.T; shadow : Shadow.T := NIL; onStyle := Shadow.Style.Lowered; onExcitedStyle := Shadow.Style.Raised; offStyle := Shadow.Style.Raised; offExcitedStyle := Shadow.Style.Lowered ): T = BEGIN IF shadow = NIL THEN shadow := Shadow.None END; EVAL FeedbackVBT.T.init( v, NEW (ShadowedVBT.T).init (ch, shadow, offStyle)); v.shadow := shadow; v.normalStyles[TRUE] := onStyle; v.normalStyles[FALSE] := offStyle; v.excitedStyles[TRUE] := onExcitedStyle; v.excitedStyles[FALSE] := offExcitedStyle; MultiClass.Be(v, NEW(MC)); IF ch # NIL THEN MultiClass.BeChild(v, ch) END; RETURN v END Init; PROCEDUREReshape (v: T; READONLY cd: VBT.ReshapeRec) = VAR ch: VBT.T; BEGIN FeedbackVBT.T.reshape(v, cd); ch := MultiFilter.Child(v); IF ch # NIL AND v.highlighter # NIL THEN SetHighlighter(v, VBT.Domain(ch), 99999) END END Reshape; PROCEDURENormal (v: T) = VAR state := FeedbackVBT.GetState(v); BEGIN ShadowedVBT.SetStyle(Filter.Child(v), v.normalStyles[state]); Highlight(v, state) END Normal; PROCEDUREExcited (v: T) = VAR state := FeedbackVBT.GetState(v); BEGIN ShadowedVBT.SetStyle(Filter.Child(v), v.excitedStyles[state]); Highlight(v, NOT state) END Excited; PROCEDUREHighlight (v: T; excite: BOOLEAN) = VAR ch := MultiFilter.Child(v); BEGIN IF excite THEN v.highlighter := HighlightVBT.Find(v); IF ch # NIL THEN SetHighlighter(v, VBT.Domain(ch), 99999) END ELSE SetHighlighter(v, Rect.Empty, 0); v.highlighter := NIL END END Highlight; PROCEDURESetHighlighter (v: T; READONLY r: Rect.T; sz: CARDINAL) = BEGIN IF NOT Shadow.Supported(v.shadow, v) THEN HighlightVBT.SetTexture( v.highlighter, Pixmap.Solid, Point.Origin, v.shadow.swap); HighlightVBT.SetRect(v.highlighter, r, sz) END END SetHighlighter; PROCEDURENewMenu (ch: VBT.T; shadow: Shadow.T := NIL): T = BEGIN RETURN NEW (T).init (ch, shadow, Shadow.Style.Flat, Shadow.Style.Lowered, Shadow.Style.Flat, Shadow.Style.Lowered); END NewMenu; PROCEDUREReplace (m: MC; <* UNUSED *> ch: VBT.T; new: VBT.T) = VAR sh := Filter.Child(m.vbt); BEGIN EVAL Filter.Replace(sh, new) END Replace; PROCEDURESucc (m: MC; ch: VBT.T): VBT.T = VAR sh := Filter.Child(m.vbt); BEGIN IF ch = NIL THEN RETURN Filter.Child(sh) ELSE RETURN NIL END END Succ; BEGIN END ShadowedFeedbackVBT.