Another aggretrees demo, operable upon ASDF systems

Sean Champ <[email protected]> Tue, 2 Aug 2005 21:48:29 -0700
Newsgroups gmane.lisp.garnet.user
Message-ID <[email protected]>
The following is similar to the demo presented with the #'DIRECTORY
call (presented in a previous email, and presented as derived, as the
folloiwng is, upon an aggretrees demo).  It's based on aggretrees.lisp
from the Garnet src/contrib directory.


As defined, below, the function SYSTEM-TREE.CREATE will operate upon a
defined ASDF system. The function must be given an ASDF system or a
system-name, as an argument. 

In the window that should be displayed upon execution of
SYSTEM-TREE.SHOW, one may left-click upon the label of an ASDF:MODULE
component (displayed in the window) to see what components are
contained within the identified module.


Possible revisions: 

- It could use some property-lists that would be executed upon
  selection of the component objects, certainly. 'Middle-click' should
  work.

- Colors, colors, something more than black-and-white

- Supporting more system-definition facilities than ASDF


FOr now: Below, it is. I hope it's of interest to someone.

-- 
Sean Champ
[email protected]




(in-package #:cl-user)

(garnet-load  "contrib-src:aggretrees")

(defun system-tree.create (system)
  (create-instance nil gg:aggretree-2
    (:expansion-level 1)
    (:tree  (etypecase system
	      (asdf:system system)
	      (symbol (asdf:find-system system))))
    (:children-function
     #'(lambda (component)
	 (handler-case
	     (asdf:module-components component)
	   (pcl::no-applicable-method-error () nil))))
    
    (:node-prototype
     (create-instance nil opal:text
       (:string  (o-formula
		  (let ((component (gvl :tree)))
		    (format nil "~a ~15T[~s]"
		       (asdf:component-name component)
		       (type-of component)))))))
    (:interactors
     `((:selection-inter ,inter:button-interactor
	(:window ,(o-formula (gv-local :self :operates-on :window)))
	(:start-where ,(o-formula (list :element-of
					(gvl :operates-on
					     :nodes-aggregate))))
	(:start-event :leftdown)
	(:final-function
	 ,#'(lambda (inter ob)
	      (let ((level (g-value ob :expansion-level)))
		(s-value ob :expansion-level
			 (if (> level 0) 0 1))
		(gg:revert-aggretree-node
		 (g-value ob :parent :parent) ob)
		(opal:update (g-value ob :window) t)))))))))


(defun system-tree.show (pathname)
  (let* ((aggretree (system-tree.create pathname))
	 (window (create-instance nil inter:interactor-window
		   (:aggregate aggretree))))
    (opal:update window)
    (inter:main-event-loop)
    (values window)))

;; e.g: (defparameter *w* (system-tree.show :aserve))

(defun system-tree.stop (window)
  (opal:destroy window))

;; e.g: (system-tree.stop *w*)