<<>> <> <> <> <> DIRECTORY AdobeCommon USING [EnumeratedTypes], AdobeTip, Cursors USING [SetCursor], Imager USING [Color, Context, MaskRectangle, Rectangle, SetColor], ImagerBox, ImagerBackdoor USING [MakeStipple], InputFocus USING [CaptureButtons, ReleaseButtons], IO, Real USING [Round], TIPTypes, TIPUser USING [InstantiateNewTIPTable, TIPScreenCoords, TIPTable], VFonts USING [FontHeight], ViewerClasses USING [NotifyProc, Viewer, ViewerRec], ViewerPrivate USING [PaintScreen]; AdobeTipImpl: CEDAR MONITOR IMPORTS Cursors, Imager, ImagerBackdoor, InputFocus, Real, TIPUser, VFonts, ViewerPrivate EXPORTS AdobeTip ~ { PaintOp: TYPE = {paint, remove, change}; grey: CARDINAL ¬ 122645B; xorStipple: Imager.Color = ImagerBackdoor.MakeStipple[stipple: grey, xor: TRUE]; defaultHeight: PUBLIC NAT ¬ VFonts.FontHeight[]; ButtonData: TYPE = REF ButtonDataObj; ButtonDataObj: TYPE = RECORD [ ready: CONDITION, mode: ATOM ¬ $Busy, buttonData: AdobeCommon.EnumeratedTypes, mouseX: REAL, mouseY: REAL, initY: REAL, gridH: CARD, viewer: ViewerClasses.Viewer ¬ NIL ]; ViewerFromAny: PROCEDURE [any: REF ANY] RETURNS [v: ViewerClasses.Viewer] ~ { v ¬ NARROW[any]; }; NotifyProc: ENTRY ViewerClasses.NotifyProc ~ { data: ButtonData ¬ NARROW[self.data]; prev: Imager.Rectangle ¬ [0, 0, 0, 0]; rect: Imager.Rectangle ¬ [ViewerFromAny[data.buttonData.mainViewer.outer].wx, data.mouseY - 1, ViewerFromAny[data.buttonData.mainViewer.outer].ww, 3]; minY: REAL ¬ data.initY + (data.gridH * (data.buttonData.currentHeight - 2)); maxY: INT ¬ ViewerFromAny[data.buttonData.mainViewer.outer].wy; Clip: PROC[position: TIPUser.TIPScreenCoords] RETURNS [x, y: INTEGER] = { tmpY: INTEGER; tmpY ¬ position.mouseY - ((position.mouseY - (data.gridH / 2)) MOD data.gridH); x ¬ position.mouseX; y ¬ Real.Round[MAX[MIN[minY, tmpY], maxY]]; }; Draw: PROC [op: PaintOp ¬ paint] ~ { Action: PROC [context: Imager.Context] ~ { Show: PROC [r: Imager.Rectangle] ~ {Imager.MaskRectangle[context, r]}; IF prev = rect AND op = change THEN RETURN; Imager.SetColor[context, xorStipple]; SELECT op FROM paint => Show[rect]; remove => { IF prev # [0.0, 0.0, 0.0, 0.0] THEN Show[prev]; prev ¬ [0.0, 0.0, 0.0, 0.0]; }; change => { IF prev # [0.0, 0.0, 0.0, 0.0] THEN Show[prev]; Show[rect]; }; ENDCASE => ERROR; }; ViewerPrivate.PaintScreen[main, Action, FALSE]; }; FOR list: LIST OF REF ANY ¬ input, list.rest UNTIL list = NIL DO WITH list.first SELECT FROM x: ATOM => SELECT x FROM $Abort => { data.mode ¬ $Abort; Draw[remove]; InputFocus.ReleaseButtons[]; NOTIFY data.ready; }; $Move => { Draw[change]; prev ¬ rect; }; $End => { data.mode ¬ $Done; Draw[remove]; InputFocus.ReleaseButtons[]; NOTIFY data.ready; }; ENDCASE => NULL; z: TIPUser.TIPScreenCoords => { [data.mouseX, data.mouseY] ¬ Clip[z]; rect ¬ [ViewerFromAny[data.buttonData.mainViewer.outer].wx, data.mouseY-1, ViewerFromAny[data.buttonData.mainViewer.outer].ww, 3]; }; ENDCASE => ERROR; ENDLOOP; }; AdjustStringField: PUBLIC ENTRY PROC [buttonData: AdobeCommon.EnumeratedTypes, gridH: CARD ¬ defaultHeight] RETURNS [linesChange: INT ¬ 0] ~ { fakeViewer: ViewerClasses.Viewer ¬ NEW[ViewerClasses.ViewerRec]; initY, mouseY: REAL ¬ ViewerFromAny[buttonData.mainViewer.outer].wy + ViewerFromAny[buttonData.mainViewer.fieldViewer.outer].wh - ViewerFromAny[buttonData.controllerOf].wy - ViewerFromAny[buttonData.controllerOf].wh; <> instanceData: ButtonData ¬ NEW[ButtonDataObj ¬ [ mode: $Busy, buttonData: buttonData, mouseX: 0.0, mouseY: mouseY, initY: initY, gridH: gridH, viewer: fakeViewer ]]; fakeViewer.data ¬ instanceData; InputFocus.CaptureButtons[NotifyProc, adjStrTIP, fakeViewer]; Cursors.SetCursor[crossHairsCircle]; UNTIL instanceData.mode = $Done OR instanceData.mode = $Abort DO WAIT instanceData.ready ENDLOOP; IF instanceData.mode = $Abort THEN RETURN[0]; RETURN[Real.Round[(instanceData.initY - instanceData.mouseY) / instanceData.gridH] ]; }; adjStrTIP: TIPUser.TIPTable ¬ TIPUser.InstantiateNewTIPTable["AdjustField.tip"]; }.