package ui.view.holarchy; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Image; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import classes.Holon; import classes.HolonElement; import classes.HolonObject; import ui.controller.Control; import ui.view.outliner.TreeUtils; import util.ImageImport; public class HolarchyTreePanel extends JPanel { private Control control; private JTree holonTree; private DefaultMutableTreeNode root; private HolarchyWindow parentFrame; public HolarchyTreePanel(HolarchyWindow parentFrame, Control control) { this.control = control; this.setLayout(new BorderLayout()); this.parentFrame = parentFrame; initilizePanel(); } public void initilizePanel() { holonTree = generateTree(); holonTree.setCellRenderer(new HolonJtreeRenderer()); holonTree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); ToolTipManager.sharedInstance().registerComponent(holonTree); TreeUtils.expand(holonTree); holonTree.setRootVisible(true); holonTree.setEditable(true); this.add(TreeUtils.makePanelFromTree(holonTree)); } public void update() { this.removeAll(); this.initilizePanel(); } private JTree generateTree() { root = generateFromHolon(control.getModel().getStateHolon()); return new JTree(root); } private DefaultMutableTreeNode generateFromHolon(Holon holon) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(new HolonInfo(holon)); for(Holon child : holon.getChildView()) { node.add(generateFromHolon(child)); } return node; } private void updateTreeStructure() { holonTree.clearSelection(); root.removeAllChildren(); Holon holon = control.getModel().getStateHolon(); for(Holon child : holon.getChildView()) { root.add(generateFromHolon(child)); } holonTree.updateUI(); TreeUtils.expand(holonTree); } interface HolonNode{ public Icon getIcon(); public String getToolTip(); public void SetName(String name); } static final Icon holonIcon = new ImageIcon(ImageImport.loadImage("/Button_Images/holon_logic.png",16,16)); static final Icon holonPhysicalIcon = new ImageIcon(ImageImport.loadImage("/Button_Images/holon_physical.png",16,16)); static final String holonToolTip = "Holon"; class HolonInfo implements HolonNode{ private Holon holon; HolonInfo(Holon holon){ this.holon = holon; } @Override public String toString(){ return holon.name+" "+holon.getUniqueID(); } public Holon getElement() { return holon; } public void AddElement(HolonElement element) { if(element.holon != null) { element.holon.removeElement(element); } holon.addElement(element); } public void AddHolon(Holon holon) { holon.removeFromParent(); this.holon.merge(holon, true); } @Override public Icon getIcon() { BufferedImage image = new BufferedImage(16, 16, BufferedImage.TYPE_INT_BGR); for(int i=0; i<16; i++) { for(int j=0; j<16; j++) { image.setRGB(i, j, parentFrame.holarchyPanel.coloredHolons.get(this.holon).getRGB()); } } return new ImageIcon(image); // return holon.isPhysical? holonPhysicalIcon : holonIcon; } @Override public String getToolTip() { return holonToolTip; } @Override public void SetName(String name) { holon.name = name; } } //Cell Display class HolonJtreeRenderer extends DefaultTreeCellRenderer { public Component getTreeCellRendererComponent( JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus); DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; HolonNode Node = (HolonNode) node.getUserObject(); if(row != 0) { this.setIcon(Node.getIcon()); this.setToolTipText(Node.getToolTip()); } return this; } } }