package com.pixelmaid.dresscode.app; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.FlowLayout; import java.net.URL; import java.util.ArrayList; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTree; import javax.swing.SwingConstants; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreeNode; import javax.swing.tree.TreeSelectionModel; import com.pixelmaid.dresscode.antlr.types.tree.NodeEvent; import com.pixelmaid.dresscode.drawing.primitive2d.ComplexPolygon; import com.pixelmaid.dresscode.drawing.primitive2d.Curve; import com.pixelmaid.dresscode.drawing.primitive2d.Drawable; import com.pixelmaid.dresscode.drawing.primitive2d.DrawablePoint; import com.pixelmaid.dresscode.drawing.primitive2d.Ellipse; import com.pixelmaid.dresscode.drawing.primitive2d.LShape; import com.pixelmaid.dresscode.drawing.primitive2d.Line; import com.pixelmaid.dresscode.drawing.primitive2d.Polygon; import com.pixelmaid.dresscode.drawing.primitive2d.Rectangle; import com.pixelmaid.dresscode.events.CustomEvent; public class TreeManager extends NodeEvent implements TreeSelectionListener { protected JTree tree; protected DefaultMutableTreeNode top; protected Color bg; protected Color fg; private Drawable selectedDrawable = null; public TreeManager(Color bg, Color fg){ top = new DefaultMutableTreeNode("Scene"); // createNodes(top); tree = new JTree(top); tree.setCellRenderer(new DrawingTreeCellRenderer()); this.bg = bg; this.fg = fg; this.tree.setBackground(bg); tree.addTreeSelectionListener(this); } public void getNodes(ArrayList<Drawable> drawables){ top.removeAllChildren(); for(int i=0;i<drawables.size();i++){ addChild(drawables.get(i),top); } tree.updateUI(); } private void addChild(Drawable d, DefaultMutableTreeNode n){ String name = "drawable"; if(!(d instanceof DrawablePoint)){ if(d instanceof Ellipse){ name = "ellipse"; } else if(d instanceof Rectangle){ name = "rectangle"; } else if(d instanceof Line){ name = "line"; } else if(d instanceof Curve){ name = "curve"; } /*else if(d instanceof DrawablePoint){ name = "point"; }*/ else if(d instanceof LShape){ name = "import"; } else if(d instanceof Polygon){ if(((Polygon) d).isHole()){ name = "hole"; } else{ name = "polygon"; } } else if(d instanceof ComplexPolygon){ name = "complex polygon"; } if(d.getIdentifier()!=null){ name = name+":"+d.getIdentifier(); } if(d.getHide()){ name = name+" (hidden)"; } DrawableTreeObject dt = new DrawableTreeObject(d,name,d.getHide()); DefaultMutableTreeNode child = new DefaultMutableTreeNode(dt); n.add(child); if(d.numChildren()!=0){ for(int i=0;i<d.numChildren();i++){ addChild(d.childAt(i),child); } } } } public JTree getTree(){ return this.tree; } class DrawingTreeCellRenderer implements TreeCellRenderer { JLabel label; JPanel renderer; DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer(); public DrawingTreeCellRenderer() { renderer = new JPanel(); label = new JLabel(); label.setHorizontalAlignment(SwingConstants.CENTER); label.setVerticalAlignment(SwingConstants.CENTER); renderer.setLayout(new BorderLayout()); renderer.add(label, BorderLayout.CENTER); } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (selected) { renderer.setBackground(Color.GRAY); } else { renderer.setBackground(Color.WHITE); } renderer.setEnabled(tree.isEnabled()); // returnValue = renderer; Object o = ((DefaultMutableTreeNode) value).getUserObject(); if (o instanceof DrawableTreeObject) { DrawableTreeObject dt = ( DrawableTreeObject) o; label.setText(dt.getName()); } else { label.setIcon(null); label.setText("" + value); } return renderer; } } class DrawableTreeObject { private Drawable drawable; private String name; private boolean hidden; public DrawableTreeObject(Drawable d, String n, boolean h){ drawable = d; name = n; hidden = h; } private String getName(){ return this.name; } private boolean getHidden(){ return this.hidden; } private Drawable getDrawable(){ return this.drawable; } } @Override public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); this.fireToolEvent(CustomEvent.DESELECT_ALL); /* if nothing is selected */ if (node == null) return; /* retrieve the node that was selected */ if (node.getUserObject() instanceof DrawableTreeObject) { DrawableTreeObject nodeInfo = (DrawableTreeObject)node.getUserObject(); Drawable d = nodeInfo.getDrawable(); d.setSelected(true); this.selectedDrawable=d; this.fireToolEvent(CustomEvent.TREE_DRAWABLE_SELECTED); } /* React to the node selection. */ } public Drawable getSelectedDrawable() { return this.selectedDrawable; } }