DIRECTORY Containers USING [Create], Icons USING [IconFlavor, NewIconFromFile], Graph USING [Viewer], GraphCleanUp USING [CleanUpHandle], GraphPrivate USING [ControllerRec, GraphHandle, ControllerMenus, GraphProc, Lock, MakePanel, MakeTable, Unlock], GraphUtil USING [HandleFromViewer, HandleNotNil], Rope USING [Concat], ViewerEvents USING [EventProc, RegisterEventProc], ViewerOps USING [AddProp, FetchProp, OpenIcon, TopViewer]; GraphController: CEDAR PROGRAM IMPORTS Containers, Icons, GraphCleanUp, GraphPrivate, GraphUtil, Rope, ViewerEvents, ViewerOps EXPORTS GraphPrivate = { OPEN Graph, GraphPrivate; controllerIcon: Icons.IconFlavor _ Icons.NewIconFromFile["Graph.icons", 1]; ShowController: PUBLIC GraphProc = { IF GraphUtil.HandleNotNil[handle] THEN { OPEN handle; IF controller = NIL THEN NewController[handle] ELSE { IF controller.viewer.iconic THEN ViewerOps.OpenIcon[icon: controller.viewer, bottom: FALSE] ELSE ViewerOps.TopViewer[controller.viewer]; }; }; }; -- ShowController NewController: GraphProc = { OPEN handle; controller _ NEW[ControllerRec _ []]; controller.viewer _ Containers.Create[ info: [ name: graph.fileName.Concat[" Controller"], iconic: TRUE, icon: controllerIcon, menu: (controller.menu _ ControllerMenus[]), column: left, scrollable: FALSE], paint: FALSE]; ViewerOps.AddProp[controller.viewer, $GraphController, handle]; MakeTable[handle, MakePanel[handle]]; controller.panelVisible _ TRUE; ViewerOps.OpenIcon[icon: controller.viewer]; }; -- 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. &File: GraphController.mesa, Copyright c 1985 by Xerox Corporation. All rights reserved. Last Edited by: Sweetsun Chen, October 21, 1985 9:00:48 pm PDT TiogaMenuOps USING [Normalize], TiogaOps USING [Jump, ViewerDoc], (constant) variables public procedures Show up controller. Create it if it doesn't exist. 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šœ žœ˜#Jšœ žœ^˜pJšœ žœ"˜1Jšœžœ ˜Jšœ žœ ™Jšœ žœ™!Jšœ žœ ˜2Jšœ žœ+˜:—J˜šœžœž˜JšžœX˜_Jšžœ˜—J˜Jšžœ˜J˜Jšœ™JšœK˜KJ˜šœ™J˜—šĎnœžœ˜$J™2šžœ žœžœ˜5Jšžœžœžœ˜.šžœ˜šžœž˜ Jšœ4žœ˜:—Jšžœ(˜,J˜—J˜—JšœĎc˜J˜šŸ œžœ˜)Jšœ žœ˜%šœ&˜&šœ˜Jšœ+˜+Jšœžœ˜ Jšœ˜Jšœ,˜,Jšœ ˜ Jšœ žœ˜Jšœžœ˜—J˜—Jšœ?˜?Jšœ%˜%Jšœžœ˜Jšœ1™1Jšœ.™.Jšœ,˜,Jšœ ˜——J˜š Ÿ œžœžœžœžœ˜=Jš žœ žœžœžœžœ˜#Jšžœ1žœ˜