/*
 * MyArrayRenderer.java
 *
 * Created on October 26, 2007, 4:24 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package usda.weru.mcrew;

import com.klg.jclass.cell.JCCellInfo;
import com.klg.jclass.cell.JCCellRenderer;
import com.klg.jclass.cell.JCComponentCellRenderer;
import com.klg.jclass.cell.JCLightCellRenderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;
import usda.weru.mcrew.MCREWConfig.CellStyle;
import usda.weru.mcrew.gui.ArrayRenderer_n;

/**
 *
 * @author Joseph Levin
 */
public class MyArrayRenderer extends ArrayRenderer_n implements JCComponentCellRenderer{
    private static final long serialVersionUID = 1L;
    
    private CellStyle style;
    
    private final JCComponentCellRenderer c_renderer;
    /** Creates a new instance of MyArrayRenderer
	 * @param renderer */
    protected MyArrayRenderer(CellStyle input) {
        style = input;
        c_renderer = (JCComponentCellRenderer) input.getJCCellStyle().getCellRenderer();
    }
    
    protected MyArrayRenderer(JCComponentCellRenderer renderer) {
        style = null;
        c_renderer = renderer;
    }
    
    public CellStyle getSubStyle()
    {
        return style;
    }
    
    @Override
    public Component getRendererComponent(JCCellInfo info, Object o, boolean selected) {
        if (o != null && o.getClass().isArray()){
            Object[] values = (Object[]) o;
            Component comp = c_renderer.getRendererComponent(info, values[0], selected);
            g_rendererPane.removeAll();
            g_rendererPane.add(comp);
            
            if(comp instanceof MyCheckBoxCellRenderer)
            {
                boolean harvested = false;
                for(Object val : values)
                {
                    if(((String) val).equals("1"))
                    {
                        harvested = true;
                        break;
                    }
                }
                setBackground(harvested ? Color.decode("#4D6B50") : comp.getBackground());
                comp.setBackground(harvested ? Color.decode("#4D6B50") : comp.getBackground());
            }
            else setBackground(comp.getBackground());
            return this;
        } else{
            return c_renderer.getRendererComponent(info, o, selected);
        }
    }

	/**
	 *
	 * @param renderer
	 * @return
	 */
	public static MyArrayRenderer wrap(JCCellRenderer renderer){
        if (renderer instanceof JCComponentCellRenderer){
            return new MyArrayRenderer((JCComponentCellRenderer)renderer);
        } else{
            final Wrapper wrapper = new Wrapper((JCLightCellRenderer)renderer);
            JCComponentCellRenderer newRenderer = new JCComponentCellRenderer(){
                private static final long serialVersionUID = 1L;
                
                @Override
                public Component getRendererComponent(JCCellInfo info, Object o, boolean selected) {
                    wrapper.initilize(info, o, selected);
                    return wrapper;
                }
                
            };
            return new MyArrayRenderer(newRenderer);
        }
        
    }
        
        public static MyArrayRenderer wrap(CellStyle renderer)
        {
            return new MyArrayRenderer(renderer);
        }

	/**
	 *
	 * @param enabled
	 */
	@Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        g_editorButton.setEnabled(enabled);        
    }
    
    
    private static class Wrapper extends JComponent{
        private static final long serialVersionUID = 1L;
        
        JCCellInfo c_info;
        Object c_o;
        boolean c_selected;
        JCLightCellRenderer c_lightRenderer;
        
        public Wrapper(JCLightCellRenderer renderer){
            c_lightRenderer = renderer;
        }
        
        public void initilize(JCCellInfo info, Object o, boolean selected){
            c_info = info;
            c_o = o;
            c_selected = selected;
            Color background = (!selected) ? info.getBackground() : info.getSelectedBackground();
            setBackground(background);
        }
        
        @Override
        public void paint(Graphics g) {
            c_lightRenderer.draw(g, c_info, c_o, c_selected);
        }
        
        @Override
        public Dimension getPreferredSize() {
            return c_lightRenderer.getPreferredSize(getGraphics(), c_info, c_o);
        }
        
    }
    
    
    
}
