(FILECREATED "30-Jun-87 09:25:18" {PHYLUM}<PAPERWORKS>SKETCHWHENCOPIEDPATCH.;2 12142 changes to: (VARS SKETCHWHENCOPIEDPATCHCOMS) previous date: "24-Jun-87 15:16:40" {PHYLUM}<PAPERWORKS>SKETCHWHENCOPIEDPATCH.;1) (* Copyright (c) 1987 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT SKETCHWHENCOPIEDPATCHCOMS) (RPAQQ SKETCHWHENCOPIEDPATCHCOMS ((FNS SK.COPY.INSERTFN ADD.ELEMENT.TO.SKETCH SK.COPY.ITEM \SKETCH.COPY.ELEMENT SK.BUILD.IMAGEOBJ COPY.IMAGE.OBJECT SK.COPY.IMAGEOBJ))) (DEFINEQ (SK.COPY.INSERTFN [LAMBDA (IMAGEOBJ SKW) (* rrb "23-Jun-87 13:25") (* * the function that gets called to insert a copy-selection into a sketch window. Knows how to insert sketches, everything else is text.) (PROG (IMAGEOBJYET SELECTION EXTENDSELECTION) (* bind the selection so that if the user has to place an image obj, it is restored before the characters are unBYSYSBUFed) [bind DATUM for IMOBJ inside IMAGEOBJ do (COND ((STRINGP IMOBJ) (BKSYSBUF IMOBJ)) ((EQ (fetch (IMAGEOBJ IMAGEOBJFNS) of IMOBJ) SKETCHIMAGEFNS) (* this is a sketch imageobj) [COND ((NULL IMAGEOBJYET) (* save SELECTION and EXTENDSELECTION so they can be restored) (SETQ IMAGEOBJYET T) (SETQ SELECTION (WINDOWPROP SKW (QUOTE SELECTION))) (SETQ EXTENDSELECTION (WINDOWPROP SKW (QUOTE EXTENDSELECTION] (SETQ DATUM (IMAGEOBJPROP IMOBJ (QUOTE OBJECTDATUM))) (OR (SK.INSERT.SKETCH SKW (fetch (SKETCHIMAGEOBJ SKIO.SKETCH) of DATUM) (fetch (SKETCHIMAGEOBJ SKIO.REGION) of DATUM) (fetch (SKETCHIMAGEOBJ SKIO.SCALE) of DATUM)) (RETURN))) (T (* insert the image object whatever it is) [COND ((NULL IMAGEOBJYET) (* save SELECTION and EXTENDSELECTION so they can be restored) (SETQ IMAGEOBJYET T) (SETQ SELECTION (WINDOWPROP SKW (QUOTE SELECTION))) (SETQ EXTENDSELECTION (WINDOWPROP SKW (QUOTE EXTENDSELECTION] (* if the user placed it outside, just return) (OR (SK.INSERT.SKETCH SKW [SKETCH.CREATE (QUOTE DUMMYNAME) (QUOTE ELEMENTS) (LIST (SETQ DATUM ( SK.ELEMENT.FROM.IMAGEOBJ IMOBJ SKW] (fetch (SKIMAGEOBJ SKIMOBJ.GLOBALREGION) of (fetch (GLOBALPART INDIVIDUALGLOBALPART) of DATUM)) (VIEWER.SCALE SKW)) (RETURN] (COND (IMAGEOBJYET (* restore the selection) (WINDOWPROP SKW (QUOTE SELECTION) SELECTION) (WINDOWPROP SKW (QUOTE EXTENDSELECTION) EXTENDSELECTION) (SKED.SELECTION.FEEDBACK SKW]) (ADD.ELEMENT.TO.SKETCH [LAMBDA (GELT SKETCH) (* rrb "23-Jun-87 13:29") (* changes the global sketch) (PROG [(REALSKETCH (INSURE.SKETCH SKETCH)) (ELTPRI (\GETSKETCHELEMENTPROP1 GELT (QUOTE PRI] [COND ((EQ (fetch (GLOBALPART GTYPE) of GELT) (QUOTE SKIMAGEOBJ)) (* call the wheninsertedfn for this imageobj if there is one.) (PROG ((IMOBJ (fetch (SKIMAGEOBJ SKIMAGEOBJ) of (fetch (GLOBALPART INDIVIDUALGLOBALPART) of GELT))) DATUM) (COND ((AND (SETQ DATUM (IMAGEOBJPROP IMOBJ (QUOTE WHENINSERTEDFN))) (NEQ DATUM (QUOTE NILL))) (* call the image objects insertfn.) (APPLY* DATUM IMOBJ (SK.VIEWER.FROM.SKETCH.ARG SKETCH) NIL SKETCH))) (RETURN] (COND ((NULL ELTPRI) (* give the element a priority and put it at the end) (SK.SET.ELEMENT.PRIORITY GELT (SK.POP.NEXT.PRIORITY REALSKETCH)) (TCONC (fetch (SKETCH SKETCHTCELL) of REALSKETCH) GELT)) (T (SK.ADD.PRIORITY.ELEMENT.TO.SKETCH SKETCH GELT ELTPRI))) (SK.MARK.DIRTY REALSKETCH]) (SK.COPY.ITEM [LAMBDA (SELELT GLOBALDELTAPOS W) (* rrb "24-Jun-87 15:12") (* SELELT is a sketch element that was selected for a copy operation. GLOBALDELTAPOS is the amount the new item is to be offset from the old.) (PROG ((OLDGLOBAL (fetch (SCREENELT GLOBALPART) of SELELT))) [COND ((EQ (fetch (GLOBALPART GTYPE) of OLDGLOBAL) (QUOTE SKIMAGEOBJ)) (* copying an image obj. Don't call its when copied fn. was changed to call the WHENINSERTEDFN instead when it acutally gets inserted.) (SETQ OLDGLOBAL (SK.COPY.IMAGEOBJ OLDGLOBAL W] (RETURN (SK.TRANSLATE.GLOBALPART OLDGLOBAL GLOBALDELTAPOS]) (\SKETCH.COPY.ELEMENT [LAMBDA (GLOBALELEMENT GLOBALDELTAPOS W) (* rrb "24-Jun-87 15:05") (* SELELT is a sketch element that was selected for a copy operation. GLOBALDELTAPOS is the amount the new item is to be offset from the old.) (COND ((EQ (fetch (GLOBALPART GTYPE) of GLOBALELEMENT) (QUOTE SKIMAGEOBJ)) (* copying an image obj. Calls its when copied fn.) (SK.TRANSLATE.GLOBALPART (SK.COPY.IMAGEOBJ GLOBALELEMENT W) GLOBALDELTAPOS)) (T (SK.TRANSLATE.GLOBALPART GLOBALELEMENT GLOBALDELTAPOS]) (SK.BUILD.IMAGEOBJ [LAMBDA (SCRELTS SKW CHARSONLYFLG) (* rrb "29-Jun-87 14:22") (* builds an imageobj from the list of screen elements.) (COND [CHARSONLYFLG (* return only the text characters.) (PROG ((TEXTELTS (bind GELT for LOCALSKELT in SCRELTS join (SELECTQ (fetch (GLOBALPART GTYPE) of (SETQ GELT (fetch (SCREENELT GLOBALPART) of LOCALSKELT))) (TEXT (LIST (LIST (fetch (TEXT LOCATIONLATLON) of (SETQ GELT (fetch (GLOBALPART INDIVIDUALGLOBALPART) of GELT))) GELT))) (TEXTBOX (LIST (LIST (SK.TEXTBOX.TEXT.POSITION (SETQ GELT (fetch (GLOBALPART INDIVIDUALGLOBALPART) of GELT))) GELT))) (SKIMAGEOBJ (* grab the imageobj too.) (LIST (LIST (create POSITION XCOORD ←[fetch (REGION LEFT) of (fetch (SKIMAGEOBJ SKIMOBJ.GLOBALREGION) of (SETQ GELT (fetch (GLOBALPART INDIVIDUALGLOBALPART) of GELT] YCOORD ←(fetch (REGION BOTTOM) of (fetch (SKIMAGEOBJ SKIMOBJ.GLOBALREGION) of GELT))) GELT))) NIL))) CHARSLST) (* sort according to top from the left.) [SORT TEXTELTS (FUNCTION (LAMBDA (A B) (COND [(GREATERP (fetch (POSITION YCOORD) of (SETQ A (CAR A))) (fetch (POSITION YCOORD) of (SETQ B (CAR B] ((EQUAL (fetch (POSITION YCOORD) of A) (fetch (POSITION YCOORD) of B)) (LESSP (fetch (POSITION XCOORD) of A) (fetch (POSITION XCOORD) of B] (RETURN (COND ((EQUAL [CAR (LAST (SETQ CHARSLST (for TEXTELT in TEXTELTS join (* collect relevant parts.) (COND [(EQ (QUOTE SKIMAGEOBJ) (fetch (INDIVIDUALGLOBALPART GTYPE) of (CADR TEXTELT))) (* copy image object so that copyfn is called. This also copies the part of the image object that are sketch relevent unnecessarily but it keeps copyfn call in one place.) (LIST (COPY.IMAGE.OBJECT (fetch (SKIMAGEOBJ SKIMAGEOBJ) of (CADR TEXTELT] (T (SK.ADD.SPACES (fetch (TEXT LISTOFCHARACTERS) of (CADR TEXTELT] " ") (* strip off the trailing EOL that was added.) (BUTLAST CHARSLST)) (T CHARSLST] (T (* return an image object. The sketch is translated to bring its lower left coordinate to 0,0 so that when it is put in a document it is in a canonical place. Maybe don't need to do this anymore.) (SKETCH.IMAGEOBJ [create SKETCH using (INSURE.SKETCH SKW) SKETCHNAME ← NIL SKETCHELTS ←(SK.SORT.GELTS.BY.PRIORITY (bind GELT for LOCALSKELT in SCRELTS collect (COND ((EQ (fetch (GLOBALPART GTYPE) of (SETQ GELT (fetch (SCREENELT GLOBALPART) of LOCALSKELT))) (QUOTE SKIMAGEOBJ)) (* apply copy fn) (SK.COPY.IMAGEOBJ GELT)) (T (COPY GELT] (SK.GLOBAL.REGION.OF.LOCAL.ELEMENTS SCRELTS (VIEWER.SCALE SKW)) (VIEWER.SCALE SKW) (SK.GRIDFACTOR SKW]) (COPY.IMAGE.OBJECT [LAMBDA (IMAGEOBJ) (* rrb "29-Jun-87 14:22") (* copies an image object calling its copyfn if possible.) (PROG (FN) (RETURN (COND ((AND (SETQ FN (IMAGEOBJPROP IMAGEOBJ (QUOTE COPYFN))) (NEQ FN (QUOTE NILL))) (APPLY* FN IMAGEOBJ)) (T (COPY IMAGEOBJ]) (SK.COPY.IMAGEOBJ [LAMBDA (GELT WINDOW CALLWHENCOPIEDFN) (* rrb "29-Jun-87 14:22") (* * makes a copy of a image object sketch element. Has to call the image objects copyfn. Calls its its WHENCOPIEDFN if CALLWHENCOPIEDFN is not NIL This is normally NIL because the WHENINSERTEDFN is used instead.) (PROG ((INDVGELT (fetch (GLOBALPART INDIVIDUALGLOBALPART) of GELT)) IMAGEOBJ FN NEWSKELT) [SETQ NEWSKELT (create GLOBALPART INDIVIDUALGLOBALPART ←[create SKIMAGEOBJ using INDVGELT SKIMAGEOBJ ←( COPY.IMAGE.OBJECT (SETQ IMAGEOBJ (fetch (SKIMAGEOBJ SKIMAGEOBJ) of INDVGELT] COMMONGLOBALPART ←(COPY (fetch (GLOBALPART COMMONGLOBALPART) of GELT] (COND ((AND CALLWHENCOPIEDFN (SETQ FN (IMAGEOBJPROP IMAGEOBJ (QUOTE WHENCOPIEDFN))) (NEQ FN (QUOTE NILL))) (* documentation calls for passing text streams as well but there aren't any.) (APPLY* FN IMAGEOBJ WINDOW))) (RETURN NEWSKELT]) ) (PUTPROPS SKETCHWHENCOPIEDPATCH COPYRIGHT ("Xerox Corporation" 1987)) (DECLARE: DONTCOPY (FILEMAP (NIL (534 12050 (SK.COPY.INSERTFN 544 . 3199) (ADD.ELEMENT.TO.SKETCH 3201 . 4650) ( SK.COPY.ITEM 4652 . 5437) (\SKETCH.COPY.ELEMENT 5439 . 6078) (SK.BUILD.IMAGEOBJ 6080 . 10357) ( COPY.IMAGE.OBJECT 10359 . 10826) (SK.COPY.IMAGEOBJ 10828 . 12048))))) STOP