<> <> <> <> <> DIRECTORY TEditTouchup, Process USING [Ticks, MsecToTicks, SetTimeout], Rope USING [ROPE], TEditDocument USING [SpinAndLock, TEditDocumentData, Unlock]; TEditTouchupImpl: CEDAR MONITOR IMPORTS TEditDocument, Process EXPORTS 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; aLittleWhile: Process.Ticks = Process.MsecToTicks[50]; maxCount: NAT _ 0; TRUSTED { Process.SetTimeout[@refreshOver, aLittleWhile]; }; END.