DIRECTORY CedarProcess USING [SetPriority], MonitoredQueue USING [Create, MQ, Remove], Process USING [Detach, MsecToTicks, SetTimeout], Rope USING [ROPE], TEditDocument USING [GetViewerForRoot, SelectionId, SpinAndLock, TEditDocumentData, Unlock], TEditRefresh USING [], TEditTouchup USING [], TextNode USING [Ref], ViewerClasses USING [Viewer], ViewerForkers USING [ForkPaint]; TEditTouchupImpl: CEDAR MONITOR IMPORTS CedarProcess, MonitoredQueue, Process, TEditDocument, ViewerForkers EXPORTS TEditRefresh, TEditTouchup = BEGIN fullUpdate: PUBLIC REF ANY ¬ $Update; refresh: PUBLIC REF ANY ¬ $Refresh; RefreshOver: PUBLIC ENTRY PROC = { ENABLE UNWIND => NULL; BROADCAST refreshOver }; LockAfterScroll: PUBLIC PROC [tdd: TEditDocument.TEditDocumentData, who: Rope.ROPE] RETURNS [ok: BOOL] = { RETURN [LockAfter[tdd, who, TRUE]]; }; LockAfterRefresh: PUBLIC PROC [tdd: TEditDocument.TEditDocumentData, who: Rope.ROPE] RETURNS [ok: BOOL] = { RETURN [LockAfter[tdd, who, FALSE]]; }; LockAfter: PROC [tdd: TEditDocument.TEditDocumentData, who: Rope.ROPE, scroll: BOOL] RETURNS [ok: BOOL ¬ TRUE] = { [] ¬ TEditDocument.SpinAndLock[tdd, "LockAfterRefresh"]; SELECT TRUE FROM NOT tdd.dirty => ok ¬ TRUE; alwaysOK => ok ¬ TRUE; NOT scroll OR tdd.scroll=no => ok ¬ FALSE; ENDCASE => ok ¬ TRUE; IF NOT ok THEN TEditDocument.Unlock[tdd]; }; alwaysOK: BOOL ¬ FALSE; UnlockAfterRefresh: PUBLIC PROC [tdd: TEditDocument.TEditDocumentData] = { IF tdd#NIL THEN TEditDocument.Unlock[tdd]; }; refreshOver: CONDITION; -- Init below maxCount: NAT ¬ 0; dirtyDocs: PUBLIC MonitoredQueue.MQ ¬ MonitoredQueue.Create[]; Refresh: PROC = { CedarProcess.SetPriority[normal]; DO WITH MonitoredQueue.Remove[dirtyDocs] SELECT FROM doc: TextNode.Ref => { viewer: ViewerClasses.Viewer ¬ TEditDocument.GetViewerForRoot[doc]; IF viewer # NIL THEN WITH viewer.data SELECT FROM tdd: TEditDocument.TEditDocumentData => FOR v: ViewerClasses.Viewer ¬ viewer, v.link WHILE v # NIL DO IF NOT v.iconic AND NOT v.destroyed THEN ViewerForkers.ForkPaint[v, client, FALSE, refresh, TRUE]; IF v.link = viewer THEN EXIT; ENDLOOP; ENDCASE; }; ENDCASE; ENDLOOP; }; ScrollToEndOfDoc: PUBLIC PROC [viewer: ViewerClasses.Viewer, glitch: BOOL] = { WITH viewer.data SELECT FROM tdd: TEditDocument.TEditDocumentData => { tdd.scroll ¬ endofdoc; tdd.scrollGlitch ¬ glitch; }; ENDCASE; }; ScrollToEndOfSel: PUBLIC PROC [viewer: ViewerClasses.Viewer, glitch: BOOL, id: TEditDocument.SelectionId ¬ primary] = { WITH viewer.data SELECT FROM tdd: TEditDocument.TEditDocumentData => { tdd.scroll ¬ endofsel; tdd.scrollGlitch ¬ glitch; tdd.scrollSelectionId ¬ id; }; ENDCASE; }; TRUSTED { Process.SetTimeout[@refreshOver, Process.MsecToTicks[50]]; Process.Detach[FORK Refresh[]]; }; END. . TEditTouchupImpl.mesa Copyright Σ 1985, 1987, 1991 by Xerox Corporation. All rights reserved. Paxton on May 23, 1983 11:27 am Maxwell, January 6, 1983 11:38 am Russ Atkinson (RRA) June 4, 1985 1:20:12 am PDT Michael Plass, October 15, 1987 5:24:26 pm PDT TEditRefresh implementation Startup Κ•NewlineDelimiter –(cedarcode) style™codešœ™Kšœ Οeœ=™HKšœ™K™!K™/K™.—K˜šΟk ˜ Kšœ žœ˜!Kšœžœ žœ ˜*Kšœžœ#˜0Kšœžœžœ˜KšœžœI˜\Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœžœ ˜Kšœžœ ˜ K˜—KšΠlnœž ˜KšžœD˜KKšžœ˜"šœž˜K˜Kšœ žœžœžœ ˜%Kšœ žœžœžœ ˜#K˜šΟn œžœžœžœžœžœžœž œ˜RK˜—š  œžœžœ2žœžœžœ˜jKšžœžœ˜#Kšœ˜K˜—š  œžœžœ2žœžœžœ˜kKšžœžœ˜$Kšœ˜K˜—š  œžœ2žœ žœžœžœžœ˜rKšœ8˜8šžœžœž˜Kšžœžœ˜Kšœžœ˜Kšžœžœžœ˜*Kšžœ žœ˜—Kšžœžœžœ˜)K˜K˜—Kšœ žœžœ˜K˜š œž œ+˜JKšžœžœžœ˜*Kšœ˜—K˜Kšœ ž œΟc ˜%Kšœ žœ˜—head™šœ žœžœ˜>K˜—š œžœ˜Kšœ!˜!šž˜šžœ"žœž˜1šœ˜KšœC˜Cšžœ žœž˜šžœ žœž˜šœ'˜'šžœ*žœžœž˜=š žœžœ žœžœ ž˜(Kšœ#žœ žœ˜9—Kšžœžœžœ˜Kšžœ˜——Kšžœ˜——K˜—Kšžœ˜—Kšžœ˜—Kšœ˜—K˜š œžœžœ(žœ˜Nšžœ žœž˜šœ)˜)Kšœ˜Kšœ˜K˜—Kšžœ˜—Kšœ˜K˜—š œžœžœ(žœ.˜wšžœ žœž˜šœ)˜)Kšœ˜Kšœ˜Kšœ˜K˜—Kšžœ˜—Kšœ˜K˜——™šžœ˜ Kšœ:˜:Kšœžœ ˜Kšœ˜—K˜—Kšžœ˜—…— ΄o