package surface.classeditor;

import hu.swankey.ammo.common.yggdrasil.basics.ComplexYObject.ComplexYClass;
import hu.swankey.ammo.common.yggdrasil.definition.ComplexYClassDefinition;
import hu.swankey.ammo.common.yggdrasil.definition.YAttributeDefinition;

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

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import adapters.FieldListModel;
import background.Controller;

public class FieldList extends JList {

	private static final long serialVersionUID = 1L;
	
	private ImageIcon iconBrick = new ImageIcon(getClass().getResource("/icons/brick.png"));
	
	public static FieldList create(Controller controller){
		FieldList fieldlist = new FieldList(controller);
		return fieldlist;
	}
	
	public FieldList(final Controller controller){
		setCellRenderer( new FieldNodeRenderer() );		
	    
	    addListSelectionListener( new ListSelectionListener(){
			@Override
			public void valueChanged(ListSelectionEvent e) {
				if (getSelectedValue() != null)
					controller.setSecondaryElement((YAttributeDefinition)getSelectedValue());
			}		
		} );		
	}
	
	public ComplexYClass getYClass(){
		return ((FieldListModel)getModel()).getYClass();
	}
	
	private class FieldNodeRenderer implements ListCellRenderer {
		
		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");
		
		JLabel label_name = new JLabel();
		JLabel label_superior = new JLabel();
		
		
		public FieldNodeRenderer(){
			nodeRenderer.setOpaque(true);
		    nodeRenderer.setLayout( new BoxLayout(nodeRenderer, BoxLayout.X_AXIS) );
		    
		    label_name.setIcon( iconBrick );		    
		    label_name.setBorder( BorderFactory.createEmptyBorder(1, 0, 1, 3) );
		    label_superior.setForeground( Color.GRAY );
		} 

		@Override
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus) {
						
		    if (isSelected) {
		    	nodeRenderer.setForeground(selectionForeground);
		        nodeRenderer.setBackground(selectionBackground);
		    } else {
		        nodeRenderer.setForeground(textForeground);
		        nodeRenderer.setBackground(null);
		    }
		      
		    YAttributeDefinition vardef = (YAttributeDefinition) value;

		    nodeRenderer.removeAll();
		    
		    //ComplexClass owner = ((ComplexClassDefinition)vardef.getParent().getParent()).getWrapped();
		    ComplexYClass owner = ((ComplexYClassDefinition)vardef.getLogicalParent()).getWrapped();
		    boolean inherited = !getYClass().getFields().contains(vardef);
		    
		    // Field name
		    label_name.setText( vardef.getName() + " - " + vardef.getVarClass().getPathString() );
		    label_name.setForeground( inherited ? Color.BLACK : Color.BLUE);
		    nodeRenderer.add( label_name );
		    
		    // Superior:
		    if (inherited) {
		    	label_superior.setText(" (" + owner.getPathString() + ")");
		    	nodeRenderer.add( label_superior );
		    }
		    

		    return nodeRenderer;
		  }

	}	

}
