<> <> <> <> DIRECTORY TEditDisplay USING [EstablishLine], TEditDocument USING [LineTable, Selection, SelectionRec, SpinAndLock, TEditDocumentData, Unlock], TEditOps USING [CopyLoadHistory, CopyPositionHistory], TEditSplit USING [], TextNode USING [Location], ViewerClasses USING [Viewer], ViewerLocks USING [CallUnderWriteLocks], ViewerForkers USING [ForkPaint], ViewerOps USING [AddProp, ComputeColumn, CreateViewer, DestroyViewer, FetchProp, MoveBelowViewer, OpenIcon, SetMenu]; TEditSplitImpl: CEDAR PROGRAM IMPORTS TEditDisplay, TEditDocument, TEditOps, ViewerForkers, ViewerLocks, ViewerOps EXPORTS TEditSplit SHARES ViewerClasses = BEGIN Viewer: TYPE = ViewerClasses.Viewer; Split: PUBLIC PROC [old: Viewer] = { tddNew, tddOld: TEditDocument.TEditDocumentData; new: Viewer; paintCaption: BOOL _ FALSE; selectionHistory: TEditDocument.Selection; lines: TEditDocument.LineTable; loc: TextNode.Location; tddOld _ NARROW[old.data]; IF tddOld = NIL THEN RETURN; new _ ViewerOps.CreateViewer[flavor: old.class.flavor, info: [name: old.name, column: old.column, iconic: TRUE], paint: FALSE]; ViewerOps.OpenIcon[icon: new, paint: FALSE]; ViewerOps.MoveBelowViewer[altered: new, static: old, paint: FALSE]; tddNew _ NARROW[new.data]; IF tddNew = NIL THEN RETURN; -- How this could happen is beyond me, but paranoia is cheap. [McGregor] selectionHistory _ NARROW[ViewerOps.FetchProp[old, $SelectionHistory]]; new.link _ old; IF old.link=NIL THEN { old.link _ new; paintCaption _ TRUE } ELSE FOR v: Viewer _ old.link, v.link UNTIL v.link=old DO REPEAT FINISHED => v.link _ new; ENDLOOP; new.newVersion _ old.newVersion; new.newFile _ old.newFile; new.file _ old.file; ViewerOps.ComputeColumn[column: new.column, paint: FALSE]; -- to find new height { inner: PROC = { [] _ TEditDocument.SpinAndLock[tddOld, "Split"]; -- must ComputeColumn before lock tdd tddNew.text _ tddOld.text; tddNew.tsInfo _ tddOld.tsInfo; tddNew.clipLevel _ tddOld.clipLevel; tddNew.commentFilter _ tddOld.commentFilter; ViewerOps.SetMenu[new, old.menu, FALSE]; IF selectionHistory # NIL THEN { -- copy it newSelectionHistory: TEditDocument.Selection _ NEW[TEditDocument.SelectionRec]; newSelectionHistory^ _ selectionHistory^; ViewerOps.AddProp[new, $SelectionHistory, newSelectionHistory]; }; TEditOps.CopyPositionHistory[from: old, to: new]; TEditOps.CopyLoadHistory[from: old, to: new]; lines _ tddOld.lineTable; loc _ lines[lines.lastLine].pos; -- in case loop doesn't find anything FOR n: INTEGER IN [0..lines.lastLine] DO -- find line that goes past new bottom IF lines[n].yOffset+lines[n].descent >= old.ch THEN { loc _ lines[n].pos; EXIT }; ENDLOOP; TEditDocument.Unlock[tddOld]; }; ViewerLocks.CallUnderWriteLocks[inner, old, new]; <> }; TEditDisplay.EstablishLine[tddNew, loc]; ViewerOps.ComputeColumn[column: new.column, paint: TRUE]; -- now do the painting FOR v: Viewer _ new.link, v.link WHILE v # NIL DO IF v = new THEN EXIT; IF v.iconic THEN { -- get rid of it -- ViewerOps.DestroyViewer[v]; EXIT }; IF paintCaption THEN <> ViewerForkers.ForkPaint[viewer: v, hint: caption, tryShortCuts: TRUE]; ENDLOOP; }; END.