<> <> <> <> <> <> 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.