import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;
import java.awt.*;

/****
 *
 * Play around with an implementation of TableCellRenderer that supports
 * expand/collapse of column headings.  See <a href=
 * "../TableCellRendererLabel.java"> the code </a> for details.
 *									<p>
 * Note: This class egregiously fails to follow 206 documentation standards.
 * It would receive about 62/100 as a 206 milestone deliverable.
 *
 * @author Gene Fisher (gfisher@calpoly.edu)
 * @version 8feb05
 *
 */
public class TableCellRendererLabel extends JLabel implements
        TableCellRenderer {

    public Component getTableCellRendererComponent(JTable table, Object value,
	    boolean isSelected, boolean hasFocus, int row, int column) {

	this.row = row;
	this.column = column;

	myTable = (ExpandableCollapsableJTable) table;
	myTable.setBackground(new Color(0,255,0));
	myTable.setForeground(null);
	myTable.setOpaque(false);

	String stringValue = value.toString();
	setText("  " + stringValue + "  ");
	setBorder(null);
        // Regarding direct access to the isExpanded data field -- consider the
        // myTable class to be a "friend" in the C++ sense of the word.
	if ((myTable.isExpanded && row <= 1) ||
	        (!myTable.isExpanded && row <= 0)) {
	    setFont(new Font(getFont().getName(), Font.BOLD,
		getFont().getSize()));
	}
	else {
	    setForeground(Color.black);
	    setFont(new Font(getFont().getName(), Font.PLAIN,
		getFont().getSize()));
	}
	    
	return this;

    }

    protected void paintComponent(Graphics g) {

	if (myTable.isExpanded) {
	    if (row == 0 || row == 1) {
		g.setColor(new Color(240,240,240));
		g.fillRect(0,0, getWidth(),getHeight());
		g.setColor(Color.black);
	    }
	    else {
		if (row % 2 == 0) {
		    g.setColor(new Color(240,240,255));
		}
		else {
		    g.setColor(Color.white);
		}
		g.fillRect(0,0, getWidth(),getHeight());
		g.setColor(Color.black);
	    }	
	}
        else {
	    if (row == 0) {
		g.setColor(new Color(240,240,240));
		g.fillRect(0,0, getWidth(),getHeight());
		g.setColor(Color.black);
	    }
	    else {
		if (row % 2 == 1) {
		    g.setColor(new Color(240,240,255));
		}
		else {
		    g.setColor(Color.white);
		}
		g.fillRect(0,0, getWidth(),getHeight());
		g.setColor(Color.black);
	    }	
	}

	if (myTable.isExpanded && row == 1 && (column == 0 || column == 4)) {
	}
	else {
	    if ((myTable.isExpanded && row > 2) ||
		    !(myTable.isExpanded) && row > 1) {
		g.setColor(new Color(230,230,230));
	    }
	    else {
		g.setColor(Color.black);
	    }
	    g.drawLine(0,0, getWidth(),0);
	    g.setColor(Color.black);
	}

	if (myTable.isExpanded && row == 0 && (column == 0 || column == 4)) {
	}
	else {
	    g.setColor(Color.green);
//	    g.drawLine(0,getHeight(), getWidth(),getHeight());
	    g.setColor(Color.black);
	}

	if (!(row == 0 && (column == 2 || column == 3))) {
	    g.setColor(Color.black);
	    g.drawLine(0,0, 0,getHeight());
	}
	else {
//	    g.setColor(Color.white);
//	    g.drawLine(0,0, 0,getHeight());
//	    g.setColor(Color.black);
	}

	if (!(row == 0 && !(column == 2 || column == 3 || column == 4))) {
	    g.setColor(Color.black);
	    g.drawLine(getWidth(),0, getWidth(),getHeight());
	}
	else {
//	    g.setColor(Color.white);
//	    g.drawLine(getWidth(),0, getWidth(),getHeight());
//	    g.setColor(Color.black);
	}

	if ((myTable.isExpanded && row == 7) || (!(myTable.isExpanded) && row == 6)) {
	    g.setColor(Color.black);
	    g.drawLine(0,getHeight()-1, getWidth(),getHeight()-1);
	}

	super.paintComponent(g);
    }

    /** See JFC implementation not about why this and other methods are
     * overridden to be no-ops. */
    public void validate() {}
    public void revalidate() {}
    public void repaint(long tm, int x, int y, int width, int height) {}
    public void repaint(Rectangle r) {}
    public void firePropertyChange(
	String name, Object oldVal, Object newVal) {}
    public void firePropertyChange(
	String name, boolean oldVal, boolean newVal) {}


    protected ExpandableCollapsableJTable myTable;
    protected int row;
    protected int column;

}