/*
 * MyDateCellRenderer.java
 *
 * Created on November 14, 2005, 4:02 PM
 *
 * Moved this class from inside Table.java to a public location so ConfigData.java can see the class.
 */
package usda.weru.mcrew;

import com.klg.jclass.cell.JCCellInfo;
import com.klg.jclass.cell.renderers.JCStringCellRenderer;

import com.klg.jclass.table.JCTableCellInfo;
import java.awt.Color;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;


// strings are included because dateformat would not work

/**
 *
 * @author maxerdwien
 */
public class MyDateCellRenderer extends JCStringCellRenderer {
    private static final long serialVersionUID = 1L;

    private static final Color OUTOFORDERCOLOR = new Color(255,64,64);
    private static final Color OUTOFORDERCOLORSELECTED = new Color(240,128,128);
    private static final Color INITIALIZATIONOPERATION = Color.decode("#B666D2");
    boolean c_colorOutOfOrder;

	/**
	 *
	 */
	public MyDateCellRenderer() {
        this(false);
    }

	/**
	 *
	 * @param colorOutOfOrder
	 */
	public MyDateCellRenderer(boolean colorOutOfOrder) {
        c_colorOutOfOrder = colorOutOfOrder;
    }

    @Override
    public void draw(Graphics gc, JCCellInfo cellInfo, Object o, boolean selected) {
        Object value = o;
        if (o == ManageData.EMPTY_OBJECT) {
            o = null;
        }
        else {
            if (o instanceof GregorianCalendar || o instanceof JulianCalendar) {
                GregorianCalendar calendar = (GregorianCalendar) o;
                SimpleDateFormat dateFormat;
                try {
                    String format = MCREWConfig.getOperationDateFormat();
                    dateFormat = new SimpleDateFormat(format);
                }
                catch (Exception e) {
                    dateFormat = new SimpleDateFormat("MMM dd, y");
                }
                o = (calendar.get(Calendar.ERA) == 1) ? dateFormat.format(calendar.getTime()) : "";
            }
        }

        if (c_colorOutOfOrder) {
            handleOrderColoring(gc, cellInfo, value, selected);
        }

        super.draw(gc, cellInfo, o, selected);

    }

    private void handleOrderColoring(Graphics gc, JCCellInfo cellInfo, Object value, boolean selected) {
        JCTableCellInfo tinfo;

        if (cellInfo instanceof JCTableCellInfo) {
            tinfo = (JCTableCellInfo) cellInfo;
        }
        else {
            return;
        }

        Calendar calendar;
        if(value instanceof Calendar){
            calendar = (Calendar) value;
        }
        else{
            return;
        }

        ManageData tocheck = null;
        try { tocheck = (ManageData) tinfo.getTable().getDataView().getDataSource(); }
        catch(ClassCastException cce) { System.out.println("Failed cast"); }

        if(tocheck.initOp.contains(tinfo.getRow()))
        {
            gc.setColor(INITIALIZATIONOPERATION);
            gc.fillRect(0, 0, tinfo.getDrawingArea().width, tinfo.getDrawingArea().height);
        }
        //get the previous value
        int previousRow = tinfo.getRow() - 1;
        if (previousRow < 0){
            return;
        }
        Object previousValue = tinfo.getTable().getDataView().getTableDataItem(previousRow, tinfo.getColumn());

        Calendar previousCalendar;
        if(previousValue instanceof Calendar){
            previousCalendar = (Calendar) previousValue;
        }
        else{
            return;
        }
        if(calendar.before(previousCalendar)){
            //out of order!
            gc.setColor(selected ? OUTOFORDERCOLORSELECTED : OUTOFORDERCOLOR);
            gc.fillRect(0, 0, tinfo.getDrawingArea().width, tinfo.getDrawingArea().height);
        }
        
        if(tocheck != null)
        {
            if(tocheck.isIllWrap(tinfo.getRow()))
            {
                gc.setColor(selected ? OUTOFORDERCOLORSELECTED : OUTOFORDERCOLOR);
                gc.fillRect(0, 0, tinfo.getDrawingArea().width, tinfo.getDrawingArea().height);
            }
        }
    }

}

