DIRECTORY FileNames, Imager, Labels, Menus, Rope, SVFiles, SVInterfaceTypes, SVScene, SVSceneTypes, SVViewersOnScene, SVEvent, SVWindow, ViewerClasses, ViewerOps; SVViewersOnSceneImpl: CEDAR PROGRAM IMPORTS FileNames, Labels, Rope, SVFiles, SVScene, SVEvent, SVWindow, ViewerOps EXPORTS SVViewersOnScene = BEGIN ArtworkToolData: TYPE = SVInterfaceTypes.ArtworkToolData; Slice: TYPE = SVSceneTypes.Slice; EditToolData: TYPE = SVInterfaceTypes.EditToolData; MouseButton: TYPE = Menus.MouseButton; Scene: TYPE = SVSceneTypes.Scene; ScratchpadData: TYPE = SVInterfaceTypes.ScratchpadData; Viewer: TYPE = ViewerClasses.Viewer; ViewerCell: TYPE = REF ViewerCellObj; ViewerCellObj: TYPE = SVInterfaceTypes.ViewerCellObj; SVData: TYPE = SVInterfaceTypes.SVData; ViewerProc: TYPE = SVViewersOnScene.ViewerProc; ViewerAssemblyProc: TYPE = SVViewersOnScene.ViewerAssemblyProc; PaintSceneAllViewers: PUBLIC PROC [paintAction: ATOM, editToolData: EditToolData, scene: Scene, remake: SVWindow.ForegroundParts _ none, backgndOK: BOOL _ FALSE, edited: BOOL _ TRUE, okToClearFeedback: BOOL _ TRUE] = { svData: SVData; success: BOOL; viewerCell: ViewerCell; IF edited THEN SceneNewVersionInternal[editToolData, scene]; [viewerCell, success] _ FindSceneInAllViewers[scene, editToolData.allViewers]; IF NOT success THEN ERROR; IF viewerCell.viewersOnScene = NIL THEN RETURN; svData _ NARROW[viewerCell.viewersOnScene.data]; SVWindow.RestoreScreenAndInvariants[paintAction, svData, remake, backgndOK, edited, okToClearFeedback]; IF viewerCell.viewersOnScene.link = NIL THEN RETURN; FOR list: Viewer _ viewerCell.viewersOnScene.link, list.link UNTIL list = viewerCell.viewersOnScene DO svData _ NARROW[list.data]; SVWindow.RestoreScreenAndInvariants[paintAction, svData, remake, backgndOK, edited, okToClearFeedback]; ENDLOOP; }; UpdateAllHeaders: PUBLIC PROC [svData: SVData, scene: Scene] = { viewerCell: ViewerCell; firstViewer: Viewer; success: BOOL; editToolData: EditToolData _ NARROW[svData.editToolData]; [viewerCell, success] _ FindSceneInAllViewers [scene, editToolData.allViewers]; IF NOT success THEN ERROR; firstViewer _ viewerCell.viewersOnScene; SVEvent.UpdateHeader[scene.name, NARROW[firstViewer.data]]; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = NIL OR viewerList = firstViewer DO SVEvent.UpdateHeader[scene.name, NARROW[viewerList.data]]; ENDLOOP; }; SceneNewVersionInternal: PUBLIC PROC [editToolData: EditToolData, scene: Scene] = { viewerCell: ViewerCell; firstViewer: Viewer; success: BOOL; [viewerCell, success] _ FindSceneInAllViewers [scene, editToolData.allViewers]; IF NOT success THEN ERROR; firstViewer _ viewerCell.viewersOnScene; SVEvent.NewVersion[firstViewer]; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = NIL OR viewerList = firstViewer DO SVEvent.NewVersion[viewerList]; ENDLOOP; }; SceneNewVersion: PUBLIC PROC [svData: SVData] = { viewerCell: ViewerCell; scene: Scene _ svData.scene; firstViewer: Viewer; success: BOOL; editToolData: EditToolData _ NARROW[svData.editToolData]; [viewerCell, success] _ FindSceneInAllViewers [scene, editToolData.allViewers]; IF NOT success THEN ERROR; firstViewer _ viewerCell.viewersOnScene; SVEvent.NewVersion[firstViewer]; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = NIL OR viewerList = firstViewer DO SVEvent.NewVersion[viewerList]; ENDLOOP; }; SceneOldVersion: PUBLIC PROC [svData: SVData, scene: Scene] = { viewerCell: ViewerCell; firstViewer: Viewer; success: BOOL; editToolData: EditToolData _ NARROW[svData.editToolData]; [viewerCell, success] _ FindSceneInAllViewers [scene, editToolData.allViewers]; IF NOT success THEN ERROR; firstViewer _ viewerCell.viewersOnScene; SVEvent.OldVersion[firstViewer]; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = NIL OR viewerList = firstViewer DO SVEvent.OldVersion[viewerList]; ENDLOOP; }; NotifyOfEmpty: PUBLIC PROC [svData: SVData, from: Scene, to: Scene] = { editToolData: EditToolData _ NARROW[svData.editToolData]; before, listCell, after: Viewer; success: BOOL; viewerCell, newViewerCell: ViewerCell; [viewerCell, success] _ FindSceneInAllViewers[from, editToolData.allViewers]; IF NOT success THEN ERROR; [before, listCell, after, success] _ FindViewerInViewerCell [svData.outer, viewerCell]; IF NOT success THEN ERROR; DeleteViewerFromAllViewers[viewerCell, before, listCell, after]; [newViewerCell, editToolData.allViewers] _ AddSceneToAllViewers[to, editToolData.allViewers]; AddViewerToViewerCell[svData.outer, newViewerCell]; }; NotifyDestroy: PUBLIC PROC [viewer: Viewer] = { viewerCell: ViewerCell; before, listCell, after: Viewer; success: BOOL; svData: SVData _ NARROW[viewer.data]; editToolData: EditToolData _ NARROW[svData.editToolData]; [viewerCell, before, listCell, after, success] _ FindViewerInAllViewers[viewer, editToolData.allViewers]; IF NOT success THEN ERROR; IF viewerCell.viewersOnScene = viewer THEN viewerCell.viewersOnScene _ viewer.link; }; NewSelectedViewer: PUBLIC PROC [svData: SVData] = { editToolData: EditToolData _ NARROW[svData.editToolData]; sceneName: Rope.ROPE; IF svData # editToolData.currentSVData THEN { SVEvent.Deselected[editToolData.currentSVData]; editToolData.currentSVData _ svData; editToolData.sceneSection.currentScene _ svData.scene; svData.textSection.isSelected _ TRUE; Labels.SetDisplayStyle[svData.textSection.selected, $WhiteOnBlack, TRUE]; sceneName _ FileNames.GetShortName[svData.scene.name]; Labels.Set[editToolData.sceneSection.sceneName, sceneName]; }; }; ReSelectViewer: PUBLIC PROC [svData: SVData] = { editToolData: EditToolData _ NARROW[svData.editToolData]; sceneName: Rope.ROPE; IF editToolData.currentSVData # svData THEN { SVEvent.Deselected[editToolData.currentSVData]; editToolData.currentSVData _ svData; svData.textSection.isSelected _ TRUE; Labels.SetDisplayStyle[svData.textSection.selected, $WhiteOnBlack, TRUE]; sceneName _ FileNames.GetShortName[svData.scene.name]; Labels.Set[editToolData.sceneSection.sceneName, sceneName]; }; editToolData.sceneSection.currentScene _ svData.scene; }; Split: PUBLIC PROC [svData: SVData, scene: Scene] = { viewerCell: ViewerCell; oldViewer, newViewer: Viewer; success: BOOL; currentSVData: SVData; editToolData: EditToolData _ NARROW[svData.editToolData]; [currentSVData,----] _ SVWindow.CreateWindow[editToolData, scene, FALSE, FALSE, editToolData.originalWorkingDirectory]; newViewer _ currentSVData.outer; oldViewer _ svData.outer; [viewerCell, success] _ FindSceneInAllViewers[scene, editToolData.allViewers]; AddViewerToViewerCell[newViewer, viewerCell]; newViewer.newVersion _ oldViewer.newVersion; newViewer.newFile _ oldViewer.newFile; newViewer.file _ oldViewer.file; SVEvent.UpdateHeader[scene.name, currentSVData]; ViewerOps.ComputeColumn[column: newViewer.column, paint: TRUE]; -- now do the painting }; NewViewer: PUBLIC PROC [editToolData: EditToolData] = { viewerCell: ViewerCell; currentSVData: SVData; wdir: Rope.ROPE; scene: Scene; wdir _ editToolData.originalWorkingDirectory; scene _ SVScene.CreateScene[Rope.Concat[wdir, "NoName.pic"]]; [currentSVData, ----] _ SVWindow.CreateWindow[editToolData, scene, FALSE, TRUE, editToolData.originalWorkingDirectory]; [viewerCell, editToolData.allViewers] _ AddSceneToAllViewers[scene, editToolData.allViewers]; AddViewerToViewerCell[currentSVData.outer, viewerCell]; SVEvent.Selected[NIL, currentSVData]; SVEvent.UpdateHeader[scene.name, currentSVData]; }; DestroyAllSolidviewsWindows: PUBLIC PROC [editToolData: EditToolData] = { allViewers: LIST OF ViewerCell _ editToolData.allViewers; viewerCell: ViewerCell; artworkTool: Viewer _ NARROW[editToolData.artworkTool.data, ArtworkToolData].outer; scratchpad: Viewer _ NARROW[editToolData.scratchpad.data, ScratchpadData].scratchViewerData.outer; messages: Viewer _ editToolData.messages; editTool: Viewer _ editToolData.outer; next: Viewer; FOR sceneCellList: LIST OF ViewerCell _ allViewers, sceneCellList.rest UNTIL sceneCellList = NIL DO viewerCell _ sceneCellList.first; IF viewerCell.viewersOnScene = NIL THEN {} ELSE{ IF viewerCell.viewersOnScene.link = NIL THEN {} ELSE { FOR list: Viewer _ viewerCell.viewersOnScene.link, next UNTIL list = viewerCell.viewersOnScene DO next _ list.link; ViewerOps.DestroyViewer[list]; ENDLOOP; }; ViewerOps.DestroyViewer[viewerCell.viewersOnScene]; }; ENDLOOP; ViewerOps.DestroyViewer[artworkTool]; ViewerOps.DestroyViewer[scratchpad]; ViewerOps.DestroyViewer[messages]; ViewerOps.DestroyViewer[editTool]; }; FindSceneInAllViewers: PUBLIC PROC [scene: Scene, allViewers: LIST OF ViewerCell] RETURNS [viewerCell: ViewerCell, success: BOOL] = { success _ FALSE; FOR list: LIST OF ViewerCell _ allViewers, list.rest UNTIL list = NIL OR success DO IF list.first.scene = scene THEN { viewerCell _ list.first; success _ TRUE; RETURN; }; ENDLOOP; }; AddSceneToAllViewers: PUBLIC PROC [scene: Scene, allViewers: LIST OF ViewerCell] RETURNS [viewerCell: ViewerCell, newAllViewers: LIST OF ViewerCell] = { viewerCell _ NEW[ViewerCellObj _ [scene, NIL]]; newAllViewers _ CONS[viewerCell, allViewers]; }; FindViewerInAllViewers: PUBLIC PROC [viewer: Viewer, allViewers: LIST OF ViewerCell] RETURNS [viewerCell: ViewerCell, before, listCell, after: Viewer, success: BOOL] = { firstViewer: Viewer; success _ FALSE; FOR allList: LIST OF ViewerCell _ allViewers, allList.rest UNTIL allList = NIL OR success DO before _ NIL; firstViewer _ allList.first.viewersOnScene; IF firstViewer = NIL THEN LOOP; IF firstViewer = viewer THEN { listCell _ firstViewer; after _ firstViewer.link; viewerCell _ allList.first; success _ TRUE; RETURN}; before _ firstViewer; IF firstViewer.link = NIL THEN LOOP; FOR viewerList: Viewer _ firstViewer.link, viewerList.link UNTIL viewerList = firstViewer OR success DO IF viewerList = viewer THEN { listCell _ viewerList; after _ viewerList.link; viewerCell _ allList.first; success _ TRUE; RETURN}; before _ viewerList; ENDLOOP; ENDLOOP; }; FindViewerInViewerCell: PUBLIC PROC [viewer: Viewer, viewerCell: ViewerCell] RETURNS [before, listCell, after: Viewer, success: BOOL] = { firstViewer: Viewer; success _ FALSE; firstViewer _ viewerCell.viewersOnScene; IF firstViewer = NIL THEN {success _ FALSE; RETURN}; IF firstViewer = viewer THEN { before _ NIL;-- this tells delete proc that it needs a new firstViewer listCell _ firstViewer; after _ firstViewer.link; success _ TRUE; RETURN}; before _ firstViewer; FOR viewerList: Viewer _ viewerCell.viewersOnScene.link, viewerList.link UNTIL viewerList = firstViewer OR viewerList = NIL DO IF viewerList = viewer THEN { listCell _ viewerList; after _ viewerList.link; success _ TRUE; RETURN}; before _ viewerList; ENDLOOP; success _ FALSE; }; DeleteViewerFromAllViewers: PUBLIC PROC [viewerCell: ViewerCell, before, listCell, after: Viewer] = { svData: SVData; IF before = NIL OR viewerCell.viewersOnScene = listCell THEN { IF after = NIL THEN {viewerCell.viewersOnScene _ NIL; RETURN}; FOR v: Viewer _ after, v.link UNTIL v.link = listCell DO REPEAT FINISHED => IF v = after THEN { after.link _ NIL; svData _ NARROW[after.data]; SVEvent.UpdateHeader[NIL, svData]} ELSE v.link _ after; ENDLOOP; viewerCell.viewersOnScene _ after; } ELSE { IF before = after THEN { after.link _ NIL; svData _ NARROW[after.data]; SVEvent.UpdateHeader[NIL, svData]} ELSE before.link _ after; }; }; AddViewerToViewerCell: PUBLIC PROC [viewer: Viewer, viewerCell: ViewerCell] = { IF viewerCell.viewersOnScene = NIL THEN { viewer.link _ NIL; viewerCell.viewersOnScene _ viewer; RETURN}; viewer.link _ viewerCell.viewersOnScene; IF viewerCell.viewersOnScene.link = NIL THEN viewerCell.viewersOnScene.link _ viewer ELSE FOR v: Viewer _ viewerCell.viewersOnScene.link, v.link UNTIL v.link=viewerCell.viewersOnScene DO REPEAT FINISHED => v.link _ viewer; ENDLOOP; viewerCell.viewersOnScene _ viewer; }; LoadScene: PUBLIC PROC [svData: SVData, picName: Rope.ROPE, wdir: Rope.ROPE] RETURNS [scene: Scene, success: BOOL] = { editToolData: EditToolData _ NARROW[svData.editToolData]; oldViewerCell, newViewerCell: ViewerCell; before, listCell, after: Viewer; sceneName: Rope.ROPE; [scene, success] _ SVFiles.OpenScene[picName, wdir, svData.feedback]; IF NOT success THEN RETURN; [newViewerCell, editToolData.allViewers] _ AddSceneToAllViewers[scene, editToolData.allViewers]; [oldViewerCell, before, listCell, after, success] _ FindViewerInAllViewers[svData.outer, editToolData.allViewers]; IF success THEN { DeleteViewerFromAllViewers[oldViewerCell, before, listCell, after]; AddViewerToViewerCell[svData.outer, newViewerCell]; editToolData.sceneSection.currentScene _ scene; sceneName _ FileNames.GetShortName[scene.name]; Labels.Set[editToolData.sceneSection.sceneName, sceneName]; } ELSE ERROR; }; SaveScene: PUBLIC PROC [svData: SVData, picName: Rope.ROPE] RETURNS [success: BOOL] = { scene: Scene _ svData.scene; success _ SVFiles.SaveScene[scene, picName, svData.feedback]; }; StoreScene: PUBLIC PROC [svData: SVData, scene: Scene, picName: Rope.ROPE] RETURNS [success: BOOL] = { editToolData: EditToolData _ NARROW[svData.editToolData]; oldViewerCell, newViewerCell: ViewerCell; before, listCell, after: Viewer; sceneAlreadyExists, viewerThere: BOOL _ FALSE; success _ SVFiles.StoreScene[scene, picName, svData.feedback]; SVEvent.SceneOldVersion[svData]; IF NOT success THEN RETURN; [oldViewerCell, before, listCell, after, viewerThere] _ FindViewerInAllViewers[svData.outer, editToolData.allViewers]; IF viewerThere THEN {-- if viewer was there delete it. IF oldViewerCell.scene = scene THEN RETURN; -- user is storing old file. DeleteViewerFromAllViewers[oldViewerCell, before, listCell, after]; }; [newViewerCell, sceneAlreadyExists] _ FindSceneInAllViewers[scene, editToolData.allViewers]; IF NOT sceneAlreadyExists THEN [newViewerCell, editToolData.allViewers] _ AddSceneToAllViewers[scene, editToolData.allViewers]; AddViewerToViewerCell[svData.outer, newViewerCell]; }; END. <SVViewersOnSceneImpl.mesa Copyright c 1986 by Xerox Corporation. All rights reserved. Last edited by Bier on February 2, 1987 7:04:43 pm PST Contents: Procedures that operate on a set of viewers, namely those (Split) viewers that are looking at the same Solidviews scene. Draw the first viewer if there is one. Draw the rest (remember they are linked in a ring) Loops through split viewers updating headers. Loops through split viewers updating headers. Loops through split viewers updating headers. Loops through split viewers updating headers. This viewer has just been loaded with a different scene. Any selections are now invalid. IF targetSelection.svData = svData THEN targetSelection.assembly _ NIL; IF moveeSelection.svData = svData THEN moveeSelection.assembly _ NIL; This viewer is about to be destroyed. The window manager will take care of removing it from our linked list. However, make sure that this viewer is not the viewer refered to by the viewerCell corresponding to its scene. (We would lose all our viewers if this is the case). If so, move our pointer to someone else. This should not be necessary but just in case. Create a new viewer and split all viewers onto this scene clientData is editToolData fake a button press on the Selected button Destroy all solid viewers, the artwork tool, the scratchpad, the messages viewer, and the editTool. The user is done with Solidviews. viewers are linked in a ring so we go around until we are back at the first viewer. is it the first viewer? viewers are linked in a ring so we go around until we are back at the first viewer. is it the first viewer? ViewerCell is in the key spot. after becomes new key spot. Search the ring for the last cell (which currently refers to viewer cell) and have it refer to after. a viewer is loading a new scene. All newly loaded scenes are considered unique (since the file might have been editted by hand since last loading) Add a viewer cell. a viewer is saving a scene. Save if possible. No other action required. This viewer should be on our list from when this scene was opened or stored. a viewer is storing a scene. If this viewer previously had a scene, we will have to remove it from that scene list and add it to a new one. Otherwise we just have to add it. if this viewerCell doesn't exist, add it. add scene to proper viewer cell. ΚΙ˜J˜Icodešœ™Kšœ Οmœ1™˜eJšœ˜šžœ žœžœ&žœ˜>Jšœ‘™‘Jš žœ žœžœžœžœ˜>Jšžœ˜šžœž˜šžœžœ˜šžœ žœ˜Jšœ žœ˜Jšœ žœ ˜Jšœžœ ˜"—Jšžœ˜——Jšžœ˜Jšœ"˜"Jšœ˜—šžœ˜šžœžœ˜Jšœ žœ˜Jšœ žœ ˜Jšœžœ ˜"—Jšžœ˜Jšœ˜—Jšœ˜—šŸœžœžœ-˜Ošžœžœžœ˜)Jšœžœ˜Jšœ#˜#Jšžœ˜—Jšœ(˜(šžœ"žœž˜,Jšœ'˜'—Jšžœžœ3˜;šžœ"ž˜)Jšžœžœ˜#—Jšžœ˜Jšœ#˜#Jšœ˜J˜—J˜šŸ œžœžœ žœ žœžœžœ˜vJšœ¦™¦Jšœžœ˜9Jšœ)˜)Jšœ ˜ Jšœžœ˜JšœE˜EJšžœžœ žœžœ˜šœ*˜*Jšœ5˜5—Jšœr˜ršžœ žœ˜JšœC˜CJšœ3˜3Jšœ/˜/Jšœ/˜/Jšœ;˜;Jšœ˜—Jšžœžœ˜ Jšœ˜—š Ÿ œžœžœ žœžœ žœ˜WJšœ—™—Jšœ˜Jšœ=˜=Jšœ˜—š Ÿ œžœžœ.žœžœ žœ˜fJšœ―™―Jšœžœ˜9Jšœ)˜)Jšœ ˜ Jšœ!žœžœ˜.Jšœ>˜>Jšœ ˜ Jšžœžœ žœžœ˜šœ7˜7Jšœ>˜>—šžœ žœ‘!˜6Jšžœžœžœ‘˜IJšœC˜CJšœ˜—Jšœ)™)Jšœ\˜\šžœžœžœ+˜IJšœ5˜5—Jšœ ™ Jšœ3˜3Jšœ˜J˜—K˜Kšžœ˜K˜—…—6zO