<> <> <> <<>> DIRECTORY Containers USING [Create], Icons USING [IconFlavor, NewIconFromFile], FS USING [Error, ExpandName], Graph USING [ControllerRec, GraphHandle, GraphProc, ROPE, Viewer], GraphCleanUp USING [CleanUpHandle], GraphOps USING [Lock, Unlock], GraphPrivate USING [ControllerMenus, MakeSpec, MakeTable, MakeXYValues], GraphUtil USING [HandleFromViewer, HandleNotNil, ReplaceFileExt], Rope USING [Concat, Find], <> <> ViewerEvents USING [EventProc, RegisterEventProc], ViewerOps USING [AddProp, FetchProp, OpenIcon, TopViewer]; GraphController: CEDAR PROGRAM IMPORTS Containers, Icons, FS, GraphCleanUp, GraphOps, GraphPrivate, GraphUtil, Rope, ViewerEvents, ViewerOps EXPORTS GraphPrivate = { OPEN Graph, GraphOps, GraphPrivate; <<(constant) variables>> controllerIcon: Icons.IconFlavor _ Icons.NewIconFromFile["Graph.icons", 1]; <> ShowController: PUBLIC PROC [handle: GraphHandle, wDir: ROPE] = { <> IF GraphUtil.HandleNotNil[handle] THEN { OPEN handle; IF controller = NIL THEN { tableFile, msg: ROPE; [tableFile, ] _ FS.ExpandName[graph.fileName, wDir ! FS.Error => {msg _ error.explanation; CONTINUE}]; IF msg # NIL OR tableFile.Find["/", 1] > 1 OR tableFile.Find["]"] > 1 THEN tableFile _ "///Graph/Graph"; NewController[handle, GraphUtil.ReplaceFileExt[tableFile, "table"]]; } ELSE { IF controller.viewer.iconic THEN ViewerOps.OpenIcon[icon: controller.viewer, bottom: FALSE] ELSE ViewerOps.TopViewer[controller.viewer]; }; }; }; -- ShowController NewController: PROC [handle: GraphHandle, tableFile: ROPE] = { OPEN handle; controller _ NEW[ControllerRec _ []]; controller.viewer _ Containers.Create[ info: [ name: graph.fileName.Concat[" Controller"], file: graph.fileName, iconic: TRUE, icon: controllerIcon, menu: (controller.menu _ ControllerMenus[]), column: left, scrollable: FALSE], paint: FALSE]; ViewerOps.AddProp[controller.viewer, $GraphController, handle]; MakeSpec[handle, 0, 0]; <> MakeXYValues[handle, 1000, 0]; ViewerOps.OpenIcon[icon: controller.viewer]; MakeTable[handle, tableFile, 1000, 0]; controller.specVisible _ TRUE; <> <> }; -- NewController IsController: PUBLIC PROC [viewer: Viewer] RETURNS [BOOL] = { IF viewer = NIL THEN RETURN[FALSE]; RETURN[ViewerOps.FetchProp[viewer, $GraphController] # NIL]; }; -- IsController <> <> <> ControllerBeforeDestroy: ViewerEvents.EventProc = { handle: GraphHandle _ GraphUtil.HandleFromViewer[viewer]; IF handle # NIL THEN IF event = destroy AND IsController[viewer] AND before THEN { Lock[handle]; IF handle.controller # NIL THEN handle.controller^ _ []; handle.controller _ NIL; Unlock[handle]; }; }; -- ControllerBeforeDestroy ControllerAfterDestroy: ViewerEvents.EventProc = { handle: GraphHandle _ GraphUtil.HandleFromViewer[viewer]; IF handle # NIL THEN IF event=destroy AND IsController[viewer] AND NOT before THEN { Lock[handle]; IF handle.chart.viewer = NIL THEN handle _ GraphCleanUp.CleanUpHandle[handle, TRUE] ELSE Unlock[handle]; }; }; -- ControllerAfterDestroy <> <> <> <> <<}; -- TableOpen>> <<>> Init: PROC [] = { [] _ ViewerEvents.RegisterEventProc[ proc: ControllerBeforeDestroy, event: destroy, before: TRUE]; [] _ ViewerEvents.RegisterEventProc[ proc: ControllerAfterDestroy, event: destroy, before: FALSE]; <<[] _ ViewerEvents.RegisterEventProc[>> <> }; Init[]; }. CHANGE LOG. SChen, created at October 9, 1985 6:09:36 pm PDT.