/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jme3.gde.gui.nodes;

import com.jme3.gde.gui.propertyeditors.ResourceEditor;
import com.jme3.gde.gui.propertyeditors.SizeEditor;
import jada.ngeditor.controller.CommandProcessor;
import jada.ngeditor.controller.commands.EditAttributeCommand;
import jada.ngeditor.controller.commands.VisibilityCommand;
import jada.ngeditor.model.elements.GElement;
import java.awt.event.ActionEvent;
import java.beans.PropertyEditor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map.Entry;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JOptionPane;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.Sheet;

/**
 *
 * @author cris
 */
@SuppressWarnings({"unchecked", "rawtypes"})
public class GElementNode extends AbstractNode{
    private final GElement element;
    private static final String basePath="com/jme3/gde/gui/multiview/icons";
    public GElementNode(GElement element) {
        super(Children.create(new GElementChildFactory(element), false));
        
        this.element = element;
        this.setName(element.getID());
        String name = this.element.getClass().getSimpleName();
        this.setName(name);
        this.setIconBaseWithExtension(basePath+"/"+name+".png");
        
    }
    
    public GElement getGelement(){
        return element;
    }

    @Override
    public Action[] getActions(boolean context) {
        if(!context){
            return new Action[]{new Visibility("Show", true),new Visibility("Hide", false)};
        }else
           return super.getActions(context);
    }
    
    public void updateChildren(){
        
    }
    @Override
    protected Sheet createSheet() {
        Sheet s = super.createSheet();
        Sheet.Set set = s.get(Sheet.PROPERTIES);
        if (set == null) {
            set = Sheet.createPropertiesSet();
            s.put(set);
        }
        set.setName("Element Properties");
        set.setShortDescription("You can set element properties");
        for(Entry<String,String> pair : this.element.listAttributes().entrySet()){
            final ElementAttributeProperty elementAttributeProperty = new ElementAttributeProperty(element,pair.getKey());
            pickEditor(pair, elementAttributeProperty);
            set.put(elementAttributeProperty);
        }
        s.put(set);
        return s; 
    }

    private void pickEditor(Entry<String, String> pair, final ElementAttributeProperty elementAttributeProperty) {
        if(pair.getKey().equals("width")||pair.getKey().equals("height") || pair.getKey().equals("x") || pair.getKey().equals("y") ){
           elementAttributeProperty.setPropertyEditor(new SizeEditor());
        }else if(pair.getKey().equals("filename") || pair.getKey().equals("backgroundImage")){
            elementAttributeProperty.setPropertyEditor(new ResourceEditor());
        }
        
    }
    
    public  class ElementAttributeProperty extends Node.Property {

        private String attributeName;
        private GElement element;
        private PropertyEditor editor;

        public ElementAttributeProperty(GElement element, String attributeName) {
            super(String.class);
            this.element = element;
            this.attributeName = attributeName;
            this.setName(attributeName);
            this.setDisplayName(attributeName);
           
        }

        @Override
        public boolean canRead() {
            return true;
        }

        @Override
        public String getValue() throws IllegalAccessException, InvocationTargetException{
            return element.getAttribute(attributeName);
        }

        @Override
        public boolean canWrite() {
            return true;
        }
        
        public void setPropertyEditor(PropertyEditor editor){
            this.editor = editor;
        }
        @Override
        public PropertyEditor getPropertyEditor() {  
            
            return this.editor; //To change body of generated methods, choose Tools | Templates.
        }
        
        

        @Override
        public void setValue(Object val) throws IllegalAccessException, IllegalArgumentException {
            try {
                EditAttributeCommand command = CommandProcessor.getInstance().getCommand(EditAttributeCommand.class); 
               command.setAttribute(attributeName);
                command.setValue(val.toString());
               CommandProcessor.getInstance().excuteCommand(command);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex);
            }
            
        }
    };
    
    private  class Visibility extends AbstractAction {
        private final boolean param;

        public Visibility(String name ,boolean param) {
            super(name);
            this.param = param;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            VisibilityCommand command = CommandProcessor.getInstance().getCommand(VisibilityCommand.class);
           command.setVisibility(param);
        }
    }
}