(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) (* Last modified On Mon Dec 21 18:36:10 PST 1992 by meehan *) (* modified On Tue Jun 16 13:12:47 PDT 1992 by muller *) (* modified On Tue May 15 17:01:26 PDT 1990 by mcjones *) (* modified On Fri Dec 4 02:41:30 1987 by jdd *) <* PRAGMA LL *> MODULE VT; IMPORT VTInterval, VTMarker, VTView, VTVirtual, VTCaret, VTTexture, Rd, Thread, MText, VTDef; FROM VTDef IMPORT Interval, Marker, T, View; PROCEDURE New (mtext: MText.T): T RAISES {VTDef.Error} = VAR vt: T; BEGIN IF mtext = NIL THEN RAISE VTDef.Error (VTDef.ErrorCode.IsNil) END; vt := NEW (T); vt.mutex := NEW (MUTEX); vt.closed := FALSE; vt.mtext := mtext; vt.length := MText.Length (mtext); vt.intervals := NIL; VTCaret.Init (vt); vt.rdDirty := TRUE; vt.views := NIL; VTTexture.Init (); RETURN vt END New; PROCEDURE Replace (vt: T; begin, end: CARDINAL; text: TEXT) RAISES {Rd.EndOfFile, Rd.Failure, Thread.Alerted} = VAR oldLength: CARDINAL; BEGIN oldLength := vt.length; MText.Replace (vt.mtext, begin, end, text); Invalidate (vt, begin, end, MText.Length (vt.mtext) - (oldLength - (end - begin))) END Replace; PROCEDURE ReplaceChars ( vt : T; begin, end: CARDINAL; READONLY str : ARRAY OF CHAR) RAISES {Rd.EndOfFile, Rd.Failure, Thread.Alerted} = VAR oldLength: CARDINAL; BEGIN oldLength := vt.length; MText.ReplaceChars (vt.mtext, begin, end, str); Invalidate ( vt, begin, end, MText.Length (vt.mtext) - (oldLength - (end - begin))) END ReplaceChars; PROCEDURE ReplaceFile (vt : T; begin, end: CARDINAL; file : Rd.T; start : CARDINAL := 0; numChars : CARDINAL := LAST (CARDINAL)) RAISES {Rd.EndOfFile, Rd.Failure, Thread.Alerted} = VAR oldLength: CARDINAL; BEGIN oldLength := vt.length; MText.ReplaceFile (vt.mtext, begin, end, file, start, numChars); Invalidate (vt, begin, end, MText.Length (vt.mtext) - (oldLength - (end - begin))) END ReplaceFile; PROCEDURE Close (vt: T) = <* LL = vt.mutex *> VAR v0, v1: View; i0, i1: Interval; m0, m1: Marker; BEGIN vt.closed := TRUE; VTCaret.Close (vt); v0 := vt.views; WHILE v0 # NIL DO v1 := v0.next; VTView.Close (v0); v0 := v1 END; i0 := vt.intervals; WHILE i0 # NIL DO i1 := i0.next; VTInterval.Close (i0); i0 := i1 END; m0 := vt.markers; WHILE m0 # NIL DO m1 := m0.next; VTMarker.Close (m0); m0 := m1 END; vt.mtext := NIL; <* ASSERT (vt.intervals = NIL) *> <* ASSERT (vt.markers = NIL) *> vt.caret.blinker := NIL; (* vt.rd.instance := NIL; vt.rrd.instance := NIL; *) <* ASSERT (vt.views = NIL) *> END Close; PROCEDURE Invalidate (vt: T; b, e, l: CARDINAL) RAISES {Rd.EndOfFile, Rd.Failure, Thread.Alerted} = VAR interval: Interval; marker : Marker; BEGIN vt.rdDirty := TRUE; VTVirtual.Change (vt, b, e, b + l); (* update caret *) IF e <= vt.caret.index THEN vt.caret.index := vt.caret.index + (l - (e - b)) ELSIF b <= vt.caret.index THEN vt.caret.index := b + l END; (* update intervals *) interval := vt.intervals; WHILE interval # NIL DO IF e <= interval.l THEN interval.l := interval.l + (l - (e - b)) ELSIF b <= interval.l THEN interval.l := b + l END; IF e <= interval.r THEN interval.r := interval.r + (l - (e - b)) ELSIF b <= interval.r THEN interval.r := b + l END; interval := interval.next END; (* update markers *) marker := vt.markers; WHILE marker # NIL DO IF e <= marker.index THEN marker.index := marker.index + (l - (e - b)) ELSIF b <= marker.index THEN marker.index := b + l END; marker := marker.next END END Invalidate; BEGIN END VT.