;****************************************************************************** ; ; Project : STk-inspect, a graphical debugger for STk ; ; File name : inspect-main.stk ; Creation date : Aug-10-1993 ; Last update : Sep-17-1993 ; ;****************************************************************************** ; ; This file implements the "General inspector". ; ;****************************************************************************** (provide "inspect-main") (require "inspect-misc") (require "inspect-view") (require "inspect-detail") (require "inspect-help") (define INSPECTOR_WIDGET_NAME ".inspector") (define inspected-objects-list ()) (define (inspected? obj) (member obj inspected-objects-list)) (define (inspect-frame-wid obj) (widget INSPECTOR_WIDGET_NAME ".f1." (object-symbol obj))) (define (inspect-frame-str obj) (& INSPECTOR_WIDGET_NAME ".f1." (object-symbol obj))) (define (inspect-l-wid obj) (widget (inspect-frame-str obj) ".l")) (define (inspect-l-str obj) (& (inspect-frame-str obj) ".l")) (define (inspect-e-wid obj) (widget (inspect-frame-str obj) ".e")) (define (inspect-e-str obj) (& (inspect-frame-str obj) ".e")) (define (inspect-mb-wid obj) (widget (inspect-frame-str obj) ".mb")) (define (inspect-mb-str obj) (& (inspect-frame-str obj) ".mb")) (define (inspect-m-str obj) (& (inspect-frame-str obj) ".mb.m")) (define (inspect-m-wid obj) (widget (inspect-frame-str obj) ".mb.m")) ;---- Inspector menu (define (create-inspect-menu obj) (define w (eval [menu (inspect-m-str obj)])) (w 'add 'command :label "Uninspect" :command `(inspect-menu-Uninspect ',(object-symbol obj))) (w 'add 'command :label "Detail" :command `(inspect-menu-Detail ',(object-symbol obj))) (if (detailed? obj) ((inspect-m-wid obj) 'disable "Detail")) (w 'add 'command :label "View" :command `(inspect-menu-View ',(object-symbol obj))) (if (viewed? obj) ((inspect-m-wid obj) 'disable "View"))) (define (inspect-menu-Eval obj) (eval-string (format #f "(set! ~a ~a)" obj ((inspect-e-wid obj) 'get)))) (define (inspect-menu-Quote obj) (eval-string (format #f "(set! ~a '~a)" obj ((inspect-e-wid obj) 'get)))) (define (inspect-menu-Uninspect key) (uninspect (find-object-infos key))) (define (inspect-menu-Detail key) (let ((obj (find-object-infos key))) (detail obj) ((inspect-m-wid obj) 'disable "Detail") (if (viewed? obj) ((view-m-wid obj) 'disable "Detail")))) (define (inspect-menu-View key) (let ((obj (find-object-infos key))) (view obj) ((inspect-m-wid obj) 'disable "View") (if (detailed? obj) ((detail-m-wid obj) 'disable "View")))) (define (create-inspector) (define w [toplevel INSPECTOR_WIDGET_NAME]) (wm 'title w "General inspector") (wm 'maxsize w SCREEN_WIDTH SCREEN_HEIGHT) (define menu-w (create-menu-widget (& INSPECTOR_WIDGET_NAME ".menu"))) (pack menu-w :side "top" :fill "x" :padx 4 :pady 2) ((widget menu-w ".help.m") 'add 'command :label "General inspector" :command '(stk:make-help General-Inspector-help)) (pack [menubutton (& INSPECTOR_WIDGET_NAME ".menu.command") :text "Command"] :side "left") (define cmd-w (eval [menu (& INSPECTOR_WIDGET_NAME ".menu.command.m")])) (cmd-w 'add 'command :label "Uninspect all" :command '(destroy-inspector)) (cmd-w 'add 'command :label "Undebug" :command '(undebug)) (tk-set! (widget INSPECTOR_WIDGET_NAME ".menu.command") :menu cmd-w) (pack [frame (& INSPECTOR_WIDGET_NAME ".caption")] :side "top" :fill "x" :padx 4) (pack [label (& INSPECTOR_WIDGET_NAME ".caption.l1") :text "Objects" :width 20] :side "left") (pack [label (& INSPECTOR_WIDGET_NAME ".caption.l2") :text "Values" :width 40] :side "left" :padx 4) (pack [frame (& INSPECTOR_WIDGET_NAME ".f1")] :fill "both" :expand "yes" :padx 4 :pady 2)) (define (destroy-inspector) (for-each uninspect-object inspected-objects-list)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; ;;;; inspect ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (inspect obj) (when (= (winfo 'exist INSPECTOR_WIDGET_NAME) 0) (create-inspector)) ;; Kludge to avoid problems . Should be modified [eg] (let ((obj-val (inspect::eval obj))) (when (eqv? (inspect::typeof obj-val) 'widget) (set! obj obj-val))) (unless (inspected? obj) (inspect-object obj) (let ((obj-val (format #f "~S" (inspect::eval obj)))) (pack [frame (inspect-frame-str obj)] :side "top" :fill "x") (pack [menubutton (inspect-mb-str obj) :relief "raised" :bd 2 :bitmap BITMAP_MENU] :side "right") (pack [label (inspect-l-str obj) :relief "groove" :bd 2 :anchor "w" :text (format #f "~S" obj) :width 20 :font MEDIUM_FONT] :side "left") (pack [entry (inspect-e-str obj) :relief "sunken" :bd 2 :width 40] :fill "x" :expand "yes" :padx 4) (create-inspect-menu obj) (tk-set! (inspect-mb-wid obj) :menu (inspect-m-wid obj)) (let ((E (inspect-e-wid obj))) (E 'insert 0 obj-val) ;; If obj is a symbol, lets the entry modifiable. Otherwise let it as is (if (modifiable-object? obj) [begin (bind E "" `(inspect-menu-Eval ',obj)) (bind E "" `(inspect-menu-Quote ',obj))] [inspect::shadow-entry E])))) ;; Destroy Event -> set the list of inspected object to '() (bind INSPECTOR_WIDGET_NAME "" '(set! inspected-objects-list '())) ;; Allow resizing only in width (update 'idletasks) (let ((req-h (winfo 'reqheight INSPECTOR_WIDGET_NAME))) (wm 'minsize INSPECTOR_WIDGET_NAME 0 req-h) (wm 'maxsize INSPECTOR_WIDGET_NAME SCREEN_WIDTH req-h) (wm 'geometry INSPECTOR_WIDGET_NAME (& (winfo 'width INSPECTOR_WIDGET_NAME) "x" req-h)))) (define (inspect-object obj) (set! inspected-objects-list (cons obj inspected-objects-list)) (unless (object-infos obj) (add-object-infos obj) (if (symbol? obj) (trace-var obj `(update-object ',obj))))) (define (inspect-display obj) (let ((entry-w (inspect-e-wid obj))) (entry-w 'delete 0 'end) (entry-w 'insert 0 (->object (eval obj))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; ;;;; uninspect ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (uninspect obj) (when (inspected? obj) (uninspect-object obj)) (update 'idletasks) (when (= (winfo 'exist INSPECTOR_WIDGET_NAME) 1) (let ((req-h (winfo 'reqheight INSPECTOR_WIDGET_NAME))) (wm 'minsize INSPECTOR_WIDGET_NAME 0 req-h) (wm 'maxsize INSPECTOR_WIDGET_NAME SCREEN_WIDTH req-h) (wm 'geometry INSPECTOR_WIDGET_NAME (& (winfo 'width INSPECTOR_WIDGET_NAME) "x" req-h))))) (define (uninspect-object obj) (set! inspected-objects-list (list-remove obj inspected-objects-list)) (destroy (inspect-frame-wid obj)) (when (null? inspected-objects-list) (destroy INSPECTOR_WIDGET_NAME)) (if (detailed? obj) ((detail-m-wid obj) 'enable "Inspect")) (if (viewed? obj) ((view-m-wid obj) 'enable "Inspect")) (unless (or (detailed? obj) (viewed? obj)) (remove-object-infos obj) (if (symbol? obj) (untrace-var obj))))