DIRECTORY Graph USING [CaretIndex, Entity, EntityGroup, EntityList, LastEntityColor, NestedEntities, NestedEntitiesList, SegmentDataList, Texts, ValueList, XY], GraphCleanUp, GraphPrivate USING [defaultColorsArray, defaultFontsArray, EntityGroupList, EntityHashSize, GraphHandle]; GraphCleanUpImpl: CEDAR PROGRAM IMPORTS GraphPrivate EXPORTS GraphCleanUp = { OPEN Graph, GraphPrivate; CleanUpHandle: PUBLIC PROC [handle: GraphHandle _ NIL, full: BOOL _ FALSE] RETURNS [GraphHandle] = { RETURN[IF handle = NIL THEN NIL ELSE IF full THEN DestroyHandle[handle] ELSE RemoveFat[handle] ] }; -- CleanUpHandle RemoveFat: PROC [handle: GraphHandle _ NIL] RETURNS [GraphHandle] = { IF handle # NIL THEN { OPEN handle; allTexts _ CleanUpTexts[allTexts, TRUE]; entityGroupList _ CleanUpEGL[entityGroupList, TRUE]; FOR i: INT IN [0..EntityHashSize) DO entityHash[i] _ CleanUpEL[entityHash[i], FALSE]; ENDLOOP; FOR i: CaretIndex IN CaretIndex DO chart.caretState[i]^ _ []; ENDLOOP; chart^ _ [caretState: chart.caretState]; IF controller # NIL THEN controller^ _ []; graph.entityList _ CleanUpEL[graph.entityList, FALSE]; FOR i: CaretIndex IN CaretIndex DO graph.caret[i]^ _ []; ENDLOOP; FOR i: XY IN XY DO graph.target[i]^ _ []; ENDLOOP; graph.color^ _ defaultColorsArray; graph.font^ _ defaultFontsArray; graph^ _ [caret: graph.caret, target: graph.target, color: graph.color, font: graph.font]; lastEntityColor _ LastEntityColor; zoomPt1 _ []; zoomPt2 _ []; }; RETURN[handle]; }; -- RemoveFat DestroyHandle: PROC [handle: GraphHandle _ NIL] RETURNS [GraphHandle] = { IF handle # NIL THEN { OPEN handle; allTexts _ CleanUpTexts[allTexts, TRUE]; entityGroupList _ CleanUpEGL[entityGroupList, TRUE]; FOR i: INT IN [0..EntityHashSize) DO entityHash[i] _ CleanUpEL[entityHash[i], FALSE]; ENDLOOP; entityHash _ NIL; FOR i: CaretIndex IN CaretIndex DO chart.caretState[i]^ _ []; ENDLOOP; chart^ _ []; chart _ NIL; IF controller # NIL THEN { controller^ _ []; controller _ NIL; }; FOR i: CaretIndex IN CaretIndex DO graph.caret[i]^ _ []; ENDLOOP; FOR i: XY IN XY DO graph.target[i]^ _ []; ENDLOOP; graph.font^ _ ALL[]; graph^ _ []; graph _ NIL; imagerFonts _ ALL[NIL]; paintInfo _ NIL; handle _ NIL; }; RETURN[handle]; }; -- DestroyHandle CleanUpVL: PUBLIC PROC [vl: ValueList] RETURNS [ValueList] = { WHILE vl # NIL DO next: ValueList _ vl.rest; vl.rest _ NIL; vl _ next; ENDLOOP; RETURN[vl]; }; -- CleanUpVL CleanUpSDL: PUBLIC PROC [sdl: SegmentDataList] RETURNS [SegmentDataList] = { WHILE sdl # NIL DO next: SegmentDataList _ sdl.rest; sdl.first _ NIL; sdl.rest _ NIL; sdl _ next; ENDLOOP; RETURN[sdl]; }; -- CleanUpSDL CleanUpEGL: PROC [egl: EntityGroupList, everything: BOOL _ FALSE] RETURNS [EntityGroupList] = { WHILE egl # NIL DO next: EntityGroupList _ egl.rest; egl.first _ CleanUpEG[egl.first, everything]; egl.rest _ NIL; egl _ next; ENDLOOP; RETURN[egl]; }; -- CleanUpEGL CleanUpEG: PROC [eg: EntityGroup, everything: BOOL _ FALSE] RETURNS [EntityGroup] = { IF everything THEN { eg.x _ CleanUpEntity[eg.x]; eg.ys _ CleanUpNEL[eg.ys, TRUE]; } ELSE eg^ _ []; eg _ NIL; RETURN[eg]; }; -- CleanUpEG CleanUpNEL: PROC [nel: NestedEntitiesList, everything: BOOL _ FALSE] RETURNS [NestedEntitiesList] = { WHILE nel # NIL DO next: NestedEntitiesList _ nel.rest; IF everything THEN nel.first _ CleanUpNE[nel.first, TRUE] ELSE nel.first _ NIL; nel.rest _ NIL; nel _ next; ENDLOOP; RETURN[nel]; }; -- CleanUpEGL CleanUpNE: PROC [ne: NestedEntities, everything: BOOL _ FALSE] RETURNS [NestedEntities] = { IF everything THEN { [] _ CleanUpEL[ne.entityList, TRUE]; [] _ CleanUpNEL[ne.children, TRUE]; }; ne^ _ []; ne _ NIL; RETURN[ne]; }; -- CleanUpNE CleanUpEL: PUBLIC PROC [el: EntityList, everything: BOOL _ FALSE] RETURNS [EntityList] = { WHILE el # NIL DO next: EntityList _ el.rest; IF everything THEN el.first _ CleanUpEntity[el.first] ELSE el.first _ NIL; el.rest _ NIL; el _ next; ENDLOOP; RETURN[el]; }; -- CleanUpEL CleanUpEntity: PROC [entity: Entity] RETURNS [Entity] = { IF entity # NIL THEN { entity.segments _ CleanUpSDL[entity.segments]; entity^ _ []; entity _ NIL; }; RETURN[entity]; }; -- CleanUpEntity CleanUpTexts: PUBLIC PROC [texts: Texts, everything: BOOL _ FALSE] RETURNS [Texts] = { WHILE texts # NIL DO next: Texts _ texts.rest; IF everything THEN texts.first^ _ []; texts.first _ NIL; texts.rest _ NIL; texts _ next; ENDLOOP; RETURN[texts]; }; -- CleanUpTexts }. LOG. Previous version erased 10/16/85 by a vandal. SChen, October 16, 1985 1:35:55 pm PDT, recreated. GraphCleanUpImpl.mesa, copyright c 1985 by Xerox Corporation. All rights reserved. Last Edited by: Sweetsun Chen, October 16, 1985 3:59:36 pm PDT in short, full: both data and structure destroyed. not full: the structure remains, but data destroyed, so that the handle is like a "vanilla" handle that may still be used. chart controller graph chart controller graph In the following routines, if everything = false, destroy the first level data and structure only; otherwise all levels of data attached to it are destroyed. Κv˜Jšœ!Οmœ1™S™Icode™.—K™šΟk ˜ Jšœžœ‡žœ˜–J˜ Jšœ žœW˜iJ˜—šœžœž˜Kšžœ ˜Kšžœžœ˜2—K˜šΟn œžœžœžœžœžœžœ˜d™ K™(K™z—š žœžœ žœžœž˜Kšžœžœžœ˜'Kšžœ˜Kšœ˜—KšœΟc˜K˜šŸ œžœžœžœ˜Ešžœ žœžœžœ˜#Kšœ"žœ˜(Kšœ.žœ˜4šžœžœžœž˜$Kšœ)žœ˜0Kšžœ˜—K˜K™Kšžœžœ žœžœ˜FKšœ(˜(K™Kšœ ™ Kšžœžœžœ˜*K™K™Kšœ/žœ˜6Kšžœžœ žœžœ˜AKš žœžœžœžœžœžœ˜2Kšœ"˜"Kšœ ˜ KšœZ˜ZK˜Kšœ"˜"Kšœ ˜ Kšœ ˜ K˜—Kšžœ ˜Kšœ  ˜K˜—šŸ œžœžœžœ˜Išžœ žœžœžœ˜#Kšœ"žœ˜(Kšœ.žœ˜4šžœžœžœž˜$Kšœ)žœ˜0Kšžœ˜—Kšœ žœ˜K˜K™Kšžœžœ žœžœ˜FKšœ ˜ Kšœžœ˜ K™Kšœ ™ šžœžœžœ˜Kšœ˜Kšœ žœ˜K˜—K™K™Kšžœžœ žœžœ˜AKš žœžœžœžœžœžœ˜2Kšœžœ˜Kšœ ˜ Kšœžœ˜ K˜Kšœžœžœ˜Kšœ žœ˜Kšœ žœ˜ K˜—Kšžœ ˜Kšœ ˜—K˜—šŸ œžœžœžœ˜>šžœžœž˜Kšœ˜Kšœ žœ˜Kšœ ˜ Kšžœ˜—Kšžœ˜ Kšœ  ˜K˜—šŸ œžœžœžœ˜Lšžœžœž˜Kšœ!˜!Kšœ žœ˜Kšœ žœ˜Kšœ ˜ Kšžœ˜—Kšžœ˜ Kšœ  ˜K˜—Kšœ™š Ÿ œžœ$žœžœžœ˜_šžœžœž˜Kšœ!˜!Kšœ-˜-Kšœ žœ˜Kšœ ˜ Kšžœ˜—Kšžœ˜ Kšœ  ˜K˜š Ÿ œžœžœžœžœ˜Ušžœ žœ˜K˜Kšœžœ˜ K˜—Kšžœ ˜Kšœžœ˜ Kšžœ˜ Kšœ  ˜K˜—š Ÿ œžœ'žœžœžœ˜ešžœžœž˜Kšœ$˜$Kšžœ žœ"žœ˜9Kšžœ žœ˜Kšœ žœ˜Kšœ ˜ Kšžœ˜—Kšžœ˜ Kšœ  ˜K˜—š Ÿ œžœ"žœžœžœ˜[šžœ žœ˜Kšœžœ˜$Kšœžœ˜#K˜—K˜ Kšœžœ˜ Kšžœ˜ Kšœ  ˜K˜——š Ÿ œžœžœžœžœžœ˜Zšžœžœž˜Kšœ˜Kšžœ žœ#˜5Kšžœ žœ˜Kšœ žœ˜Kšœ ˜ Kšžœ˜—Kšžœ˜ Kšœ  ˜K˜—šŸ œžœžœ ˜9šžœ žœžœ˜Kšœ.˜.K˜ Kšœ žœ˜ K˜—Kšžœ ˜Kšœ ˜—K˜š Ÿ œžœžœžœžœžœ ˜Všžœ žœž˜Kšœ˜Kšžœ žœ˜%Kšœžœ˜Kšœ žœ˜Kšœ ˜ Kšžœ˜—Kšžœ˜Kšœ ˜—K˜K˜šžœ˜K˜-Kšœ#žœ ˜2—K˜—…—Ž