package mocap.gui;
|
|
import java.awt.BorderLayout;
|
import java.awt.Dimension;
|
|
import javax.swing.BorderFactory;
|
import javax.swing.JLabel;
|
import javax.swing.JPanel;
|
import javax.swing.JScrollPane;
|
import javax.swing.JTree;
|
import javax.swing.event.TreeSelectionEvent;
|
import javax.swing.event.TreeSelectionListener;
|
import javax.swing.tree.DefaultMutableTreeNode;
|
import javax.swing.tree.DefaultTreeModel;
|
import javax.swing.tree.TreePath;
|
|
import mocap.figure.Bone;
|
|
/**
|
* Shows the skeletal hierarchy in a tree.
|
*
|
* @author Michael Kipp
|
*/
|
public class BoneHierarachyTree extends JPanel implements TreeSelectionListener {
|
|
private JTree _tree;
|
private JLabel _info;
|
private BoneInfoPanel _boneInfo;
|
private Bone _prevSelected;
|
|
public BoneHierarachyTree(BoneInfoPanel bip) {
|
setLayout(new BorderLayout());
|
_boneInfo = bip;
|
_info = new JLabel("--");
|
_info.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
|
_tree = new JTree();
|
_tree.addTreeSelectionListener(this);
|
JScrollPane sp = new JScrollPane(_tree);
|
add(BorderLayout.NORTH, _info);
|
add(BorderLayout.CENTER, sp);
|
sp.setPreferredSize(new Dimension(200, 800));
|
}
|
|
public void loadSkeleton(Bone skel) {
|
_tree.removeAll();
|
DefaultMutableTreeNode r = new DefaultMutableTreeNode("skeleton");
|
r.add(createNodes(skel));
|
_tree.setModel(new DefaultTreeModel(r));
|
|
for (int i = 0; i < _tree.getRowCount(); i++) {
|
_tree.expandRow(i);
|
}
|
}
|
|
private DefaultMutableTreeNode createNodes(Bone b) {
|
final Bone b1 = b;
|
DefaultMutableTreeNode n = new DefaultMutableTreeNode(b) {
|
|
@Override
|
public String toString() {
|
return b1.getName();
|
}
|
};
|
for (int i = 0; i < b.getChildren().length; i++) {
|
n.add(createNodes(b.getChildren()[i]));
|
}
|
return n;
|
}
|
|
public Bone getSelectedBone() {
|
TreePath p = _tree.getSelectionPath();
|
if (p != null) {
|
DefaultMutableTreeNode n = (DefaultMutableTreeNode) p.getLastPathComponent();
|
return n.getUserObject() instanceof Bone ? (Bone) n.getUserObject() : null;
|
}
|
return null;
|
}
|
|
public void valueChanged(TreeSelectionEvent e) {
|
Bone b = getSelectedBone();
|
if (b != null) {
|
_info.setText(b.getName());
|
_boneInfo.setBone(b);
|
b.setSelected(true);
|
if (_prevSelected != null) {
|
_prevSelected.setSelected(false);
|
}
|
_prevSelected = b;
|
}
|
}
|
}
|