DIRECTORY Carets USING [StartCaret], Graphics USING [Context], TEditDocument USING [Selection, SelectionId], TEditSelection USING [Copy, Create, ExtendSelection, FixupSelection, FixupCaret, MarkSelection, pSel, sSel, fSel], ViewerClasses USING [Viewer]; TEditSelection2Impl: CEDAR MONITOR IMPORTS Carets, TEditSelection EXPORTS TEditSelection = BEGIN OPEN TEditDocument, TEditSelection; SelState: TYPE = {up, down}; pSelState, sSelState, fSelState: SelState _ down; pSelUp: Selection _ Create[]; -- copy of pSel from when put it up sSelUp: Selection _ Create[]; -- copy of sSel from when put it up fSelUp: Selection _ Create[]; -- copy of fSel from when put it up caretVisible: BOOL _ FALSE; CaretVisible: PUBLIC ENTRY PROC RETURNS [BOOL] = BEGIN ENABLE UNWIND => NULL; RETURN [caretVisible]; END; IsDown: PUBLIC ENTRY PROC [id: SelectionId] RETURNS [BOOL] = BEGIN ENABLE UNWIND => NULL; state: SelState = SELECT id FROM primary => pSelState, secondary => sSelState, feedback => fSelState, ENDCASE => ERROR; RETURN [state=down]; END; ForceDown: PUBLIC ENTRY PROC [id: SelectionId] = BEGIN ENABLE UNWIND => NULL; SELECT id FROM primary => pSelState _ down; secondary => sSelState _ down; feedback => fSelState _ down; ENDCASE => ERROR; END; ShowSelection: PUBLIC ENTRY PROC [id: SelectionId, self: ViewerClasses.Viewer, context: Graphics.Context] = BEGIN ENABLE UNWIND => NULL; sel: Selection = SELECT id FROM primary => pSel, secondary => sSel, feedback => fSel, ENDCASE => ERROR; selUp: Selection = SELECT id FROM primary => pSelUp, secondary => sSelUp, feedback => fSelUp, ENDCASE => ERROR; IF sel.viewer # self THEN RETURN; IF sel.start.metricsValid = sel.end.metricsValid THEN TakeSelectionDownI[id, self, context] ELSE IF selUp.viewer=self THEN ExtendSelection[context, self, selUp, sel, id, sel.start.metricsValid] ELSE TakeSelectionDownI[id, self, context]; END; TakeDownForRedisplay: PUBLIC ENTRY PROC [id: SelectionId, self: ViewerClasses.Viewer, context: Graphics.Context] = { ENABLE UNWIND => NULL; sel, selUp: Selection; state: SelState; SELECT id FROM primary => { sel _ pSel; state _ pSelState; selUp _ pSelUp }; secondary => { sel _ sSel; state _ sSelState; selUp _ sSelUp }; feedback => { sel _ fSel; state _ fSelState; selUp _ fSelUp }; ENDCASE => ERROR; IF selUp.viewer # self THEN RETURN; IF state=up THEN TakeSelectionDownI[id, self, context]; sel.start.metricsValid _ sel.end.metricsValid _ FALSE; }; FixUpAfterDisplay: PUBLIC ENTRY PROC [id: SelectionId, self: ViewerClasses.Viewer, context: Graphics.Context, caret: BOOL] = { ENABLE UNWIND => NULL; sel, selUp: Selection; state: SelState; SELECT id FROM primary => { sel _ pSel; state _ pSelState; selUp _ pSelUp }; secondary => { sel _ sSel; state _ sSelState; selUp _ sSelUp }; feedback => { sel _ fSel; state _ fSelState; selUp _ fSelUp }; ENDCASE => ERROR; IF sel.viewer # self THEN RETURN; FixupSelection[sel, self, ~sel.start.metricsValid, ~sel.end.metricsValid]; PutSelectionUpI[id, self, context]; IF caret AND sel.viewer=self THEN BEGIN FixupCaret[sel]; IF id=primary THEN caretVisible _ (sel.caretY # LAST[INTEGER]); -- remember if visible Carets.StartCaret[self, sel.caretX, sel.caretY, IF id=primary THEN primary ELSE secondary]; END; }; AdjustSelStates: PUBLIC ENTRY PROC [self: ViewerClasses.Viewer] = BEGIN ENABLE UNWIND => NULL; IF pSelState=up AND pSelUp.viewer=self THEN pSelState _ down; IF sSelState=up AND sSelUp.viewer=self THEN sSelState _ down; IF fSelState=up AND fSelUp.viewer=self THEN fSelState _ down; END; TakeSelectionDown: PUBLIC ENTRY PROC [id: SelectionId, self: ViewerClasses.Viewer, context: Graphics.Context] = BEGIN ENABLE UNWIND => NULL; TakeSelectionDownI[id, self, context]; END; TakeSelectionDownI: PROC [id: SelectionId, self: ViewerClasses.Viewer, context: Graphics.Context] = BEGIN sel: Selection = SELECT id FROM primary => pSelUp, secondary => sSelUp, feedback => fSelUp, ENDCASE => ERROR; state: SelState = SELECT id FROM primary => pSelState, secondary => sSelState, feedback => fSelState, ENDCASE => ERROR; IF sel.viewer # self OR state=down THEN RETURN; IF sel.granularity#point AND state=up THEN MarkSelection[context, self, sel, id]; SELECT id FROM primary => pSelState _ down; secondary => sSelState _ down; feedback => fSelState _ down; ENDCASE => ERROR; END; PutSelectionUp: PUBLIC ENTRY PROC [id: SelectionId, self: ViewerClasses.Viewer, context: Graphics.Context] = BEGIN ENABLE UNWIND => NULL; PutSelectionUpI[id, self, context]; END; PutSelectionUpI: PROC [id: SelectionId, self: ViewerClasses.Viewer, context: Graphics.Context] = BEGIN sel, selUp: Selection; state: SelState; SELECT id FROM primary => { sel _ pSel; state _ pSelState; selUp _ pSelUp }; secondary => { sel _ sSel; state _ sSelState; selUp _ sSelUp }; feedback => { sel _ fSel; state _ fSelState; selUp _ fSelUp }; ENDCASE => ERROR; IF sel.viewer # self OR state=up THEN RETURN; -- something went wrong Copy[source: sel, dest: selUp]; IF sel.granularity#point AND state=down THEN MarkSelection[context, self, selUp, id]; SELECT id FROM primary => pSelState _ up; secondary => sSelState _ up; feedback => fSelState _ up; ENDCASE => ERROR; END; END. P-- TEditSelection2Impl.mesa Edited by Paxton on December 27, 1982 4:47 pm ÊH˜JšÏcI™IJ˜JšÏk ˜ Jšœžœ˜Jšœ žœ ˜Jšœžœ˜-Jšœžœ^˜rJšœžœ ˜J˜Jšœž ˜"J˜Jšžœ˜Jšžœž˜J˜Jšžœ˜#J˜Jšœ žœ˜Jšœ1˜1J˜Jšœ#˜AJšœ#˜AJšœ#˜AJ˜Jšœžœžœ˜š Ïn œžœžœžœžœžœž˜6Jšžœžœžœ˜Jšžœžœ˜J˜—š Ÿœžœžœžœžœžœž˜BJšžœžœžœ˜šœžœž˜ JšœEžœžœ˜V—Jšžœžœ˜J˜—š Ÿ œžœžœžœž˜6Jšžœžœžœ˜šžœž˜Jšœ˜Jšœ˜Jšœ˜Jšžœžœ˜—Jšžœ˜J˜—šŸ œžœž œ˜!JšœKž˜PJšžœžœžœ˜šœžœž˜Jšœ6žœžœ˜G—šœžœž˜!Jšœ<žœžœ˜M—Jšžœžœžœ˜!šžœ/ž˜5Jšœ%˜%—šžœžœž˜JšœF˜F—Jšžœ'˜+Jšžœ˜J˜—šŸœžœž ˜'JšœL˜LJšžœžœžœ˜Jšœ˜Jšœ˜šžœž˜Jšœ=˜=Jšœ?˜?Jšœ>˜>Jšžœžœ˜—Jšžœžœžœ˜#Jšžœ žœ'˜7Jšœ0žœ˜6J˜J˜—šŸœžœž ˜$JšœPžœ˜YJšžœžœžœ˜Jšœ˜Jšœ˜šžœž˜Jšœ=˜=Jšœ?˜?Jšœ>˜>Jšžœžœ˜—Jšžœžœžœ˜!JšœJ˜JJšœ#˜#šžœžœžœž˜'Jšœ˜Jš žœ žœžœžœ˜VJšœ0žœ žœ žœ ˜[Jšžœ˜—J˜J˜—šŸœžœž œ ž˜GJšžœžœžœ˜Jšžœžœžœ˜=Jšžœžœžœ˜=Jšžœžœžœ˜=Jšžœ˜J˜—šŸœžœž ˜$JšœKž˜PJšžœžœžœ˜Jšœ&˜&Jšžœ˜J˜—šŸœž˜JšœKž˜Pšœžœž˜Jšœ<žœžœ˜M—šœžœž˜ JšœEžœžœ˜V—Jšžœžœ žœžœ˜/Jšžœžœ žœ'˜Qšžœž˜Jšœ˜Jšœ˜Jšœ˜Jšžœžœ˜—Jšžœ˜J˜—šŸœžœž ˜!JšœKž˜PJšžœžœžœ˜Jšœ#˜#Jšžœ˜J˜—šŸœžœLž˜fJšœ˜Jšœ˜šžœž˜Jšœ=˜=Jšœ?˜?Jšœ>˜>Jšžœžœ˜—Jš žœžœ žœžœ˜EJ˜Jšžœžœ žœ)˜Ušžœž˜Jšœ˜Jšœ˜Jšœ˜Jšžœžœ˜—Jšžœ˜—J˜Jšžœ˜J˜—…—0È