I have improved on chouser's gview code (http://blog.n01se.net/?
p=30).  It can now expand java.awt.Container objects.  I haven't
implemented this, but it would be nice to pass in a function to filter
leaves/nodes.

(defn container? [obj]
  (instance? (. (java.awt.Container.) getClass) obj))

(ns gview
  (:import (javax.swing JFrame JScrollPane JTree)))

(defn- make-node
  ([parent obj]
     (if (container? obj)
       (make-node parent obj #'identity #(. %1 getComponents))
       (make-node parent obj #'coll? #'seq)))
  ([parent obj ischildfn getchildfn]
       (proxy [javax.swing.tree.TreeNode] []
         (toString []          (pr-str obj))
         (getAllowsChildren [] (ischildfn obj))
         (getChildAt [i]       (make-node this (nth (getchildfn obj)
i)))
         (getChildCount []     (count (getchildfn obj)))
         (getIndex [n]         -1)
         (getParent []         parent)
         (isLeaf []            (not (ischildfn obj))))))

(defn gview [obj]
  (doto (JFrame.)
    (.add (JScrollPane. (JTree. (make-node nil obj))))
    (.setTitle (str "gview: " (.getName (class obj))))
    (.setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE)
    (.pack)
    (setVisible true)))
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to