<<>> <> <> <> <> <<>> DIRECTORY Xl USING [Size], XTk USING [Class, dontUse, Event, TQ, Widget, WidgetSpec]; <<>> XTkBiScrollerFrame: CEDAR DEFINITIONS ~ BEGIN <<>> <> BiScrollerFrame: TYPE = XTk.Widget; biScrollerFrameClass: READONLY XTk.Class; State1: TYPE = RECORD [start, next: REAL]; State2: TYPE = RECORD [h, v: State1]; CreateBiScrollerFrame: PROC [widgetSpec: XTk.WidgetSpec ¬ [], child: XTk.Widget ¬ NIL, insideSize: Xl.Size ¬ [XTk.dontUse, XTk.dontUse], vsbar, hsbar: BOOL ¬ TRUE] RETURNS [biScrollerFrame: BiScrollerFrame]; <> <> <> <> <<>> IsBiScrollerFrame: PROC [widget: XTk.Widget] RETURNS [BOOL]; <> Child: PROC [biScrollerFrame: BiScrollerFrame] RETURNS [child: XTk.Widget]; <> ReplaceChild: PROC [biScrollerFrame: BiScrollerFrame, child: XTk.Widget, delayed: BOOL ¬ FALSE, preventDestructionOfOldChild: BOOL ¬ FALSE]; <> GetState: PROC [biScrollerFrame: BiScrollerFrame] RETURNS [state: State2]; <> ParentalSetState: PROC [biScrollerFrame: BiScrollerFrame, state: State2, event: XTk.Event ¬ NIL]; <> <> PublicSetState: PROC [biScrollerFrame: BiScrollerFrame, hAction, vAction: Action, x, y: REAL, event: XTk.Event ¬ NIL]; <> <> <> stateChanged: READONLY ATOM; -- $BiScrollerFrameState <> <<>> Action: TYPE = {none, backward, forward, thumb, configure}; ScrollProc: TYPE = PROC [biScrollerFrame: BiScrollerFrame, hAction, vAction: Action, x, y: REAL, event: XTk.Event, clientData: REF]; <> <<"hAction, vAction" is the reason the client procedure is being called.>> <> <<"x, y" >> <> <> <<"event" X event causing action (NIL if not available); useful for time stamp...>> <<"clientData" from registration.>> <<>> SetScrollProc: PROC [biScrollerFrame: BiScrollerFrame, scrollProc: ScrollProc, clientData: REF ¬ NIL, tq: XTk.TQ ¬ NIL]; <> <> <> <> <<>> END.