DIRECTORY AtomButtons, AtomButtonsTypes, CodeTimer, Feedback, FS, GGBasicTypes, GGCircleCache, GGContainer, GGEditTool, GGEvent, GGInterfaceTypes, GGMenus, GGModelTypes, GGMouseEvent, GGSegmentTypes, GGSessionLog, GGShapes, GGUserInput, GGUtility, GGWindow, GraphicsButton, Imager, IO, Menus, PopUpSelection, Rope, Rules, SlackProcess, VFonts, ViewerClasses, ViewerTools; GGMenusImpl: CEDAR PROGRAM IMPORTS AtomButtons, CodeTimer, Feedback, FS, GGCircleCache, GGContainer, GGEditTool, GGEvent, GGMouseEvent, GGSessionLog, GGShapes, GGUserInput, GGUtility, GGWindow, GraphicsButton, Imager, IO, PopUpSelection, Rope, Rules, SlackProcess, VFonts, ViewerTools EXPORTS GGMenus = BEGIN Caret: TYPE = REF CaretObj; CaretObj: TYPE = GGInterfaceTypes.CaretObj; FeedbackData: TYPE = AtomButtonsTypes.FeedbackData; ImagerProc: TYPE = GGInterfaceTypes.ImagerProc; MouseButton: TYPE = Menus.MouseButton; Outline: TYPE = GGModelTypes.Outline; Point: TYPE = GGBasicTypes.Point; Scene: TYPE = REF SceneObj; SceneObj: TYPE = GGModelTypes.SceneObj; Segment: TYPE = GGSegmentTypes.Segment; Sequence: TYPE = GGModelTypes.Sequence; Traj: TYPE = GGModelTypes.Traj; GGData: TYPE = REF GargoyleDataObj; GargoyleDataObj: TYPE = GGInterfaceTypes.GargoyleDataObj; Viewer: TYPE = ViewerClasses.Viewer; entryHeight: CARDINAL = 15; -- height of a line of items entryVSpace: CARDINAL = 2; -- vertical leading between lines entryHSpace: CARDINAL = 2; -- horizontal space between items on a line column1: CARDINAL = 200; -- horizontal space between margin and column 1; column2: CARDINAL = 250; -- horizontal space between margin and column 2. column3: CARDINAL = 500; -- horizontal space between margin and column 3; fullColumn: CARDINAL = 600; -- the width of the standard large left column. smallNumberSize: CARDINAL = 60; pointSize: CARDINAL = 160; boldFont: VFonts.Font; -- initialized in Init below; PopUpMenuEntry: TYPE = RECORD [ name: Rope.ROPE, input: LIST OF REF ANY ]; ExtractChoiceList: PROC [menu: LIST OF PopUpMenuEntry] RETURNS [choices: LIST OF Rope.ROPE] = { pos: LIST OF Rope.ROPE; newCell: LIST OF Rope.ROPE; IF menu = NIL THEN ERROR; choices _ CONS[menu.first.name, NIL]; pos _ choices; FOR l: LIST OF PopUpMenuEntry _ menu.rest, l.rest UNTIL l = NIL DO newCell _ CONS[l.first.name, NIL]; pos.rest _ newCell; pos _ newCell; ENDLOOP; }; QueuePopUpMenuAction: PROC [label: Rope.ROPE, menu: LIST OF PopUpMenuEntry, ggData: GGData, onceOnly: BOOL _ TRUE] = { index: NAT; choices: LIST OF Rope.ROPE _ ExtractChoiceList[menu]; DO index _ PopUpSelection.Request[header: label, choice: choices]; IF index < 0 THEN ERROR; IF index = 0 THEN RETURN; FOR entries: LIST OF PopUpMenuEntry _ menu, entries.rest UNTIL entries = NIL DO IF index = 1 THEN { GGUserInput.EventNotify[ggData, entries.first.input]; EXIT; }; index _ index - 1; REPEAT FINISHED => ERROR; ENDLOOP; IF onceOnly THEN RETURN; ENDLOOP; }; BuildControlPanel: PUBLIC PROC [ggData: GGData, windowMenu: Menus.Menu] = { BuildFileMenuLine[ggData, windowMenu]; BuildMasterMenuLine[ggData]; BuildStyleMenuLine[ggData]; BuildGravityLine[ggData]; BuildSlopeLine[ggData]; BuildAngleLine[ggData]; BuildRadiusLine[ggData]; BuildDistanceLine[ggData]; BuildMeasureLine[ggData]; BuildFeedbackLine[ggData]; AddARule[ggData]; }; AddARule: PROC [ggData: GGData] = { rule: Rules.Rule; rule _ Rules.Create[[ parent: ggData.outer, wy: ggData.height, ww: ggData.outer.cw, wh: 2 ]]; GGContainer.ChildXBound[ggData.outer, rule]; ggData.height _ ggData.height + rule.wh + entryVSpace; }; -- end of AddARule fudgeX: INTEGER _ 2; BuildFileMenuLine: PROC [ggData: GGData, windowMenu: Menus.Menu] = { nextX: INTEGER _ AtomButtons.BuildButtonLine [ggData.outer, 0, ggData.height, ggData, GGUserInput.EventNotify, LIST[ [button["Clear", LIST[LIST[$Clear]], -1, FALSE, NIL, ConfirmClear]], [button["Restore", LIST[LIST[$Reset]], -1, FALSE, NIL, ConfirmReset]], [button["Get", LIST[LIST[$Get]], -1, FALSE, NIL, ConfirmGet]], -- guarded in spite of Tioga viewers menus [button["Merge", LIST[LIST[$Merge]], -1, FALSE, NIL, ConfirmMerge]], [button["Store", LIST[LIST[$Store]], -1, FALSE, NIL, ConfirmStore]], [button["Save", LIST[LIST[$Save]] ]], [button["Stuff", LIST[LIST[$Stuff],NIL,LIST[$StuffScreen]] ]] ]]; nextX _ nextX+fudgeX; nextX _ AtomButtons.BuildUnQueuedButtonLine [ggData.outer, nextX, ggData.height, ggData, LIST[ ["Interpress", button, InterpressMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Script", button, ScriptMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Help", button, HelpMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Revive!", button, ReviveButton] ]]; nextX _ nextX+fudgeX; nextX _ AtomButtons.BuildButtonLine [ggData.outer, nextX, ggData.height, ggData, GGUserInput.EventNotify, LIST[ [button["Refresh", LIST[LIST[$Refresh]] ]], [button["Typescript", LIST[LIST[$Typescript]] ]] ]]; ggData.height _ ggData.height + entryHeight; }; BuildMasterMenuLine: PROC [ggData: GGData] = { overlapMenu: AtomButtons.ButtonLineEntry _ [popUpButton["Overlap", LIST [ [LIST [$Top], "Top", "Move selected objects to the front"], [LIST [$NoOp], "", "Does nothing"], [LIST [$Bottom], "Bottom", "Move selected objects to the back"], [LIST [$UpOne], "UpOne", "Move selected objects one layer toward the front"], [LIST [$NoOp], "", "Does nothing"], [LIST [$DownOne], "DownOne", "Move selected objects one layer toward the back"] ], -1, FALSE, NIL]]; nextX: INTEGER _ AtomButtons.BuildUnQueuedButtonLine [ggData.outer, 0, ggData.height, ggData, LIST[ ["Hierarchy", button, HierarchyMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Transform", button, TransformMenu, NIL, 0, -1, FALSE, NIL, boldFont] ]]; nextX _ AtomButtons.BuildButtonLine[ggData.outer, nextX+entryHSpace, ggData.height, ggData, GGUserInput.EventNotify, LIST[ overlapMenu ]]; nextX _ AtomButtons.BuildUnQueuedButtonLine [ggData.outer, nextX+entryHSpace, ggData.height, ggData, LIST[ ["Curves", button, CurveTypeMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Shapes", button, ShapesMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Text", button, TextOpsMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Fonts", button, FontOpsMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Groups", button, GroupOpsMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Debug", button, DebugMenu, NIL, 0, -1, FALSE, NIL, boldFont] ]]; ggData.height _ ggData.height + entryHeight; }; BuildStyleMenuLine: PROC [ggData: GGData] = { nextX: INTEGER _ AtomButtons.BuildUnQueuedButtonLine[ggData.outer, 0, ggData.height, ggData, LIST[ ["Stroke", button, LineWidthMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Color", button, LineColorMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Fill", button, AreaColorMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Edit", button, EditMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Select", button, AreaSelectMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["HotSpots", button, HotSpotsMenu, NIL, 0, -1, FALSE, NIL, boldFont], ["Units", button, UnitsMenu, NIL, 0, -1, FALSE, NIL, boldFont] ]]; [ggData.refresh.showColors, nextX] _ AtomButtons.BuildTwoStateButton[viewer: ggData.outer, x: nextX + entryHSpace, y: ggData.height, clientData: ggData, handleProc: GGUserInput.EventNotify, name: "ShowColors", action: LIST[$ToggleShowColors], init: off]; ggData.refresh.screenStyle _ AtomButtons.BuildEnumTypeSelection[viewer: ggData.outer, x: nextX + entryHSpace, y: ggData.height, maxWidth: 144, clientData: ggData, handleProc: GGUserInput.EventNotify, title: "ScreenStyle:", default: "PrintFonts", borderOnButtons: TRUE, style: flipThru, allInOneRow: TRUE, buttonNames: LIST["PrintFonts", "ScreenFonts", "WYSIWYG"], atom: $ScreenChoiceChange]; ggData.height _ ggData.height + entryHeight + entryVSpace; }; GravityExtentData: TYPE = REF GravityExtentDataObj; GravityExtentDataObj: TYPE = GGInterfaceTypes.GravityExtentDataObj; GravityExtentRepaint: PROC [dc: Imager.Context, clientData: REF ANY, buttonData: REF ANY, button: Viewer] = { caretPoint: Point; ged: GravityExtentData _ NARROW[buttonData]; extent: REAL _ ged.extent; Imager.TranslateT[dc, [button.ww, button.wh/2.0]]; caretPoint _ [-extent, 0.0]; GGShapes.DrawCaret[dc, caretPoint]; }; BuildGravityLine: PROC [ggData: GGData] = { nextX: NAT _ 0; ggData.hitTest.gravityTypeMenu _ AtomButtons.BuildEnumTypeSelection[viewer: ggData.outer, x: 0, y: ggData.height, maxWidth: 144, clientData: ggData, handleProc: GGUserInput.EventNotify, title: "GravType:", default: "PreferPoints", borderOnButtons: TRUE, style: flipThru, allInOneRow: TRUE, buttonNames: LIST["StrictDistance", "PreferPoints"], atom: $GravityChoiceChange]; ggData.hitTest.gravityType _ innerCircle; nextX _ ggData.hitTest.gravityTypeMenu.nextx; nextX _ AtomButtons.BuildButtonLine[ ggData.outer, nextX + entryHSpace, ggData.height, ggData, GGUserInput.EventNotify, LIST[ [label["GravExtent:"]] ]]; nextX _ GraphicsButton.BuildGraphicsButton[ container: ggData.outer, x: nextX + entryHSpace, y: ggData.height, w: 60, -- changed from 72 to make more room in line h: entryHeight, clientData: ggData, choices: LIST[ [LIST[$GravityExtentChange, $ValueUp]], [LIST[$GravityExtentChange, $InitialValue]], [LIST[$GravityExtentChange, $ValueDown]]], handleProc: GGUserInput.EventNotify, repaintProc: GravityExtentRepaint, buttonData: NEW[GravityExtentDataObj _ [extent: GGEditTool.GetDefaultGravityExtent[]]], updateProc: GravityExtentInGGData ]; [ggData.hitTest.gravButton, nextX] _ AtomButtons.BuildTwoStateButton[viewer: ggData.outer, x: nextX + 2*entryHSpace, y: ggData.height, clientData: ggData, handleProc: GGUserInput.EventNotify, name: "Gravity", action: LIST[$ToggleGravity], init: on]; [ggData.refresh.alignments, nextX] _ AtomButtons.BuildTwoStateButton[viewer: ggData.outer, x: nextX + entryHSpace, y: ggData.height, clientData: ggData, handleProc: GGUserInput.EventNotify, name: "Alignments", action: LIST[$ToggleAlignments], init: on]; [ggData.hitTest.midpointButton, nextX] _ AtomButtons.BuildTwoStateButton[viewer: ggData.outer, x: nextX + entryHSpace, y: ggData.height, clientData: ggData, handleProc: GGUserInput.EventNotify, name: "Midpoints", action: LIST[$ToggleMidpoints], init: off]; [ggData.hitTest.heuristicsButton, nextX] _ AtomButtons.BuildTwoStateButton[viewer: ggData.outer, x: nextX + entryHSpace, y: ggData.height, clientData: ggData, handleProc: GGUserInput.EventNotify, name: "Heuristics", action: LIST[$ToggleHeuristics], init: IF GGEditTool.GetDefaultHeuristics[] THEN on ELSE off]; ggData.height _ ggData.height + entryHeight; }; BuildSlopeLine: PROC [ggData: GGData] = { buttonHandle: AtomButtons.ScalarButtonHandle; nextX: NAT _ AtomButtons.BuildButtonLine[ggData.outer, 0, ggData.height, ggData, GGUserInput.EventNotify,LIST[ [button["Slope:", LIST[LIST[$SlopePrompt]] ]], [button["Get!", LIST[LIST[$GetSlope]] ]], [button["Add!", LIST[LIST[$AddSlope]] ]], [button["Delete!", LIST[LIST[$DeleteSlope]] ]] ]]; buttonHandle _ AtomButtons.CreateScalarButtonViewer[ggData.outer, nextX, ggData.height]; ggData.hitTest.slopeHeader _ buttonHandle; GGEvent.StandardSlopes[ggData, LIST[$StandardSlopes]]; ggData.height _ ggData.height + entryHeight; }; BuildAngleLine: PROC [ggData: GGData] = { buttonHandle: AtomButtons.ScalarButtonHandle; nextX: NAT _ AtomButtons.BuildButtonLine[ggData.outer, 0, ggData.height, ggData, GGUserInput.EventNotify,LIST[ [button["Angle:", LIST[LIST[$AnglePrompt]] ]], [button["Get!", LIST[LIST[$GetAngle]] ]], [button["Add!", LIST[LIST[$AddAngle]] ]], [button["Delete!", LIST[LIST[$DeleteAngle]] ]] ]]; buttonHandle _ AtomButtons.CreateScalarButtonViewer[ggData.outer, nextX, ggData.height]; ggData.hitTest.angleHeader _ buttonHandle; GGEvent.StandardAngles[ggData, LIST[$StandardAngles]]; ggData.height _ ggData.height + entryHeight; }; BuildRadiusLine: PROC [ggData: GGData] = { buttonHandle: AtomButtons.ScalarButtonHandle; nextX: NAT _ AtomButtons.BuildButtonLine[ggData.outer, 0, ggData.height, ggData, GGUserInput.EventNotify, LIST[ [button["Radius:", LIST[LIST[$RadiusPrompt]] ]], [button["Get!", LIST[LIST[$GetRadius]] ]], [button["Add!", LIST[LIST[$AddRadius]] ]], [button["Delete!", LIST[LIST[$DeleteRadius]] ]] ]]; buttonHandle _ AtomButtons.CreateScalarButtonViewer[ggData.outer, nextX, ggData.height]; ggData.hitTest.radiusHeader _ buttonHandle; GGEvent.StandardRadii[ggData, LIST[$StandardRadii]]; ggData.hitTest.radiusCircleCache _ GGCircleCache.Create[]; ggData.height _ ggData.height + entryHeight; }; BuildDistanceLine: PROC [ggData: GGData] = { buttonHandle: AtomButtons.ScalarButtonHandle; nextX: NAT _ AtomButtons.BuildButtonLine[ggData.outer, 0, ggData.height, ggData, GGUserInput.EventNotify, LIST[ [button["LineDistance:", LIST[LIST[$DistancePrompt]] ]], [button["Get!", LIST[LIST[$GetDistance]] ]], [button["Add!", LIST[LIST[$AddDistance]] ]], [button["Delete!", LIST[LIST[$DeleteDistance]] ]] ]]; buttonHandle _ AtomButtons.CreateScalarButtonViewer[ggData.outer, nextX, ggData.height]; ggData.hitTest.distanceHeader _ buttonHandle; GGEvent.StandardDistances[ggData, LIST[$StandardDistances]]; ggData.height _ ggData.height + entryHeight; }; BuildMeasureLine: PROC [ggData: GGData] = { nextX: NAT _ AtomButtons.BuildButtonLine[ggData.outer, 0, ggData.height, ggData, GGUserInput.EventNotify, LIST[ [button["SlopeValue:", LIST[LIST[$MeasureSlopeHit]] ]], [text["0.0", SlopeViewInGGData, smallNumberSize]], [button["AngleValue:", LIST[LIST[$MeasureAngleHit]] ]], [text["0.0", AngleViewInGGData, smallNumberSize]], [button["RadiusValue:", LIST[LIST[$MeasureRadiusHit]] ]], [text["0.0", DistanceViewInGGData, smallNumberSize]], [button["LineDistanceValue:", LIST[LIST[$MeasureLineDistHit]] ]], [text["0.0", LineDistViewInGGData, smallNumberSize]] ]]; ggData.height _ ggData.height + entryHeight; }; BuildFeedbackLine: PROC [ggData: GGData] = { nextX: NAT _ AtomButtons.BuildButtonLine[ggData.outer, 0, ggData.height, ggData, GGUserInput.EventNotify, LIST[ [label["Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Line", FeedbackLineInGGData, fullColumn]] ]]; ggData.height _ ggData.height + entryHeight; }; Dummy: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; Feedback.AppendHerald[ggData.feedback, "Menu Level: This feature not yet implemented", oneLiner]; Feedback.Blink[ggData.feedback]; }; InterpressMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["MergeIPEditable", LIST [$MergeIPEditable]], ["MergeIPSlice", LIST [$MergeIPSlice]], ["ToIP", LIST [$ToIP]], ["ToIPScreen", LIST [$ToIPScreen]], ["IncludeIPByReference", LIST[$IncludeIPByReference]], ["IncludeIPByValue", LIST[$IncludeIPByValue]], ["ShowIPIncludeMode", LIST[$ShowIPIncludeMode]] ]; QueuePopUpMenuAction["Interpress", menu, ggData, mouseButton#blue]; }; ScriptMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry _ LIST [ ["OpenScript", LIST [$ScriptAction, $Open]], ["AppendToScript", LIST [$ScriptAction, $Append]], ["CloseScript", LIST [$ScriptAction, $Close]], ["PlaybackScript", LIST [$ScriptAction, $Playback]], ["FastPlayScript", LIST [$ScriptAction, $FastPlay]] ]; choices: LIST OF Rope.ROPE _ ExtractChoiceList[menu]; index: NAT _ PopUpSelection.Request[header: "Script", choice: choices]; SELECT index FROM =0 => RETURN; =1 => OpenScript[parent, clientData, mouseButton, shift, control]; =2 => AppendToScript[parent, clientData, mouseButton, shift, control]; =3 => CloseScript[parent, clientData, mouseButton, shift, control]; =4 => PlaybackScript[parent, clientData, mouseButton, shift, control]; =5 => FastPlayScript[parent, clientData, mouseButton, shift, control]; ENDCASE => ERROR; }; ConfirmClear: PROC [clientData: REF ANY] = { ggData: GGData _ NARROW[clientData]; Feedback.AppendHerald[ggData.feedback, "Confirm deletion of all objects", oneLiner]; }; ConfirmReset: PROC [clientData: REF ANY] = { ggData: GGData _ NARROW[clientData]; Feedback.AppendHerald[ggData.feedback, "Confirm reset to original file", oneLiner]; }; ConfirmGet: PROC [clientData: REF ANY] = { ggData: GGData _ NARROW[clientData]; filename: Rope.ROPE _ ViewerTools.GetSelectionContents[]; Feedback.AppendHerald[ggData.feedback, Rope.Cat["Confirm getting of file ", filename, " to the current scene."], oneLiner]; }; ConfirmMerge: PROC [clientData: REF ANY] = { ggData: GGData _ NARROW[clientData]; filename: Rope.ROPE _ ViewerTools.GetSelectionContents[]; Feedback.AppendHerald[ggData.feedback, Rope.Cat["Confirm addition of file ", filename, " to the current scene."], oneLiner]; }; ConfirmStore: PROC [clientData: REF ANY] = { ggData: GGData _ NARROW[clientData]; fullName, msg: Rope.ROPE; success, exists: BOOL; [fullName, success, ----] _ GGUtility.GetGargoyleFileName[ViewerTools.GetSelectionContents[], ggData.currentWDir, ggData.feedback, FALSE]; IF NOT success THEN RETURN; exists _ FileExists[fullName]; IF exists THEN msg _ IO.PutFR["Confirm Store of %g [Old File]", [rope[fullName]]] ELSE msg _ IO.PutFR["Confirm Store to %g [New File]", [rope[fullName]]]; Feedback.AppendHerald[ggData.feedback, msg, oneLiner]; }; FileExists: PROC [fileName: Rope.ROPE] RETURNS [answer: BOOL] = { answer _ TRUE; [----, ----, ----, ----] _ FS.FileInfo[fileName ! FS.Error => {IF error.code = $unknownFile THEN {answer _ FALSE; CONTINUE} ELSE ERROR}]; }; HierarchyMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["Delete (DEL)", LIST [$Delete]], ["UnDelete", LIST [$Undelete]], ["AddHoles (^h)", LIST [$AddHoles]], ["UnionCombine", LIST [$UnionCombine]], ["DescribeSelected", LIST [$DescribeCurve, $Selected]] ]; QueuePopUpMenuAction["Hierarchy", menu, ggData, mouseButton#blue]; }; TransformMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["Rotate", LIST [$Rotate]], ["Scale", LIST [$Scale]], ["ScaleX", LIST [$ScaleX]], ["ScaleY", LIST [$ScaleY]], ["TranslateX", LIST [$TranslateX]], ["TranslateY", LIST [$TranslateY]], ["SixPoint", LIST [$SixPointTransform]], ["FourPoint", LIST [$FourPointTransform]] ]; QueuePopUpMenuAction["Transform", menu, ggData, mouseButton#blue]; }; ShapesMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["Triangle", LIST [$PolygonInCircle, NEW[INT _ 3] ]], ["Square", LIST [$PolygonInCircle, NEW[INT _ 4] ]], ["Pentagon", LIST [$PolygonInCircle, NEW[INT _ 5] ]], ["Hexagon", LIST [$PolygonInCircle, NEW[INT _ 6] ]], ["Octagon", LIST [$PolygonInCircle, NEW[INT _ 8] ]], ["FromSelectedCount", LIST [$PolygonInCircle, NEW[INT _ -1] ]], ["Knotched Line", LIST [$KnotchedLine, NEW[REAL _ 4.0], NEW[INT _ 8]] ], ["Box", LIST [$NewBox, NEW[REAL _ 1.0] ]], ["Circle", LIST [$NewCircle, NEW[REAL _ 1.0] ]], ["Arrow", LIST [$NewArrow, NEW[REAL _ 0.5], NEW[REAL _ 0.125] ]], ["8.5 by 11", LIST [$Frame, NEW[REAL _ 8.5*72.0], NEW[REAL _ 11.0*72.0] ]], ["11 by 14", LIST [$Frame, NEW[REAL _ 11.0*72.0], NEW[REAL _ 14.0*72.0] ]], ["38 by 50.66 (Versatec)", LIST [$Frame, NEW[REAL _ 38.0*72.0], NEW[REAL _ 50.666667*72.0] ]], ["640 x 480", LIST [$Frame, NEW[REAL _ 640.0], NEW[REAL _ 480.0] ]], ["1024 x 768", LIST [$Frame, NEW[REAL _ 1024.0], NEW[REAL _ 768.0] ]] ]; QueuePopUpMenuAction["Shapes", menu, ggData, mouseButton#blue]; }; DebugMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["Draw Tight Boxes", LIST [$DrawTightBoxes]], ["Draw Bounding Boxes", LIST [$DrawBoundBoxes]], ["Draw Outline Boxes", LIST [$DrawOutlineBoxes]], ["Draw Selection Box", LIST [$DrawSelectionBox]], ["Draw Background Box", LIST [$DrawBackgroundBox]], ["Draw Overlay Box", LIST [$DrawOverlayBox]], ["Draw Rubber Box", LIST [$DrawRubberBox]], ["Draw Drag Box", LIST [$DrawDragBox]], ["Test Gravity", LIST [$TestGravity]], ["ToIPTestGravity", LIST [$ToIPTestGravity]], ["Print Statistics", LIST [$Statistics]], ["Print Selected Statistic", LIST [$PrintSelectedStatistic]], ["Reset Statistics", LIST [$ResetStatistics]], ["SlackLog", LIST [$SlackLog]], ["Describe Caret Object", LIST [$DescribeCaretObject]], ["FSM Info", LIST [$FSMInfo]], ["Print All Input", LIST [$PrintAllInput]], ["Reset All Input", LIST [$ResetAllInput]], ["CauseAnError", LIST [$CauseAnError]] ]; QueuePopUpMenuAction["Debug", menu, ggData, mouseButton#blue]; }; HelpMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["Mouse Actions", LIST[$Help, $MouseActions]], ["Fonts", LIST[$Help, $Fonts]] ]; QueuePopUpMenuAction["Help", menu, ggData, mouseButton#blue]; }; RefreshButton: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; GGWindow.RestoreScreenAndInvariants[paintAction: $PaintEntireScene, ggData: ggData, remake: triggerBag, backgndOK: FALSE, edited: FALSE, okToClearFeedback: TRUE] }; ReviveButton: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; GGMouseEvent.ResetMouseMachinery[ggData]; CodeTimer.ResetTable[CodeTimer.GetTable[$Gargoyle]]; SlackProcess.Restart[ggData.slackHandle]; ggData.refresh.suppressRefresh _ FALSE; ggData.aborted _ ALL[FALSE]; IF mouseButton#blue THEN GGWindow.RestoreScreenAndInvariants[paintAction: $PaintEntireScene, ggData: ggData, remake: triggerBag, backgndOK: FALSE, edited: FALSE, okToClearFeedback: TRUE] }; GravityExtentInGGData: GraphicsButton.UpdateGraphicsButtonProc = { ggData: GGData _ NARROW[clientData]; ggData.hitTest.gravityExtentButton _ stateInfo; }; LineWidthMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["0 pt (LOOK 0)", LIST[$LineWidth, NEW[REAL _ 0.0]]], ["1 pt (LOOK 1)", LIST[$LineWidth, NEW[REAL _ 1.0]]], ["2 pt (LOOK 2)" , LIST[$LineWidth, NEW[REAL _ 2.0]]], ["3 pt (LOOK 3)", LIST[$LineWidth, NEW[REAL _ 3.0]]], ["4 pt (LOOK 4)", LIST[$LineWidth, NEW[REAL _ 4.0]]], ["WidthFromSelection", LIST[$LineWidth]], ["EndFromSelection", LIST[$LineEnd]], ["JointFromSelection", LIST[$TrajJoints]], ["DashesFromSelection", LIST[$DashesFromSelection]], ["DashesOff", LIST[$DashesOff]], ["ShowValues", LIST[$PrintStrokeValues]], ["MatchSelectedWidth", LIST[$SelectMatchingWidth]], ["MatchSelectedDashes", LIST[$SelectMatchingDashes]], ["MakeDefaultValues", LIST [$SetDefaultStrokeValues]], ["ShowDefaultValues", LIST [$ShowDefaultStrokeValues]] ]; QueuePopUpMenuAction["Stroke", menu, ggData, mouseButton#blue]; }; LineColorMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["none", LIST[$LineColorNone]], ["black" , LIST[$LineColorBlack]], ["white", LIST[$LineColorWhite]], ["gray", LIST[$LineColorGray]], ["FromColorTool", LIST[$LineColorFromColorTool]], ["FollowColorTool", LIST[$LineColorFollowColorTool]], ["ToColorTool", LIST[$LineColorToColorTool]], ["FromSelectedName", LIST[$LineColorFromSelectedName]], ["FromSelectedRGB", LIST[$LineColorFromSelectedRGB]], ["ShowValue", LIST[$PrintLineColor]], ["MatchSelectedName", LIST[$SelectMatchingLineCNS]], ["MatchSelectedRGB", LIST[$SelectMatchingLineRGB]], ["MakeDefaultColor", LIST [$SetDefaultLineColor]], ["ShowDefaultColor", LIST [$ShowDefaultLineColor]] ]; QueuePopUpMenuAction["Line Color", menu, ggData, mouseButton#blue]; }; AreaColorMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["none", LIST[$AreaColorNone]], ["black" , LIST[$AreaColorBlack]], ["white", LIST[$AreaColorWhite]], ["gray", LIST[$AreaColorGray]], ["FromColorTool", LIST[$AreaColorFromColorTool]], ["FollowColorTool", LIST[$AreaColorFollowColorTool]], ["ToColorTool", LIST[$AreaColorToColorTool]], ["FromSelectedName", LIST[$AreaColorFromSelectedName]], ["FromSelectedRGB", LIST[$AreaColorFromSelectedRGB]], ["ShowValue", LIST[$PrintAreaColor]], ["MatchSelectedName", LIST[$SelectMatchingAreaCNS]], ["MatchSelectedRGB", LIST[$SelectMatchingAreaRGB]], ["MakeDefaultColor", LIST [$SetDefaultFillColor]], ["ShowDefaultColor", LIST [$ShowDefaultFillColor]] ]; QueuePopUpMenuAction["Fill", menu, ggData, mouseButton#blue]; }; ArrowsMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["none", LIST[$Arrows, NEW[INT _ 0]]], ["left/down", LIST[$Arrows, NEW[INT _ 1]]], ["right/up" , LIST[$Arrows, NEW[INT _ 2]]], ["both", LIST[$Arrows, NEW[INT _ 3]]] ]; QueuePopUpMenuAction["Arrows", menu, ggData, mouseButton#blue]; }; AreaSelectMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["New", LIST [$AreaSelectNew]], ["NewWithDelete", LIST [$AreaSelectNewAndDelete]], ["Extend", LIST [$AreaSelectExtend]], ["All (^d)", LIST [$SelectAll]], ["Degenerate", LIST [$AreaSelectDegenerate]] ]; QueuePopUpMenuAction["Area Select", menu, ggData, mouseButton#blue]; }; TextOpsMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["AddText", LIST [$AddText]], ["DropShadowOn 1 pt", LIST [$DropShadowOn, NEW[REAL _ -1.0], NEW[REAL _ -1.0]]], ["DropShadowOn 2 pt", LIST [$DropShadowOn, NEW[REAL _ -2.0], NEW[REAL _ -2.0]]], ["DropShadowOn 3 pt", LIST [$DropShadowOn, NEW[REAL _ -3.0], NEW[REAL _ -3.0]]], ["DropShadowOff", LIST [$DropShadowOff]], ["AmplifySpaceFromSelection", LIST [$AmplifySpaceFromSelection]], ["ShowAmplifySpace", LIST [$PrintAmplifySpace]] ]; QueuePopUpMenuAction["Text", menu, ggData, mouseButton#blue]; }; FontOpsMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["# SetPressFont", LIST [$SetPressFont]], ["# SetScreenFont", LIST [$SetScreenFont]], ["# SetXCFont", LIST [$SetPrintFont]], ["# SetDetailedFont", LIST [$SetFontDetailed]], ["# SetLiteralFont", LIST [$SetFontLiteral]], ["# ShowFont", LIST [$ShowFontValues]], ["# ShowLiteralFont", LIST [$ShowFontValuesLiteral]], ["# CopyFontAndTransform", LIST [$CopyAll]], ["# CopyFamilyAndFace", LIST [$CopyFont]], ["# MatchLiteral", LIST[$MatchAll]], [" MatchSelectedName", LIST[$MatchSelectedName]], [" MatchSelectedNameLiteral", LIST[$MatchSelectedNameLiteral]], ["# MakeDefaultFont", LIST [$SetDefaultFontValues]], [" ShowDefaultFont", LIST [$ShowDefaultFontValues]] ]; QueuePopUpMenuAction["Fonts", menu, ggData, mouseButton#blue]; }; GroupOpsMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["AddToGroup", LIST [$AddToGroup]], ["FindGroup", LIST [$SelectGroup]], ["RemoveFromGroup", LIST [$RemoveFromGroup]], ["PrintGroupsOfSelected", LIST [$PrintGroupsOfSelected]], ["PrintAllGroups", LIST [$PrintAllGroups]] ]; QueuePopUpMenuAction["Groups", menu, ggData, mouseButton#blue]; }; CurveTypeMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["Line (LOOK l)", LIST [$SetStraight]], ["Arc (LOOK a)", LIST [$SetArc]], ["Conic (LOOK c)", LIST [$SetConic]], ["Bezier (LOOK z)", LIST [$SetBezier]], ["B-Spline (LOOK b)", LIST [$SetBSpline]], ["Natural Spline (LOOK n)", LIST [$SetNaturalSpline]], ["MatchSelectedType", LIST [$SelectMatchingCurve]] ]; QueuePopUpMenuAction["Curves", menu, ggData, mouseButton#blue]; }; EditMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["ApplyAllDefaults", LIST [$ApplyAllDefaults]], ["ShowAllDefaults", LIST [$ShowAllDefaults]], ["StandardDefaults", LIST [$StandardDefaults]], ["Close (^c)", LIST [$Close]], ["Weld (^w)", LIST [$Weld]], ["Add CP (^p)", LIST [$AddControlPoint]], ["Delete CP (^P)", LIST [$DeleteControlPoint]], ["Add Joint (^j)", LIST [$AddJoint]], ["ReplaceSegment", LIST [$SplitSegment]], ["Splice", LIST [$Splice]] ]; QueuePopUpMenuAction["Edit", menu, ggData, mouseButton#blue]; }; OpenScript: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; name: Rope.ROPE _ ViewerTools.GetSelectionContents[]; GGSessionLog.OpenScript[name, ggData]; IF ggData.debug.logStream#NIL THEN [] _ SlackProcess.EnableSessionLogging[ggData.slackHandle]; }; AppendToScript: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; name: Rope.ROPE _ ViewerTools.GetSelectionContents[]; GGSessionLog.AppendScript[name, ggData]; IF ggData.debug.logStream#NIL THEN [] _ SlackProcess.EnableSessionLogging[ggData.slackHandle]; }; CloseScript: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; [] _ SlackProcess.DisableSessionLogging[ggData.slackHandle]; GGSessionLog.CloseScript[ggData]; }; PlaybackScript: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; name: Rope.ROPE _ ViewerTools.GetSelectionContents[]; GGSessionLog.PlaybackFromFile[name, ggData]; }; FastPlayScript: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; name: Rope.ROPE _ ViewerTools.GetSelectionContents[]; GGUserInput.EventNotify[ggData, LIST[$DisableRefresh]]; GGSessionLog.PlaybackFromFile[name, ggData]; GGUserInput.EventNotify[ggData, LIST[$EnableRefresh]]; GGUserInput.EventNotify[ggData, LIST[$Refresh, $DoNotClearFeedback]]; }; HotSpotsMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["Make Hot (^s)", LIST[$MakeHot]], ["Make All Hot (^ss)", LIST[$MakeAllHot]], ["Make Cold (^S)" , LIST[$MakeCold]], ["Make All Cold (^SS)" , LIST[$MakeAllCold]], ["Show Hot", LIST [$ShowHot]], ["Hide Hot", LIST [$HideHot]], ["Drop Anchor (^a)" , LIST[$DropAnchor]], ["Lift Anchor (^A)" , LIST[$LiftAnchor]], ["Standard Alignments" , LIST[$StandardAlignments]] ]; QueuePopUpMenuAction["Hot Spots", menu, ggData, mouseButton#blue]; }; UnitsMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["FromSegment", LIST[$RadiusUnitFromSegment]], ["FromRadiusValue", LIST[$RadiusUnitFromValue]], ["FromSelection", LIST[$RadiusUnitFromSelection]], ["Inches", LIST[$InchScaleUnit]], ["Centimeters", LIST[$CentimeterScaleUnit]], ["Points", LIST[$PointsScaleUnit]], ["PrintCurrent", LIST[$PrintScaleUnit]] ]; QueuePopUpMenuAction["Units", menu, ggData, mouseButton#blue]; }; Caret2InGGData: AtomButtons.UpdateProc = { ggData: GGData _ NARROW[clientData]; ggData.measure.caret2_ button; }; SlopeViewInGGData: AtomButtons.UpdateProc = { ggData: GGData _ NARROW[clientData]; ggData.measure.slopeView _ button; }; AngleViewInGGData: AtomButtons.UpdateProc = { ggData: GGData _ NARROW[clientData]; ggData.measure.angleView _ button; }; DistanceViewInGGData: AtomButtons.UpdateProc = { ggData: GGData _ NARROW[clientData]; ggData.measure.radiusView _ button; }; LineDistViewInGGData: AtomButtons.UpdateProc = { ggData: GGData _ NARROW[clientData]; ggData.measure.lineDistView _ button; }; FeedbackLineInGGData: AtomButtons.UpdateProc = { ggData: GGData _ NARROW[clientData]; feedback: FeedbackData _ Feedback.RegisterFeedback[button, $Gargoyle]; ggData.feedback _ feedback; }; DistanceOfInterest: Menus.ClickProc = { }; Init: PROC = { boldFont _ VFonts.EstablishFont[family: "Helvetica", size: 10, bold: TRUE, italic: FALSE, defaultOnFailure: TRUE]; }; Init[]; END. ϊFile: GGMenusImpl.mesa Copyright Σ 1985, 1987 by Xerox Corporation. All rights reserved. Last edited by Bier on April 30, 1987 7:46:54 pm PDT Contents: Code to create a Gargoyle window. Calls GGContainer to make the container and adds menus at the top. The graphics part of the Gargoyle window is a new viewer of class $ActionArea. The paint proc for a $ActionArea is defined herein. Pier, May 5, 1987 6:46:39 pm PDT nameSize: CARDINAL = 140; numberSize: CARDINAL = 80; bigNumberSize: CARDINAL = 160; Non-destructive (copies the menu names). Build All of the Control Panel Menus Files: Clear, Reset, Get, Store, Save, Split, Interpress [button["Split", LIST[$Split] ]], Master: Hierarchy Curve Transform Overlap EditCurve View Debug Abort Revive ["Overlap", button, OverlapMenu, NIL, 0, -1, FALSE, NIL, boldFont], Style: LineEnds LineWidth LineColor Fill TextAlign Font ["Arrows", button, ArrowsMenu, NIL, 0, -1, FALSE, NIL, boldFont], File Line: ClickProc: TYPE = PROC [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: MouseButton _ red, shift, control: BOOL _ FALSE]; QueuePopUpMenuAction["Script", menu, ggData, mouseButton#blue]; Master Line: ["Extend Select (^v)", LIST [$ExtendSelect]], ["Undo (SHIFT-ESC)", LIST [$Undo]], ["Redo (ESC)", LIST [$Redo]], ["Cluster", LIST [$Cluster]], ["Un Cluster", LIST [$UnCluster]], OverlapMenu: Menus.ClickProc = { ggData: GGData _ NARROW[clientData]; menu: LIST OF PopUpMenuEntry; menu _ LIST [ ["Top", ], ["Bottom", LIST [$Bottom]], ["UpOne", LIST [$UpOne]], ["DownOne", LIST [$DownOne]] ]; QueuePopUpMenuAction["Overlap", menu, ggData, mouseButton#blue]; }; The first parameter is shaft length. The second is barb length. Both in inches. Gravity Line: Style Line: ["Drop Shadow From Selection", LIST [$DropShadowFromSelection]], ["SetAllDefaults", LIST [$SetAllDefaults]], Alignment Line: Distance Line: ggData.hitTest.slopeText _ button; ggData.hitTest.angleText _ button; ggData.hitTest.radiusText _ button; ggData.hitTest.distanceText _ button; Κ!ύ˜IcodešΟnœ™KšœB™BKšœ4™4šœμ™τKšœ ™ —K˜šΟk ˜ Jšœ4žœΪžœW˜ιK˜K˜—š œžœž˜Jšžœ#žœ“žœ@˜Kšžœ ž˜—˜Kšœžœžœ ˜Kšœ žœ˜+Kšœžœ!˜3Kšœ žœ˜/Kšœ žœ˜&Kšœ žœ˜%Kšœžœ˜!Kšœžœžœ ˜Kšœ žœ˜'Kšœ žœ˜'Kšœ žœ˜'Kšœžœ˜Kšœžœžœ˜#Kšœžœ$˜9Kšœžœ˜$K˜Kšœ žœΟc˜8Kšœ žœŸ!˜K˜K˜—Kšœ,˜,K˜K˜—šœžœ˜-Kšœ8™=šœžœOžœ˜bKšœ"žœ žœžœ ˜DKšœ!žœ žœžœ ˜CKšœžœ žœžœ ™AKšœ žœ žœžœ ˜BKšœžœ žœžœ ˜=Kšœ#žœ žœžœ ˜EKšœ#žœ žœžœ ˜EKšœžœ žœžœ ˜>K˜K˜—šœΪžœ ˜ώK˜—Kšœ‡žœ žœžœE˜‡Kšœ:˜:K˜K˜—Kšœžœžœ˜3Kšœžœ)˜Cš œžœ"žœžœžœžœ˜mK˜Kšœžœ ˜,Kšœžœ˜Kšœ2˜2Kšœ˜Kšœ#˜#K˜K˜—šœžœ˜+Kšœžœ˜Kšœ!˜!šœ_˜_Kšœ˜Kšœ$˜$Kšœ,˜,Kšœžœ žœ˜:Kšœ žœ#˜4Kšœ˜—Kšœ)˜)K˜Kšœ-˜-šœ$˜$KšœR˜Ršžœ˜KšœΟb œ˜—Kšœ˜K˜—šœ+˜+Kšœ˜Kšœ˜Kšœ˜KšœŸ,˜3Kšœ˜Kšœ˜šœ žœ˜Kšœžœ"˜'Kšœžœ'˜,Kšœžœ%˜*—Kšœ$˜$Kšœ"˜"Kšœ žœH˜WKšœ!˜!Kšœ˜K˜—Kšœ$˜$šœa˜aKšœ˜Kšœ$˜$Kšœ œ˜Kšœžœ˜Kšœ ˜ K˜—Kšœ$˜$šœ_˜_Kšœ˜Kšœ$˜$Kšœ  œ˜Kšœžœ˜ Kšœ ˜ K˜—Kšœ(˜(šœ_˜_Kšœ˜Kšœ$˜$Kšœ  œ˜Kšœžœ˜Kšœ ˜ K˜—Kšœ*˜*šœ_˜_Kšœ˜Kšœ$˜$Kšœ  œ˜Kšœžœ˜ Kšœžœ#žœžœ˜=K˜—Kšœ,˜,K˜K˜—šœžœ˜)Kšœ-˜-šœžœ_žœ˜nKšœžœžœ˜.Kšœžœžœ˜)Kšœžœžœ˜)Kšœžœžœ˜.K˜—KšœX˜XKšœ*˜*Kšœžœ˜6Kšœ,˜,˜K˜——šœžœ˜)Kšœ-˜-šœžœ_žœ˜nKšœžœžœ˜.Kšœžœžœ˜)Kšœžœžœ˜)Kšœžœžœ˜.K˜—KšœX˜XKšœ*˜*Kšœžœ˜6Kšœ,˜,K˜K˜—šœžœ˜*Kšœ-˜-šœžœ`žœ˜oKšœžœžœ˜0Kšœžœžœ˜*Kšœžœžœ˜*Kšœžœžœ˜/K˜—KšœX˜XKšœ+˜+Kšœžœ˜4Kšœ:˜:Kšœ,˜,K˜K˜—šœžœ˜,Kšœ-˜-šœžœ`žœ˜oKšœžœžœ˜8Kšœžœžœ˜,Kšœžœžœ˜,Kšœžœžœ˜1K˜—KšœX˜XKšœ-˜-Kšœ"žœ˜˜>K˜K˜—š‘œ˜Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœžœ˜.Kšœ žœ˜K˜—Kšœ=˜=K˜K˜—š‘ œ˜"Kšœžœ ˜$Kšœsžœ žœžœ˜‘K˜K˜—š‘ œ˜!Kšœžœ ˜$Kšœ)˜)Kšœ4˜4Kšœ)˜)Kšœ!žœ˜'Kšœžœžœ˜Kš žœžœtžœ žœžœ˜ΊK˜—K™K™ K™šœ-˜BKšœžœ ˜$Kšœ/˜/K˜K˜—K™ K™š œ˜"Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœžœ žœžœ ˜5Kšœžœ žœžœ ˜5Kšœžœ žœžœ ˜6Kšœžœ žœžœ ˜5Kšœžœ žœžœ ˜5Kšœžœ˜)Kšœžœ ˜%Kšœžœ˜*Kšœžœ˜4Kšœžœ˜ Kšœžœ˜)Kšœžœ˜3Kšœžœ˜5Kšœžœ˜6Kšœžœ˜6K˜—Kšœ?˜?K˜K˜—š‘ œ˜"Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœ žœ˜Kšœ žœ˜"Kšœ žœ˜!Kšœ žœ˜Kšœžœ˜1Kšœžœ˜5Kšœžœ˜-Kšœžœ˜7Kšœžœ˜5Kšœžœ˜%Kšœžœ˜4Kšœžœ˜3Kšœžœ˜2Kšœžœ˜2K˜—KšœC˜CK˜K˜—š‘ œ˜"Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœ žœ˜Kšœ žœ˜"Kšœ žœ˜!Kšœ žœ˜Kšœžœ˜1Kšœžœ˜5Kšœžœ˜-Kšœžœ˜7Kšœžœ˜5Kšœžœ˜%Kšœžœ˜4Kšœžœ˜3Kšœžœ˜2Kšœžœ˜2K˜—Kšœ=˜=K˜K˜—š‘ œ˜Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœ žœ žœžœ˜&Kšœžœ žœžœ˜+Kšœžœ žœžœ˜+Kšœ žœ žœžœ˜%K˜—Kšœ?˜?K˜K˜—š‘œ˜#Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœžœ˜Kšœžœ˜2Kšœ žœ˜%Kšœ žœ˜ Kšœžœ˜,K˜—KšœD˜DK˜K˜—š‘ œ˜ Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœ žœ ˜Kš œžœžœžœ žœžœ ˜PKš œžœžœžœ žœžœ ˜PKš œžœžœžœ žœžœ ˜PKšœžœ™@Kšœžœ˜)Kšœžœ˜AKšœžœ˜/K˜—Kšœ=˜=K˜K˜—š œ˜ Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœžœ˜)Kšœžœ˜+Kšœžœ˜&Kšœžœ˜/Kšœžœ˜-Kšœžœ˜'Kšœžœ˜5Kšœžœ ˜,Kšœžœ˜*Kšœžœ ˜$Kšœžœ˜3Kšœ žœ˜AKšœžœ˜4Kšœžœ˜4Kšœ˜—Kšœ>˜>Kšœ˜K˜—š‘ œ˜!Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœžœ˜#Kšœžœ˜#Kšœžœ˜-Kšœžœ˜9Kšœžœ˜*K˜—Kšœ?˜?K˜K˜—š‘ œ˜"Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœžœ˜'Kšœžœ ˜!Kšœžœ˜%Kšœžœ˜'Kšœžœ˜*Kšœžœ˜6Kšœžœ˜2K˜—Kšœ?˜?K˜K˜—š‘œ˜Kšœžœ ˜$Kšœžœžœ˜šœžœ˜ Kšœžœ˜/Kšœžœ™+Kšœžœ˜-Kšœžœ˜/Kšœžœ ˜Kšœžœ ˜Kšœžœ˜)Kšœžœ˜/Kšœžœ˜%Kšœžœ˜)Kšœ žœ ˜K˜—Kšœ=˜=K˜K˜—š œ˜Kšœžœ ˜$Kšœ žœ&˜5Kšœ&˜&Kšžœžœžœ<˜^K˜K˜—šœ˜#Kšœžœ ˜$Kšœ žœ&˜5Kšœ(˜(Kšžœžœžœ<˜^K˜K˜—š œ˜ Kšœžœ ˜$Kšœ<˜˜>K˜—K™K™K™šœ˜*Kšœžœ ˜$Kšœ˜K˜K˜—šœ˜-Kšœžœ ˜$Kšœ"˜"Kšœ"™"K˜K˜—šœ˜-Kšœžœ ˜$Kšœ"˜"Kšœ"™"K˜K˜—šœ˜0Kšœžœ ˜$Kšœ#˜#Kšœ#™#K˜K˜—šœ˜0Kšœžœ ˜$Kšœ%˜%Kšœ%™%K˜K˜—šœ˜0Kšœžœ ˜$KšœF˜FKšœ˜K˜K˜—šœ˜'K˜K˜—šœžœ˜KšœEžœ žœžœ˜rK˜K˜—Kšœ˜K˜Kšžœ˜J˜—…—x²’©