package surface.classeditor;

import hu.swankey.ammo.common.script.yunits.YClass;
import hu.swankey.ammo.common.yggdrasil.basics.ComplexYObject.ComplexClass;

import java.awt.Color;
import java.awt.Component;

import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;

import adapters.SuperiorTreeModel;
import background.Controller;

public class SuperiorTree extends JTree {

	private static final long serialVersionUID = 1L;
	
	private ImageIcon iconClass = new ImageIcon(getClass().getResource("/icons/class.png"));
	private ImageIcon iconComplexClass = new ImageIcon(getClass().getResource("/icons/complex_class.png"));
	
	public static SuperiorTree createSuperiorTree(YClass yclass, Controller controller){
		SuperiorTree stree = new SuperiorTree(yclass, controller);
		return stree;
	}

	private SuperiorTree(YClass yclass, final Controller controller) {
		super( SuperiorTreeModel.createSuperiorTreeModel(yclass, controller.getYggdrasil()) );
		setCellRenderer( new SuperiorNodeRenderer() );
		
		addTreeSelectionListener( new TreeSelectionListener(){
			
			@Override
			public void valueChanged(TreeSelectionEvent e) {
				
				if (getSelectionPath() != null) {
					YClass selection = (YClass) getSelectionPath().getLastPathComponent();
					controller.setSecondaryElement(selection.getWrapperElement());
	            }
			
			}			
		} );
	}
	
	public YClass getYClass(){
		return ((SuperiorTreeModel)getModel()).getYClass();
	}


	public void expandAll() {
		expandAll(new TreePath(getModel().getRoot()));
	}

	private void expandAll(TreePath parent) {

		Object node = parent.getLastPathComponent();
		if (getModel().getChildCount(node) >= 0) {
			for (int i=0; i < getModel().getChildCount(node); i++) {
				Object n = getModel().getChild(node, i);
				TreePath path = parent.pathByAddingChild(n);
				expandAll(path);
			}
		}

		expandPath(parent);
	}
	
	@Override
	public void treeDidChange() {
		super.treeDidChange();
		
		if (getModel() != null)
			expandAll();
	} 
	
	
	private class SuperiorNodeRenderer implements TreeCellRenderer {
		
		private JPanel nodeRenderer = new JPanel();		

		private Color selectionForeground = UIManager.getColor("Tree.selectionForeground");
		private Color selectionBackground = UIManager.getColor("Tree.selectionBackground");
		private Color textForeground = UIManager.getColor("Tree.textForeground");

		public SuperiorNodeRenderer(){
			nodeRenderer.setOpaque(true);
			nodeRenderer.setLayout( new BoxLayout(nodeRenderer, BoxLayout.X_AXIS) );			
		}

		public Component getTreeCellRendererComponent(JTree tree, Object value,
				boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

		    if (selected) {
		    	nodeRenderer.setForeground(selectionForeground);
		        nodeRenderer.setBackground(selectionBackground);
		    } else {
		        nodeRenderer.setForeground(textForeground);
		        nodeRenderer.setBackground(null);
		    }
		      
		    YClass yclass = (YClass) value;  
		    JLabel label = new JLabel( yclass.getName());
		    
		    // Explicit superiors are blue:
		    if ( ((SuperiorTree)tree).getYClass().getSuperiors().contains(yclass) )
		    	label.setForeground( Color.BLUE);
		      		      
		    nodeRenderer.removeAll();
		    
		    // Class icon:
		    if (yclass instanceof ComplexClass)
		    	nodeRenderer.add( new JLabel(iconComplexClass) );
		    else
		    	nodeRenderer.add( new JLabel(iconClass) );
		    
		    // Class name:
			nodeRenderer.add( label );
			

		    return nodeRenderer;
		  }
	}

}
