From 220084cf2ecac0dbd12d6d44c0506aa770f8fabf Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Tue, 2 Dec 2025 00:00:21 -0800 Subject: [PATCH] Implementation of arrow keys --- library/sketch/SKETCH-EDIT | 320 ++++++++++++++++++-------------- library/sketch/SKETCH-EDIT.LCOM | Bin 26222 -> 27205 bytes 2 files changed, 185 insertions(+), 135 deletions(-) diff --git a/library/sketch/SKETCH-EDIT b/library/sketch/SKETCH-EDIT index f2c6716e..f910a3ce 100644 --- a/library/sketch/SKETCH-EDIT +++ b/library/sketch/SKETCH-EDIT @@ -1,20 +1,20 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "30-Nov-2025 08:45:15" {WMEDLEY}sketch>SKETCH-EDIT.;17 110086 +(FILECREATED " 1-Dec-2025 23:22:35" {WMEDLEY}SKETCH>SKETCH-EDIT.;20 113366 :EDIT-BY rmk - :CHANGES-TO (FNS \SKED.INSERT.CHARS.TO.STR SK.GETSYNTAX SK.WORD.BREAK.CLASS - \SKED.DELETE.WORD.FROM.STRING \SKED.INSERT) + :CHANGES-TO (FNS \SKED.INSERT.UNDO \SKED.INSERT.ACTION \SKED.INSERT.CHARS.TO.STR \SKED.INSERT + CHAR.BEGIN \SKED.ARROWKEYS) (VARS SKETCH-EDITCOMS) - :PREVIOUS-DATE "29-Nov-2025 17:19:43" {WMEDLEY}sketch>SKETCH-EDIT.;8) + :PREVIOUS-DATE "30-Nov-2025 08:45:15" {WMEDLEY}SKETCH>SKETCH-EDIT.;17) (PRETTYCOMPRINT SKETCH-EDITCOMS) (RPAQQ SKETCH-EDITCOMS - ((COMS (* selection functions) + ((COMS (* ; "selection functions") (FNS BUTLAST CHAR.BEGIN CLOSEST.CHAR CLOSEST.LINE FLASHW HILITE.LINE HILITE.TEXT IN.TEXT.EXTEND INIMAGEOBJ INTEXT NEW.TEXT.EXTEND NEW.TEXT.SELECTIONP NTHCHARWIDTH NTHLOCALREGION ONCHAR SHOW.EXTENDED.SELECTION.FEEDBACK SHOW.FEEDBACK @@ -28,23 +28,24 @@ SELECTION.HIGHLIGHT.SHADE) (GLOBALVARS IN.TEXT.FEEDBACK.CURSOR NEW.TEXT.FEEDBACK.CURSOR NEW.TEXT.FEEDBACK.SHADE SELECTION.HIGHLIGHT.SHADE)) - (COMS (* editting functions) - (FNS WB.EDITOR SK.TTYENTRYFN SK.TTYEXITFN SKED.INSERT \SKED.INSERT FIRST.N.ELEMENTS - SKED.CREATE.NEW.TEXTBOX SKED.CHARACTERPOSITION SKED.LINE.AND.CHAR# - \SKED.DELETE.WORD.FROM.STRING \SKED.INSERT.CHARS.TO.STR JOINCHARS - STRINGFROMCHARACTERS GETALLCHARS CLEANUP.EDIT SKED.NEW.TEXTELT)) - (COMS (* line adding functions) + (COMS (* ; "editing functions") + (FNS WB.EDITOR SK.TTYENTRYFN SK.TTYEXITFN SKED.INSERT \SKED.INSERT \SKED.ARROWKEYS + \SKED.INSERT.ACTION \SKED.INSERT.UNDO FIRST.N.ELEMENTS SKED.CREATE.NEW.TEXTBOX + SKED.CHARACTERPOSITION SKED.LINE.AND.CHAR# \SKED.DELETE.WORD.FROM.STRING + \SKED.INSERT.CHARS.TO.STR JOINCHARS STRINGFROMCHARACTERS GETALLCHARS CLEANUP.EDIT + SKED.NEW.TEXTELT)) + (COMS (* ; "line adding functions") (FNS MAP.SCREEN.POSITION.ONTO.GRID NEAREST.ON.GRID SK.MIDDLE.TITLEFN WB.BUTTON.HANDLER WB.ADD.NEW.POINT WB.DRAWLINE WB.RUBBERBAND.POSITION SK.RUBBERBAND.FEEDBACKFN RESET.LINE.BEING.INPUT) - [P (* Was MODERNIZE loaded before?) + [P (* ; "Was MODERNIZE loaded before?") (CL:WHEN (GETD 'MODERNWINDOW.SETUP) (MODERNWINDOW.SETUP 'WB.BUTTON.HANDLER))] (FNS NEAREST.EXISTING.POSITION WB.NEARPT LASTMOUSEPOSITION)))) -(* selection functions) +(* ; "selection functions") (DEFINEQ @@ -61,10 +62,13 @@ (BUTLAST (CDR LST]) (CHAR.BEGIN - [LAMBDA (CHAR# LINE# TEXTELT STRM) (* rrb "14-Jan-85 15:40") - - (* determines the x position of the first bit of character CHAR# in LINE# of - TEXTELT.) + [LAMBDA (CHAR# LINE# TEXTELT STRM) (* ; "Edited 1-Dec-2025 00:22 by rmk") + (* rrb "14-Jan-85 15:40") + + (* ;; "determines the x position of the first bit of character CHAR# in LINE# of TEXTELT.") + + (* determines the x position of the first bit of character CHAR# in LINE# of + TEXTELT.) (PROG ((LTEXT (fetch (SCREENELT LOCALPART) of TEXTELT)) TEXT XPOS LFONT LREGION) @@ -74,26 +78,21 @@ of LTEXT) LINE#] (COND - ((EQ CHAR# 0) (* before the first character.) + ((EQ CHAR# 0) (* ; "before the first character.") (RETURN XPOS))) (SETQ LFONT (fetch (LOCALTEXT LOCALFONT) of LTEXT)) (RETURN (IPLUS XPOS (COND ((IMAGESTREAMTYPEP STRM 'HARDCOPY) - - (* hardcopy streams must pass the stream so correction in widths is accounted - for.) - + (* ; + "hardcopy streams must pass the stream so correction in widths is accounted for.") (DSPFONT LFONT STRM) (STRINGWIDTH (SUBSTRING TEXT 1 CHAR#) STRM)) ((FONTP LFONT) - (for I from 1 to CHAR# sum (CHARWIDTH (CHCON1 (NTHCHAR TEXT I)) - LFONT))) - (T - - (* if it is printed in shade, put cursor a percentage of the way across the - area.) - + (STRINGWIDTH (SUBSTRING TEXT 1 CHAR#) + LFONT)) + (T (* ; + "if it is printed in shade, put cursor a percentage of the way across the area.") (IQUOTIENT (ITIMES CHAR# (fetch (REGION WIDTH) of LREGION)) (NCHARS TEXT]) @@ -745,7 +744,7 @@ -(* editting functions) +(* ; "editing functions") (DEFINEQ @@ -808,7 +807,7 @@ (\SKED.INSERT CHARCODES SKW ATSCALE]) (\SKED.INSERT - [LAMBDA (CHARCODES SKW ATSCALE) (* ; "Edited 29-Nov-2025 21:41 by rmk") + [LAMBDA (CHARCODES SKW ATSCALE) (* ; "Edited 1-Dec-2025 13:23 by rmk") (* ; "Edited 12-Nov-2025 14:49 by rmk") (* ; "Edited 10-Nov-2025 15:32 by rmk") (* ; "Edited 20-Feb-87 17:28 by rrb") @@ -822,46 +821,36 @@ SKW ATSCALE) (SKED.INSERT (NTH CHARCODES 201) SKW ATSCALE)) + ((\SKED.INSERT.ACTION CHARCODES SKW)) (T (PROG ((SELECTION (WINDOWPROP SKW 'SELECTION)) (EXTENSION (WINDOWPROP SKW 'EXTENDSELECTION)) TEXTELT ELTTYPE GTEXTELT FIRSTLINE# FIRSTCHAR# LASTLINE# LASTCHAR# STRLST NEWSTRS NEWELT STRPIECE NEWLINE# NEWCHAR# SKCONTEXT PTRCHAR# CONTROLCHARTAIL) - (COND - ((EQ (SK.GETSYNTAX (CAR CHARCODES)) - :UNDO) - - (* ;; "user typed an undo Avoid the overhead of inserting no characters and allow undo to be typed without a selection.") - - (SETQ CONTROLCHARTAIL 'UNDO) - (GO UNDO))) - (COND - ((NULL SELECTION) (* ; + (CL:UNLESS SELECTION (* ;  "add a new text element with these characters.") (STATUSPRINT SKW " " "Indicate the position the typing should go with the left button.") - (RETURN))) + (RETURN)) (SKED.CLEAR.SELECTION SKW NIL T) (SKED.REMOVE.OTHER.SELECTIONS SKW) - [COND - ((AND (MEMB (CAR CHARCODES) - (CHARCODE (EOL LINEFEED))) - (KEYDOWNP 'CTRL)) (* ; + (CL:WHEN (AND (MEMB (CAR CHARCODES) + (CHARCODE (EOL LINEFEED))) + (KEYDOWNP 'CTRL)) (* ;  "user hit control CR. create a new text or textbox.") - (SKED.CREATE.NEW.TEXTBOX [COND - ((NEW.TEXT.SELECTIONP SELECTION) - NIL) - (T (fetch (SCREENELT INDIVIDUALGLOBALPART) - of (fetch (TEXTELTSELECTION SKTEXTELT) - of SELECTION] + (SKED.CREATE.NEW.TEXTBOX (CL:UNLESS (NEW.TEXT.SELECTIONP SELECTION) + (fetch (SCREENELT INDIVIDUALGLOBALPART) + of (fetch (TEXTELTSELECTION SKTEXTELT) + of SELECTION))) SKW (CDR CHARCODES)) (RETURN)) + [COND [(NEW.TEXT.SELECTIONP SELECTION) (* ;  "selection is in open space, create a new text element.") (* ;  "merge the characters into strings of each line.") (SETQ ELTTYPE 'TEXT) - (SETQ CONTROLCHARTAIL (\SKED.INSERT.CHARS.TO.STR CHARCODES NIL SKW)) + (SETQ CONTROLCHARTAIL (\SKED.INSERT.CHARS.TO.STR CHARCODES NIL SKW SELECTION)) (COND ((OR NEWSTRS STRPIECE) (* ;  "if there are any new characters, add a new text element.") @@ -943,15 +932,14 @@ [CHARCODES (SETQ CONTROLCHARTAIL (\SKED.INSERT.CHARS.TO.STR CHARCODES (EQ ELTTYPE 'TEXTBOX) - SKW)) - (SETQ NEWCHAR# (COND - (STRPIECE (NCHARS STRPIECE)) - (T 0))) + SKW SELECTION)) + (SETQ NEWCHAR# (CL:IF STRPIECE + (NCHARS STRPIECE) + 0)) (SETQ NEWLINE# (ADD1 (LENGTH NEWSTRS] (T (SETQ NEWCHAR# FIRSTCHAR#) (SETQ NEWLINE# FIRSTLINE#] - (COND - ((EQ LINE# LASTLINE#) (* ; + (CL:WHEN (EQ LINE# LASTLINE#) (* ;  "on the last, copy the part before and the part after as one") (SETQ NEWSTRS (COND [STRPIECE (NCONC1 @@ -967,16 +955,15 @@ ] [(NEQ LASTCHAR# (NCHARS STR)) (NCONC1 NEWSTRS (SUBSTRING STR (ADD1 LASTCHAR#] - (T NEWSTRS] + (T NEWSTRS))))] (* ;; "any other windows that had this selection have had it deleted already so this doesn't do anything for them.") - [COND - ((IGREATERP NEWLINE# (LENGTH NEWSTRS)) + (CL:WHEN (IGREATERP NEWLINE# (LENGTH NEWSTRS)) (* ;; "this corresponds to deleting every thing in a line. Make sure that if it is the last line that the selection is reset") - (COND + [COND ((EQ (SETQ NEWLINE# (LENGTH NEWSTRS)) 0) (SETQ NEWCHAR# 0) @@ -989,22 +976,22 @@ [(WINDOWPROP SKW 'CHANGEDTEXTELT) (* ;  "make the history event for this edit so that it will restore the original text element") - (PROG ((INITSELECTION (WINDOWPROP SKW 'CHANGEDTEXTELT NIL))) - (COND - ((POSITIONP INITSELECTION) + (LET ((INITSELECTION (WINDOWPROP SKW 'CHANGEDTEXTELT NIL))) + (COND + ((POSITIONP INITSELECTION) (* ;  "this text element was typing that was never officially added, don't record the deletion either.") - (SK.DELETE.ELEMENT (LIST TEXTELT) - SKW - 'DON'T)) - (T (* ; + (SK.DELETE.ELEMENT (LIST TEXTELT) + SKW + 'DON'T)) + (T (* ;  "selection was existing text, record this as a delete event.") - (SK.DELETE.ELEMENT - (LIST TEXTELT) - SKW - (LIST (fetch (SCREENELT GLOBALPART) - of (fetch (TEXTELTSELECTION SKTEXTELT) - of INITSELECTION] + (SK.DELETE.ELEMENT (LIST TEXTELT) + SKW + (LIST (fetch (SCREENELT GLOBALPART) + of (fetch (TEXTELTSELECTION + SKTEXTELT) + of INITSELECTION] (T (SK.DELETE.ELEMENT (LIST TEXTELT) SKW))) (SKED.SET.SELECTION (SK.SCALE.POSITION.INTO.VIEWER @@ -1016,7 +1003,7 @@ (RETURN NIL)) ((EQ ELTTYPE 'TEXTBOX) (* ; "deleted everything in a textbox") NIL))) - (T (SETQ NEWCHAR# (NCHARS (CAR (LAST NEWSTRS] + (T (SETQ NEWCHAR# (NCHARS (CAR (LAST NEWSTRS]) (SETQ PTRCHAR# (SKED.CHARACTERPOSITION NEWSTRS NEWLINE# NEWCHAR#)) (COND ((WINDOWPROP SKW 'CHANGEDTEXTELT) @@ -1061,43 +1048,18 @@ of NEWELT)) PTRCHAR#] (SETQ NEWLINE# (CAR NEWLINE#] - UNDO + + (* ;; "Cleanup") + (COND ((NULL CONTROLCHARTAIL) (* ;  "set the selection to where the characters were just inserted.") (SKED.SET.SELECTION (CREATE.TEXT.SELECTION NEWELT NEWLINE# NEWCHAR# NIL NIL (WINDOWPROP SKW 'DSP)) SKW)) - [(EQ CONTROLCHARTAIL 'UNDO) (* ; + ((EQ CONTROLCHARTAIL 'UNDO) (* ;  "user types in an undo after some characters or while selection was in the middle of text.") - (PROG (INITSELECTION EDITEDELT) - (COND - ((SETQ INITSELECTION (WINDOWPROP SKW 'CHANGEDTEXTELT NIL)) - (* ; - "in the middle of editing, undo these edits.") - [SETQ EDITEDELT (fetch (SCREENELT GLOBALPART) - of (OR NEWELT (fetch (TEXTELTSELECTION SKTEXTELT) - of (OR SELECTION (ERROR - "NO SELECTION WHEN THERE SHOULD BE" - ] - (* ; - "add event to history list so the undo can be undone.") - (COND - ((POSITIONP INITSELECTION) (* ; - "add an ADD event because previously there was nothing here.") - (SK.ADD.HISTEVENT 'ADD (LIST EDITEDELT) - SKW) - (SK.CHECK.END.INITIAL.EDIT SKW EDITEDELT)) - (T (SK.ENTER.EDIT.CHANGE SKW (fetch (SCREENELT GLOBALPART) - of (fetch (TEXTELTSELECTION - SKTEXTELT) - of INITSELECTION)) - EDITEDELT))) - (SK.UNDO.LAST SKW) - (SKED.SET.SELECTION INITSELECTION SKW)) - (T (* ; - "haven't edited any characters in the current element, just undo the last thing.") - (SK.UNDO.LAST SKW] + (\SKED.INSERT.UNDO NEWELT SELECTION)) (T (* ;; "user typed a character command to create a new text box. Create it and put the remaining characters in it and set the cursor there.") @@ -1110,6 +1072,94 @@ SKW (CDR CONTROLCHARTAIL]) +(\SKED.ARROWKEYS + [LAMBDA (ACTION SKW SELECTION) (* ; "Edited 1-Dec-2025 22:24 by rmk") + + (* ;; "Move the caret left/right/up/down according to the arrow keys") + + (CL:UNLESS SELECTION + (SETQ SELECTION (WINDOWPROP SKW 'SELECTION))) + (CL:WHEN (AND SELECTION (NOT (POSITIONP SELECTION))) + (LET* [(CHAR# (fetch (TEXTELTSELECTION SKCHAR#) of SELECTION)) + (LINE# (fetch (TEXTELTSELECTION SKLINE#) of SELECTION)) + (TEXTELT (fetch (TEXTELTSELECTION SKTEXTELT) of SELECTION)) + (SKLEFT (fetch (TEXTELTSELECTION SKLEFT) of SELECTION)) + (LINES (fetch (TEXT LISTOFCHARACTERS) of (fetch (SCREENELT INDIVIDUALGLOBALPART) + of TEXTELT] + (SELECTQ ACTION + (:ONECHAR.BACKWARD + (if (EQ CHAR# 0) + then (add LINE# -1) + [SETQ CHAR# (NCHARS (CAR (NTH LINES LINE#] + else (add CHAR# -1))) + (:ONECHAR.FORWARD + (if [EQ CHAR# (NCHARS (CAR (NTH LINES LINE#] + then (add LINE# 1) + (SETQ CHAR# 1) + else (add CHAR# 1))) + (:LINE.UP (add LINE# -1) + (SETQ CHAR# (CLOSEST.CHAR SKLEFT LINE# TEXTELT SKW))) + (:LINE.DOWN (add LINE# 1) + (SETQ CHAR# (CLOSEST.CHAR SKLEFT LINE# TEXTELT SKW))) + (SHOULDNT)) + (CL:WHEN (<= 1 LINE# (LENGTH LINES)) + (SKED.SELECTION.FEEDBACK SKW) + (SKED.SET.SELECTION (create TEXTELTSELECTION + using SELECTION SKCHAR# _ CHAR# SKLINE# _ LINE# SKLEFT _ + (CHAR.BEGIN CHAR# LINE# (fetch (TEXTELTSELECTION + SKTEXTELT) + of SELECTION) + SKW) + SKBOTTOM _ (LINE.BEGIN LINE# TEXTELT)) + SKW))))]) + +(\SKED.INSERT.ACTION + [LAMBDA (CHARCODES SKW) (* ; "Edited 1-Dec-2025 22:28 by rmk") + (LET [(ACTION (SK.GETSYNTAX (CAR CHARCODES] + (SELECTQ ACTION + (:UNDO (\SKED.INSERT.UNDO SKW) + T) + ((:ONECHAR.BACKWARD :ONECHAR.FORWARD :LINE.UP :LINE.DOWN) + (\SKED.ARROWKEYS ACTION SKW) + T) + NIL]) + +(\SKED.INSERT.UNDO + [LAMBDA (SKW NEWELT SELECTION) (* ; "Edited 1-Dec-2025 23:21 by rmk") + (* ; "Edited 1-Dec-2025 12:56 by rmk") + (* ; "Edited 1-Dec-2025 12:48 by rmk") + (CL:UNLESS SELECTION + (SETQ SELECTION (WINDOWPROP SKW 'SELECTION))) + (PROG (INITSELECTION EDITEDELT) + (COND + ((SETQ INITSELECTION (WINDOWPROP SKW 'CHANGEDTEXTELT NIL)) + (* ; + "in the middle of editing, undo these edits.") + [SETQ EDITEDELT (fetch (SCREENELT GLOBALPART) of (OR NEWELT (fetch (TEXTELTSELECTION + SKTEXTELT) + of (OR SELECTION + (ERROR + "NO SELECTION WHEN THERE SHOULD BE" + ] + (* ; + "add event to history list so the undo can be undone.") + (COND + ((POSITIONP INITSELECTION) (* ; + "add an ADD event because previously there was nothing here.") + (SK.ADD.HISTEVENT 'ADD (LIST EDITEDELT) + SKW) + (SK.CHECK.END.INITIAL.EDIT SKW EDITEDELT)) + (T (SK.ENTER.EDIT.CHANGE SKW (fetch (SCREENELT GLOBALPART) + of (fetch (TEXTELTSELECTION SKTEXTELT) of + INITSELECTION + )) + EDITEDELT))) + (SK.UNDO.LAST SKW) + (SKED.SET.SELECTION INITSELECTION SKW)) + (T (* ; + "haven't edited any characters in the current element, just undo the last thing.") + (SK.UNDO.LAST SKW]) + (FIRST.N.ELEMENTS [LAMBDA (LST N) (* rrb "20-Jan-86 18:05") @@ -1299,7 +1349,7 @@ (T (RETURN (SUBSTRING STRING 1 END]) (\SKED.INSERT.CHARS.TO.STR - [LAMBDA (CHARCODES INCLUDECR SKW) (* ; "Edited 30-Nov-2025 08:43 by rmk") + [LAMBDA (CHARCODES INCLUDECR SKW SELECTION) (* ; "Edited 1-Dec-2025 00:42 by rmk") (* ; "Edited 24-Nov-2025 08:40 by rmk") (* ; "Edited 12-Nov-2025 14:50 by rmk") (* ; "Edited 10-Nov-2025 16:35 by rmk") @@ -1308,6 +1358,8 @@ (* ;; "takes a list of characters and makes it into strings on the free variable NEWSTRS. The variable STRPIECE is set to the last line of characters. NEWSTRS is a list of the strings that precede this one which is used in the case of backspace onto the previous line.") + (* ;; "SELECTION is for the actions that move the type-in") + (PROG (LINELST THISLINE REMAININGCHARS) (for CHAR in CHARCODES do (SELECTQ (SK.GETSYNTAX CHAR) @@ -1381,9 +1433,6 @@ ((:WORDDELETE.FORWARD :CHARDELETE.FORWARD) (* ; "Not implemented, no-ops") NIL) - ((:ONECHAR.BACKWARD :ONECHAR.FORWARD :LINE.UP :LINE.DOWN) - (* ; "Arrow keys: not implemented") - NIL) (:DELETE (* ;  "delete selection. Here that means don't insert anything.")) (:UNDO @@ -1474,7 +1523,7 @@ -(* line adding functions) +(* ; "line adding functions") (DEFINEQ @@ -1833,7 +1882,7 @@ (WINDOWPROP SKW 'INPUTLINE NIL]) ) - (* Was MODERNIZE loaded before?) + (* ; "Was MODERNIZE loaded before?") (CL:WHEN (GETD 'MODERNWINDOW.SETUP) (MODERNWINDOW.SETUP 'WB.BUTTON.HANDLER)) @@ -1870,26 +1919,27 @@ YCOORD _ (LASTMOUSEY WIN]) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (2553 39141 (BUTLAST 2563 . 2911) (CHAR.BEGIN 2913 . 4838) (CLOSEST.CHAR 4840 . 9063) ( -CLOSEST.LINE 9065 . 9627) (FLASHW 9629 . 9786) (HILITE.LINE 9788 . 10607) (HILITE.TEXT 10609 . 12257) -(IN.TEXT.EXTEND 12259 . 15532) (INIMAGEOBJ 15534 . 16039) (INTEXT 16041 . 16538) (NEW.TEXT.EXTEND -16540 . 18759) (NEW.TEXT.SELECTIONP 18761 . 18941) (NTHCHARWIDTH 18943 . 19200) (NTHLOCALREGION 19202 - . 19440) (ONCHAR 19442 . 19837) (SHOW.EXTENDED.SELECTION.FEEDBACK 19839 . 20774) (SHOW.FEEDBACK 20776 - . 21266) (SHOW.FEEDBACK.BOX 21268 . 22322) (SELECTION.POSITION 22324 . 23116) (SKED.CLEAR.SELECTION -23118 . 23641) (SKETCH.CLEANUP 23643 . 25557) (SK.ENTER.EDIT.CHANGE 25559 . 27104) ( -SKED.REMOVE.OTHER.SELECTIONS 27106 . 27533) (SKED.EXTEND.SELECTION 27535 . 29000) (SKED.MOVE.SELECTION - 29002 . 34072) (CREATE.TEXT.SELECTION 34074 . 34590) (SKED.SELECTION.FEEDBACK 34592 . 36248) ( -SKED.SET.EXTENDSELECTION 36250 . 36567) (SKED.SET.SELECTION 36569 . 36969) (LINE.BEGIN 36971 . 37525) -(SELECTION.GREATERP 37527 . 38322) (SK.GETSYNTAX 38324 . 39139)) (39983 87597 (WB.EDITOR 39993 . 41374 -) (SK.TTYENTRYFN 41376 . 41916) (SK.TTYEXITFN 41918 . 42444) (SKED.INSERT 42446 . 42874) (\SKED.INSERT - 42876 . 64878) (FIRST.N.ELEMENTS 64880 . 65147) (SKED.CREATE.NEW.TEXTBOX 65149 . 71678) ( -SKED.CHARACTERPOSITION 71680 . 72467) (SKED.LINE.AND.CHAR# 72469 . 74100) ( -\SKED.DELETE.WORD.FROM.STRING 74102 . 75266) (\SKED.INSERT.CHARS.TO.STR 75268 . 83979) (JOINCHARS -83981 . 84368) (STRINGFROMCHARACTERS 84370 . 84695) (GETALLCHARS 84697 . 85038) (CLEANUP.EDIT 85040 . -85492) (SKED.NEW.TEXTELT 85494 . 87595)) (87632 108640 (MAP.SCREEN.POSITION.ONTO.GRID 87642 . 89091) ( -NEAREST.ON.GRID 89093 . 89637) (SK.MIDDLE.TITLEFN 89639 . 91582) (WB.BUTTON.HANDLER 91584 . 99406) ( -WB.ADD.NEW.POINT 99408 . 102737) (WB.DRAWLINE 102739 . 106973) (WB.RUBBERBAND.POSITION 106975 . 107892 -) (SK.RUBBERBAND.FEEDBACKFN 107894 . 108398) (RESET.LINE.BEING.INPUT 108400 . 108638)) (108822 110063 -(NEAREST.EXISTING.POSITION 108832 . 109034) (WB.NEARPT 109036 . 109921) (LASTMOUSEPOSITION 109923 . -110061))))) + (FILEMAP (NIL (2849 39635 (BUTLAST 2859 . 3207) (CHAR.BEGIN 3209 . 5332) (CLOSEST.CHAR 5334 . 9557) ( +CLOSEST.LINE 9559 . 10121) (FLASHW 10123 . 10280) (HILITE.LINE 10282 . 11101) (HILITE.TEXT 11103 . +12751) (IN.TEXT.EXTEND 12753 . 16026) (INIMAGEOBJ 16028 . 16533) (INTEXT 16535 . 17032) ( +NEW.TEXT.EXTEND 17034 . 19253) (NEW.TEXT.SELECTIONP 19255 . 19435) (NTHCHARWIDTH 19437 . 19694) ( +NTHLOCALREGION 19696 . 19934) (ONCHAR 19936 . 20331) (SHOW.EXTENDED.SELECTION.FEEDBACK 20333 . 21268) +(SHOW.FEEDBACK 21270 . 21760) (SHOW.FEEDBACK.BOX 21762 . 22816) (SELECTION.POSITION 22818 . 23610) ( +SKED.CLEAR.SELECTION 23612 . 24135) (SKETCH.CLEANUP 24137 . 26051) (SK.ENTER.EDIT.CHANGE 26053 . 27598 +) (SKED.REMOVE.OTHER.SELECTIONS 27600 . 28027) (SKED.EXTEND.SELECTION 28029 . 29494) ( +SKED.MOVE.SELECTION 29496 . 34566) (CREATE.TEXT.SELECTION 34568 . 35084) (SKED.SELECTION.FEEDBACK +35086 . 36742) (SKED.SET.EXTENDSELECTION 36744 . 37061) (SKED.SET.SELECTION 37063 . 37463) (LINE.BEGIN + 37465 . 38019) (SELECTION.GREATERP 38021 . 38816) (SK.GETSYNTAX 38818 . 39633)) (40480 90869 ( +WB.EDITOR 40490 . 41871) (SK.TTYENTRYFN 41873 . 42413) (SK.TTYEXITFN 42415 . 42941) (SKED.INSERT 42943 + . 43371) (\SKED.INSERT 43373 . 62845) (\SKED.ARROWKEYS 62847 . 65302) (\SKED.INSERT.ACTION 65304 . +65748) (\SKED.INSERT.UNDO 65750 . 68291) (FIRST.N.ELEMENTS 68293 . 68560) (SKED.CREATE.NEW.TEXTBOX +68562 . 75091) (SKED.CHARACTERPOSITION 75093 . 75880) (SKED.LINE.AND.CHAR# 75882 . 77513) ( +\SKED.DELETE.WORD.FROM.STRING 77515 . 78679) (\SKED.INSERT.CHARS.TO.STR 78681 . 87251) (JOINCHARS +87253 . 87640) (STRINGFROMCHARACTERS 87642 . 87967) (GETALLCHARS 87969 . 88310) (CLEANUP.EDIT 88312 . +88764) (SKED.NEW.TEXTELT 88766 . 90867)) (90908 111916 (MAP.SCREEN.POSITION.ONTO.GRID 90918 . 92367) ( +NEAREST.ON.GRID 92369 . 92913) (SK.MIDDLE.TITLEFN 92915 . 94858) (WB.BUTTON.HANDLER 94860 . 102682) ( +WB.ADD.NEW.POINT 102684 . 106013) (WB.DRAWLINE 106015 . 110249) (WB.RUBBERBAND.POSITION 110251 . +111168) (SK.RUBBERBAND.FEEDBACKFN 111170 . 111674) (RESET.LINE.BEING.INPUT 111676 . 111914)) (112102 +113343 (NEAREST.EXISTING.POSITION 112112 . 112314) (WB.NEARPT 112316 . 113201) (LASTMOUSEPOSITION +113203 . 113341))))) STOP diff --git a/library/sketch/SKETCH-EDIT.LCOM b/library/sketch/SKETCH-EDIT.LCOM index 9fd7edc75d12dcdf9c31619cd769027bcf6ea006..b4a6f2dd5e05f81b8f06a9f82eba7d82a6678a9b 100644 GIT binary patch delta 3972 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 delta 3089 zcmZuzZ){sv7597I)Hdm&I7#C+$=Vy2rAgDgz5jp0)aBWJiQnwJYdt^L$;cMc*h$M}}<7jroz8@G4j=RYf|nTes6!Era| zq0`HlH55ek~R~=1u;yj&PgnwNNT!W!duKY}>YX{o#unf5vSc-yO^GJoiVJ z@jv)Odt^{jb>yWowqHP!EF!upx#=JSH&tPm!k&aA(L!F3p*&<7XdHV%zJ5Qtm^f)5 znhGcFheZL%AvRld3!B@DS zk-rb#x$+I%#RO)1uI=2baph~XecRb`=mG5KxA!>-`~Gmd#FWRl9<1)F|MzoCJt4Ce z`4@SAsEA(1r#Gi@7jDNg6WZAn@#&4r*-$xnfiIrn-X_(HC9Y2HU;Kct_mjKBee1Qz zPjDg>+FXsH-u)(L)y)#_-fGWmon*0KiaCB(-)?xa*~?C19lU9T2kR`_-?6dE@mN0) zG_2Z;`OPqhof{*V{AjqBd_3G0l?~(0rJi0{mjS{6)PfVh7b+rfu?L{gbn@(cd|i@N z6U_jMi@sBGy)-TXPmw6>i?9;_?*UL`^=K`Uc34t0DaG*u#}`;Z1HQZo2Y_cW*;K|! zQ9dmlHy{s;6SIhzGEP74{g5I9%hI2_O|l*a{^I-G~C2C(#f?88#gQN9?2{^os5 zxyy#i3g_NChkZEe9UFafhLibh0 zKr2&9Wrir_zGzd|{stOJ? z5iU%y&hO`uDjgXoRT3dlS!y>i#!m|@v=;I#CSjCp%BDX8-b^^CYx5UoOy&Atr z-WeOy+o$$e(pu`H9Mg_QyRE_^HVk&<_BurrTv?8T!w!OS1UIv^J~?WWwh|+WwuzY|9no5c2vsM zwYBQ<;vSv+r#w#9Dnl?yhUv?d{H4-!q8V5SPWKaVXFHdpb_=M5j4TYDx=~%Opt*AS zpr%_3PeF>lzmOnrEj$gYPp0GK(}gqS?)h#aEFM2snp;JaIPLhJ`@Dm0tjv`wWz=%D evas@{%Ckd=d{lk@u^}|rLf%|FTmSvyE&l(994KJ`