(DEFINE-FILE-INFO PACKAGE (DEFPACKAGE "WEB" (USE "PCL" 
"CL" "XCL") (NICKNAMES "WEB-EDITOR")) READTABLE "XCL")
(il:filecreated " 4-Nov-87 18:26:00" 
il:{dsk}<lispfiles>web-editor.\;12 155723 

      il:|changes| il:|to:|  (pcl::methods (move (
                                                 web-editor
                                                  ))
                                    (initialize (web-editor
                                                 )))

      il:|previous| il:|date:| "30-Sep-87 22:34:00" 
il:{dsk}<lispfiles>web-editor.\;11)


; Copyright (c) 1987 by Xerox Corporation.  All rights reserved.

(il:prettycomprint il:web-editorcoms)

(il:rpaqq il:web-editorcoms 
          (

(il:* il:|;;;| "***************************************")

           

(il:* il:|;;;| " Copyright (c) 1987 by Xerox Corporation.  All rights reserved.")

           

(il:* il:|;;;| "Use and copying of this software and preparation of derivative works based upon this software are permitted.  Any distribution of this software or derivative works must comply with all applicable United States export control laws.")

           

(il:* il:|;;;| "This software is made available AS IS, and Xerox Corporation makes no  warranty about the software, its performance or its conformity to any specification.")

           

(il:* il:|;;;| "Any person obtaining a copy of this software is requested to send their name and post office or electronic mail address to:")

           

(il:* il:|;;;| "   CLOS Coordinator")

           

(il:* il:|;;;| "   Xerox Artifical Intelligence Systems   ")

           

(il:* il:|;;;| "   2550 Hanover St.")

           

(il:* il:|;;;| "   Palo Alto, CA 94303")

           

(il:* il:|;;;| 
"(or send internet mail to CLOSSupport.pa@Xerox.arpa)")

           

(il:* il:|;;;| " ****************************************")

           

(il:* il:|;;;| "")

           

(il:* il:|;;;| "Print out a copyright notice when loading")

           

(il:* il:|;;;| "")

           (il:p (format t "~&;WEB-EDITOR Copyright (c) 1987, Xerox Corporation.  All rights reserved.~%"
                        ))
           

(il:* il:|;;;| "")

           

(il:* il:|;;;| "PACKAGE STUFF")

           (il:prop il:makefile-environment il:web-editor)
           
      
      (il:* il:|;;| "")

           

(il:* il:|;;;| "WEB EDITOR ")

           
      
      (il:* il:|;;| "")

           
      
      (il:* il:|;;| "Global Variables")

           
      
      (il:* il:|;;| "global for cross-editor boxed node destination (like caret for current tty process copy and move destinations)")

           (il:variables destination-browser)
           
      
      (il:* il:|;;| "")

           
      
      (il:* il:|;;| "Web Node Class")

           (pcl::classes web-node)
           (pcl::methods (get-label (web-node))
                  (get-to-links (web-node))
                  (object-name (web-node)))
           
      
      (il:* il:|;;| " Web Editor  Class")

           (pcl::classes web-editor)
           (pcl::methods (get-label (web-editor))
                  (get-subs (web-editor)))
           
      
      (il:* il:|;;| "Window Interface")

           (pcl::methods (initialize (web-editor))
                  (create-window (web-editor))
                  (detach-lisp-window (web-editor))
                  (has-lisp-window (web-editor))
                  (set-outer-region (web-editor))
                  (set-region (web-editor))
                  (update (web-editor))
                  (move (web-editor))
                  (move1 (web-editor))
                  (after-move (web-editor))
                  (after-reshape (web-editor))
                  (scroll-window (web-editor)))
           (pcl::methods (get-prompt-window (web-editor))
                  (prompt-print (web-editor))
                  (prompt-read (web-editor))
                  (prompt-for-list (web-editor))
                  (prompt-for-string (web-editor))
                  (prompt-for-word (web-editor)))
           (pcl::methods (clear (web-editor))
                  (icon-title (web-editor)))
           (il:fns web-window-after-move-fn 
                  web-window-button-event-fn 
                  web-window-reshape-fn web-window-close-fn 
                  il:|PromptRead|)
           (il:fns web-window-expand-fn)
           (il:functions web-window-icon-fn)
           (il:bitmaps *web-editor-icon-bm* 
                  *web-editor-icon-mask*)
           (il:variables *web-editor-template*)
           (il:vars (il:*d-window-default-stream* 
                           il:promptwindow))
           (il:functions il:|CopyDown?| il:|MetaDown?| 
                  il:|MoveDown?|)
           
      
      (il:* il:|;;| "Layout and Display Engine")

           (pcl::methods (browse (web-editor))
                  (show (web-editor))
                  (display-browser (web-editor))
                  (browser-objects (web-editor))
                  (get-node-list (web-editor))
                  (graph-fits (web-editor))
                  (node-region (web-editor))
                  (clear-label-cache (web-editor)))
           
      
      (il:* il:|;;| "Button Events")

           (pcl::methods (button-event-fn (web-editor))
                  (choice-menu (web-editor))
                  (when-menu-item-held (web-editor))
                  (item-menu (web-editor))
                  (get-menu-items (web-editor))
                  (clear-menu-cache (web-editor))
                  (left-choice (web-editor))
                  (middle-choice (web-editor))
                  (left-selection (web-editor))
                  (left-shift-select (web-editor))
                  (middle-selection (web-editor))
                  (middle-shift-select (web-editor))
                  (right-selection (web-editor))
                  (title-selection (web-editor)))
           (il:fns web-menu-whenselectedfn 
                  window-when-held-fn)
           (il:fns sub-item-selection dual-sub-items 
                  window-when-held-fn do-menu-method 
                  dual-menu dual-selection)
           
      
      (il:* il:|;;| "Event Triggering")

           (pcl::methods (do-selected-command (web-editor))
                  (do-command-in-process (web-editor))
                  (eval-form-in-process (web-editor))
                  (message-form-for-process (web-editor)))
           (il:fns eval.in.tty.context lispx-send)
           
      
      (il:* il:|;;| "Browser Looks Control")

           (pcl::methods (add-root (web-editor))
                  (delete-from-browser (web-editor))
                  (delete-subtree-from-browser (web-editor)
                         )
                  (recompute (web-editor))
                  (recompute-in-place (web-editor))
                  (recompute-labels (web-editor))
                  (remove-from-bad-list (web-editor))
                  (change-font-size (web-editor))
                  (change-format (web-editor))
                  (change-max-label-size (web-editor))
                  (shape-to-hold (web-editor)))
           
      
      (il:* il:|;;| "Node Marking and Selecting")

           (pcl::methods (box-node (web-editor))
                  (display-node-hightlights (web-editor))
                  (display-node-shading (web-editor))
                  (flash-node (web-editor))
                  (flip-node (web-editor))
                  (get-display-label (web-editor))
                  (highlight-node (web-editor))
                  (remove-highlights (web-editor))
                  (remove-shading (web-editor))
                  (unmark-nodes (web-editor))
                  (shade-node (web-editor)))
           (pcl::methods (has-object (web-editor))
                  (make-parameter-menu (web-editor))
                  (new-item (web-editor))
                  (obj-name-pair (web-editor))
                  (object-from-label (web-editor))
                  (position-node (web-editor)))
           
      
      (il:* il:|;;| "Dubious Methods")

           (pcl::methods (save-in-it (web-editor))
                  (sub-browser (web-editor))
                  (unread (web-editor)))
           

(il:* il:|;;;| "AUXILIARY Stuff")

           (il:fns find-selected-node)
           (il:fns add-menu-window box-print-string 
                  box-window-node break-string-for-boxing 
                  fileclasses items-for-type 
                  menu-group-size repaint-menu-window 
                  \\delete-subtree \\menu-group-size 
                  \\place-menu-group-in-window 
                  \\portable-graph-node-id 
                  \\remove-menu-group-from-window)
           (il:fns tree-roots child-nodes reachable-nodes!)
           (il:vars (web-stream il:promptwindow)
                  il:|BrowserMargin| il:grayshade1 
                  il:grayshade2 il:grayshade3 il:grayshade4 
                  il:|MaxLatticeHeight| 
                  il:|MaxLatticeWidth| il:|NestedMenuFlg|)
           (il:specvars il:|MaxLatticeHeight| 
                  il:|MaxLatticeWidth|)
           

(il:* il:|;;;| " PCL Utils")

           (il:functions pcl::objectp pcl::instance-of-p 
                  pcl::understands pcl::get-object-rec)
           

(il:* il:|;;;| "")

           (il:declare\: il:donteval@load il:doeval@compile 
                  il:dontcopy il:compilervars
                  (il:addvars (il:nlama)
                         (il:nlaml lispx-send)
                         (il:lama window-when-held-fn 
                                window-when-held-fn 
                                web-window-expand-fn 
                                web-window-reshape-fn 
                                web-window-button-event-fn 
                                web-window-after-move-fn)))
           ))



(il:* il:|;;;| "***************************************")




(il:* il:|;;;| 
" Copyright (c) 1987 by Xerox Corporation.  All rights reserved."
)




(il:* il:|;;;| 
"Use and copying of this software and preparation of derivative works based upon this software are permitted.  Any distribution of this software or derivative works must comply with all applicable United States export control laws."
)




(il:* il:|;;;| 
"This software is made available AS IS, and Xerox Corporation makes no  warranty about the software, its performance or its conformity to any specification."
)




(il:* il:|;;;| 
"Any person obtaining a copy of this software is requested to send their name and post office or electronic mail address to:"
)




(il:* il:|;;;| "   CLOS Coordinator")




(il:* il:|;;;| "   Xerox Artifical Intelligence Systems   ")




(il:* il:|;;;| "   2550 Hanover St.")




(il:* il:|;;;| "   Palo Alto, CA 94303")




(il:* il:|;;;| 
"(or send internet mail to CLOSSupport.pa@Xerox.arpa)")




(il:* il:|;;;| " ****************************************")




(il:* il:|;;;| "")




(il:* il:|;;;| "Print out a copyright notice when loading")




(il:* il:|;;;| "")

(format t "~&;WEB-EDITOR Copyright (c) 1987, Xerox Corporation.  All rights reserved.~%"
       )



(il:* il:|;;;| "")




(il:* il:|;;;| "PACKAGE STUFF")


(il:putprops il:web-editor il:makefile-environment 
             (:package (defpackage "WEB"
                              (:use "PCL" "CL" "XCL")
                              (:nicknames "WEB-EDITOR"))
                    :readtable "XCL"))



(il:* il:|;;| "")




(il:* il:|;;;| "WEB EDITOR ")




(il:* il:|;;| "")




(il:* il:|;;| "Global Variables")




(il:* il:|;;| 
"global for cross-editor boxed node destination (like caret for current tty process copy and move destinations)"
)


(defglobalparameter destination-browser nil "global for cross-editor boxed node destination (like caret for current tty process copy and move destinations)"
)




(il:* il:|;;| "")




(il:* il:|;;| "Web Node Class")


(defclass web-node nil ((name      (il:* il:\; 
                                   "Name of Node")
)
                        (to-links  (il:* il:\; 
                        "Nodes that this Node has Links TO")
)))


(defmethod get-label ((object web-node))
   (slot-value object 'name))


(defmethod get-to-links ((object web-node))
   (slot-value object 'to-links))


(defmethod object-name ((object web-node))
   (slot-value object 'name))




(il:* il:|;;| " Web Editor  Class")


(defclass web-editor
   nil ((box-line-width :allocation :class 
      
      (il:* il:|;;| "width to make box for BoxNode")

               :initform 1)
        (local-commands :allocation :class 
      
      (il:* il:|;;| "messages that should be sent to browser when item seleted in menu, even if object does understand them")

               :initform
               (box-node recompute add-root))
      
      (il:* il:|;;| "Window ITEMS")

        (window)
        (title :initform "Web Editor" 
                                   (il:* il:\; 
                "If not NIL will be put in title of window")
)
        (cache-menu-p :initform t)
        (menu-cache                (il:* il:\; 
               "Will Cache Menus only if CACHE-MENU-P is T")
)
        (title-items :allocation :class 
      
      (il:* il:|;;| 
      "Items for menu of selections in title of window")

               :initform
               (("Recompute" recompute ""
                       (il:subitems ("Save Value" 
                                           save-in-it 
                                "(SavedValue)← thisBrowser"
                                           )
                              ("Recompute" recompute 
                  "Recompute lattice from starting objects"
                                     )
                              ("Recompute Labels" 
                                     recompute-labels 
                                    "Recomputes the labels"
                                     )
                              ("Recompute In Place" 
                                     recompute-in-place 
                 "Recompute keeping current view in window"
                                     )
                              ("Shape To Hold" 
                                     shape-to-hold 
     "Make window large or small enough to just hold graph"
                                     )
                              ("Change Font Size" 
                                     change-font-size 
                                   "Choose a new size Font"
                                     )
                              ("Change Format" 
                                     change-format 
                   "Change format between lattice and tree"
                                     )))
                ("Add Root" add-root ""
                       (il:subitems ("Add Root" add-root 
               "Add named item to startingList for browser"
                                           )
                              (il:|RemoveFromBadList|
                               remove-from-bad-list 
             "Restore item previously deleted from browser"
                               ))
                       
               "Add named item to startingList for browser"
                       )))
        (left-button-items :allocation :class 
      
      (il:* il:|;;| "Menu items for LeftButton seletion -- Value sent as message to object or browser -- see LocalCommands")

               :initform
               (("Box Node" box-node "Draw box around selected node.
Unboxed by another BoxNode")
                ("Pretty Print" pp 
                       "Prettyprint selected item")))
        (shift-left-button-items :allocation :class 
                                   (il:* il:\; "Items to be done if Left button is selected in main window with SHIFT key down.")
)
        (middle-button-items :allocation :class 
      
      (il:* il:|;;| "Menu items for MiddleButton seletion -- Value sent as message to object or browser -- see LocalCommands")

               :initform
               (("Inspect" il:|Inspect| inspect 
                       "Inspect selected item")
                ("Edit" edit-object "Edit selected item")
                ("Delete From Browser" delete-from-browser 
                       "Do not show item or its subs")))
        (shift-middle-button-items :allocation :class 
                                   (il:* il:\; "Items to be done if Middle button is selected in main window with SHIFT key down.")
)
        (right-button-items :allocation :class :initform
               (("Close" (closew (("Close" closew)
                                  ("Destroy" destroy))))
                ("Snap" snap)
                ("Paint" paint)
                ("Clear" clear)
                ("Bury" bury)
                ("Repaint" repaint)
                ("Hardcopy" (hardcopy (("Hardcopy to File"
                                        hardcopy-to-file)
                                       (
                                      "Hardcopy to Printer"
                                        hardcopy-to-printer
                                        ))))
                ("Move" move)
                ("Shape" shape)
                ("Shrink" shrink)) (il:* il:\; 
             "Items to be done if Right button is selected")

               )
        (top-align                 (il:* il:\; "Flg used to indicate whether graph should be aligned with the top or bottom of the window")
)
        (starting-list :initform nil 
                                   (il:* il:\; 
             "list of objects used to compute this browser")
)
        (good-list :initform nil   (il:* il:\; 
                                "limit choices to this set")
)
        (bad-list :initform nil    (il:* il:\; 
                       "Don't put in any items on this set")
)
        (last-selected-object :initform nil 
                                   (il:* il:\; 
                                   "last object selected")
)
        (browse-font :initform
               (il:fontcreate '(il:helvetica 10 il:bold)))
        (browse-font-family :initform 'il:helvetica)
        (browse-font-face :initform 'il:bold)
        (label-max-lines :initform nil 
      
      (il:* il:|;;| "the maximum number of lines to use in 'boxed' labels -- note that if the label wont fit within the LabelMaxLines and LabelMaxCharsWidth restrictions, it will be truncated")
)
        (label-max-chars-width :initform nil 
                                   (il:* il:\; "the maximum width for labels -- if label is too big, it will be 'boxed'")
)
        (label-cache)
        (boxed-node :initform nil  (il:* il:\; 
                                  "last item Boxed, if any")
)
        (graph-format :initform '(il:lattice) 
                                   (il:* il:\; 
         "Controls format for laying out graph for GRAPHER")
)
        (graph-format-choices :allocation :class :initform
               ((il:horizontal/lattice '(il:lattice))
                (il:vertical/lattice '(il:vertical 
                                             il:lattice))
                (il:horizontal/tree '(il:copies/only))
                (il:vertical/tree '(il:vertical 
                                          il:copies/only)))
               )
        (show-graph-fn :initform #'il:showgraph 
      
      (il:* il:|;;| "The function to use to display the graph in the window.  This might want to be set to SHOWZOOMGRAPH.")
)
        (left                      (il:* il:\; 
                                  "left position of window")
)
        (bottom                    (il:* il:\; 
                                "bottom position of window")
)
        (width :initform 64)
        (height :initform 32)))


(defmethod get-label ((il:|self| web-editor)
                      il:|object|) (il:* il:\; "Get a label for an object to be displayed in the browser.")
 (get-label il:|object|))


(defmethod get-subs ((il:|self| web-editor)
                     il:|object|)  (il:* il:\; 
           "Gets a set of subs from an object for browsing")
 (get-to-links il:|object|))




(il:* il:|;;| "Window Interface")


(defmethod initialize ((self web-editor)
                       ignore) 
      
      (il:* il:|;;| "the ignored parameter is to keep the lambda list congruent with pcl::initialize which people import since it appears in pcl::*other-exports*.")
 (let ((window (slot-value self 'window)))
      (il:|if| (not window)
          il:|then| (create-window self)
                (setq window (slot-value self 'window)))
      (il:windowprop window 'web-editor self)
      (il:windowprop window 'il:iconfn 'web-window-icon-fn)
      (il:windowprop window 'il:buttoneventfn '
             web-window-button-event-fn)
      (il:windowaddprop window 'il:aftermovefn '
             web-window-after-move-fn)
      (il:windowaddprop window 'il:reshapefn '
             web-window-reshape-fn)
      (il:windowaddprop window 'il:closefn '
             web-window-close-fn)
      (il:windowprop window 'il:iconfn 'web-window-icon-fn)
      window))


(defmethod create-window ((self web-editor)) 
                                   (il:* il:\; 
                                   "10-Apr-86 14:32")
                                   (il:* il:\; "Create the Lisp window for this window but don't open it.")

 (setf (slot-value self 'window)
       (il:createw (il:createregion il:lastmousex 
                          il:lastmousey 25 25)
              (slot-value self 'title)
              nil t)))


(defmethod detach-lisp-window ((self web-editor)) 
                                   (il:* il:\; 
                                   " 8-Apr-87 17:25")
 

(il:* il:|;;;| "Forget about the current lisp window")

 (let ((val (slot-value self 'window)))
      (il:|if| (il:windowp val)
          il:|then| (setf (slot-value self 'window)
                          nil)
                (il:windowprop val 'web-editor nil)
                (il:windowprop val 'il:rightbuttonfn nil)
                (il:windowprop val 'il:buttoneventfn nil)
                nil
        il:|else| nil)))


(defmethod has-lisp-window ((self web-editor)) 
                                   (il:* il:\; 
                                   "24-Sep-85 18:34")
                                   (il:* il:\; "Checks if a Lisp window has ever been created for this Loops Window")

 (il:windowp (slot-value self 'window)))


(defmethod set-outer-region ((self web-editor)
                             region no-update-flg) 
                                   (il:* il:\; 
                                   "16-Apr-86 13:21")
 

(il:* il:|;;;| "Make Loops Window have region parameters")

 (setf (slot-value self 'left)
       (il:|fetch| il:left il:|of| region))
 (setf (slot-value self 'bottom)
       (il:|fetch| il:bottom il:|of| region))
 (setf (slot-value self 'width)
       (il:|fetch| il:width il:|of| region))
 (setf (slot-value self 'height)
       (il:|fetch| il:height il:|of| region))
 (il:|if| (not no-update-flg)
     il:|then| (update self))
 region)


(defmethod set-region ((self web-editor)
                       region &optional no-update-flg) 
                                   (il:* il:\; 
                                   "16-Apr-86 13:22")
 

(il:* il:|;;;| "Make Loops Window have region parameters")

 (set-outer-region self
        (il:createregion (il:|fetch| il:left il:|of| region
                                )
               (il:|fetch| il:bottom il:|of| region)
               (il:widthifwindow (il:|fetch| il:width
                                    il:|of| region)
                      (il:windowprop (slot-value
                                      self
                                      'window)
                             'il:border))
               (il:heightifwindow
                (il:|fetch| il:height il:|of| region)
                (slot-value self 'title)
                (il:windowprop (slot-value self
                                      'window)
                       'il:border)))
        no-update-flg))


(defmethod update ((self web-editor)) 
                                   (il:* il:\; 
                                   "29-Sep-86 11:56")

   

(il:* il:|;;;| 
"make the Lisp window be consistent with ivs")

   (let*
    ((window (slot-value self 'window))
     (region
      (and (slot-value self 'width)
           (slot-value self 'height)
           (il:|create| il:region
                  il:left il:←
                  (or (slot-value self 'left)
                      (setf (slot-value self 'left)
                            il:lastmousex))
                  il:bottom il:←
                  (or (slot-value self 'bottom)
                      (setf (slot-value self 'bottom)
                            il:lastmousey))
                  il:width il:← (slot-value self
                                       'width)
                  il:height il:← (slot-value self
                                        'height)))))
    (cond
       ((and region (not (il:equal region
                                (il:windowprop window
                                       'il:region))))
                                   (il:* il:\; "The shape has changed.  --- This is complicated because of ATTACHEDWINDOWS.")

        (let*
         ((attached-windows (il:windowprop window
                                   'il:attachedwindows))
          (attachment-specs
           (il:|for| il:\w il:|in| attached-windows
              il:|collect| (list (il:windowprop
                                  il:\w
                                  'il:dowindowcomfn)
                                 (il:windowprop
                                  il:\w
                                  'il:whereattached)
                                 (il:windowprop
                                  il:\w
                                  'il:passtomaincoms)))))
         (il:|for| il:\w il:|in| attached-windows
            il:|do| (il:detachwindow il:\w))
         (il:shapew window region)
         (il:|for| il:\w il:|in| attached-windows
            il:|as| il:|spec| il:|in| attachment-specs
            il:|do| (il:attachwindow il:\w window
                           (caadr il:|spec|)
                           (cdadr il:|spec|))
                  (il:windowprop il:\w 'il:dowindowcomfn
                         (car il:|spec|))
                  (il:windowprop il:\w 'il:passtomaincoms
                         (caddr il:|spec|))))))
    (and (not (il:equal (slot-value self 'title)
                     (il:windowprop window 'il:title)))
         (il:windowprop window 'il:title
                (slot-value self 'title)))))


(defmethod move ((self web-editor)
                 x-or-pos &optional y) 
                                   (il:* il:\; 
                                   "11-Sep-86 13:24")

   

(il:* il:|;;;| "Move the window")

   (move1
    self
    (or x-or-pos
        (let* ((entire-region (il:windowregion
                               (slot-value self
                                      'window)))
               (pos (il:getboxposition (il:|fetch| il:width
                                          il:|of| 
                                              entire-region
                                              )
                           (il:|fetch| il:height
                              il:|of| entire-region)
                           (il:|fetch| il:left il:|of|
                                               
                                              entire-region
                                  )
                           (il:|fetch| il:bottom
                              il:|of| entire-region))))
              (il:|create|
               il:position
               il:xcoord il:←
               (il:plus (il:|fetch| il:xcoord il:|of|
                                              pos)
                      (il:difference (slot-value
                                      self
                                      'left)
                             (il:|fetch| il:left
                                il:|of| entire-region)))
               il:ycoord il:←
               (il:plus (il:|fetch| il:ycoord il:|of|
                                              pos)
                      (il:difference (slot-value
                                      self
                                      'bottom)
                             (il:|fetch| il:bottom
                                il:|of| entire-region))))))
    y))


(defmethod move1 ((self web-editor)
                  x-or-pos y)      (il:* il:\; 
                                   "13-Aug-86 19:10")

   

(il:* il:|;;;| "Move the window")

   (let
    ((needs-update?
      (or (not (has-lisp-window self))
          (not (il:subregionp (il:constant (il:createregion
                                            0 0 
                                            il:screenwidth 
                                            il:screenheight
                                            ))
                      (il:windowprop (slot-value
                                      self
                                      'window)
                             'il:region))))))
    (prog1 (il:movew (slot-value self 'window)
                  x-or-pos y)      (il:* il:\; "The left and right IVs are updated by the message AfterMove")

           (cond
              (needs-update? (update self))))))


(defmethod after-move ((self web-editor)) 
                                   (il:* il:\; 
                                   "10-Apr-86 16:10")
 

(il:* il:|;;;| 
"The window has been moved.  Update the left and bottom")

 (let ((region (il:windowprop (slot-value self 'window)
                      'il:region)))
      (setf (slot-value self 'left)
            (il:|fetch| il:left il:|of| region))
      (setf (slot-value self 'bottom)
            (il:|fetch| il:bottom il:|of| region))))


(defmethod after-reshape ((self web-editor)
                          old-bitmap-image old-region 
                          old-screen-region) 
                                   (il:* il:\; 
                                   "10-Apr-86 16:12")
 

(il:* il:|;;;| "The window has been reshaped")

 (let ((region (il:windowprop (slot-value self 'window)
                      'il:region)))
      (setf (slot-value self 'left)
            (il:|fetch| il:left il:|of| region))
      (setf (slot-value self 'bottom)
            (il:|fetch| il:bottom il:|of| region))
      (setf (slot-value self 'width)
            (il:|fetch| il:width il:|of| region))
      (setf (slot-value self 'height)
            (il:|fetch| il:height il:|of| region))
      (il:reshapebyrepaintfn (slot-value self 'window)
             old-bitmap-image old-region old-screen-region)
      ))


(defmethod scroll-window ((self web-editor)
                          dsp-x dsp-y window-x window-y) 
                                   (il:* il:\; 
                                   "10-Apr-86 14:58")
 

(il:* il:|;;;| "scroll the window to set the point dspX,dspY in the given window position -- default is the lower left corner.  If any x or y is a FIXP, it is treated as a absolute position.  If FLOATP, it is treated as a relative position.  Return the position of the new lower left corner.")

 (let* ((window (slot-value self 'window))
        (visible-region (il:dspclippingregion nil window))
        (extent (il:windowprop window 'il:extent)))
                                   (il:* il:\; 
  "figure out what to do with default and relative offsets")

       (il:setq window-x
        (il:|if| (null window-x)
            il:|then| 0
          il:|elseif| (il:floatp window-x)
            il:|then| (il:fix (il:times window-x
                                     (il:windowprop
                                      window
                                      'il:width)))
          il:|else| window-x))
       (il:setq window-y
        (il:|if| (null window-y)
            il:|then| 0
          il:|elseif| (il:floatp window-y)
            il:|then| (il:fix (il:times window-y
                                     (il:windowprop
                                      window
                                      'il:height)))
          il:|else| window-y))
       (il:setq dsp-x
        (il:|if| (null dsp-x)
            il:|then| (il:|fetch| il:left il:|of| 
                                             visible-region
                             )
          il:|elseif| (il:floatp dsp-x)
            il:|then| (il:fix (il:times dsp-x
                                     (il:|fetch| il:width
                                        il:|of| extent)))
          il:|else| dsp-x))
       (il:setq dsp-y
        (il:|if| (null dsp-y)
            il:|then| (il:iminus (il:|fetch| il:bottom
                                    il:|of| visible-region)
                             )
          il:|elseif| (il:floatp dsp-y)
            il:|then| (il:fix (il:times dsp-y
                                     (il:|fetch| il:height
                                        il:|of| extent)))
          il:|else| dsp-y))
       (il:scrollw window
              (il:iplus window-x
                     (il:idifference (il:|fetch| il:left
                                        il:|of| 
                                             visible-region
                                            )
                            dsp-x))
              (il:iplus window-y
                     (il:idifference (il:|fetch| il:bottom
                                        il:|of| 
                                             visible-region
                                            )
                            dsp-y)))
                                   (il:* il:\; 
                            "return the resulting position")

       (il:setq visible-region (il:dspclippingregion nil 
                                      window))
       (il:|create| il:position
              il:xcoord il:← (il:|fetch| il:left
                                il:|of| visible-region)
              il:ycoord il:← (il:|fetch| il:bottom
                                il:|of| visible-region))))


(defmethod get-prompt-window ((self web-editor)
                              lines font-def) 
                                   (il:* il:\; 
                                   " 8-Apr-87 15:43")
 

(il:* il:|;;;| "Return the current prompt window")

 (let ((w (il:getpromptwindow (slot-value self 'window)
                 (or lines 2)
                 (il:fontcreate font-def))))
      (il:|if| font-def
          il:|then| (il:dspfont (il:fontcreate font-def)
                           w))
      w))


(defmethod prompt-print ((self web-editor)
                         prompt)   (il:* il:\; 
                                   "13-Aug-86 18:46")
 

(il:* il:|;;;| 
"Prints out a prompt in an attached prompt window")

 (il:prin1 prompt (get-prompt-window self)))


(defmethod prompt-read ((self web-editor)
                        msg)       (il:* il:\; 
                                   "13-Aug-86 19:15")
 

(il:* il:|;;;| "Prompt the user for some input, using an attached prompt window")

 (let ((p-window (get-prompt-window self)))
      (il:clearw p-window)
      (il:|PromptRead| msg p-window t)))


(defmethod prompt-for-list ((self web-editor)
                            prompt-str initial-string) 
                                   (il:* il:\; 
                                   " 8-Apr-87 16:44")
 

(il:* il:|;;;| 
"Prompt user in prompt window for a list of words.")

 (let ((p-window (get-prompt-window self)))
      (il:resetform (il:ttydisplaystream p-window)
             (il:clearw p-window)
             (il:ttyin prompt-str nil nil '(il:noraise) nil 
                    nil initial-string))))


(defmethod prompt-for-string ((self web-editor)
                              prompt-str initial-str) 
                                   (il:* il:\; 
                                   "13-Aug-86 18:42")
 

(il:* il:|;;;| "Prompt user in prompt window for a string.")

 (let ((p-window (get-prompt-window self)))
      (il:resetform (il:ttydisplaystream p-window)
             (il:clearw p-window)
             (il:ttyin prompt-str nil nil
                    '(string il:noraise) nil nil 
                    initial-str))))


(defmethod prompt-for-word ((self web-editor)
                            &optional prompt-str 
                            initial-word) 
                                   (il:* il:\; 
                                   " 8-Apr-87 16:43")
 

(il:* il:|;;;| "Prompt user in prompt window for a word.")

 (car (prompt-for-list self prompt-str initial-word)))


(defmethod clear ((self web-editor)) 
                                   (il:* il:\; 
    "empty the window of active regions, return the window")
 (il:windowprop (slot-value self 'window)
        'il:graph nil)
 (call-next-method self)
 (slot-value self 'window))


(defmethod icon-title ((self web-editor)) 
                                   (il:* il:\; 
                                   "18-Jan-85 15:35")
 

(il:* il:|;;;| "Compute the icont title for this browser")

 '|Web Editor|)

(il:defineq

(web-window-after-move-fn
  (lambda (window)           (il:* il:\; 
                            "Edited 13-Jul-87 15:59 by Rao")
                                   (il:* il:\; 
                                   "10-Apr-86 16:16")

(il:* il:|;;;| "The SimpleWindow AFTERMOVEFN")

         (let ((w (il:windowprop window 'web-editor)))
              (and w (after-move w)))))

(web-window-button-event-fn
  (lambda (window)           (il:* il:\; 
                            "Edited 13-Jul-87 13:38 by Rao")
                                   (il:* il:\; 
                                   "11-Sep-86 13:50")

         (let ((window-for-menu (il:windowprop window
                                       'web-editor)))
              (declare (il:specvars window-for-menu))
              (il:totopw window)
              (button-event-fn window-for-menu))))

(web-window-reshape-fn
  (lambda (window il:|oldBitmapImage| il:|oldRegion| 
                 il:|oldScreenRegion|)
                             (il:* il:\; 
                            "Edited 12-Jun-87 15:56 by Rao")
                                   (il:* il:\; 
                                   " 9-May-86 10:07")

(il:* il:|;;;| "The RESHAPEFN for a Window")

         (let ((il:\w (il:windowprop window 'web-editor)))
              (and il:\w (after-reshape il:\w 
                                il:|oldBitmapImage| 
                                il:|oldRegion|)))))

(web-window-close-fn
  (il:lambda (window)        (il:* il:\; 
                            "Edited 12-Jun-87 11:42 by Rao")
                                   (il:* il:\; 
                          "Remove link back to LoopsWindow")

    (il:windowprop window 'web-editor nil)))

(il:|PromptRead|
  (il:lambda (prompt-string window same-line?)
                             (il:* il:\; 
                            "Edited 20-Jul-87 16:20 by Rao")
                                   (il:* il:\; "Printout promptString in promptwindow and return value of expression read there")

    (prog (newvalue)
          (il:resetlst (il:resetsave (il:ttydisplaystream
                                      (or window 
                                          il:promptwindow))
                              )
                 (il:resetsave (il:tty.process (
                                            il:this.process
                                                )))
                 (il:clrprompt)
                 (il:resetsave (il:printlevel 4 3))
                 (il:|printout| t prompt-string)
                 (il:|if| same-line?
                     il:|then| (il:|printout| t "> ")
                   il:|else| (il:|printout| t t "> "))
                 (il:clearbuf t t) (il:* il:\; 
    "clear tty buffer because it sometimes has stuff left.")

                 (il:allow.button.events)
                 (il:setq newvalue
                  (car (il:ersetq (il:ttyinread t t)))))
          (return newvalue))))
)
(il:defineq

(web-window-expand-fn
  (lambda (window)           (il:* il:\; 
                            "Edited 21-Jul-87 07:43 by Rao")
                                   (il:* il:\; 
                                   "19-Feb-85 13:58")

(il:* il:|;;;| "When a browser window is expanded, it should be recomputed")

         (let ((self (il:windowprop window 'web-editor)))
              (recompute-in-place self))))
)

(defun web-window-icon-fn (window icon)
   (let nil (or icon (il:titlediconw
                      *web-editor-template*
                      (icon-title (il:windowprop
                                   window
                                   'web-editor))
                      nil nil nil 'il:bottom
                      (il:constant (list (il:charcode
                                          "-")
                                         (il:charcode
                                          il:space)
                                         (il:charcode
                                          il:eol)))))))


(il:rpaqq *web-editor-icon-bm* #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@L@@@@@@@@@@AL@@@L@@@@@@@@@@AF@@@L@@@@@@@@@@AC@@@L@@@@@@@@@@AAH@@L@@@@@@@@@@A@L@@L@@@@@@@@@@A@F@@LOON@@@@@@OO@C@@LOON@@@@@@OO@AH@LOOO@@@@@@OO@@L@LOONH@@@@AOO@@F@LOOND@@@@BOOOOO@L@@@B@@@@DOOOHC@L@@@ACOOLH@@@@C@L@@@@KOOM@@@@@C@L@@@@GOON@@@@@C@L@@@@KOOM@@@@@C@L@@@ACOOLH@@@@C@LOOOB@@@@DOOOHC@LOOOD@@@@BOOOHC@LOOOH@@@@AOOOHC@LOOOD@@@@@OOOHC@LOOOB@@@@@OOOHC@L@@@ACOOO@@@@@C@L@@@@KOOO@@@@@C@L@@@@GOOO@@@@@C@L@@@@COOO@@@@@C@L@@@@COOO@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@
)

(il:rpaqq *web-editor-icon-mask* #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOON@@@OOOOOOOOOOOOO@@@OOOOOOOOOOOOOH@@OOOOOOOOOOOOOL@@OOOOOOOOOOOOON@@OOOOOOOOOOOOOO@@OOOOOOOOOOOOOOH@OOOOOOOOOOOOOOL@OOOOOOOOOOOOOON@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@
)

(defvar *web-editor-template* (il:|create| il:titledicon 
                                     il:icon il:← 
                                     *web-editor-icon-bm* 
                                     il:mask il:← 
                                     *web-editor-icon-mask* 
                                     il:titlereg il:←
                                     (il:createregion
                                      5 2 50 30)) )


(il:rpaq il:*d-window-default-stream* il:promptwindow)

(defmacro il:|CopyDown?| nil

(il:* il:|;;;| "Is the Copy button down?")

                         '(or (il:keydownp 'il:copy)
                              (il:shiftdownp 'il:1shift)))


(defmacro il:|MetaDown?| nil 

(il:* il:|;;;| "Is the Meta button down?")

                             '(il:shiftdownp 'il:meta))


(defmacro il:|MoveDown?| nil

(il:* il:|;;;| "Is the Meta button down?")

                         '(or (il:keydownp 'il:move)
                              (il:shiftdownp 'il:ctrl)))




(il:* il:|;;| "Layout and Display Engine")


(defmethod browse ((self web-editor)
                   &optional browse-list window-or-title 
                   good-list position) 
                                   (il:* il:\; 
                                   "11-Sep-84 07:24")
                                   (il:* il:\; 
 "Call Show and then shape to hold and move for first time")

 (show self browse-list window-or-title good-list)
 (shape-to-hold self)
 (move self position))


(defmethod show ((self web-editor)
                 browse-list window-or-title good-list) 

(il:* il:|;;;| 
"Show the items and their subs on a browse window.")
 

(il:* il:|;;;| "If windowOrTitle is not a window it will be used as a title for a window which will be created.")

 (cond
    ((il:windowp window-or-title)
     (setf (slot-value self 'window)
           window-or-title))
    (window-or-title (setf (slot-value self 'title)
                           window-or-title)))
 (cond
    ((and browse-list (il:nlistp browse-list))
     (il:setq browse-list (list browse-list))))
 (setf (slot-value self 'starting-list)
       browse-list)
      
      (il:* il:|;;| "The Next TWO forms are somewhat bogus, but work for the interim")

 (setf (slot-value self 'starting-list)
       (il:|for| c il:|in| browse-list
          il:|when| (pcl::get-object-rec c)
          il:|collect| (pcl::get-object-rec c)))
 (and good-list (setf (slot-value self 'good-list)
                      (il:|for| c il:|in| good-list
                         il:|when| (pcl::get-object-rec
                                    c)
                         il:|collect| (pcl::get-object-rec
                                       c))))
 (display-browser self))


(defmethod display-browser ((self web-editor)) 
                                   (il:* il:\; 
                                   "29-Sep-86 12:15")
                                   (il:* il:\; 
                                   "New method template")

 (let ((nodelst (and (slot-value self 'starting-list)
                     (get-node-list self
                            (slot-value self 'starting-list
                                   )
                            (slot-value self 'good-list))))
       )                           (il:* il:\; "window should be invert so that links etc.  can be erased")

      (il:dspoperation 'il:invert (slot-value self
                                         'window))
      (cond
         (nodelst (il:apply* (slot-value self '
                                    show-graph-fn)
                         (il:layoutgraph
                          nodelst
                          (tree-roots nodelst)
                          (slot-value self 'graph-format)
                          (slot-value self 'browse-font))
                         (slot-value self 'window)
                         nil nil (slot-value self
                                        'top-align))
                                   (il:* il:\; 
                         "kludge to reset the window props")

                (initialize self)
                (il:windowprop (slot-value self
                                      'window)
                       'il:title
                       (slot-value self 'title))
                                   (il:* il:\; 
   "kludge: because GRAPHER adds its own COPYBUTTONEVENTFN")

                (il:windowprop (slot-value self
                                      'window)
                       'il:copybuttoneventfn nil))
         (t (clear self)))))


(defmethod browser-objects ((il:|self| web-editor)) 
                                   (il:* il:\; 
                                   "28-May-84 12:58")
                                   (il:* il:\; 
    "Return a list of all the objects shown in the browser")

 (il:|for| il:|node|
    il:|in| (il:|fetch| il:graphnodes
               il:|of| (il:windowprop (slot-value
                                       il:|self|
                                       'window)
                              'il:graph))
    il:|when| (il:nlistp (car il:|node|))
    il:|collect| (car il:|node|)))


(defmethod get-node-list ((self web-editor)
                          browse-list good-list) 
                                   (il:* il:\; 
                                   "21-Mar-85 14:09")

      
      (il:* il:|;;| "Compute the node data structures of the tree starting at browseList.  If goodList is given, only include elements of it.  If goodList=T make it be browseList.")

   (declare (il:globalvars il:whiteshade))
   (cond
      ((eq good-list t)
       (il:setq good-list browse-list)))
   (prog (subs pair node
               (old-nodes (il:|fetch| il:graphnodes
                             il:|of|
                             (il:windowprop
                              (slot-value self 'window)
                              'il:graph)))
               (obj-list (cons)))
      
      (il:* il:|;;| "first make objList which is a list of pairs (object  . objName).  objName will be used as a title for a node in the browser.  This structure will be replaced by a graphNode when it is processed.  The nodeID of the graphNode will be the object, and the label will be the name.")

         (il:|for| il:|objOrName| il:|in| browse-list
            il:|do| (and (il:setq pair (obj-name-pair
                                        self il:|objOrName|
                                        ))
                         (not (il:fassoc (car pair)
                                     (car obj-list)))
                         (il:tconc obj-list pair)))

(il:* il:|;;;| 
"Now MAP ON list so pair can be replaced by graphNode")

         (il:|for| pair il:|name| il:|obj| il:|subObjs|
            il:|on| (car obj-list)
            il:|when| (il:nlistp (il:setq il:|name|
                                  (cdar pair)))
            il:|do|
            (il:setq il:|subObjs| (cons))
            (il:|for| il:|sub| il:|objPair| il:|obj1|
               il:|in| (get-subs self (il:setq il:|obj|
                                       (caar pair)))
               il:|do| 
      
      (il:* il:|;;| "ObjNamePair returns NIL for destroyed objects.  include only members of goodList in subs if given.  Add to objList only once")

                     (il:setq il:|obj1|
                      (cond
                         ((eq (car il:|sub|)
                              'il:|Link Parameters|)
                          (cadr il:|sub|))
                         (t il:|sub|)))
                     (cond
                        ((il:setq il:|objPair|
                          (obj-name-pair self il:|obj1|))
                         (cond
                            ((not (il:fassoc il:|obj1|
                                         (car obj-list)))
                             (il:tconc obj-list 
                                    il:|objPair|)))
                         (il:tconc il:|subObjs| il:|sub|)))
                   )
            (rplaca
             pair
             (il:setq node
              (or (il:fassoc il:|obj| old-nodes)
                  (il:|create|
                   il:graphnode
                   il:nodeid il:← il:|obj|
                   il:nodeborder il:←
                   (list (il:add1 (slot-value self
                                         'box-line-width))
                         il:whiteshade)))))
            (il:|replace| il:tonodes il:|of| node
               il:|with| (car il:|subObjs|))
            (il:|replace| il:nodelabel il:|of| node
               il:|with| il:|name|)
            (il:|replace| il:nodefont il:|of| node
               il:|with| (slot-value self 'browse-font))
            (il:|replace| il:nodewidth il:|of| node
               il:|with| nil)
            (il:|replace| il:nodeheight il:|of| node
               il:|with| nil))
         (return (car obj-list))))


(defmethod graph-fits ((|self| web-editor)) 
                                   (il:* il:\; 
                                   "24-Apr-86 15:00")
 

(il:* il:|;;;| "Tests if graph fits in region")

 (let ((|window| (slot-value |self| 'window)))
      (let ((|width| 0)
            (|height| 0)
            (|region| (il:windowprop |window| 'il:region))
            (|nodes| (il:|fetch| il:graphnodes
                        il:|of| (il:windowprop |window|
                                       'il:graph))))
           (cond
              (|nodes| (il:setq |width|
                        (il:widthifwindow
                         (il:idifference (il:max/right
                                          |nodes|)
                                (il:min/left |nodes|))
                         (il:windowprop |window|
                                'il:border)))
                     (il:setq |height|
                      (il:heightifwindow
                       (il:idifference (il:max/top |nodes|)
                              (il:min/bottom |nodes|))
                       (il:windowprop |window| 'il:title)
                       (il:windowprop |window| 'il:border))
                      )))
           (not (or (il:igreaterp |width|
                           (il:|fetch| il:width
                              il:|of| |region|))
                    (il:igreaterp |height|
                           (il:|fetch| il:height
                              il:|of| |region|)))))))


(defmethod node-region ((il:|self| web-editor)
                        il:|object|) 
                                   (il:* il:\; 
                                   "10-Dec-84 18:26")
 

(il:* il:|;;;| "what region does the object occupy in the display stream?")

 (let ((il:|node| (il:fassoc
                   (cond
                      ((il:litatom il:|object|)
                       (il:setq il:|object| (
                                          il:|GetObjectRec|
                                             il:|object|)))
                      (t il:|object|))
                   (il:|fetch| il:graphnodes
                      il:|of| (il:windowprop
                               (slot-value il:|self|
                                      'window)
                               'il:graph)))))
      (il:|if| il:|node|
          il:|then| (il:|create| il:region
                           il:left il:←
                           (il:idifference
                            (il:|fetch| il:xcoord
                               il:|of| (il:|fetch| 
                                            il:nodeposition
                                          il:|of| il:|node|
                                              ))
                            (il:iquotient (il:|fetch|
                                           il:nodewidth
                                             il:|of| 
                                                  il:|node|
                                           )
                                   2))
                           il:bottom il:←
                           (il:idifference
                            (il:|fetch| il:ycoord
                               il:|of| (il:|fetch| 
                                            il:nodeposition
                                          il:|of| il:|node|
                                              ))
                            (il:iquotient (il:|fetch|
                                           il:nodeheight
                                             il:|of| 
                                                  il:|node|
                                           )
                                   2))
                           il:width il:←
                           (il:|fetch| il:nodewidth
                              il:|of| il:|node|)
                           il:height il:←
                           (il:|fetch| il:nodeheight
                              il:|of| il:|node|)))))


(defmethod clear-label-cache ((|self| web-editor)
                              |objects| &aux |cachedLabel|) 
                                   (il:* il:\; 
                                   " 5-Dec-85 12:02")

   

(il:* il:|;;;| "Delete the cached label for these items")

   (cond
      ((eq |objects| t)
       (setf (slot-value |self| 'label-cache)
             nil))
      (t
       (if (atom |objects|)
           (setq |objects| (cons |objects|)))
       (il:|for| il:|item| il:|in| |objects|
          il:|do| (if (setq |cachedLabel|
                            (il:assoc |objects|
                                   (slot-value |self|
                                          'label-cache)))
                      (setf (slot-value |self| 'label-cache
                                   )
                            (il:dremove |cachedLabel|
                                   (slot-value |self|
                                          'label-cache)))))
       )))




(il:* il:|;;| "Button Events")


(defmethod button-event-fn ((self web-editor)) 
                                   (il:* il:\; 
                                   " 2-Jan-86 16:41")
                                   (il:* il:\; 
    "Called when there is a button event in a Loops Window")

 (let ((window (slot-value self 'window)))
      (or (il:ersetq (cond
                        ((null (il:insidep (
                                       il:dspclippingregion
                                            nil window)
                                      (il:lastmousex window
                                             )
                                      (il:lastmousey window
                                             )))
                         (title-selection self))
                        ((il:mousestate il:left)
                         (left-selection self))
                        ((il:mousestate il:middle)
                         (middle-selection self))
                        ((il:mousestate il:right)
                         (right-selection self)))))))


(defmethod choice-menu ((self web-editor)
                        item-cv)   (il:* il:\; 
                                   "29-Dec-85 13:54")
      
      (il:* il:|;;| "Create a menu which allows subitems to be displayed.  Cache it in  the web-editor ")

 (let (items menu)
      (setq menu (rest (assoc item-cv (slot-value
                                       self
                                       'menu-cache))))
      (cond
         ((and menu (il:type? il:menu menu))
          (il:menu menu))
         ((not (listp (setq items (get-menu-items self 
                                         item-cv))))
          items)
         (t (il:setq menu
             (il:create il:menu
                    il:items il:← items
                    il:whenselectedfn il:← '
                    web-menu-whenselectedfn
                    il:whenheldfn il:← 'window-when-held-fn
                    il:changeoffsetflg il:← t
                    il:centerflg il:← t))
                                   (il:* il:\; 
                                 "Cache menu if menus is T")

            (if (slot-value self 'cache-menu-p)
                (setf (slot-value self 'menu-cache)
                      (acons item-cv menu
                             (slot-value self 'menu-cache))
                      ))
            (il:menu menu)))))


(defmethod when-menu-item-held ((self web-editor)
                                item menu key) 
                                   (il:* il:\; 
                                   " 8-Apr-87 17:13")
 

(il:* il:|;;;| "What to do when the menu item is held")

 (il:promptprint (or (cond
                        ((il:nlistp item)
                         nil)
                        (t (caddr item)))
                     
                 "When released this item will be selected"
                     )))


(defmethod item-menu ((self web-editor)
                      items title) (il:* il:\; 
                                   "21-Apr-84 09:31")
                                   (il:* il:\; "Create a simnple (one level) menu which will not overflow height of screen")

 (il:|create| il:menu
        il:items il:← items
        il:menucolumns il:←
        (il:add1 (il:iquotient (il:itimes (il:fontheight
                                           il:menufont)
                                      (il:length items))
                        750))
        il:title il:← title
        il:changeoffsetflg il:← t))


(defmethod get-menu-items ((self web-editor)
                           item-cv) 
                                   (il:* il:\; 
                                   "23-Oct-84 12:36")
                                   (il:* il:\; 
                                   "Get item list for menu")

 (slot-value self item-cv))


(defmethod clear-menu-cache ((self web-editor)) 
                                   (il:* il:\; 
                                   "11-Apr-86 14:46")
                                   (il:* il:\; 
                              "Delete Menus saved on menus")

 (setf (slot-value self 'menu-cache)
       nil)
 self)


(defmethod left-choice ((self web-editor)) 
                                   (il:* il:\; 
                                   " 8-Apr-87 17:10")
 

(il:* il:|;;;| "Get the choices from the LeftButtonItems")

 (declare (il:specvars window-for-menu))
 (let ((window-for-menu self))
      (il:getmousestate)
      (choice-menu self (cond
                           ((and (il:|MetaDown?|)
                                 (slot-value self
                                        '
                                    shift-left-button-items
                                        ))
                            'shift-left-button-items)
                           (t 'left-button-items)))))


(defmethod middle-choice ((self web-editor)) 
                                   (il:* il:\; 
                                   " 8-Apr-87 17:11")
 

(il:* il:|;;;| "Make choice for Middle Button down")

 (declare (il:specvars window-for-menu))
 (let ((window-for-menu self))
      (il:getmousestate)
      (choice-menu self (cond
                           ((and (il:|MetaDown?|)
                                 (get-menu-items
                                  self
                                  '
                                  shift-middle-button-items
                                  ))
                            'shift-middle-button-items)
                           (t 'middle-button-items)))))


(defmethod left-selection ((self web-editor)) 
                                   (il:* il:\; 
                                   "14-Jan-87 13:20")

   

(il:* il:|;;;| "Move object if CTRL down.  Do LeftShiftSelect if SHIFT down, else choose from LeftButtonItems")

   (let
    ((window (slot-value self 'window)))
    (cond
       ((il:|MoveDown?|)
        (il:resetlst (il:resetsave
                      nil
                      (list (il:function il:dspoperation)
                            (il:dspoperation 'il:invert 
                                   window)
                            window))
               (il:getmousestate)  (il:* il:\; 
                                   "Here to move a node.")

               (il:dspoperation 'il:invert window)
               (il:editmovenode window)))
       (t                          (il:* il:\; 
           "Here if left button depressed but not control.")

          (let ((lattice-browser self)
                (object (find-selected-node window)))
               (declare (il:specvars object lattice-browser
                               ))  (il:* il:\; 
                                  "SPECVARS for whenHeldFn")

               (cond
                  ((il:listp object)
                   (il:setq object (car object))))
               (cond
                  ((not (null object))
                   (setf (slot-value self '
                                last-selected-object)
                         object)))
               (il:getmousestate)
               (cond
                  ((il:|CopyDown?|)
                   (il:|while| (il:|CopyDown?|)
                      il:|do| (il:block))
                   (unread self object))
                  ((null object)
                   nil)
                  ((il:|MetaDown?|)
                   (left-shift-select lattice-browser 
                          object))
                  (t (let ((selector (left-choice self)))
                          (cond
                             (selector (do-selected-command
                                        lattice-browser 
                                        selector object))))
                     )))))))


(defmethod left-shift-select ((self web-editor)
                              object) 
                                   (il:* il:\; 
                                   "28-SEP-82 11:31")
                                   (il:* il:\; "Called when item is selected with left key and LSHIFT is down")

 (pp! object))


(defmethod middle-selection ((self web-editor)) 
                                   (il:* il:\; 
                                   "15-May-85 19:04")
      
      (il:* il:|;;| "This function called from the GRAPHER package when a node is selected with the middle mouse button.  If no node is selected then just returns.")

 (prog (selection object (window (slot-value self
                                        'window))
              (web-editor self))
       (declare (il:specvars object web-editor))
       (cond
          ((null (il:setq object (find-selected-node window
                                        )))
           (return)))
       (setf (slot-value web-editor 'last-selected-object)
             object)
       (il:getmousestate)
       (flip-node self object)
       (cond
          ((il:|MetaDown?|)        (il:* il:\; 
                                   "Invoke editor ")

           (flip-node self object)
           (middle-shift-select web-editor object))
          (t (il:setq selection
              (or (middle-choice self)
                  (progn (flip-node self object)
                         (return nil))))
             (flip-node self object)
             (do-selected-command web-editor selection 
                    object)))))


(defmethod middle-shift-select ((self web-editor)
                                object) 
                                   (il:* il:\; 
                                   "17-Sep-86 18:31")
 

(il:* il:|;;;| "Called when item is selected with middle key and LSHIFT is down ")

 (do-command-in-process self self 'edit (list object)))


(defmethod right-selection ((self web-editor)) 
                                   (il:* il:\; 
                                   "17-Apr-84 15:46")
                                   (il:* il:\; 
                        "Do RightButtonItems on selection.")

 (let* ((choice (choice-menu self 'right-button-items)))
       (if choice (funcall choice self))))


(defmethod title-selection ((self web-editor)) 
                                   (il:* il:\; 
                                   "17-Apr-84 15:35")
      
      (il:* il:|;;| " Do TitleItems if selected in title area.  Replaces TitleSelection in Window because this one does evaluation in TTY process, and saves events on history")

 (let* ((choice (choice-menu self 'title-items)))
       (if choice (do-command-in-process self self choice 
                         nil))))

(il:defineq

(web-menu-whenselectedfn
  (il:lambda (item menu button)
                             (il:* il:\; 
                            "Edited 14-Jul-87 17:43 by Rao")
                                   (il:* il:\; 
                                   "13-DEC-83 21:03")

    (prog (second-element)
          (return (cond
                     ((il:nlistp item)
                      item)
                     ((il:nlistp (il:setq second-element
                                  (cadr item)))
                      second-element)
                     ((eq (car second-element)
                          'progn)
                      (il:eval second-element))
                     (t second-element))))))

(window-when-held-fn
  (lambda (item menu key)    (il:* il:\; 
                            "Edited  9-Jul-87 11:58 by Rao")
                                   (il:* il:\; 
                                   "29-Dec-85 15:28")
                                   (il:* il:\; "Send to window the message to respond to time out on menu")

         (declare (il:specvars window-for-menu))
         (when-menu-item-held window-for-menu item menu key
                )))
)
(il:defineq

(sub-item-selection
  (il:lambda (item menu button)
                             (il:* il:\; 
                            "Edited 14-Jul-87 17:13 by Rao")
                                   (il:* il:\; 
                                   "13-DEC-83 21:03")
      
      (il:* il:|;;| "menu WHENSELECTEDFN which allows differential selection on LEFT and middle button.  For such differential selection item should be of form --- (itemSeenInMenu (leftValue midValue)) --- where midValue can be an atom which is directly returned when item is selected with middle, or midValue can be an itemList, which will be displayed in a subselection menu")

    (prog (it it1)
          (return (cond
                     ((il:nlistp item)
                      item)
                     ((il:nlistp (il:setq it (cadr item)))
                      it)
                     ((eq (il:setq it1 (car it))
                          'quote)
                      (cadr it))
                     ((eq it1 'progn)
                      (il:eval it))
                     ((il:listp it1)
                      (il:eval it1))
                     (t it1))))))

(dual-sub-items
  (il:lambda (menu item)     (il:* il:\; 
                            "Edited 14-Jul-87 17:14 by Rao")
                                   (il:* il:\; 
                                   "13-DEC-83 21:07")
      
      (il:* il:|;;| "menu WHENSELECTEDFN which allows differential selection on LEFT and middle button.  For such differential selection item should be of form --- (itemSeenInMenu (leftValue midValue)) --- where midValue can be an atom which is directly returned when item is selected with middle, or midValue can be an itemList, which will be displayed in a subselection menu")

    (prog (it it1)
          (return (cond
                     ((or (il:nlistp item)
                          (il:nlistp (il:setq it
                                      (cadr item)))
                          (eq (il:setq it1 (car it))
                              'quote)
                          (eq it1 'progn)
                          (il:nlistp (il:setq it1
                                      (cadr it))))
                      nil)
                     (t it1))))))

(window-when-held-fn
  (lambda (item menu key)    (il:* il:\; 
                            "Edited  9-Jul-87 11:58 by Rao")
                                   (il:* il:\; 
                                   "29-Dec-85 15:28")
                                   (il:* il:\; "Send to window the message to respond to time out on menu")

         (declare (il:specvars window-for-menu))
         (when-menu-item-held window-for-menu item menu key
                )))

(do-menu-method
  (il:lambda (object items)  (il:* il:\; 
                            "Edited 14-Jul-87 17:15 by Rao")
                                   (il:* il:\; 
                                   "13-NOV-83 16:20")

    (prog ((selector (and items (dual-menu items))))
          (and selector (return (funcall selector object)))
     )))

(dual-menu
  (il:lambda (items when-held-fn)
                             (il:* il:\; 
                            "Edited 14-Jul-87 17:16 by Rao")
                                   (il:* il:\; 
                                   " 9-FEB-84 16:17")
                                   (il:* il:\; "and pops up a menu which allows differential selection on LEFT an middle buttons")

    (il:menu (il:|create| il:menu
                    il:items il:← items
                    il:whenselectedfn il:← '
                    sub-item-selection
                    il:subitemfn il:← 'dual-sub-items
                    il:whenheldfn il:← when-held-fn
                    il:changeoffsetflg il:← t))))

(dual-selection
  (il:lambda (item menu button)
                             (il:* il:\; 
                            "Edited 14-Jul-87 17:28 by Rao")
                                   (il:* il:\; 
                                   "29-MAR-83 17:57")
      
      (il:* il:|;;| "MENU WHENSELECTEDFN which allows differential selection on LEFT and middle button.  For such differential selection ITEM should be of form --- (itemSeenInMenu (leftValue midValue)) --- where midValue can be an atom which is directly returned when ITEM is selected with middle, or midValue can be an itemList, which will be displayed in a subselection MENU")

    (prog (it it1)
          (return (cond
                     ((il:nlistp item)
                      item)
                     ((il:nlistp (il:setq it (cadr item)))
                      it)
                     ((eq (il:setq it1 (car it))
                          'quote)
                      (cadr it))
                     ((eq it1 'progn)
                      (il:eval it))
                     ((eq button 'il:left)
                      (cond
                         ((il:listp it1)
                          (il:eval it1))
                         (t it1)))
                     ((il:nlistp (il:setq it1 (cadr it)))
                      it1)
                     (t (dual-menu it1)))))))
)



(il:* il:|;;| "Event Triggering")


(defmethod do-selected-command ((self web-editor)
                                command obj) 
                                   (il:* il:\; 
                                   "17-Sep-86 17:49")
 

(il:* il:|;;;| 
"Do the selected command or forwards it to the object")

 (if command 
      
      (il:* il:|;;| "Take care of being passed in a dummy node from browser in Lattice mode.  --- Dummy nodes are indicated by having the object in a list")

     (let ((args (if (il:listp command)
                     (cdr command)
                     nil))
           (command (if (il:listp command)
                        (car command)
                        command))
           (obj (if (il:listp obj)
                    (car obj)
                    obj)))
          (if (il:fmemb command (slot-value self
                                       'local-commands))
              (do-command-in-process self self command
                     `(,obj ,@args))
              (do-command-in-process self obj command args)
              ))))


(defmethod do-command-in-process ((self web-editor)
                                  obj selector args node) 
                                   (il:* il:\; 
                                   "17-Sep-86 17:46")
      
      (il:* il:|;;| "Does a lattice command in a separate process.  Grays out the node at the beginning of the command, and ungrays it when the command completes.")

 (if node (progn (shade-node self node il:grayshade2)
                 (eval-form-in-process self obj selector 
                        args)
                 (shade-node self node il:whiteshade))
     (eval-form-in-process self obj selector args)))


(defmethod eval-form-in-process ((self web-editor)
                                 obj selector args) 
                                   (il:* il:\; 
                                   "17-Sep-86 17:48")
      
      (il:* il:|;;| 
      "Maybe this should be evaluated in another process")

 (apply selector obj args))


(defmethod message-form-for-process ((self web-editor)
                                     obj selector args) 
                                   (il:* il:\; 
                                   "17-Sep-86 17:48")

   

(il:* il:|;;;| "Create a form to evaluate in a new process that will send the obj the selector message with the given args ")

   `(eval
     '(,selector
       ',obj
       ,@(il:|for| il:\x il:|in| args
            il:|collect| (cond
                            ((or (null il:\x)
                                 (pcl::objectp il:\x))
                             il:\x)
                            (t ',il:\x))))))

(il:defineq

(eval.in.tty.context
  (il:lambda (form proc-name)(il:* il:\; 
                            "Edited 10-Jul-87 14:24 by Rao")

(il:* il:|;;;| "Evaluate the form in the current TTY process, if that process is in a TTY wait in a BREAK --- otherwise evaluate it in a new process.")

    (il:process.eval
     (il:tty.process)
     `(,#'(il:lambda (form proc-name)
            (il:|if|
             (and (il:stkpos 'il:lispxread)
                  (eq 'il:break1a
                      (il:stknthname -2 (il:stkpos
                                         'il:lispxread)))
                  (eq 'il:\\ttybackground
                      (il:stknthname 1 (il:stkpos
                                        'il:\\process.eval1
                                        ))))
                il:|then| (il:eval form)
              il:|else| (il:add.process
                         `(progn (il:ttydisplaystream
                                  
                               il:*d-window-default-stream*
                                  )
                                 ,form)
                         'il:name proc-name)))
       ',form
       ',proc-name))))

(lispx-send
  (il:nlambda (il:msgform)   (il:* il:\; 
                            "Edited 16-Jun-87 09:47 by Rao")
                                   (il:* il:\; 
                                   " 3-Apr-86 17:23")
      
      (il:* il:|;;| "Send a message given, recording on history, protected form errors I can't remember why we put in the RELSTK")

    (prog ((il:\\inside.ttyin))
          (declare (il:specvars il:msgform))
          (il:ersetq (il:lispxeval il:msgform))
          (and (il:relstk (il:stkpos 'il:deditl))
               (il:error!)))))
)



(il:* il:|;;| "Browser Looks Control")


(defmethod add-root ((self web-editor)
                     new-item)     (il:* il:\; 
                                   "11-Dec-86 10:23")
 

(il:* il:|;;;| 
"Add a named item to the starting list of the browser")

 (let ((new-item (or new-item (new-item self new-item))))
      (if (pcl::objectp new-item)
          (progn (pushnew new-item (slot-value self
                                          'starting-list))
                 (if (slot-value self 'good-list)
                     (pushnew new-item (slot-value
                                        self
                                        'good-list)))
                 (setf (slot-value self 'bad-list)
                       (il:dremove new-item
                              (slot-value self 'bad-list)))
                 (recompute self))
          (prompt-print self "Nothing Added To Browser"))))


(defmethod delete-from-browser ((|self| web-editor)
                                |obj| |objname|) 
                                   (il:* il:\; 
                                   " 5-Aug-86 16:50")
 

(il:* il:|;;;| "Place on badList for Browser")

 (pushnew |obj| (slot-value |self| 'bad-list))
 (recompute |self|))


(defmethod delete-subtree-from-browser ((self web-editor)
                                        obj objname) 
                                   (il:* il:\; 
                                   " 5-Jun-86 14:14")
 

(il:* il:|;;;| 
"Delete this node and any of its subnodes from the graph")

 (\\delete-subtree self (il:windowprop (slot-value
                                        self
                                        'window)
                               'il:graph)
        obj)
 (pushnew obj (slot-value self 'bad-list))
 (recompute self))


(defmethod recompute ((self web-editor)
                      &optional dont-reshape-flg) 
                                   (il:* il:\; 
                                   " 8-Apr-87 14:42")
                                   (il:* il:\; 
             "Recompute the browseGraph in the same window")

 (prog ((graph-fits (graph-fits self)))
       (show self (slot-value self 'starting-list))
       (cond
          ((or dont-reshape-flg (null graph-fits))
                                   (il:* il:\; "Dont Reshape or rescroll.  Assume window wants to stay the same size")

           )
          (t (shape-to-hold self))))
 self)


(defmethod recompute-in-place ((il:|self| web-editor)) 
                                   (il:* il:\; 
                                   "10-Dec-84 18:27")
 

(il:* il:|;;;| 
"recompute the graph, maintaining the current position")

 (let* ((il:|visibleRegion| (il:dspclippingregion
                             nil
                             (slot-value il:|self|
                                    'window)))
        (il:\x (il:|fetch| il:left il:|of| 
                                         il:|visibleRegion|
                      ))
        (il:\y (il:|fetch| il:bottom il:|of| 
                                         il:|visibleRegion|
                      )))          (il:* il:\; "if we want to RecomputeInPlace, we must want the window to be kept the same")

       (recompute il:|self| t)     (il:* il:\; "we had to save x and y because visibleRegion gets clobbered by Recompute! Suprise!")

       (scroll-window il:|self| il:\x il:\y)))


(defmethod recompute-labels ((|self| web-editor)) 
                                   (il:* il:\; 
                                   "27-Feb-85 11:27")
                                   (il:* il:\; 
                "recompute the graph, including the labels")

 (clear-label-cache |self| t)
 (recompute |self|))


(defmethod remove-from-bad-list ((il:|self| web-editor)) 
                                   (il:* il:\; 
                                   "28-Dec-85 10:04")

                                   (il:* il:\; "Remove an item from BadList to allow it to be displayed once again")

   (cond
      ((null (slot-value il:|self| 'bad-list))
       (il:clrprompt)
       (il:promptprint "No BadList items."))
      (t
       (prog ((il:|item| (il:menu
                          (il:|create| il:menu
                                 il:title il:← 
                                 "BadList Items"
                                 il:items il:←
                                 (slot-value il:|self|
                                        'bad-list)))))
             (cond
                (il:|item|
                 (setf (slot-value il:|self| 'bad-list)
                       '(il:dremove il:|item|
                               (slot-value il:|self|
                                      'bad-list)))
                 (recompute il:|self|))
                (t (il:clrprompt)
                   (il:promptprint "Nothing Selected")))))))


(defmethod change-font-size ((|self| web-editor)
                             |size|) 
                                   (il:* il:\; 
                                   "13-Dec-84 13:04")

                                   (il:* il:\; 
         "Change the font size from whatever it is to size")

   (or
    |size|
    (setq
     |size|
     (il:menu (cond
                 ((il:|type?| il:menu (il:gettopval
                                       'il:|MenuSize|))
                  il:|MenuSize|)
                 (t (il:settopval
                     'il:|MenuSize|
                     (il:|create| il:menu
                            il:title il:← 
                            "Select Desired Size"
                            il:changeoffsetflg il:← t
                            il:items il:←
                            '((il:|Abort| nil)
                              8 10 12 16))))))))
   (cond
      (|size|
       (setf (slot-value |self| 'browse-font)
             (il:fontcreate
              `(,(slot-value |self| 'browse-font-family)
                ,|size|
                ,(slot-value |self| 'browse-font-face))))
                                   (il:* il:\; 
                               "clear out the label cache!")

       (recompute-labels |self|))))


(defmethod change-format ((|self| web-editor)
                          |format|) 
                                   (il:* il:\; 
                                   "21-Apr-84 19:52")
                                   (il:* il:\; 
                   "Change format between Lattice and Tree")

 (cond
    ((il:listp |format|)
     (setf (slot-value |self| 'graph-format)
           |format|))
    ((setq |format| (il:menu (il:|create|
                              il:menu
                              il:items il:←
                              (slot-value |self|
                                     'graph-format-choices)
                              )))
     (setf (slot-value |self| 'graph-format)
           |format|)))
 (recompute |self|))


(defmethod change-max-label-size ((self web-editor)
                                  new-max-width 
                                  new-max-lines) 
                                   (il:* il:\; 
                                   "13-Dec-84 13:05")
                                   (il:* il:\; "change the max label dimensions and redisplay the nodes -- if new size is NULL, don't change")

 (il:|if| new-max-lines
     il:|then| (setf (slot-value self 'label-max-lines)
                     new-max-lines))
 (il:|if| new-max-width
     il:|then| (setf (slot-value self '
                            label-max-chars-width)
                     new-max-width))
                                   (il:* il:\; 
                                "clear out the label cache")

 (recompute-labels self))


(defmethod shape-to-hold ((self web-editor)) 
                                   (il:* il:\; 
                                   "13-Jan-87 16:52")

   

(il:* il:|;;;| "Shape the browse window to just hold the nodes with BrowserMargin to spare")

   (prog (left bottom height width right top
               (min-width (il:iplus
                           5
                           (il:stringwidth
                            (slot-value self 'title)
                            (il:dspfont nil 
                              il:|WindowTitleDisplayStream|
                                   ))))
               (min-height
                (il:fontheight (il:dspfont
                                nil
                                (slot-value self
                                       'window))))
               (region (il:windowprop (slot-value
                                       self
                                       'window)
                              'il:region))
               (nodes (il:|fetch| il:graphnodes
                         il:|of| (il:windowprop
                                  (slot-value self
                                         'window)
                                  'il:graph))))
         (or nodes
             (return (set-region self
                            (il:createregion (il:|fetch|
                                              il:left
                                                il:|of|
                                                region)
                                   (il:|fetch| il:bottom
                                      il:|of| region)
                                   min-width min-height))))
         (setq left (il:min/left nodes))
         (setq bottom (il:min/bottom nodes))
         (setq right (il:max/right nodes))
         (setq top (il:max/top nodes))
         (setq
          width
          (il:imax min-width
                 (il:imin il:|MaxLatticeWidth|
                        (il:widthifwindow
                         (il:plus il:|BrowserMargin|
                                (il:idifference right left)
                                )
                         (il:windowprop (slot-value
                                         self
                                         'window)
                                'il:border)))))
         (setq height (il:imax min-height
                             (il:imin il:|MaxLatticeHeight|
                                    (il:plus 
                                         il:|BrowserMargin|
                                           (il:idifference
                                            top bottom)))))
         (and (il:eqp width (il:|fetch| il:width
                               il:|of| region))
              (il:eqp (il:heightifwindow
                       height
                       (il:windowprop (slot-value
                                       self
                                       'window)
                              'il:title)
                       (il:windowprop (slot-value
                                       self
                                       'window)
                              'il:border))
                     (il:|fetch| il:height il:|of| region))
              (return t))
         (set-region self (il:createregion (il:|fetch|
                                            il:left
                                              il:|of|
                                              region)
                                 (il:|fetch| il:bottom
                                    il:|of| region)
                                 width height)
                nil)))




(il:* il:|;;| "Node Marking and Selecting")


(defmethod box-node ((self web-editor)
                     object keep-previous-box) 
                                   (il:* il:\; 
                                   " 8-Apr-87 18:34")
 "Puts a box around the node in the graph representing the object"
      
      (il:* il:|;;| "If there was a previously boxed node, remove the box from around it and set it to nil")

 (when (and (not keep-previous-box)
            destination-browser
            (slot-value destination-browser 'boxed-node))
       (highlight-node destination-browser
              (slot-value destination-browser 'boxed-node)
              'il:invert)
       (setf (slot-value destination-browser 'boxed-node)
             nil))
 (setq destination-browser self)   (il:* il:\; 
                                   "update the global")

 (highlight-node self object (slot-value self '
                                    box-line-width))
 (setf (slot-value self 'boxed-node)
       object))


(defmethod display-node-hightlights ((self web-editor)
                                     node shade box-width) 
                                   (il:* il:\; 
                                   "13-Dec-85 15:15")
                                   (il:* il:\; 
                                   "New method template")

 (il:reset/node/border node (cond
                               (shade (list box-width shade
                                            ))
                               (t box-width))
        (slot-value self 'window)))


(defmethod display-node-shading ((self web-editor)
                                 node shade) 
                                   (il:* il:\; 
                                   "13-Dec-85 15:13")
                                   (il:* il:\; 
                                   "New method template")

 (il:reset/node/labelshade node (or shade il:whiteshade)
        (slot-value self 'window)))


(defmethod flash-node ((il:|self| web-editor)
                       il:|node| il:n il:|flashTime| 
                       il:|leaveFlipped?|) 
                                   (il:* il:\; 
                                   "12-Dec-84 16:09")
                                   (il:* il:\; 
                                   "Flip node N times")

 (il:setq il:|node|
  (il:fassoc (cond
                ((il:litatom il:|node|)
                 (il:setq il:|node| (il:|GetObjectRec|
                                     il:|node|)))
                (t il:|node|))
         (il:|fetch| il:graphnodes
            il:|of| (il:windowprop (slot-value il:|self|
                                          'window)
                           'il:graph))))
 (il:|if| il:|node|
     il:|then| (il:|for| il:\i il:|from| 1
                  il:|to| (or il:n 3)
                  il:|do| (il:flipnode il:|node|
                                 (slot-value il:|self|
                                        'window))
                        (il:dismiss (or il:|flashTime| 300)
                               )
                        (il:flipnode il:|node|
                               (slot-value il:|self|
                                      'window))
                        (il:dismiss (or il:|flashTime| 300)
                               ))
           (il:|if| il:|leaveFlipped?|
               il:|then| (il:flipnode il:|node|
                                (slot-value il:|self|
                                       'window)))))


(defmethod flip-node ((self web-editor)
                      object)      (il:* il:\; 
                                   "13-Dec-85 15:18")
                                   (il:* il:\; "Inverts the video around the node in the graph representing the object")

 (let ((node (il:fassoc (cond
                           ((il:litatom object)
                            (il:setq object (
                                          il:|GetObjectRec|
                                             object)))
                           (t object))
                    (il:|fetch| il:graphnodes
                       il:|of| (il:windowprop
                                (slot-value self
                                       'window)
                                'il:graph)))))
      (and node (display-node-shading self node
                       (il:inverted/shade/for/grapher
                        (il:|fetch| il:nodelabelshade
                           il:|of| node))))))


(defmethod get-display-label ((self web-editor)
                              object) 

(il:* il:|;;;| "get the display label.  use the cache if it provides the answer;  if not, and maxLabelWidth is set, use it to compute the appropriate bit map and then cache the result.")

   (let
    ((cached-label (il:assoc object (slot-value
                                     self
                                     'label-cache))))
    (il:|if| cached-label
        il:|then| (cdr cached-label)
      il:|else| (let ((new-label (box-print-string
                                  (get-label self object)
                                  (slot-value self
                                         '
                                      label-max-chars-width
                                         )
                                  (slot-value self
                                         'label-max-lines)
                                  (slot-value self
                                         'browse-font))))
                     (il:|if| (il:listp new-label)
                         il:|then| (il:* il:\; 
                      "GRAPHER dies if the label is a list")

                               (il:setq new-label
                                (il:mkstring new-label)))
                     (push (cons object new-label)
                           (slot-value self 'label-cache))
                     new-label))))


(defmethod highlight-node ((self web-editor)
                           object width shade) 
                                   (il:* il:\; 
                                   "13-Dec-85 15:16")
 

(il:* il:|;;;| 
"highlight a node by surronding it with a shaded box")

 (let ((node (il:fassoc object
                    (il:|fetch| il:graphnodes
                       il:|of| (il:windowprop
                                (slot-value self
                                       'window)
                                'il:graph)))))
      (and node (display-node-hightlights self node shade 
                       width))))


(defmethod remove-highlights ((il:|self| web-editor)) 
                                   (il:* il:\; 
                                   "13-Dec-85 15:16")
 

(il:* il:|;;;| 
"gets rid of all highlighting in the lattice")

 (il:|for| il:|node|
    il:|in| (il:|fetch| il:graphnodes
               il:|of| (il:windowprop (slot-value
                                       il:|self|
                                       'window)
                              'il:graph))
    il:|do| (display-node-hightlights il:|self| il:|node| 
                   nil))
 (setf (slot-value il:|self| 'boxed-node)
       nil))


(defmethod remove-shading ((il:|self| web-editor)) 
                                   (il:* il:\; 
                                   "13-Dec-85 15:14")
 

(il:* il:|;;;| "gets rid of all shading in the lattice")

 (il:|for| il:|node|
    il:|in| (il:|fetch| il:graphnodes
               il:|of| (il:windowprop (slot-value
                                       il:|self|
                                       'window)
                              'il:graph))
    il:|do| (display-node-shading il:|self| il:|node| 
                   il:whiteshade)))


(defmethod unmark-nodes ((il:|self| web-editor)) 
                                   (il:* il:\; 
                                   "10-Dec-84 12:27")
                                   (il:* il:\; "clear the graph nodes, removing all shading and highlighting")

 (remove-highlights il:|self|)
 (remove-shading il:|self|))


(defmethod shade-node ((il:|self| web-editor)
                       il:|object| il:|shade|) 
                                   (il:* il:\; 
                                   "15-Jan-87 18:34")

   

(il:* il:|;;;| "shade the background of a node")

   (let
    ((il:|node| (il:fassoc
                 (cond
                    ((il:litatom il:|object|)
                     (il:setq il:|object| (
                                          il:|GetObjectRec|
                                           il:|object|)))
                    (t il:|object|))
                 (il:|fetch| il:graphnodes
                    il:|of| (il:windowprop
                             (slot-value il:|self|
                                    'window)
                             'il:graph)))))
    (il:|if| il:|node|
        il:|then|
        (il:|if| (il:bitmapp (il:|fetch| il:nodelabel
                                il:|of| il:|node|))
            il:|then|
      
      (il:* il:|;;| "Need to forget the old bitmap, in case it already has a shade blt'ed into it.  This will fail if the GetDisplayLabel msg returns something different from the previous value, but what can you do?")

            (clear-label-cache il:|self| il:|object|)
            (let ((il:|newLabel| (get-display-label 
                                        il:|self| 
                                        il:|object|)))
                 (il:|replace| il:nodelabel il:|of| 
                                                  il:|node|
                    il:|with| il:|newLabel|)
                 (il:|if| (and il:|shade| (il:bitmapp
                                           il:|newLabel|))
                     il:|then| (il:bitblt nil nil nil 
                                      il:|newLabel| nil nil 
                                      nil nil 'il:texture
                                      'il:paint il:|shade|)
                        )))
        (display-node-shading il:|self| il:|node| 
               il:|shade|))))


(defmethod has-object ((self web-editor)
                       object)     (il:* il:\; 
                                   "28-May-84 12:56")
                                   (il:* il:\; "Check object in grapher nodes, and return if it is one of them")

 (and (il:fassoc (il:|GetObjectRec| object)
             (il:|fetch| il:graphnodes
                il:|of| (il:windowprop (slot-value
                                        self
                                        'window)
                               'il:graph)))
      t))


(defmethod make-parameter-menu ((self web-editor)
                                menu test-form change-form) 
                                   (il:* il:\; 
                                   "17-Sep-86 18:11")

   

(il:* il:|;;;| 
"Create a menu for viewing a parameter of self")

   (il:|replace| il:whenselectedfn il:|of| menu
      il:|with|
      (il:function (il:lambda (item menu)
                     (let
                      ((self (il:getmenuprop menu
                                    'self))
                       (test-form (il:getmenuprop
                                   menu
                                   'test-form))
                       (change-form (il:getmenuprop
                                     menu
                                     'change-form)))
                      (il:|if| item
                          il:|then|
                          (il:shadeitem item menu 
                                 il:blackshade)
                          (il:apply*
                           change-form self
                           (il:|if| (il:listp item)
                               il:|then| (cadr item)
                             il:|else| item))
                          (il:|for| item
                             il:|in| (il:|fetch| il:items
                                        il:|of| menu)
                             il:|do|
                             (il:|if|
                              (il:apply*
                               test-form self
                               (il:|if| (il:listp item)
                                   il:|then| (cadr item)
                                 il:|else| item))
                                 il:|then| (il:shadeitem
                                            item menu 
                                          il:highlightshade
                                            )
                               il:|else| (il:shadeitem
                                          item menu 
                                          il:whiteshade))))
                      ))))
   (il:putmenuprop menu 'self self)
   (il:putmenuprop menu 'test-form test-form)
   (il:putmenuprop menu 'change-form change-form)
   (il:|for| item il:|in| (il:|fetch| il:items il:|of|
                                               menu)
      il:|do| (il:|if| (il:apply* test-form self
                              (il:|if| (il:listp item)
                                  il:|then| (cadr item)
                                il:|else| item))
                  il:|then| (il:shadeitem item menu 
                                   il:highlightshade)
                il:|else| (il:shadeitem item menu 
                                 il:whiteshade)))
   menu)


(defmethod new-item ((self web-editor)
                     new-item)     (il:* il:\; 
                                   "23-Jan-85 13:02")
                                   (il:* il:\; 
                 "Return Object.  Prompt for it if needed.")

 (class-named (or new-item (prompt-read self 
                            "Give name of item to be added"
                                  ))))


(defmethod obj-name-pair ((il:|self| web-editor)
                          il:|obj|) 
                                   (il:* il:\; il:|smL| 
                                   "15-Aug-86 09:24")

   

(il:* il:|;;;| "Make a pair (object  . objName) where objName is label to be used in browser")

   (let
    nil
    (il:|if| (null il:|obj|)
        il:|then| nil
      il:|elseif| (and (slot-value il:|self| 'good-list)
                       (not (il:fmemb il:|obj|
                                   (slot-value il:|self|
                                          'good-list))))
        il:|then| nil
      il:|elseif| (il:fmemb il:|obj| (slot-value
                                      il:|self|
                                      'bad-list))
        il:|then| nil
      il:|else| (cons il:|obj| (get-display-label il:|self| 
                                      il:|obj|)))))


(defmethod object-from-label ((self web-editor)
                              label) 
                                   (il:* il:\; 
                                   " 4-Jan-85 18:20")

   

(il:* il:|;;;| "What object has this label?")

   (let
    ((object-node
      (il:|for| il:|node|
         il:|in| (il:|fetch| il:graphnodes
                    il:|of| (il:windowprop
                             (slot-value self 'window)
                             'il:graph))
         il:|thereis| (il:equal label (il:|fetch| 
                                             il:nodelabel
                                         il:|of| il:|node|)
                             ))))
    (il:|if| (il:nlistp (car object-node))
        il:|then| (car object-node)
      il:|else| nil)))


(defmethod position-node ((self web-editor)
                          object window-x window-y) 
                                   (il:* il:\; 
                                   "10-Dec-84 18:24")
 

(il:* il:|;;;| "scrolls the window so that the node is in the given position of the window.  If windowX or windowY is a FLOATP, it it taken to be a window-relative postion;  if a FIXP, it is a window-absolute position.")

 (let ((region (node-region self object)))
      (il:|if| region
          il:|then| (scroll-window self
                           (il:|fetch| il:left il:|of|
                                               region)
                           (il:|fetch| il:bottom
                              il:|of| region)
                           window-x window-y))))




(il:* il:|;;| "Dubious Methods")


(defmethod save-in-it ((self web-editor)) 
                                   (il:* il:\; 
                                   " 5-Sep-86 12:40")
 

(il:* il:|;;;| 
"A Browser command to save self in SavedValue")

 (il:|PutSavedValue| self))


(defmethod sub-browser ((il:|self| web-editor)
                        il:|obj| il:|objName|) 
                                   (il:* il:\; 
                                   "13-Sep-84 22:10")
                                   (il:* il:\; 
                   "Create a subbrowser on selected object")

 (il:|←New|
  (il:|Class| il:|self|)
  browse il:|obj|))


(defmethod unread ((self web-editor)
                   object)         (il:* il:\; 
                                   "15-Aug-86 10:57")

   

(il:* il:|;;;| "Unread name into system buffer --- or if no node, unread the entire graph")

   (let
    ((obj-name (and object (object-name object)))
     (image-obj
      (cond
         (object obj-name)
         (t
          (il:grapherobj
           (let
            ((il:|graph| (il:windowprop (slot-value
                                         self
                                         'window)
                                'il:graph)))
      
      (il:* il:|;;| "Need to make a copy of the graph w/o any objects, so non-Loops systems can look at the resulting graph")

            (il:|create| il:graph
               il:|using|
               il:|graph| il:graphnodes il:←
               (il:|for| il:|node|
                  il:|in| (il:|fetch| il:graphnodes
                             il:|of| il:|graph|)
                  il:|collect|
                  (il:|create| il:graphnode
                     il:|using| il:|node| il:nodeid il:←
                           (\\portable-graph-node-id
                            (il:|fetch| il:nodeid
                               il:|of| il:|node|))
                           il:tonodes il:←
                           (il:|for| il:|id|
                              il:|in| (il:|fetch| 
                                             il:tonodes
                                         il:|of| il:|node|)
                              il:|collect| (
                                   \\portable-graph-node-id
                                            il:|id|))
                           il:fromnodes il:←
                           (il:|for| il:|id|
                              il:|in| (il:|fetch| 
                                             il:fromnodes
                                         il:|of| il:|node|)
                              il:|collect| (
                                   \\portable-graph-node-id
                                            il:|id|))))))))
         )))                       (il:* il:\; "Need to check for TEdit target, since TEdit doesn't use the COPYINSERT protocol!")

    (il:|if| (and (not (or (il:stringp image-obj)
                           (il:imageobjp image-obj)))
                  (il:windowprop (il:process.tty (
                                             il:tty.process
                                                  ))
                         'il:copyinsertfn))
        il:|then| 
      
      (il:* il:|;;| "It is expecting something and we don't have an image object or string to give it, so we need to convert it first")

              (il:copyinsert (il:mkstring image-obj))
      il:|else| (il:copyinsert image-obj))))




(il:* il:|;;;| "AUXILIARY Stuff")

(il:defineq

(find-selected-node
  (il:lambda (window)        (il:* il:\; 
                          "Edited 22-Sep-87 17:32 by kirk:")
                                   (il:* il:\; 
                                   "10-Dec-84 17:53")
      
      (il:* il:|;;| "Used in BUTTONEVENTFN and gets called whenever cursor moves or button is down.  Adapted from APPLYTOSELECTEDNODE in GRAPHER package;  returns the selected item rather than applying a function on the inside of the button event fn.")
      
      (il:* il:|;;| "Also this was modified to pop up the middle button menu on button down rather than button up.")

    (prog ((loops-window (il:windowprop window 'web-editor)
                  )
           (nodelst (il:|fetch| (il:graph il:graphnodes)
                       il:|of| (il:windowprop window
                                      'il:graph)))
           (ds (il:windowprop window 'il:dsp))
           button oldpos reg now near)
                                   (il:* il:\; 
                               "note which button is down.")
                                   (il:* il:\; 
                           "get the region of this window.")

          (il:setq reg (il:windowprop window 'il:region))
          (il:|until| (il:lastmousestate (or il:left 
                                             il:middle))
             il:|do| (il:getmousestate))
          (il:setq near (il:nodelst/as/menu nodelst
                               (il:setq oldpos
                                (il:cursorposition nil ds))
                               ))
      il:flip
          (when (il:lastmousestate il:middle)
                (return (il:|fetch| il:nodeid il:|of|
                                              near)))
          (and now (il:flipnode now ds))
          (and near (il:flipnode near ds))
          (il:setq now near)
      il:lp
                                   (il:* il:\; 
               "wait for a button up or move out of region")

          (il:getmousestate)
          (cond
             ((il:lastmousestate (and (not il:left)
                                      (not il:middle)))
                                   (il:* il:\; 
                              "left button up, process it.")

              (and now (il:flipnode now ds))
                                   (il:* il:\; 
                              "NOW node has been selected.")

              (return (il:|fetch| il:nodeid il:|of| now)))
             ((not (il:inside? (il:windowprop window
                                      'il:region)
                          il:lastmousex il:lastmousey))
                                   (il:* il:\; 
                                "outside of region, return")

              (and now (il:flipnode now ds))
              (return))
             ((eq now (il:setq near
                       (il:nodelst/as/menu nodelst
                              (il:cursorposition nil ds 
                                     oldpos))))
              (go il:lp))
             (t (go il:flip))))))
)
(il:defineq

(add-menu-window
  (il:lambda (menu-group main-window edge menu-window-title
                    )        (il:* il:\; 
                            "Edited 10-Jul-87 18:48 by Rao")

(il:* il:|;;;| "Add an attached window to self containing the given menus --- put the menus in a row unless vertical?  is true, in which case stack them in a single column")

    (let* ((minimum-menu-size (menu-group-size menu-group))
           (minimum-window-size (cons (il:widthifwindow
                                       (car 
                                          minimum-menu-size
                                            ))
                                      (il:heightifwindow
                                       (cdr 
                                          minimum-menu-size
                                            )
                                       menu-window-title)))
           (menu-window (il:createw (il:createregion
                                     0 0 (car 
                                        minimum-window-size
                                              )
                                     (cdr 
                                        minimum-window-size
                                          ))
                               menu-window-title nil t)))
          (il:windowprop menu-window 'il:minsize 
                 minimum-window-size)
          (il:windowprop
           menu-window
           'il:maxsize
           (il:selectq edge
                 ((il:top il:bottom) 
                       (cons nil (il:heightifwindow
                                  (cdr minimum-menu-size)
                                  menu-window-title)))
                 ((il:left il:right) 
                       (cons (il:widthifwindow (car 
                                          minimum-menu-size
                                                    ))
                             nil))
                 nil))
          (il:windowprop menu-window 'menu-group menu-group
                 )
          (il:windowaddprop menu-window 'il:repaintfn
                 'repaint-menu-window)
          (il:windowaddprop menu-window 'il:reshapefn
                 (il:function (il:lambda (window)
                                (il:redisplayw window))))
          (il:attachwindow menu-window main-window edge
                 'il:justify
                 'il:localclose)
          menu-window)))

(box-print-string
  (il:lambda (string max-chars-width max-lines font 
                    old-bitmap)
                             (il:* il:\; 
                            "Edited 10-Jul-87 18:50 by Rao")
                                   (il:* il:\; 
                                   "29-Mar-85 13:51")
                                   (il:* il:\; "return a bitmap containing the string, in the given font, with MAX-WIDTH at most width")
                                   (il:* il:\; 
                      "sizes of NULL or 0 mean no max size")

    (il:setq max-chars-width (or max-chars-width 0))
    (il:setq max-lines (or max-lines 0))
    (il:|if| (il:zerop max-chars-width)
        il:|then|                  (il:* il:\; 
                "no max width, then just return the STRING")

              string
      il:|else|
      (prog ((max-width (il:itimes max-chars-width
                               (il:stringwidth "A" font)))
             (nchars (il:nchars string))
             (nlines 0)
             (spos 0)
             (region (il:constant (il:|create| il:region)))
             (true-max-width 0)
             nextpos dsp substr)
            (il:setq string (il:mkstring string))
                                   (il:* il:\; 
         "we need to find the size of the resultant bitmap")

        il:nextbreak
            (il:|if| (il:ilessp spos nchars)
                il:|then|
                (il:|add| nlines 1) 
                                   (il:* il:\; 
         "at least one character, even if exceed MAX-WIDTH")

                (il:setq nextpos
                 (il:imax 1
                        (car (break-string-for-boxing
                              (il:substring string
                                     (il:add1 spos)
                                     -1)
                              max-width font))))
                (il:setq true-max-width
                 (il:imax true-max-width
                        (il:stringwidth (il:substring
                                         string
                                         (il:add1 spos)
                                         (il:iplus spos 
                                                nextpos))
                               font)))
                (il:|add| spos nextpos)
                (go il:nextbreak))
            (il:|if| (not (il:zerop max-lines))
                il:|then| (il:setq nlines (il:imin 
                                                 max-lines 
                                                 nlines)))
                                   (il:* il:\; 
                     "that we have the size, lets build it")

            (il:setq dsp
             (il:dspcreate
              (il:|if|
               (and
                old-bitmap
                (not
                 (or (il:greaterp true-max-width
                            (il:bitmapwidth old-bitmap))
                     (il:greaterp
                      (il:itimes nlines (il:fontprop
                                         font
                                         'il:height))
                      (il:bitmapheight old-bitmap)))))
                  il:|then| old-bitmap
                il:|else| (il:bitmapcreate
                           true-max-width
                           (il:itimes nlines
                                  (il:fontprop font
                                         'il:height))))))
            (il:dspfont font dsp)
            (il:dspreset dsp)
            (il:setq spos 0)
            (il:|replace| il:left il:|of| region
               il:|with| 0)
            (il:|replace| il:width il:|of| region
               il:|with| true-max-width)
            (il:|replace| il:height il:|of| region
               il:|with| (il:fontprop font 'il:height))
            (il:|replace| il:bottom il:|of| region
               il:|with| (il:itimes nlines
                                (il:fontprop font
                                       'il:height)))
        il:nextpiece
            (il:|add| nlines -1)
            (il:|if| (il:ilessp spos nchars)
                il:|then|
                (il:setq nextpos
                 (il:imax 1
                        (car (break-string-for-boxing
                              (il:substring string
                                     (il:add1 spos)
                                     -1)
                              true-max-width font))))
                (il:setq substr (il:substring string
                                       (il:add1 spos)
                                       (il:iplus nextpos 
                                              spos)))
                (il:|replace| il:bottom il:|of| region
                   il:|with| (il:idifference (il:|fetch|
                                              il:bottom
                                                il:|of|
                                                region)
                                    (il:|fetch| il:height
                                       il:|of| region)))
                (il:|if| (and (il:zerop nlines)
                              (il:ilessp (il:iplus nextpos 
                                                spos)
                                     nchars))
                    il:|then|      (il:* il:\; 
                                   "we need to abbreviate!")

                          (il:centerprintinregion
                           (il:concat (il:substring substr 
                                             1 -3)
                                  "...")
                           region dsp)
                          (go il:alldone)
                  il:|else|        (il:* il:\; 
                                   "out this piece")

                        (il:centerprintinregion substr 
                               region dsp)
                        (il:|add| spos nextpos)
                        (go il:nextpiece)))
        il:alldone
            (return (il:dspdestination nil dsp))))))

(box-window-node
  (il:lambda (il:|nodeLabel| window)
                                   (il:* il:\; 
                                   " 7-Sep-84 14:36")
                                   (il:* il:\; il:\a 
                                   il:|box| il:|around| 
                                   il:|the| il:|node| 
                                   il:|with| 
                                   il:|nodeLabel| il:|in| 
                                   il:|the| il:|graph.|
                                   il:a il:|nodeLabel| 
                                   il:|in| il:|browsers| 
                                   il:|is| il:|an| 
                                   il:|object.|
                                   il:|Does| il:|nothing| 
                                   il:|if| il:|node| 
                                   il:|not| il:|found.|)

    (prog (il:|node| il:|nodes|)
          (cond
             ((and (il:windowp window)
                   (il:setq il:|nodes|
                    (il:|fetch| il:graphnodes
                       il:|of| (il:windowprop window
                                      'il:graph)))
                   (il:setq il:|node| (il:fassoc 
                                             il:|nodeLabel| 
                                             il:|nodes|)))
              (il:drawareabox (il:gn/left il:|node|)
                     (il:gn/bottom il:|node|)
                     (il:|fetch| il:nodewidth il:|of|
                                              il:|node|)
                     (il:|fetch| il:nodeheight il:|of|
                                               il:|node|)
                     1
                     'il:invert window))))))

(break-string-for-boxing
  (il:lambda (il:msg il:width il:font)
                                   (il:* il:\; 
                                   "11-Dec-84 10:29")
                                   (il:* il:\; 
                                   il:|Stolen| il:|from| 
                                   il:|the| il:|function| 
                                   il:iconw.formatline 
                                   il:-- il:|modified| 
                                   il:|to| il:|try| 
                                   il:|to| il:|break| 
                                   il:|at| "word" 
                                   il:|boundaries,| 
                                   il:|whatever| 
                                   il:|they| il:|are|)
                                   (il:* il:\; il:\a 
                                   il:|list| il:|of| 
                                   il:|the| il:|char#| 
                                   il:|relative| il:|to| 
                                   il:|char| 1 il:|of| 
                                   il:|where| il:|to| 
                                   il:|break| il:|next| 
                                   il:|line,| il:|and| 
                                   il:|how| il:|much| 
                                   il:|space| il:|was| 
                                   left il:|over|
                                   (il:|for| 
                                   il:|centering| il:&\c))

    (cond
       (il:msg                     (il:* il:\; il:|there| 
                                   il:|really| il:|is| 
                                   il:\a il:|title,| 
                                   il:|go| il:|ahead| 
                                   il:|and| il:|format| 
                                   il:|the| il:|next| 
                                   il:|line.|)

        (il:|bind| (il:tx il:← 0)
               (il:lastb il:← 0)
               (il:ch il:← 0)
               (il:tmsg il:← (il:openstringstream il:msg))
               (il:msglen il:← (il:nchars il:msg))
           il:|for| il:i il:|from| 1 il:|by| 1
           il:|do|                 (il:* il:\; il:|thru| 
                                   il:|the| 
                                   il:|characters| 
                                   il:|one| il:|by| 
                                   il:|one.|)

           (cond
              ((il:igreaterp il:tx il:width)
                                   (il:* il:\; il:|past| 
                                   il:|the| il:|right| 
                                   il:|margin.|
                                   il:|Time| il:|to| 
                                   il:|stop.|)

               (il:closef? il:tmsg)
               (return
                (cond
                   ((il:listp il:lastb)
                                   (il:* il:\; il:|is| 
                                   il:\a il:|space| 
                                   il:|we| il:|can| 
                                   il:|break| il:|the| 
                                   il:|line| il:|at.|
                                   il:|Break| il:|there.|)

                    il:lastb)
                   (t              (il:* il:\; il:|were| 
                                   il:|no| il:|spaces| 
                                   il:|on| il:|this| 
                                   il:|line.| il:|Break| 
                                   il:|after| il:|the| 
                                   il:|last| 
                                   il:|character| 
                                   il:|that| il:|did| 
                                   il:|fit.|)

                      (cons (il:idifference il:i 2)
                            (il:idifference
                             il:width
                             (il:idifference il:tx
                                    (il:charwidth il:ch 
                                           il:font))))))))
              ((il:eofp il:tmsg)   (il:* il:\; il:|was| 
                                   il:|the| il:|last| 
                                   il:|character.|)

               (il:closef? il:tmsg)
               (return (cons (il:sub1 il:i)
                             (il:idifference il:width il:tx
                                    ))))
              (t                   (il:* il:\; il:|at| 
                                   il:|the| il:|next| 
                                   il:|character.|)

               (il:setq il:ch (il:bin il:tmsg))
               (il:selcharq il:ch
                     ((il:space il:\. il:\: il:\; il:\, / 
                             il:\\ il:* - il:\#) 
                                   (il:* il:\; il:|where| 
                                   il:|word| il:|breaks| 
                                   il:|are,| il:|so| 
                                   il:|we| il:|can| 
                                   il:|back| il:|up| 
                                   il:|and| il:|split| 
                                   il:|lines| il:|there| 
                                   il:|if| il:|possible.|)

                            (il:setq il:lastb
                             (cons il:i (il:idifference
                                         il:width il:tx))))
                     (il:cr        (il:* il:\; 
                                   il:|forces| il:\a 
                                   il:|new| il:|line.|)

                            (return (cons (il:iminus il:i)
                                          (il:idifference
                                           il:width il:tx))
                                   ))
                     (il:|if|
                      (and (not (il:u-casep (il:character
                                             il:ch)))
                           (not (il:eofp il:tmsg))
                           (il:u-casep (il:peekc il:tmsg)))
                         il:|then| (il:* il:\; il:|from| 
                                   il:|upper| il:|to| 
                                   il:|lower| il:|case| 
                                   il:|is| il:|also| 
                                   il:\a il:|word| 
                                   il:|break|)

                               (il:setq il:lastb
                                (cons il:i (il:idifference
                                            il:width il:tx)
                                      ))))
               (il:setq il:tx (il:iplus il:tx
                                     (il:charwidth il:ch 
                                            il:font)))))))
       (t                          (il:* il:\; il:|isn't| 
                                   il:\a il:|title;|
                                   il:|return| il:\a 
                                   il:|dummy| il:|entry| 
                                   il:|for| il:|the| 
                                   il:|line| 
                                   il:|formatter.|)

          (cons 0 il:width)))))

(fileclasses
  (il:lambda (il:file)             (il:* il:\; 
                                   "13-DEC-83 09:32")

    (il:filecomslst il:file 'il:classes)))

(items-for-type
  (il:lambda (il:|browser| il:|object| il:|objName| 
                    il:|type|)     (il:* il:\; 
                                   "11-Apr-86 14:54")

    (cond
       ((null (slot-value il:|browser| ''boxed-node))
        (il:|promptprint| il:|browser| 
             "First Box the node which is target for move."
               )
        nil)
       (t (let ((il:|items| (il:sort (il:|listattribute|
                                      il:|object| il:|type|
                                      ))))
               (cond
                  ((null il:|items|)
                   (il:|promptprint| il:|browser|
                          (il:concat il:|objName| 
                                 " has no " il:|type|))
                   nil)
                  (t il:|items|)))))))

(menu-group-size
  (il:lambda (il:|menu-group|)     (il:* il:\; 
                                   "10-Sep-86 09:53")
                                   (il:* il:\; 
                                   il:|Compute| il:|the| 
                                   il:|minimum| il:|size| 
                                   il:|of| il:|the| 
                                   il:|menu| il:|group|)

    (\\menu-group-size il:|menu-group| nil)))

(repaint-menu-window
  (il:lambda (window)              (il:* il:\; 
                                   "10-Sep-86 10:57")
                                   (il:* il:\; 
                                   il:|Repaint| il:|the| 
                                   il:|menus| il:|in| 
                                   il:|the| window)

    (let ((il:|menu-group| (il:windowprop window
                                  'il:|menu-group|)))
         (\\remove-menu-group-from-window il:|menu-group| 
                window)
         (il:clearw window)
         (\\place-menu-group-in-window il:|menu-group|
                (menu-group-size il:|menu-group|)
                window 0 0 (il:windowprop window
                                  'il:width)
                (il:windowprop window 'il:height)
                nil))))

(\\delete-subtree
  (il:lambda (self graph obj)(il:* il:\; 
                            "Edited 10-Jul-87 18:05 by Rao")
                                   (il:* il:\; 
                                   " 5-Jun-86 14:15")
                                   (il:* il:\; "Delte the object and any of its subchildren from the GRAPH")

    (il:|for| il:|child|
       il:|in| (il:|fetch| il:tonodes
                  il:|of| (il:|for| il:|node|
                             il:|in| (il:|fetch| 
                                            il:graphnodes
                                        il:|of| graph)
                             il:|thereis|
                             (eq obj (car il:|node|))))
       il:|when| (not (il:memb il:|child|
                             (slot-value
                              self
                              ''bad-list)))
       il:|do| (pushnew il:|child|
                      (slot-value self ''bad-list))
             (\\delete-subtree self graph il:|child|))))

(\\menu-group-size
  (il:lambda (menu-group vertical?)
                             (il:* il:\; 
                            "Edited 10-Jul-87 19:24 by Rao")
                                   (il:* il:\; 
                                   "10-Sep-86 17:25")
                                   (il:* il:\; 
               "Compute the minimum size of the menu group")

    (il:|if| (il:|type?| il:menu menu-group)
        il:|then| (cons (il:plus 2 (il:|fetch| 
                                          il:imagewidth
                                      il:|of| menu-group))
                        (il:plus 2 (il:|fetch| 
                                          il:imageheight
                                      il:|of| menu-group)))
      il:|elseif| (il:stringp menu-group)
        il:|then| (cons (il:plus 2 (il:stringwidth
                                    menu-group
                                    (il:dspfont nil 
                              il:|WindowTitleDisplayStream|
                                           )))
                        (il:plus 2 (il:fontprop
                                    (il:dspfont nil 
                              il:|WindowTitleDisplayStream|
                                           )
                                    'il:height)))
      il:|elseif| vertical?
        il:|then| (il:|for| il:|menu| il:|in| menu-group
                     il:|bind| (il:|running-size|
                                il:←
                                (cons 0 0))
                           il:|size|
                     il:|do| (il:setq il:|size|
                              (\\menu-group-size il:|menu| 
                                     nil))
                           (setf (car il:|running-size|)
                                 (max il:datum (car 
                                                  il:|size|
                                                    )))
                           (il:|add| (cdr il:|running-size|
                                          )
                                  (cdr il:|size|))
                     il:|finally| (return il:|running-size|
                                         ))
      il:|else| (il:|for| il:|menu| il:|in| menu-group
                   il:|bind| (il:|running-size|
                              il:←
                              (cons 0 0))
                         il:|size|
                   il:|do| (il:setq il:|size|
                            (\\menu-group-size il:|menu| t)
                            )
                         (il:|add| (car il:|running-size|)
                                (car il:|size|))
                         (setf (cdr il:|running-size|)
                               (max il:datum (cdr il:|size|
                                                  )))
                   il:|finally| (return il:|running-size|))
           )))

(\\place-menu-group-in-window
  (il:lambda (il:|menu-group| il:|menu-group-size| window 
                    left bottom width height il:|vertical?|
                    )              (il:* il:\; 
                                   "10-Sep-86 18:52")
                                   (il:* il:\; il:|Place| 
                                   il:|the| 
                                   il:|menu-group| 
                                   il:|in| il:|the| 
                                   il:|region| il:|of| 
                                   il:|the| window 
                                   il:|given| il:|by| 
                                   il:|the| il:|left,| 
                                   il:|bottom,| 
                                   il:|width,| il:|and| 
                                   height)

    (let
     ((il:|excess-width| (il:difference width (car 
                                       il:|menu-group-size|
                                                   )))
      (il:|excess-height| (il:difference height
                                 (cdr il:|menu-group-size|)
                                 )))
     (il:|if| (il:|type?| il:menu il:|menu-group|)
         il:|then| (il:addmenu il:|menu-group| window
                          (il:|create| il:position
                                 il:xcoord il:←
                                 (il:plus left
                                        (il:quotient 
                                          il:|excess-width| 
                                               2))
                                 il:ycoord il:←
                                 (il:plus bottom
                                        (il:quotient 
                                         il:|excess-height| 
                                               2))))
       il:|elseif| (il:stringp il:|menu-group|)
         il:|then|
         (il:resetlst
          (il:resetsave
           nil
           `(il:dspfont ,(il:dspfont (il:dspfont nil 
                              il:|WindowTitleDisplayStream|
                                            )
                                window) ,window))
          (il:centerprintinregion il:|menu-group|
                 (il:createregion left bottom width height)
                 window))
       il:|elseif| il:|vertical?|
         il:|then|
         (il:|for| il:|menu| il:|in| il:|menu-group|
            il:|bind| (il:|space|
                       il:←
                       (il:quotient il:|excess-height|
                              (il:add1 (il:length 
                                            il:|menu-group|
                                              ))))
                  (il:|running-bottom| il:←
                         (il:plus bottom height))
                  il:|menu-size|
            il:|do| (il:setq il:|menu-size|
                     (\\menu-group-size il:|menu| nil))
                  (setf il:|running-bottom|
                        (il:difference il:datum
                               (il:plus il:|space|
                                      (cdr il:|menu-size|))
                               ))
                  (\\place-menu-group-in-window
                   il:|menu| il:|menu-size| window left 
                   il:|running-bottom| width (cdr 
                                             il:|menu-size|
                                                  )
                   nil))
       il:|else|
       (il:|for| il:|menu| il:|in| il:|menu-group|
          il:|bind| (il:|space| il:←
                           (il:quotient il:|excess-width|
                                  (il:add1 (il:length
                                            il:|menu-group|
                                            ))))
                (il:|running-left| il:← left)
                il:|menu-size|
          il:|do| (il:setq il:|menu-size| (
                                          \\menu-group-size
                                           il:|menu| t))
                (il:|add| il:|running-left| il:|space|)
                (\\place-menu-group-in-window il:|menu| 
                       il:|menu-size| window 
                       il:|running-left| bottom
                       (car il:|menu-size|)
                       height t)
                (il:|add| il:|running-left| (car 
                                             il:|menu-size|
                                                 )))))))

(\\portable-graph-node-id
  (il:lambda (il:|id|)             (il:* il:\; 
                                   "15-Aug-86 11:11")
                                   (il:* il:\; 
                                   il:|Create| il:\a 
                                   il:|graph| il:|node| 
                                   il:|id| il:|from| 
                                   il:|the| il:|given| 
                                   il:|id| il:|that| 
                                   il:|can| il:|be| 
                                   il:|ported| il:|to| 
                                   il:|nonLoops| 
                                   il:|systems|)

    (il:|if| (not (il:|Object?| il:|id|))
        il:|then| (il:pack* il:|id|)
      il:|elseif| (il:|GetObjectName| il:|id|)
        il:|then| (il:pack* (list 'il:$ (or (
                                         il:|GetObjectName|
                                             il:|id|)
                                            (il:uid il:|id|
                                                   ))))
      il:|else| (il:pack* (list 'il:$& (il:|classname|
                                        il:|id|)
                                (il:uid il:|id|))))))

(\\remove-menu-group-from-window
  (il:lambda (il:|menu-group| window)
                                   (il:* il:\; 
                                   "10-Sep-86 17:26")
                                   (il:* il:\; 
                                   il:|Remove| il:|the| 
                                   il:|menu| il:|group| 
                                   il:|from| il:|the| 
                                   window)

    (il:|if| (il:stringp il:|menu-group|)
        il:|then| nil
      il:|elseif| (il:listp il:|menu-group|)
        il:|then| (il:|for| il:|menu| il:|in| 
                                            il:|menu-group|
                     il:|do| (
                            \\remove-menu-group-from-window
                              il:|menu| window))
      il:|elseif| (il:memb il:|menu-group|
                         (il:windowprop window 'il:menu))
        il:|then| (il:deletemenu il:|menu-group| nil window
                         ))))
)
(il:defineq

(tree-roots
  (il:lambda (node-lst)      (il:* il:\; 
                            "Edited 10-Jul-87 19:22 by Rao")
                                   (il:* il:\; 
                                   "29-Sep-86 19:46")
      
      (il:* il:|;;| "Computes a minimal set of root nodes for a lattice --- those with no connections TO them in list of nodes, or a single node from a cycle of nodes.")

    (prog ((root-nodes (il:ldifference
                        node-lst
                        (il:|for| il:|node| il:|in| 
                                                  node-lst
                           il:|join| (child-nodes il:|node| 
                                            node-lst))))
           reachable-nodes not-reachable-nodes)
          (setq reachable-nodes (il:copy root-nodes))
          (setq not-reachable-nodes (il:ldifference 
                                           node-lst 
                                           reachable-nodes)
                )                  (il:* il:\; "recompute the nodes that can't be reached from the current rootNodes")

      il:|RecomputeReachableNodes|
          
      
      (il:* il:|;;| "Compute the transitive closure of the set of reachableNodes --- updating the notReachableNodes at the same time")

          (il:|for| il:|node| il:|in| reachable-nodes
             il:|do| (il:|for| il:|childNode|
                        il:|in| (child-nodes il:|node| 
                                       node-lst)
                        il:|when| (il:memb il:|childNode| 
                                        not-reachable-nodes
                                         )
                        il:|do| 
      
      (il:* il:|;;| "put the newly found reachable node at the end of the list, so we will find it later on during this iteration")

                              (il:nconc1 reachable-nodes 
                                     il:|childNode|)
                              (setq not-reachable-nodes
                                    (il:dremove 
                                           il:|childNode| 
                                        not-reachable-nodes
                                           ))))
                                   (il:* il:\; 
                   "if we can reach all the nodes, fine...")

          (il:|if| (null not-reachable-nodes)
              il:|then|            (il:* il:\; 
                  "Now need to prune down to a minimal set")

              (il:|bind| (il:|stable?| il:← nil)
                 il:|until| il:|stable?|
                 il:|do|
                 (setq il:|stable?| t)
                 (il:|for| il:|node| il:|in| root-nodes
                    il:|bind| il:|extraRoots|
                    il:|do|
                    (setq il:|extraRoots|
                          (il:dremove il:|node|
                                 (il:intersection
                                  root-nodes
                                  (reachable-nodes! 
                                         il:|node| node-lst
                                         ))))
                    (il:|if| il:|extraRoots|
                        il:|then| (setq il:|stable?| nil)
                              (setq root-nodes
                                    (il:ldifference 
                                           root-nodes 
                                           il:|extraRoots|)
                                    )
                              (return t))
                    il:|finally| (return nil))) 
                                   (il:* il:\; 
                  "return the node ids, not the GRAPHNODES")

              (return (il:|for| il:|node| il:|in| 
                                                root-nodes
                         il:|collect| (il:|fetch| il:nodeid
                                         il:|of| il:|node|)
                             ))
            il:|else|              (il:* il:\; "must be a cycle.  Select the least prolific node in the cycle as the a new root node.")

            (il:|push|
             root-nodes
             (let ((prolific-node
                    (il:|for| il:|node| il:|in| 
                                        not-reachable-nodes
                       il:|smallest| (il:length
                                      (il:|fetch| 
                                             il:tonodes
                                         il:|of| il:|node|)
                                      ))))
                  (setq not-reachable-nodes
                        (il:dremove prolific-node 
                               not-reachable-nodes))
                  prolific-node))
            (go il:|RecomputeReachableNodes|)))))

(child-nodes
  (il:lambda (parent-node node-list)
                             (il:* il:\; 
                            "Edited 10-Jul-87 19:23 by Rao")
                                   (il:* il:\; 
                                   " 8-Oct-85 14:15")
                                   (il:* il:\; "Find all GRAPHNODES that are immediatly reachable from this node")

    (il:|for| il:|label| il:|in| (il:|fetch| il:tonodes
                                    il:|of| parent-node)
       il:|collect| (il:|for| il:|node| il:|in| node-list
                       il:|thereis| (eq il:|label|
                                        (il:|fetch| 
                                               il:nodeid
                                           il:|of| 
                                                 il:|node|)
                                        )))))

(reachable-nodes!
  (il:lambda (il:|root| il:|nodeList|)
                                   (il:* il:\; 
                                   "30-Sep-86 10:22")
                                   (il:* il:\; 
                                   il:|Return| il:\a 
                                   il:|list| il:|of| 
                                   il:|all| il:|nodes| 
                                   il:|that| il:|are| 
                                   il:|reachable| 
                                   il:|from| il:|the| 
                                   il:|root|)

    (let ((il:|reachableNodes| (list il:|root|)))
         (il:|for| il:|node| il:|in| il:|reachableNodes|
            il:|do| (il:|for| il:|childNode|
                       il:|in| (child-nodes il:|node| 
                                      il:|nodeList|)
                       il:|when| (not (il:memb 
                                             il:|childNode| 
                                        il:|reachableNodes|
                                             ))
                       il:|do|     (il:* il:\; il:|put| 
                                   il:|the| il:|newly| 
                                   il:|found| 
                                   il:|reachable| 
                                   il:|node| il:|at| 
                                   il:|the| il:|end| 
                                   il:|of| il:|the| 
                                   il:|list,| il:|so| 
                                   il:|we| il:|will| 
                                   il:|find| il:|it| 
                                   il:|later| il:|on| 
                                   il:|during| il:|this| 
                                   il:|iteration|)

                             (il:nconc1 il:|reachableNodes| 
                                    il:|childNode|)))
         il:|reachableNodes|)))
)

(il:rpaq web-stream il:promptwindow)

(il:rpaqq il:|BrowserMargin| 0)

(il:rpaqq il:grayshade1 1)

(il:rpaqq il:grayshade2 1025)

(il:rpaqq il:grayshade3 64510)

(il:rpaqq il:grayshade4 65534)

(il:rpaqq il:|MaxLatticeHeight| 750)

(il:rpaqq il:|MaxLatticeWidth| 900)

(il:rpaqq il:|NestedMenuFlg| t)
(il:declare\: il:doeval@compile il:dontcopy

(il:specvars il:|MaxLatticeHeight| il:|MaxLatticeWidth|)
)



(il:* il:|;;;| " PCL Utils")


(defun pcl::objectp (obj) (pcl::pcl-object-p (class-of
                                              obj)))


(defun pcl::instance-of-p (obj class-name) nil)


(defun pcl::understands (obj command)
   (and (fboundp command)
        (pcl::lookup-method (symbol-function command)
               (class-of obj))))


(defun pcl::get-object-rec (obj) (if (typep (class-of
                                             obj)
                                            'object)
                                     obj nil))




(il:* il:|;;;| "")

(il:declare\: il:donteval@load il:doeval@compile il:dontcopy
 il:compilervars 

(il:addtovar il:nlama )

(il:addtovar il:nlaml lispx-send)

(il:addtovar il:lama window-when-held-fn 
                           window-when-held-fn 
                           web-window-expand-fn 
                           web-window-reshape-fn 
                           web-window-button-event-fn 
                           web-window-after-move-fn)
)
(il:putprops il:web-editor il:copyright ("Xerox Corporation"
 1987))
(il:declare\: il:dontcopy
  (il:filemap (nil (38070 41167 (web-window-after-move-fn 
38083 . 38485) (web-window-button-event-fn 38487 . 38990) (
web-window-reshape-fn 38992 . 39598) (web-window-close-fn 
39600 . 39902) (il:|PromptRead| 39904 . 41165)) (41168 41617
 (web-window-expand-fn 41181 . 41615)) (69700 70929 (
web-menu-whenselectedfn 69713 . 70434) (window-when-held-fn 
70436 . 70927)) (70930 76196 (sub-item-selection 70943 . 
72107) (dual-sub-items 72109 . 73226) (window-when-held-fn 
73228 . 73719) (do-menu-method 73721 . 74092) (dual-menu 
74094 . 74817) (dual-selection 74819 . 76194)) (78958 80737 
(eval.in.tty.context 78971 . 80144) (lispx-send 80146 . 
80735)) (112425 115548 (find-selected-node 112438 . 115546))
 (115549 146417 (add-menu-window 115562 . 118022) (
box-print-string 118024 . 124130) (box-window-node 124132 . 
125901) (break-string-for-boxing 125903 . 133274) (
fileclasses 133276 . 133446) (items-for-type 133448 . 134263
) (menu-group-size 134265 . 134741) (repaint-menu-window 
134743 . 135606) (\\delete-subtree 135608 . 136648) (
\\menu-group-size 136650 . 139580) (
\\place-menu-group-in-window 139582 . 144120) (
\\portable-graph-node-id 144122 . 145393) (
\\remove-menu-group-from-window 145395 . 146415)) (146418 
154133 (tree-roots 146431 . 151237) (child-nodes 151239 . 
152127) (reachable-nodes! 152129 . 154131)))))
il:stop