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"]; }. . AdobeTipImpl.mesa Copyright Σ 1991, 1992 by Xerox Corporation. All rights reserved. Philip James, March 2, 1992 5:47 pm PST Foote, July 13, 1993 3:17 pm PDT ViewerOps.UserToScreenCoords[ buttonData.mainViewer.fieldViewer.outer, 0, buttonData.controllerOf.wy + buttonData.controllerOf.wh].sy; Κo•NewlineDelimiter –(cedarcode) style™šœ™Jšœ Οeœ7™BJšœ'™'J™ —Icode˜šΟk ˜ Kšœ žœ˜$Kšœ ˜ Kšœžœ ˜Kšœžœ6˜BKšœ ˜ Kšœžœ˜#Kšœ žœ"˜2Kšžœžœ ˜Kšœ ˜ Kšœžœ5˜BKšœžœ˜Kšœžœ!˜4Kšœžœ˜"K˜—š Οn œžœžœžœTžœ ˜ŒK˜Kšœ žœ˜(Kšœžœ ˜KšœJžœ˜PKšœžœžœ˜0K˜Kšœ žœžœ˜%šœžœžœ˜Kšœž ž˜Kšœžœœ˜K˜(Kšœžœ˜ Kšœžœ˜ Kšœžœ˜ Kšœžœ˜ Kšœž˜"K˜K˜—š Ÿ œž œžœžœžœ˜MKšœžœ ˜K˜—šŸ œžœ˜.Kšœžœ ˜%K˜&˜_K˜7—KšœžœC˜MKšœžœ6˜?šŸœžœ$žœžœ˜IKšœžœ˜Kšœ?žœ ˜OK˜Kšœžœžœ˜+K˜—šŸœžœ˜$šŸœžœ˜*KšŸœžœ<˜FKšžœ žœ žœž˜+K˜%šžœž˜K˜˜ Kšžœžœ ˜/K˜K˜—˜ Kšžœžœ ˜/K˜ K˜—Kšžœžœ˜—K˜—Kšœ(žœ˜/K˜K˜—šžœžœžœžœžœžœžœžœ˜Ašžœ žœž˜šœžœžœž˜˜ K˜K˜ K˜Kšžœ ˜K˜—˜ K˜ K˜ K˜—˜ K˜K˜ K˜Kšžœ ˜K˜—Kšžœžœ˜—˜K˜%K˜‚K˜—Kšžœžœ˜—Kšžœ˜—K˜K˜—š Ÿœžœž œ2žœžœžœ ˜ŽKšœ#žœ˜@šœžœΕ˜ΨJšœ‡™‡—šœžœ˜0K˜ K˜K˜ K˜K˜ K˜ K˜K˜—K˜K˜K˜=K˜$Kš žœžœžœžœžœ˜aKšžœžœžœ˜-KšžœO˜UK˜K˜—K˜PK˜K˜——…—t