-- TEditSplitImpl.mesa, Edited by Paxton on October 19, 1982 10:09 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, 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;
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
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 };
ENDLOOP;
END;
END.