DIRECTORY Atom, Commander, Convert, ExprRead USING [ReadFile, FetchRope, Error], FileNames, FS, Imager USING [Context], IO, IP, IPParams, IPConstants, IPTopOps, IPNetTab, IPTop, IPCTG, IPCoTab, IPToolBox, IPMVEditOps, IPMVStackOps, IPMVBasicOps, IPMainViewer, MessageWindow, Menus, OrderedRefArray, QuickViewer, Rope, SymTab, TerminalIO; IPMainViewerImpl: CEDAR PROGRAM IMPORTS Atom, Commander, Convert, ExprRead, FS, FileNames, IO, IP, IPParams, IPTop, IPCTG, IPCoTab, IPToolBox, IPTopOps, IPNetTab, IPMVEditOps, IPMVStackOps, IPMVBasicOps, MessageWindow, OrderedRefArray, Rope, QuickViewer, TerminalIO EXPORTS IPMainViewer = BEGIN mvTop: PUBLIC IPTop.Ref _ NIL; topGotInteractively: BOOL _ FALSE; trialSolutions: PUBLIC OrderedRefArray.Ref _ NIL; wDir: Rope.ROPE _ FileNames.CurrentWorkingDirectory[]; selectedNet: IPNetTab.Net _ NIL; showAllNames, showCompNames, showChNames: BOOL _ FALSE; showCompsOnly, showChsOnly: BOOL _ FALSE; trackKept: LIST OF REF _ NIL; prevTrack: LIST OF REF _ NIL; showPinNameCutOff: PUBLIC REAL _ 3.0; --ie. set from interpreter coStipple: CARDINAL _ IPConstants.White; RollBack: PUBLIC PROC[fromFile: Rope.ROPE] RETURNS [mvTop: IPTop.Ref] = { SetTopTo[IPTop.ReconstructSelf[fromFile], NIL, TRUE]; }; --RollBack GetInput: PUBLIC PROC[defaultDir, inputFile: Rope.ROPE] RETURNS [mvTop: IPTop.Ref, systemName: Rope.ROPE] = { tab: SymTab.Ref _ ExprRead.ReadFile[IPToolBox.ConstructFileName[defaultDir, inputFile, "desc"]]; systemName _ ExprRead.FetchRope[tab, "ObjectName", TRUE].val; mvTop _ IPTop.Create1[defaultDir, inputFile]; }; --GetInput SetTopTo: PUBLIC PROC [newTop: IPTop.Ref, systemName: Rope.ROPE, gotInteractively: BOOLEAN] ~ { IF topGotInteractively AND mvTop # NIL THEN IPTop.DestroySelf[mvTop]; mvTop _ newTop; QuickViewer.SetViewerName[systemName]; Refresh[]; trialSolutions _ NIL; trackKept _ prevTrack _ NIL; topGotInteractively _ gotInteractively; }; Refresh: PROC = {QuickViewer.EraseViewer[]; QuickViewer.DrawInViewer[DrawProc]}; --Refresh-- QuitProc: PROC [] = { TerminalIO.PutRope["Quiting..."]; IF mvTop # NIL AND topGotInteractively THEN {IPTop.DestroySelf[mvTop]; mvTop _ NIL}; TerminalIO.PutRope["..Done\n"]; }; --QuitProc-- errorMessage: Rope.ROPE; ClickProc: PROC[mouseButton: ATOM, xCoord, yCoord: REAL] ={ MessageWindow.Append[Rope.Cat[Atom.GetPName[mouseButton], " ", Convert.RopeFromReal[xCoord], " ", Convert.RopeFromReal[yCoord]], TRUE]; }; --ClickProc-- MenuHit: PROC[command: ATOM, mouse: Menus.MouseButton, shift, control: BOOL] = { ENABLE { TerminalIO.UserAbort => { errorMessage _ Rope.Cat[Atom.GetPName[command], "...userAbort"]; IF ~IPParams.DebugSystem THEN GOTO err }; FS.Error => {TerminalIO.PutRope[Rope.Cat[Atom.GetPName[error.code], "...."]]; errorMessage _ error.explanation; IF ~IPParams.DebugSystem THEN GOTO err}; IO.Error => {TerminalIO.PutRope[Rope.Cat[Atom.GetPName[command], "...."]]; errorMessage _ "Not enough arguments. Please try again"; IF ~IPParams.DebugSystem THEN GOTO err}; IO.EndOfStream => {TerminalIO.PutRope[Rope.Cat[Atom.GetPName[command], "...."]]; errorMessage _ "Input Error. Please try again"; IF ~IPParams.DebugSystem THEN GOTO err}; ExprRead.Error => {TerminalIO.PutRope[Rope.Cat[Atom.GetPName[command], "...."]]; errorMessage _ msg; IF ~IPParams.DebugSystem THEN GOTO err}; IPTopOps.InvalidArgs =>{TerminalIO.PutRope[Rope.Cat[Atom.GetPName[op], "..."]]; errorMessage _ "Arguments are not valid"; IF ~IPParams.DebugSystem THEN GOTO err}; IPTopOps.UndoStackEmpty => {TerminalIO.PutRope["...undo stack is emptied..."]; errorMessage _ "Can't undo any further"; IF ~IPParams.DebugSystem THEN GOTO err}; OrderedRefArray.OutOfRange => { TerminalIO.PutRope[Rope.Cat[Atom.GetPName[command], "...."]]; errorMessage _ Rope.Cat[Convert.RopeFromInt[index], " is not in range"]; IF ~IPParams.DebugSystem THEN GOTO err; }; IPToolBox.ParseError => { TerminalIO.PutRope["Input Error..."]; errorMessage _ "Arguments are not valid"; IF ~IPParams.DebugSystem THEN GOTO err}; IP.Error => { SELECT ec FROM missingRegistration => { TerminalIO.PutRope[Rope.Cat[explanation, "..."]]; errorMessage _ "Unknown name"; IF ~IPParams.DebugSystem THEN GOTO err; }; doubleRegistration => { TerminalIO.PutRope[Rope.Cat[explanation, "..."]]; errorMessage _ "Name Conflict"; IF ~IPParams.DebugSystem THEN GOTO err; }; callingError => { TerminalIO.PutRope[Rope.Cat[explanation, "..."]]; errorMessage _ "Check Input And Retry or See Implementor"; IF ~IPParams.DebugSystem THEN GOTO err; }; programmingError, noResource, other => { TerminalIO.PutRope[Rope.Cat["You just found a bug: ", explanation]]; errorMessage _ "See Implementor"; IF ~IPParams.DebugSystem THEN GOTO err; }; ENDCASE => ERROR;}; }; refreshFlag: BOOL _ TRUE; reGeom: BOOL _ FALSE; SELECT command FROM $RollBack => { file: Rope.ROPE _ TerminalIO.RequestRope["Enter Full Name of Log File to Rollback from: "]; TerminalIO.PutRope[Rope.Cat["Reconstructing From: ", file, "..."]]; SetTopTo[IPTop.ReconstructSelf[file], NIL, TRUE]; TerminalIO.PutRope["..Done\n"]; RETURN}; $GetInput => { inputFile: Rope.ROPE _ TerminalIO.RequestRope["Enter Name of Description File From Which To Get Data: "]; newTop: IPTop.Ref; systemName: Rope.ROPE; [newTop, systemName] _ GetInput[wDir, inputFile]; SetTopTo[newTop, systemName, TRUE]; TerminalIO.PutRope["..Done\n"]; RETURN }; ENDCASE => NULL; IF mvTop = NIL THEN { errorMessage _ "System is Empty! Please do Rollback or GetExample to load a new system"; IF ~IPParams.DebugSystem THEN GOTO err}; --ENDIF-- SELECT command FROM $Name => { IF ~shift AND ~ control THEN { SELECT mouse FROM $red => {showChNames _ NOT showChNames;}; $yellow => {showAllNames _ NOT showAllNames; IF showAllNames THEN {showCompNames _ TRUE; showChNames _ TRUE;} ELSE {showCompNames _ FALSE; showChNames _ FALSE;};}; $blue => {showCompNames _ NOT showCompNames}; ENDCASE => ERROR; TerminalIO.PutRope[(IF showAllNames THEN "Show all names..." ELSE "Not showing all names...")]; showAllNames _ showCompNames AND showChNames; }; --endIf IF shift THEN showCompsOnly _ ~ showCompsOnly; IF control THEN showChsOnly _ ~ showChsOnly; }; $DefChs => { TerminalIO.PutRope["DefiningChannels..."]; [] _ mvTop.ReDefineChs[yPrimary: NOT shift, maxChWidth: control ! IPTop.ComponentsOverlapped => {errorMessage _ "Overlapping Components"; IF ~IPParams.DebugSystem THEN GOTO err}]; prevTrack _ NIL; trackKept _ NIL}; $ClrChs => { TerminalIO.PutRope["Destroying Channels..."]; IPTop.ClearChannels[mvTop]; prevTrack _ NIL; trackKept _ NIL}; $PaintNet => { argStream: IO.STREAM _ IO.RIS[TerminalIO.RequestRope["Name of net to be painted: "]]; selectedNet _ IPNetTab.FetchNet[mvTop.nets, IO.GetLineRope[argStream]]; QuickViewer.DrawInViewer[DrawNetProc]; refreshFlag _ FALSE}; $Geom, $CheckPoint, $List, $ChkSlf, $EstChs => { [reGeom, refreshFlag] _ IPMVBasicOps.MenuHit[mvTop, wDir, command, mouse, shift, control] }; $Undo, $Un1, $Redo, $Re1, $KepTrk, $ClrStks, $StkSz, $ToSoln => { [prevTrack, reGeom, refreshFlag] _ IPMVStackOps.MenuHit[mvTop, prevTrack, trackKept, command, mouse, shift, control, trialSolutions] }; $BrkX, $FomX, $RemZ, $FomZ, $LtoT, $TtoL, $FlxKne, $ExtKne, $Mrr, $Rot, $Ornt, $ClrCnr, $Grw, $Grw1, $Shr, $BrkXs, $SetCo, $MovCo, $SwapCo, $FlipT, $SetCoShp, $SpawnCo => { [reGeom, refreshFlag] _ IPMVEditOps.MenuHit[mvTop, command, mouse, shift, control]; prevTrack _ NIL; }; ENDCASE => ERROR; IF reGeom THEN mvTop.Geometrize[horPosSense: NOT control, verPosSense: NOT shift]; IF refreshFlag THEN Refresh[]; TerminalIO.PutRope["..Done\n"]; EXITS err => {MessageWindow.Append[errorMessage, TRUE]; MessageWindow.Blink[]; TerminalIO.PutRope["Aborted\n"];}; }; --MenuHit-- DrawNetProc: PROC[context: Imager.Context, scaleFactor: REAL] ={ IPNetTab.PaintNet[net: selectedNet, context: context, scaleFactor: scaleFactor, showNetName: FALSE] }; --DrawNetProc DrawProc: PROC [context: Imager.Context, scaleFactor: REAL] ={ IF mvTop # NIL THEN { IF showCompsOnly THEN { IPCoTab.PaintSelf[coTab: mvTop.coTab, context: context, scaleFactor: scaleFactor, coStipple: coStipple, showCoNames: (showCompNames OR showAllNames), showPhyPinNames: (scaleFactor > showPinNameCutOff)]; RETURN}; IF showChsOnly THEN { IPCTG.PaintSelf[ctg: mvTop.ctg, context: context, scaleFactor: scaleFactor, showChName: (showChNames OR showAllNames)]; RETURN}; mvTop.PaintSelf[context: context, scaleFactor: scaleFactor, showChNames: (showChNames OR showAllNames), showCompNames: (showCompNames OR showAllNames), showPinNames: (scaleFactor > showPinNameCutOff)];} }; --DrawProc-- Start: Commander.CommandProc={ mvName: Rope.ROPE; IF cmd # NIL THEN { argStream: IO.STREAM _ IO.RIS[cmd.commandLine]; mvName _ IO.GetID[argStream! IO.EndOfStream => CONTINUE;]}; BuildViewer[Rope.Cat["Phoenix: ", mvName]] }; --Start BuildViewer: PUBLIC PROC [mvName: Rope.ROPE] ~ { QuickViewer.BuildViewer[DrawProc, QuitProc, MenuHit, ClickProc, mvName, FALSE, LIST[$RollBack, $GetInput, $CheckPoint], LIST[$DefChs, $ClrChs, $Geom,$Name, $List, $PaintNet, $EstChs], LIST[$EditOps, $BrkX, $FomX, $RemZ, $FomZ, $LtoT, $TtoL, $FlxKne, $ExtKne, $Grw, $Grw1, $Shr, $Rot, $Mrr, $Ornt, $ClrCnr], LIST[$OpsExtra, $SetCo, $MovCo, $SwapCo, $FlipT, $SpawnCo, $SetCoShp], LIST[$StkOps, $Undo, $Redo, $KepTrk, $ClrStks, $Un1, $Re1, $StkSz, $ToSoln]]}; Commander.Register[key: "Phoenix", proc: Start, doc: "Create an Phoenix Viewer"]; END. v--File: IPMainViewerImpl.mesa Last edited by: Preas on August 2, 1986 6:26:33 pm PDT Last Edited by: CSChow, February 2, 1985 3:35:10 am PST --Intro: This interface is self-documentary. Use this as reference --Imports: -- (I) IPMVBasicOps = basic operations -- (II) IPMVEditOps = editing operations -- (III) IPMVStackOps = stack related operations --Minor Details Κ P˜JšœΟa™J– "Cedar" stylešœ6™6J– "Cedar" style™7J– "Cedar" style™J™B™ J™&J™(J™0—J˜šΟk ˜ J˜J˜ J˜Jšœ žœ˜,Jšœ ˜ Jšžœ˜Jšœžœ ˜Jšžœ˜Jšžœ˜J˜ J˜ Jšœ ˜ J˜ Jšœ˜Jšžœ˜J˜J˜ J˜ Jšœ ˜ J˜ Jšœ ˜ Jšœ˜J˜Jšœ˜Jšœ ˜ Jšœ˜J˜Jšœ ˜ J˜—šΟnœžœž˜ Jš žœ%žœ žœžœžœ’˜λšžœž˜J˜—Jšœžœ žœ˜Jšœžœžœ˜"Jšœžœžœ˜1Jšœ žœ'˜6Jšœžœ˜ Jšœ*žœžœ˜7Jšœžœžœ˜)Jš œ žœžœžœžœ˜š œ žœžœžœžœ˜J™—J™JšœžœžœΟc˜@šœ žœ˜(J˜—š Ÿœžœžœžœžœ˜IJšœ*žœžœ˜5Jšœ  ˜ J˜—š Ÿœžœžœžœžœ%žœ˜mJšœ`˜`Jšœ3žœ˜=Jšœ-˜-Jšœ  ˜ J˜—codeš Ÿœžœžœ&žœžœ˜_Jšžœžœ žœžœ˜EJšœ˜Jšœ&˜&Jšœ ˜ Jšœžœ˜Jšœžœ˜Jšœ'˜'Jšœ˜J˜—šŸœžœD  ˜\J˜—šŸœžœ˜Jšœ!˜!Jš žœ žœžœžœ$žœ˜TJšœ˜Jšœ  ˜J˜—Jšœžœ˜šŸ œžœžœžœ˜;šœ?˜?Jšœ#˜#Jšœžœ˜%—Jšœ  ˜J˜—šŸœžœ žœ,žœ˜Pšžœ˜šœ˜Jšœ@˜@Jšžœžœžœ˜&Jšœ˜—šžœL˜NJšœ"˜"Jšžœžœžœ˜(—šžœI˜KJšœ9˜9Jšžœžœžœ˜(—šžœO˜QJšœ0˜0Jšžœžœžœ˜(—šœ ΟbœC˜QJšœ˜Jšžœžœžœ˜(—šœO˜OJšœ*˜*Jšžœžœžœ˜(—šœN˜NJšœ)˜)Jšžœžœžœ˜(—šœ˜Jšœ>˜>JšœH˜HJšžœžœžœ˜'Jšœ˜—šœ˜Jšœ%˜%Jšœ*˜*Jšžœžœžœ˜(—šžœ ˜ šžœž˜šœ˜Jšœ1˜1Jšœ˜Jšžœžœžœ˜'Jšœ˜—šœ˜Jšœ1˜1Jšœ˜Jšžœžœžœ˜'Jšœ˜—šœ˜Jšœ1˜1Jšœ:˜:Jšžœžœžœ˜'Jšœ˜—šœ(˜(JšœD˜DJšœ!˜!Jšžœžœžœ˜'Jšœ˜—Jšžœžœ˜——Jšœ˜J˜Jšœ žœžœ˜Jšœžœžœ˜šžœ ž˜šœ˜Jšœ žœM˜\JšœC˜CJšœ&žœžœ˜1Jšœ˜Jšžœ˜—šœ˜JšœžœU˜iJšœ˜Jšœžœ˜Jšœ1˜1Jšœžœ˜#Jšœ˜Jšž˜Jšœ˜—Jšžœžœ˜—šžœ žœžœ˜JšœX˜XJšžœžœžœ  ˜2—šžœ ž˜šœ ˜ šžœžœ žœ˜šžœž˜Jšœžœ˜)šœžœ˜,šžœ˜Jšžœžœžœ˜1Jšžœžœžœ˜5——Jšœžœ˜-Jšžœžœ˜—Jšœžœžœžœ˜_Jšœžœ ˜-Jšœ ˜ —Jšžœžœ!˜.Jšžœ žœ˜,Jšœ˜—šœ ˜ Jšœ*˜*šœ!žœf˜ŠJšžœžœžœ˜)—Jšœ žœžœ˜"—˜ Jšœ-˜-Jšœ˜Jšœ žœžœ˜"—šœ˜Jš œ žœžœžœžœ8˜UJšœ,žœ˜GJšœ&˜&Jšœžœ˜—šœ0˜0JšœY˜YJšœ˜—šœA˜AJšœ„˜„Jšœ˜—šœ¬˜¬JšœS˜SJšœ žœ˜Jšœ˜—Jšžœžœ˜—Jšžœžœžœžœ˜RJšžœ žœ ˜Jšœ˜šž˜Jšœ+žœ<˜kJ˜——Jšœ  ˜J˜—šŸ œžœ'žœ˜@Jšœ]žœ˜cJšœ  ˜J˜—šŸœžœ(žœ˜>šžœ žœžœ˜šžœžœ˜Jšœ„žœD˜ΚJšžœ˜—J˜šžœ žœ˜Jšžœ`žœ˜wJšžœ˜—JšœVžœ.žœB˜Κ—Jšœ  ˜J˜—šŸœ˜Jšœ žœ˜šžœžœžœ˜Jš œ žœžœžœžœ˜/Jšœ žœžœžœ˜;—Jšœ*˜*Jšœ ˜ J˜—šŸ œžœžœžœ˜0J˜Jš œHžœžœ%žœ=žœwžœCžœJ˜ΙJ˜—šœQ˜QJ˜—Jšžœ˜—J˜—…—$0V