<> <> <> <> <<>> 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] = { << Loops through split viewers updating headers.>> 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.