<> <> <> <> <<>> <> <> <> <<>> DIRECTORY XTk USING [HasClassKey, PutWidgetProp, Widget]; XTkDelegation: CEDAR DEFINITIONS IMPORTS XTk ~ BEGIN <<>> <> <<>> Delegate: PROC [from: XTk.Widget, alternateKey: REF, to: REF] = INLINE { XTk.PutWidgetProp[from, alternateKey, to]; }; <<>> <> <> InlineSingleDelegant: PROC [widget: XTk.Widget, expect: ATOM, alternateKey: REF] RETURNS [XTk.Widget] = INLINE { IF XTk.HasClassKey[widget, expect] THEN RETURN [widget] ELSE RETURN [SingleDelegant[widget, expect, alternateKey]] }; SingleDelegant: PROC [widget: XTk.Widget, expect: ATOM, alternateKey: REF] RETURNS [XTk.Widget]; <> <> <> <<>> InlineDidMultiDelegation: PROC [widget: XTk.Widget, expect: ATOM, alternateKey: REF, proc: PROC [w: XTk.Widget]] RETURNS [did: BOOL] = INLINE { <<--It is up to proc to test whether delegated w is of right class.>> <<--did: is true when proc is called or delegation explicitely worked and decided not to call proc. >> IF XTk.HasClassKey[widget, expect] THEN RETURN [FALSE] ELSE RETURN [DidMultiDelegation[widget, expect, alternateKey, proc]]; }; DidMultiDelegation: PROC [widget: XTk.Widget, expect: ATOM, alternateKey: REF, proc: PROC [w: XTk.Widget]] RETURNS [did: BOOL]; <<--It is up to proc to test whether delegated w is of right class.>> <<--did: is true when proc is called or delegation explicitely worked and decided not to call proc. >> END.