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; 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 Init: PROC [] = { [] _ ViewerEvents.RegisterEventProc[ proc: ControllerBeforeDestroy, event: destroy, before: TRUE]; [] _ ViewerEvents.RegisterEventProc[ proc: ControllerAfterDestroy, event: destroy, before: FALSE]; }; Init[]; }. CHANGE LOG. SChen, created at October 9, 1985 6:09:36 pm PDT. 8File: GraphController.mesa, Copyright c 1985 by Xerox Corporation. All rights reserved. Last Edited by: Sweetsun Chen, November 27, 1985 3:42:46 pm PST TiogaMenuOps USING [Normalize], TiogaOps USING [Jump, ViewerDoc], (constant) variables public procedures Show up controller. Create it if it doesn't exist. MakeRule[handle]; ViewerOps.SetOpenHeight[controller.viewer, 1000]; ViewerOps.PaintViewer[controller.viewer, all]; to be added: GraphSearch.mesa Next: ActionProc = {}; -- Next Find: ActionProc = {}; -- Find TableOpen: ViewerEvents.EventProc = { handle: GraphHandle _ NARROW[ViewerOps.FetchProp[viewer, $GraphTable]]; IF handle # NIL THEN IF event = open AND NOT before THEN handle.waitingController _ FALSE; }; -- TableOpen [] _ ViewerEvents.RegisterEventProc[ proc: TableOpen, event: open, before: FALSE]; Ê’˜Jšœ&Ïmœ1™Xšœ™Jšœ/™/J™—šÏk ˜ Jšœ žœ ˜Jšœžœ˜*Jšžœžœ˜Jšœžœ)žœ ˜BJšœ žœ˜#Jšœ žœ˜Jšœ žœ6˜HJšœ žœ2˜AJšœžœ˜Jšœ žœ ™Jšœ žœ™!Jšœ žœ ˜2Jšœ žœ+˜:—J˜šœžœž˜JšžœžœP˜mJšžœ˜—J˜Jšžœ˜#J˜Jšœ™JšœK˜KJ˜šœ™J˜—šÏnœžœžœžœ˜AJ™2šžœ žœžœ˜5šžœžœžœ˜Jšœžœ˜šœžœ"˜4Jšžœ$žœ˜1—Jš žœžœžœžœžœ˜hJšœD˜DJ˜—šžœ˜šžœž˜ Jšœ4žœ˜:—Jšžœ(˜,J˜—J˜—JšœÏc˜J˜šŸ œžœ"žœžœ˜KJšœ žœ˜%šœ&˜&šœ˜Jšœ+˜+Jšœ˜Jšœžœ˜ Jšœ˜Jšœ,˜,Jšœ ˜ Jšœ žœ˜Jšœžœ˜—J˜—Jšœ?˜?Jšœ˜J™Jšœ˜Jšœ,˜,Jšœ&˜&Jšœžœ˜Jšœ1™1Jšœ.™.Jšœ ˜——J˜š Ÿ œžœžœžœžœ˜=Jš žœ žœžœžœžœ˜#Jšžœ1žœ˜