X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/ade112f80d1cd6c323769d60784e7e8eb623687f..9176d3016a7e5a30d32cbbb68ba4cfbac6ef4394:/examples/ginspect.lisp diff --git a/examples/ginspect.lisp b/examples/ginspect.lisp index f16abd1..25b49d1 100644 --- a/examples/ginspect.lisp +++ b/examples/ginspect.lisp @@ -1,4 +1,35 @@ -(in-package :gtk) +;; Common Lisp bindings for GTK+ 2.x +;; Copyright 2005 Espen S. Johnsen +;; +;; Permission is hereby granted, free of charge, to any person obtaining +;; a copy of this software and associated documentation files (the +;; "Software"), to deal in the Software without restriction, including +;; without limitation the rights to use, copy, modify, merge, publish, +;; distribute, sublicense, and/or sell copies of the Software, and to +;; permit persons to whom the Software is furnished to do so, subject to +;; the following conditions: +;; +;; The above copyright notice and this permission notice shall be +;; included in all copies or substantial portions of the Software. +;; +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +;; $Id: ginspect.lisp,v 1.8 2006-02-03 00:15:52 espen Exp $ + +#+sbcl(require :gtk) +#+cmu(asdf:oos 'asdf:load-op :gtk) + +(defpackage "GINSPECT" + (:use "COMMON-LISP" "GLIB" "GTK" #+cmu"PCL" #+sbcl"SB-PCL") + (:export "GINSPECT")) + +(in-package "GINSPECT") (defvar *ginspect-unbound-object-marker* #+cmu (gensym "UNBOUND-OBJECT-") @@ -11,6 +42,12 @@ (defgeneric decompose-describe-object (object)) +;; A container to hold lisp objects "inside" the tree store +(defclass object-container (gobject) + ((object :initarg :object)) + (:metaclass gobject-class)) + + (defun ginspect (object) (let* ((store (make-instance 'tree-store :column-types '(string string gobject boolean) @@ -22,24 +59,24 @@ (object (make-instance 'cell-renderer-text))) (tree-view-append-column view column) (cell-layout-pack column name :expand nil) - (cell-layout-add-attribute column name 'text 'name store) + (cell-layout-add-attribute column name 'text (column-index store 'name)) (cell-layout-pack column object :expand t) - (cell-layout-add-attribute column object 'text 'pprinted store)) + (cell-layout-add-attribute column object 'text (column-index store 'pprinted))) (insert-object object store nil) (signal-connect view 'row-expanded #'(lambda (iter path) (when (setf - (tree-model-column-value store iter 'expanded) - (not (tree-model-column-value store iter 'expanded))) + (tree-model-value store iter 'expanded) + (not (tree-model-value store iter 'expanded))) (multiple-value-bind (valid child-iter) (tree-model-iter-children store iter) ;; Remove old children (when valid (loop while (tree-store-remove store child-iter)))) - (let ((gobject (tree-model-column-value store iter 'object))) - (insert-parts (object-data gobject 'object) store iter)) + (let ((container (tree-model-value store iter 'object))) + (insert-parts (slot-value container 'object) store iter)) (tree-view-expand-row view path nil)))) (make-instance 'dialog @@ -57,7 +94,7 @@ (if (equal parts (list object)) (values description nil nil) (values description named-p parts))) - (sb-impl::inspected-parts object)) + #+sbcl(sb-impl::inspected-parts object)) (defmethod decompose-describe-object ((object (eql t))) (values (call-next-method) nil nil)) @@ -84,15 +121,16 @@ (defmethod decompose-describe-object ((object symbol)) (values (call-next-method) t - (cons "Name" (symbol-name object)) - (cons "Package" (symbol-package objecy)) - (cons "Value" (if (boundp object) - (symbol-value object) - *ginspect-unbound-object-marker*)) - (cons "Function" (if (fboundp object) - (symbol-function object) - *ginspect-unbound-object-marker*)) - (cons "Plist" (symbol-plist object)))) + (list + (cons "Name" (symbol-name object)) + (cons "Package" (symbol-package object)) + (cons "Value" (if (boundp object) + (symbol-value object) + *ginspect-unbound-object-marker*)) + (cons "Function" (if (fboundp object) + (symbol-function object) + *ginspect-unbound-object-marker*)) + (cons "Plist" (symbol-plist object))))) #+cmu (defmethod decompose-describe-object ((object standard-object)) @@ -103,7 +141,7 @@ collect (let* ((slot-name (pcl:slot-definition-name slotd)) (slot-value (if (slot-boundp object slot-name) (slot-value object slot-name) - *inspect-unbound-object-marker*))) + *ginspect-unbound-object-marker*))) (cons (string slot-name) slot-value))))) @@ -128,15 +166,14 @@ "") (defmethod insert-object ((object t) store parent &optional (name "")) - (let ((gobject (make-instance 'gobject)) ; to "hang" the lisp object on + (let ((container (make-instance 'object-container :object object)) (has-parts (object-has-parts-p object))) - (setf (object-data gobject 'object) object) (let ((iter (tree-store-append store parent (vector name (object-to-string object) - gobject (not has-parts))))) + container (not has-parts))))) (when has-parts ;; Insert dummy child - (tree-store-append store iter (vector "" "" gobject t)))))) + (tree-store-append store iter (vector "" "" container t)))))) (defmethod insert-parts :around ((object t) store parent) (when (object-has-parts-p object)