<> <> <> <> <> DIRECTORY Buttons, Containers, Graphics, GraphicsColor, PadGraphics, Rope, SV2d, SVArtwork, SVArtworkTool, SVArtworkUser, SVCoordSys2d, SVInterfaceTypes, TIPUser, VFonts, ViewerClasses, ViewerOps, ViewerTools; SVArtworkToolImpl: PROGRAM IMPORTS Buttons, Containers, PadGraphics, SVArtwork, SVArtworkUser, SVCoordSys2d, TIPUser, VFonts, ViewerOps, ViewerTools EXPORTS SVArtworkTool = BEGIN EditToolData: TYPE = SVInterfaceTypes.EditToolData; <<>> <> entryHeight: CARDINAL = 15;-- height of a line of items entryVSpace: CARDINAL = 1;-- vertical leading between lines entryHSpace: CARDINAL = 4; -- horizontal space between items on a line column0: CARDINAL = 0; -- horizontal space between margin and column 0; column1: CARDINAL = 80; -- horizontal space between margin and column 1; column2: CARDINAL = 160; -- horizontal space between margin and column 2. column3: CARDINAL = 290; -- horizontal space between margin and column 3; ArtworkToolData: TYPE = REF ArtworkToolDataObj; ArtworkToolDataObj: TYPE = SVInterfaceTypes.ArtworkToolDataObj; Point2d: TYPE = SV2d.Point2d; Viewer: TYPE = ViewerClasses.Viewer; ArtworkPadPaint: SAFE PROC [self: Viewer, context: Graphics.Context, whatChanged: REF ANY, clear: BOOL] = TRUSTED { <> <> artworkToolData: ArtworkToolData; IF whatChanged = NIL THEN { --we are being called by Window Manager artworkToolData _ NARROW[self.data]; SVArtworkUser.PlaceOrigin[self, artworkToolData, red, FALSE, FALSE]; SVArtwork.DrawArtwork[context, artworkToolData.artwork, artworkToolData.origin, artworkToolData.scalar]; } ELSE { proc: PROC [Graphics.Context]; artworkToolData _ NARROW[whatChanged]; proc _ artworkToolData.proc; proc[context]; RETURN; }; }; Init: PROC = { artworkPadClass: ViewerClasses.ViewerClass; artworkPadClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: ArtworkPadPaint, notify: InputNotify, tipTable: TIPUser.InstantiateNewTIPTable["ArtworkPad.TIP"] ]]; ViewerOps.RegisterViewerClass[$ArtworkPad, artworkPadClass]; }; Create: PUBLIC PROC [editToolData: EditToolData, paint: BOOL] RETURNS [viewer: Viewer] = { <> artworkToolData: ArtworkToolData _ NEW[ArtworkToolDataObj]; artworkToolData.height _ 0; artworkToolData.artwork _ SVArtwork.CreateColorArtwork[GraphicsColor.blue, plastic]; artworkToolData.origin _ [0,0]; -- will be updated by PlaceOrigin artworkToolData.scalar _ 1.0; artworkToolData.editToolData _ editToolData; artworkToolData.outer _ Containers.Create[[ name: "Artwork: ", iconic: TRUE, column: left, scrollable: FALSE ]]; AddTextSection[artworkToolData]; artworkToolData.picture _ ViewerOps.CreateViewer[ flavor: $ArtworkPad, info: [ parent: artworkToolData.outer, wx: 0, wy: artworkToolData.height, ww: artworkToolData.outer.ww, wh: artworkToolData.outer.wh,-- only initial values for ww and wh. They are constrained below data: artworkToolData,-- contains the current scene scrollable: FALSE ] ]; Containers.ChildXBound[artworkToolData.outer, artworkToolData.picture]; Containers.ChildYBound[artworkToolData.outer, artworkToolData.picture]; artworkToolData.height _ artworkToolData.height + artworkToolData.picture.wh; IF paint THEN ViewerOps.PaintViewer[artworkToolData.outer, all]; viewer _ artworkToolData.picture; }; -- end of Create AddTextSection: PRIVATE PROC [artworkToolData: ArtworkToolData] = { <> <>> drawButton, scalarSetPrompt, scalarPrompt, positionButton, colorSet, openFileButton, closeFileButton: Buttons.Button; drawButton _ Buttons.Create[ info: [name: "DrawArtwork!", wy: artworkToolData.height, wh: entryHeight, parent: artworkToolData.outer, border: FALSE], proc: SVArtworkUser.DrawArtwork, clientData: artworkToolData ]; scalarSetPrompt _ Buttons.Create[ info: [ name: " _ ", wx: drawButton.wx + drawButton.ww + entryHSpace, wy: artworkToolData.height, wh: entryHeight, parent: artworkToolData.outer, border: TRUE], proc: SVArtworkUser.ScalarSetPrompt, clientData: artworkToolData ]; scalarPrompt _ Buttons.Create[ info: [ name: "scalar", wx: scalarSetPrompt.wx + scalarSetPrompt.ww + entryHSpace, wy: artworkToolData.height, wh: entryHeight, parent: artworkToolData.outer, border: FALSE], proc: SVArtworkUser.ScalarPrompt, clientData: artworkToolData ]; artworkToolData.textSection.scalar _ ViewerTools.MakeNewTextViewer[[ parent: artworkToolData.outer, wx: scalarPrompt.wx + scalarPrompt.ww + entryHSpace, wy: artworkToolData.height, ww: VFonts.StringWidth["188.88 "], wh: entryHeight, data: "1", scrollable: FALSE, border: FALSE]]; positionButton _ Buttons.Create[ info: [ name: "Position", wx: artworkToolData.textSection.scalar.wx + artworkToolData.textSection.scalar.ww + entryHSpace, wy: artworkToolData.height, wh: entryHeight, parent: artworkToolData.outer, border: FALSE], proc: SVArtworkUser.Position, clientData: artworkToolData ]; colorSet _ Buttons.Create[ info: [ name: " _ ", wx: positionButton.wx + positionButton.ww + entryHSpace, wy: artworkToolData.height, wh: entryHeight, parent: artworkToolData.outer, border: TRUE], proc: SVArtworkUser.SetColor, clientData: artworkToolData ]; artworkToolData.textSection.color _ ViewerTools.MakeNewTextViewer[[ parent: artworkToolData.outer, wx: colorSet.wx + colorSet.ww + entryHSpace, wy: artworkToolData.height, ww: VFonts.StringWidth["188.88, 188.88, 188.88 "], wh: entryHeight, data: ".9, .5, .5", scrollable: FALSE, border: FALSE]]; openFileButton _ Buttons.Create[ info: [ name: "OpenFile", wx: artworkToolData.textSection.color.wx + artworkToolData.textSection.color.ww + entryHSpace, wy: artworkToolData.height, wh: entryHeight, parent: artworkToolData.outer, border: FALSE], proc: SVArtworkUser.OpenFileButton, clientData: artworkToolData ]; closeFileButton _ Buttons.Create[ info: [ name: "CloseFile", wx: openFileButton.wx + openFileButton.ww + entryHSpace, wy: artworkToolData.height, wh: entryHeight, parent: artworkToolData.outer, border: FALSE], proc: SVArtworkUser.CloseFileButton, clientData: artworkToolData ]; artworkToolData.height _ artworkToolData.height + entryVSpace + entryHeight; }; -- end of AddTextSection InputNotify: PUBLIC SAFE PROCEDURE [self: ViewerClasses.Viewer, input: LIST OF REF ANY] = TRUSTED { <> artworkToolData: ArtworkToolData _ NARROW[self.data]; IF ISTYPE[input.first, TIPUser.TIPScreenCoords] THEN { controlPoint: Point2d; mousePlace: TIPUser.TIPScreenCoords _ NARROW[input.first]; controlPoint[1] _ mousePlace.mouseX; -- this is a fix to float conversion controlPoint[2] _ mousePlace.mouseY; controlPoint _ PadGraphics.ScreenToPad[controlPoint, artworkToolData.origin, artworkToolData.scalar]; IF ISTYPE[input.rest.first, ATOM] THEN SELECT input.rest.first FROM $MOVESTART => {-- Change mouse to a plus--}; $MOVEEND => { -- Change mouse back and update displacement of artwork. SVCoordSys2d.PlaceTranslationAwrtB[artworkToolData.artwork.artWRTPad, NIL, controlPoint]; SVArtworkUser.DrawArtwork[NIL, artworkToolData, yellow, FALSE, FALSE]; }; ENDCASE => ERROR; }; -- end is a mouse point }; -- end of InputNotify Init[]; END.