/* * Created on 20.06.2005 * */ package org.jdesktop.swingx.util; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Stack; import java.util.Vector; import javax.swing.table.AbstractTableModel; import javax.swing.tree.TreeModel; /** * A static snapshot of a container hierarchy. * * NOTE: does not listen to any property changes of * contained components - cell updates are arbitrary on * repaint only! * * @author Jeanette Winzenburg */ public class ComponentTableModel extends AbstractTableModel { public int getRowCount() { return components.size(); } public Class getColumnClass(int column) { switch (column) { case 0: return String.class; case 1: return Point.class; case 2: return Dimension.class; default: return Object.class; } } public int getColumnCount() { return 3; } public String getColumnName(int column) { switch (column) { case 0: return "Type"; case 1: return "Location"; case 2: return "Size"; default: return "Column " + column; } } public Object getValueAt(int row, int column) { Component comp = (Component) components.get(row); switch (column) { case 0: return convertValueToText(comp); case 1: return comp.getLocation(); case 2: return comp.getSize(); default: return null; } } public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } public void setValueAt(Object aValue, int rowIndex, int columnIndex) { } private List components = new ArrayList(); public void updateComponentList(TreeModel model) { components = new ArrayList(); Enumeration enumeration = new PreorderEnumeration(model); while (enumeration.hasMoreElements()) { components.add(enumeration.nextElement()); } fireTableDataChanged(); } public String convertValueToText(Object node) { String className = node.getClass().getName(); int lastDot = className.lastIndexOf("."); String lastElement = className.substring(lastDot + 1); return lastElement; } // -------------------- helper classes for traversing the tree // -------------------- c&p from Santhosh Kumar // --------------------http://jroller.com/page/santhosh/20050607#tree_inside_jcombobox class ChildrenEnumeration implements Enumeration{ TreeModel treeModel; Object node; int index = -1; public ChildrenEnumeration(TreeModel treeModel, Object node){ this.treeModel = treeModel; this.node = node; } public boolean hasMoreElements(){ return index<treeModel.getChildCount(node)-1; } public Object nextElement(){ return treeModel.getChild(node, ++index); } } class PreorderEnumeration implements Enumeration{ private TreeModel treeModel; protected Stack stack; public PreorderEnumeration(TreeModel treeModel){ this.treeModel = treeModel; Vector v = new Vector(1); v.addElement(treeModel.getRoot()); stack = new Stack(); stack.push(v.elements()); } public boolean hasMoreElements(){ return (!stack.empty() && ((Enumeration)stack.peek()).hasMoreElements()); } public Object nextElement(){ Enumeration enumer = (Enumeration)stack.peek(); Object node = enumer.nextElement(); if(!enumer.hasMoreElements()) stack.pop(); Enumeration children = new ChildrenEnumeration(treeModel, node); if(children.hasMoreElements()) stack.push(children); return node; } } }