<<-- TEditSplitImpl.mesa, Edited by Paxton on June 2, 1983 9:00 am>> <<-- Edited by McGregor on August 27, 1982 2:38 pm>> DIRECTORY TEditDisplay USING [EstablishLine], TEditDocument USING [LineTable, Selection, SelectionRec, SpinAndLock, TEditDocumentData, Unlock], TEditOps USING [CopyLoadHistory, CopyPositionHistory], TEditSplit, TextNode USING [Location, pZone], ViewerClasses USING [Viewer], ViewerOps USING [AddProp, ComputeColumn, CreateViewer, DestroyViewer, FetchProp, MoveBelowViewer, OpenIcon, PaintViewer, SetMenu]; TEditSplitImpl: CEDAR PROGRAM IMPORTS TEditDisplay, TEditDocument, TEditOps, TextNode, ViewerOps EXPORTS TEditSplit SHARES ViewerClasses = BEGIN OPEN ViewerClasses; Split: PUBLIC PROC [old: Viewer] = BEGIN 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. 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 [] _ 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 _ TextNode.pZone.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]; TEditDisplay.EstablishLine[tddNew, loc]; ViewerOps.ComputeColumn[column: new.column, paint: TRUE]; -- now do the painting FOR v: Viewer _ new.link, v.link UNTIL v=new DO IF v.iconic THEN { -- get rid of it -- ViewerOps.DestroyViewer[v]; EXIT }; IF paintCaption THEN ViewerOps.PaintViewer[v, caption]; -- turn on [Split] ENDLOOP; END; END.