Copyright (C) 1994, Digital Equipment Corp.
<*PRAGMA LL*>
MODULE Split;
IMPORT VBT, VBTClass, Point, Rect;
PROCEDURE Delete(v: T; ch: VBT.T) RAISES {NotAChild} =
BEGIN
Replace(v, ch, NIL)
END Delete;
PROCEDURE Replace(v: T; ch, new: VBT.T) RAISES {NotAChild} =
BEGIN
IF ch = NIL OR ch.parent # v THEN RAISE NotAChild END;
IF new # NIL AND new.parent # NIL THEN Crash() END;
IF new # NIL AND new.st # v.st THEN VBTClass.Rescreen(new, v.st) END;
v.replace(ch, new);
VBT.Mark(v)
END Replace;
PROCEDURE Insert(v: T; pred, new: VBT.T) RAISES {NotAChild} =
BEGIN
IF pred # NIL AND pred.parent # v THEN RAISE NotAChild END;
IF new = NIL OR new.parent # NIL THEN Crash() END;
IF new.st # v.st THEN VBTClass.Rescreen(new, v.st) END;
v.insert(pred, new);
VBT.NewShape(v);
VBT.Mark(v)
END Insert;
PROCEDURE Move(v: T; pred, ch: VBT.T) RAISES {NotAChild} =
BEGIN
IF ch = NIL OR ch.parent # v THEN RAISE NotAChild END;
IF pred # NIL AND pred.parent # v THEN RAISE NotAChild END;
IF pred = ch OR v.succ(pred) = ch THEN RETURN END;
v.move(pred, ch);
VBT.Mark(v)
END Move;
PROCEDURE AddChildArray(v: T; READONLY new: ARRAY OF VBT.T) =
<*FATAL NotAChild*>
VAR pred := Pred(v, NIL); BEGIN
FOR i := 0 TO LAST(new) DO
IF new[i] # NIL THEN
Insert(v, pred, new[i]);
pred := new[i]
END
END
END AddChildArray;
PROCEDURE AddChild(v: T;
new0, new1, new2, new3, new4, new5, new6, new7, new8, new9: VBT.T := NIL) =
BEGIN
AddChildArray(v, ARRAY OF VBT.T{new0, new1, new2, new3, new4,
new5, new6, new7, new8, new9})
END AddChild;
PROCEDURE Succ(v: T; ch: VBT.T): VBT.T RAISES {NotAChild} =
BEGIN
IF ch # NIL AND ch.parent # v THEN RAISE NotAChild END;
RETURN v.succ(ch)
END Succ;
PROCEDURE Pred(v: T; ch: VBT.T): VBT.T RAISES {NotAChild} =
BEGIN
IF ch # NIL AND ch.parent # v THEN RAISE NotAChild END;
RETURN v.pred(ch)
END Pred;
PROCEDURE Nth(v: T; n: CARDINAL): VBT.T RAISES {} =
BEGIN
RETURN v.nth(n)
END Nth;
PROCEDURE NumChildren(v: T): CARDINAL RAISES {} =
BEGIN
RETURN v.index(NIL)
END NumChildren;
PROCEDURE Index(v: T; ch: VBT.T): CARDINAL RAISES {NotAChild} =
BEGIN
IF ch # NIL AND ch.parent # v THEN RAISE NotAChild END;
RETURN v.index(ch)
END Index;
PROCEDURE Locate(v: T; READONLY pt: Point.T): VBT.T RAISES {} =
VAR r: Rect.T;
BEGIN
RETURN v.locate(pt, r)
END Locate;
EXCEPTION FatalError;
PROCEDURE Crash() =
<*FATAL FatalError*>
BEGIN
RAISE FatalError
END Crash;
BEGIN END Split.